From 1de2e58644d49adeefb8e515fdc68c72988075e3 Mon Sep 17 00:00:00 2001 From: Jonathan Almeida Date: Fri, 24 May 2019 16:58:41 -0400 Subject: [PATCH] No issue: Add device name to account page --- .../fenix/settings/AccountSettingsFragment.kt | 57 ++++++++++++++++++- app/src/main/res/values/preference_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 + .../res/xml/account_settings_preferences.xml | 5 ++ 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/AccountSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/AccountSettingsFragment.kt index ac2b71346..07e25667b 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/AccountSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/AccountSettingsFragment.kt @@ -15,8 +15,14 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch +import mozilla.components.concept.sync.ConstellationState +import mozilla.components.concept.sync.DeviceConstellationObserver import mozilla.components.concept.sync.SyncStatusObserver import mozilla.components.feature.sync.getLastSynced +import mozilla.components.service.fxa.FxaException +import mozilla.components.service.fxa.FxaPanicException +import mozilla.components.service.fxa.manager.FxaAccountManager +import mozilla.components.support.base.log.logger.Logger import org.mozilla.fenix.R import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.requireComponents @@ -27,6 +33,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope { private lateinit var job: Job override val coroutineContext: CoroutineContext get() = Dispatchers.Main + job + private lateinit var accountManager: FxaAccountManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -43,6 +50,8 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.account_settings_preferences, rootKey) + accountManager = requireComponents.backgroundServices.accountManager + // Sign out val signOut = context!!.getPreferenceKey(R.string.pref_key_sign_out) val preferenceSignOut = findPreference(signOut) @@ -64,6 +73,18 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope { } } + // Device Name + val deviceConstellation = accountManager.authenticatedAccount()?.deviceConstellation() + val deviceNameKey = context!!.getPreferenceKey(R.string.pref_key_sync_device_name) + findPreference(deviceNameKey)?.apply { + onPreferenceChangeListener = getChangeListenerForDeviceName() + deviceConstellation?.state()?.currentDevice?.let { device -> + summary = device.displayName + } + } + + deviceConstellation?.registerDeviceObserver(deviceConstellationObserver, owner = this, autoPause = true) + // NB: ObserverRegistry will take care of cleaning up internal references to 'observer' and // 'owner' when appropriate. requireComponents.backgroundServices.syncManager.register(syncStatusObserver, owner = this, autoPause = true) @@ -72,7 +93,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope { private fun getClickListenerForSignOut(): Preference.OnPreferenceClickListener { return Preference.OnPreferenceClickListener { launch { - requireComponents.backgroundServices.accountManager.logoutAsync().await() + accountManager.logoutAsync().await() Navigation.findNavController(view!!).popBackStack() } true @@ -85,7 +106,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope { requireComponents.backgroundServices.syncManager.syncNow() // Poll for device events. launch { - requireComponents.backgroundServices.accountManager.authenticatedAccount() + accountManager.authenticatedAccount() ?.deviceConstellation() ?.refreshDeviceStateAsync() ?.await() @@ -94,6 +115,30 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope { } } + private fun getChangeListenerForDeviceName(): Preference.OnPreferenceChangeListener { + return Preference.OnPreferenceChangeListener { _, newValue -> + // Optimistically set the device name to what user requested. + val deviceNameKey = context!!.getPreferenceKey(R.string.pref_key_sync_device_name) + val preferenceDeviceName = findPreference(deviceNameKey) + preferenceDeviceName?.summary = newValue as String + + // This may fail, and we'll have a disparity in the UI until `updateDeviceName` is called. + CoroutineScope(Dispatchers.IO).launch { + try { + accountManager.authenticatedAccount()?.let { + it.deviceConstellation().setDeviceNameAsync(newValue) + } + } catch (e: FxaPanicException) { + throw e + } catch (e: FxaException) { + Logger.error("Setting device name failed.", e) + } + } + + true + } + } + private val syncStatusObserver = object : SyncStatusObserver { override fun onStarted() { CoroutineScope(Dispatchers.Main).launch { @@ -129,6 +174,14 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope { } } + private val deviceConstellationObserver = object : DeviceConstellationObserver { + override fun onDevicesUpdate(constellation: ConstellationState) { + val deviceNameKey = context!!.getPreferenceKey(R.string.pref_key_sync_device_name) + val preferenceDeviceName = findPreference(deviceNameKey) + preferenceDeviceName?.summary = constellation.currentDevice?.displayName + } + } + fun updateLastSyncedTimePref(context: Context, pref: Preference, failed: Boolean = false) { val lastSyncTime = getLastSynced(context) diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index d6ced7376..b2ee3cda3 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -34,6 +34,7 @@ pref_key_account_category + pref_key_sync_device_name pref_key_sync_now pref_key_sync_history pref_key_sync_bookmarks diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ce3fd496..c6471f03a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -153,6 +153,8 @@ Bookmarks Sign out + + Device name Syncing… diff --git a/app/src/main/res/xml/account_settings_preferences.xml b/app/src/main/res/xml/account_settings_preferences.xml index ffbecf820..419c58045 100644 --- a/app/src/main/res/xml/account_settings_preferences.xml +++ b/app/src/main/res/xml/account_settings_preferences.xml @@ -22,6 +22,11 @@ android:defaultValue="true" android:enabled="false" android:title="@string/preferences_sync_history" /> + + +