├── .github ├── ISSUE_TEMPLATE │ ├── ---bug-report.md │ ├── ---chore.md │ ├── ---feature.md │ └── --user-story.md └── pull_request_template.md ├── .gitignore ├── .idea ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── compiler.xml ├── copyright │ ├── MPL_2_0.xml │ └── profiles_settings.xml ├── encodings.xml ├── jarRepositories.xml ├── render.experimental.xml ├── runConfigurations.xml └── vcs.xml ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── lint-baseline.xml ├── lint-config.xml ├── metrics.yaml ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── mozilla │ │ └── lockbox │ │ ├── robots │ │ ├── AccountSettingRobot.kt │ │ ├── AutofillOnboardingRobot.kt │ │ ├── BaseTestRobot.kt │ │ ├── DeleteCredentialDisclaimerRobot.kt │ │ ├── DisconnectDisclaimerRobot.kt │ │ ├── EditCredentialDisclaimerRobot.kt │ │ ├── EditCredentialRobot.kt │ │ ├── FilteredItemListRobot.kt │ │ ├── FingerprintDialogRobot.kt │ │ ├── FingerprintOnboardingRobot.kt │ │ ├── FxALoginRobot.kt │ │ ├── ItemDetailRobot.kt │ │ ├── ItemListRobot.kt │ │ ├── KebabMenuRobot.kt │ │ ├── LockScreenRobot.kt │ │ ├── OnboardingConfirmationRobot.kt │ │ ├── SecurityDisclaimerRobot.kt │ │ ├── SettingsRobot.kt │ │ ├── UIComponentRobot.kt │ │ └── WelcomeRobot.kt │ │ ├── screenshots │ │ ├── ScreengrabTest.java │ │ └── ScreenshotsTest.kt │ │ └── uiTests │ │ ├── AppRoutePresenterTest.kt │ │ ├── AutoLockTest.kt │ │ ├── FingerprintDialogTest.kt │ │ ├── ItemDetailsTest.kt │ │ ├── ItemListTest.kt │ │ ├── LockboxAutofillServiceTest.kt │ │ ├── Navigator.kt │ │ └── OnboardingTest.kt │ ├── debug │ ├── AndroidManifest.xml │ ├── assets │ │ └── fixtures │ │ │ ├── app_expensify.xml │ │ │ ├── app_facebook.xml │ │ │ ├── app_facebook_lite.xml │ │ │ ├── app_fortuneo.xml │ │ │ ├── app_messenger_lite.xml │ │ │ ├── app_pocket_apple_id.xml │ │ │ ├── app_twitter.xml │ │ │ ├── app_twitter_2.xml │ │ │ ├── html_amazon_register.xml │ │ │ ├── html_amazon_signin.xml │ │ │ ├── html_auth0.xml │ │ │ ├── html_facebook.xml │ │ │ ├── html_fxa.xml │ │ │ ├── html_gmail_1.xml │ │ │ ├── html_gmail_2.xml │ │ │ ├── html_twitter.xml │ │ │ ├── test_basic.xml │ │ │ ├── test_basic_html_inputs.xml │ │ │ ├── test_labelled_edittexts.xml │ │ │ └── test_labelled_html_inputs.xml │ ├── java │ │ └── mozilla │ │ │ └── lockbox │ │ │ └── view │ │ │ └── UITestActivity.kt │ └── res │ │ ├── layout │ │ └── activity_test.xml │ │ └── values │ │ └── strings.xml │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-web.png │ ├── java │ │ └── mozilla │ │ │ └── lockbox │ │ │ ├── LockboxApplication.kt │ │ │ ├── LockboxAutofillService.kt │ │ │ ├── LockboxBroadcastReceiver.kt │ │ │ ├── action │ │ │ ├── AccountAction.kt │ │ │ ├── AppWebPageAction.kt │ │ │ ├── AutofillAction.kt │ │ │ ├── ClipboardAction.kt │ │ │ ├── DataStoreAction.kt │ │ │ ├── DialogAction.kt │ │ │ ├── FingerprintAuthAction.kt │ │ │ ├── FingerprintSensorAction.kt │ │ │ ├── ItemDetailAction.kt │ │ │ ├── LifecycleAction.kt │ │ │ ├── NetworkAction.kt │ │ │ ├── RouteAction.kt │ │ │ ├── SentryAction.kt │ │ │ ├── SettingAction.kt │ │ │ ├── TelemetryAction.kt │ │ │ ├── ToastNotificationAction.kt │ │ │ └── UnlockingAction.kt │ │ │ ├── adapter │ │ │ ├── ItemListAdapter.kt │ │ │ ├── SectionedAdapter.kt │ │ │ ├── SettingCellConfiguration.kt │ │ │ ├── SettingListAdapter.kt │ │ │ └── SortItemAdapter.kt │ │ │ ├── autofill │ │ │ ├── AutofillTextValueBuilder.kt │ │ │ ├── FillResponseBuilder.kt │ │ │ ├── IntentBuilder.kt │ │ │ ├── ParsedStructureBuilder.kt │ │ │ ├── ParsedStructureData.kt │ │ │ └── ViewNodeNavigator.kt │ │ │ ├── extensions │ │ │ ├── ConnectivityManager+.kt │ │ │ ├── Observable+.kt │ │ │ ├── ServerPassword+.kt │ │ │ ├── ViewNode+.kt │ │ │ └── view │ │ │ │ └── AlertDialog+.kt │ │ │ ├── flux │ │ │ ├── Action.kt │ │ │ ├── Dispatcher.kt │ │ │ ├── Presenter.kt │ │ │ └── StackReplaySubject.kt │ │ │ ├── model │ │ │ ├── AccountViewModel.kt │ │ │ ├── DialogViewModel.kt │ │ │ ├── ItemDetailViewModel.kt │ │ │ ├── ItemViewModel.kt │ │ │ ├── ModelUtils.kt │ │ │ ├── SyncCredentials.kt │ │ │ └── ToastNotificationViewModel.kt │ │ │ ├── presenter │ │ │ ├── AccountSettingPresenter.kt │ │ │ ├── AppFilterPresenter.kt │ │ │ ├── AppLockedPresenter.kt │ │ │ ├── AppRoutePresenter.kt │ │ │ ├── AppWebPagePresenter.kt │ │ │ ├── ApplicationPresenter.kt │ │ │ ├── AutofillFilterBackdropPresenter.kt │ │ │ ├── AutofillFilterPresenter.kt │ │ │ ├── AutofillLockedPresenter.kt │ │ │ ├── AutofillOnboardingPresenter.kt │ │ │ ├── AutofillRoutePresenter.kt │ │ │ ├── BackablePresenter.kt │ │ │ ├── CreateItemPresenter.kt │ │ │ ├── DisplayItemPresenter.kt │ │ │ ├── EditItemPresenter.kt │ │ │ ├── FilterPresenter.kt │ │ │ ├── FingerprintDialogPresenter.kt │ │ │ ├── FingerprintOnboardingPresenter.kt │ │ │ ├── FxALoginPresenter.kt │ │ │ ├── ItemListPresenter.kt │ │ │ ├── ItemMutationPresenter.kt │ │ │ ├── LockedPresenter.kt │ │ │ ├── OnboardingConfirmationPresenter.kt │ │ │ ├── RoutePresenter.kt │ │ │ ├── SettingPresenter.kt │ │ │ └── WelcomePresenter.kt │ │ │ ├── store │ │ │ ├── AccountStore.kt │ │ │ ├── AlertDialogStore.kt │ │ │ ├── AutofillStore.kt │ │ │ ├── ClipboardStore.kt │ │ │ ├── ContextStore.kt │ │ │ ├── DataStore.kt │ │ │ ├── FingerprintStore.kt │ │ │ ├── GleanTelemetryStore.kt │ │ │ ├── ItemDetailStore.kt │ │ │ ├── LifecycleStore.kt │ │ │ ├── LockedStore.kt │ │ │ ├── NetworkStore.kt │ │ │ ├── RouteStore.kt │ │ │ ├── SentryStore.kt │ │ │ ├── SettingStore.kt │ │ │ └── TelemetryStore.kt │ │ │ ├── support │ │ │ ├── AdjustSupport.kt │ │ │ ├── ClipboardSupport.kt │ │ │ ├── Constant.kt │ │ │ ├── Consumable.kt │ │ │ ├── DataStoreSupport.kt │ │ │ ├── DebugSupport.kt │ │ │ ├── ErrorSupport.kt │ │ │ ├── FeatureFlagSupport.kt │ │ │ ├── FeatureFlags.kt │ │ │ ├── FixedDataStoreSupport.kt │ │ │ ├── FxASyncDataStoreSupport.kt │ │ │ ├── Optional.kt │ │ │ ├── PulicSuffixSupport.kt │ │ │ ├── SecurePreferences.kt │ │ │ ├── SimpleFileReader.kt │ │ │ ├── SystemTimingSupport.kt │ │ │ ├── TimingSupport.kt │ │ │ ├── UISupport.kt │ │ │ └── ViewUtils.kt │ │ │ └── view │ │ │ ├── AccountSettingFragment.kt │ │ │ ├── AppWebPageFragment.kt │ │ │ ├── AutofillFilterBackdropFragment.kt │ │ │ ├── AutofillFilterFragment.kt │ │ │ ├── AutofillLockedFragment.kt │ │ │ ├── AutofillOnboardingFragment.kt │ │ │ ├── AutofillRootActivity.kt │ │ │ ├── BackableFragment.kt │ │ │ ├── CreateItemFragment.kt │ │ │ ├── DialogFragment.kt │ │ │ ├── DisplayItemFragment.kt │ │ │ ├── EditItemFragment.kt │ │ │ ├── FilterFragment.kt │ │ │ ├── FingerprintAuthDialogFragment.kt │ │ │ ├── FingerprintOnboardingFragment.kt │ │ │ ├── Fragment.kt │ │ │ ├── FxALoginFragment.kt │ │ │ ├── ItemDetailOptionMenu.kt │ │ │ ├── ItemListFragment.kt │ │ │ ├── ItemMutationFragment.kt │ │ │ ├── ItemViewHolder.kt │ │ │ ├── LockedFragment.kt │ │ │ ├── NetworkErrorHelper.kt │ │ │ ├── OnboardingConfirmationFragment.kt │ │ │ ├── RootActivity.kt │ │ │ ├── SettingFragment.kt │ │ │ ├── SettingViewHolder.kt │ │ │ └── WelcomeFragment.kt │ └── res │ │ ├── anim │ │ ├── none.xml │ │ ├── slide_in_bottom.xml │ │ └── slide_out_bottom.xml │ │ ├── color │ │ ├── button_disabled.xml │ │ ├── error_input_text.xml │ │ ├── hint_edit_text.xml │ │ ├── link_pressed.xml │ │ ├── menu_item_selected.xml │ │ └── switch_thumb_color.xml │ │ ├── drawable-hdpi │ │ ├── ic_access.png │ │ ├── ic_account.png │ │ ├── ic_add.png │ │ ├── ic_autofill_blob.png │ │ ├── ic_autofill_illustration.png │ │ ├── ic_avatar_placeholder.png │ │ ├── ic_biometric_blob.png │ │ ├── ic_biometric_illustration.png │ │ ├── ic_check_white.png │ │ ├── ic_convenience.png │ │ ├── ic_default_avatar.png │ │ ├── ic_delete.png │ │ ├── ic_delete_red.png │ │ ├── ic_edit.png │ │ ├── ic_error.png │ │ ├── ic_lock_large.png │ │ ├── ic_lockwise_bordered.png │ │ ├── ic_lockwise_glyph.png │ │ ├── ic_menu_kebab.png │ │ ├── ic_no_entries.png │ │ ├── ic_placeholder_entries.png │ │ ├── ic_search_dark.png │ │ ├── ic_security.png │ │ ├── ic_show.png │ │ ├── ic_success.png │ │ ├── ic_title.png │ │ ├── ic_warning.png │ │ ├── ic_welcome_blob.png │ │ └── ic_welcome_illustration.png │ │ ├── drawable-mdpi │ │ ├── ic_access.png │ │ ├── ic_account.png │ │ ├── ic_add.png │ │ ├── ic_autofill_blob.png │ │ ├── ic_autofill_illustration.png │ │ ├── ic_avatar_placeholder.png │ │ ├── ic_biometric_blob.png │ │ ├── ic_biometric_illustration.png │ │ ├── ic_check_white.png │ │ ├── ic_convenience.png │ │ ├── ic_default_avatar.png │ │ ├── ic_delete.png │ │ ├── ic_delete_red.png │ │ ├── ic_edit.png │ │ ├── ic_error.png │ │ ├── ic_lock_large.png │ │ ├── ic_lockwise_bordered.png │ │ ├── ic_lockwise_glyph.png │ │ ├── ic_menu_kebab.png │ │ ├── ic_no_entries.png │ │ ├── ic_placeholder_entries.png │ │ ├── ic_search_dark.png │ │ ├── ic_security.png │ │ ├── ic_show.png │ │ ├── ic_success.png │ │ ├── ic_title.png │ │ ├── ic_warning.png │ │ ├── ic_welcome_blob.png │ │ └── ic_welcome_illustration.png │ │ ├── drawable-v24 │ │ ├── ic_access.xml │ │ ├── ic_account.xml │ │ ├── ic_autofill_blob.xml │ │ ├── ic_autofill_illustration.xml │ │ ├── ic_avatar_placeholder.xml │ │ ├── ic_biometric_blob.xml │ │ ├── ic_biometric_illustration.xml │ │ ├── ic_convenience.xml │ │ ├── ic_default_avatar.xml │ │ ├── ic_lock_large.xml │ │ ├── ic_lockwise_bordered.xml │ │ ├── ic_lockwise_glyph.xml │ │ ├── ic_menu_kebab.xml │ │ ├── ic_no_entries.xml │ │ ├── ic_placeholder_entries.xml │ │ ├── ic_security.xml │ │ ├── ic_title.xml │ │ ├── ic_warning.xml │ │ ├── ic_welcome_blob.xml │ │ └── ic_welcome_illustration.xml │ │ ├── drawable-xhdpi │ │ ├── ic_access.png │ │ ├── ic_account.png │ │ ├── ic_add.png │ │ ├── ic_autofill_blob.png │ │ ├── ic_autofill_illustration.png │ │ ├── ic_avatar_placeholder.png │ │ ├── ic_biometric_blob.png │ │ ├── ic_biometric_illustration.png │ │ ├── ic_check_white.png │ │ ├── ic_convenience.png │ │ ├── ic_default_avatar.png │ │ ├── ic_delete.png │ │ ├── ic_delete_red.png │ │ ├── ic_edit.png │ │ ├── ic_error.png │ │ ├── ic_lock_large.png │ │ ├── ic_lockwise_bordered.png │ │ ├── ic_lockwise_glyph.png │ │ ├── ic_menu_kebab.png │ │ ├── ic_no_entries.png │ │ ├── ic_placeholder_entries.png │ │ ├── ic_search_dark.png │ │ ├── ic_security.png │ │ ├── ic_show.png │ │ ├── ic_success.png │ │ ├── ic_title.png │ │ ├── ic_warning.png │ │ ├── ic_welcome_blob.png │ │ └── ic_welcome_illustration.png │ │ ├── drawable-xxhdpi │ │ ├── ic_access.png │ │ ├── ic_account.png │ │ ├── ic_add.png │ │ ├── ic_autofill_blob.png │ │ ├── ic_autofill_illustration.png │ │ ├── ic_avatar_placeholder.png │ │ ├── ic_biometric_blob.png │ │ ├── ic_biometric_illustration.png │ │ ├── ic_check_white.png │ │ ├── ic_convenience.png │ │ ├── ic_default_avatar.png │ │ ├── ic_delete.png │ │ ├── ic_delete_red.png │ │ ├── ic_edit.png │ │ ├── ic_error.png │ │ ├── ic_lock_large.png │ │ ├── ic_lockwise_bordered.png │ │ ├── ic_lockwise_glyph.png │ │ ├── ic_menu_kebab.png │ │ ├── ic_no_entries.png │ │ ├── ic_placeholder_entries.png │ │ ├── ic_search_dark.png │ │ ├── ic_security.png │ │ ├── ic_show.png │ │ ├── ic_success.png │ │ ├── ic_title.png │ │ ├── ic_warning.png │ │ ├── ic_welcome_blob.png │ │ └── ic_welcome_illustration.png │ │ ├── drawable-xxxhdpi │ │ ├── ic_access.png │ │ ├── ic_account.png │ │ ├── ic_add.png │ │ ├── ic_autofill_blob.png │ │ ├── ic_autofill_illustration.png │ │ ├── ic_avatar_placeholder.png │ │ ├── ic_biometric_blob.png │ │ ├── ic_biometric_illustration.png │ │ ├── ic_check_white.png │ │ ├── ic_convenience.png │ │ ├── ic_default_avatar.png │ │ ├── ic_delete.png │ │ ├── ic_delete_red.png │ │ ├── ic_edit.png │ │ ├── ic_error.png │ │ ├── ic_lock_large.png │ │ ├── ic_lockwise_bordered.png │ │ ├── ic_lockwise_glyph.png │ │ ├── ic_no_entries.png │ │ ├── ic_placeholder_entries.png │ │ ├── ic_search_dark.png │ │ ├── ic_security.png │ │ ├── ic_show.png │ │ ├── ic_success.png │ │ ├── ic_title.png │ │ ├── ic_warning.png │ │ ├── ic_welcome_blob.png │ │ └── ic_welcome_illustration.png │ │ ├── drawable │ │ ├── button_pressed_red.xml │ │ ├── button_pressed_violet.xml │ │ ├── create_button.xml │ │ ├── divider.xml │ │ ├── ic_arrow_back.xml │ │ ├── ic_check.xml │ │ ├── ic_close.xml │ │ ├── ic_close_black.xml │ │ ├── ic_copy.xml │ │ ├── ic_down_caret.xml │ │ ├── ic_faq.xml │ │ ├── ic_feedback.xml │ │ ├── ic_fingerprint.xml │ │ ├── ic_fingerprint_fail.xml │ │ ├── ic_fingerprint_success.xml │ │ ├── ic_hide.xml │ │ ├── ic_launch.xml │ │ ├── ic_lock.xml │ │ ├── ic_menu.xml │ │ ├── ic_search.xml │ │ ├── ic_settings.xml │ │ ├── ic_sync.xml │ │ ├── inset_divider.xml │ │ ├── launch_screen.xml │ │ ├── progress_icon.xml │ │ ├── round_outline.xml │ │ ├── round_outline_small.xml │ │ ├── rounded_corner_bg.xml │ │ ├── rounded_corner_bg_white.xml │ │ └── sort_menu_bg.xml │ │ ├── ic_copy.xml │ │ ├── layout-v26 │ │ ├── autofill_cta_presentation.xml │ │ └── autofill_item.xml │ │ ├── layout │ │ ├── activity_autofill.xml │ │ ├── activity_root.xml │ │ ├── fragment_account_setting.xml │ │ ├── fragment_autofill_filter.xml │ │ ├── fragment_autofill_onboarding.xml │ │ ├── fragment_create_item.xml │ │ ├── fragment_display_item.xml │ │ ├── fragment_edit_item.xml │ │ ├── fragment_filter.xml │ │ ├── fragment_fingerprint_dialog.xml │ │ ├── fragment_fingerprint_onboarding.xml │ │ ├── fragment_fxa_login.xml │ │ ├── fragment_item_list.xml │ │ ├── fragment_locked.xml │ │ ├── fragment_onboarding_confirmation.xml │ │ ├── fragment_setting.xml │ │ ├── fragment_warning.xml │ │ ├── fragment_webview.xml │ │ ├── fragment_welcome.xml │ │ ├── include_backable.xml │ │ ├── include_backable_filter.xml │ │ ├── include_welcome.xml │ │ ├── list_cell_item.xml │ │ ├── list_cell_no_entries.xml │ │ ├── list_cell_no_entries_found.xml │ │ ├── list_cell_no_matching.xml │ │ ├── list_cell_setting_appversion.xml │ │ ├── list_cell_setting_header.xml │ │ ├── list_cell_setting_text.xml │ │ ├── list_cell_setting_toggle.xml │ │ ├── nav_header.xml │ │ └── toast_view.xml │ │ ├── menu │ │ ├── item_detail_menu.xml │ │ └── nav_menu.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── navigation │ │ ├── graph_autofill.xml │ │ └── graph_main.xml │ │ ├── values-cs │ │ └── strings.xml │ │ ├── values-de │ │ └── strings.xml │ │ ├── values-en-rGB │ │ └── strings.xml │ │ ├── values-es │ │ └── strings.xml │ │ ├── values-fr │ │ └── strings.xml │ │ ├── values-it │ │ └── strings.xml │ │ ├── values-ru │ │ └── strings.xml │ │ ├── values-uk │ │ └── strings.xml │ │ ├── values-vi │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ └── strings.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ic_launcher_background.xml │ │ ├── non_localizable_strings.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ ├── java │ └── mozilla │ │ └── lockbox │ │ ├── DispatcherTest.kt │ │ ├── DisposingTest.kt │ │ ├── LockboxBroadcastReceiverTest.kt │ │ ├── ObservableExtensionTest.kt │ │ ├── StackReplaySubjectTest.kt │ │ ├── TestConsumer.kt │ │ ├── action │ │ └── SettingActionTest.kt │ │ ├── adapter │ │ ├── ItemListAdapterTest.kt │ │ ├── ListAdapterTestHelper.kt │ │ ├── SectionedAdapterTest.kt │ │ ├── SettingListAdapterTest.kt │ │ └── SortItemAdapterTest.kt │ │ ├── autofill │ │ ├── AutofillTests.kt │ │ ├── FillResponseBuilderTest.kt │ │ └── IntentBuilderTest.kt │ │ ├── extensions │ │ ├── ConnectivityManagerTest.kt │ │ ├── Observer+.kt │ │ └── ServerPasswordExtensionTest.kt │ │ ├── mocks │ │ └── MockLoginsStorage.kt │ │ ├── presenter │ │ ├── AccountSettingPresenterTest.kt │ │ ├── AppFilterPresenterTest.kt │ │ ├── AppLockedPresenterTest.kt │ │ ├── AppRoutePresenterTest.kt │ │ ├── AppWebPageActionPresenterTest.kt │ │ ├── ApplicationPresenterTest.kt │ │ ├── AutofillFilterPresenterTest.kt │ │ ├── AutofillLockedPresenterTest.kt │ │ ├── AutofillOnboardingPresenterTest.kt │ │ ├── AutofillRoutePresenterTest.kt │ │ ├── CreateItemPresenterTest.kt │ │ ├── DisplayItemPresenterTest.kt │ │ ├── EditItemPresenterTest.kt │ │ ├── FilterPresenterTest.kt │ │ ├── FingerprintDialogPresenterTest.kt │ │ ├── FingerprintOnboardingPresenterTest.kt │ │ ├── FxALoginPresenterTest.kt │ │ ├── ItemListPresenterTest.kt │ │ ├── LockedPresenterTest.kt │ │ ├── OnboardingConfirmationPresenterTest.kt │ │ ├── RoutePresenterTest.kt │ │ ├── ServerPasswordTestHelper.kt │ │ ├── SettingPresenterTest.kt │ │ ├── TestApplication.kt │ │ └── WelcomePresenterTest.kt │ │ ├── store │ │ ├── AccountStoreTest.kt │ │ ├── AutofillStoreTest.kt │ │ ├── ClipboardStoreTest.kt │ │ ├── DataStoreTest.kt │ │ ├── DisplayItemStoreTest.kt │ │ ├── FingerprintStoreTest.kt │ │ ├── GleanTelemetryStoreTest.kt │ │ ├── LifecycleStoreTest.kt │ │ ├── LockedStoreTest.kt │ │ ├── NetworkStoreTest.kt │ │ ├── RouteStoreTest.kt │ │ ├── SentryStoreTest.kt │ │ ├── SettingStoreTest.kt │ │ └── TelemetryStoreTest.kt │ │ └── support │ │ ├── AutofillTextValueBuilderTest.kt │ │ ├── ClipboardSupportTest.kt │ │ ├── FxASyncDataStoreSupportTest.kt │ │ ├── ParsedStructureTest.kt │ │ ├── PublicSuffixSupportTest.kt │ │ ├── SecurePreferencesTest.kt │ │ ├── SimpleFileReaderTest.kt │ │ └── TimingSupportTest.kt │ └── resources │ ├── mockito-extensions │ └── org.mockito.plugins.MockMaker │ └── robolectric.properties ├── build.gradle ├── codecov.yml ├── docs ├── CODEOWNERS ├── L10nScreenshotsTests.md ├── SECURITY.md ├── accessibility.md ├── add_image_assets.md ├── architecture │ ├── autofill.md │ ├── flux.md │ └── sec-apis.md ├── contributing.md ├── glean │ └── metrics.md ├── index.md ├── install.md ├── metrics.md ├── release-notes.md ├── releases.md └── test-plan.md ├── fastlane └── Screengrabfile ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── l10n.toml ├── mkdocs.yml ├── settings.gradle └── thirdparty ├── .gitignore ├── README.md ├── build.gradle ├── proguard-rules.pro └── src └── main ├── AndroidManifest.xml ├── java ├── com │ └── github │ │ └── magiepooh │ │ └── recycleritemdecoration │ │ ├── ItemDecorations.java │ │ └── VerticalItemDecoration.java └── jp │ └── wasabeef │ └── picasso │ └── transformations │ └── CropCircleTransformation.java └── res └── values └── strings.xml /.github/ISSUE_TEMPLATE/---bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F41E Bug report" 3 | about: Create a report to help us improve 4 | labels: "defect" 5 | 6 | --- 7 | 8 | ## Steps to reproduce 9 | 10 | ### Expected behavior 11 | 12 | ### Actual behavior 13 | 14 | ### Device & build information 15 | * Device: ? 16 | * Build version: ? 17 | ### Notes 18 | Attachments: 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/---chore.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "🧶 Chore" 3 | about: Tech debt, developer ergonomics, tooling, etc. 4 | labels: "chore" 5 | 6 | --- 7 | 8 | ### Vision statement / What / Requirements 9 | 10 | ### Impact 11 | 12 | ### Acceptance criteria 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/---feature.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "⭐️ Feature request" 3 | about: Suggest an idea for this project 4 | labels: "enhancement" 5 | 6 | --- 7 | 8 | ### Why/User Benefit/User Problem 9 | 10 | ### Acceptance Criteria (how do I know when I’m done?) 11 | 12 | ### Not included 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/--user-story.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F469\U0001F3FB‍\U0001F4BB User Story" 3 | about: Create a user story for an epic 4 | title: "" 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | ## User Story 10 | - As a user, I want … so I can do … 11 | 12 | ## Dependencies 13 | - List dependencies on other issues/teams etc. 14 | 15 | ### Acceptance Criteria 16 | - I can do … (e.g. add a bookmark) 17 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | Fixes #??? 2 | 3 | _(**Required**: this reference (one or many) will be closed upon merge. Ideally it has the acceptance criteria and designs for features or fixes related to the work in this Pull Request.)_ 4 | 5 | Connected to #??? 6 | 7 | _(Optional: other issues or pull requests related to this, but merging should not close it)_ 8 | 9 | ## Testing and Review Notes 10 | 11 | _(**Required**: steps to take to confirm this works as expected or other guidance for code, UX, and any other reviewers)_ 12 | 13 | 14 | ## Screenshots or Videos 15 | 16 | _(Optional: to clearly demonstrate the feature or fix to help with testing and reviews)_ 17 | 18 | 19 | ## To Do 20 | 21 | - add “WIP” to the PR title if pushing up but not complete nor ready for review 22 | - [ ] double check the original issue to confirm it is fully satisfied 23 | - [ ] add testing notes and screenshots in PR description to help guide reviewers 24 | - [ ] add unit tests 25 | - optional: consider adding instrumentation (integration/UI) tests 26 | - consider running this branch in a debug simulator and check for memory leak notifications or any warnings 27 | - [ ] request the "UX" team perform a design review (if/when applicable) 28 | - [ ] make sure CI builds are passing (e.g.: fix lint and other errors) 29 | - [ ] check on the [accessibility](https://mozilla-lockwise.github.io/lockwise-android/accessibility/) of any added UI 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .DS_Store 5 | /build 6 | /captures 7 | .externalNativeBuild 8 | /site 9 | .idea/assetWizardSettings.xml 10 | .idea/codeStyles/Project.xml 11 | .idea/gradle.xml 12 | .idea/caches 13 | .idea/navEditor.xml 14 | .idea/libraries 15 | .idea/workspace.xml 16 | .idea/modules.xml 17 | .idea/dictionaries/* 18 | .idea/markdown* 19 | .idea/emacs.xml 20 | .idea/misc.xml 21 | 22 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/copyright/MPL_2_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/render.experimental.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Community Participation Guidelines 2 | 3 | This repository is governed by Mozilla's code of conduct and etiquette guidelines. 4 | For more details, please read the 5 | [Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/). 6 | 7 | ## How to Report 8 | For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page. 9 | 10 | 16 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /release 3 | -------------------------------------------------------------------------------- /app/lint-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/metrics.yaml: -------------------------------------------------------------------------------- 1 | # This Source Code Form is subject to the terms of the Mozilla Public 2 | # License, v. 2.0. If a copy of the MPL was not distributed with this 3 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | --- 5 | $schema: moz://mozilla.org/schemas/glean/metrics/1-0-0 6 | 7 | legacy.ids: 8 | client_id: 9 | type: uuid 10 | lifetime: user 11 | description: | 12 | The client id from legacy telemetry. 13 | send_in_pings: 14 | - deletion_request 15 | bugs: 16 | - https://github.com/mozilla-lockwise/lockwise-android/pull/1196 17 | data_reviews: 18 | - https://github.com/mozilla-lockwise/lockwise-android/pull/1196 19 | notification_emails: 20 | - lockwise-dev@mozilla.com 21 | - erichards@mozilla.com 22 | expires: never 23 | -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/AccountSettingRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions.click 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 11 | import mozilla.lockbox.R 12 | 13 | // AccountSettingScreen 14 | class AccountSettingRobot : BaseTestRobot { 15 | override fun exists() = displayed { id(R.id.profileImage) } 16 | 17 | fun tapDisconnect() = click { id(R.id.disconnectButton) } 18 | } 19 | 20 | fun accountSettingScreen(f: AccountSettingRobot.() -> Unit) = AccountSettingRobot().apply(f) 21 | -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/AutofillOnboardingRobot.kt: -------------------------------------------------------------------------------- 1 | package mozilla.lockbox.robots 2 | 3 | import br.com.concretesolutions.kappuccino.actions.ClickActions 4 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions 5 | import mozilla.lockbox.R 6 | 7 | class AutofillOnboardingRobot : BaseTestRobot { 8 | override fun exists() = VisibilityAssertions.displayed { id(R.id.iconAutofill) } 9 | 10 | fun touchGoToSettings() = ClickActions.click { id(R.id.goToSettings) } 11 | 12 | fun tapSkip() = ClickActions.click { id(R.id.skipButton) } 13 | } 14 | fun autofillOnboardingScreen(f: AutofillOnboardingRobot.() -> Unit) = AutofillOnboardingRobot().apply(f) 15 | -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/DeleteCredentialDisclaimerRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions 11 | import mozilla.lockbox.R 12 | 13 | // DeleteCredentialDisclaimer 14 | class DeleteCredentialDisclaimerRobot : BaseTestRobot { 15 | 16 | override fun exists() = VisibilityAssertions.displayed { id(R.id.alertTitle) } 17 | 18 | fun tapCancelButton() = ClickActions.click { text(R.string.cancel) } 19 | fun tapDeleteButton() = ClickActions.click { text("DELETE") } 20 | } 21 | 22 | fun deleteCredentialDisclaimer(f: DeleteCredentialDisclaimerRobot.() -> Unit) = DeleteCredentialDisclaimerRobot().apply(f) -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/DisconnectDisclaimerRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions.click 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 11 | import mozilla.lockbox.R 12 | 13 | // DisconnectDisclaimer 14 | class DisconnectDisclaimerRobot : BaseTestRobot { 15 | override fun exists() = displayed { text(R.string.disconnect) } 16 | 17 | fun tapDisconnect() = click { text("Disconnect Lockwise") } 18 | fun acceptDisconnect() = click { text("Disconnect") } 19 | 20 | fun cancel() = click { text(R.string.cancel) } 21 | } 22 | 23 | fun disconnectDisclaimer(f: DisconnectDisclaimerRobot.() -> Unit) = DisconnectDisclaimerRobot().apply(f) 24 | -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/EditCredentialDisclaimerRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions 11 | import mozilla.lockbox.R 12 | 13 | // EditCredentialDisclaimer 14 | class EditCredentialDisclaimerRobot : BaseTestRobot { 15 | 16 | override fun exists() = VisibilityAssertions.displayed { id(R.id.alertTitle) } 17 | 18 | fun tapCancelButton() = ClickActions.click { id(android.R.id.button2) } 19 | fun tapDiscardButton() = ClickActions.click { id(android.R.id.button1) } 20 | } 21 | 22 | fun editCredentialDisclaimer(f: EditCredentialDisclaimerRobot.() -> Unit) = EditCredentialDisclaimerRobot().apply(f) -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/FilteredItemListRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.TextActions.typeText 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 11 | import mozilla.lockbox.R 12 | 13 | // SearchFallback ItemList 14 | class FilteredItemListRobot : BaseTestRobot { 15 | override fun exists() = displayed { id(R.id.filterField) } 16 | 17 | fun typeFilterText(text: String) = typeText(text) { id(R.id.filterField) } 18 | 19 | fun selectItem(position: Int = 0) = clickListItem(R.id.entriesView, position) 20 | } 21 | 22 | fun filteredItemList(f: FilteredItemListRobot.() -> Unit) = FilteredItemListRobot().apply(f) -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/FingerprintDialogRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions.click 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 11 | import mozilla.lockbox.R 12 | 13 | // Fingerprint Dialog 14 | class FingerprintDialogRobot : BaseTestRobot { 15 | override fun exists() = displayed { id(R.id.fingerprintStatus) } 16 | 17 | fun touchFingerprint(finger: String = "1") { 18 | Runtime.getRuntime().exec("adb -e emu finger $finger") 19 | } 20 | 21 | fun tapCancel() = click { id(R.id.cancel) } 22 | } 23 | fun fingerprintDialog(f: FingerprintDialogRobot.() -> Unit) = FingerprintDialogRobot().apply(f) 24 | -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/FingerprintOnboardingRobot.kt: -------------------------------------------------------------------------------- 1 | package mozilla.lockbox.robots 2 | 3 | import br.com.concretesolutions.kappuccino.actions.ClickActions 4 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions 5 | import mozilla.lockbox.R 6 | 7 | class FingerprintOnboardingRobot : BaseTestRobot { 8 | override fun exists() = VisibilityAssertions.displayed { id(R.id.iconFingerprint) } 9 | 10 | fun touchFingerprint(finger: String = "1") { 11 | Runtime.getRuntime().exec("adb -e emu finger $finger") 12 | } 13 | 14 | fun tapSkip() = ClickActions.click { id(R.id.skipButton) } 15 | } 16 | fun fingerprintOnboardingScreen(f: FingerprintOnboardingRobot.() -> Unit) = FingerprintOnboardingRobot().apply(f) 17 | -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/FxALoginRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions.click 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 11 | import mozilla.lockbox.R 12 | 13 | // FxALogin 14 | class FxALoginRobot : BaseTestRobot { 15 | override fun exists() = 16 | displayed { id(R.id.webView) } 17 | 18 | fun tapPlaceholderLogin() = 19 | click { id(R.id.skipFxA) } 20 | } 21 | 22 | fun fxaLogin(f: FxALoginRobot.() -> Unit) = FxALoginRobot().apply(f) -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/KebabMenuRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions 11 | import mozilla.lockbox.R 12 | 13 | // KebabMenu 14 | class KebabMenuRobot : BaseTestRobot { 15 | override fun exists() = VisibilityAssertions.displayed { text("Delete") } 16 | 17 | fun tapEditButton() = ClickActions.click { text(R.string.edit) } 18 | fun tapDeleteButton() = ClickActions.click { text(R.string.delete) } 19 | } 20 | 21 | fun kebabMenu(f: KebabMenuRobot.() -> Unit) = KebabMenuRobot().apply(f) 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/LockScreenRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions.click 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 11 | import mozilla.lockbox.R 12 | 13 | // LockScreen 14 | class LockScreenRobot : BaseTestRobot { 15 | override fun exists() = displayed { id(R.id.unlockButton) } 16 | 17 | fun promptFingerprint() = click { id(R.id.unlockButton) } 18 | } 19 | 20 | fun lockScreen(f: LockScreenRobot.() -> Unit) = LockScreenRobot().apply(f) -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/OnboardingConfirmationRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions.click 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 11 | import mozilla.lockbox.R 12 | 13 | class OnboardingConfirmationRobot : BaseTestRobot { 14 | override fun exists() = displayed { text(R.string.all_set) } 15 | 16 | fun clickFinish() = click { id(R.id.finishButton) } 17 | } 18 | 19 | fun onboardingConfirmationScreen(f: OnboardingConfirmationRobot.() -> Unit) = OnboardingConfirmationRobot().apply(f) -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/SecurityDisclaimerRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions.click 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 11 | import mozilla.lockbox.R 12 | 13 | // SecurityDisclaimer 14 | class SecurityDisclaimerRobot : BaseTestRobot { 15 | override fun exists() = displayed { text(R.string.no_device_security_title) } 16 | 17 | fun tapSetUp() = click { text(R.string.set_up_security_button) } 18 | 19 | fun cancel() = click { text(R.string.cancel) } 20 | } 21 | 22 | fun securityDisclaimer(f: SecurityDisclaimerRobot.() -> Unit) = SecurityDisclaimerRobot().apply(f) 23 | -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/SettingsRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 10 | import mozilla.lockbox.R 11 | 12 | // Settings 13 | class SettingsRobot : BaseTestRobot { 14 | override fun exists() = displayed { id(R.id.settingList) } 15 | } 16 | 17 | fun settings(f: SettingsRobot.() -> Unit) = SettingsRobot().apply(f) -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/UIComponentRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions.click 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 11 | import mozilla.lockbox.R 12 | 13 | // Fingerprint Dialog 14 | class UIComponentRobot : BaseTestRobot { 15 | override fun exists() = displayed { id(R.id.uiComponents) } 16 | 17 | fun launchFingerprintDialog() = click { id(R.id.button_launch_fingerprint) } 18 | 19 | fun launchEnableFingerprintDialog() = click { id(R.id.button_enable_fingerprint) } 20 | } 21 | 22 | fun uiComponents(f: UIComponentRobot.() -> Unit) = UIComponentRobot().apply(f) -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/robots/WelcomeRobot.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.robots 8 | 9 | import br.com.concretesolutions.kappuccino.actions.ClickActions.click 10 | import br.com.concretesolutions.kappuccino.assertions.VisibilityAssertions.displayed 11 | import kotlinx.android.synthetic.main.mtrl_alert_dialog_actions.view.* 12 | import mozilla.lockbox.R 13 | 14 | class WelcomeRobot : BaseTestRobot { 15 | override fun exists() = displayed { id(R.id.buttonGetStartedManually) } 16 | 17 | fun tapGetStarted() = click { id(R.id.buttonGetStartedManually) } 18 | 19 | fun tapSkipSecureYourDevice() = click { id(android.R.id.button2) } 20 | } 21 | 22 | fun welcome(f: WelcomeRobot.() -> Unit) = WelcomeRobot().apply(f) -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/screenshots/ScreengrabTest.java: -------------------------------------------------------------------------------- 1 | package mozilla.lockbox.screenshots; 2 | 3 | 4 | import androidx.test.ext.junit.runners.AndroidJUnit4; 5 | import androidx.test.rule.ActivityTestRule; 6 | import kotlin.jvm.JvmField; 7 | import mozilla.lockbox.view.RootActivity; 8 | 9 | 10 | import org.junit.ClassRule; 11 | import org.junit.Rule; 12 | import org.junit.Test; 13 | import org.junit.runner.RunWith; 14 | 15 | import tools.fastlane.screengrab.locale.LocaleTestRule; 16 | 17 | 18 | @RunWith(AndroidJUnit4.class) 19 | public class ScreengrabTest { 20 | @ClassRule public static final LocaleTestRule localeTestRule = new LocaleTestRule(); 21 | 22 | @Rule @JvmField 23 | public ActivityTestRule activityRule = new ActivityTestRule<>(RootActivity.class); 24 | 25 | @Test 26 | public void testTakeScreenshot() { 27 | //Workaround to so that the screenshot test in ScreenshotsTest suite works 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/androidTest/java/mozilla/lockbox/uiTests/LockboxAutofillServiceTest.kt: -------------------------------------------------------------------------------- 1 | package mozilla.lockbox.uiTests 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.rule.ServiceTestRule 5 | import kotlinx.coroutines.ExperimentalCoroutinesApi 6 | import mozilla.lockbox.LockboxAutofillService 7 | import mozilla.lockbox.flux.Dispatcher 8 | import org.junit.After 9 | import org.junit.Before 10 | import org.junit.Ignore 11 | import org.junit.Rule 12 | import org.junit.runner.RunWith 13 | 14 | @RunWith(AndroidJUnit4::class) 15 | @ExperimentalCoroutinesApi 16 | @Ignore("589-UItests-update (#590)") 17 | class LockboxAutofillServiceTest { 18 | 19 | private val dispatcher = Dispatcher() 20 | 21 | @get:Rule 22 | val serviceRule = ServiceTestRule() 23 | 24 | lateinit var subject: LockboxAutofillService 25 | 26 | @Before 27 | fun setUp() { 28 | subject = LockboxAutofillService(dispatcher = dispatcher) 29 | subject.onConnected() 30 | } 31 | 32 | @After 33 | fun tearDown() { 34 | subject.onDisconnected() 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/debug/assets/fixtures/app_facebook.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/debug/assets/fixtures/html_facebook.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 |
15 |
16 |
17 | -------------------------------------------------------------------------------- /app/src/debug/assets/fixtures/html_fxa.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/debug/assets/fixtures/html_fxa.xml -------------------------------------------------------------------------------- /app/src/debug/assets/fixtures/html_gmail_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /app/src/debug/assets/fixtures/html_gmail_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /app/src/debug/assets/fixtures/html_twitter.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 |
15 |
16 |
17 | -------------------------------------------------------------------------------- /app/src/debug/assets/fixtures/test_basic.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/debug/assets/fixtures/test_basic_html_inputs.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 |
9 | 10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /app/src/debug/assets/fixtures/test_labelled_edittexts.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/debug/assets/fixtures/test_labelled_html_inputs.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 |
9 |
15 | -------------------------------------------------------------------------------- /app/src/debug/java/mozilla/lockbox/view/UITestActivity.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.view 8 | 9 | import android.os.Bundle 10 | import android.view.View 11 | import androidx.appcompat.app.AppCompatActivity 12 | import mozilla.lockbox.R 13 | import mozilla.lockbox.log 14 | 15 | class UITestActivity : AppCompatActivity() { 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | setContentView(R.layout.activity_test) 19 | } 20 | 21 | fun launchFingerprint(@Suppress("UNUSED_PARAMETER") view: View) { 22 | val dialogFragment = FingerprintAuthDialogFragment() 23 | val fragmentManager = this.supportFragmentManager 24 | try { 25 | dialogFragment.show(fragmentManager, dialogFragment.javaClass.name) 26 | dialogFragment.setupDialog( 27 | R.string.enable_fingerprint_dialog_title, 28 | R.string.enable_fingerprint_dialog_subtitle 29 | ) 30 | } catch (e: IllegalStateException) { 31 | log.error("Could not show dialog", e) 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | UI Components 9 | Launch Fingerprint 10 | Enable Fingerprint 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/action/AccountAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.action 8 | 9 | import mozilla.components.service.fxa.sharing.ShareableAccount 10 | import mozilla.lockbox.flux.Action 11 | 12 | sealed class AccountAction : Action { 13 | object Reset : AccountAction() 14 | object UseTestData : AccountAction() 15 | data class OauthRedirect(val url: String) : AccountAction() 16 | data class AutomaticLogin(val account: ShareableAccount) : AccountAction() 17 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/action/AutofillAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.action 8 | 9 | import mozilla.appservices.logins.ServerPassword 10 | 11 | sealed class AutofillAction( 12 | override val eventMethod: TelemetryEventMethod, 13 | override val eventObject: TelemetryEventObject 14 | ) : TelemetryAction { 15 | data class Complete(val login: ServerPassword) : AutofillAction(TelemetryEventMethod.autofill_single, TelemetryEventObject.autofill) 16 | data class CompleteMultiple(val logins: List) : AutofillAction(TelemetryEventMethod.autofill_multiple, TelemetryEventObject.autofill) 17 | data class Error(val error: Throwable) : AutofillAction(TelemetryEventMethod.autofill_error, TelemetryEventObject.autofill) 18 | object SearchFallback : AutofillAction(TelemetryEventMethod.autofill_filter, TelemetryEventObject.autofill) 19 | object Authenticate : AutofillAction(TelemetryEventMethod.autofill_locked, TelemetryEventObject.autofill) 20 | object Cancel : AutofillAction(TelemetryEventMethod.autofill_cancel, TelemetryEventObject.autofill) 21 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/action/ClipboardAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.action 8 | 9 | sealed class ClipboardAction( 10 | override val eventMethod: TelemetryEventMethod, 11 | override val eventObject: TelemetryEventObject 12 | ) : TelemetryAction { 13 | data class CopyUsername(val username: String) : ClipboardAction(TelemetryEventMethod.tap, TelemetryEventObject.entry_copy_username_button) 14 | data class CopyPassword(val password: String) : ClipboardAction(TelemetryEventMethod.tap, TelemetryEventObject.entry_copy_password_button) 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/action/FingerprintAuthAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.action 8 | 9 | import mozilla.lockbox.flux.Action 10 | 11 | sealed class FingerprintAuthAction : Action { 12 | object OnSuccess : FingerprintAuthAction() 13 | object OnError : FingerprintAuthAction() 14 | object OnCancel : FingerprintAuthAction() 15 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/action/FingerprintSensorAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.action 8 | 9 | import mozilla.lockbox.flux.Action 10 | 11 | sealed class FingerprintSensorAction : Action { 12 | object Start : FingerprintSensorAction() 13 | object Stop : FingerprintSensorAction() 14 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/action/NetworkAction.kt: -------------------------------------------------------------------------------- 1 | package mozilla.lockbox.action 2 | 3 | import mozilla.lockbox.flux.Action 4 | 5 | sealed class NetworkAction : Action { 6 | object CheckConnectivity : NetworkAction() 7 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/action/SentryAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.action 8 | 9 | import mozilla.lockbox.flux.Action 10 | 11 | data class SentryAction( 12 | val error: Throwable 13 | ) : Action -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/action/UnlockingAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.action 8 | 9 | import mozilla.lockbox.flux.Action 10 | 11 | class UnlockingAction(val currently: Boolean) : Action -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/autofill/AutofillTextValueBuilder.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.autofill 8 | 9 | import android.app.assist.AssistStructure.ViewNode 10 | import android.view.autofill.AutofillId 11 | 12 | data class AutofillTextValue( 13 | val username: String?, 14 | val password: String? 15 | ) 16 | 17 | class AutofillTextValueBuilder( 18 | private val parsedStructure: ParsedStructure, 19 | private val navigator: AutofillNodeNavigator 20 | ) { 21 | fun build(): AutofillTextValue { 22 | val usernameText = textForAutofillId(parsedStructure.usernameId) 23 | val passwordText = textForAutofillId(parsedStructure.passwordId) 24 | 25 | return AutofillTextValue(usernameText, passwordText) 26 | } 27 | 28 | private fun textForAutofillId(id: AutofillId?): String? { 29 | return navigator.findFirst { 30 | if (navigator.autofillId(it) == id) { 31 | navigator.currentText(it) 32 | } else { 33 | null 34 | } 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/extensions/ConnectivityManager+.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.extensions 8 | 9 | import android.net.ConnectivityManager 10 | import android.net.Network 11 | import android.net.NetworkCapabilities 12 | import android.os.Build 13 | 14 | /** 15 | * Checks for availability of network. 16 | * 17 | * For devices above [Build.VERSION_CODES.M] it even checks if there's internet flowing through it or not. 18 | * */ 19 | fun ConnectivityManager.isOnline(network: Network): Boolean { 20 | return getNetworkCapabilities(network)?.let { 21 | it.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && 22 | it.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) 23 | } ?: false 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/flux/Action.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.flux 8 | 9 | interface Action -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/flux/Dispatcher.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.flux 8 | 9 | import io.reactivex.Observable 10 | import io.reactivex.subjects.PublishSubject 11 | 12 | class Dispatcher { 13 | companion object { 14 | val shared = Dispatcher() 15 | } 16 | 17 | private val actionSubject = PublishSubject.create() 18 | 19 | val register: Observable = this.actionSubject 20 | 21 | fun dispatch(action: Action) { 22 | this.actionSubject.onNext(action) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/flux/Presenter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.flux 8 | 9 | import androidx.annotation.CallSuper 10 | import io.reactivex.disposables.CompositeDisposable 11 | 12 | abstract class Presenter { 13 | val compositeDisposable: CompositeDisposable = CompositeDisposable() 14 | 15 | open fun onViewReady() { 16 | // NOOP 17 | } 18 | 19 | @CallSuper 20 | open fun onDestroy() { 21 | compositeDisposable.clear() 22 | } 23 | 24 | @CallSuper 25 | open fun onResume() { 26 | // NOOP 27 | } 28 | 29 | @CallSuper 30 | open fun onPause() { 31 | // NOOP 32 | } 33 | 34 | @CallSuper 35 | fun onStop() { 36 | // NOOP 37 | } 38 | 39 | /** 40 | * Called by the fragment when the back button is pressed. 41 | * 42 | * @return `true` if the back button event has been handled by the presenter. 43 | * By default, returns false, in which case Android handles the event. 44 | */ 45 | open fun onBackPressed(): Boolean = false 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/model/AccountViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.model 8 | 9 | data class AccountViewModel( 10 | val accountName: String?, 11 | val displayEmailName: String?, 12 | val avatarFromURL: String? 13 | ) -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/model/DialogViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.model 8 | 9 | import androidx.annotation.StringRes 10 | 11 | data class DialogViewModel( 12 | @StringRes val title: Int? = null, 13 | @StringRes val message: Int? = null, 14 | @StringRes val positiveButtonTitle: Int? = null, 15 | @StringRes val negativeButtonTitle: Int? = null, 16 | val isDestructive: Boolean = false 17 | ) -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/model/ItemDetailViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.model 8 | 9 | data class ItemDetailViewModel( 10 | val id: String, 11 | val title: String, 12 | val hostname: String, 13 | val username: String?, 14 | val password: String 15 | ) { 16 | val hasUsername: Boolean 17 | get() = !username.isNullOrBlank() 18 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/model/ItemViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.model 8 | 9 | data class ItemViewModel( 10 | val title: String, 11 | val subtitle: String, 12 | val id: String 13 | ) -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/model/ModelUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.model 8 | 9 | fun titleFromHostname(hostname: String): String { 10 | return hostname 11 | .replace(Regex("^http://"), "") 12 | .replace(Regex("^https://"), "") 13 | .replace(Regex("^www\\d*\\."), "") 14 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/model/ToastNotificationViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.model 8 | 9 | import androidx.annotation.DrawableRes 10 | import androidx.annotation.StringRes 11 | 12 | data class ToastNotificationViewModel( 13 | @StringRes val message: Int, 14 | @DrawableRes val icon: Int, 15 | val messageParam: String? = null 16 | ) -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/presenter/AppFilterPresenter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.presenter 8 | 9 | import io.reactivex.Observable 10 | import kotlinx.coroutines.ExperimentalCoroutinesApi 11 | import mozilla.lockbox.action.RouteAction 12 | import mozilla.lockbox.flux.Action 13 | import mozilla.lockbox.flux.Dispatcher 14 | import mozilla.lockbox.model.ItemViewModel 15 | import mozilla.lockbox.store.DataStore 16 | 17 | @ExperimentalCoroutinesApi 18 | open class AppFilterPresenter( 19 | override val view: FilterView, 20 | override val dispatcher: Dispatcher = Dispatcher.shared, 21 | override val dataStore: DataStore = DataStore.shared 22 | ) : FilterPresenter(view, dispatcher, dataStore) { 23 | override fun Observable.itemSelectionActionMap(): Observable { 24 | return this.map { RouteAction.DisplayItem(it.id) } 25 | } 26 | 27 | override fun Observable>>.itemListMap(): Observable> { 28 | return this.map { it.second } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/presenter/AppWebPagePresenter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.presenter 8 | 9 | import io.reactivex.functions.Consumer 10 | import io.reactivex.rxkotlin.addTo 11 | import mozilla.lockbox.flux.Dispatcher 12 | import mozilla.lockbox.flux.Presenter 13 | import mozilla.lockbox.store.NetworkStore 14 | 15 | interface WebPageView { 16 | var webViewObserver: Consumer? 17 | // val retryNetworkConnectionClicks: Observable 18 | fun handleNetworkError(networkErrorVisibility: Boolean) 19 | fun loadURL(url: String) 20 | } 21 | 22 | class AppWebPagePresenter( 23 | val view: WebPageView, 24 | val url: String?, 25 | private val networkStore: NetworkStore = NetworkStore.shared, 26 | private val dispatcher: Dispatcher = Dispatcher.shared 27 | ) : Presenter() { 28 | 29 | override fun onViewReady() { 30 | networkStore.isConnected 31 | .subscribe(view::handleNetworkError) 32 | .addTo(compositeDisposable) 33 | 34 | // view.retryNetworkConnectionClicks.subscribe { 35 | // dispatcher.dispatch(NetworkAction.CheckConnectivity) 36 | // }?.addTo(compositeDisposable) 37 | 38 | view.loadURL(url!!) 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/presenter/ApplicationPresenter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.presenter 8 | 9 | import androidx.lifecycle.DefaultLifecycleObserver 10 | import androidx.lifecycle.LifecycleOwner 11 | import mozilla.lockbox.action.LifecycleAction 12 | import mozilla.lockbox.flux.Dispatcher 13 | 14 | class ApplicationPresenter( 15 | val dispatcher: Dispatcher = Dispatcher.shared 16 | ) : DefaultLifecycleObserver { 17 | override fun onCreate(owner: LifecycleOwner) { 18 | dispatcher.dispatch(LifecycleAction.Startup) 19 | } 20 | 21 | override fun onPause(owner: LifecycleOwner) { 22 | dispatcher.dispatch(LifecycleAction.Background) 23 | } 24 | 25 | override fun onResume(owner: LifecycleOwner) { 26 | dispatcher.dispatch(LifecycleAction.Foreground) 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/presenter/AutofillFilterBackdropPresenter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.presenter 8 | 9 | import io.reactivex.Observable 10 | import io.reactivex.rxkotlin.addTo 11 | import mozilla.lockbox.action.RouteAction 12 | import mozilla.lockbox.flux.Dispatcher 13 | import mozilla.lockbox.flux.Presenter 14 | import java.util.concurrent.TimeUnit 15 | 16 | interface AutofillFilterBackdropView 17 | 18 | class AutofillFilterBackdropPresenter( 19 | val view: AutofillFilterBackdropView, 20 | private val dispatcher: Dispatcher = Dispatcher.shared 21 | ) : Presenter() { 22 | override fun onViewReady() { 23 | Observable.just(RouteAction.DialogFragment.AutofillSearchDialog) 24 | .delay(1, TimeUnit.SECONDS) 25 | .subscribe(dispatcher::dispatch) 26 | .addTo(compositeDisposable) 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/presenter/AutofillLockedPresenter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.presenter 8 | 9 | import io.reactivex.Observable 10 | import mozilla.lockbox.flux.Dispatcher 11 | import mozilla.lockbox.store.FingerprintStore 12 | import mozilla.lockbox.store.LockedStore 13 | import mozilla.lockbox.store.SettingStore 14 | 15 | open class AutofillLockedPresenter( 16 | lockedView: LockedView, 17 | override val dispatcher: Dispatcher = Dispatcher.shared, 18 | override val fingerprintStore: FingerprintStore = FingerprintStore.shared, 19 | override val lockedStore: LockedStore = LockedStore.shared, 20 | open val settingStore: SettingStore = SettingStore.shared 21 | ) : LockedPresenter(lockedView, dispatcher, fingerprintStore, lockedStore) { 22 | 23 | override fun Observable.unlockAuthenticationObservable(): Observable { 24 | return this.flatMap { settingStore.unlockWithFingerprint.take(1) } 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/presenter/BackablePresenter.kt: -------------------------------------------------------------------------------- 1 | package mozilla.lockbox.presenter 2 | 3 | import androidx.annotation.CallSuper 4 | import io.reactivex.Observable 5 | import io.reactivex.rxkotlin.addTo 6 | import mozilla.lockbox.action.RouteAction 7 | import mozilla.lockbox.flux.Dispatcher 8 | import mozilla.lockbox.flux.Presenter 9 | 10 | interface BackableView { 11 | val backButtonClicks: Observable 12 | } 13 | 14 | class BackablePresenter( 15 | val view: BackableView, 16 | val dispatcher: Dispatcher = Dispatcher.shared 17 | ) : Presenter() { 18 | @CallSuper 19 | override fun onViewReady() { 20 | view.backButtonClicks 21 | .subscribe { 22 | dispatcher.dispatch(RouteAction.InternalBack) 23 | } 24 | .addTo(compositeDisposable) 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/presenter/OnboardingConfirmationPresenter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.presenter 8 | 9 | import io.reactivex.Observable 10 | import io.reactivex.rxkotlin.addTo 11 | import mozilla.lockbox.action.OnboardingStatusAction 12 | import mozilla.lockbox.flux.Dispatcher 13 | import mozilla.lockbox.flux.Presenter 14 | 15 | interface OnboardingConfirmationView { 16 | val finishClicks: Observable 17 | } 18 | 19 | class OnboardingConfirmationPresenter( 20 | val view: OnboardingConfirmationView, 21 | val dispatcher: Dispatcher = Dispatcher.shared 22 | ) : Presenter() { 23 | override fun onViewReady() { 24 | view.finishClicks 25 | .map { OnboardingStatusAction(false) } 26 | .subscribe(dispatcher::dispatch) 27 | .addTo(compositeDisposable) 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/store/AutofillStore.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.store 8 | 9 | import mozilla.lockbox.action.AutofillAction 10 | import mozilla.lockbox.extensions.filterByType 11 | import mozilla.lockbox.flux.Dispatcher 12 | 13 | open class AutofillStore( 14 | val dispatcher: Dispatcher = Dispatcher.shared 15 | ) { 16 | companion object { 17 | val shared = AutofillStore() 18 | } 19 | 20 | open val autofillActions = dispatcher.register 21 | .filterByType(AutofillAction::class.java) 22 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/store/ContextStore.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.store 8 | 9 | import android.content.Context 10 | 11 | interface ContextStore { 12 | fun injectContext(context: Context) 13 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/store/LifecycleStore.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.store 8 | 9 | import io.reactivex.Observable 10 | import mozilla.lockbox.action.LifecycleAction 11 | import mozilla.lockbox.extensions.filterByType 12 | import mozilla.lockbox.flux.Dispatcher 13 | 14 | open class LifecycleStore( 15 | val dispatcher: Dispatcher = Dispatcher.shared 16 | ) { 17 | companion object { 18 | val shared = LifecycleStore() 19 | } 20 | 21 | open val lifecycleEvents: Observable = 22 | dispatcher.register 23 | .filterByType(LifecycleAction::class.java) 24 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/store/SentryStore.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.store 8 | 9 | import android.content.Context 10 | import io.reactivex.disposables.CompositeDisposable 11 | import io.reactivex.rxkotlin.addTo 12 | import io.sentry.Sentry 13 | import io.sentry.android.AndroidSentryClientFactory 14 | import mozilla.lockbox.action.SentryAction 15 | import mozilla.lockbox.extensions.filterByType 16 | import mozilla.lockbox.flux.Dispatcher 17 | import mozilla.lockbox.support.Constant 18 | 19 | class SentryStore( 20 | dispatcher: Dispatcher = Dispatcher.shared 21 | ) : ContextStore { 22 | private val compositeDisposable = CompositeDisposable() 23 | 24 | companion object { 25 | val shared = SentryStore() 26 | } 27 | 28 | init { 29 | dispatcher.register 30 | .filterByType(SentryAction::class.java) 31 | .map { it.error } 32 | .subscribe { throwable -> 33 | Sentry.getStoredClient().sendException(throwable) 34 | } 35 | .addTo(compositeDisposable) 36 | } 37 | 38 | override fun injectContext(context: Context) { 39 | val sentryDsn = Constant.Sentry.dsn 40 | Sentry.init(sentryDsn, AndroidSentryClientFactory(context)) 41 | } 42 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/AdjustSupport.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.support 8 | 9 | import android.app.Activity 10 | import android.app.Application 11 | import android.os.Bundle 12 | import com.adjust.sdk.Adjust 13 | 14 | open class AdjustSupport { 15 | class AdjustLifecycleCallbacks : Application.ActivityLifecycleCallbacks { 16 | override fun onActivityPaused(activity: Activity?) { 17 | Adjust.onPause() 18 | } 19 | 20 | override fun onActivityResumed(activity: Activity?) { 21 | Adjust.onResume() 22 | } 23 | 24 | override fun onActivityStarted(activity: Activity?) {} 25 | 26 | override fun onActivityDestroyed(activity: Activity?) {} 27 | 28 | override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {} 29 | 30 | override fun onActivityStopped(activity: Activity?) {} 31 | 32 | override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {} 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/ClipboardSupport.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.support 8 | 9 | import android.content.ClipData 10 | import android.content.ClipboardManager 11 | import android.content.Context 12 | import mozilla.lockbox.support.Constant.Common.emptyString 13 | 14 | typealias ClipboardSupportFactory = (Context) -> ClipboardSupport 15 | 16 | open class ClipboardSupport( 17 | context: Context 18 | ) { 19 | private val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 20 | 21 | open fun paste(label: String, value: String) { 22 | clipboard.primaryClip = ClipData.newPlainText(label, value) 23 | } 24 | 25 | open fun clear(dirty: String) { 26 | if (dirty == emptyString) { return } 27 | 28 | val clipData = clipboard.primaryClip?.getItemAt(0) 29 | if (clipData?.text == dirty) { 30 | clipboard.primaryClip = ClipData.newPlainText(emptyString, emptyString) 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/Consumable.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.support 8 | 9 | class Consumable(private val value: T) { 10 | private var consumed = false 11 | 12 | fun get(): T? { 13 | return if (consumed) { 14 | null 15 | } else { 16 | consumed = true 17 | value 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/DataStoreSupport.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.support 8 | 9 | import mozilla.appservices.logins.SyncUnlockInfo 10 | import mozilla.components.service.sync.logins.AsyncLoginsStorage 11 | 12 | interface DataStoreSupport { 13 | val encryptionKey: String 14 | var syncConfig: SyncUnlockInfo? 15 | fun createLoginsStorage(): AsyncLoginsStorage 16 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/DebugSupport.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.support 8 | 9 | import mozilla.lockbox.BuildConfig 10 | 11 | fun isDebug(): Boolean { 12 | return BuildConfig.DEBUG 13 | } 14 | 15 | fun assertOnUiThread(detailMessage: String = "Should be on the UI thread") { 16 | if (isDebug() && !isOnUiThread()) { 17 | throw AssertionError(detailMessage) 18 | } 19 | } 20 | 21 | fun assertNotOnUiThread(detailMessage: String = "Should not be on the UI thread") { 22 | if (isDebug() && isOnUiThread()) { 23 | throw AssertionError(detailMessage) 24 | } 25 | } 26 | 27 | fun isTesting(): Boolean { 28 | try { 29 | Class.forName("org.robolectric.RuntimeEnvironment") 30 | } catch (e: ClassNotFoundException) { 31 | return false 32 | } 33 | return true 34 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/ErrorSupport.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.support 8 | 9 | import mozilla.lockbox.action.SentryAction 10 | import mozilla.lockbox.flux.Dispatcher 11 | import mozilla.lockbox.log 12 | 13 | private val dispatcher: Dispatcher = Dispatcher.shared 14 | 15 | fun pushError(throwable: Throwable, message: String? = null) { 16 | log.error(message) 17 | dispatcher.dispatch(SentryAction(throwable)) 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/FeatureFlagSupport.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.support 8 | 9 | import mozilla.lockbox.BuildConfig 10 | 11 | object FeatureFlagSupport { 12 | const val isDebug = BuildConfig.BUILD_TYPE == "debug" 13 | const val isRelease = BuildConfig.BUILD_TYPE == "release" 14 | val isTesting = isTesting() 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/Optional.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.support 8 | 9 | data class Optional(val value: T?) 10 | fun T?.asOptional(): Optional = Optional(this) -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/SimpleFileReader.kt: -------------------------------------------------------------------------------- 1 | package mozilla.lockbox.support 2 | 3 | import java.io.FileNotFoundException 4 | import java.io.FileReader 5 | 6 | class SimpleFileReader { 7 | @Throws(FileNotFoundException::class) 8 | fun readContents(filePath: String): String { 9 | FileReader(filePath).use { 10 | return it.readText() 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/SystemTimingSupport.kt: -------------------------------------------------------------------------------- 1 | package mozilla.lockbox.support 2 | 3 | import android.os.SystemClock 4 | 5 | interface SystemTimingSupport { 6 | val systemTimeElapsed: Long 7 | val currentTimeMillis: Long 8 | } 9 | 10 | class DeviceSystemTimingSupport : SystemTimingSupport { 11 | companion object { 12 | val shared = DeviceSystemTimingSupport() 13 | } 14 | 15 | override val systemTimeElapsed: Long 16 | get() = SystemClock.elapsedRealtime() 17 | 18 | override val currentTimeMillis: Long 19 | get() = System.currentTimeMillis() 20 | } 21 | 22 | class TestSystemTimingSupport() : SystemTimingSupport { 23 | override var systemTimeElapsed: Long = 0L 24 | override var currentTimeMillis: Long = 0L 25 | 26 | constructor(existing: SystemTimingSupport) : this() { 27 | systemTimeElapsed = existing.systemTimeElapsed 28 | currentTimeMillis = existing.currentTimeMillis 29 | } 30 | 31 | fun advance(time: Long = 1L) { 32 | systemTimeElapsed += time 33 | currentTimeMillis += time 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/UISupport.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.support 8 | 9 | import android.content.Context 10 | import android.os.Looper 11 | 12 | fun isOnUiThread(): Boolean { 13 | return Looper.getMainLooper() == Looper.myLooper() 14 | } 15 | 16 | fun dpToPixels(context: Context, dp: Float): Int { 17 | val metrics = context.resources.displayMetrics 18 | val fpixels = metrics.density * dp 19 | return (fpixels + 0.5f).toInt() 20 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/support/ViewUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | /* 8 | * This Source Code Form is subject to the terms of the Mozilla Public 9 | * License, v. 2.0. If a copy of the MPL was not distributed with this 10 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 11 | */ 12 | 13 | package mozilla.lockbox.support 14 | 15 | import android.view.View 16 | 17 | fun showView(vararg views: View) { 18 | for (view in views) { 19 | view.visibility = View.VISIBLE 20 | } 21 | } 22 | 23 | fun removeView(view: View) { 24 | view.visibility = View.GONE 25 | } 26 | 27 | fun showAndRemove(toShow: S, vararg toRemove: R) { 28 | showView(toShow) 29 | for (view in toRemove) { 30 | if (view != null) { 31 | removeView(view) 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/view/AutofillFilterBackdropFragment.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.view 8 | 9 | import android.os.Bundle 10 | import android.view.LayoutInflater 11 | import android.view.View 12 | import android.view.ViewGroup 13 | import mozilla.lockbox.presenter.AutofillFilterBackdropPresenter 14 | import mozilla.lockbox.presenter.AutofillFilterBackdropView 15 | 16 | class AutofillFilterBackdropFragment : Fragment(), AutofillFilterBackdropView { 17 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { 18 | presenter = AutofillFilterBackdropPresenter(this) 19 | presenter.onViewReady() 20 | return super.onCreateView(inflater, container, savedInstanceState) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/view/AutofillLockedFragment.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.view 8 | 9 | import android.content.Intent 10 | import android.os.Bundle 11 | import io.reactivex.Observable 12 | import io.reactivex.subjects.PublishSubject 13 | import mozilla.lockbox.presenter.AutofillLockedPresenter 14 | import mozilla.lockbox.presenter.LockedView 15 | 16 | class AutofillLockedFragment : Fragment(), LockedView { 17 | override val unlockButtonTaps: Observable? = null 18 | 19 | private val _onActivityResult = PublishSubject.create>() 20 | override val onActivityResult: Observable> get() = _onActivityResult 21 | 22 | override fun onCreate(savedInstanceState: Bundle?) { 23 | super.onCreate(savedInstanceState) 24 | presenter = AutofillLockedPresenter(this) 25 | presenter.onViewReady() 26 | } 27 | 28 | override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 29 | super.onActivityResult(requestCode, resultCode, data) 30 | _onActivityResult.onNext(Pair(requestCode, resultCode)) 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/view/DialogFragment.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.view 8 | 9 | import android.os.Bundle 10 | import android.view.View 11 | import androidx.annotation.StringRes 12 | import mozilla.lockbox.flux.Presenter 13 | import androidx.fragment.app.DialogFragment as AndroidDialogFragment 14 | 15 | open class DialogFragment : AndroidDialogFragment() { 16 | lateinit var presenter: Presenter 17 | 18 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 19 | super.onViewCreated(view, savedInstanceState) 20 | presenter.onViewReady() 21 | } 22 | 23 | override fun onDestroyView() { 24 | super.onDestroyView() 25 | presenter.onDestroy() 26 | } 27 | 28 | override fun onResume() { 29 | super.onResume() 30 | presenter.onResume() 31 | } 32 | 33 | override fun onPause() { 34 | super.onPause() 35 | presenter.onPause() 36 | } 37 | 38 | open fun setupDialog(@StringRes titleId: Int, @StringRes subtitleId: Int? = null) {} 39 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/view/ItemViewHolder.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.view 8 | 9 | import android.view.View 10 | import kotlinx.android.synthetic.main.list_cell_item.itemTitle 11 | import kotlinx.android.synthetic.main.list_cell_item.itemSubtitle 12 | import mozilla.lockbox.R 13 | import mozilla.lockbox.adapter.ItemListCell 14 | import mozilla.lockbox.model.ItemViewModel 15 | 16 | class ItemViewHolder(override val containerView: View) : ItemListCell(containerView) { 17 | var itemViewModel: ItemViewModel? = null 18 | set(value) { 19 | field = value 20 | value?.let { 21 | itemTitle.text = it.title 22 | itemSubtitle.text = textFromSubtitle(it.subtitle) 23 | } 24 | } 25 | 26 | private fun textFromSubtitle(subtitle: String?): CharSequence { 27 | return if (subtitle!!.isEmpty()) { 28 | containerView.resources.getString(R.string.no_username) 29 | } else { 30 | subtitle 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/mozilla/lockbox/view/OnboardingConfirmationFragment.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.view 8 | 9 | import android.os.Bundle 10 | import android.view.LayoutInflater 11 | import android.view.View 12 | import android.view.ViewGroup 13 | import com.jakewharton.rxbinding2.view.clicks 14 | import io.reactivex.Observable 15 | import kotlinx.android.synthetic.main.fragment_onboarding_confirmation.view.* 16 | import mozilla.lockbox.R 17 | import mozilla.lockbox.presenter.OnboardingConfirmationPresenter 18 | import mozilla.lockbox.presenter.OnboardingConfirmationView 19 | 20 | class OnboardingConfirmationFragment : Fragment(), OnboardingConfirmationView { 21 | override fun onCreateView( 22 | inflater: LayoutInflater, 23 | container: ViewGroup?, 24 | savedInstanceState: Bundle? 25 | ): View? { 26 | presenter = OnboardingConfirmationPresenter(this) 27 | 28 | return inflater.inflate(R.layout.fragment_onboarding_confirmation, container, false) 29 | } 30 | 31 | override val finishClicks: Observable 32 | get() = requireView().finishButton.clicks() 33 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/none.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/color/button_disabled.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/color/error_input_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/color/hint_edit_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/color/link_pressed.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/color/menu_item_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/color/switch_thumb_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_access.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_account.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_autofill_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_autofill_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_autofill_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_autofill_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_avatar_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_avatar_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_biometric_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_biometric_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_biometric_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_biometric_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_check_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_check_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_convenience.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_convenience.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_default_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_default_avatar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_delete_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_delete_red.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_edit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_lock_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_lock_large.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_lockwise_bordered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_lockwise_bordered.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_lockwise_glyph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_lockwise_glyph.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_menu_kebab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_menu_kebab.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_no_entries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_no_entries.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_placeholder_entries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_placeholder_entries.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_search_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_search_dark.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_security.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_show.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_success.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_title.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_warning.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_welcome_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_welcome_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_welcome_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-hdpi/ic_welcome_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_access.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_account.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_autofill_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_autofill_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_autofill_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_autofill_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_avatar_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_avatar_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_biometric_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_biometric_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_biometric_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_biometric_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_check_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_check_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_convenience.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_convenience.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_default_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_default_avatar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_delete_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_delete_red.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_edit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_lock_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_lock_large.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_lockwise_bordered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_lockwise_bordered.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_lockwise_glyph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_lockwise_glyph.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_menu_kebab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_menu_kebab.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_no_entries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_no_entries.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_placeholder_entries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_placeholder_entries.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_search_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_search_dark.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_security.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_show.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_success.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_title.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_warning.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_welcome_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_welcome_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_welcome_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-mdpi/ic_welcome_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_autofill_blob.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_avatar_placeholder.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_biometric_blob.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_default_avatar.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_lock_large.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_menu_kebab.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_warning.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_welcome_blob.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_access.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_account.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_autofill_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_autofill_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_autofill_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_autofill_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_avatar_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_avatar_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_biometric_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_biometric_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_biometric_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_biometric_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_check_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_check_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_convenience.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_convenience.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_default_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_default_avatar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_delete_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_delete_red.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_edit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_lock_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_lock_large.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_lockwise_bordered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_lockwise_bordered.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_lockwise_glyph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_lockwise_glyph.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_menu_kebab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_menu_kebab.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_no_entries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_no_entries.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_placeholder_entries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_placeholder_entries.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_search_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_search_dark.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_security.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_show.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_success.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_title.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_warning.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_welcome_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_welcome_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_welcome_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xhdpi/ic_welcome_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_access.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_account.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_autofill_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_autofill_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_autofill_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_autofill_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_avatar_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_avatar_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_biometric_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_biometric_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_biometric_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_biometric_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_check_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_check_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_convenience.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_convenience.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_default_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_default_avatar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_delete_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_delete_red.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_edit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_lock_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_lock_large.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_lockwise_bordered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_lockwise_bordered.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_lockwise_glyph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_lockwise_glyph.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_menu_kebab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_menu_kebab.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_no_entries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_no_entries.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_placeholder_entries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_placeholder_entries.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_search_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_search_dark.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_security.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_show.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_success.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_title.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_warning.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_welcome_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_welcome_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_welcome_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxhdpi/ic_welcome_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_access.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_account.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_autofill_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_autofill_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_autofill_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_autofill_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_avatar_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_avatar_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_biometric_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_biometric_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_biometric_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_biometric_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_check_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_check_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_convenience.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_convenience.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_default_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_default_avatar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_delete_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_delete_red.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_edit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_lock_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_lock_large.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_lockwise_bordered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_lockwise_bordered.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_lockwise_glyph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_lockwise_glyph.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_no_entries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_no_entries.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_placeholder_entries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_placeholder_entries.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_search_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_search_dark.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_security.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_show.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_success.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_title.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_warning.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_welcome_blob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_welcome_blob.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_welcome_illustration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/drawable-xxxhdpi/ic_welcome_illustration.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_pressed_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_pressed_violet.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/create_button.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close_black.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_copy.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_down_caret.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_faq.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_fingerprint_fail.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_fingerprint_success.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launch.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sync.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/inset_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/launch_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 12 | 13 | 14 | 16 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/progress_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 15 | 16 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 10 | 11 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_outline_small.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 10 | 11 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_corner_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_corner_bg_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/sort_menu_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/ic_copy.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_autofill.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 15 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_root.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 15 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_filter.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | 17 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_setting.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 16 | 17 | 18 | 19 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/include_backable.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_cell_no_entries_found.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_cell_no_matching.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_cell_setting_appversion.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_cell_setting_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/item_detail_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | 24 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/menu/nav_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | 15 | 19 | 23 | 27 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | #393473 9 | #1d1133 10 | 11 | #20123a 12 | #592acb 13 | #99592acb 14 | #ededf0 15 | #ffffff 16 | #0c0c0d 17 | #ffffff 18 | #99000000 19 | #de000000 20 | #737373 21 | #e4e4e4 22 | #99ffffff 23 | #51ffffff 24 | #4a4a4f 25 | #26000000 26 | #413d7f 27 | #45278d 28 | 29 | #12bc00 30 | #d70022 31 | #14000000 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13dp 9 | 30dp 10 | 8dp 11 | 0px 12 | 96dp 13 | 40dp 14 | 4dp 15 | 8dp 16 | 90dp 17 | 216dp 18 | 318dp 19 | 15dp 20 | 250dp 21 | 42dp 22 | 15sp 23 | 238dp 24 | 8dp 25 | 10dp 26 | 87dp 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #20123A 4 | -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/DisposingTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox 8 | 9 | import io.reactivex.disposables.CompositeDisposable 10 | import io.reactivex.observers.TestObserver 11 | import io.reactivex.rxkotlin.addTo 12 | import org.junit.After 13 | 14 | open class DisposingTest { 15 | val disposer = CompositeDisposable() 16 | 17 | @After 18 | open fun tearDown() { 19 | disposer.clear() 20 | } 21 | 22 | fun createTestObserver(): TestObserver { 23 | val result = TestObserver.create() 24 | result.addTo(disposer) 25 | return result 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/TestConsumer.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox 8 | 9 | import io.reactivex.Observer 10 | import io.reactivex.functions.Consumer 11 | 12 | class TestConsumer(private val observer: Observer) : Consumer { 13 | override fun accept(t: T) { 14 | observer.onNext(t) 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/autofill/FillResponseBuilderTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.autofill 8 | 9 | import android.content.Context 10 | import android.view.autofill.AutofillId 11 | import androidx.test.core.app.ApplicationProvider 12 | import kotlinx.coroutines.ExperimentalCoroutinesApi 13 | import org.junit.Test 14 | import org.junit.runner.RunWith 15 | import org.mockito.Mock 16 | import org.mockito.Mockito.mock 17 | import org.robolectric.RobolectricTestRunner 18 | 19 | @ExperimentalCoroutinesApi 20 | @RunWith(RobolectricTestRunner::class) 21 | class FillResponseBuilderTest { 22 | 23 | @Mock 24 | val usernameId: AutofillId = mock(AutofillId::class.java) 25 | 26 | @Mock 27 | val passwordId: AutofillId = mock(AutofillId::class.java) 28 | 29 | val context: Context = ApplicationProvider.getApplicationContext() 30 | private val parsedStructure = ParsedStructure(usernameId, passwordId, packageName = "mozilla.lockbox") 31 | val subject = FillResponseBuilder(parsedStructure) 32 | 33 | @Test 34 | fun `build authentication fill response`() { 35 | subject.buildAuthenticationFillResponse(context) 36 | } 37 | } -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/extensions/Observer+.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.extensions 8 | 9 | import io.reactivex.observers.TestObserver 10 | 11 | fun TestObserver.assertLastValue(expectedValue: T): TestObserver { 12 | val count = this.valueCount() 13 | this.assertValueAt(count - 1, expectedValue) 14 | return this 15 | } 16 | 17 | fun TestObserver.assertLastValueMatches(expectedPredicate: (value: T) -> Boolean): TestObserver { 18 | val count = this.valueCount() 19 | this.assertValueAt(count - 1, expectedPredicate) 20 | return this 21 | } -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/extensions/ServerPasswordExtensionTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.extensions 8 | 9 | import mozilla.appservices.logins.ServerPassword 10 | import mozilla.lockbox.model.ItemViewModel 11 | import org.junit.Assert 12 | import org.junit.Test 13 | import java.util.Date 14 | 15 | class ServerPasswordExtensionTest { 16 | @Test 17 | fun toViewModel() { 18 | val guid = "afdsfdsa" 19 | val username = "cats@cats.com" 20 | val time = Date().time 21 | val serverPassword = ServerPassword( 22 | guid, 23 | hostname = "www.mozilla.org", 24 | username = username, 25 | password = "woof", 26 | timeLastUsed = time) 27 | 28 | val expectedItemViewModel = ItemViewModel("mozilla.org", username, guid) 29 | 30 | Assert.assertEquals(serverPassword.toViewModel(), expectedItemViewModel) 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/presenter/ServerPasswordTestHelper.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.presenter 8 | 9 | import mozilla.appservices.logins.ServerPassword 10 | 11 | open class ServerPasswordTestHelper { 12 | 13 | private val username = "dogs@dogs.com" 14 | val item1 = ServerPassword( 15 | "fdsfda", 16 | "https://www.mozilla.org", 17 | username, 18 | "woof", 19 | timesUsed = 0, 20 | timeCreated = 0L, 21 | timeLastUsed = 1L, 22 | timePasswordChanged = 0L 23 | ) 24 | 25 | val item2 = ServerPassword( 26 | "ghfdhg", 27 | "https://www.cats.org", 28 | username, 29 | "meow", 30 | timesUsed = 0, 31 | timeCreated = 0L, 32 | timeLastUsed = 2L, 33 | timePasswordChanged = 0L 34 | ) 35 | val item3 = ServerPassword( 36 | "ioupiouiuy", 37 | "www.dogs.org", 38 | username = "", 39 | password = "baaaaa", 40 | timesUsed = 0, 41 | timeCreated = 0L, 42 | timeLastUsed = 3L, 43 | timePasswordChanged = 0L 44 | ) 45 | } 46 | -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/presenter/TestApplication.kt: -------------------------------------------------------------------------------- 1 | package mozilla.lockbox.presenter 2 | 3 | import kotlinx.coroutines.ExperimentalCoroutinesApi 4 | import mozilla.lockbox.LockboxApplication 5 | import mozilla.lockbox.log 6 | 7 | @ExperimentalCoroutinesApi 8 | class TestApplication : LockboxApplication() { 9 | 10 | init { 11 | log.info("Using TestApplication") 12 | } 13 | 14 | override val unitTesting = true 15 | } -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/store/AutofillStoreTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.store 8 | 9 | import io.reactivex.observers.TestObserver 10 | import mozilla.lockbox.action.AutofillAction 11 | import mozilla.lockbox.action.LifecycleAction 12 | import mozilla.lockbox.flux.Action 13 | import mozilla.lockbox.flux.Dispatcher 14 | import org.junit.Before 15 | import org.junit.Test 16 | 17 | class AutofillStoreTest { 18 | 19 | private val dispatcher = Dispatcher() 20 | private val autofillActionObserver = TestObserver.create() 21 | 22 | val subject = AutofillStore(dispatcher) 23 | 24 | @Before 25 | fun setUp() { 26 | subject.autofillActions.subscribe(autofillActionObserver) 27 | } 28 | 29 | @Test 30 | fun `dispatched autofill actions`() { 31 | val action = AutofillAction.Cancel 32 | dispatcher.dispatch(action) 33 | 34 | autofillActionObserver.assertValue(action) 35 | } 36 | 37 | @Test 38 | fun `dispatched non-autofillactions`() { 39 | val action = LifecycleAction.UserReset 40 | dispatcher.dispatch(action) 41 | 42 | autofillActionObserver.assertEmpty() 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/store/LifecycleStoreTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.store 8 | 9 | import mozilla.lockbox.DisposingTest 10 | import mozilla.lockbox.action.LifecycleAction 11 | import mozilla.lockbox.flux.Dispatcher 12 | import org.junit.Test 13 | 14 | class LifecycleStoreTest : DisposingTest() { 15 | @Test 16 | fun testLifecycleFilter() { 17 | val dispatcher = Dispatcher() 18 | val subject = LifecycleStore(dispatcher) 19 | 20 | val lifecycleObserver = createTestObserver() 21 | subject.lifecycleEvents.subscribe(lifecycleObserver) 22 | 23 | dispatcher.dispatch(LifecycleAction.Startup) 24 | dispatcher.dispatch(LifecycleAction.Upgrade) 25 | dispatcher.dispatch(LifecycleAction.Foreground) 26 | dispatcher.dispatch(LifecycleAction.Background) 27 | 28 | lifecycleObserver.assertValueSequence(listOf( 29 | LifecycleAction.Startup, 30 | LifecycleAction.Upgrade, 31 | LifecycleAction.Foreground, 32 | LifecycleAction.Background 33 | )) 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/support/FxASyncDataStoreSupportTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | package mozilla.lockbox.support 8 | 9 | import org.junit.Assert 10 | import org.junit.Test 11 | 12 | class FxASyncDataStoreSupportTest { 13 | @Test 14 | fun `test encryption key generation`() { 15 | val pattern = Regex("[0-9a-f]+", RegexOption.IGNORE_CASE) 16 | 17 | var keyStr = generateEncryptionKey(128) 18 | Assert.assertEquals(32, keyStr.length) 19 | Assert.assertTrue(pattern.matches(keyStr)) 20 | 21 | var oldKeyStr = keyStr 22 | keyStr = generateEncryptionKey(256) 23 | Assert.assertEquals(64, keyStr.length) 24 | Assert.assertTrue(pattern.matches(keyStr)) 25 | Assert.assertFalse(keyStr == oldKeyStr) 26 | 27 | oldKeyStr = keyStr 28 | keyStr = generateEncryptionKey(256) 29 | Assert.assertEquals(64, keyStr.length) 30 | Assert.assertTrue(pattern.matches(keyStr)) 31 | Assert.assertFalse(keyStr == oldKeyStr) 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/test/java/mozilla/lockbox/support/SimpleFileReaderTest.kt: -------------------------------------------------------------------------------- 1 | package mozilla.lockbox.support 2 | 3 | import org.junit.Assert 4 | import org.junit.Test 5 | import java.io.FileNotFoundException 6 | import java.nio.file.Files 7 | import java.nio.file.Paths 8 | 9 | class SimpleFileReaderTest { 10 | 11 | @Test(expected = FileNotFoundException::class) 12 | fun `when there is no file`() { 13 | SimpleFileReader().readContents("/nada") 14 | } 15 | 16 | @Test 17 | fun `when there is a file`() { 18 | val filename = "cats.txt" 19 | val contents = "meow" 20 | Files.write(Paths.get(filename), contents.toByteArray()) 21 | 22 | Assert.assertEquals(contents, SimpleFileReader().readContents(filename)) 23 | 24 | Files.delete(Paths.get(filename)) 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /app/src/test/resources/robolectric.properties: -------------------------------------------------------------------------------- 1 | # Needed until Robolectric supports SDK 29+ 2 | sdk=28 -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | comment: false 2 | coverage: 3 | range: 75..95 4 | round: down 5 | precision: 1 6 | status: 7 | project: 8 | default: false # disable the default status that measures entire project 9 | app: # declare a new status context without FxA 10 | paths: "!app/src/main/java/mozilla/lockbox/store/AccountStore.kt" 11 | patch: 12 | default: 13 | target: 50 14 | ignore: 15 | - "app/src/main/java/mozilla/lockbox/view" 16 | - "app/src/main/java/mozilla/lockbox/extensions/view" 17 | - "app/src/debug/java/mozilla/lockbox/view/UITestActivity.kt" 18 | - "app/src/main/java/mozilla/lockbox/presenter/RoutePresenter.kt" 19 | -------------------------------------------------------------------------------- /docs/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # lockwise-android code owners 2 | # https://help.github.com/articles/about-codeowners/ 3 | 4 | app/src/main/res/values/strings.xml @mozilla-lockwise/localization 5 | app/src/main/res/values/non_localizable_strings.xml @mozilla-lockwise/localization 6 | 7 | # everything except strings is to be reviewed by the mobile team 8 | * @mozilla-lockwise/mobile-engineering 9 | -------------------------------------------------------------------------------- /docs/L10nScreenshotsTests.md: -------------------------------------------------------------------------------- 1 | ### Screenshtos Tests 2 | We are using [`screengrab`](https://docs.fastlane.tools/getting-started/android/screenshots/) which works with fastlane to automate the process of capturing screenshots. 3 | All the l10n screenshots are generated through the ui tests. These particular tests run as part of the screenshots package (`app/src/androidTest/mozilla/lockbox/screenshots`) 4 | 5 | ### Steps to Run / Build 6 | 1. Install the gem: 7 | `sudo gem install screengrab` 8 | 9 | 2. From command line run: 10 | `fastlane screengrab --test_instrumentation_runner "androidx.test.runner.AndroidJUnitRunner"` 11 | 12 | Screenshots will be saved in the root directory: `fastlane/metadata/android` 13 | If there is a failure and screenshots are not saved, it may be necessary to create these folders manually first. 14 | Currently screenshots are uploaded to [`google drive`](https://drive.google.com/drive/folders/1r1SbIBPVLzm3JGlClZYNHB7vfsKdaEJ6?usp=sharing) once they are generated manually by running the previous command line. 15 | In the future this process will be automated too and documented here. 16 | -------------------------------------------------------------------------------- /docs/SECURITY.md: -------------------------------------------------------------------------------- 1 | # Mozilla Security # 2 | 3 | - Mozilla cares about privacy and security. For more information please see: https://www.mozilla.org/security/ 4 | 5 | - If you believe that you've found a security vulnerability, please report it by sending email to the addresses: security@mozilla.org and lockbox-dev@mozilla.com 6 | -------------------------------------------------------------------------------- /docs/architecture/autofill.md: -------------------------------------------------------------------------------- 1 | ## Autofill Framework Interaction 2 | 3 | Currently, Lockwise for Android only supports the [Autofill Framework](https://developer.android.com/guide/topics/text/autofill.html) as provided by Google. Support for this framework is not universal among apps in the Play store, so autofill will not always behave as expected. Enumerated below are the simple strategies we use and their priorities in determining which views should receive autofill suggestions with Username and Password credentials. 4 | 5 | ## Heuristics for determining autofill-able views in native applications 6 | 7 | 1. Using the `autofillHints` attribute on `EditText` views 8 | 2. Using the `text` and `hint` attributes on `EditText` views 9 | 3. Assuming that a `TextView` with the relevant `autofillHints`, `text`, or `hint` attributes _immediately followed_ by an `EditText` view, should autofill the `EditText` 10 | -------------------------------------------------------------------------------- /docs/glean/metrics.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Metrics 4 | This document enumerates the metrics collected by this project. 5 | This project may depend on other projects which also collect metrics. 6 | This means you might have to go searching through the dependency tree to get a full picture of everything collected by this project. 7 | 8 | # Pings 9 | 10 | - [deletion_request](#deletion_request) 11 | 12 | 13 | ## deletion_request 14 | This is a built-in ping that is assembled out of the box by the Glean SDK. 15 | See the Glean SDK documentation for the [`deletion_request` ping](https://mozilla.github.io/glean/book/user/pings/deletion_request.html). 16 | The following metrics are added to the ping: 17 | 18 | | Name | Type | Description | Data reviews | Extras | Expiration | 19 | | --- | --- | --- | --- | --- | --- | 20 | | legacy.ids.client_id |[uuid](https://mozilla.github.io/glean/book/user/metrics/uuid.html) |The client id from legacy telemetry. |[1](https://github.com/mozilla-lockwise/lockwise-android/pull/1196)||never | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | Welcome to the Firefox Lockwise for Android documentation! 2 | -------------------------------------------------------------------------------- /docs/install.md: -------------------------------------------------------------------------------- 1 | ### Required Libraries 2 | 3 | Our linting configuration requires you to have an up-to-date installation of 4 | [`ktlint`](https://github.com/shyiko/ktlint#installation) 5 | 6 | ### Steps to Run / Build 7 | 8 | 1. Install the latest Android Studio 9 | 10 | 2. Clone the repository 11 | 12 | 3. Open the project in Android Studio 13 | 14 | 4. Gradle Sync & build/run the project 15 | 16 | ### Testing 17 | The tests can be run from Android Studio or from the command line: 18 | ```sh 19 | ./gradlew testDebug 20 | ``` 21 | 22 | #### Code coverage 23 | Local code coverage reports can be generated from Android Studio or from the 24 | command line: 25 | ```sh 26 | ./gradlew -Pcoverage jacocoDebugTestReport 27 | ``` 28 | 29 | The command line reports can be found at 30 | `app/build/reports/jacoco/jacocoDebugTestReport/html/index.html`. 31 | 32 | **N.B.:** each method uses a different reporter and will provide different 33 | results. They both tend to miss things: it's often best to test your code using 34 | both. 35 | 36 | The project's [official code coverage rating can be found on codecov.io][codecov], 37 | which uses the results from jacoco (i.e. the command line). 38 | 39 | [codecov]: https://codecov.io/gh/mozilla-lockwise/lockwise-android 40 | -------------------------------------------------------------------------------- /fastlane/Screengrabfile: -------------------------------------------------------------------------------- 1 | # remove the leading '#' to uncomment lines 2 | 3 | app_package_name 'mozilla.lockbox' 4 | use_tests_in_packages ['mozilla.lockbox.screenshots'] 5 | 6 | reinstall_app(true) 7 | 8 | app_apk_path ('app/build/outputs/apk/debug/app-debug.apk') 9 | tests_apk_path ('app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk') 10 | 11 | locales ["es-ES", "fr-FR", "it-IT", "de-DE", "en-US", "vi-VN", "cs", "ru", "en-GB", "zh-TW", "uk"] 12 | 13 | # clear all previously generated screenshots in your local output directory before creating new ones 14 | clear_previous_screenshots(true) 15 | 16 | # For more information about all available options run 17 | # fastlane screengrab --help 18 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # 2 | # This Source Code Form is subject to the terms of the Mozilla Public 3 | # License, v. 2.0. If a copy of the MPL was not distributed with this 4 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | # 6 | 7 | # Project-wide Gradle settings. 8 | # IDE (e.g. Android Studio) users: 9 | # Gradle settings configured through the IDE *will override* 10 | # any settings specified in this file. 11 | # For more details on how to configure your build environment visit 12 | # http://www.gradle.org/docs/current/userguide/build_environment.html 13 | # Specifies the JVM arguments used for the daemon process. 14 | # The setting is particularly useful for tweaking memory settings. 15 | org.gradle.jvmargs=-Xmx1536m 16 | # When configured, Gradle will run in incubating parallel mode. 17 | # This option should only be used with decoupled projects. More details, visit 18 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 19 | # org.gradle.parallel=true 20 | android.useAndroidX=true 21 | android.enableJetifier=true 22 | android.enableR8=true 23 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-lockwise/lockwise-android/d3c0511f73c34e8759e1bb597f2d3dc9bcc146f0/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon May 11 11:55:58 CDT 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip 7 | -------------------------------------------------------------------------------- /l10n.toml: -------------------------------------------------------------------------------- 1 | basepath = "." 2 | 3 | locales = [ 4 | "cs", 5 | "de", 6 | "en-GB", 7 | "es", 8 | "fr", 9 | "it", 10 | "ru", 11 | "uk", 12 | "vi", 13 | "zh-TW", 14 | ] 15 | [env] 16 | 17 | [[paths]] 18 | reference = "app/src/main/res/values/strings.xml" 19 | l10n = "app/src/main/res/values-{android_locale}/strings.xml" 20 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Firefox Lockwise for Android 2 | site_description: Documentation for Firefox Lockwise for Android application 3 | theme: readthedocs 4 | repo_name: GitHub 5 | repo_url: https://github.com/mozilla-lockwise/lockwise-android 6 | 7 | pages: 8 | - 'Introduction': 'index.md' 9 | - 'Release Notes': 'release-notes.md' 10 | - 'How to Contribute': 11 | - 'Contributing': 'contributing.md' 12 | - 'Telemetry and Metrics': 'metrics.md' 13 | - 'Developer Guides': 14 | - 'Build and Install': 'install.md' 15 | - 'Flux Architecture': 'architecture/flux.md' 16 | - 'Using Keys and Biometrics': 'architecture/sec-apis.md' 17 | - 'Accessibility': 'accessibility.md' 18 | - 'Test Plan': 'test-plan.md' 19 | - 'Release Instructions': 'releases.md' 20 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | include ':app', ':thirdparty' 8 | 9 | // Allow substituting the local application-services path, avoiding the need to 10 | // do a local publish for most cases. 11 | Properties localProperties = null; 12 | String settingAppServicesPath = "substitutions.application-services.dir"; 13 | 14 | if (file('local.properties').canRead()) { 15 | localProperties = new Properties() 16 | localProperties.load(file('local.properties').newDataInputStream()) 17 | logger.lifecycle('Local configuration: loaded local.properties') 18 | } else { 19 | logger.lifecycle('Local configuration: absent local.properties; proceeding as normal.') 20 | } 21 | 22 | if (localProperties != null) { 23 | String appServicesLocalPath = localProperties.getProperty(settingAppServicesPath); 24 | 25 | if (appServicesLocalPath != null) { 26 | logger.lifecycle("Local configuration: substituting application-services modules from path: $appServicesLocalPath") 27 | includeBuild(appServicesLocalPath) 28 | } else { 29 | logger.lifecycle("Local configuration: application-services substitution path missing. Specify it via '$settingAppServicesPath' setting.") 30 | } 31 | } -------------------------------------------------------------------------------- /thirdparty/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /thirdparty/README.md: -------------------------------------------------------------------------------- 1 | The source for CircleCropTransformation can be found at https://github.com/wasabeef/picasso-transformations. 2 | 3 | The source for VerticalItemDecoration can be found at https://github.com/magiepooh/RecyclerItemDecoration. -------------------------------------------------------------------------------- /thirdparty/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | */ 6 | 7 | apply plugin: 'com.android.library' 8 | 9 | android { 10 | compileSdkVersion 28 11 | 12 | defaultConfig { 13 | minSdkVersion 24 14 | targetSdkVersion 28 15 | versionCode 1 16 | versionName "1.0" 17 | } 18 | 19 | buildTypes { 20 | release { 21 | minifyEnabled false 22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 23 | } 24 | } 25 | 26 | } 27 | 28 | dependencies { 29 | implementation "com.squareup.picasso:picasso:$picasso_version" 30 | implementation "androidx.recyclerview:recyclerview:$recyclerview_version" 31 | } 32 | -------------------------------------------------------------------------------- /thirdparty/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 22 | -------------------------------------------------------------------------------- /thirdparty/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /thirdparty/src/main/java/com/github/magiepooh/recycleritemdecoration/ItemDecorations.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (C) 2015 magiepooh 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.github.magiepooh.recycleritemdecoration; 17 | 18 | import android.content.Context; 19 | 20 | /** 21 | * Created by magiepooh on 2015/08 22 | */ 23 | public class ItemDecorations { 24 | 25 | public static VerticalItemDecoration.Builder vertical(Context context) { 26 | return new VerticalItemDecoration.Builder(context); 27 | } 28 | } -------------------------------------------------------------------------------- /thirdparty/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | thirdparty 9 | 10 | --------------------------------------------------------------------------------