1
0
Fork 0

No issue: Add device name to account page

master
Jonathan Almeida 2019-05-24 16:58:41 -04:00 committed by Sawyer Blatz
parent e8943a2d9c
commit 1de2e58644
4 changed files with 63 additions and 2 deletions

View File

@ -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<Preference>(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<Preference>(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<Preference>(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<Preference>(deviceNameKey)
preferenceDeviceName?.summary = constellation.currentDevice?.displayName
}
}
fun updateLastSyncedTimePref(context: Context, pref: Preference, failed: Boolean = false) {
val lastSyncTime = getLastSynced(context)

View File

@ -34,6 +34,7 @@
<!-- Account Settings -->
<string name="pref_key_account_category" translatable="false">pref_key_account_category</string>
<string name="pref_key_sync_device_name" translatable="false">pref_key_sync_device_name</string>
<string name="pref_key_sync_now" translatable="false">pref_key_sync_now</string>
<string name="pref_key_sync_history" translatable="false">pref_key_sync_history</string>
<string name="pref_key_sync_bookmarks" translatable="false">pref_key_sync_bookmarks</string>

View File

@ -153,6 +153,8 @@
<string name="preferences_sync_bookmarks">Bookmarks</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">Sign out</string>
<!-- Preference displays and allows changing current FxA device name -->
<string name="preferences_sync_device_name">Device name</string>
<!-- Label indicating that sync is in progress -->
<string name="sync_syncing">Syncing…</string>
<!-- Label summary indicating that sync failed. The first parameter is the date stamp showing last time it succeeded -->

View File

@ -22,6 +22,11 @@
android:defaultValue="true"
android:enabled="false"
android:title="@string/preferences_sync_history" />
<androidx.preference.EditTextPreference
android:key="@string/pref_key_sync_device_name"
android:title="@string/preferences_sync_device_name" />
</PreferenceCategory>
<androidx.preference.Preference