From 27a408c9f1dcd9535ddb94ddde999b211e6429ba Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 23 Oct 2023 11:36:40 +0200 Subject: [PATCH] Improved avatar geneator to be able to create Icons for notifications & shortcuts --- .../org/linphone/contacts/AvatarGenerator.kt | 25 ++++++++----------- .../org/linphone/contacts/ContactsManager.kt | 15 +++-------- .../notifications/NotificationsManager.kt | 5 +++- .../java/org/linphone/utils/ShortcutUtils.kt | 21 +++++++++++----- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/linphone/contacts/AvatarGenerator.kt b/app/src/main/java/org/linphone/contacts/AvatarGenerator.kt index f41c012ab..6fb729ef3 100644 --- a/app/src/main/java/org/linphone/contacts/AvatarGenerator.kt +++ b/app/src/main/java/org/linphone/contacts/AvatarGenerator.kt @@ -23,9 +23,9 @@ import android.content.Context import android.graphics.* import android.graphics.drawable.BitmapDrawable import android.text.TextPaint -import android.util.TypedValue import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.drawable.IconCompat import org.linphone.R import org.linphone.utils.AppUtils @@ -50,10 +50,6 @@ class AvatarGenerator(private val context: Context) { textSize = size } - fun setTextColorResource(resource: Int) = apply { - textColor = ContextCompat.getColor(context, resource) - } - fun setAvatarSize(size: Int) = apply { avatarSize = size } @@ -62,14 +58,7 @@ class AvatarGenerator(private val context: Context) { initials = label } - fun setBackgroundColorAttribute(attribute: Int) = apply { - val theme = context.theme - val backgroundColorTypedValue = TypedValue() - theme.resolveAttribute(attribute, backgroundColorTypedValue, true) - backgroundColor = ContextCompat.getColor(context, backgroundColorTypedValue.resourceId) - } - - fun build(): BitmapDrawable { + private fun preBuild(): Bitmap { val textPainter = getTextPainter() val painter = getPainter() @@ -86,7 +75,15 @@ class AvatarGenerator(private val context: Context) { canvas.drawCircle(halfSize, halfSize, halfSize, painter) canvas.drawText(initials, bounds.left, bounds.top - textPainter.ascent(), textPainter) - return BitmapDrawable(context.resources, bitmap) + return bitmap + } + + fun build(): BitmapDrawable { + return BitmapDrawable(context.resources, preBuild()) + } + + fun buildIcon(): IconCompat { + return IconCompat.createWithAdaptiveBitmap(preBuild()) } private fun getTextPainter(): TextPaint { diff --git a/app/src/main/java/org/linphone/contacts/ContactsManager.kt b/app/src/main/java/org/linphone/contacts/ContactsManager.kt index 9b22c4fd6..59804102b 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contacts/ContactsManager.kt @@ -34,7 +34,6 @@ import androidx.core.app.Person import androidx.core.graphics.drawable.IconCompat import androidx.loader.app.LoaderManager import org.linphone.LinphoneApplication.Companion.coreContext -import org.linphone.R import org.linphone.core.Address import org.linphone.core.Core import org.linphone.core.CoreListenerStub @@ -47,6 +46,7 @@ import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.ui.main.contacts.model.ContactNumberOrAddressClickListener import org.linphone.ui.main.contacts.model.ContactNumberOrAddressModel import org.linphone.ui.main.model.isInSecureMode +import org.linphone.utils.AppUtils import org.linphone.utils.ImageUtils import org.linphone.utils.LinphoneUtils import org.linphone.utils.PhoneNumberUtils @@ -56,8 +56,6 @@ class ContactsManager @UiThread constructor(context: Context) { private const val TAG = "[Contacts Manager]" } - val contactAvatar: IconCompat - private var nativeContactsLoaded = false private val listeners = arrayListOf() @@ -94,13 +92,6 @@ class ContactsManager @UiThread constructor(context: Context) { } } - init { - contactAvatar = IconCompat.createWithResource( - context, - R.drawable.user_circle - ) - } - @UiThread fun loadContacts(activity: MainActivity) { val manager = LoaderManager.getInstance(activity) @@ -346,7 +337,7 @@ class ContactsManager @UiThread constructor(context: Context) { val bm = ImageUtils.getBitmap(coreContext.context, photo) personBuilder.setIcon( if (bm == null) { - coreContext.contactsManager.contactAvatar + AvatarGenerator(coreContext.context).setInitials(AppUtils.getInitials(name)).buildIcon() } else { IconCompat.createWithAdaptiveBitmap(bm) } @@ -375,7 +366,7 @@ fun Friend.getPerson(): Person { val bm: Bitmap? = getAvatarBitmap() personBuilder.setIcon( if (bm == null) { - coreContext.contactsManager.contactAvatar + AvatarGenerator(coreContext.context).setInitials(AppUtils.getInitials(name.orEmpty())).buildIcon() } else { IconCompat.createWithAdaptiveBitmap(bm) } diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 84a763c94..5c9f30cdf 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -47,6 +47,7 @@ import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R +import org.linphone.contacts.AvatarGenerator import org.linphone.contacts.getAvatarBitmap import org.linphone.contacts.getPerson import org.linphone.core.Address @@ -987,7 +988,9 @@ class NotificationsManager @MainThread constructor(private val context: Context) return friend?.getPerson() ?: Person.Builder() .setName(displayName) - .setIcon(coreContext.contactsManager.contactAvatar) + .setIcon( + AvatarGenerator(context).setInitials(AppUtils.getInitials(displayName)).buildIcon() + ) .setKey(displayName) .build() } diff --git a/app/src/main/java/org/linphone/utils/ShortcutUtils.kt b/app/src/main/java/org/linphone/utils/ShortcutUtils.kt index 44e5e4a6b..8f9b9995b 100644 --- a/app/src/main/java/org/linphone/utils/ShortcutUtils.kt +++ b/app/src/main/java/org/linphone/utils/ShortcutUtils.kt @@ -33,6 +33,7 @@ import androidx.core.graphics.drawable.IconCompat import kotlin.math.min import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R +import org.linphone.contacts.AvatarGenerator import org.linphone.contacts.getPerson import org.linphone.core.ChatRoom import org.linphone.core.tools.Log @@ -92,8 +93,10 @@ class ShortcutUtils { personsList.add(person) } - icon = person?.icon ?: coreContext.contactsManager.contactAvatar subject = contact?.name ?: LinphoneUtils.getDisplayName(peerAddress) + icon = person?.icon ?: AvatarGenerator(context).setInitials( + AppUtils.getInitials(subject) + ).buildIcon() } else if (chatRoom.hasCapability(ChatRoom.Capabilities.OneToOne.toInt()) && chatRoom.participants.isNotEmpty()) { val address = chatRoom.participants.first().address val contact = @@ -104,7 +107,9 @@ class ShortcutUtils { } subject = contact?.name ?: LinphoneUtils.getDisplayName(address) - icon = person?.icon ?: coreContext.contactsManager.contactAvatar + icon = person?.icon ?: AvatarGenerator(context).setInitials( + AppUtils.getInitials(subject) + ).buildIcon() } else { val list = arrayListOf() for (participant in chatRoom.participants) { @@ -120,10 +125,14 @@ class ShortcutUtils { } } subject = chatRoom.subject.orEmpty() - val iconSize = AppUtils.getDimension(R.dimen.avatar_list_cell_size).toInt() - icon = IconCompat.createWithAdaptiveBitmap( - ImageUtils.getBitmapFromMultipleAvatars(context, iconSize, list) - ) + icon = if (list.isNotEmpty()) { + val iconSize = AppUtils.getDimension(R.dimen.avatar_list_cell_size).toInt() + IconCompat.createWithAdaptiveBitmap( + ImageUtils.getBitmapFromMultipleAvatars(context, iconSize, list) + ) + } else { + AvatarGenerator(context).setInitials(subject).buildIcon() + } } val persons = arrayOfNulls(personsList.size)