├── .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 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/copyright/MPL_2_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/copyright/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/render.experimental.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
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 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/debug/assets/fixtures/html_gmail_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/debug/assets/fixtures/html_twitter.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
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 |
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 |
14 |
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 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/nav_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------