1
0
Fork 0

Fix AccountUiView ui failures

master
Tiger Oakes 2020-07-27 13:16:20 -07:00 committed by Emily Kager
parent 52a9acf87d
commit 5d772337a8
2 changed files with 34 additions and 10 deletions

View File

@ -73,6 +73,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
accountUiView = AccountUiView( accountUiView = AccountUiView(
fragment = this, fragment = this,
scope = lifecycleScope,
accountManager = requireComponents.backgroundServices.accountManager, accountManager = requireComponents.backgroundServices.accountManager,
httpClient = requireComponents.core.client, httpClient = requireComponents.core.client,
updateFxASyncOverrideMenu = ::updateFxASyncOverrideMenu updateFxASyncOverrideMenu = ::updateFxASyncOverrideMenu
@ -137,6 +138,11 @@ class SettingsFragment : PreferenceFragmentCompat() {
creatingFragment = false creatingFragment = false
} }
override fun onDestroyView() {
super.onDestroyView()
accountUiView.cancel()
}
private fun update(shouldUpdateAccountUIState: Boolean) { private fun update(shouldUpdateAccountUIState: Boolean) {
val trackingProtectionPreference = val trackingProtectionPreference =
requirePreference<Preference>(R.string.pref_key_tracking_protection_settings) requirePreference<Preference>(R.string.pref_key_tracking_protection_settings)

View File

@ -7,10 +7,12 @@ package org.mozilla.fenix.settings.account
import android.content.Context import android.content.Context
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceCategory import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import mozilla.components.concept.fetch.Client import mozilla.components.concept.fetch.Client
import mozilla.components.concept.sync.Profile import mozilla.components.concept.sync.Profile
@ -21,12 +23,12 @@ import org.mozilla.fenix.settings.requirePreference
class AccountUiView( class AccountUiView(
fragment: PreferenceFragmentCompat, fragment: PreferenceFragmentCompat,
private val scope: CoroutineScope,
private val accountManager: FxaAccountManager, private val accountManager: FxaAccountManager,
private val httpClient: Client, private val httpClient: Client,
private val updateFxASyncOverrideMenu: () -> Unit private val updateFxASyncOverrideMenu: () -> Unit
) { ) {
private val lifecycleScope = fragment.viewLifecycleOwner.lifecycleScope
private val preferenceSignIn = private val preferenceSignIn =
fragment.requirePreference<Preference>(R.string.pref_key_sign_in) fragment.requirePreference<Preference>(R.string.pref_key_sign_in)
private val preferenceFirefoxAccount = private val preferenceFirefoxAccount =
@ -36,6 +38,8 @@ class AccountUiView(
private val accountPreferenceCategory = private val accountPreferenceCategory =
fragment.requirePreference<PreferenceCategory>(R.string.pref_key_account_category) fragment.requirePreference<PreferenceCategory>(R.string.pref_key_account_category)
private var avatarJob: Job? = null
/** /**
* Updates the UI to reflect current account state. * Updates the UI to reflect current account state.
* Possible conditions are logged-in without problems, logged-out, and logged-in but needs to re-authenticate. * Possible conditions are logged-in without problems, logged-out, and logged-in but needs to re-authenticate.
@ -49,15 +53,16 @@ class AccountUiView(
if (account != null && !accountManager.accountNeedsReauth()) { if (account != null && !accountManager.accountNeedsReauth()) {
preferenceSignIn.isVisible = false preferenceSignIn.isVisible = false
profile?.avatar?.url?.let { avatarUrl -> avatarJob?.cancel()
lifecycleScope.launch { val avatarUrl = profile?.avatar?.url
val roundedDrawable = toRoundedDrawable(avatarUrl, context) if (avatarUrl != null) {
preferenceFirefoxAccount.icon = avatarJob = scope.launch {
roundedDrawable ?: AppCompatResources.getDrawable( val roundedAvatarDrawable = toRoundedDrawable(avatarUrl, context)
context, preferenceFirefoxAccount.icon = roundedAvatarDrawable ?: genericAvatar(context)
R.drawable.ic_account
)
} }
} else {
avatarJob = null
preferenceFirefoxAccount.icon = genericAvatar(context)
} }
preferenceSignIn.onPreferenceClickListener = null preferenceSignIn.onPreferenceClickListener = null
@ -88,6 +93,19 @@ class AccountUiView(
} }
} }
/**
* Cancel any running coroutine jobs for loading account images.
*/
fun cancel() {
scope.cancel()
}
/**
* Returns generic avatar for accounts.
*/
private fun genericAvatar(context: Context) =
AppCompatResources.getDrawable(context, R.drawable.ic_account)
/** /**
* Gets a rounded drawable from a URL if possible, else null. * Gets a rounded drawable from a URL if possible, else null.
*/ */