├── .gitignore ├── COPYING ├── README.md ├── SECURITY.md ├── SERVER-API-SPEC.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── release │ └── output-metadata.json └── src │ ├── androidTest │ └── java │ │ └── de │ │ └── jepfa │ │ └── yapm │ │ └── service │ │ ├── otp │ │ └── OtpServiceTest.kt │ │ └── secret │ │ ├── BruteForceTest.kt │ │ └── SecretServiceTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── open_source_licenses.html │ ├── ic_anotherpass_launcher-playstore.png │ ├── java │ │ └── de │ │ │ └── jepfa │ │ │ └── yapm │ │ │ ├── database │ │ │ ├── YapmDatabase.kt │ │ │ ├── dao │ │ │ │ ├── EncCredentialDao.kt │ │ │ │ ├── EncLabelDao.kt │ │ │ │ ├── EncUsernameTemplateDao.kt │ │ │ │ └── EncWebExtensionDao.kt │ │ │ ├── entity │ │ │ │ ├── EncCredentialEntity.kt │ │ │ │ ├── EncLabelEntity.kt │ │ │ │ ├── EncUsernameTemplateEntity.kt │ │ │ │ └── EncWebExtensionEntity.kt │ │ │ └── repository │ │ │ │ ├── CredentialRepository.kt │ │ │ │ ├── LabelRepository.kt │ │ │ │ ├── UsernameTemplateRepository.kt │ │ │ │ └── WebExtensionRepository.kt │ │ │ ├── model │ │ │ ├── Clearable.kt │ │ │ ├── Validable.kt │ │ │ ├── encrypted │ │ │ │ ├── CipherAlgorithm.kt │ │ │ │ ├── EncCredential.kt │ │ │ │ ├── EncLabel.kt │ │ │ │ ├── EncNamed.kt │ │ │ │ ├── EncUsernameTemplate.kt │ │ │ │ ├── EncWebExtension.kt │ │ │ │ ├── Encrypted.kt │ │ │ │ └── EncryptedType.kt │ │ │ ├── export │ │ │ │ ├── DecryptedExportableCredential.kt │ │ │ │ ├── EncExportableCredential.kt │ │ │ │ ├── ExportContainer.kt │ │ │ │ └── PlainShareableCredential.kt │ │ │ ├── kdf │ │ │ │ ├── KdfConfig.kt │ │ │ │ └── KeyDerivationFunction.kt │ │ │ ├── otp │ │ │ │ └── OtpConfig.kt │ │ │ ├── secret │ │ │ │ ├── Key.kt │ │ │ │ ├── Password.kt │ │ │ │ ├── Secret.kt │ │ │ │ └── SecretKeyHolder.kt │ │ │ └── session │ │ │ │ ├── LoginData.kt │ │ │ │ └── Session.kt │ │ │ ├── provider │ │ │ └── PasteContentProvider.kt │ │ │ ├── service │ │ │ ├── PreferenceService.kt │ │ │ ├── autofill │ │ │ │ ├── AutofillCredentialHolder.kt │ │ │ │ ├── CredentialFillService.kt │ │ │ │ ├── ResponseFiller.kt │ │ │ │ └── SliceCreator.kt │ │ │ ├── biometrix │ │ │ │ ├── BiometricCallback.kt │ │ │ │ ├── BiometricCallbackV28.kt │ │ │ │ ├── BiometricDialogV23.kt │ │ │ │ ├── BiometricManagerV23.kt │ │ │ │ ├── BiometricManagerVX.kt │ │ │ │ └── BiometricUtils.kt │ │ │ ├── io │ │ │ │ ├── AutoBackupService.kt │ │ │ │ ├── CredentialFileRecord.kt │ │ │ │ ├── CsvService.kt │ │ │ │ ├── FileIOService.kt │ │ │ │ ├── KdbxService.kt │ │ │ │ ├── TempFileService.kt │ │ │ │ └── VaultExportService.kt │ │ │ ├── label │ │ │ │ ├── LabelFilter.kt │ │ │ │ ├── LabelService.kt │ │ │ │ └── LabelsHolder.kt │ │ │ ├── net │ │ │ │ ├── CredentialRequestState.kt │ │ │ │ ├── FetchCredentialCommand.kt │ │ │ │ ├── HttpCredentialRequestHandler.kt │ │ │ │ ├── HttpServer.kt │ │ │ │ ├── MultipleCredentialSelectState.kt │ │ │ │ └── RequestFlows.kt │ │ │ ├── nfc │ │ │ │ ├── NdefTag.kt │ │ │ │ └── NfcService.kt │ │ │ ├── notification │ │ │ │ ├── ExpiryAlarmNotificationReceiver.kt │ │ │ │ ├── ExpiryNotificationScheduleBootReceiver.kt │ │ │ │ ├── NotificationService.kt │ │ │ │ └── ReminderService.kt │ │ │ ├── otp │ │ │ │ └── OtpService.kt │ │ │ ├── overlay │ │ │ │ ├── DetachHelper.kt │ │ │ │ └── OverlayShowingService.kt │ │ │ ├── quicksettings │ │ │ │ └── QuickTileService.kt │ │ │ ├── secret │ │ │ │ ├── AndroidKey.kt │ │ │ │ ├── Argon2Service.kt │ │ │ │ ├── KdfParameterService.kt │ │ │ │ ├── MasterKeyService.kt │ │ │ │ ├── MasterPasswordService.kt │ │ │ │ ├── SaltService.kt │ │ │ │ └── SecretService.kt │ │ │ ├── secretgenerator │ │ │ │ ├── GeneratorBase.kt │ │ │ │ ├── GeneratorSpec.kt │ │ │ │ ├── SecretStrength.kt │ │ │ │ ├── passphrase │ │ │ │ │ ├── PassphraseGenerator.kt │ │ │ │ │ └── PassphraseGeneratorSpec.kt │ │ │ │ └── password │ │ │ │ │ ├── PasswordGenerator.kt │ │ │ │ │ └── PasswordGeneratorSpec.kt │ │ │ └── usernametemplate │ │ │ │ └── UsernameTemplateService.kt │ │ │ ├── ui │ │ │ ├── AsyncWithProgressBar.kt │ │ │ ├── BaseActivity.kt │ │ │ ├── BaseFragment.kt │ │ │ ├── ChangeKeyboardForPinManager.kt │ │ │ ├── DropDownList.kt │ │ │ ├── MultiLineRadioGroup.kt │ │ │ ├── NonScrollExpandableListView.kt │ │ │ ├── ProgressCircleAnimation.kt │ │ │ ├── SecureActivity.kt │ │ │ ├── SecureFragment.kt │ │ │ ├── ServerRequestBottomSheet.kt │ │ │ ├── UseCaseBackgroundLauncher.kt │ │ │ ├── ViewRecyclerViewAdapter.kt │ │ │ ├── YapmApp.kt │ │ │ ├── changelogin │ │ │ │ ├── ChangeEncryptionActivity.kt │ │ │ │ ├── ChangeMasterPasswordActivity.kt │ │ │ │ └── ChangePinActivity.kt │ │ │ ├── createvault │ │ │ │ ├── CreateVaultActivity.kt │ │ │ │ ├── CreateVaultEnterPassphraseFragment.kt │ │ │ │ ├── CreateVaultEnterPinFragment.kt │ │ │ │ └── CreateVaultSummarizeFragment.kt │ │ │ ├── credential │ │ │ │ ├── AutofillPushBackActivityBase.kt │ │ │ │ ├── ConfigOtpActivity.kt │ │ │ │ ├── CredentialGrouping.kt │ │ │ │ ├── CredentialSortOrder.kt │ │ │ │ ├── DeobfuscationDialog.kt │ │ │ │ ├── KeepassPasswordDialog.kt │ │ │ │ ├── ListCredentialAdapter.kt │ │ │ │ ├── ListCredentialsActivity.kt │ │ │ │ ├── OtpViewer.kt │ │ │ │ └── ShowCredentialActivity.kt │ │ │ ├── editcredential │ │ │ │ ├── EditCredentialActivity.kt │ │ │ │ ├── EditCredentialDataFragment.kt │ │ │ │ └── EditCredentialPasswordFragment.kt │ │ │ ├── errorhandling │ │ │ │ ├── ErrorActivity.kt │ │ │ │ └── ExceptionHandler.kt │ │ │ ├── exportvault │ │ │ │ ├── ExportPlainCredentialsActivity.kt │ │ │ │ └── ExportVaultActivity.kt │ │ │ ├── importcredentials │ │ │ │ ├── ImportCredentialsActivity.kt │ │ │ │ ├── ImportCredentialsImportFileAdapter.kt │ │ │ │ ├── ImportCredentialsImportFileFragment.kt │ │ │ │ └── ImportCredentialsLoadFileFragment.kt │ │ │ ├── importread │ │ │ │ ├── ImportCredentialActivity.kt │ │ │ │ ├── ReadQrCodeOrNfcActivityBase.kt │ │ │ │ └── VerifyActivity.kt │ │ │ ├── importvault │ │ │ │ ├── ImportVaultActivity.kt │ │ │ │ ├── ImportVaultFileOverrideVaultFragment.kt │ │ │ │ ├── ImportVaultFileOverrideVaultNamedAdapter.kt │ │ │ │ ├── ImportVaultImportFileFragment.kt │ │ │ │ └── ImportVaultLoadFileFragment.kt │ │ │ ├── intro │ │ │ │ ├── Intro2Fragment.kt │ │ │ │ ├── Intro6Fragment.kt │ │ │ │ ├── IntroActivity.kt │ │ │ │ ├── IntroBaseActivity.kt │ │ │ │ ├── LicencesActivity.kt │ │ │ │ ├── WhatsNew2_0Fragment.kt │ │ │ │ └── WhatsNewActivity.kt │ │ │ ├── label │ │ │ │ ├── EditLabelActivity.kt │ │ │ │ ├── Label.kt │ │ │ │ ├── LabelDialogs.kt │ │ │ │ ├── LabelEditViewExtender.kt │ │ │ │ ├── LabelListAdapter.kt │ │ │ │ ├── ListLabelsActivity.kt │ │ │ │ └── ListLabelsAdapter.kt │ │ │ ├── login │ │ │ │ ├── LoginActivity.kt │ │ │ │ ├── LoginEnterMasterPasswordFragment.kt │ │ │ │ └── LoginEnterPinFragment.kt │ │ │ ├── nfc │ │ │ │ ├── NfcActivity.kt │ │ │ │ └── NfcBaseActivity.kt │ │ │ ├── qrcode │ │ │ │ ├── CaptureActivity.kt │ │ │ │ └── QrCodeActivity.kt │ │ │ ├── settings │ │ │ │ └── SettingsActivity.kt │ │ │ ├── usernametemplate │ │ │ │ ├── EditUsernameTemplateActivity.kt │ │ │ │ ├── ListUsernameTemplatesActivity.kt │ │ │ │ ├── ListUsernameTemplatesAdapter.kt │ │ │ │ └── UsernameTemplateDialogs.kt │ │ │ └── webextension │ │ │ │ ├── AddWebExtensionActivity.kt │ │ │ │ ├── EditWebExtensionActivity.kt │ │ │ │ ├── ListWebExtensionsActivity.kt │ │ │ │ ├── ListWebExtensionsAdapter.kt │ │ │ │ ├── WebExtensionDialogs.kt │ │ │ │ └── WebExtensionSortOrder.kt │ │ │ ├── usecase │ │ │ ├── BasicUseCase.kt │ │ │ ├── InputUseCase.kt │ │ │ ├── OutputUseCase.kt │ │ │ ├── UseCase.kt │ │ │ ├── UseCaseOutput.kt │ │ │ ├── app │ │ │ │ ├── ShowDebugLogUseCase.kt │ │ │ │ ├── ShowInfoUseCase.kt │ │ │ │ └── ShowServerLogUseCase.kt │ │ │ ├── credential │ │ │ │ ├── DeleteMultipleCredentialsUseCase.kt │ │ │ │ ├── ExportCredentialUseCase.kt │ │ │ │ ├── ImportCredentialUseCase.kt │ │ │ │ ├── ImportCredentialsUseCase.kt │ │ │ │ └── ShowPasswordStrengthUseCase.kt │ │ │ ├── label │ │ │ │ ├── DeleteLabelUseCase.kt │ │ │ │ └── DeleteUnusedLabelUseCase.kt │ │ │ ├── secret │ │ │ │ ├── ChangeMasterPasswordUseCase.kt │ │ │ │ ├── ChangePinUseCase.kt │ │ │ │ ├── ChangeVaultEncryptionUseCase.kt │ │ │ │ ├── ExportEncMasterKeyUseCase.kt │ │ │ │ ├── ExportEncMasterPasswordUseCase.kt │ │ │ │ ├── GenerateMasterPasswordTokenUseCase.kt │ │ │ │ ├── GenerateMasterPasswordUseCase.kt │ │ │ │ ├── RemoveStoredMasterPasswordUseCase.kt │ │ │ │ ├── RevokeMasterPasswordTokenUseCase.kt │ │ │ │ └── SeedRandomGeneratorUseCase.kt │ │ │ ├── session │ │ │ │ ├── LoginUseCase.kt │ │ │ │ └── LogoutUseCase.kt │ │ │ ├── usernametemplate │ │ │ │ └── DeleteUsernameTemplateUseCase.kt │ │ │ ├── vault │ │ │ │ ├── BenchmarkLoginIterationsUseCase.kt │ │ │ │ ├── CreateVaultUseCase.kt │ │ │ │ ├── DropVaultUseCase.kt │ │ │ │ ├── ExportPlainCredentialsUseCase.kt │ │ │ │ ├── ImportVaultUseCase.kt │ │ │ │ ├── LockVaultUseCase.kt │ │ │ │ ├── ShareVaultUseCase.kt │ │ │ │ └── ShowVaultInfoUseCase.kt │ │ │ └── webextension │ │ │ │ ├── DeleteDisabledWebExtensionsUseCase.kt │ │ │ │ └── DeleteWebExtensionUseCase.kt │ │ │ ├── util │ │ │ ├── ClipboardUtil.kt │ │ │ ├── Constants.kt │ │ │ ├── DebugInfo.kt │ │ │ ├── Extensions.kt │ │ │ ├── FileUtil.kt │ │ │ ├── IpConverter.kt │ │ │ ├── Loop.kt │ │ │ ├── PasswordColorizer.kt │ │ │ ├── PermissionChecker.kt │ │ │ ├── QRCodeUtil.kt │ │ │ ├── SearchCommand.kt │ │ │ └── UiUtils.kt │ │ │ └── viewmodel │ │ │ ├── CredentialViewModel.kt │ │ │ ├── LabelViewModel.kt │ │ │ ├── UsernameTemplateViewModel.kt │ │ │ └── WebExtensionViewModel.kt │ └── res │ │ ├── drawable │ │ ├── baseline_123_24.xml │ │ ├── baseline_abc_24.xml │ │ ├── baseline_accessibility_24.xml │ │ ├── baseline_add_24.xml │ │ ├── baseline_alternate_email_24.xml │ │ ├── baseline_browser_updated_48.xml │ │ ├── baseline_bug_report_24.xml │ │ ├── baseline_clear_24.xml │ │ ├── baseline_favorite_border_24.xml │ │ ├── baseline_lock_clock_24.xml │ │ ├── baseline_phonelink_24.xml │ │ ├── baseline_phonelink_off_24.xml │ │ ├── baseline_phonelink_off_48.xml │ │ ├── baseline_send_to_mobile_24.xml │ │ ├── baseline_star_outline_24.xml │ │ ├── baseline_star_rate_24.xml │ │ ├── ic_add_white_24dp.xml │ │ ├── ic_anotherpass_launcher_foreground.xml │ │ ├── ic_anotherpass_launcher_monochrome.xml │ │ ├── ic_baseline_arrow_back_24_accent.xml │ │ ├── ic_baseline_arrow_back_24_gray.xml │ │ ├── ic_baseline_arrow_back_24_white.xml │ │ ├── ic_baseline_arrow_forward_12.xml │ │ ├── ic_baseline_auto_awesome_24.xml │ │ ├── ic_baseline_bug_report_gray_24.xml │ │ ├── ic_baseline_casino_20.xml │ │ ├── ic_baseline_close_12.xml │ │ ├── ic_baseline_computer_20.xml │ │ ├── ic_baseline_content_copy_24.xml │ │ ├── ic_baseline_content_copy_24_white.xml │ │ ├── ic_baseline_delete_24.xml │ │ ├── ic_baseline_delete_24_white.xml │ │ ├── ic_baseline_dns_20.xml │ │ ├── ic_baseline_download_24.xml │ │ ├── ic_baseline_edit_16.xml │ │ ├── ic_baseline_edit_24.xml │ │ ├── ic_baseline_exit_to_app_24.xml │ │ ├── ic_baseline_expand_less_24.xml │ │ ├── ic_baseline_expand_more_24.xml │ │ ├── ic_baseline_file_copy_24.xml │ │ ├── ic_baseline_filter_list_24.xml │ │ ├── ic_baseline_filter_list_24_white.xml │ │ ├── ic_baseline_filter_list_with_with_dot_24dp.xml │ │ ├── ic_baseline_fingerprint_24.xml │ │ ├── ic_baseline_fitness_center_16.xml │ │ ├── ic_baseline_fitness_center_20.xml │ │ ├── ic_baseline_fitness_center_24.xml │ │ ├── ic_baseline_flashlight_off_24.xml │ │ ├── ic_baseline_flashlight_on_24.xml │ │ ├── ic_baseline_help_outline_24.xml │ │ ├── ic_baseline_help_outline_24_white.xml │ │ ├── ic_baseline_image_24.xml │ │ ├── ic_baseline_import_export_24.xml │ │ ├── ic_baseline_info_24.xml │ │ ├── ic_baseline_label_24.xml │ │ ├── ic_baseline_list_gray_24.xml │ │ ├── ic_baseline_login_24.xml │ │ ├── ic_baseline_memory_24.xml │ │ ├── ic_baseline_more_vert_24.xml │ │ ├── ic_baseline_nfc_24.xml │ │ ├── ic_baseline_nfc_24_white.xml │ │ ├── ic_baseline_nfc_36.xml │ │ ├── ic_baseline_nfc_48.xml │ │ ├── ic_baseline_nfc_64.xml │ │ ├── ic_baseline_north_east_24.xml │ │ ├── ic_baseline_north_east_24_white.xml │ │ ├── ic_baseline_not_interested_gray_24.xml │ │ ├── ic_baseline_pause_gray_24.xml │ │ ├── ic_baseline_person_24.xml │ │ ├── ic_baseline_person_24_gray.xml │ │ ├── ic_baseline_public_24.xml │ │ ├── ic_baseline_qr_code_24.xml │ │ ├── ic_baseline_qr_code_24_red.xml │ │ ├── ic_baseline_qr_code_24_white.xml │ │ ├── ic_baseline_qr_code_36_red.xml │ │ ├── ic_baseline_qr_code_48_red.xml │ │ ├── ic_baseline_qr_code_68_gray.xml │ │ ├── ic_baseline_qr_code_scanner_24.xml │ │ ├── ic_baseline_qr_code_scanner_36.xml │ │ ├── ic_baseline_qr_code_scanner_48.xml │ │ ├── ic_baseline_replay_24.xml │ │ ├── ic_baseline_save_24_white.xml │ │ ├── ic_baseline_save_alt_24_white.xml │ │ ├── ic_baseline_share_24.xml │ │ ├── ic_baseline_share_24_white.xml │ │ ├── ic_baseline_sort_24.xml │ │ ├── ic_baseline_sort_24_white.xml │ │ ├── ic_baseline_vpn_key_24.xml │ │ ├── ic_baseline_vpn_key_24_gray.xml │ │ ├── ic_baseline_vpn_key_24_white.xml │ │ ├── ic_content_copy_black_48dp.xml │ │ ├── ic_keywithqrcode_normal.xml │ │ ├── ic_lock_open_gray_24dp.xml │ │ ├── ic_lock_open_white_24dp.xml │ │ ├── ic_lock_outline_gray_24dp.xml │ │ ├── ic_lock_outline_white_24dp.xml │ │ ├── ic_outline_file_copy_24.xml │ │ ├── ic_search_white_24dp.xml │ │ ├── ic_security_black_24dp.xml │ │ ├── ic_settings_black_24dp.xml │ │ ├── ic_twotone_cloud_off_24.xml │ │ ├── ic_twotone_copy_attent_black_48dp.xml │ │ ├── ic_twotone_edit_24.xml │ │ ├── ic_twotone_fingerprint_24.xml │ │ ├── ic_twotone_lock_24.xml │ │ ├── ic_twotone_memory_24.xml │ │ ├── ic_twotone_nfc_24.xml │ │ ├── ic_twotone_psychology_24.xml │ │ ├── ic_twotone_qr_code_24.xml │ │ ├── otp_24.xml │ │ ├── otp_24_white.xml │ │ ├── outline_check_circle_24.xml │ │ ├── outline_circle_24.xml │ │ ├── outline_dns_24.xml │ │ ├── outline_group_by_24.xml │ │ ├── outline_list_24.xml │ │ ├── outline_notifications_active_last_24.xml │ │ ├── outline_notifications_active_next_24.xml │ │ ├── outline_notifications_none_24.xml │ │ ├── outline_sync_24.xml │ │ ├── password_24.xml │ │ ├── round_fiber_new_24.xml │ │ ├── swap_vert_24.xml │ │ ├── twotone_devices_48.xml │ │ ├── twotone_screen_lock_portrait_48.xml │ │ └── variable_remove_24.xml │ │ ├── font │ │ └── robotomono_bold.ttf │ │ ├── layout │ │ ├── activity_add_web_extension.xml │ │ ├── activity_change_encryption.xml │ │ ├── activity_change_master_password.xml │ │ ├── activity_change_pin.xml │ │ ├── activity_config_otp.xml │ │ ├── activity_create_or_import_vault.xml │ │ ├── activity_create_vault.xml │ │ ├── activity_edit_credential.xml │ │ ├── activity_edit_label.xml │ │ ├── activity_edit_username_template.xml │ │ ├── activity_edit_web_extension.xml │ │ ├── activity_error.xml │ │ ├── activity_export_plain_credentials.xml │ │ ├── activity_export_vault.xml │ │ ├── activity_import_credential.xml │ │ ├── activity_import_credentials.xml │ │ ├── activity_import_vault.xml │ │ ├── activity_licences.xml │ │ ├── activity_list_credentials.xml │ │ ├── activity_list_labels.xml │ │ ├── activity_list_username_templates.xml │ │ ├── activity_list_web_extensions.xml │ │ ├── activity_login.xml │ │ ├── activity_nfc.xml │ │ ├── activity_qr_code.xml │ │ ├── activity_show_credential.xml │ │ ├── activity_verify.xml │ │ ├── change_login_iterations_slider.xml │ │ ├── content_autofill_user_password_view.xml │ │ ├── content_autofill_view.xml │ │ ├── content_create_vault.xml │ │ ├── content_dynamic_labels_list.xml │ │ ├── content_edit_credential.xml │ │ ├── content_import_credentials.xml │ │ ├── content_import_vault.xml │ │ ├── content_list_credentials.xml │ │ ├── content_login.xml │ │ ├── content_search_suggestion.xml │ │ ├── content_server_addresses.xml │ │ ├── expandable_group_item.xml │ │ ├── expandable_list_item.xml │ │ ├── fragment_create_vault_enter_passphrase.xml │ │ ├── fragment_create_vault_enter_pin.xml │ │ ├── fragment_create_vault_summarize.xml │ │ ├── fragment_edit_credential_data.xml │ │ ├── fragment_edit_credential_password.xml │ │ ├── fragment_import_credentials.xml │ │ ├── fragment_import_vault_file.xml │ │ ├── fragment_import_vault_file_override_vault.xml │ │ ├── fragment_intro_1.xml │ │ ├── fragment_intro_2.xml │ │ ├── fragment_intro_3.xml │ │ ├── fragment_intro_4.xml │ │ ├── fragment_intro_5.xml │ │ ├── fragment_intro_6.xml │ │ ├── fragment_load_credentials_file.xml │ │ ├── fragment_load_vault_file.xml │ │ ├── fragment_login_enter_masterpassword.xml │ │ ├── fragment_login_enter_pin.xml │ │ ├── fragment_whats_new_in_1_7.xml │ │ ├── fragment_whats_new_in_1_8.xml │ │ ├── fragment_whats_new_in_1_9.xml │ │ ├── fragment_whats_new_in_2_0.xml │ │ ├── fragment_whats_new_in_2_1.xml │ │ ├── fragment_whats_new_in_2_2.xml │ │ ├── nav_header_main.xml │ │ ├── number_picker_dialog.xml │ │ ├── qrcode_capture.xml │ │ ├── recyclerview_credential.xml │ │ ├── recyclerview_label.xml │ │ ├── recyclerview_username_template.xml │ │ ├── recyclerview_web_extension.xml │ │ ├── server_bottom_sheet.xml │ │ ├── settings_activity.xml │ │ ├── view_biometrix_bottom_sheet.xml │ │ └── view_label_edit.xml │ │ ├── menu │ │ ├── menu_configure_otp.xml │ │ ├── menu_create_or_import_vault.xml │ │ ├── menu_credential_detail.xml │ │ ├── menu_credential_detail_import.xml │ │ ├── menu_credential_detail_raw.xml │ │ ├── menu_credential_edit.xml │ │ ├── menu_credential_list.xml │ │ ├── menu_label_edit.xml │ │ ├── menu_label_list.xml │ │ ├── menu_login.xml │ │ ├── menu_main.xml │ │ ├── menu_main_drawer.xml │ │ ├── menu_qrcode.xml │ │ ├── menu_server_link.xml │ │ ├── menu_server_settings.xml │ │ ├── menu_username_template_edit.xml │ │ ├── menu_web_extension_edit.xml │ │ └── menu_web_extension_list.xml │ │ ├── mipmap-anydpi-v26 │ │ └── ic_launcher.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_logo.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_logo.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_logo.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_logo.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ └── ic_logo.png │ │ ├── navigation │ │ ├── nav_create_vault.xml │ │ ├── nav_edit_credential.xml │ │ ├── nav_import_credentials.xml │ │ ├── nav_import_vault.xml │ │ └── nav_login.xml │ │ ├── values-de │ │ └── strings.xml │ │ ├── values-night │ │ └── booleans.xml │ │ ├── values-nl │ │ └── strings.xml │ │ ├── values-v26 │ │ └── styles.xml │ │ ├── values │ │ ├── arrays.xml │ │ ├── booleans.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ic_anotherpass_launcher_background.xml │ │ ├── integers.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ └── themes.xml │ │ ├── xml-v30 │ │ └── credential_autofiller.xml │ │ └── xml │ │ ├── autofill_preferences.xml │ │ ├── clipboard_preferences.xml │ │ ├── credential_autofiller.xml │ │ ├── data_extraction_rules.xml │ │ ├── filepaths.xml │ │ ├── general_preferences.xml │ │ ├── header_preferences.xml │ │ ├── login_preferences.xml │ │ ├── overlay_preferences.xml │ │ ├── password_generator_preferences.xml │ │ ├── reminder_preferences.xml │ │ ├── security_preferences.xml │ │ └── server_preferences.xml │ └── test │ └── java │ └── de │ └── jepfa │ └── yapm │ ├── model │ └── secret │ │ └── PasswordTest.kt │ ├── service │ └── secretgenerator │ │ ├── passphrase │ │ └── PassphraseGeneratorTest.kt │ │ └── password │ │ └── PasswordGeneratorTest.kt │ └── util │ ├── IpConverterTest.kt │ └── LoopTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── metadata ├── de-DE │ ├── full_description.txt │ └── short_description.txt └── en-US │ ├── changelogs │ ├── 105003.txt │ ├── 105004.txt │ ├── 106000.txt │ ├── 106001.txt │ ├── 106002.txt │ ├── 107000.txt │ ├── 107001.txt │ ├── 107002.txt │ ├── 107003.txt │ ├── 108000.txt │ ├── 108001.txt │ ├── 108002.txt │ ├── 109000.txt │ ├── 109001.txt │ ├── 109002.txt │ ├── 109003.txt │ ├── 109004.txt │ ├── 109005.txt │ ├── 200000.txt │ ├── 200001.txt │ ├── 200002.txt │ ├── 200003.txt │ ├── 200004.txt │ ├── 201000.txt │ ├── 201001.txt │ ├── 202000.txt │ ├── 202001.txt │ └── 202002.txt │ ├── full_description.txt │ ├── images │ ├── featureGraphic.png │ ├── icon.png │ └── phoneScreenshots │ │ ├── 0a.png │ │ ├── 0b.png │ │ ├── 0c.png │ │ ├── 0d.png │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ ├── 9.png │ │ ├── A.png │ │ ├── B.png │ │ ├── C.png │ │ ├── D.png │ │ └── E.png │ ├── short_description.txt │ └── title.txt └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | .cxx 10 | local.properties 11 | app/release 12 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | all >= 1.8.0 | :white_check_mark: | 11 | 12 | 13 | ## Reporting a Vulnerability 14 | 15 | None known. -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/release/output-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "artifactType": { 4 | "type": "APK", 5 | "kind": "Directory" 6 | }, 7 | "applicationId": "de.jepfa.yapm", 8 | "variantName": "release", 9 | "elements": [ 10 | { 11 | "type": "SINGLE", 12 | "filters": [], 13 | "attributes": [], 14 | "versionCode": 202002, 15 | "versionName": "2.2.2", 16 | "outputFile": "app-release.apk" 17 | } 18 | ], 19 | "elementType": "File", 20 | "baselineProfiles": [ 21 | { 22 | "minApi": 28, 23 | "maxApi": 30, 24 | "baselineProfiles": [ 25 | "baselineProfiles/1/app-release.dm" 26 | ] 27 | }, 28 | { 29 | "minApi": 31, 30 | "maxApi": 2147483647, 31 | "baselineProfiles": [ 32 | "baselineProfiles/0/app-release.dm" 33 | ] 34 | } 35 | ], 36 | "minSdkVersionForDexing": 24 37 | } -------------------------------------------------------------------------------- /app/src/main/ic_anotherpass_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/ic_anotherpass_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/database/dao/EncCredentialDao.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.database.dao 2 | 3 | import androidx.room.* 4 | import de.jepfa.yapm.database.entity.EncCredentialEntity 5 | import kotlinx.coroutines.flow.Flow 6 | 7 | @Dao 8 | interface EncCredentialDao { 9 | @Insert 10 | suspend fun insert(encCredential: EncCredentialEntity) 11 | 12 | @Update 13 | suspend fun update(encCredential: EncCredentialEntity) 14 | 15 | @Delete 16 | suspend fun delete(encCredential: EncCredentialEntity) 17 | 18 | @Query("SELECT * FROM EncCredentialEntity WHERE id = :id") 19 | fun getById(id: Int): Flow 20 | 21 | @Query("SELECT * FROM EncCredentialEntity WHERE uid = :uid") 22 | fun getByUid(uid: String): Flow 23 | 24 | @Query("SELECT * FROM EncCredentialEntity WHERE uid IN (:uids)") 25 | fun getByUidsSync(uids: List): List 26 | 27 | @Query("SELECT * FROM EncCredentialEntity WHERE id = :id") 28 | suspend fun getByIdSync(id: Int): EncCredentialEntity? 29 | 30 | @Query("SELECT * FROM EncCredentialEntity") 31 | fun getAll(): Flow> 32 | 33 | @Query("SELECT * FROM EncCredentialEntity ORDER BY id") 34 | fun getAllSync(): List 35 | 36 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/database/dao/EncLabelDao.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.database.dao 2 | 3 | import androidx.room.* 4 | import de.jepfa.yapm.database.entity.EncLabelEntity 5 | import kotlinx.coroutines.flow.Flow 6 | 7 | @Dao 8 | interface EncLabelDao { 9 | @Insert 10 | suspend fun insert(encLabel: EncLabelEntity): Long 11 | 12 | @Update 13 | suspend fun update(encLabel: EncLabelEntity) 14 | 15 | @Delete 16 | suspend fun delete(encLabel: EncLabelEntity) 17 | 18 | @Query("DELETE FROM EncLabelEntity WHERE id = :id") 19 | suspend fun deleteById(id: Int) 20 | 21 | @Query("DELETE FROM EncLabelEntity WHERE id IN (:ids)") 22 | suspend fun deleteByIds(ids: List) 23 | 24 | @Query("SELECT * FROM EncLabelEntity WHERE id = :id") 25 | fun getById(id: Int): Flow 26 | 27 | @Query("SELECT * FROM EncLabelEntity WHERE id = :id") 28 | suspend fun getByIdSync(id: Int): EncLabelEntity? 29 | 30 | @Query("SELECT * FROM EncLabelEntity WHERE name = :encName") 31 | fun getByEncName(encName: String): Flow 32 | 33 | @Query("SELECT * FROM EncLabelEntity") 34 | fun getAll(): Flow> 35 | 36 | @Query("SELECT * FROM EncLabelEntity ORDER BY id") 37 | fun getAllSync(): List 38 | 39 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/database/dao/EncUsernameTemplateDao.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.database.dao 2 | 3 | import androidx.room.* 4 | import de.jepfa.yapm.database.entity.EncUsernameTemplateEntity 5 | import kotlinx.coroutines.flow.Flow 6 | 7 | @Dao 8 | interface EncUsernameTemplateDao { 9 | @Insert 10 | suspend fun insert(encUsernameTemplateEntity: EncUsernameTemplateEntity) 11 | 12 | @Update 13 | suspend fun update(encUsernameTemplateEntity: EncUsernameTemplateEntity) 14 | 15 | @Delete 16 | suspend fun delete(encUsernameTemplateEntity: EncUsernameTemplateEntity) 17 | 18 | @Query("DELETE FROM EncUsernameTemplateEntity WHERE id = :id") 19 | suspend fun deleteById(id: Int) 20 | 21 | @Query("SELECT * FROM EncUsernameTemplateEntity WHERE id = :id") 22 | fun getById(id: Int): Flow 23 | 24 | @Query("SELECT * FROM EncUsernameTemplateEntity WHERE id = :id") 25 | suspend fun getByIdSync(id: Int): EncUsernameTemplateEntity? 26 | 27 | @Query("SELECT * FROM EncUsernameTemplateEntity") 28 | fun getAll(): Flow> 29 | 30 | @Query("SELECT * FROM EncUsernameTemplateEntity ORDER BY id") 31 | fun getAllSync(): List 32 | 33 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/database/dao/EncWebExtensionDao.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.database.dao 2 | 3 | import androidx.room.* 4 | import de.jepfa.yapm.database.entity.EncWebExtensionEntity 5 | import kotlinx.coroutines.flow.Flow 6 | 7 | @Dao 8 | interface EncWebExtensionDao { 9 | @Insert 10 | suspend fun insert(encWebExtensionEntity: EncWebExtensionEntity) 11 | 12 | @Update 13 | suspend fun update(encWebExtensionEntity: EncWebExtensionEntity) 14 | 15 | @Delete 16 | suspend fun delete(encWebExtensionEntity: EncWebExtensionEntity) 17 | 18 | @Query("DELETE FROM EncWebExtensionEntity WHERE id = :id") 19 | suspend fun deleteById(id: Int) 20 | 21 | @Query("SELECT * FROM EncWebExtensionEntity WHERE id = :id") 22 | fun getById(id: Int): Flow 23 | 24 | @Query("SELECT * FROM EncWebExtensionEntity") 25 | fun getAll(): Flow> 26 | 27 | @Query("SELECT * FROM EncWebExtensionEntity") 28 | fun getAllSync(): List 29 | 30 | 31 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/database/entity/EncLabelEntity.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.database.entity 2 | 3 | import androidx.room.Entity 4 | import androidx.room.Index 5 | import androidx.room.PrimaryKey 6 | import de.jepfa.yapm.model.encrypted.Encrypted 7 | import java.util.* 8 | 9 | /** 10 | * Encrypted labels for Credential 11 | */ 12 | @Entity(indices = arrayOf(Index("uid", unique = true))) 13 | data class EncLabelEntity( 14 | @PrimaryKey(autoGenerate = true) val id: Int?, 15 | val uid: String?, 16 | var name: String, 17 | var description: String, 18 | var color: Int? 19 | ) { 20 | 21 | constructor(id: Int?, uid: UUID?, name: Encrypted, description: Encrypted, color: Int?) 22 | : this(id, uid?.let { it.toString() }, name.toBase64String(), description.toBase64String(), color) 23 | 24 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/database/entity/EncUsernameTemplateEntity.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.database.entity 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | import de.jepfa.yapm.model.encrypted.Encrypted 6 | 7 | /** 8 | * Encrypted templates for usernames 9 | */ 10 | @Entity 11 | data class EncUsernameTemplateEntity( 12 | @PrimaryKey(autoGenerate = true) val id: Int?, 13 | var username: String, 14 | var description: String, 15 | var generatorType: String 16 | ) { 17 | 18 | constructor(id: Int?, username: Encrypted, description: Encrypted, generatorType: Encrypted) 19 | : this(id, username.toBase64String(), description.toBase64String(), generatorType.toBase64String()) 20 | 21 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/database/entity/EncWebExtensionEntity.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.database.entity 2 | 3 | import androidx.room.Entity 4 | import androidx.room.Index 5 | import androidx.room.PrimaryKey 6 | import de.jepfa.yapm.model.encrypted.Encrypted 7 | 8 | /** 9 | * Encrypted linked web extensions 10 | */ 11 | @Entity 12 | data class EncWebExtensionEntity( 13 | @PrimaryKey(autoGenerate = true) val id: Int?, 14 | var webClientId: String, 15 | var title: String, 16 | var extensionPublicKey: String, 17 | var sharedBaseKey: String, 18 | var linked: Boolean, 19 | var enabled: Boolean, 20 | var bypassIncomingRequests: Boolean, 21 | var lastUsedTimestamp: Long? 22 | ) { 23 | 24 | constructor( 25 | id: Int?, 26 | webClientId: Encrypted, 27 | title: Encrypted, 28 | extensionPublicKey: Encrypted, 29 | sharedBaseKey: Encrypted, 30 | linked: Boolean, 31 | enabled: Boolean, 32 | bypassIncomingRequests: Boolean, 33 | lastUsedTimestamp: Long? 34 | ) : this( 35 | id, 36 | webClientId.toBase64String(), 37 | title.toBase64String(), 38 | extensionPublicKey.toBase64String(), 39 | sharedBaseKey.toBase64String(), 40 | linked, 41 | enabled, 42 | bypassIncomingRequests, 43 | lastUsedTimestamp 44 | ) 45 | 46 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/model/Clearable.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.model 2 | 3 | interface Clearable { 4 | fun clear() 5 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/model/Validable.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.model 2 | 3 | interface Validable { 4 | 5 | fun isValid(): Boolean 6 | 7 | companion object { 8 | const val FAILED_STRING = "<>" 9 | val FAILED_BYTE_ARRAY = FAILED_STRING.toByteArray() 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/model/encrypted/EncNamed.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.model.encrypted 2 | 3 | interface EncNamed { 4 | val name: Encrypted 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/model/kdf/KeyDerivationFunction.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.model.kdf 2 | 3 | import com.lambdapioneer.argon2kt.Argon2Mode 4 | import de.jepfa.yapm.R 5 | 6 | val DEFAULT_KDF = KeyDerivationFunction.BUILT_IN_PBKDF 7 | val PREFERRED_KDF = KeyDerivationFunction.ARGON2_ID 8 | 9 | enum class KeyDerivationFunction( 10 | val id: String, 11 | val uiLabel: Int, 12 | val description: Int, 13 | val argon2Mode: Argon2Mode? 14 | ) { 15 | 16 | BUILT_IN_PBKDF("p", R.string.KDF_PBKDF, R.string.KDF_PBKDF_desc, null), 17 | ARGON2_ID("a", R.string.KDF_ARGON2_ID, R.string.KDF_ARGON2_ID_desc, Argon2Mode.ARGON2_ID), 18 | ARGON2_I("i", R.string.KDF_ARGON2_I, R.string.KDF_ARGON2_I_desc, Argon2Mode.ARGON2_I), 19 | ARGON2_D("d", R.string.KDF_ARGON2_D, R.string.KDF_ARGON2_D_desc, Argon2Mode.ARGON2_D), 20 | ; 21 | 22 | fun isArgon2() = argon2Mode != null 23 | 24 | companion object { 25 | fun getById(id: String): KeyDerivationFunction { 26 | if (id.isEmpty()) return BUILT_IN_PBKDF 27 | return entries.first { it.id == id } 28 | } 29 | 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/model/secret/Key.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.model.secret 2 | 3 | import android.util.Base64 4 | import de.jepfa.yapm.model.encrypted.Encrypted 5 | 6 | /** 7 | * Represents a key which is secret to others. 8 | */ 9 | class Key : Secret { 10 | 11 | constructor(data: ByteArray): super(data) 12 | 13 | fun debugToString(): String { 14 | return data.contentToString() 15 | } 16 | 17 | fun toBase64String(): String { 18 | return Base64.encodeToString(this.data, 0) 19 | } 20 | 21 | fun toShortenedFingerprint(): String { 22 | val f = toBase64String() 23 | .replace(Regex("[^a-z]", RegexOption.IGNORE_CASE), "") 24 | .substring(0, 7) 25 | .uppercase() 26 | 27 | return f.substring(0, 2) + "-" + f.substring(2, 5) + "-" + f.substring(5, 7) 28 | } 29 | 30 | companion object { 31 | fun empty(): Key { 32 | return Key(ByteArray(0)) 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/model/secret/Secret.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.model.secret 2 | 3 | import de.jepfa.yapm.model.Clearable 4 | import de.jepfa.yapm.model.Validable 5 | import java.util.* 6 | 7 | open class Secret(var data: ByteArray) : Clearable, Validable { 8 | 9 | fun isEmpty() : Boolean { 10 | return data.isEmpty() 11 | } 12 | 13 | fun isEqual(other: Secret): Boolean { 14 | return Arrays.equals(data, other.data) 15 | } 16 | 17 | override fun isValid(): Boolean { 18 | return !Arrays.equals(toByteArray(), Validable.FAILED_BYTE_ARRAY) 19 | } 20 | 21 | fun add(other: Secret) { 22 | val buffer = data + other.data 23 | clear() 24 | other.clear() 25 | data = buffer 26 | } 27 | 28 | fun toByteArray(): ByteArray { 29 | return data 30 | } 31 | 32 | override fun clear() { 33 | data.fill(0, 0, data.size) 34 | data = ByteArray(0) 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/model/secret/SecretKeyHolder.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.model.secret 2 | 3 | import android.content.Context 4 | import android.os.Build 5 | import android.util.Log 6 | import de.jepfa.yapm.model.encrypted.CipherAlgorithm 7 | import de.jepfa.yapm.service.secret.AndroidKey 8 | import de.jepfa.yapm.util.Constants.LOG_PREFIX 9 | import javax.crypto.SecretKey 10 | 11 | data class SecretKeyHolder( 12 | val secretKey: SecretKey, 13 | val cipherAlgorithm: CipherAlgorithm, 14 | val androidKey: AndroidKey?, 15 | val context: Context, 16 | ) { 17 | fun destroy() { 18 | try { 19 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 20 | secretKey.destroy() 21 | } 22 | } catch (e: Exception) { 23 | Log.w(LOG_PREFIX + "SESSION", "cannot destroy mSK") 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/model/session/LoginData.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.model.session 2 | 3 | import de.jepfa.yapm.model.Clearable 4 | import de.jepfa.yapm.model.secret.Password 5 | 6 | data class LoginData (val pin: Password, val masterPassword: Password) : Clearable { 7 | override fun clear() { 8 | pin.clear() 9 | masterPassword.clear() 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/autofill/AutofillCredentialHolder.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.autofill 2 | 3 | import de.jepfa.yapm.model.encrypted.EncCredential 4 | import de.jepfa.yapm.model.secret.Key 5 | 6 | object AutofillCredentialHolder { 7 | 8 | var currentCredential : EncCredential? = null 9 | private set 10 | var obfuscationKey: Key? = null 11 | private set 12 | 13 | 14 | 15 | fun update(credential: EncCredential, obfuscationKey: Key?) { 16 | clear() 17 | this.currentCredential = credential 18 | this.obfuscationKey = obfuscationKey 19 | } 20 | 21 | fun clear() { 22 | currentCredential = null 23 | obfuscationKey?.clear() 24 | obfuscationKey = null 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/autofill/CredentialFillService.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.autofill 2 | 3 | import android.os.Build 4 | import android.os.CancellationSignal 5 | import android.service.autofill.* 6 | import androidx.annotation.RequiresApi 7 | 8 | 9 | @RequiresApi(Build.VERSION_CODES.O) 10 | class CredentialFillService: AutofillService() { 11 | 12 | 13 | @RequiresApi(Build.VERSION_CODES.O) 14 | override fun onFillRequest( 15 | fillRequest: FillRequest, 16 | cancellationSignal: CancellationSignal, 17 | fillCallback: FillCallback 18 | ) { 19 | if (cancellationSignal.isCanceled) { 20 | fillCallback.onSuccess(null) 21 | return 22 | } 23 | 24 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { 25 | ResponseFiller.updateInlinePresentationRequest(fillRequest.inlineSuggestionsRequest) 26 | } 27 | 28 | val contexts = fillRequest.fillContexts 29 | val structure = contexts.get(contexts.size - 1).structure 30 | val fillResponse = ResponseFiller.createFillResponse( 31 | structure, 32 | allowCreateAuthentication = true, context = applicationContext) 33 | 34 | fillCallback.onSuccess(fillResponse) 35 | 36 | } 37 | 38 | override fun onSaveRequest(saveRequest: SaveRequest, saveCallback: SaveCallback) { 39 | } 40 | 41 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/biometrix/BiometricCallback.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.biometrix 2 | 3 | import javax.crypto.Cipher 4 | 5 | /* 6 | Taken and modified from https://github.com/FSecureLABS/android-keystore-audit/tree/master/keystorecrypto-app 7 | */ 8 | interface BiometricCallback { 9 | fun onAuthenticationCancelled() 10 | fun onAuthenticationSuccessful(result: Cipher?) 11 | fun onAuthenticationError(errString: CharSequence?) 12 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/biometrix/BiometricCallbackV28.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.biometrix 2 | 3 | import android.hardware.biometrics.BiometricPrompt 4 | import android.os.Build 5 | import androidx.annotation.RequiresApi 6 | 7 | /* 8 | Taken and modified from https://github.com/FSecureLABS/android-keystore-audit/tree/master/keystorecrypto-app 9 | */ 10 | @RequiresApi(api = Build.VERSION_CODES.P) 11 | class BiometricCallbackV28(private val biometricCallback: BiometricCallback) : 12 | BiometricPrompt.AuthenticationCallback() { 13 | 14 | override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { 15 | super.onAuthenticationSucceeded(result) 16 | biometricCallback.onAuthenticationSuccessful(result.cryptoObject.cipher) 17 | } 18 | 19 | 20 | override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) { 21 | super.onAuthenticationError(errorCode, errString) 22 | biometricCallback.onAuthenticationError(errString) 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/io/CredentialFileRecord.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.io 2 | 3 | import java.util.Date 4 | import java.util.UUID 5 | 6 | data class CredentialFileRecord( 7 | val uuid: UUID?, 8 | val id: Int, 9 | val name: String, 10 | val url: String?, 11 | val userName: String?, 12 | val plainPassword: String, 13 | val description: String, 14 | val expiresAt: Date?, 15 | val modifiedAt: Date?, 16 | val labels: List, 17 | val otpAuth: String?, 18 | ) { 19 | constructor( 20 | id: Int, 21 | name: String, 22 | url: String?, 23 | userName: String?, 24 | plainPassword: String, 25 | description: String, 26 | expiresOn: Date?, 27 | otpAuth: String? 28 | ) 29 | : this(null, id, name, url, userName, plainPassword, description, expiresOn, null, emptyList(), otpAuth) 30 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/label/LabelService.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.label 2 | 3 | import android.content.Context 4 | import de.jepfa.yapm.R 5 | import de.jepfa.yapm.model.encrypted.EncLabel 6 | import de.jepfa.yapm.model.secret.SecretKeyHolder 7 | import de.jepfa.yapm.service.secret.SecretService 8 | import de.jepfa.yapm.ui.label.Label 9 | import kotlin.random.Random 10 | 11 | object LabelService { 12 | 13 | val defaultHolder = LabelsHolder() 14 | val externalHolder = LabelsHolder() 15 | 16 | fun getLabelFromEncLabel(key: SecretKeyHolder, encLabel: EncLabel): Label { 17 | val name = SecretService.decryptCommonString(key, encLabel.name) 18 | val desc = SecretService.decryptCommonString(key, encLabel.description) 19 | return Label(encLabel.id, name, desc, encLabel.color) 20 | } 21 | 22 | fun getEncLabelFromLabel(key: SecretKeyHolder, label: Label): EncLabel { 23 | val name = SecretService.encryptCommonString(key, label.name) 24 | val desc = SecretService.encryptCommonString(key, label.description) 25 | return EncLabel(label.labelId, null, name, desc, label.colorRGB) 26 | } 27 | 28 | 29 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/net/CredentialRequestState.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.net 2 | 3 | /** 4 | * None -> Incoming -> AwaitingAcceptance -> Accepted -> Fulfilled 5 | * -> Denied 6 | */ 7 | enum class CredentialRequestState(val isProgressing: Boolean) { 8 | /** 9 | * No incoming request, ready to take one 10 | */ 11 | None(false), 12 | /** 13 | * Incoming request, confirmation dialog will be displayed to the user (if configured) 14 | */ 15 | Incoming(true), 16 | /** 17 | * Incoming request awaits confirmation from ddsplayed dialog 18 | */ 19 | AwaitingAcceptance(true), 20 | /** 21 | * Incoming request accepted by the user or automatically (if configured) 22 | */ 23 | Accepted(true), 24 | /** 25 | * Incoming request fulfilled by delivering requested data back 26 | */ 27 | Fulfilled(false), 28 | /** 29 | * Incoming request declined and aborted 30 | */ 31 | Denied(false); 32 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/net/FetchCredentialCommand.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.net 2 | 3 | //TODO rename to RequestCredentialCommand 4 | enum class FetchCredentialCommand(val command: String) { 5 | CREATE_CREDENTIAL_FOR_URL("create_credential_for_url"), 6 | FETCH_CREDENTIAL_FOR_URL("fetch_credential_for_url"), 7 | FETCH_CREDENTIAL_FOR_UID("fetch_credential_for_uid"), 8 | FETCH_CREDENTIALS_FOR_UIDS("fetch_credentials_for_uids"), 9 | FETCH_SINGLE_CREDENTIAL("fetch_single_credential"), 10 | FETCH_MULTIPLE_CREDENTIALS("fetch_multiple_credentials"), 11 | FETCH_ALL_CREDENTIALS("fetch_all_credentials"), 12 | FETCH_CLIENT_KEY("get_client_key"), 13 | CANCEL_REQUEST("cancel_request"), 14 | DOWNLOAD_VAULT_BACKUP("download_vault_backup"), 15 | ; 16 | 17 | companion object { 18 | fun getByCommand(command: String): FetchCredentialCommand { 19 | return values().first { it.command == command } 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/net/MultipleCredentialSelectState.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.net 2 | 3 | enum class MultipleCredentialSelectState { 4 | NONE, USER_SELECTING, USER_COMMITTED 5 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/net/RequestFlows.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.net 2 | 3 | import android.view.View 4 | import de.jepfa.yapm.model.encrypted.EncCredential 5 | import de.jepfa.yapm.ui.SecureActivity 6 | 7 | 8 | interface RequestFlows { 9 | 10 | fun getLifeCycleActivity(): SecureActivity 11 | fun getRootView(): View 12 | 13 | fun startCredentialCreation( 14 | name: String, 15 | domain: String, 16 | user: String, 17 | webExtensionId: Int, 18 | shortenedFingerprint: String, 19 | ) 20 | fun startCredentialUiSearchFor(domain: String) 21 | fun startCredentialSelectionMode() 22 | fun getSelectedCredentials(): Set 23 | 24 | fun resetUi() 25 | 26 | fun notifyRequestStateUpdated(oldState: CredentialRequestState, newState: CredentialRequestState) {} 27 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/quicksettings/QuickTileService.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.quicksettings 2 | 3 | import android.annotation.SuppressLint 4 | import android.app.PendingIntent 5 | import android.os.Build 6 | import android.service.quicksettings.TileService 7 | import de.jepfa.yapm.BuildConfig.APPLICATION_ID 8 | 9 | 10 | class QuickTileService: TileService() { 11 | 12 | @SuppressLint("StartActivityAndCollapseDeprecated") 13 | override fun onClick() { 14 | val launchIntent = packageManager.getLaunchIntentForPackage(APPLICATION_ID) 15 | if (launchIntent != null) { 16 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { 17 | val pendingIntent = PendingIntent.getActivity( 18 | this, 19 | 1001, 20 | launchIntent, 21 | PendingIntent.FLAG_IMMUTABLE 22 | ) 23 | startActivityAndCollapse(pendingIntent) 24 | } 25 | else { 26 | startActivityAndCollapse(launchIntent) 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/secret/AndroidKey.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.secret 2 | 3 | enum class AndroidKey(val alias: String, val boxed: Boolean, val requireUserAuth: Boolean = false) { 4 | 5 | ALIAS_KEY_TRANSPORT("YAPM/keyAlias:TRANSPORT", boxed = false), 6 | ALIAS_KEY_SALT("YAPM/keyAlias:SALT", boxed = true), 7 | ALIAS_KEY_MK("YAPM/keyAlias:MK", boxed = true), 8 | ALIAS_KEY_MP("YAPM/keyAlias:MP", boxed = true), 9 | ALIAS_KEY_MP_WITH_AUTH("YAPM/keyAlias:MP_WA", boxed = true, requireUserAuth = true), 10 | ALIAS_KEY_MP_TOKEN("YAPM/keyAlias:MPT", boxed = true) 11 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/secret/Argon2Service.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.secret 2 | 3 | import com.lambdapioneer.argon2kt.Argon2Kt 4 | import com.lambdapioneer.argon2kt.Argon2Mode 5 | import de.jepfa.yapm.model.kdf.KdfConfig 6 | import de.jepfa.yapm.model.secret.Key 7 | import de.jepfa.yapm.model.secret.Password 8 | 9 | 10 | object Argon2Service { 11 | 12 | private const val DEFAULT_ARGON2_PARALLELISM = 4 13 | 14 | private val argon2Kt = Argon2Kt() 15 | 16 | 17 | fun derive(password: Password, salt: Key, kdfConfig: KdfConfig): Key { 18 | 19 | val hashResult = argon2Kt.hash( 20 | mode = kdfConfig.kdf.argon2Mode ?: Argon2Mode.ARGON2_ID, 21 | password = password.toByteArray(), 22 | salt = salt.toByteArray(), 23 | tCostInIterations = kdfConfig.iterations, 24 | mCostInKibibyte = kdfConfig.memCostInMiB!! * 1024, 25 | parallelism = DEFAULT_ARGON2_PARALLELISM 26 | ) 27 | 28 | return Key(hashResult.rawHashAsByteArray()) 29 | } 30 | 31 | 32 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/secretgenerator/GeneratorSpec.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.secretgenerator 2 | 3 | interface GeneratorSpec -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/secretgenerator/SecretStrength.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.secretgenerator 2 | 3 | import de.jepfa.yapm.R 4 | 5 | enum class SecretStrength(val pseudoPhraseLength: Int, val ordinaryPasswordLength: Int, val nameId: Int) { 6 | ONE_WORD(4, 4, -1), 7 | TWO_WORDS(8, 8, -1), 8 | EASY(12, 10, R.string.EASY), 9 | NORMAL(16, 12, R.string.NORMAL), 10 | STRONG(20, 16, R.string.STRONG), 11 | ULTRA(24, 20, R.string.ULTRA), 12 | EXTREME(28, 24, R.string.EXTREME), 13 | HYPER(32, 28, R.string.HYPER), 14 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/secretgenerator/passphrase/PassphraseGeneratorSpec.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.secretgenerator.passphrase 2 | 3 | import de.jepfa.yapm.service.secretgenerator.GeneratorSpec 4 | import de.jepfa.yapm.service.secretgenerator.SecretStrength 5 | 6 | data class PassphraseGeneratorSpec( 7 | val strength: SecretStrength = SecretStrength.NORMAL, 8 | val wordBeginningUpperCase: Boolean = false, 9 | val addDigit: Boolean = false, 10 | val addSpecialChar: Boolean = false, 11 | val useExtendedSpecialChars: Boolean = false, 12 | ): GeneratorSpec -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/service/secretgenerator/password/PasswordGeneratorSpec.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.service.secretgenerator.password 2 | 3 | import de.jepfa.yapm.service.secretgenerator.GeneratorSpec 4 | import de.jepfa.yapm.service.secretgenerator.SecretStrength 5 | 6 | data class PasswordGeneratorSpec( 7 | val strength: SecretStrength = SecretStrength.NORMAL, 8 | val noUpperCase: Boolean = false, 9 | val noSpecialChars: Boolean = false, 10 | val noDigits: Boolean = false, 11 | val useExtendedSpecialChars: Boolean = false, 12 | ) : GeneratorSpec -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/DropDownList.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.appcompat.widget.AppCompatSpinner 6 | 7 | class DropDownList(context: Context, attributeSet: AttributeSet?): AppCompatSpinner(context, attributeSet) { 8 | 9 | override fun setSelection(position: Int, animate: Boolean) { 10 | val sameSelected = position == selectedItemPosition 11 | super.setSelection(position, animate) 12 | if (sameSelected) { 13 | // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now 14 | onItemSelectedListener!!.onItemSelected(this, selectedView, position, selectedItemId) 15 | } 16 | } 17 | 18 | override fun setSelection(position: Int) { 19 | val sameSelected = position == selectedItemPosition 20 | super.setSelection(position) 21 | if (sameSelected) { 22 | // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now 23 | onItemSelectedListener!!.onItemSelected(this, selectedView, position, selectedItemId) 24 | } 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/NonScrollExpandableListView.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.ExpandableListView 6 | 7 | /* 8 | Taken from https://stackoverflow.com/questions/37605545/android-nestedscrollview-which-contains-expandablelistview-doesnt-scroll-when/37605908 9 | */ 10 | class NonScrollExpandableListView : ExpandableListView { 11 | constructor(context: Context?) : super(context) 12 | constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) 13 | constructor(context: Context?, attrs: AttributeSet?, defStyle: Int) : super( 14 | context, 15 | attrs, 16 | defStyle 17 | ) 18 | 19 | public override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { 20 | val heightMeasureSpec = MeasureSpec.makeMeasureSpec( 21 | Int.MAX_VALUE shr 2, MeasureSpec.AT_MOST 22 | ) 23 | super.onMeasure(widthMeasureSpec, heightMeasureSpec) 24 | val params = layoutParams 25 | params.height = measuredHeight 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/ProgressCircleAnimation.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui 2 | 3 | import android.view.animation.Animation 4 | import android.view.animation.Transformation 5 | import com.google.android.material.progressindicator.CircularProgressIndicator 6 | 7 | class ProgressCircleAnimation( 8 | private val progressCircle: CircularProgressIndicator, 9 | private val from: Float, 10 | private val to: Float 11 | ) : 12 | Animation() { 13 | override fun applyTransformation(interpolatedTime: Float, t: Transformation) { 14 | super.applyTransformation(interpolatedTime, t) 15 | val value = from + (to - from) * interpolatedTime 16 | progressCircle.progress = value.toInt() 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/SecureFragment.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui 2 | 3 | import de.jepfa.yapm.model.secret.SecretKeyHolder 4 | 5 | open class SecureFragment : BaseFragment() { 6 | 7 | fun getSecureActivity() : SecureActivity? { 8 | return activity as SecureActivity? 9 | } 10 | 11 | val masterSecretKey: SecretKeyHolder? 12 | get() { 13 | return getSecureActivity()?.masterSecretKey 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/UseCaseBackgroundLauncher.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui 2 | 3 | import de.jepfa.yapm.usecase.UseCase 4 | import de.jepfa.yapm.usecase.UseCaseOutput 5 | 6 | class UseCaseBackgroundLauncher ( 7 | private val useCase: UseCase 8 | ) 9 | { 10 | 11 | fun launch( 12 | activity: ACTIVITY, 13 | input: INPUT) { 14 | launch(activity, input, {}) 15 | } 16 | 17 | fun launch( 18 | activity: ACTIVITY, 19 | input: INPUT, 20 | postHandler: (backgroundResult: UseCaseOutput) -> Unit) { 21 | lateinit var result: UseCaseOutput 22 | AsyncWithProgressBar(activity, 23 | { 24 | result = useCase.execute(input, activity) 25 | result.success 26 | }, 27 | { 28 | postHandler.invoke(result) 29 | }) 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/ViewRecyclerViewAdapter.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui 2 | 3 | import android.content.Context 4 | import android.view.View 5 | import android.view.ViewGroup 6 | import android.widget.LinearLayout 7 | import androidx.recyclerview.widget.RecyclerView 8 | 9 | class ViewRecyclerViewAdapter(private val context: Context, private val items: List) : 10 | RecyclerView.Adapter() { 11 | 12 | override fun onCreateViewHolder( 13 | parent: ViewGroup, 14 | viewType: Int 15 | ): ViewHolder { 16 | return ViewHolder( 17 | LinearLayout( 18 | context 19 | ) 20 | ) 21 | } 22 | 23 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 24 | (holder.itemView as ViewGroup).addView(items[position]) 25 | } 26 | 27 | override fun getItemCount(): Int { 28 | return items.size 29 | } 30 | 31 | class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView!!) 32 | 33 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/credential/CredentialGrouping.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui.credential 2 | 3 | import de.jepfa.yapm.R 4 | 5 | enum class CredentialGrouping(val labelId: Int) { 6 | NO_GROUPING(R.string.credential_group_by_none), 7 | BY_CREDENTIAL_NAME(R.string.credential_group_by_name), 8 | BY_LABEL(R.string.credential_group_by_label); 9 | 10 | companion object { 11 | val DEFAULT = NO_GROUPING 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/credential/CredentialSortOrder.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui.credential 2 | 3 | import de.jepfa.yapm.R 4 | 5 | enum class CredentialSortOrder(val labelId: Int) { 6 | CREDENTIAL_NAME_ASC(R.string.credential_sort_by_name_asc), 7 | CREDENTIAL_NAME_DESC(R.string.credential_sort_by_name_desc), 8 | RECENTLY_MODIFIED(R.string.credential_sort_by_recently_modified), 9 | CREDENTIAL_IDENTIFIER(R.string.credential_sort_by_id); 10 | 11 | companion object { 12 | val DEFAULT = CREDENTIAL_NAME_ASC 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/errorhandling/ExceptionHandler.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui.errorhandling 2 | 3 | import android.app.Activity 4 | import android.content.Intent 5 | import android.os.Process 6 | import android.util.Log 7 | import de.jepfa.yapm.util.Constants.LOG_PREFIX 8 | import java.io.PrintWriter 9 | import java.io.StringWriter 10 | 11 | /* 12 | Inspired from https://github.com/hardik-trivedi/ForceClose 13 | */ 14 | class ExceptionHandler(private val context: Activity) : Thread.UncaughtExceptionHandler { 15 | 16 | override fun uncaughtException(thread: Thread, exception: Throwable) { 17 | val stackTrace = StringWriter() 18 | exception.printStackTrace(PrintWriter(stackTrace)) 19 | Log.d(LOG_PREFIX + "EXH", "caught exception", exception) 20 | val errorReport = StringBuilder() 21 | errorReport.append("************ CAUSE OF ERROR ************\n\n") 22 | errorReport.append(stackTrace.toString()) 23 | 24 | val intent = Intent(context, ErrorActivity::class.java) 25 | intent.putExtra(ErrorActivity.EXTRA_EXCEPTION, errorReport.toString()) 26 | intent.putExtra(ErrorActivity.EXTRA_FROM_ERROR_CATCHER, true) 27 | context.startActivity(intent) 28 | 29 | Process.killProcess(Process.myPid()) 30 | System.exit(10) 31 | } 32 | 33 | } 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/intro/Intro6Fragment.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui.intro 2 | 3 | import android.content.Context 4 | import android.os.Bundle 5 | import android.text.method.LinkMovementMethod 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import android.widget.TextView 10 | import androidx.fragment.app.Fragment 11 | import de.jepfa.yapm.R 12 | import de.jepfa.yapm.service.secretgenerator.passphrase.PassphraseGenerator 13 | 14 | 15 | class Intro6Fragment : Fragment() { 16 | 17 | private lateinit var passphraseGenerator: PassphraseGenerator 18 | 19 | 20 | override fun onAttach(context: Context) { 21 | super.onAttach(context) 22 | passphraseGenerator = PassphraseGenerator(context = context) 23 | } 24 | 25 | override fun onCreateView( 26 | inflater: LayoutInflater, container: ViewGroup?, 27 | savedInstanceState: Bundle? 28 | ): View? { 29 | return inflater.inflate(R.layout.fragment_intro_6, container, false) 30 | } 31 | 32 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 33 | super.onViewCreated(view, savedInstanceState) 34 | val textView: TextView = view.findViewById(R.id.textview_subtext) 35 | textView.movementMethod = LinkMovementMethod.getInstance() 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/intro/IntroBaseActivity.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui.intro 2 | 3 | import android.os.Bundle 4 | import com.github.appintro.AppIntro 5 | import de.jepfa.yapm.R 6 | 7 | // Taken from https://github.com/AppIntro/AppIntro 8 | abstract class IntroBaseActivity : AppIntro() { 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | // Make sure you don't call setContentView! 12 | 13 | setIndicatorColor(getColor(R.color.colorAltAccent), getColor(R.color.colorPrimaryDark)) 14 | setBackArrowColor(getColor(R.color.colorAccent)) 15 | setColorSkipButton(getColor(R.color.colorAccent)) 16 | setColorDoneText(getColor(R.color.colorAccent)) 17 | setNextArrowColor(getColor(R.color.colorAccent)) 18 | 19 | 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/intro/LicencesActivity.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui.intro 2 | 3 | import android.os.Bundle 4 | import android.webkit.WebView 5 | import de.jepfa.yapm.R 6 | import de.jepfa.yapm.ui.BaseActivity 7 | 8 | class LicencesActivity : BaseActivity() { 9 | 10 | init { 11 | enableBack = true 12 | } 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | setContentView(R.layout.activity_licences) 17 | 18 | title = getString(R.string.licences_title) 19 | val webView = findViewById(R.id.licences_view) 20 | webView.loadUrl("file:///android_asset/open_source_licenses.html") 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/label/Label.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui.label 2 | 3 | import android.content.Context 4 | import de.jepfa.yapm.R 5 | import java.util.* 6 | 7 | data class Label( 8 | val labelId: Int?, 9 | var name: String, 10 | var description: String, 11 | var colorRGB: Int?, 12 | var iconResId: Int? = null 13 | ) { 14 | 15 | init { 16 | name = name.uppercase(Locale.ROOT).trim() 17 | } 18 | 19 | constructor(id: Int?, name: String, colorRGB: Int?, iconResId: Int? = null) : this(id, name, "", colorRGB, iconResId) 20 | 21 | constructor(name: String, colorRGB: Int?, iconResId: Int? = null) : this(null, name, "", colorRGB, iconResId) 22 | 23 | constructor(name: String) : this( 24 | null, 25 | name, 26 | "", 27 | null) 28 | 29 | constructor(name: String, description: String) : this( 30 | null, 31 | name, 32 | description, 33 | null) 34 | 35 | fun getColor(context: Context): Int { 36 | return colorRGB ?: context.getColor(DEFAULT_CHIP_COLOR_ID) 37 | } 38 | 39 | companion object { 40 | const val DEFAULT_CHIP_COLOR_ID = R.color.colorPrimaryDark 41 | } 42 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/ui/webextension/WebExtensionSortOrder.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.ui.webextension 2 | 3 | import de.jepfa.yapm.R 4 | 5 | enum class WebExtensionSortOrder(val labelId: Int) { 6 | TITLE(R.string.webextension_sort_by_name), 7 | WEB_CLIENT_ID(R.string.webextension_sort_by_id), 8 | RECENTLY_USED(R.string.webextension_sort_by_last_used); 9 | 10 | companion object { 11 | val DEFAULT = WEB_CLIENT_ID 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/BasicUseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase 2 | 3 | import de.jepfa.yapm.ui.BaseActivity 4 | 5 | abstract class BasicUseCase : UseCase { 6 | 7 | final override suspend fun execute(input: Unit, activity: ACTIVITY): UseCaseOutput { 8 | return UseCaseOutput(execute(activity), Unit, null) 9 | } 10 | 11 | abstract fun execute(activity: ACTIVITY): Boolean 12 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/InputUseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase 2 | 3 | import de.jepfa.yapm.ui.BaseActivity 4 | 5 | abstract class InputUseCase : UseCase { 6 | 7 | final override suspend fun execute(input: INPUT, activity: ACTIVITY): UseCaseOutput { 8 | val success = doExecute(input, activity) 9 | return UseCaseOutput(success, Unit, null) 10 | } 11 | 12 | abstract suspend fun doExecute(input: INPUT, activity: ACTIVITY): Boolean 13 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/OutputUseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase 2 | 3 | import de.jepfa.yapm.ui.BaseActivity 4 | 5 | abstract class OutputUseCase : UseCase { 6 | 7 | override suspend fun execute(input: Unit, activity: ACTIVITY): UseCaseOutput { 8 | return execute(activity) 9 | } 10 | 11 | abstract fun execute(activity: ACTIVITY): UseCaseOutput 12 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/UseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase 2 | 3 | import de.jepfa.yapm.ui.BaseActivity 4 | 5 | interface UseCase { 6 | /** 7 | * Execute supposed to be run in a background job. 8 | */ 9 | suspend fun execute(input: INPUT, activity: ACTIVITY): UseCaseOutput 10 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/UseCaseOutput.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase 2 | 3 | data class UseCaseOutput(val success: Boolean, val data: OUTPUT, var errorMessage: String?) { 4 | 5 | constructor(output: OUTPUT): this(true, output, null) 6 | constructor(success: Boolean, output: OUTPUT): this(success, output, null) 7 | 8 | companion object { 9 | fun ok(): UseCaseOutput { 10 | return UseCaseOutput(true, Unit, null) 11 | } 12 | 13 | fun fail(errorMessage: String?): UseCaseOutput { 14 | return UseCaseOutput(false, null, errorMessage) 15 | } 16 | 17 | fun of(success: Boolean, errorMessage: String?): UseCaseOutput { 18 | return UseCaseOutput(success, Unit, errorMessage) 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/credential/DeleteMultipleCredentialsUseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase.credential 2 | 3 | import de.jepfa.yapm.model.encrypted.EncCredential 4 | import de.jepfa.yapm.ui.SecureActivity 5 | import de.jepfa.yapm.usecase.InputUseCase 6 | 7 | object DeleteMultipleCredentialsUseCase: InputUseCase() { 8 | 9 | data class Input(val credentials: Set) 10 | 11 | override suspend fun doExecute(input: Input, activity: SecureActivity): Boolean { 12 | 13 | activity.credentialViewModel.deleteAll(input.credentials, activity) 14 | 15 | return true 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/secret/RemoveStoredMasterPasswordUseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase.secret 2 | 3 | import de.jepfa.yapm.service.secret.MasterPasswordService 4 | import de.jepfa.yapm.ui.SecureActivity 5 | import de.jepfa.yapm.usecase.BasicUseCase 6 | 7 | object RemoveStoredMasterPasswordUseCase: BasicUseCase() { 8 | 9 | override fun execute(activity: SecureActivity): Boolean { 10 | MasterPasswordService.deleteStoredMasterPassword(activity) 11 | 12 | return true 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/session/LogoutUseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase.session 2 | 3 | import de.jepfa.yapm.model.session.Session 4 | import de.jepfa.yapm.service.io.TempFileService 5 | import de.jepfa.yapm.ui.SecureActivity 6 | import de.jepfa.yapm.usecase.BasicUseCase 7 | import de.jepfa.yapm.util.ClipboardUtil 8 | 9 | object LogoutUseCase: BasicUseCase() { 10 | 11 | override fun execute(activity: SecureActivity): Boolean { 12 | Session.logout() 13 | 14 | TempFileService.clearSharesCache(activity) 15 | activity.closeOverlayDialogs() 16 | ClipboardUtil.clearClips(activity) 17 | 18 | // activity.finishAndRemoveTask() 19 | activity.finishAffinity() 20 | 21 | return true 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/usernametemplate/DeleteUsernameTemplateUseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase.usernametemplate 2 | 3 | import de.jepfa.yapm.model.encrypted.EncUsernameTemplate 4 | import de.jepfa.yapm.ui.SecureActivity 5 | import de.jepfa.yapm.usecase.InputUseCase 6 | 7 | 8 | object DeleteUsernameTemplateUseCase: InputUseCase() { 9 | 10 | override suspend fun doExecute(usernameTemplate: EncUsernameTemplate, activity: SecureActivity): Boolean { 11 | val key = activity.masterSecretKey 12 | val id = usernameTemplate.id 13 | if (key != null && id != null) { 14 | activity.usernameTemplateViewModel.deleteById(id, activity) 15 | } 16 | 17 | return true 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/vault/LockVaultUseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase.vault 2 | 3 | import de.jepfa.yapm.model.session.Session 4 | import de.jepfa.yapm.service.io.TempFileService 5 | import de.jepfa.yapm.ui.SecureActivity 6 | import de.jepfa.yapm.usecase.BasicUseCase 7 | import de.jepfa.yapm.util.ClipboardUtil 8 | 9 | object LockVaultUseCase: BasicUseCase() { 10 | 11 | override fun execute(activity: SecureActivity): Boolean { 12 | Session.lock() 13 | TempFileService.clearSharesCache(activity) 14 | activity.closeOverlayDialogs() 15 | SecureActivity.SecretChecker.getOrAskForSecret(activity) 16 | ClipboardUtil.clearClips(activity) 17 | activity.finish() 18 | 19 | return true 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/webextension/DeleteDisabledWebExtensionsUseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase.webextension 2 | 3 | import de.jepfa.yapm.ui.BaseActivity 4 | import de.jepfa.yapm.usecase.UseCase 5 | import de.jepfa.yapm.usecase.UseCaseOutput 6 | import kotlinx.coroutines.CoroutineScope 7 | import kotlinx.coroutines.Dispatchers 8 | import kotlinx.coroutines.launch 9 | 10 | 11 | object DeleteDisabledWebExtensionsUseCase: UseCase { 12 | 13 | override suspend fun execute(unit: Unit, activity: BaseActivity): UseCaseOutput { 14 | var disabledCount = 0 15 | 16 | CoroutineScope(Dispatchers.IO).launch { 17 | activity.getApp().webExtensionRepository.getAllSync().forEach { webExtension -> 18 | if (!webExtension.enabled) { 19 | DeleteWebExtensionUseCase.execute(webExtension, activity) 20 | disabledCount++; 21 | } 22 | } 23 | }.join() 24 | 25 | return UseCaseOutput(disabledCount) 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/de/jepfa/yapm/usecase/webextension/DeleteWebExtensionUseCase.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.yapm.usecase.webextension 2 | 3 | import de.jepfa.yapm.model.encrypted.EncWebExtension 4 | import de.jepfa.yapm.service.secret.SecretService 5 | import de.jepfa.yapm.ui.BaseActivity 6 | import de.jepfa.yapm.ui.SecureActivity 7 | import de.jepfa.yapm.usecase.InputUseCase 8 | 9 | 10 | object DeleteWebExtensionUseCase: InputUseCase() { 11 | 12 | override suspend fun doExecute(webExtension: EncWebExtension, activity: BaseActivity): Boolean { 13 | val id = webExtension.id 14 | if (id != null) { 15 | activity.webExtensionViewModel.deleteById(id) 16 | SecretService.removeAndroidSecretKey(webExtension.getServerKeyPairAlias()) 17 | } 18 | 19 | return true 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_123_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_abc_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_accessibility_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_add_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_alternate_email_24.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_browser_updated_48.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_bug_report_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_clear_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_favorite_border_24.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_lock_clock_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_phonelink_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_phonelink_off_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_phonelink_off_48.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_send_to_mobile_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_star_outline_24.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_star_rate_24.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_arrow_back_24_accent.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_arrow_back_24_gray.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_arrow_back_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_arrow_forward_12.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_auto_awesome_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_bug_report_gray_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_casino_20.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_close_12.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_computer_20.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_content_copy_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_content_copy_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_delete_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_delete_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_dns_20.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_download_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_edit_16.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_edit_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_exit_to_app_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_expand_less_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_expand_more_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_file_copy_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_filter_list_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_filter_list_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_filter_list_with_with_dot_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | 13 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_fitness_center_16.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_fitness_center_20.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_fitness_center_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_flashlight_off_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_flashlight_on_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_help_outline_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_help_outline_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_image_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_import_export_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_info_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_label_24.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_list_gray_24.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_login_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_memory_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_more_vert_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_nfc_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_nfc_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_nfc_36.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_nfc_48.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_nfc_64.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_north_east_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_north_east_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_not_interested_gray_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_pause_gray_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_person_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_person_24_gray.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_public_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_24_red.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_36_red.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_48_red.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_68_gray.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_scanner_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_scanner_36.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_qr_code_scanner_48.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_replay_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_save_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_save_alt_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_share_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_share_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_sort_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_sort_24_white.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_vpn_key_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_vpn_key_24_gray.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_vpn_key_24_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_copy_black_48dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_open_gray_24dp.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_open_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_outline_gray_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_outline_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_outline_file_copy_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_security_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_twotone_cloud_off_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_twotone_copy_attent_black_48dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 15 | 19 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_twotone_edit_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_twotone_lock_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_twotone_memory_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_twotone_nfc_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/otp_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/otp_24_white.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_check_circle_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_circle_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_dns_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_group_by_24.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_list_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_notifications_active_last_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_notifications_active_next_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_notifications_none_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_sync_24.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/password_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_fiber_new_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/swap_vert_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/twotone_devices_48.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/twotone_screen_lock_portrait_48.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/variable_remove_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/font/robotomono_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/font/robotomono_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_create_vault.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_edit_credential.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_import_credentials.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_import_vault.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_licences.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_list_credentials.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_list_labels.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | 13 | 19 | 20 | 21 | 22 | 27 | 28 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_list_username_templates.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | 13 | 19 | 20 | 21 | 22 | 27 | 28 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_list_web_extensions.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | 13 | 19 | 20 | 21 | 22 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_login.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_autofill_user_password_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 19 | 20 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_autofill_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_create_vault.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_dynamic_labels_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_edit_credential.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_import_credentials.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_import_vault.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_login.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/expandable_group_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/expandable_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 19 | 20 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/nav_header_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 21 | 22 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/number_picker_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/recyclerview_label.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | 17 | 18 | 26 | 27 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/settings_activity.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_configure_otp.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_create_or_import_vault.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 13 | 18 | 19 | 20 | 21 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_credential_detail_import.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 13 | 17 | 21 | 24 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_credential_detail_raw.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 13 | 16 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_credential_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | 16 | 19 | 23 | 26 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_credential_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 12 | 15 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_label_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_label_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_qrcode.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_server_link.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_server_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 10 | 11 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_username_template_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_web_extension_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_web_extension_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-hdpi/ic_logo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-mdpi/ic_logo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-xhdpi/ic_logo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-xxhdpi/ic_logo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/app/src/main/res/mipmap-xxxhdpi/ic_logo.png -------------------------------------------------------------------------------- /app/src/main/res/navigation/nav_import_credentials.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 16 | 17 | 18 | 19 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/navigation/nav_login.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 16 | 17 | 18 | 19 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/booleans.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-v26/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/values/booleans.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 16dp 4 | 5 | 250dp 6 | 7 | 16dp 8 | 16dp 9 | 8dp 10 | 146dp 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_anotherpass_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FF0888 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 50 4 | 50 5 | 50 6 | 50 7 | 1000 8 | 20 9 | 200 10 | 50 11 | 200 12 | 50 13 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 17 | 18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 14 | 15 | 19 | 20 | 22 | 23 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/xml-v30/credential_autofiller.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/xml/clipboard_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 18 | 19 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/xml/credential_autofiller.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/xml/filepaths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/test/java/de/jepfa/yapm/model/secret/PasswordTest.kt: -------------------------------------------------------------------------------- 1 | package de.jepfa.obfusser.util.encrypt 2 | 3 | import de.jepfa.yapm.model.secret.Password 4 | import org.junit.Assert 5 | import org.junit.Test 6 | import java.nio.charset.Charset 7 | import java.util.* 8 | 9 | class PasswordTest { 10 | 11 | @Test 12 | fun testAscii() { 13 | val passwd = Password("abc") 14 | System.out.println("bytes: " + Arrays.toString(passwd.toByteArray())) 15 | Assert.assertEquals("abc", passwd.toRawFormattedPassword().toString()) 16 | Assert.assertEquals("abc", passwd.toString()) 17 | Assert.assertArrayEquals("abc".toCharArray(), passwd.toEncodedCharArray()) 18 | } 19 | 20 | @Test 21 | fun testNonAscii() { 22 | val passwd = Password("abä") 23 | System.out.println("bytes: " + Arrays.toString(passwd.toByteArray())) 24 | System.out.println("chars: " + Arrays.toString(passwd.toEncodedCharArray())) 25 | System.out.println("chars of ${Charset.defaultCharset()}: " + Arrays.toString(passwd.decodeToCharArray())) 26 | System.out.println("byte: " + 'ä'.toByte()) 27 | Assert.assertEquals("abä", passwd.toRawFormattedPassword().toString()) 28 | Assert.assertEquals("abä", passwd.toString()) 29 | Assert.assertArrayEquals("abä".toCharArray(), passwd.decodeToCharArray()) 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | ext.kotlin_version = "2.0.10" 4 | repositories { 5 | google() 6 | mavenCentral() 7 | } 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:8.7.2' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | classpath 'com.jaredsburrows:gradle-license-plugin:0.9.0' 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | google() 21 | mavenCentral() 22 | maven { url "https://jitpack.io" } 23 | } 24 | } 25 | 26 | 27 | ext { 28 | activityVersion = '1.4.0' 29 | appCompatVersion = '1.4.2' 30 | constraintLayoutVersion = '2.1.4' 31 | coreTestingVersion = '2.1.0' 32 | coroutines = '1.6.4' 33 | lifecycleVersion = '2.4.1' 34 | materialVersion = '1.6.1' 35 | roomVersion = '2.4.2' 36 | // testing 37 | junitVersion = '4.13.2' 38 | espressoVersion = '3.1.0' 39 | androidxJunitVersion = '1.1.3' 40 | } 41 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | ## For more details on how to configure your build environment visit 2 | # http://www.gradle.org/docs/current/userguide/build_environment.html 3 | # 4 | # Specifies the JVM arguments used for the daemon process. 5 | # The setting is particularly useful for tweaking memory settings. 6 | # Default value: -Xmx1024m -XX:MaxPermSize=256m 7 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 8 | # 9 | # When configured, Gradle will run in incubating parallel mode. 10 | # This option should only be used with decoupled projects. More details, visit 11 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 12 | # org.gradle.parallel=true 13 | #Tue Apr 11 09:51:32 CEST 2023 14 | kotlin.code.style=official 15 | org.gradle.jvmargs=-Xmx1024M -Dkotlin.daemon.jvm.options\="-Xmx1024M" -Dfile.encoding\=UTF-8 16 | android.useAndroidX=true 17 | android.enableJetifier=true 18 | android.defaults.buildfeatures.buildconfig=true 19 | android.nonTransitiveRClass=false 20 | android.nonFinalResIds=false 21 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | # Android Studio cannot compile with this checksum, uncomment it and run gradlew build to check without AS 4 | #distributionSha256Sum=0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /metadata/de-DE/short_description.txt: -------------------------------------------------------------------------------- 1 | Ein etwas anderer Passwortmanager 2 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/105003.txt: -------------------------------------------------------------------------------- 1 | * fix date parsing exception when device language has been changed 2 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/105004.txt: -------------------------------------------------------------------------------- 1 | * replace weird misleading text string 2 | * add icon and improved description to metadata 3 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/106000.txt: -------------------------------------------------------------------------------- 1 | * possibility to protect Exported Master Password with a certain codeword 2 | * possibility to write-protect NFC tags after writing 3 | * add UUID attribute to all credentials and labels to simplify sharing 4 | * encrypt app settings in exported vault file 5 | * fix password combination calculation and add entropy indicator 6 | * german translations and typo fixing 7 | * bug fixes and small improvements 8 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/106001.txt: -------------------------------------------------------------------------------- 1 | * fix crash when open from Autofill (Android 10+) 2 | * add temporary pause Autofill feature 3 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/106002.txt: -------------------------------------------------------------------------------- 1 | * fix "Resume Autofill" - option 2 | * add last succeeded / denied login feature 3 | * fix show all installed apps to exclude from Autofill (Android 11+) 4 | * fix typos 5 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/107000.txt: -------------------------------------------------------------------------------- 1 | * import/export plain credentials from/to csv files (e.g. from/for browsers) 2 | * improved Autofill (inline presentations, suggestions, smoother flow) 3 | * copy-protect NFC tags containing a Master Password Token 4 | * possibility to change the current vaults encryption cipher and master key 5 | * optimize random generator by adding user entropy (hashed picture) 6 | * UI improvements (labels, collapsable main menu tree, ..) 7 | * bugfixes and other improvements 8 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/107001.txt: -------------------------------------------------------------------------------- 1 | * remove "Copied" button during login for Android 13 2 | * QR code scanner can now scan image files (#27) 3 | * QR code scanner with flash light / torch 4 | * small bugfixes and typos 5 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/107002.txt: -------------------------------------------------------------------------------- 1 | * make external storage access working for Android 13 (e.g. importing vault file) 2 | * Autofill for Instagram app 3 | * small bugfixes and typos 4 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/107003.txt: -------------------------------------------------------------------------------- 1 | * fix issue #38: autofill breaks the app for Android 10 2 | * increase max characters for "additional info" to 500 3 | * adjust entropy smilies 4 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/108000.txt: -------------------------------------------------------------------------------- 1 | * Optional expiry dates for credentials with notification support 2 | * Reworked extended credential search with command suggestions 3 | * Ability to adjust and optimize login (PBKDF) iterations 4 | * Multiple selection of credentials for deletion 5 | * Improvement of some UI-components 6 | * Use encrypted preference store for settings 7 | * retry erroneous encryption attempts up to 2 times before failing 8 | * other bugfixes 9 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/108001.txt: -------------------------------------------------------------------------------- 1 | * add disclaimer 2 | * support devices without display lock 3 | * display short descriptions for extended search 4 | * bugfixes 5 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/108002.txt: -------------------------------------------------------------------------------- 1 | * import CSV files from Keepass databases 2 | * improve UI adding labels to credentials 3 | * bugfixes 4 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/109000.txt: -------------------------------------------------------------------------------- 1 | * new feature to predefine templates for frequent usernames (supports generic email aliases) 2 | * custom CSV credential importer for unknown CSV files 3 | * import CSV files from Bitwarden databases (https://github.com/jenspfahl/ANOTHERpass/issues/58) 4 | * provide Quick Settings Tile to open the vault (https://github.com/jenspfahl/ANOTHERpass/issues/57) 5 | * Dutch translations (thanks to https://github.com/ruditimmermans) 6 | * adaptive app launcher icon to support monochrome icon themes (https://github.com/jenspfahl/ANOTHERpass/issues/54) 7 | * small bugfixes and UI improvements 8 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/109001.txt: -------------------------------------------------------------------------------- 1 | * fix UserNotAuthenticatedException 2 | * add report bug functionality 3 | * reinforce debug info 4 | * fix Dutch translations 5 | * small bugfixes -------------------------------------------------------------------------------- /metadata/en-US/changelogs/109002.txt: -------------------------------------------------------------------------------- 1 | * fix autofill issue (NPE) #67 -------------------------------------------------------------------------------- /metadata/en-US/changelogs/109003.txt: -------------------------------------------------------------------------------- 1 | * fix NFC read error when reading from tag with multiple records 2 | * add number keyboard option to PIN field -------------------------------------------------------------------------------- /metadata/en-US/changelogs/109004.txt: -------------------------------------------------------------------------------- 1 | * fix https://github.com/jenspfahl/ANOTHERpass/issues/72 2 | * use AES 256 as default if supported 3 | 4 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/109005.txt: -------------------------------------------------------------------------------- 1 | * fix username template broken when master key is regenerated 2 | * smaller improvements 3 | 4 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/200000.txt: -------------------------------------------------------------------------------- 1 | * Use the app as a local credential server to connect the app with the brand-new browser extension (https://anotherpass.jepfa.de/extension/) 2 | * bugfix issue #74 Unlocking vault from Autofill wit no entries -------------------------------------------------------------------------------- /metadata/en-US/changelogs/200001.txt: -------------------------------------------------------------------------------- 1 | * Support backup app vault file through browser extension 2 | * Add details about security chip or TEE of used device to vault info -------------------------------------------------------------------------------- /metadata/en-US/changelogs/200002.txt: -------------------------------------------------------------------------------- 1 | * Support backup app vault file through browser extension 2 | * Add details about security chip or TEE of used device to vault info 3 | * fix version number mismatch with v2.0.1 -------------------------------------------------------------------------------- /metadata/en-US/changelogs/200003.txt: -------------------------------------------------------------------------------- 1 | * fix #77 error during vault export (sharing) -------------------------------------------------------------------------------- /metadata/en-US/changelogs/200004.txt: -------------------------------------------------------------------------------- 1 | * fix read exported credentials on NFC tags -------------------------------------------------------------------------------- /metadata/en-US/changelogs/201000.txt: -------------------------------------------------------------------------------- 1 | * support for One-Time-Passwords (counter- and time based) 2 | * added Argon2Id as the default Key Derivation Function (changeable) 3 | * import to and export from Keepass/KDBX files 4 | * exported encrypted credentials need less space now 5 | * switch search and add-button (#78) 6 | * add own app logging as part of the "Report a bug" - feature (#79) 7 | * smaller improvements and bugfixes 8 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/201001.txt: -------------------------------------------------------------------------------- 1 | * fix quick access tile on Android 14+ 2 | * add option to opt-out from preserving previous credential passwords once changed 3 | * smaller improvements 4 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/202000.txt: -------------------------------------------------------------------------------- 1 | * option to enable auto-backup of the vault when changed 2 | * group credentials by first letter or by categories 3 | * mark single credentials as favourites 4 | * highlight recently changed credential 5 | * a few significant UI and UX improvements 6 | -------------------------------------------------------------------------------- /metadata/en-US/changelogs/202001.txt: -------------------------------------------------------------------------------- 1 | * Fix Autofill with website suggestions in Chrome and other alternative browsers (#43) 2 | * Fix auto-backup workflow issues 3 | * Add feedback menu -------------------------------------------------------------------------------- /metadata/en-US/changelogs/202002.txt: -------------------------------------------------------------------------------- 1 | * Adapt password strength metrics to the last Hyve Systems password report 2 | * Add additional option to generate even more strong passwords 3 | * Add group selection for credentials 4 | * Prepare credential server to send OTP configurations to extensions 5 | * Smaller improvements and fixes -------------------------------------------------------------------------------- /metadata/en-US/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/featureGraphic.png -------------------------------------------------------------------------------- /metadata/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/icon.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/0a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/0a.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/0b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/0b.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/0c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/0c.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/0d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/0d.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/6.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/7.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/8.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/9.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/A.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/B.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/C.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/D.png -------------------------------------------------------------------------------- /metadata/en-US/images/phoneScreenshots/E.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenspfahl/ANOTHERpass/3288f18de43c6f68e70512826ecf42bad34b72ac/metadata/en-US/images/phoneScreenshots/E.png -------------------------------------------------------------------------------- /metadata/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | Another way to manage passwords 2 | -------------------------------------------------------------------------------- /metadata/en-US/title.txt: -------------------------------------------------------------------------------- 1 | ANOTHERpass 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | rootProject.name = "ANOTHERpass" --------------------------------------------------------------------------------