From 5d772337a8ddfc4286d1d033f07c254475a483a9 Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Mon, 27 Jul 2020 13:16:20 -0700 Subject: [PATCH] Fix AccountUiView ui failures --- .../fenix/settings/SettingsFragment.kt | 6 +++ .../fenix/settings/account/AccountUiView.kt | 38 ++++++++++++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index 4b8a25e88..c19d5bc71 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -73,6 +73,7 @@ class SettingsFragment : PreferenceFragmentCompat() { accountUiView = AccountUiView( fragment = this, + scope = lifecycleScope, accountManager = requireComponents.backgroundServices.accountManager, httpClient = requireComponents.core.client, updateFxASyncOverrideMenu = ::updateFxASyncOverrideMenu @@ -137,6 +138,11 @@ class SettingsFragment : PreferenceFragmentCompat() { creatingFragment = false } + override fun onDestroyView() { + super.onDestroyView() + accountUiView.cancel() + } + private fun update(shouldUpdateAccountUIState: Boolean) { val trackingProtectionPreference = requirePreference(R.string.pref_key_tracking_protection_settings) diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt b/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt index bb5fa64c9..965ff46cf 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt @@ -7,10 +7,12 @@ package org.mozilla.fenix.settings.account import android.content.Context import androidx.appcompat.content.res.AppCompatResources import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory -import androidx.lifecycle.lifecycleScope import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import mozilla.components.concept.fetch.Client import mozilla.components.concept.sync.Profile @@ -21,12 +23,12 @@ import org.mozilla.fenix.settings.requirePreference class AccountUiView( fragment: PreferenceFragmentCompat, + private val scope: CoroutineScope, private val accountManager: FxaAccountManager, private val httpClient: Client, private val updateFxASyncOverrideMenu: () -> Unit ) { - private val lifecycleScope = fragment.viewLifecycleOwner.lifecycleScope private val preferenceSignIn = fragment.requirePreference(R.string.pref_key_sign_in) private val preferenceFirefoxAccount = @@ -36,6 +38,8 @@ class AccountUiView( private val accountPreferenceCategory = fragment.requirePreference(R.string.pref_key_account_category) + private var avatarJob: Job? = null + /** * 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. @@ -49,15 +53,16 @@ class AccountUiView( if (account != null && !accountManager.accountNeedsReauth()) { preferenceSignIn.isVisible = false - profile?.avatar?.url?.let { avatarUrl -> - lifecycleScope.launch { - val roundedDrawable = toRoundedDrawable(avatarUrl, context) - preferenceFirefoxAccount.icon = - roundedDrawable ?: AppCompatResources.getDrawable( - context, - R.drawable.ic_account - ) + avatarJob?.cancel() + val avatarUrl = profile?.avatar?.url + if (avatarUrl != null) { + avatarJob = scope.launch { + val roundedAvatarDrawable = toRoundedDrawable(avatarUrl, context) + preferenceFirefoxAccount.icon = roundedAvatarDrawable ?: genericAvatar(context) } + } else { + avatarJob = null + preferenceFirefoxAccount.icon = genericAvatar(context) } 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. */