Android application compatible with ZX2C4's Pass command line application

Overview

Password Store

GitHub workflow Backers on Open Collective Sponsors on Open Collective

Download

Get it on Google Play Get it on F-Droid

Documentation

We're in the process of rewriting our documentation from scratch, and the work-in-progress state can be seen here. See the wiki for the old documentation.

Contributing

Want to contribute? See if you can find an issue you wanna close, then send a PR!

Interested in helping to translate Password Store? Contribute here!

Wanna test development builds to find bugs and offer feedback? Read the release channels documentation to get access!

Community

Ways to get in touch:

  • Github issues: Use it if you have a bug report, or you want to submit a feature request.
  • GitHub Discussions: Use it if you do not understand something, or want to discuss a feature request in more detail with all community members before pitching it to maintainers.

Contributors

This project exists thanks to all the people who contribute.

Opencollective

Backers

Thank you to all our backers! 🙏 [Become a backer]

Backers

Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website.[Become a sponsor]

Triplebyte Applicative GmbH ScrapingBee Become a Sponsor

Google Play and the Google Play logo are trademarks of Google LLC.

Comments
  • Request for documentation - setting up my mobile phone with git repo on my laptop

    Request for documentation - setting up my mobile phone with git repo on my laptop

    Is your feature request related to a problem? Please describe. This is not a feature request. I am trying to understand how to do something and not sure where to start and what steps I should take to achieve it.

    Describe the solution you'd like I would like to have a step by step for achieving a simple task.

    Describe alternatives you've considered I installed OpenKeyChain but I don't know what to do with it and how it fits into the workflow.

    Additional context I set up pass on my ubuntu laptop by following the steps below:

    gpg2 --full-gen-key
    pass init [email protected]
    sudo apt-get install openssh-client openssh-server
    git init --bare ~/pass-repo
    pass git init
    pass git remote add origin ssh://[email protected]:/home/oren/pass-repo
    pass git push origin master
    

    I would also like to have my phone working with pass. Someone on another issue suggestion following:

    You need an OpenPGP provider (like OpenKeyChain) to supply the keys used to encrypt your passwords and an SSH key to access your git repo for syncing (or use passwords for that). The SSH key can be generated by the app (public part has to be added to ~/.ssh/authorized_keys on your laptop then) or imported from somewhere else.

    But I don't understand what to do. Can someone provide step by steps instructions for setting up my mobile phone with password store? I want my phone to read and save from and to the git repository on my laptop.

    opened by oren 109
  • [BUG] Versions 1.4.0 and 1.5.0 not updated on F-Droid

    [BUG] Versions 1.4.0 and 1.5.0 not updated on F-Droid

    F-Droid lists 1.3.3 as the latest version: https://f-droid.org/packages/com.zeapo.pwdstore/

    It seems the build metadata is not up to date. I don't know if this file is maintained by this project, or whether someone from F-Droid keeps it up to date.

    opened by dutchgecko 64
  • [BUG] symlinks are clobbered by the app

    [BUG] symlinks are clobbered by the app

    Describe the bug A password will fail to decrypt if it is a soft link as opposed to a normal file.

    To Reproduce Steps to reproduce the behavior:

    1. Create a password that's a soft link to an existing password using ln -s <passwd>.gpg softlink.gpg
    2. Pull the repository on device
    3. Try to decrypt the password
    4. See error

    Expected behavior Password is decrypted and shown in the UI

    Device information (please complete the following information):

    • Device: Google Pixel 2
    • OS: Android R DP1
    • App version 1.6.0-SNAPSHOT

    Additional context

    Relevant log snippet

    E  onError getErrorId: 0
    E  onError getMessage: No valid OpenPGP encrypted or signed data found!
    
    C-bug E-medium P-high A-Git S-unassigned 
    opened by msfjarvis 59
  • Can't open entries. Alt title: Xiaomi is trash

    Can't open entries. Alt title: Xiaomi is trash

    Hey, Recently I have created new password and since then I am not able to open any of it.

    On the list of password I tap any of them and the app shows password view for like a 0.05 second and then goes back to password list. It does not ask for password to decrypt.

    I tried to change time of password show, but that didn't help.

    What could happen?

    Logcat
    :/ # logcat | grep com.zeapo.pwdstore
    05-28 00:32:59.317  1315  1315 D AccessibilityManagerService: Ignoring non-encryption-aware service ComponentInfo{com.zeapo.pwdstore/com.zeapo.pwdstore.autofill.AutofillService}
    05-28 00:33:01.450  1315  3079 V ProcessedPackagesJournal:    + com.zeapo.pwdstore
    05-28 00:33:01.578  1315  1397 D Boost   : hostingType=service, hostingName=com.zeapo.pwdstore/.autofill.AutofillService, callerPackage=android, isSystem=true, isBoostNeeded=false.
    05-28 00:33:01.579  1315  1397 I ActivityManager: Start proc 3218:com.zeapo.pwdstore/u0a145 for service com.zeapo.pwdstore/.autofill.AutofillService caller=android
    05-28 00:33:02.949  1315  1397 D Boost   : hostingType=service, hostingName=org.sufficientlysecure.keychain/.remote.OpenPgpService2, callerPackage=com.zeapo.pwdstore, isSystem=false, isBoostNeeded=false.
    05-28 00:33:02.954  1315  1397 I ActivityManager: Start proc 3614:org.sufficientlysecure.keychain:remote_api_2/u0a146 for service org.sufficientlysecure.keychain/.remote.OpenPgpService2 caller=com.zeapo.pwdstore
    05-28 09:18:53.153  2397  2397 I Timeline: Timeline: Activity_launch_request time:2851807 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras) }05-28 09:18:53.153  1315  3530 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras)} from uid 10034
    05-28 09:18:53.568  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420} time:2852222
    05-28 09:18:57.458  3218  3218 I Timeline: Timeline: Activity_launch_request time:2856112 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:18:57.459  1315  5460 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:18:59.088  1315  2546 D PerfShielderService: com.zeapo.pwdstore|com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore|409|2856246475002|294|0|4
    05-28 09:18:59.089  3132 15251 W MiuiPerfServiceClient: interceptAndQueuing:3218|com.zeapo.pwdstore|409|294|unknown|null|com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore|2856246475002|Slow main thread|4
    05-28 09:18:59.267  3218  3218 I Timeline: Timeline: Activity_launch_request time:2857921 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:18:59.268  1315  1339 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:19:00.308  3218  3218 I Timeline: Timeline: Activity_launch_request time:2858962 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:19:00.309  1315  1339 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:19:01.672  3218  3218 I Timeline: Timeline: Activity_launch_request time:2860326 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:19:01.673  1315  4156 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:19:08.817  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{5af5505 token=Token{44cc87c ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420}}} to mClosingAppTokens
    05-28 09:19:08.821  1315  1842 W MiuiGesturePointerEventListener: add win = Window{640429 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:19:09.351  1315  1842 W MiuiGesturePointerEventListener: resetClipWindow: w: Window{640429 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore}
    05-28 09:19:09.352  1315  1842 W MiuiGesturePointerEventListener: destroy surface for win = Window{640429 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} successfully
    05-28 09:23:04.278  2397  2397 I Timeline: Timeline: Activity_launch_request time:3102932 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras) }05-28 09:23:04.279  1315  4903 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras)} from uid 10034
    05-28 09:23:04.781  3218  3218 W Looper  : Slow Looper: Activity com.zeapo.pwdstore/.PasswordStore is 455ms late (wall=20ms running=0ms ClientTransaction{ lifecycleRequest=android.app.servertransaction.ResumeActivityItem }) because of 42 msg, msg 1 took 190ms (late=3013ms h=com.android.internal.os.HandlerCaller$MyHandler w=3), msg 26 took 184ms (late=1481ms h=com.android.internal.os.HandlerCaller$MyHandler w=3)
    05-28 09:23:05.143  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3103798
    05-28 09:23:05.724  3218  3218 I Timeline: Timeline: Activity_launch_request time:3104378 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:05.725  1315  2861 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:06.662  3218  3218 I Timeline: Timeline: Activity_launch_request time:3105316 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:06.662  1315  4156 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:07.233  3218  3218 I Timeline: Timeline: Activity_launch_request time:3105887 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:07.234  1315  2861 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:07.777  3218  3218 I Timeline: Timeline: Activity_launch_request time:3106431 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:07.777  1315  2861 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:08.330  3218  3218 I Timeline: Timeline: Activity_launch_request time:3106984 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:08.330  1315  4156 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:08.863  3218  3218 I Timeline: Timeline: Activity_launch_request time:3107517 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:08.863  1315  2861 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:10.781  3218  3218 I Timeline: Timeline: Activity_launch_request time:3109435 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:10.782  1315  4156 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:11.432  3218  3218 I Timeline: Timeline: Activity_launch_request time:3110086 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:11.432  1315  4903 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:14.968  3218  3218 I Timeline: Timeline: Activity_launch_request time:3113622 intent:Intent { cmp=com.zeapo.pwdstore/.SelectFolderActivity (has extras) }
    05-28 09:23:14.969  1315  2861 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.SelectFolderActivity (has extras)} from uid 10145
    05-28 09:23:15.478  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{73c9969 u0 com.zeapo.pwdstore/.SelectFolderActivity t5420} time:3114132
    05-28 09:23:17.345  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3115999
    05-28 09:23:18.408  3218  3218 I Timeline: Timeline: Activity_launch_request time:3117062 intent:Intent { cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:18.409  1315 17524 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:20.490  1315  4903 W NotificationService: Toast already killed. pkg=com.zeapo.pwdstore [email protected]
    05-28 09:23:21.370  3218  3218 I Timeline: Timeline: Activity_launch_request time:3120024 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:21.370  1315 17524 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:21.907  3218  3218 I Timeline: Timeline: Activity_launch_request time:3120561 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:21.908  1315  3530 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:22.451  3218  3218 I Timeline: Timeline: Activity_launch_request time:3121105 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:22.452  1315  2861 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:26.210  3218  3218 I Timeline: Timeline: Activity_launch_request time:3124865 intent:Intent { cmp=com.zeapo.pwdstore/.git.GitActivity (has extras) }
    05-28 09:23:26.211  1315  5709 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.git.GitActivity (has extras)} from uid 10145
    05-28 09:23:26.712  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{6bf13f4 u0 com.zeapo.pwdstore/.git.GitActivity t5420} time:3125366
    05-28 09:23:40.325  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3138979
    05-28 09:23:42.304  3218  3218 I Timeline: Timeline: Activity_launch_request time:3140958 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:42.304  1315 12752 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:43.289  3218  3218 I Timeline: Timeline: Activity_launch_request time:3141943 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:23:43.289  1315 12752 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:23:46.622  3218  3218 I Timeline: Timeline: Activity_launch_request time:3145276 intent:Intent { cmp=com.zeapo.pwdstore/.git.GitActivity (has extras) }
    05-28 09:23:46.623  1315  6665 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.git.GitActivity (has extras)} from uid 10145
    05-28 09:23:47.113  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{3617496 u0 com.zeapo.pwdstore/.git.GitActivity t5420} time:3145767
    05-28 09:24:01.550  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3160204
    05-28 09:24:02.521  3218  3218 I Timeline: Timeline: Activity_launch_request time:3161175 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:24:02.522  1315  8633 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:24:32.078  3218  3218 I Timeline: Timeline: Activity_launch_request time:3190732 intent:Intent { cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:24:32.079  1315  3370 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:24:32.532  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{269115e u0 com.zeapo.pwdstore/.crypto.PgpActivity t5420} time:3191186
    05-28 09:24:39.616  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3198270
    05-28 09:24:41.314  3218  3218 I Timeline: Timeline: Activity_launch_request time:3199968 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:24:41.315  1315  6665 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:24:42.055  3218  3218 I Timeline: Timeline: Activity_launch_request time:3200709 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:24:42.055  1315  6665 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:24:46.750  3218  3218 I Timeline: Timeline: Activity_launch_request time:3205404 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:24:46.751  1315  4903 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:24:55.375  3218  3218 I Timeline: Timeline: Activity_launch_request time:3214029 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:24:55.375  1315  6350 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:24:55.945  3218  3218 I Timeline: Timeline: Activity_launch_request time:3214600 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:24:55.946  1315 12752 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:24:56.582  3218  3218 I Timeline: Timeline: Activity_launch_request time:3215236 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:24:56.583  1315  6350 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:24:57.221  3218  3218 I Timeline: Timeline: Activity_launch_request time:3215875 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:24:57.222  1315  4903 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:24:57.800  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{5af5505 token=Token{44cc87c ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420}}} to mClosingAppTokens
    05-28 09:24:57.803  1315  1842 W MiuiGesturePointerEventListener: add win = Window{640429 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:24:58.382  1315  1842 W MiuiGesturePointerEventListener: resetClipWindow: w: Window{640429 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore}
    05-28 09:24:58.382  1315  1842 W MiuiGesturePointerEventListener: destroy surface for win = Window{640429 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} successfully
    05-28 09:24:59.814  2397  2397 I Timeline: Timeline: Activity_launch_request time:3218469 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras) }05-28 09:24:59.815  1315  3370 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras)} from uid 10034
    05-28 09:25:00.204  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3218858
    05-28 09:25:01.916  3218  3218 I Timeline: Timeline: Activity_launch_request time:3220570 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:01.917  1315 17524 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:04.886  3218  3218 I Timeline: Timeline: Activity_launch_request time:3223540 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:04.887  1315 17524 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:07.463  3218  3218 I Timeline: Timeline: Activity_launch_request time:3226117 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:07.463  1315 17524 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:10.153  3218  3218 I Timeline: Timeline: Activity_launch_request time:3228807 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:10.153  1315 17524 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:15.717  3218  3218 I Timeline: Timeline: Activity_launch_request time:3234371 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:15.717  1315  3370 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:20.601  3218  3218 I Timeline: Timeline: Activity_launch_request time:3239256 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:20.602  1315  8633 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:22.034  3218  3218 I Timeline: Timeline: Activity_launch_request time:3240688 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:22.035  1315  2861 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:25.076  3218  3218 I Timeline: Timeline: Activity_launch_request time:3243730 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:25.077  1315  8633 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:29.149  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{5af5505 token=Token{44cc87c ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420}}} to mClosingAppTokens
    05-28 09:25:29.153  1315  1842 W MiuiGesturePointerEventListener: add win = Window{640429 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:25:29.615  1315  1842 W MiuiGesturePointerEventListener: resetClipWindow: w: Window{640429 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore}
    05-28 09:25:29.616  1315  1842 W MiuiGesturePointerEventListener: destroy surface for win = Window{640429 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} successfully
    05-28 09:25:42.701  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{468936f u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3261355
    05-28 09:25:43.181  3218  3218 I Timeline: Timeline: Activity_launch_request time:3261835 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:43.182  1315  2660 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:47.536  3218  3218 I Timeline: Timeline: Activity_launch_request time:3266191 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:47.537  1315  2660 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:50.851  3218  3218 I Timeline: Timeline: Activity_launch_request time:3269505 intent:Intent { cmp=com.zeapo.pwdstore/.UserPreference }
    05-28 09:25:50.854  1315  4156 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.UserPreference} from uid 10145
    05-28 09:25:51.436  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{5e294f u0 com.zeapo.pwdstore/.UserPreference t5420} time:3270090
    05-28 09:25:57.714  3218  3218 I Timeline: Timeline: Activity_launch_request time:3276369 intent:Intent { cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:57.715  1315  4156 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:58.669  3218  3218 I Timeline: Timeline: Activity_launch_request time:3277323 intent:Intent { cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:58.670  1315  6665 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:25:59.286  3218  3218 I Timeline: Timeline: Activity_launch_request time:3277940 intent:Intent { cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:25:59.287  1315  2660 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:26:01.868  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{1528de5 token=Token{ac7d8dc ActivityRecord{5e294f u0 com.zeapo.pwdstore/.UserPreference t5420}}} to mClosingAppTokens
    05-28 09:26:01.872  1315  1842 W MiuiGesturePointerEventListener: add win = Window{f67a6c8 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.UserPreference} to mScalingWindows
    05-28 09:26:02.233  1315  1842 W MiuiGesturePointerEventListener: resetClipWindow: w: Window{f67a6c8 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.UserPreference}
    05-28 09:26:02.234  1315  1842 W MiuiGesturePointerEventListener: destroy surface for win = Window{f67a6c8 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.UserPreference} successfully
    05-28 09:27:36.061 19042 19042 I Timeline: Timeline: Activity_launch_request time:3374715 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 pkg=com.zeapo.pwdstore cmp=com.zeapo.pwdstore/.PasswordStore }
    05-28 09:27:36.061  1315  6665 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 pkg=com.zeapo.pwdstore cmp=com.zeapo.pwdstore/.PasswordStore} from uid 10146
    05-28 09:27:36.774  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3375429
    05-28 09:27:37.383  3218  3218 I Timeline: Timeline: Activity_launch_request time:3376037 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:27:37.383  1315  4156 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:27:38.156  3218  3218 I Timeline: Timeline: Activity_launch_request time:3376810 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:27:38.159  1315  4156 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:27:39.055  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}} to mClosingAppTokens
    05-28 09:27:39.058  1315  1842 W MiuiGesturePointerEventListener: add win = Window{6c64721 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:27:39.423  1315  1842 W MiuiGesturePointerEventListener: resetClipWindow: w: Window{6c64721 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore}
    05-28 09:27:39.423  1315  1842 W MiuiGesturePointerEventListener: destroy surface for win = Window{6c64721 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} successfully
    05-28 09:30:01.867  2397  2397 I Timeline: Timeline: Activity_launch_request time:3520521 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras) }05-28 09:30:01.868  1315  2862 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras)} from uid 10034
    05-28 09:30:03.529  3218  3218 W Looper  : Slow Looper: Activity com.zeapo.pwdstore/.PasswordStore is 1638ms late (wall=2ms running=0ms ClientTransaction{ lifecycleRequest=android.app.servertransaction.ResumeActivityItem }) because of 128 msg, msg 10 took 170ms (late=1239ms h=com.android.internal.os.HandlerCaller$MyHandler w=3), msg 125 took 139ms (late=1945ms h=com.android.internal.os.HandlerCaller$MyHandler w=3)
    05-28 09:30:03.879  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3522533
    05-28 09:30:05.476  3218  3218 I Timeline: Timeline: Activity_launch_request time:3524130 intent:Intent { cmp=com.zeapo.pwdstore/.UserPreference }
    05-28 09:30:05.477  1315  8633 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.UserPreference} from uid 10145
    05-28 09:30:05.962  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{1abda u0 com.zeapo.pwdstore/.UserPreference t5420} time:3524616
    05-28 09:30:16.196  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3534850
    05-28 09:30:16.677  3218  3218 I Timeline: Timeline: Activity_launch_request time:3535331 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:30:16.678  1315  2862 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:30:18.997  3218  3218 I Timeline: Timeline: Activity_launch_request time:3537651 intent:Intent { cmp=com.zeapo.pwdstore/.UserPreference }
    05-28 09:30:18.998  1315  8633 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.UserPreference} from uid 10145
    05-28 09:30:19.495  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{d13db14 u0 com.zeapo.pwdstore/.UserPreference t5420} time:3538149
    05-28 09:30:37.946  3218  3218 I Timeline: Timeline: Activity_launch_request time:3556600 intent:Intent { cmp=com.zeapo.pwdstore/.autofill.AutofillPreferenceActivity }
    05-28 09:30:37.947  1315  8633 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/.autofill.AutofillPreferenceActivity} from uid 1014505-28 09:30:38.427  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{a798371 u0 com.zeapo.pwdstore/.autofill.AutofillPreferenceActivity t5420} time:3557081
    05-28 09:30:45.997  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{d13db14 u0 com.zeapo.pwdstore/.UserPreference t5420} time:3564651
    05-28 09:30:51.885  1315  1397 D Boost   : hostingType=activity, hostingName=com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity, callerPackage=com.zeapo.pwdstore, isSystem=false, isBoostNeeded=false.
    05-28 09:30:51.886  1315  1397 I ActivityManager: Start proc 19379:com.google.android.packageinstaller/u0a42 for activity com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity caller=com.zeapo.pwdstore
    05-28 09:30:53.580  3218  3218 I Timeline: Timeline: Activity_launch_request time:3572234 intent:Intent { cmp=com.zeapo.pwdstore/com.nononsenseapps.filepicker.FilePickerActivity (has extras) }
    05-28 09:30:53.592  1315  2862 I ActivityManager: START u0 {cmp=com.zeapo.pwdstore/com.nononsenseapps.filepicker.FilePickerActivity (has extras)} from uid 10145
    05-28 09:30:54.047  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{645b3e4 u0 com.zeapo.pwdstore/com.nononsenseapps.filepicker.FilePickerActivity t5420} time:3572701
    05-28 09:30:55.162  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{d13db14 u0 com.zeapo.pwdstore/.UserPreference t5420} time:3573816
    05-28 09:31:06.379  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3585033
    05-28 09:31:06.641  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}} to mClosingAppTokens
    05-28 09:31:06.645  1315  1842 W MiuiGesturePointerEventListener: add win = Window{6c64721 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:37:32.620  2397  2397 I Timeline: Timeline: Activity_launch_request time:3971274 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras) }05-28 09:37:32.623  1315  3531 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras)} from uid 10034
    05-28 09:37:33.078  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420} time:3971732
    05-28 09:37:33.633  3218  3218 I Timeline: Timeline: Activity_launch_request time:3972287 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:37:33.633  1315  1341 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:37:34.377  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}} to mClosingAppTokens
    05-28 09:37:34.380  1315  1842 W MiuiGesturePointerEventListener: add win = Window{6c64721 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:39:07.316  2397  2397 I Timeline: Timeline: Activity_launch_request time:4065971 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras) }05-28 09:39:07.318  1315  4903 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras)} from uid 10034
    05-28 09:39:07.681  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420} time:4066335
    05-28 09:39:08.140  3218  3218 I Timeline: Timeline: Activity_launch_request time:4066794 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:39:08.141  1315  4903 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:39:08.926  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}} to mClosingAppTokens
    05-28 09:39:08.932  1315  1842 W MiuiGesturePointerEventListener: add win = Window{6c64721 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:40:13.995  2397  2397 I Timeline: Timeline: Activity_launch_request time:4132649 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras) }05-28 09:40:13.996  1315  6350 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras)} from uid 10034
    05-28 09:40:14.384  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420} time:4133039
    05-28 09:40:14.816  3218  3218 I Timeline: Timeline: Activity_launch_request time:4133470 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:40:14.817  1315  2612 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:40:15.417  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}} to mClosingAppTokens
    05-28 09:40:15.419  1315  1842 W MiuiGesturePointerEventListener: add win = Window{6c64721 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:43:06.002  2397  2397 I Timeline: Timeline: Activity_launch_request time:4304656 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras) }05-28 09:43:06.003  1315  5076 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras)} from uid 10034
    05-28 09:43:06.033  4721  4738 D GameBoosterService: onGameStatusChange foreground:ForegroundInfo{mForegroundPackageName='com.zeapo.pwdstore', mForegroundUid=10145, mForegroundPid=3218, mLastForegroundPackageName='com.miui.home', mLastForegroundUid=10034, mLastForegroundPid=2397, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1, mFlags=0}
    05-28 09:43:06.045  3218  3218 D PASS    : Check, dir: /data/user/0/com.zeapo.pwdstore/files/store
    05-28 09:43:06.409  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420} time:4305063
    05-28 09:43:07.207  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}} to mClosingAppTokens
    05-28 09:43:07.210  1315  1842 W MiuiGesturePointerEventListener: add win = Window{6c64721 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:43:07.427  4721  4738 D GameBoosterService: onGameStatusChange foreground:ForegroundInfo{mForegroundPackageName='com.android.systemui', mForegroundUid=1000, mForegroundPid=2130, mLastForegroundPackageName='com.zeapo.pwdstore', mLastForegroundUid=10145, mLastForegroundPid=3218, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1, mFlags=0}
    05-28 09:43:09.487  4721  4738 D GameBoosterService: onGameStatusChange foreground:ForegroundInfo{mForegroundPackageName='com.zeapo.pwdstore', mForegroundUid=10145, mForegroundPid=3218, mLastForegroundPackageName='com.android.systemui', mLastForegroundUid=1000, mLastForegroundPid=2130, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1, mFlags=0}
    05-28 09:43:09.500  3218  3218 D PASS    : Check, dir: /data/user/0/com.zeapo.pwdstore/files/store
    05-28 09:43:09.961  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420} time:4308615
    05-28 09:43:09.964   809  1669 W SurfaceFlinger: Attempting to set client state on removed layer: thumbnail anim: AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}}#0
    05-28 09:43:09.964   809  1669 W SurfaceFlinger: Attempting to destroy on removed layer: thumbnail anim: AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}}#0
    05-28 09:43:10.345  3218  3218 I Timeline: Timeline: Activity_launch_request time:4308999 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:43:10.346  1315  5076 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:43:10.488   809   809 D SurfaceFlinger: duplicate layer name: changing Surface(name=AppWindowToken{f48556c token=Token{d777e1f ActivityRecord{3c9ddbe u0 com.zeapo.pwdstore/.crypto.PgpActivity t5420}}})/@0xd5eb8b3 - animation-leash to Surface(name=AppWindowToken{f48556c token=Token{d777e1f ActivityRecord{3c9ddbe u0 com.zeapo.pwdstore/.crypto.PgpActivity t5420}}})/@0xd5eb8b3 - animation-leash#1
    05-28 09:43:10.493   809   809 D SurfaceFlinger: duplicate layer name: changing Surface(name=AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}})/@0xb1fb959 - animation-leash to Surface(name=AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}})/@0xb1fb959 - animation-leash#1
    05-28 09:43:10.499  3218  3218 D PASS    : Check, dir: /data/user/0/com.zeapo.pwdstore/files/store
    05-28 09:43:10.885   809  1338 W SurfaceFlinger: Attempting to set client state on removed layer: com.zeapo.pwdstore/com.zeapo.pwdstore.crypto.PgpActivity#0
    05-28 09:43:10.885   809  1338 W SurfaceFlinger: Attempting to destroy on removed layer: com.zeapo.pwdstore/com.zeapo.pwdstore.crypto.PgpActivity#0
    05-28 09:43:10.891   809  2761 W SurfaceFlinger: Attempting to set client state on removed layer: Surface(name=AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}})/@0xb1fb959 - animation-leash#1
    05-28 09:43:10.891   809  2761 W SurfaceFlinger: Attempting to destroy on removed layer: Surface(name=AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}})/@0xb1fb959 - animation-leash#1
    05-28 09:43:10.958  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{5dd0d7a token=Token{136f5a5 ActivityRecord{4e2079c u0 com.zeapo.pwdstore/.PasswordStore t5420}}} to mClosingAppTokens
    05-28 09:43:10.960  1315  1842 W MiuiGesturePointerEventListener: add win = Window{6c64721 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:43:11.213  4721  4738 D GameBoosterService: onGameStatusChange foreground:ForegroundInfo{mForegroundPackageName='com.android.systemui', mForegroundUid=1000, mForegroundPid=2130, mLastForegroundPackageName='com.zeapo.pwdstore', mLastForegroundUid=10145, mLastForegroundPid=3218, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1, mFlags=0}
    05-28 09:43:20.452  1315  5076 D ProcessManager: remove task: TaskRecord{b5c8453 #5420 A=com.zeapo.pwdstore U=0 StackId=16 sz=3}
    05-28 09:43:20.452  1315  5076 I ProcessManager: SwipeUpClean: kill com.zeapo.pwdstore Adj=100 State=4
    05-28 09:43:20.461  1315  5076 I ActivityManager: Killing 3218:com.zeapo.pwdstore/u0a145 (adj 100): SwipeUpClean
    05-28 09:43:20.501  1315  1676 W InputDispatcher: channel '6c64721 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
    05-28 09:43:20.501  1315  1676 E InputDispatcher: channel '6c64721 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore (server)' ~ Channel is unrecoverably broken and will be disposed!
    05-28 09:43:20.507  1315  2862 I WindowManager: WIN DEATH: Window{6c64721 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore}
    05-28 09:43:20.507  1315  2862 W InputDispatcher: Attempted to unregister already unregistered input channel '6c64721 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore (server)'
    05-28 09:43:20.511  1315  5460 I AutoStartManagerService: MIUILOG- Reject RestartService packageName :com.zeapo.pwdstore uid : 10145
    05-28 09:43:22.182  2397  2397 I Timeline: Timeline: Activity_launch_request time:4320836 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras) }05-28 09:43:22.183  1315  2862 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras)} from uid 10034
    05-28 09:43:22.201  1315  2862 D ActivityTrigger: activityStartTrigger: Activity is Triggerred in full screen ApplicationInfo{e6ce95a com.zeapo.pwdstore}
    05-28 09:43:22.201  1315  2862 E ActivityTrigger: activityStartTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore/10302
    05-28 09:43:22.202  1315  2862 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e6ce95a com.zeapo.pwdstore} is now in focus and seems to be in full-screen mode
    05-28 09:43:22.202  1315  2862 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore/10302
    05-28 09:43:22.212  1315  2862 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e6ce95a com.zeapo.pwdstore} is now in focus and seems to be in full-screen mode
    05-28 09:43:22.212  1315  2862 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore/10302
    05-28 09:43:22.239  1315  1397 D Boost   : hostingType=activity, hostingName=com.zeapo.pwdstore/.PasswordStore, callerPackage=com.miui.home, isSystem=true, isBoostNeeded=false.
    05-28 09:43:22.240  1315  1397 I ActivityManager: Start proc 20798:com.zeapo.pwdstore/u0a145 for activity com.zeapo.pwdstore/.PasswordStore caller=com.miui.home
    05-28 09:43:22.277  4721  4738 D GameBoosterService: onGameStatusChange foreground:ForegroundInfo{mForegroundPackageName='com.zeapo.pwdstore', mForegroundUid=10145, mForegroundPid=20798, mLastForegroundPackageName='com.miui.home', mLastForegroundUid=10034, mLastForegroundPid=2397, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1, mFlags=1}
    05-28 09:43:22.378 20798 20798 D PASS    : Check, dir: /data/user/0/com.zeapo.pwdstore/files/store
    05-28 09:43:22.381 20798 20798 D REPO    : current path: /data/user/0/com.zeapo.pwdstore/files/store
    05-28 09:43:22.529  1315  1414 I ActivityManager: Displayed com.zeapo.pwdstore/.PasswordStore: +303ms
    05-28 09:43:22.590  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{94b954e u0 com.zeapo.pwdstore/.PasswordStore t5436} time:4321244
    05-28 09:43:22.591   809  1669 W SurfaceFlinger: Attempting to set client state on removed layer: Surface(name=AppWindowToken{3093f7c token=Token{500866f ActivityRecord{94b954e u0 com.zeapo.pwdstore/.PasswordStore t5436}}})/@0x4d97fac - animation-leash#0
    05-28 09:43:22.591   809  1669 W SurfaceFlinger: Attempting to destroy on removed layer: Surface(name=AppWindowToken{3093f7c token=Token{500866f ActivityRecord{94b954e u0 com.zeapo.pwdstore/.PasswordStore t5436}}})/@0x4d97fac - animation-leash#0
    05-28 09:43:22.700   809  1105 W SurfaceFlinger: Attempting to set client state on removed layer: Splash Screen com.zeapo.pwdstore#0
    05-28 09:43:22.700   809  1105 W SurfaceFlinger: Attempting to destroy on removed layer: Splash Screen com.zeapo.pwdstore#0
    05-28 09:43:23.073  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{3093f7c token=Token{500866f ActivityRecord{94b954e u0 com.zeapo.pwdstore/.PasswordStore t5436}}} to mClosingAppTokens
    05-28 09:43:23.075  1315  1842 W MiuiGesturePointerEventListener: add win = Window{f0f262 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:43:23.267  4721  4738 D GameBoosterService: onGameStatusChange foreground:ForegroundInfo{mForegroundPackageName='com.android.systemui', mForegroundUid=1000, mForegroundPid=2130, mLastForegroundPackageName='com.zeapo.pwdstore', mLastForegroundUid=10145, mLastForegroundPid=20798, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1, mFlags=0}
    05-28 09:44:25.288  2397  2397 I Timeline: Timeline: Activity_launch_request time:4383942 intent:Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras) }05-28 09:44:25.289  1315  1341 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.zeapo.pwdstore/.PasswordStore bnds=[838,1555][1006,1723] (has extras)} from uid 10034
    05-28 09:44:25.299  1315  1341 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e6ce95a com.zeapo.pwdstore} is now in focus and seems to be in full-screen mode
    05-28 09:44:25.299  1315  1341 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore/10302
    05-28 09:44:25.301  1315  1341 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e6ce95a com.zeapo.pwdstore} is now in focus and seems to be in full-screen mode
    05-28 09:44:25.302  1315  1341 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore/10302
    05-28 09:44:25.310  1315 12752 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e6ce95a com.zeapo.pwdstore} is now in focus and seems to be in full-screen mode
    05-28 09:44:25.310  1315 12752 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore/10302
    05-28 09:44:25.315  4721  4738 D GameBoosterService: onGameStatusChange foreground:ForegroundInfo{mForegroundPackageName='com.zeapo.pwdstore', mForegroundUid=10145, mForegroundPid=20798, mLastForegroundPackageName='com.miui.home', mLastForegroundUid=10034, mLastForegroundPid=2397, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1, mFlags=0}
    05-28 09:44:25.330 20798 20798 D PASS    : Check, dir: /data/user/0/com.zeapo.pwdstore/files/store
    05-28 09:44:25.694  1315  1414 I Timeline: Timeline: Activity_windows_visible id: ActivityRecord{94b954e u0 com.zeapo.pwdstore/.PasswordStore t5436} time:4384348
    05-28 09:44:26.650 20798 20798 I Timeline: Timeline: Activity_launch_request time:4385304 intent:Intent { act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras) }
    05-28 09:44:26.651  1315  1339 I ActivityManager: START u0 {act=DECRYPT_PASS cmp=com.zeapo.pwdstore/.crypto.PgpActivity (has extras)} from uid 10145
    05-28 09:44:26.655  1315  1339 D ActivityTrigger: activityStartTrigger: Activity is Triggerred in full screen ApplicationInfo{e6ce95a com.zeapo.pwdstore}
    05-28 09:44:26.655  1315  1339 E ActivityTrigger: activityStartTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.crypto.PgpActivity/10302
    05-28 09:44:26.656  1315  1339 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e6ce95a com.zeapo.pwdstore} is now in focus and seems to be in full-screen mode
    05-28 09:44:26.656  1315  1339 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.crypto.PgpActivity/10302
    05-28 09:44:26.662  1315  1339 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e6ce95a com.zeapo.pwdstore} is now in focus and seems to be in full-screen mode
    05-28 09:44:26.662  1315  1339 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.crypto.PgpActivity/10302
    05-28 09:44:26.780  1315  1414 I ActivityManager: Displayed com.zeapo.pwdstore/.crypto.PgpActivity: +112ms
    05-28 09:44:26.817  1315 12752 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e6ce95a com.zeapo.pwdstore} is now in focus and seems to be in full-screen mode
    05-28 09:44:26.817  1315 12752 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore/10302
    05-28 09:44:26.817  1315 12752 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{e6ce95a com.zeapo.pwdstore} is now in focus and seems to be in full-screen mode
    05-28 09:44:26.817  1315 12752 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore/10302
    05-28 09:44:26.824   809   809 D SurfaceFlinger: duplicate layer name: changing Surface(name=AppWindowToken{526af69 token=Token{8a13df0 ActivityRecord{a606633 u0 com.zeapo.pwdstore/.crypto.PgpActivity t5436}}})/@0xefddf52 - animation-leash to Surface(name=AppWindowToken{526af69 token=Token{8a13df0 ActivityRecord{a606633 u0 com.zeapo.pwdstore/.crypto.PgpActivity t5436}}})/@0xefddf52 - animation-leash#1
    05-28 09:44:26.829   809   809 D SurfaceFlinger: duplicate layer name: changing Surface(name=AppWindowToken{3093f7c token=Token{500866f ActivityRecord{94b954e u0 com.zeapo.pwdstore/.PasswordStore t5436}}})/@0x4d97fac - animation-leash to Surface(name=AppWindowToken{3093f7c token=Token{500866f ActivityRecord{94b954e u0 com.zeapo.pwdstore/.PasswordStore t5436}}})/@0x4d97fac - animation-leash#1
    05-28 09:44:26.836 20798 20798 D PASS    : Check, dir: /data/user/0/com.zeapo.pwdstore/files/store
    05-28 09:44:27.201   809  2761 W SurfaceFlinger: Attempting to set client state on removed layer: com.zeapo.pwdstore/com.zeapo.pwdstore.crypto.PgpActivity#0
    05-28 09:44:27.201   809  2761 W SurfaceFlinger: Attempting to destroy on removed layer: com.zeapo.pwdstore/com.zeapo.pwdstore.crypto.PgpActivity#0
    05-28 09:44:27.402  1315  1842 W MiuiGesturePointerEventListener: add AppWindowToken{3093f7c token=Token{500866f ActivityRecord{94b954e u0 com.zeapo.pwdstore/.PasswordStore t5436}}} to mClosingAppTokens
    05-28 09:44:27.405  1315  1842 W MiuiGesturePointerEventListener: add win = Window{f0f262 u0 com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore} to mScalingWindows
    05-28 09:44:27.637  2130  2130 D RecentsImpl: startRecentsActivity runningTask: ComponentInfo{com.zeapo.pwdstore/com.zeapo.pwdstore.PasswordStore}
    05-28 09:44:27.670  4721  4738 D GameBoosterService: onGameStatusChange foreground:ForegroundInfo{mForegroundPackageName='com.android.systemui', mForegroundUid=1000, mForegroundPid=2130, mLastForegroundPackageName='com.zeapo.pwdstore', mLastForegroundUid=10145, mLastForegroundPid=20798, mMultiWindowForegroundPackageName='null', mMultiWindowForegroundUid=-1, mFlags=0}
    
    opened by mdczaplicki 42
  • Let SshKeyGenFragment use the Android Keystore

    Let SshKeyGenFragment use the Android Keystore

    :loudspeaker: Type of change

    • [ ] Bugfix
    • [x] New feature
    • [x] Enhancement
    • [ ] Refactoring

    :scroll: Description

    Note: This is ready for review, but requires a patched SSHJ dependency since version 0.30.0 hasn't been released yet. Once it is and the review is done, I will remove the .jar and depend on the Maven repository.

    Implement an SSH auth method backed by an Android Keystore key and make SshKeyGenFragment generate such a key.

    In detail, this means the following:

    • SSH keys generated within the app are no longer kept in a simple file optionally encrypted with a passphrase, but rather in the Android Keystore optionally protected with the user's screen lock credential. On modern devices with a TEE this means that the private key will not be leaked even if the device is rooted or compromised remotely.
    • SSH key files with passphrases remain supported for users who prefer them, they just can't be generated from within the app anymore.
    • The offered key types are changed from RSA-2048 and RSA-4096 (default) to RSA-2048, RSA-3072 and P-384 (default) for the following reasons:
      • RSA-2048 is by far the most widely supported key type and reasonably fast. Although it is no longer recommended to be used for security needs that extend into the 2030s, this does not matter too much in the context of SSH authentication. It's a keep, but should not be the default.
      • RSA-3072 will remain secure for at least a decade or two and can't possibly be backdoored by the NSA, which likely appeals to a good part of our userbase.
      • RSA-4096, the previous default, is unreasonably slow. I am open to be convinced of its usefulness, but so far fail to see why this algorithm would ever be a good fit for authentication (I could see this being useful for long-term encryption though).
      • P-384 is both very fast and recommended for long-term security, which makes it a great default option. Of course not everybody will be happy with this (or any other NIST-supplied) curve, but for SSH authentication against a pass git repository, I don't see any actual issues.
    • Small changes were made to BiometricAuthenticator to fix one of two memory leaks.
    • I needed to duplicate some of SSHJ's code, but luckily its Apache 2.0 license is compatible with the GPL 3.

    Note: SSHJ so far doesn't support SHA-256/512 signatures with ssh-rsa key types. This will probably be fixed upstream at some point, which is why we allow these signature algorithms to be used with our Keystore keys. Again, in the context of SSH authentication, relying on SHA1 is not a major issue.

    :bulb: Motivation and Context

    We were not making use of the extensive Android capabilities around cryptography and had to rely on Jsch to generate SSH keys for us.

    :green_heart: How did you test it?

    I generated and used both RSA and EC keys, please do the same.

    :pencil: Checklist

    • [x] I formatted the code with the IDE's reformat action (Ctrl + Shift + L/Cmd + Shift + L)
    • [x] I reviewed submitted code

    :crystal_ball: Next steps

    :camera_flash: Screenshots / GIFs

    Screenshots
    opened by fmeum 41
  • [BUG] OpenKeychain does not recognize the same key formats as GPG

    [BUG] OpenKeychain does not recognize the same key formats as GPG

    Whenever I save a password entry, I get the following error:

    "Found .gpg-id, but it contains an invalid key id, fingerprint or user ID."

    This can be reproduced by editing any existing entry or creating a new entry. Existing entries can be decrypted just fine.

    Oneplus 7 Pro, Android 10, Password Store 1.10.3.

    The only thing I can see that I'm doing that may diverge from the common case is that my key id is not a fully-formed email address ([email protected]), but simply [email protected]

    C-bug 
    opened by CaptainVonNutbar 37
  • Google.... Autofill & Logo

    Google.... Autofill & Logo

    Today I've got two new issues with Google Play Store:

    • We are asked to remove android.permission.BIND_ACCESSIBILITY_SERVICE as we're not helping "users with disabilities"
    • We are "impersonating" an other application Lock App Lock Security Privacy

    For the first part, I've just made an appeal, I have 30 days before the application is unpublished.

    For the second one, can somebody make us a good logo? :)

    opened by zeapo 37
  • Add support for Oreo Autofill

    Add support for Oreo Autofill

    :loudspeaker: Type of change

    • [ ] Bugfix
    • [x] New feature
    • [ ] Enhancement
    • [ ] Refactoring

    :scroll: Description

    This PR adds an Oreo Autofill service to Password Store that offers to fill forms and save credentials (username and password) in compatible apps and browsers. It allows users to

    • fill from Password Store entries, selected either via free search or via a matching system;
    • generate new credentials and save them in their repository;
    • save credentials they manually entered in login forms.

    The Autofill implementation aims to mitigate vulnerabilities present in many other password managers by strictly adhering to the following guidelines with regards to how it matches store entries to apps and websites:

    • If a trusted browser app (identified via package name and certificate hash) annotates a login form with a web domain, the eTLD + 1 (also called "canonical domain") is associated with all entries the user chooses to fill, generate or save.
    • If a login form does not originate from a website displayed in a trusted browser app, it is associated with the app itself (identified via package name and certificate hash). If, at any later point in time, the certificate hash changes, the user is warned about a potential phishing attempt.

    Browsers vary in their level of support for Autofill, which generally falls into one of the following four categories:

    1. No support: For whatever reason, some browsers (e.g. Opera) never trigger any Autofill requests.
    2. Single-origin support: Many browsers such as Chrome and its derivatives support Autofill in compatibility mode, but fail to report all web origins present on a page (such as in iframes). Since filling into non-visible form elements across origin boundaries is ripe for abuse, in such browsers Autofill is limited to filling a single password into the focused password field (plus a username). I hope that this strikes a decent balance between usability and security.
    3. Multi-origin support: Browsers with custom Autofill support or those that rely on WebViews correctly propagate origin information to all form elements, which allows the service to fill more aggressively - for example, it can offer to fill a registration form with a username and two new-password fields in a single action, regardless of focus. Mozilla browsers, Opera Mini/Touch, DuckDuckGo and the Tor Browser fall in this category.
    4. Save support: A few browsers have already added custom Autofill support and thus also provide submitted credentials for us to save. This e.g. works in Firefox Focus, Opera Mini/Touch and DuckDuckGo.

    Of course, in order to be really helpful, Password Store needs to detect login forms as precisely as possible. For this reason, I have implemented a Kotlin DSL for Autofill rules that aims to be accessible to a broad range of developers. Please let me know about your thoughts on this in particular.

    :bulb: Motivation and Context

    This fixes #410 and may supersede #551.

    I took #551 by @c4software as the starting point and would like to thank them very much for getting the ball rolling.

    :green_heart: How did you test it?

    I tested the service with many apps and websites. Since this is a big feature that can potentially interact with any app or website out there, this does of course require much more testing than I cannot take on myself.

    :pencil: Checklist

    • [x] I ran ./gradlew spotlessApply before submitting the PR
    • [x] I reviewed submitted code

    :crystal_ball: Next steps

    • [x] Decide on a naming convention to prevent confusion with Accessibility autofill
    • [ ] Add UI that introduces the user to the new Autofill API and allows to enable it from within the app
    • [x] (Optional) Add Autofill-specific settings to the Password Store settings screen
    • [ ] Test with various apps and websites and add Autofill rules to AutofillStrategy.kt
    • [ ] Verify the authenticity of the browser certificate hashes and the browser compatibility settings
    • [ ] Add translations (I can cover German if needed)

    :camera_flash: Screenshots / GIFs

    Screenshot_20200318-133737 Screenshot_20200318-133747 Screenshot_20200318-144805 Screenshot_20200318-144842 Screenshot_20200318-164602 Screenshot_20200318-153116 Screenshot_20200318-153122

    opened by fmeum 36
  • Begin work on API level 30 transition

    Begin work on API level 30 transition

    :loudspeaker: Type of change

    • [ ] Bugfix
    • [ ] New feature
    • [ ] Enhancement
    • [ ] Refactoring
    • [ ] Dependency updates

    :scroll: Description

    API level 30 brings some changes with it that require non-trivial changes. So far, this PR only takes care of the easy parts, especially scoped storage will require more work.

    :bulb: Motivation and Context

    I thought it would be a good idea to have a tracking PR early on with which we can experiment.

    :green_heart: How did you test it?

    :pencil: Checklist

    • [ ] I formatted the code with the IDE's reformat action (Ctrl + Shift + L/Cmd + Shift + L)
    • [ ] I reviewed submitted code
    • [ ] I added a CHANGELOG entry if applicable

    :crystal_ball: Next steps

    :camera_flash: Screenshots / GIFs

    C-technical-debt E-hard P-high S-design A-Git 
    opened by fmeum 35
  • Refactor Git related activities

    Refactor Git related activities

    :loudspeaker: Type of change

    • [ ] Bugfix
    • [x] New feature
    • [ ] Enhancement
    • [x] Refactoring

    :scroll: Description

    Completely refactor, rewrite and redesign everything that has anything to do with Git. This is very much WIP, and a lot of things are simply just gone. Bear with my timeline and feel free to assist.

    :bulb: Motivation and Context

    A lot of tech debt ripe for fixups here.

    Fixes #521 Fixes #629

    :green_heart: How did you test it?

    I prayed to the Lord Gabe like the true gamer I am.

    :pencil: Checklist

    • [ ] I ran ./gradlew spotlessApply before submitting the PR
    • [ ] I reviewed submitted code

    :crystal_ball: Next steps

    Finish this fucking thing

    :camera_flash: Screenshots / GIFs

    Details
    opened by msfjarvis 33
  • Support multiple password stores

    Support multiple password stores

    (This is already in the TODO section of the README.)

    In my case, I have a password store for my personal accounts and also use a password store shared with other people. I would be nice to be able to access both stores on my phone without having to combine them in any way.

    E-hard P-low S-design A-Git C-feature S-unassigned 
    opened by lverns 33
  • Support OpenPGP hardware keys

    Support OpenPGP hardware keys

    Integrate hwsecurity to delegate decryption operations to OpenPGP security keys. This has been tested with NFC and USB hardware.

    The integration point is a new callback to CryptoHandler.decrypt that provides the encrypted session key and expects the decrypted PGPSessionKey in return. The implementation then delegates as much as possible to hwsecurity's OpenPGPSecurityKeyDialogFragment.

    Importing is handled by creating GnuPG-compatible stub keys, so no change to key storage is required, and it should be possible to import a secret keychain with stub keys that was exported from GnuPG. The import activity also prompts to "pair" a hardware key when importing a public key, so one could download their key from a keyserver and have hardware support without too much work.

    Future improvements:

    • Support import from keyservers, so the only manual step in the best case would be to insert a hardware key.
    • The hwsecurity dialog is kind of ugly and doesn't fit well with Material 3.
    • Most of hwsecurity is unneeded for this implementation, so a new library could be much slimmer and more modernized.
    • It would be nice to view and manage hardware devices in the key management UI.

    TODOs:

    • [ ] PGPainless callback API: https://github.com/pgpainless/pgpainless/pull/322
    • [ ] APS hwsecurity fixes: https://github.com/android-password-store/hwsecurity/pull/2
    • [ ] Find a way to defer the password dialog until needed by PGPainless, as OpenPGP keys aren't password-protected.
    • [ ] Test ECDH decryption
    opened by tadfisher 1
  • [FEATURE] age support

    [FEATURE] age support

    Is your feature request related to a problem? Please describe.

    PGP's user experience is very lacking, and unless you spend significant amounts of time learning to use it, you might end up committing really simple mistakes compromising your security. it'd be really nice to have support for age encryption / passage as an alternative to PGP/GPG.

    Describe the solution you'd like

    Native integration of age encryption support into the app.

    Describe alternatives you've considered

    Regular PGP, but see above.

    Additional context

    I saw this discussed in #1486 , but the last comment there is soon to be 2 years old; has there been any progress?

    E-hard P-medium S-design C-feature S-in-progress A-kage 
    opened by Akiiino 1
  • [BUG] fednetbank.com autofill does not fill password

    [BUG] fednetbank.com autofill does not fill password

    Describe the bug

    Initially with fednetbank.com as folder name it only offered to generate password. Once I moved it as work/fednetbank.com it showed option to fill but it was empty even after choosing the correct entry. This site works fine on Firefox and browser pass extension on laptop.

    Steps to reproduce

    Steps to reproduce the behavior:

    1. Go to fednetbank.com
    2. Generate password
    3. And try to autofill
    4. The password field is empty.

    Expected behavior

    It should autofill password

    Screenshots

    No response

    Device information

    • Device: Redmi Note 4
    • OS: Carbon Rom
    • App version [e.g. 3.1.0]

    Additional context

    No response

    C-bug S-awaiting-triage 
    opened by pravi 0
  • [META] Clean up issues reported by Detekt

    [META] Clean up issues reported by Detekt

    We recently introduced Detekt to our CI suite and setup a baseline. Cleaning up the suppressed existing issues is a low effort, high value task that anyone can pick up without needing too much operational knowledge of how the app functions.

    hacktoberfest C-technical-debt E-easy P-low A-CI-CD A-meta 
    opened by msfjarvis 5
  • [BUG] Delay searching password list

    [BUG] Delay searching password list

    Describe the bug

    I have roughly 1,300 passwords in my store, and when I fire up the UI (or try to use autofill) to search for a password, it takes a few seconds for the results to show up. I kinda expect filtering of the resultset to be instantaneous, and 1,300 entries isn't exactly a big search task even if search were to be done linearly, but the filesystem itself already does some sort of B-Tree, so this is a bit hard to understand.

    Steps to reproduce

    Steps to reproduce the behavior:

    1. Open the app, or engage autofill
    2. Enter search term into search field, e.g. "github"
    3. Wait 2–3 seconds before the list is refreshed

    Expected behavior

    As I hit 'g', I expect the list to hide all entries not containing a "g", and the "g" in matching entries to be boldened. When I hit "i", the list again updates instantaneously.

    Screenshots

    No response

    Device information

    • Device: Google Pixel 6 Pro
    • OS: GrapheneOS, Android 12
    • App version: 1.13.5

    Additional context

    No response

    C-bug E-hard P-medium S-design A-pass-list 
    opened by madduck 3
  • [FEATURE] Allow using PGP key for SSH

    [FEATURE] Allow using PGP key for SSH

    Is your feature request related to a problem? Please describe.

    With OpenKeychain it was possible to use your GPG key to authenticate over SSH, which is not supported with the PGPainless backend.

    Describe the solution you'd like

    Implement support for using a selected GPG key as the SSH authentication method.

    Describe alternatives you've considered

    N/A

    Additional context

    N/A

    E-hard P-low S-blocked C-feature A-auth S-unassigned A-PGPainless 
    opened by skewballfox 1
