|
|
|
@ -9,22 +9,21 @@ import android.os.Bundle
|
|
|
|
|
import android.text.InputFilter
|
|
|
|
|
import android.text.format.DateUtils
|
|
|
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
|
|
|
import androidx.navigation.Navigation
|
|
|
|
|
import androidx.lifecycle.lifecycleScope
|
|
|
|
|
import androidx.navigation.fragment.findNavController
|
|
|
|
|
import androidx.preference.CheckBoxPreference
|
|
|
|
|
import androidx.preference.EditTextPreference
|
|
|
|
|
import androidx.preference.Preference
|
|
|
|
|
import androidx.preference.PreferenceCategory
|
|
|
|
|
import androidx.preference.PreferenceFragmentCompat
|
|
|
|
|
import androidx.preference.forEach
|
|
|
|
|
import kotlinx.coroutines.CoroutineScope
|
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
|
import kotlinx.coroutines.Job
|
|
|
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
import mozilla.components.concept.sync.AccountObserver
|
|
|
|
|
import mozilla.components.concept.sync.ConstellationState
|
|
|
|
|
import mozilla.components.concept.sync.DeviceConstellationObserver
|
|
|
|
|
import mozilla.components.concept.sync.OAuthAccount
|
|
|
|
|
import mozilla.components.concept.sync.Profile
|
|
|
|
|
import mozilla.components.concept.sync.DeviceConstellationObserver
|
|
|
|
|
import mozilla.components.concept.sync.SyncStatusObserver
|
|
|
|
|
import mozilla.components.feature.sync.getLastSynced
|
|
|
|
|
import mozilla.components.service.fxa.FxaException
|
|
|
|
@ -35,13 +34,8 @@ import org.mozilla.fenix.R
|
|
|
|
|
import org.mozilla.fenix.components.metrics.Event
|
|
|
|
|
import org.mozilla.fenix.ext.getPreferenceKey
|
|
|
|
|
import org.mozilla.fenix.ext.requireComponents
|
|
|
|
|
import kotlin.Exception
|
|
|
|
|
import kotlin.coroutines.CoroutineContext
|
|
|
|
|
|
|
|
|
|
class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope {
|
|
|
|
|
private lateinit var job: Job
|
|
|
|
|
override val coroutineContext: CoroutineContext
|
|
|
|
|
get() = Dispatchers.Main + job
|
|
|
|
|
class AccountSettingsFragment : PreferenceFragmentCompat() {
|
|
|
|
|
private lateinit var accountManager: FxaAccountManager
|
|
|
|
|
|
|
|
|
|
// Navigate away from this fragment when we encounter auth problems or logout events.
|
|
|
|
@ -49,16 +43,16 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope {
|
|
|
|
|
override fun onAuthenticated(account: OAuthAccount) {}
|
|
|
|
|
|
|
|
|
|
override fun onAuthenticationProblems() {
|
|
|
|
|
launch {
|
|
|
|
|
Navigation.findNavController(view!!).popBackStack()
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
findNavController().popBackStack()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onError(error: Exception) {}
|
|
|
|
|
|
|
|
|
|
override fun onLoggedOut() {
|
|
|
|
|
launch {
|
|
|
|
|
Navigation.findNavController(view!!).popBackStack()
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
findNavController().popBackStack()
|
|
|
|
|
|
|
|
|
|
// Remove the device name when we log out.
|
|
|
|
|
context?.let {
|
|
|
|
@ -79,13 +73,11 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope {
|
|
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
|
job = Job()
|
|
|
|
|
requireComponents.analytics.metrics.track(Event.SyncAccountOpened)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onDestroy() {
|
|
|
|
|
super.onDestroy()
|
|
|
|
|
job.cancel()
|
|
|
|
|
requireComponents.analytics.metrics.track(Event.SyncAccountClosed)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -141,7 +133,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope {
|
|
|
|
|
private fun getClickListenerForSignOut(): Preference.OnPreferenceClickListener {
|
|
|
|
|
return Preference.OnPreferenceClickListener {
|
|
|
|
|
requireComponents.analytics.metrics.track(Event.SyncAccountSignOut)
|
|
|
|
|
launch {
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
accountManager.logoutAsync().await()
|
|
|
|
|
}
|
|
|
|
|
true
|
|
|
|
@ -154,7 +146,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope {
|
|
|
|
|
requireComponents.analytics.metrics.track(Event.SyncAccountSyncNow)
|
|
|
|
|
requireComponents.backgroundServices.syncManager?.syncNow()
|
|
|
|
|
// Poll for device events.
|
|
|
|
|
launch {
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
accountManager.authenticatedAccount()
|
|
|
|
|
?.deviceConstellation()
|
|
|
|
|
?.refreshDeviceStateAsync()
|
|
|
|
@ -172,7 +164,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope {
|
|
|
|
|
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 {
|
|
|
|
|
lifecycleScope.launch(IO) {
|
|
|
|
|
try {
|
|
|
|
|
accountManager.authenticatedAccount()?.let {
|
|
|
|
|
it.deviceConstellation().setDeviceNameAsync(newValue)
|
|
|
|
@ -189,9 +181,11 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private val syncStatusObserver = object : SyncStatusObserver {
|
|
|
|
|
private val key = context!!.getPreferenceKey(R.string.pref_key_sync_now)
|
|
|
|
|
|
|
|
|
|
override fun onStarted() {
|
|
|
|
|
CoroutineScope(Dispatchers.Main).launch {
|
|
|
|
|
val pref = findPreference<Preference>(context!!.getPreferenceKey(R.string.pref_key_sync_now))
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
val pref = findPreference<Preference>(key)
|
|
|
|
|
view?.announceForAccessibility(getString(R.string.sync_syncing_in_progress))
|
|
|
|
|
pref?.title = getString(R.string.sync_syncing_in_progress)
|
|
|
|
|
pref?.isEnabled = false
|
|
|
|
@ -202,9 +196,8 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope {
|
|
|
|
|
|
|
|
|
|
// Sync stopped successfully.
|
|
|
|
|
override fun onIdle() {
|
|
|
|
|
CoroutineScope(Dispatchers.Main).launch {
|
|
|
|
|
val pref = findPreference<Preference>(context!!.getPreferenceKey(R.string.pref_key_sync_now))
|
|
|
|
|
pref?.let {
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
findPreference<Preference>(key)?.let { pref ->
|
|
|
|
|
pref.title = getString(R.string.preferences_sync_now)
|
|
|
|
|
pref.isEnabled = true
|
|
|
|
|
updateLastSyncedTimePref(context!!, pref, failed = false)
|
|
|
|
@ -214,9 +207,8 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), CoroutineScope {
|
|
|
|
|
|
|
|
|
|
// Sync stopped after encountering a problem.
|
|
|
|
|
override fun onError(error: Exception?) {
|
|
|
|
|
CoroutineScope(Dispatchers.Main).launch {
|
|
|
|
|
val pref = findPreference<Preference>(context!!.getPreferenceKey(R.string.pref_key_sync_now))
|
|
|
|
|
pref?.let {
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
findPreference<Preference>(key)?.let { pref ->
|
|
|
|
|
pref.title = getString(R.string.preferences_sync_now)
|
|
|
|
|
pref.isEnabled = true
|
|
|
|
|
updateLastSyncedTimePref(context!!, pref, failed = true)
|
|
|
|
|