For #18241 - Refactor SyncLoginsPreferenceView to SyncPreferenceView for reusability (#18383)

This refactors SyncLoginsPreferenceView to SyncPreferenceView so that it be can be used in the
Credit cards preference for the equivalent "Sync cards across devices" preference.
upstream-sync
Gabriel Luong 3 years ago committed by GitHub
parent 2634bf89b2
commit a31ce9bf67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -2,10 +2,9 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.settings.logins package org.mozilla.fenix.settings
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.navigation.NavController
import androidx.preference.Preference import androidx.preference.Preference
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -16,16 +15,33 @@ import mozilla.components.service.fxa.SyncEngine
import mozilla.components.service.fxa.manager.FxaAccountManager import mozilla.components.service.fxa.manager.FxaAccountManager
import mozilla.components.service.fxa.manager.SyncEnginesStorage import mozilla.components.service.fxa.manager.SyncEnginesStorage
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.settings.logins.fragment.SavedLoginsAuthFragmentDirections
/** /**
* Helper to manage the [R.string.pref_key_password_sync_logins] preference. * A view to help manage the sync preference in the "Logins and passwords" and "Credit cards"
* settings. The provided [syncPreference] is used to navigate to the different fragments
* that manages the sync account authentication. A summary status will be also added
* depending on the sync account status.
*
* @param syncPreference The sync [Preference] to update and handle navigation.
* @param lifecycleOwner View lifecycle owner used to determine when to cancel UI jobs.
* @param accountManager An instance of [FxaAccountManager].
* @param syncEngine The sync engine that will be used for the sync status lookup.
* @param onSignInToSyncClicked A callback executed when the [syncPreference] is clicked with a
* preference status of "Sign in to Sync".
* @param onSyncStatusClicked A callback executed when the [syncPreference] is clicked with a
* preference status of "On" or "Off".
* @param onReconnectClicked A callback executed when the [syncPreference] is clicked with a
* preference status of "Reconnect".
*/ */
class SyncLoginsPreferenceView( @Suppress("LongParameterList")
private val syncLoginsPreference: Preference, class SyncPreferenceView(
private val syncPreference: Preference,
lifecycleOwner: LifecycleOwner, lifecycleOwner: LifecycleOwner,
accountManager: FxaAccountManager, accountManager: FxaAccountManager,
private val navController: NavController private val syncEngine: SyncEngine,
private val onSignInToSyncClicked: () -> Unit = {},
private val onSyncStatusClicked: () -> Unit = {},
private val onReconnectClicked: () -> Unit = {}
) { ) {
init { init {
@ -33,9 +49,11 @@ class SyncLoginsPreferenceView(
override fun onAuthenticated(account: OAuthAccount, authType: AuthType) { override fun onAuthenticated(account: OAuthAccount, authType: AuthType) {
MainScope().launch { updateSyncPreferenceStatus() } MainScope().launch { updateSyncPreferenceStatus() }
} }
override fun onLoggedOut() { override fun onLoggedOut() {
MainScope().launch { updateSyncPreferenceNeedsLogin() } MainScope().launch { updateSyncPreferenceNeedsLogin() }
} }
override fun onAuthenticationProblems() { override fun onAuthenticationProblems() {
MainScope().launch { updateSyncPreferenceNeedsReauth() } MainScope().launch { updateSyncPreferenceNeedsReauth() }
} }
@ -43,6 +61,7 @@ class SyncLoginsPreferenceView(
val accountExists = accountManager.authenticatedAccount() != null val accountExists = accountManager.authenticatedAccount() != null
val needsReauth = accountManager.accountNeedsReauth() val needsReauth = accountManager.accountNeedsReauth()
when { when {
needsReauth -> updateSyncPreferenceNeedsReauth() needsReauth -> updateSyncPreferenceNeedsReauth()
accountExists -> updateSyncPreferenceStatus() accountExists -> updateSyncPreferenceStatus()
@ -51,62 +70,50 @@ class SyncLoginsPreferenceView(
} }
/** /**
* Show the current status of the sync preference (on/off) for the logged in user. * Shows the current status of the sync preference ("On"/"Off") for the logged in user.
*/ */
private fun updateSyncPreferenceStatus() { private fun updateSyncPreferenceStatus() {
syncLoginsPreference.apply { syncPreference.apply {
val syncEnginesStatus = SyncEnginesStorage(context).getStatus() val syncEnginesStatus = SyncEnginesStorage(context).getStatus()
val loginsSyncStatus = syncEnginesStatus.getOrElse(SyncEngine.Passwords) { false } val loginsSyncStatus = syncEnginesStatus.getOrElse(syncEngine) { false }
summary = context.getString( summary = context.getString(
if (loginsSyncStatus) R.string.preferences_passwords_sync_logins_on if (loginsSyncStatus) R.string.preferences_passwords_sync_logins_on
else R.string.preferences_passwords_sync_logins_off else R.string.preferences_passwords_sync_logins_off
) )
setOnPreferenceClickListener { setOnPreferenceClickListener {
navigateToAccountSettingsFragment() onSyncStatusClicked()
true true
} }
} }
} }
/** /**
* Indicate that the user can sign in to turn on sync. * Display that the user can "Sign in to Sync" when the user is logged off.
*/ */
private fun updateSyncPreferenceNeedsLogin() { private fun updateSyncPreferenceNeedsLogin() {
syncLoginsPreference.apply { syncPreference.apply {
summary = context.getString(R.string.preferences_passwords_sync_logins_sign_in) summary = context.getString(R.string.preferences_passwords_sync_logins_sign_in)
setOnPreferenceClickListener { setOnPreferenceClickListener {
navigateToTurnOnSyncFragment() onSignInToSyncClicked()
true true
} }
} }
} }
/** /**
* Indicate that the user can fix their account problems to turn on sync. * Displays that the user needs to "Reconnect" to fix their account problems with sync.
*/ */
private fun updateSyncPreferenceNeedsReauth() { private fun updateSyncPreferenceNeedsReauth() {
syncLoginsPreference.apply { syncPreference.apply {
summary = context.getString(R.string.preferences_passwords_sync_logins_reconnect) summary = context.getString(R.string.preferences_passwords_sync_logins_reconnect)
setOnPreferenceClickListener { setOnPreferenceClickListener {
navigateToAccountProblemFragment() onReconnectClicked()
true true
} }
} }
} }
private fun navigateToAccountSettingsFragment() {
val directions =
SavedLoginsAuthFragmentDirections.actionGlobalAccountSettingsFragment()
navController.navigate(directions)
}
private fun navigateToAccountProblemFragment() {
val directions = SavedLoginsAuthFragmentDirections.actionGlobalAccountProblemFragment()
navController.navigate(directions)
}
private fun navigateToTurnOnSyncFragment() {
val directions = SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToTurnOnSyncFragment()
navController.navigate(directions)
}
} }

@ -22,18 +22,19 @@ import androidx.preference.SwitchPreference
import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import mozilla.components.service.fxa.SyncEngine
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.runIfFragmentIsAttached
import org.mozilla.fenix.ext.secure import org.mozilla.fenix.ext.secure
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.ext.runIfFragmentIsAttached
import org.mozilla.fenix.settings.SharedPreferenceUpdater import org.mozilla.fenix.settings.SharedPreferenceUpdater
import org.mozilla.fenix.settings.SyncPreferenceView
import org.mozilla.fenix.settings.biometric.BiometricPromptFeature import org.mozilla.fenix.settings.biometric.BiometricPromptFeature
import org.mozilla.fenix.settings.logins.SyncLoginsPreferenceView
import org.mozilla.fenix.settings.requirePreference import org.mozilla.fenix.settings.requirePreference
@Suppress("TooManyFunctions") @Suppress("TooManyFunctions")
@ -121,11 +122,26 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat() {
true true
} }
SyncLoginsPreferenceView( SyncPreferenceView(
requirePreference(R.string.pref_key_password_sync_logins), syncPreference = requirePreference(R.string.pref_key_password_sync_logins),
lifecycleOwner = viewLifecycleOwner, lifecycleOwner = viewLifecycleOwner,
accountManager = requireComponents.backgroundServices.accountManager, accountManager = requireComponents.backgroundServices.accountManager,
navController = findNavController() syncEngine = SyncEngine.Passwords,
onSignInToSyncClicked = {
val directions =
SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToTurnOnSyncFragment()
findNavController().navigate(directions)
},
onSyncStatusClicked = {
val directions =
SavedLoginsAuthFragmentDirections.actionGlobalAccountSettingsFragment()
findNavController().navigate(directions)
},
onReconnectClicked = {
val directions =
SavedLoginsAuthFragmentDirections.actionGlobalAccountProblemFragment()
findNavController().navigate(directions)
}
) )
togglePrefsEnabledWhileAuthenticating(true) togglePrefsEnabledWhileAuthenticating(true)

@ -24,9 +24,10 @@ import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.settings.SyncPreferenceView
import org.mozilla.fenix.settings.logins.fragment.SavedLoginsAuthFragmentDirections import org.mozilla.fenix.settings.logins.fragment.SavedLoginsAuthFragmentDirections
class SyncLoginsPreferenceViewTest { class LoginsSyncPreferenceViewTest {
@MockK private lateinit var syncLoginsPreference: Preference @MockK private lateinit var syncLoginsPreference: Preference
@MockK private lateinit var lifecycleOwner: LifecycleOwner @MockK private lateinit var lifecycleOwner: LifecycleOwner
@ -137,10 +138,25 @@ class SyncLoginsPreferenceViewTest {
} }
} }
private fun createView() = SyncLoginsPreferenceView( private fun createView() = SyncPreferenceView(
syncLoginsPreference, syncPreference = syncLoginsPreference,
lifecycleOwner, lifecycleOwner = lifecycleOwner,
accountManager, accountManager = accountManager,
navController syncEngine = SyncEngine.Passwords,
onSignInToSyncClicked = {
val directions =
SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToTurnOnSyncFragment()
navController.navigate(directions)
},
onSyncStatusClicked = {
val directions =
SavedLoginsAuthFragmentDirections.actionGlobalAccountSettingsFragment()
navController.navigate(directions)
},
onReconnectClicked = {
val directions =
SavedLoginsAuthFragmentDirections.actionGlobalAccountProblemFragment()
navController.navigate(directions)
}
) )
} }
Loading…
Cancel
Save