Releases(latest)
  • autofill-parser-v1.1.1(Jun 20, 2022)

  • autofill-parser-v1.1.0(Dec 31, 2021)

    1.1.0

    Changed

    • Changed the support level for Chrome Beta/Canary/Dev/Stable, Bromite and Ungoogled Chromium to PasswordFillAndSaveIfNoAccessibility.
    • Updated androidx.annotation to 1.3.0 and androidx.autofill to 1.2.0-beta01.
    • The library now uses Kotlin 1.6.10 and Coroutines 1.6.0.
    • Added Styx to supported Autofill browsers.
    • The dependency on timberkt has been replaced with logcat.
    • Updated publicsuffixes list to the latest version as of Dec 18 2021.

    Fixed

    • Fix build warning from undeclared unsigned type use.

    Added

    • Added the PasswordFillAndSaveIfNoAccessibility browser support level for Chromium-based browsers beyond v89.
    • Added the german term for username to the heuristic keywords.
    • Non-native Autofill browsers are now deemed unsupported before Android 9.
    Source code(tar.gz)
    Source code(zip)
  • v1.13.5(Jul 28, 2021)

  • v1.13.4(Mar 20, 2021)

  • v1.13.3(Mar 7, 2021)

  • v1.13.2(Dec 21, 2020)

    Added

    • Invalid .gpg-id files can now be fixed automatically by deleting them and then trying to create a new password.
    • Suggest users to re-clone repository when it is deemed to be broken
    • A new browser support level is added for Chrome Canary and Chrome Dev which are shipping fixes developed by Password Store maintainer Fabian to improve the Autofill experience on Chromium browsers

    Changed

    • Synced localisations with Crowdin. This adds Galician and Italian translations while getting rid of incomplete Arabic, Chinese Simplified, Chinese Traditional, Czech, Japanese and Spanish.

    Fixed

    • Cancelling the Autofill "Generate password" action now correctly returns you to the original app.
    • If multiple username fields exist in the password, we now ensure the later ones are not dropped from extra content.
    • Icons in Autofill suggestions are no longer black on almost black in dark mode.
    • Decrypt screen would stay in memory infinitely, allowing passwords to be seen without re-auth
    • Git commits in the store would wrongly use the 'default' committer as opposed to the user's configured one
    • Connection attempts now use a reasonable 10 second timeout as opposed to the default of 30 seconds
    • A change to the remote host key for a server would prevent the user from being able to connect to it
    Source code(tar.gz)
    Source code(zip)
    APS-free_v1.13.2.apk(4.29 MB)
    APS-nonFree_v1.13.2.aab(5.26 MB)
    APS-nonFree_v1.13.2.apk(4.51 MB)
  • autofill-parser-v1.0.0(Apr 7, 2021)

  • v1.13.1(Oct 23, 2020)

    Fixed

    • OpenKeychain authentication would fail with LifecycleOwner [email protected] is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.

    Added

    • Add support for domain-level autofill in DuckDuckGo's F-Droid builds.
    • Support gopass MIME secret encoding

    Changed

    • The newly added automatic synchronisation feature has been rolled back due to multiple issues with its implementation.
    Source code(tar.gz)
    Source code(zip)
    APS-free_v1.13.1.apk(4.27 MB)
    APS-nonFree_v1.13.1.aab(5.26 MB)
    APS-nonFree_v1.13.1.apk(4.49 MB)
  • v1.13.0(Oct 22, 2020)

    Long-form release notes: https://msfjarvis.dev/posts/aps-october-release/

    Fixed

    • Some classes of errors would be swallowed by an unhelpful 'Invalid remote: origin' message
    • Repositories created within APS would contain invalid .gpg-id files with no ability to fix them from the app
    • Button labels were invisible in Autofill phishing warning screen
    • Unsupported authentication modes would appear briefly in the server config screen

    Added

    • Add GPG key selection step to onboarding flow
    • Allow configuring an app-wide HTTP(S) proxy
    • Add option to automatically sync repository on app launch
    • Add a quickfix for invalid HTTPS URLs that contain a custom port
    Source code(tar.gz)
    Source code(zip)
    APS-free_v1.13.0.apk(4.27 MB)
    APS-nonFree_v1.13.0.aab(5.26 MB)
    APS-nonFree_v1.13.0.apk(4.50 MB)
  • v1.12.1(Oct 13, 2020)

  • v1.12.0(Sep 24, 2020)

    Added

    • Allow sorting by recently used
    • Add Bromite, Ungoogled Chromium and Kiwi to supported browsers list for Autofill
    • Add ability to view the Git commit log
    • Allow generating ECDSA and ED25519 keys for SSH
    • Add support for multiple/fallback authentication methods for SSH
    • Add warning when the custom SSH port in a URL could potentially be ignored

    Changed

    • A descriptive error message is shown if no username is specified in the Git server settings
    • Remove explicit protocol choice from Git server settings, it is now inferred from your URL
    • 'Show hidden folders' is now 'Show hidden files and folders'
    • Generated SSH keys are now stored in the Android Keystore if available, and encrypted at rest otherwise
    • Allow using device's screen lock credentials to secure generated SSH key
    • Update onboarding UI
    • Update translations

    Fixed

    • Git server protocol and authentication mode are only updated when explicitly saved
    • Remember HTTPS password during a sync operation
    • Unable to use show/hide password option for password/passphrase after first attempt was wrong
    • TOTP values shown might some times be stale and considered invalid by sites
    • Symlinks are no longer clobbered by the app (only available on Android 8 and above)
    • Workaround lack of SSH connection reuse capabilities on some Git hosts like Bitbucket
    Source code(tar.gz)
    Source code(zip)
    APS-free_v1.12.0.apk(4.13 MB)
    APS-nonFree_v1.12.0.aab(5.26 MB)
    APS-nonFree_v1.12.0.apk(4.36 MB)
  • v1.11.3(Aug 27, 2020)

  • v1.11.2(Aug 24, 2020)

  • v1.11.0(Aug 19, 2020)

    Added

    • Allow changing the branch used for Git operations
    • Allow setting a subdirectory key when creating folders
    • Allow adding digits/symbols in XkPasswd generated passwords using a mask-like value (dds gives you two digits and a symbol, and so on)

    Changed

    • The Git repository URL can now be specified directly
    • Slightly reduce APK size
    • Always show the parent path in entries
    • Passwords will no longer be copied to the clipboard by default
    • Notify user if there was nothing to push

    Fixed

    • Allow creating nested directories directly
    • I keep saying this but for real: error message for wrong SSH/HTTPS password is properly fixed now
    • Fix crash when OpenKeychain is not installed
    • Clone operation won't leave user on an empty password list upon failure
    • Cloning a new repository to external storage wouldn't work
    • UI froze for some people when deleting existing files from the external directory
    Source code(tar.gz)
    Source code(zip)
    APS-free_v1.11.0.apk(4.11 MB)
    APS-nonFree_v1.11.0.aab(5.22 MB)
    APS-nonFree_v1.11.0.apk(4.33 MB)
  • v1.10.3(Jul 31, 2020)

  • v1.10.2(Jul 30, 2020)

  • v1.10.1(Jul 23, 2020)

  • v1.10.0(Jul 22, 2020)

    Changed

    • A brand new icon to go with our biggest update ever!
    • Light theme is now a consistent white across the board with ample contrast
    • XkPassword generator is now easier to use with less configuration options
    • Edit screen now has better protection and guidance for invalid names
    • Improved biometric authentication UX on app start
    • Improved password list UI

    Fixed

    • Folder names that were very long did not look right
    • Error message for wrong SSH/HTTPS password now looks cleaner
    • Fix authentication failure with usernames that contain the @ character
    • Text input boxes were illegible on dark theme
    • Top-level password names had inconsistent top margin making them look askew
    • Password Store no longer ignores the selected OpenKeychain key
    • Password export now happens in a separate process, preventing possible freezes

    Added

    • TOTP support is reintroduced by popular demand. HOTP continues to be unsupported and heavily discouraged.
    • Initial support for detecting and filling OTP fields with Autofill
    • OTP codes can be automatically filled from SMS (requires Android P+ and Google Play Services)
    • Importing TOTP secrets using QR codes
    • Support for ed25519/ECDSA SSH keys
    • Navigate into newly created folders and scroll to newly created passwords
    • Support per-directory keys
    • Full pt-BR localization
    Source code(tar.gz)
    Source code(zip)
    APS-free_v1.10.0.apk(4.23 MB)
    APS-nonFree_v1.10.0.aab(5.38 MB)
    APS-nonFree_v1.10.0.apk(4.45 MB)
  • v1.9.2(Jun 30, 2020)

  • v1.9.1(Jun 28, 2020)

  • v1.9.0(Jun 21, 2020)

    Fixed

    • 'Draw over other apps' permission dialog opens when attempting to use Oreo Autofill
    • Old app shortcuts are now removed when the local repository is deleted

    Added

    • Completely revamped decypted password view
    • Add support for better, more secure Keyex's and MACs with a brand new SSH backend
    • Allow manually marking domains for subdomain-level association. This will allow you to keep separate passwords for site1.example.com and site2.example.com and have them show as such in Autofill.
    • Provide better messages for OpenKeychain errors
    • Rename passwords and categories

    Changed

    • BREAKING: Remove support for HOTP/TOTP secrets - Please use FIDO keys or a dedicated app like Aegis or andOTP
    • Reduce Autofill false positives on username fields by removing "name" from list of heuristic terms
    • Reduced app size
    • Improve IME experience with server config screen
    • Removed edit password option from long-press menu.
    • Batch deletion now does not require manually confirming for each password
    • Better commit messages on password deletion
    Source code(tar.gz)
    Source code(zip)
    APS_v1.9.0.aab(4.79 MB)
    APS_v1.9.0.apk(3.88 MB)
  • v1.8.1(May 24, 2020)

  • v1.8.0(May 23, 2020)

    Added

    • Allow user to abort password move when it is replacing an existing file
    • Allow setting a default username for Autofill
    • Add no authentication mode for working with public repositories

    Changed

    • More UI related tweaks, changes and improvements
    • Improved error messages and internal logic for server configuration

    Fixed

    • Add the following fields to encrypted username detection: user, account, email, name, handle, id, identity.
    • Improved detection of broken or incomplete git repositories
    • Better UX flow for storage permissions
    Source code(tar.gz)
    Source code(zip)
    app-release.apk(3.34 MB)
  • v1.7.2(Apr 28, 2020)

    Added

    • Settings option to enable debug logging

    Changed

    • SSH Keygen UI was improved
    • Default key length for SSH Keygen is now 4096 bits
    • Settings items were rearranged and cleaned up
    • Autofill icons in dark mode are now more legible

    Fixed

    • Failure to detect if repository was not cloned which broke Git operations
    • Search results were inaccurate if root directory's name started with a dot (.)
    • Saving git username and email did not provide user-facing confirmation
    Source code(tar.gz)
    Source code(zip)
    app-release.apk(3.39 MB)
  • v1.7.1(Apr 23, 2020)

    Fixed

    • Autofill message does not show OK button when many browsers are installed
    • Autofill message does not get marked as shown when dismissed
    • App crashes when using type-independent sort
    • Storage permission not requested when using existing external repository
    Source code(tar.gz)
    Source code(zip)
    app-release.apk(3.38 MB)
  • v1.7.0(Apr 21, 2020)

    Our biggest release yet with crucial fixes and massive new features. Please also welcome our newest maintainer, @FabianHenneke!

    Added

    • Flexible Oreo autofill support with anti-phishing protection
    • Rudimentary validation of SSH keys during import
    • Securely remember HTTPS password/SSH key passphrase

    Fixed

    • Text input box theming
    • Password repository held in non-hidden storage no longer fails
    • Remove ambiguous and confusing URL field in server config menu and heavily improve UI for ease of use

    Changed

    • Improved user experience with search backed by consistent search logic and fuzzy matching
    • Improved UX around server config settings
    Source code(tar.gz)
    Source code(zip)
    app-release.apk(3.38 MB)
  • v1.6.0(Mar 20, 2020)

    Added

    • Copy implicit username (password filename) by long pressing
    • Create xkpasswd style passwords
    • Swipe on password list to synchronize repository

    Fixed

    • Resolve memory leaks on password decryption
    • Can't delete folders containing a password
    Source code(tar.gz)
    Source code(zip)
    app-release.apk(3.00 MB)
  • v1.5.0(Feb 21, 2020)

    Added

    • Fast scroller with alphabetic hints
    • UI button to create new folders
    • Option to directly start searching when opening the app
    • Option to always search from root folder regardless of the currently open folder

    Changed

    • Logging is now enabled in release builds
    • Searching now shows folders as well as the passwords inside them

    Fixed

    • OpenKeychain errors cause app crash
    Source code(tar.gz)
    Source code(zip)
    app-release.apk(2.97 MB)
