From feb6215faeebcec20392050aa8fde17b140b3e0b Mon Sep 17 00:00:00 2001 From: ekager Date: Thu, 5 Mar 2020 21:10:51 -0800 Subject: [PATCH] For #8296 - Adds user account avatar to Account Preference --- .../main/java/org/mozilla/fenix/ext/String.kt | 21 ++++++++++++++++ .../fenix/settings/SettingsFragment.kt | 18 +++++++++++++ .../main/res/layout/account_preference.xml | 25 +++++++------------ 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/ext/String.kt b/app/src/main/java/org/mozilla/fenix/ext/String.kt index e43e589ab..b9366294c 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/String.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/String.kt @@ -5,15 +5,20 @@ package org.mozilla.fenix.ext import android.content.Context +import android.graphics.BitmapFactory import android.net.Uri import android.util.Patterns import android.webkit.URLUtil +import androidx.core.graphics.drawable.RoundedBitmapDrawable +import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory import androidx.core.net.toUri import kotlinx.coroutines.runBlocking import mozilla.components.lib.publicsuffixlist.PublicSuffixList import mozilla.components.lib.publicsuffixlist.ext.urlToTrimmedHost import mozilla.components.support.ktx.android.net.hostWithoutCommonPrefixes import java.net.IDN +import java.net.MalformedURLException +import java.net.URL import java.util.Locale const val FILE_PREFIX = "file://" @@ -106,3 +111,19 @@ fun String.simplifiedUrl(): String { } return afterScheme } + +/** + * Gets a rounded drawable from a URL if possible, else null. Must be called off main thread. + */ +fun String.decodeUrlToRoundedDrawable(context: Context): RoundedBitmapDrawable? { + val avatarUrl = try { + URL(this) + } catch (e: MalformedURLException) { + return null + } + val bitmap = BitmapFactory.decodeStream(avatarUrl.openConnection().getInputStream()) + val roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(context.resources, bitmap) + roundedBitmapDrawable.isCircular = true + roundedBitmapDrawable.setAntiAlias(true) + return roundedBitmapDrawable +} 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 d1c33372b..b50314cf2 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -9,6 +9,7 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle +import androidx.appcompat.content.res.AppCompatResources import androidx.lifecycle.lifecycleScope import androidx.navigation.NavDirections import androidx.navigation.findNavController @@ -17,7 +18,10 @@ import androidx.preference.Preference import androidx.preference.Preference.OnPreferenceClickListener import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import mozilla.components.concept.sync.AccountObserver import mozilla.components.concept.sync.AuthType import mozilla.components.concept.sync.OAuthAccount @@ -30,6 +34,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.decodeUrlToRoundedDrawable import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.requireComponents @@ -320,6 +325,19 @@ class SettingsFragment : PreferenceFragmentCompat() { // Signed-in, no problems. if (account != null && !accountManager.accountNeedsReauth()) { preferenceSignIn?.isVisible = false + + profile?.avatar?.url?.let { + lifecycleScope.launch(IO) { + val roundedDrawable = it.decodeUrlToRoundedDrawable(context) + withContext(Main) { + preferenceFirefoxAccount?.icon = + roundedDrawable ?: AppCompatResources.getDrawable( + context, + R.drawable.ic_account + ) + } + } + } preferenceSignIn?.onPreferenceClickListener = null preferenceFirefoxAccountAuthError?.isVisible = false preferenceFirefoxAccount?.isVisible = true diff --git a/app/src/main/res/layout/account_preference.xml b/app/src/main/res/layout/account_preference.xml index bac656151..a6cc7501f 100644 --- a/app/src/main/res/layout/account_preference.xml +++ b/app/src/main/res/layout/account_preference.xml @@ -1,29 +1,22 @@ - - - - - - +