From 0777fb3bbeea9e3fb5b64365027b965951d2cb00 Mon Sep 17 00:00:00 2001 From: ekager Date: Mon, 13 Jan 2020 16:18:41 -0800 Subject: [PATCH] For #5545 For #5542 Closes #6696 Integrate logins API, adds Settings for Autofilling/Saving Logins --- .../org/mozilla/fenix/engine/GeckoProvider.kt | 9 ++- .../org/mozilla/fenix/engine/GeckoProvider.kt | 29 +++++++-- .../fenix/browser/BaseBrowserFragment.kt | 8 +++ .../mozilla/fenix/components/Components.kt | 2 +- .../java/org/mozilla/fenix/components/Core.kt | 43 ++++++++++---- .../mozilla/fenix/settings/LoginsFragment.kt | 59 +++++++++++++------ .../logins/SaveLoginSettingFragment.kt | 43 ++++++++++++++ .../logins/SavedLoginSiteInfoFragment.kt | 2 +- .../logins/SavedLoginsAdapter.kt | 2 +- .../logins/SavedLoginsFragment.kt | 4 +- .../logins/SavedLoginsFragmentStore.kt | 2 +- .../logins/SavedLoginsInteractor.kt | 2 +- .../logins/SavedLoginsListItemViewHolder.kt | 2 +- .../{ => settings}/logins/SavedLoginsView.kt | 2 +- .../java/org/mozilla/fenix/utils/Settings.kt | 10 ++++ .../main/res/layout/fragment_saved_logins.xml | 2 +- app/src/main/res/navigation/nav_graph.xml | 13 +++- app/src/main/res/values/preference_keys.xml | 4 ++ app/src/main/res/xml/logins_preferences.xml | 11 +++- .../main/res/xml/save_logins_preferences.xml | 14 +++++ .../logins/SavedLoginsInteractorTest.kt | 2 +- 21 files changed, 214 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/settings/logins/SaveLoginSettingFragment.kt rename app/src/main/java/org/mozilla/fenix/{ => settings}/logins/SavedLoginSiteInfoFragment.kt (99%) rename app/src/main/java/org/mozilla/fenix/{ => settings}/logins/SavedLoginsAdapter.kt (97%) rename app/src/main/java/org/mozilla/fenix/{ => settings}/logins/SavedLoginsFragment.kt (96%) rename app/src/main/java/org/mozilla/fenix/{ => settings}/logins/SavedLoginsFragmentStore.kt (97%) rename app/src/main/java/org/mozilla/fenix/{ => settings}/logins/SavedLoginsInteractor.kt (92%) rename app/src/main/java/org/mozilla/fenix/{ => settings}/logins/SavedLoginsListItemViewHolder.kt (96%) rename app/src/main/java/org/mozilla/fenix/{ => settings}/logins/SavedLoginsView.kt (97%) create mode 100644 app/src/main/res/xml/save_logins_preferences.xml rename app/src/test/java/org/mozilla/fenix/{ => settings}/logins/SavedLoginsInteractorTest.kt (94%) diff --git a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt index 731f00c9c..f2a4a3a2c 100644 --- a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -6,7 +6,9 @@ import android.content.Context import android.os.Bundle import mozilla.components.browser.engine.gecko.glean.GeckoAdapter import mozilla.components.lib.crash.handler.CrashHandlerService +import mozilla.components.lib.dataprotect.SecureAbove22Preferences import mozilla.components.service.experiments.Experiments +import mozilla.components.service.sync.logins.AsyncLoginsStorage import org.mozilla.fenix.Config import org.mozilla.fenix.utils.Settings import org.mozilla.geckoview.GeckoRuntime @@ -17,7 +19,12 @@ object GeckoProvider { private var runtime: GeckoRuntime? = null @Synchronized - fun getOrCreateRuntime(context: Context): GeckoRuntime { + @Suppress("UNUSED_PARAMETER") // API not yet landed in GV beta + fun getOrCreateRuntime( + context: Context, + storage: AsyncLoginsStorage, + securePreferences: SecureAbove22Preferences + ): GeckoRuntime { if (runtime == null) { runtime = createRuntime(context) } diff --git a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt index 4bd5311ff..494fe5f7d 100644 --- a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -4,9 +4,14 @@ import android.content.Context import android.os.Bundle +import mozilla.components.browser.engine.gecko.autofill.GeckoLoginDelegateWrapper import mozilla.components.browser.engine.gecko.glean.GeckoAdapter import mozilla.components.lib.crash.handler.CrashHandlerService +import mozilla.components.lib.dataprotect.SecureAbove22Preferences +import mozilla.components.service.sync.logins.AsyncLoginsStorage +import mozilla.components.service.sync.logins.GeckoLoginStorageDelegate import org.mozilla.fenix.Config +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.utils.Settings import org.mozilla.geckoview.GeckoRuntime import org.mozilla.geckoview.GeckoRuntimeSettings @@ -16,15 +21,23 @@ object GeckoProvider { private var runtime: GeckoRuntime? = null @Synchronized - fun getOrCreateRuntime(context: Context): GeckoRuntime { + fun getOrCreateRuntime( + context: Context, + storage: AsyncLoginsStorage, + securePreferences: SecureAbove22Preferences + ): GeckoRuntime { if (runtime == null) { - runtime = createRuntime(context) + runtime = createRuntime(context, storage, securePreferences) } return runtime!! } - private fun createRuntime(context: Context): GeckoRuntime { + private fun createRuntime( + context: Context, + storage: AsyncLoginsStorage, + securePreferences: SecureAbove22Preferences + ): GeckoRuntime { val builder = GeckoRuntimeSettings.Builder() testConfig?.let { @@ -46,6 +59,14 @@ object GeckoProvider { runtimeSettings.fontSizeFactor = fontSize } - return GeckoRuntime.create(context, runtimeSettings) + val geckoRuntime = GeckoRuntime.create(context, runtimeSettings) + val loginStorageDelegate = GeckoLoginStorageDelegate( + storage, + securePreferences, + { context.settings().shouldAutofillLogins && context.settings().shouldPromptToSaveLogins } + ) + geckoRuntime.loginStorageDelegate = GeckoLoginDelegateWrapper(loginStorageDelegate) + + return geckoRuntime } } diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index 63f6a7eca..13e7aad36 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -52,6 +52,7 @@ import mozilla.components.feature.session.SwipeRefreshFeature import mozilla.components.feature.sitepermissions.SitePermissions import mozilla.components.feature.sitepermissions.SitePermissionsFeature import mozilla.components.feature.sitepermissions.SitePermissionsRules +import mozilla.components.service.sync.logins.DefaultLoginValidationDelegate import mozilla.components.support.base.feature.PermissionsFeature import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper @@ -317,6 +318,13 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session store = store, customTabId = customTabSessionId, fragmentManager = parentFragmentManager, + loginValidationDelegate = DefaultLoginValidationDelegate( + context.components.core.asyncPasswordsStorage, + context.components.core.getSecureAbove22Preferences() + ), + isSaveLoginEnabled = { + context.settings().shouldPromptToSaveLogins + }, shareDelegate = object : ShareDelegate { override fun showShareSheet( context: Context, diff --git a/app/src/main/java/org/mozilla/fenix/components/Components.kt b/app/src/main/java/org/mozilla/fenix/components/Components.kt index 5fb17e156..9371512b9 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -20,7 +20,7 @@ class Components(private val context: Context) { analytics.crashReporter, core.historyStorage, core.bookmarksStorage, - core.passwordsStorage, + core.syncablePasswordsStorage, core.getSecureAbove22Preferences() ) } diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index 078d48cd1..060f56192 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -35,9 +35,9 @@ import mozilla.components.feature.pwa.ManifestStorage import mozilla.components.feature.pwa.WebAppShortcutManager import mozilla.components.feature.session.HistoryDelegate import mozilla.components.feature.webcompat.WebCompatFeature +import mozilla.components.feature.webnotifications.WebNotificationFeature import mozilla.components.lib.dataprotect.SecureAbove22Preferences import mozilla.components.lib.dataprotect.generateEncryptionKey -import mozilla.components.feature.webnotifications.WebNotificationFeature import mozilla.components.service.sync.logins.AsyncLoginsStorageAdapter import mozilla.components.service.sync.logins.SyncableLoginsStore import org.mozilla.fenix.AppRequestInterceptor @@ -73,7 +73,13 @@ class Core(private val context: Context) { forceUserScalableContent = context.settings().forceEnableZoom ) - GeckoEngine(context, defaultSettings, GeckoProvider.getOrCreateRuntime(context)).also { + GeckoEngine( + context, + defaultSettings, + GeckoProvider.getOrCreateRuntime( + context, asyncPasswordsStorage, getSecureAbove22Preferences() + ) + ).also { WebCompatFeature.install(it) } } @@ -82,7 +88,14 @@ class Core(private val context: Context) { * [Client] implementation to be used for code depending on `concept-fetch`` */ val client: Client by lazy { - GeckoViewFetchClient(context, GeckoProvider.getOrCreateRuntime(context)) + GeckoViewFetchClient( + context, + GeckoProvider.getOrCreateRuntime( + context, + asyncPasswordsStorage, + getSecureAbove22Preferences() + ) + ) } val sessionStorage: SessionStorage by lazy { @@ -143,8 +156,10 @@ class Core(private val context: Context) { MediaFeature(context).enable() } - WebNotificationFeature(context, engine, icons, R.drawable.ic_status_logo, - HomeActivity::class.java) + WebNotificationFeature( + context, engine, icons, R.drawable.ic_status_logo, + HomeActivity::class.java + ) } } @@ -181,14 +196,18 @@ class Core(private val context: Context) { val webAppManifestStorage by lazy { ManifestStorage(context) } - val passwordsStorage by lazy { + val asyncPasswordsStorage by lazy { + AsyncLoginsStorageAdapter.forDatabase( + File( + context.filesDir, + "logins.sqlite" + ).canonicalPath + ) + } + + val syncablePasswordsStorage by lazy { SyncableLoginsStore( - AsyncLoginsStorageAdapter.forDatabase( - File( - context.filesDir, - "logins.sqlite" - ).canonicalPath - ) + asyncPasswordsStorage ) { CompletableDeferred(passwordsEncryptionKey) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/LoginsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/LoginsFragment.kt index f03ae8bae..241ae7cc3 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/LoginsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/LoginsFragment.kt @@ -20,6 +20,7 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreference import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch import mozilla.components.concept.sync.AccountObserver @@ -36,7 +37,7 @@ import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar import java.util.concurrent.Executors -@Suppress("TooManyFunctions") +@Suppress("TooManyFunctions", "LargeClass") class LoginsFragment : PreferenceFragmentCompat(), AccountObserver { @TargetApi(M) @@ -83,10 +84,32 @@ class LoginsFragment : PreferenceFragmentCompat(), AccountObserver { .build() } + @Suppress("ComplexMethod") override fun onResume() { super.onResume() showToolbar(getString(R.string.preferences_passwords_logins_and_passwords)) + val saveLoginsSettingKey = getPreferenceKey(R.string.pref_key_save_logins_settings) + findPreference(saveLoginsSettingKey)?.apply { + summary = getString( + if (context.settings().shouldPromptToSaveLogins) + R.string.preferences_passwords_save_logins_ask_to_save else + R.string.preferences_passwords_save_logins_never_save + ) + setOnPreferenceClickListener { + navigateToSaveLoginSettingFragment() + true + } + } + + val autofillPreferenceKey = getPreferenceKey(R.string.pref_key_autofill_logins) + findPreference(autofillPreferenceKey)?.apply { + isEnabled = context.settings().shouldPromptToSaveLogins + isChecked = + context.settings().shouldAutofillLogins && context.settings().shouldPromptToSaveLogins + onPreferenceChangeListener = SharedPreferenceUpdater() + } + val savedLoginsKey = getPreferenceKey(R.string.pref_key_saved_logins) findPreference(savedLoginsKey)?.setOnPreferenceClickListener { if (Build.VERSION.SDK_INT >= M && isHardwareAvailable && hasBiometricEnrolled) { @@ -235,33 +258,31 @@ class LoginsFragment : PreferenceFragmentCompat(), AccountObserver { } private fun navigateToSavedLoginsFragment() { - if (findNavController().currentDestination?.id == R.id.loginsFragment) { - context?.components?.analytics?.metrics?.track(Event.OpenLogins) - val directions = LoginsFragmentDirections.actionLoginsFragmentToSavedLoginsFragment() - findNavController().navigate(directions) - } + context?.components?.analytics?.metrics?.track(Event.OpenLogins) + val directions = LoginsFragmentDirections.actionLoginsFragmentToSavedLoginsFragment() + findNavController().navigate(directions) } private fun navigateToAccountSettingsFragment() { - if (findNavController().currentDestination?.id == R.id.loginsFragment) { - val directions = - LoginsFragmentDirections.actionLoginsFragmentToAccountSettingsFragment() - findNavController().navigate(directions) - } + val directions = + LoginsFragmentDirections.actionLoginsFragmentToAccountSettingsFragment() + findNavController().navigate(directions) } private fun navigateToAccountProblemFragment() { - if (findNavController().currentDestination?.id == R.id.loginsFragment) { - val directions = LoginsFragmentDirections.actionLoginsFragmentToAccountProblemFragment() - findNavController().navigate(directions) - } + val directions = LoginsFragmentDirections.actionLoginsFragmentToAccountProblemFragment() + findNavController().navigate(directions) } private fun navigateToTurnOnSyncFragment() { - if (findNavController().currentDestination?.id == R.id.loginsFragment) { - val directions = LoginsFragmentDirections.actionLoginsFragmentToTurnOnSyncFragment() - findNavController().navigate(directions) - } + val directions = LoginsFragmentDirections.actionLoginsFragmentToTurnOnSyncFragment() + findNavController().navigate(directions) + } + + private fun navigateToSaveLoginSettingFragment() { + val directions = + LoginsFragmentDirections.actionLoginsFragmentToSaveLoginSettingFragment() + findNavController().navigate(directions) } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/SaveLoginSettingFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SaveLoginSettingFragment.kt new file mode 100644 index 000000000..5d2f6c94e --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SaveLoginSettingFragment.kt @@ -0,0 +1,43 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.settings.logins + +import android.os.Bundle +import androidx.preference.PreferenceFragmentCompat +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.showToolbar +import org.mozilla.fenix.settings.RadioButtonPreference + +class SaveLoginSettingFragment : PreferenceFragmentCompat() { + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.save_logins_preferences, rootKey) + } + + override fun onResume() { + super.onResume() + showToolbar(getString(R.string.preferences_passwords_save_logins)) + val save = bindSave() + val neverSave = bindNeverSave() + setupRadioGroups(save, neverSave) + } + + private fun bindSave(): RadioButtonPreference { + val keyStrict = getString(R.string.pref_key_save_logins) + return requireNotNull(findPreference(keyStrict)) + } + + private fun bindNeverSave(): RadioButtonPreference { + val keyStandard = getString(R.string.pref_key_never_save_logins) + return requireNotNull(findPreference(keyStandard)) + } + + private fun setupRadioGroups( + radioNeverSave: RadioButtonPreference, + radioSave: RadioButtonPreference + ) { + radioNeverSave.addToRadioGroup(radioSave) + radioSave.addToRadioGroup(radioNeverSave) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginSiteInfoFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginSiteInfoFragment.kt similarity index 99% rename from app/src/main/java/org/mozilla/fenix/logins/SavedLoginSiteInfoFragment.kt rename to app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginSiteInfoFragment.kt index a66462ff3..9c7e1db5e 100644 --- a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginSiteInfoFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginSiteInfoFragment.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.logins +package org.mozilla.fenix.settings.logins import android.os.Bundle import android.text.InputType diff --git a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsAdapter.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsAdapter.kt similarity index 97% rename from app/src/main/java/org/mozilla/fenix/logins/SavedLoginsAdapter.kt rename to app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsAdapter.kt index a52c680fe..c32de9951 100644 --- a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsAdapter.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.logins +package org.mozilla.fenix.settings.logins import android.view.LayoutInflater import android.view.ViewGroup diff --git a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt similarity index 96% rename from app/src/main/java/org/mozilla/fenix/logins/SavedLoginsFragment.kt rename to app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt index 63e8753e5..d2e410061 100644 --- a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.logins +package org.mozilla.fenix.settings.logins import android.os.Bundle import android.view.LayoutInflater @@ -88,7 +88,7 @@ class SavedLoginsFragment : Fragment() { private suspend fun loadAndMapLogins() { val syncedLogins = withContext(IO) { - requireContext().components.core.passwordsStorage.withUnlocked { + requireContext().components.core.syncablePasswordsStorage.withUnlocked { it.list().await().map { item -> SavedLoginsItem(item.hostname, item.username, item.password) } diff --git a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsFragmentStore.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragmentStore.kt similarity index 97% rename from app/src/main/java/org/mozilla/fenix/logins/SavedLoginsFragmentStore.kt rename to app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragmentStore.kt index 9ff517dc0..051920098 100644 --- a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsFragmentStore.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragmentStore.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.logins +package org.mozilla.fenix.settings.logins import android.os.Parcelable import kotlinx.android.parcel.Parcelize diff --git a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsInteractor.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsInteractor.kt similarity index 92% rename from app/src/main/java/org/mozilla/fenix/logins/SavedLoginsInteractor.kt rename to app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsInteractor.kt index 09f773615..c0ef0f842 100644 --- a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsInteractor.kt @@ -2,7 +2,7 @@ License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.logins +package org.mozilla.fenix.settings.logins /** * Interactor for the saved logins screen diff --git a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsListItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsListItemViewHolder.kt similarity index 96% rename from app/src/main/java/org/mozilla/fenix/logins/SavedLoginsListItemViewHolder.kt rename to app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsListItemViewHolder.kt index e4ac8e1a9..e90929965 100644 --- a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsListItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsListItemViewHolder.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.logins +package org.mozilla.fenix.settings.logins import android.view.View import androidx.recyclerview.widget.RecyclerView diff --git a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsView.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsView.kt similarity index 97% rename from app/src/main/java/org/mozilla/fenix/logins/SavedLoginsView.kt rename to app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsView.kt index bc875b28d..450e6f042 100644 --- a/app/src/main/java/org/mozilla/fenix/logins/SavedLoginsView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsView.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.logins +package org.mozilla.fenix.settings.logins import android.view.LayoutInflater import android.view.ViewGroup diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index bfb634a85..a731423d7 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -386,6 +386,16 @@ class Settings private constructor( ) } + var shouldPromptToSaveLogins by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_save_logins), + default = true + ) + + var shouldAutofillLogins by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_autofill_logins), + default = true + ) + var fxaSignedIn by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_fxa_signed_in), default = true diff --git a/app/src/main/res/layout/fragment_saved_logins.xml b/app/src/main/res/layout/fragment_saved_logins.xml index 217d61182..e43b67805 100644 --- a/app/src/main/res/layout/fragment_saved_logins.xml +++ b/app/src/main/res/layout/fragment_saved_logins.xml @@ -7,4 +7,4 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:context="org.mozilla.fenix.logins.SavedLoginsFragment" /> + tools:context="org.mozilla.fenix.settings.logins.SavedLoginsFragment" /> diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index eac80e037..9af42457c 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -340,6 +340,9 @@ + + app:argType="org.mozilla.fenix.settings.logins.SavedLoginsItem" /> + diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index a762b8534..4c83e4e30 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -114,6 +114,10 @@ pref_key_tracking_protection_onboarding + pref_key_save_logins_settings + pref_key_save_logins + pref_key_autofill_logins + pref_key_never_save_logins pref_key_saved_logins pref_key_password_sync_logins pref_key_logins_secure_warning_sync diff --git a/app/src/main/res/xml/logins_preferences.xml b/app/src/main/res/xml/logins_preferences.xml index cb677de05..22ded34b0 100644 --- a/app/src/main/res/xml/logins_preferences.xml +++ b/app/src/main/res/xml/logins_preferences.xml @@ -1,7 +1,16 @@ - + + + + + + + diff --git a/app/src/test/java/org/mozilla/fenix/logins/SavedLoginsInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/settings/logins/SavedLoginsInteractorTest.kt similarity index 94% rename from app/src/test/java/org/mozilla/fenix/logins/SavedLoginsInteractorTest.kt rename to app/src/test/java/org/mozilla/fenix/settings/logins/SavedLoginsInteractorTest.kt index 71bb851c4..7bfe86b7f 100644 --- a/app/src/test/java/org/mozilla/fenix/logins/SavedLoginsInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/logins/SavedLoginsInteractorTest.kt @@ -2,7 +2,7 @@ License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.logins +package org.mozilla.fenix.settings.logins import io.mockk.mockk import io.mockk.verify