Owner
Android Password Store
Android client for the Password Store CLI
Android Password Store
An interactive command line interface to a transactional key value store

Transactional Key-Value Store An interactive command line interface to a transactional key value store. Commands: SET <key> <value> // store the value

Eugene 0 Jan 14, 2022
A starter project to build command-line tools in Kotlin Multiplatform

A starter project to build command-line tools in Kotlin Multiplatform Contains a re-implementation of a real world CLI tool: git-standup Installation

null 0 May 2, 2022
Tools for Kotlin/Kscript to easy write shell command line in kotlin code

Kscript Tools Easy way to run shell command line in kotlin and other tools Usage Used in kscript: @file:DependsOn("com.sealwu:kscript-tools:1.0.2") Us

Seal 4 Sep 20, 2022
Event State Processor Generator plugin is compatible with IntelliJ and Android Studio.

Event State Processor Generator plugin is compatible with IntelliJ and Android Studio. It provides source code generation for the EventStateProcessor Library to increase code productivity in Flutter apps development.

Extreme Vietnam Public 2 Dec 7, 2021
Native-Blur: a C++/Kotlin library for blur bitmaps and activity, mobile-ready, android compatible

Native-Blur The Native-Blur is a C++/Kotlin libraray for blur bitmaps and activity, mobile-ready, android compatible, powered by Java Native Interface

