diff --git a/app/src/main/java/com/infomaniak/mail/data/models/Bimi.kt b/app/src/main/java/com/infomaniak/mail/data/models/Bimi.kt index 8b318e0571c..314dd9c1667 100644 --- a/app/src/main/java/com/infomaniak/mail/data/models/Bimi.kt +++ b/app/src/main/java/com/infomaniak/mail/data/models/Bimi.kt @@ -41,6 +41,8 @@ class Bimi() : EmbeddedRealmObject, Parcelable { this.isCertified = isCertified } + fun isDisplayable(): Boolean = isCertified && svgContentUrl?.isNotEmpty() == true + companion object : Parceler { override fun create(parcel: Parcel): Bimi = with(parcel) { diff --git a/app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListAdapter.kt b/app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListAdapter.kt index 10670ab811b..d4f14d2ceea 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListAdapter.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListAdapter.kt @@ -49,7 +49,6 @@ import com.infomaniak.mail.R import com.infomaniak.mail.data.LocalSettings import com.infomaniak.mail.data.LocalSettings.SwipeAction import com.infomaniak.mail.data.LocalSettings.ThreadDensity -import com.infomaniak.mail.data.api.ApiRoutes import com.infomaniak.mail.data.models.Folder.FolderRole import com.infomaniak.mail.data.models.correspondent.Recipient import com.infomaniak.mail.data.models.thread.Thread @@ -402,11 +401,7 @@ class ThreadListAdapter @Inject constructor( private fun CardviewThreadItemBinding.displayAvatar(thread: Thread) { val (recipient, bimi) = thread.computeAvatarRecipient() - if (bimi?.isCertified == true) { - expeditorAvatar.loadBimiAvatar(ApiRoutes.bimi(bimi.svgContentUrl.toString()), recipient) - } else { - expeditorAvatar.loadAvatar(recipient) - } + expeditorAvatar.loadAvatar(recipient, bimi) } private fun CardviewThreadItemBinding.formatRecipientNames(recipients: List): String { diff --git a/app/src/main/java/com/infomaniak/mail/views/AvatarView.kt b/app/src/main/java/com/infomaniak/mail/views/AvatarView.kt index 814e5d12e4c..bb3ea8bf89f 100644 --- a/app/src/main/java/com/infomaniak/mail/views/AvatarView.kt +++ b/app/src/main/java/com/infomaniak/mail/views/AvatarView.kt @@ -58,11 +58,11 @@ class AvatarView @JvmOverloads constructor( private val binding by lazy { ViewAvatarBinding.inflate(LayoutInflater.from(context), this, true) } private var currentCorrespondent: Correspondent? = null - private var isBimiShown: Boolean = false + private var _bimi: Bimi? = null private val mergedContactObserver = Observer { contacts -> currentCorrespondent?.let { correspondent -> - if (!isBimiShown) loadAvatarUsingDictionary(correspondent, contacts) + loadAvatarUsingDictionary(correspondent, contacts, _bimi) } } @@ -129,14 +129,23 @@ class AvatarView @JvmOverloads constructor( ) } - fun loadAvatar(correspondent: Correspondent?) { - if (correspondent == null) { - loadUnknownUserAvatar() - } else { - // Avoid lateinit property has not been initialized in preview - val contactsFromViewModel = if (isInEditMode) emptyMap() else avatarMergedContactData.mergedContactLiveData.value - loadAvatarUsingDictionary(correspondent, contacts = contactsFromViewModel ?: emptyMap()) - currentCorrespondent = correspondent + fun loadAvatar(correspondent: Correspondent?, bimi: Bimi? = null) { + + _bimi = bimi + + when { + correspondent != null -> { + // Avoid lateinit property has not been initialized in preview + val contactsFromViewModel = if (isInEditMode) emptyMap() else avatarMergedContactData.mergedContactLiveData.value + loadAvatarUsingDictionary(correspondent, contacts = contactsFromViewModel ?: emptyMap(), bimi) + currentCorrespondent = correspondent + } + bimi?.isDisplayable() == true -> { + loadBimiAvatar(ApiRoutes.bimi(bimi.svgContentUrl!!)) + } + else -> { + loadUnknownUserAvatar() + } } } @@ -149,9 +158,8 @@ class AvatarView @JvmOverloads constructor( binding.avatarImage.load(R.drawable.ic_unknown_user_avatar) } - fun loadBimiAvatar(bimiUrl: String, correspondent: Correspondent?) = with(binding.avatarImage) { + private fun loadBimiAvatar(bimiUrl: String, correspondent: Correspondent? = null) = with(binding.avatarImage) { contentDescription = correspondent?.email.orEmpty() - isBimiShown = bimiUrl.isNotEmpty() loadAvatar( backgroundColor = context.getBackgroundColorBasedOnId( correspondent?.email.orEmpty().hashCode(), @@ -171,33 +179,32 @@ class AvatarView @JvmOverloads constructor( return recipientsForEmail?.getOrElse(correspondent.name) { recipientsForEmail.entries.elementAt(0).value } } - private fun loadAvatarUsingDictionary(correspondent: Correspondent, contacts: MergedContactDictionary) { + private fun loadAvatarUsingDictionary(correspondent: Correspondent, contacts: MergedContactDictionary, bimi: Bimi?) { val mergedContact = searchInMergedContact(correspondent, contacts) - binding.avatarImage.baseLoadAvatar(correspondent = mergedContact ?: correspondent) + binding.avatarImage.baseLoadAvatar(correspondent = mergedContact ?: correspondent, bimi) } - private fun ImageView.baseLoadAvatar(correspondent: Correspondent) { - if (correspondent.shouldDisplayUserAvatar()) { - this@AvatarView.loadAvatar(AccountUtils.currentUser!!) - } else { - val avatar = (correspondent as? MergedContact)?.avatar - val color = context.getColor(R.color.onColorfulBackground) - loadAvatar( - backgroundColor = context.getBackgroundColorBasedOnId(correspondent.email.hashCode(), R.array.AvatarColors), - avatarUrl = avatar, - initials = correspondent.initials, - imageLoader = context.imageLoader, - initialsColor = color, - ) - } - } - - fun loadAvatar(correspondent: Correspondent?, bimi: Bimi?) { - val svgContentUrl = bimi?.svgContentUrl - if (bimi == null || !bimi.isCertified || svgContentUrl.isNullOrEmpty()) { - loadAvatar(correspondent) - } else { - loadBimiAvatar(ApiRoutes.bimi(svgContentUrl), correspondent) + private fun ImageView.baseLoadAvatar(correspondent: Correspondent, bimi: Bimi? = null) { + + val avatar = (correspondent as? MergedContact)?.avatar + + when { + correspondent.shouldDisplayUserAvatar() -> { + this@AvatarView.loadAvatar(AccountUtils.currentUser!!) + } + avatar == null && bimi?.isDisplayable() == true -> { + loadBimiAvatar(ApiRoutes.bimi(bimi.svgContentUrl!!), correspondent) + } + else -> { + val color = context.getColor(R.color.onColorfulBackground) + loadAvatar( + backgroundColor = context.getBackgroundColorBasedOnId(correspondent.email.hashCode(), R.array.AvatarColors), + avatarUrl = avatar, + initials = correspondent.initials, + imageLoader = context.imageLoader, + initialsColor = color, + ) + } } } }