Abolfazl Abbasi 25 Nov 18, 2022
A convenient BMI (Body Mass Index) calculator that is compatible with Android devices.

?? BMI Calculator A convenient BMI (Body Mass Index) calculator that is compatible with Android devices. ?? Please feel free to compute your BMI using

Md. Zahidul Islam 10 Nov 24, 2022
An AutoValue extension that generates binary and source compatible equivalent Kotlin data classes of AutoValue models.

AutoValue Kotlin auto-value-kotlin (AVK) is an AutoValue extension that generates binary-and-source-compatible, equivalent Kotlin data classes. This i

Slack 19 Aug 5, 2022
🧶 Library to handling files for persistent storage with Google Cloud Storage and Amazon S3-compatible server, made in Kotlin

?? Remi Library to handling files for persistent storage with Google Cloud Storage and Amazon S3-compatible server, made in Kotlin! Why is this built?

Noelware 8 Nov 7, 2022
Kotlin compiler plugin for converting suspend functions to platform-compatible functions

Kotlin suspend transform compiler plugin Summary Kotlin compiler plugin for generating platform-compatible functions for suspend functions. JVM class

ForteScarlet 5 Oct 12, 2022
kotlin eval command for minestom

k Kotlin debugging evaulator in Minestom. Usage /k is shorthand, /ko is longhand requires the permission "k.ok" and "k.store" for running scripts and

Cepi 3 Jun 20, 2022
🐹 Kotlin microservice to aid slash command creation for Nino.

slash-commands ?? .Kotlin microservice to aid slash command creation for Nino. More of this README will be fixed up once the first release is here. Li

Nino 5 Oct 1, 2021
🌨️ Simple, intuitive, and opinionated command handling library for Kord

??️ Snow Simple, intuitive, and opinionated command handling library for Kord Why? Since I maintain two Discord bots, both in Kotlin, Nino and Noel (p

Noel ʕ •ᴥ•ʔ 1 Jan 16, 2022
Commands - Simple work in progress command framework

Commands Purpose commands is a performant, flexible, future-rich, and easy-to-us

rawr 5 Nov 10, 2022
A simple Android application to store daily notes in the internal database of the application

Simple Note App Note App is a simple Android application to store daily notes in the internal database of the application and can store an image or a

Heba Elsaid 5 Jun 3, 2022
This is an example of a simple application with layered software base on clean-architecture as application architecture and mvvm as presentation architecture

This is an example of a simple application with layered software base on clean-architecture as application architecture and mvvm as presentation archi

null 3 Jul 2, 2021
Shreyas Patil 2.1k Nov 27, 2022
🔥The Android Startup library provides a straightforward, performant way to initialize components at the application startup. Both library developers and app developers can use Android Startup to streamline startup sequences and explicitly set the order of initialization.

??The Android Startup library provides a straightforward, performant way to initialize components at the application startup. Both library developers and app developers can use Android Startup to streamline startup sequences and explicitly set the order of initialization.

Rouse 1.3k Nov 23, 2022
📒 NotyKT is a complete 💎Kotlin-stack (Backend + Android) 📱 application built to demonstrate the use of Modern development tools with best practices implementation🦸.

NotyKT ??️ NotyKT is the complete Kotlin-stack note taking ??️ application ?? built to demonstrate a use of Kotlin programming language in server-side

Shreyas Patil 1.4k Nov 21, 2022
An Intentionally designed Vulnerable Android Application built in Kotlin.

?? InsecureShop InsecureShop is an Android application that is designed to be intentionally vulnerable. The aim of creating this app is to teach devel

Optiv Security 208 Nov 10, 2022