From f620d1cdb9b92edb62d046e2916c0ec5635e117f Mon Sep 17 00:00:00 2001 From: Anton Chekulaev Date: Thu, 1 Oct 2020 21:15:22 +1000 Subject: [PATCH] Use a Bitmap instead of a BitmapDrawable for open group attachment notification icon. --- .../securesms/loki/api/PublicChatManager.kt | 2 -- .../securesms/loki/views/ProfilePictureView.kt | 3 +-- .../SingleRecipientNotificationBuilder.java | 18 +++++++++++------- .../securesms/recipients/Recipient.java | 5 +++++ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/org/thoughtcrime/securesms/loki/api/PublicChatManager.kt b/src/org/thoughtcrime/securesms/loki/api/PublicChatManager.kt index 018465df4..5cddbe2b6 100644 --- a/src/org/thoughtcrime/securesms/loki/api/PublicChatManager.kt +++ b/src/org/thoughtcrime/securesms/loki/api/PublicChatManager.kt @@ -79,8 +79,6 @@ class PublicChatManager(private val context: Context) { ?.downloadOpenGroupAvatar(server, info.profilePictureURL) avatar = BitmapUtil.fromByteArray(avatarBytes) } - // FIXME: If updating the avatar here, there can be a memory issue if a public chat message contains some attachment. - // The error message is "Failed to execute task in background: Canvas: trying to use a recycled bitmap android.graphics.Bitmap" val result = GroupManager.createOpenGroup(chat.id, context, avatar, chat.displayName) threadID = result.threadId } diff --git a/src/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt b/src/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt index a7dd90a5f..f8b0d5b6a 100644 --- a/src/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt +++ b/src/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt @@ -69,8 +69,7 @@ class ProfilePictureView : RelativeLayout { } } fun isOpenGroupWithAvatar(recipient: Recipient): Boolean { - return recipient.isOpenGroupRecipient && - DatabaseFactory.getGroupDatabase(context).hasAvatar(recipient.address.toString()) + return recipient.isOpenGroupRecipient && recipient.groupAvatarId != null } if (recipient.isGroupRecipient && !isOpenGroupWithAvatar(recipient)) { val users = MentionsManager.shared.userPublicKeyCache[threadID]?.toMutableList() ?: mutableListOf() diff --git a/src/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java b/src/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java index 7fd5b3517..7237cf979 100644 --- a/src/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java +++ b/src/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java @@ -84,13 +84,17 @@ public class SingleRecipientNotificationBuilder extends AbstractNotificationBuil ContactPhoto contactPhoto = recipient.getContactPhoto(); if (contactPhoto != null) { try { - setLargeIcon(GlideApp.with(context.getApplicationContext()) - .load(contactPhoto) - .diskCacheStrategy(DiskCacheStrategy.ALL) - .circleCrop() - .submit(context.getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width), - context.getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_height)) - .get()); + // AC: For some reason, if not use ".asBitmap()" method, the returned BitmapDrawable + // wraps a recycled bitmap and leads to a crash. + Bitmap iconBitmap = GlideApp.with(context.getApplicationContext()) + .asBitmap() + .load(contactPhoto) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .circleCrop() + .submit(context.getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width), + context.getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_height)) + .get(); + setLargeIcon(iconBitmap); } catch (InterruptedException | ExecutionException e) { Log.w(TAG, e); setLargeIcon(getPlaceholderDrawable(context, recipient)); diff --git a/src/org/thoughtcrime/securesms/recipients/Recipient.java b/src/org/thoughtcrime/securesms/recipients/Recipient.java index c44240a30..24c44b19a 100644 --- a/src/org/thoughtcrime/securesms/recipients/Recipient.java +++ b/src/org/thoughtcrime/securesms/recipients/Recipient.java @@ -509,6 +509,11 @@ public class Recipient implements RecipientModifiedListener { if (notify) notifyListeners(); } + @Nullable + public synchronized Long getGroupAvatarId() { + return groupAvatarId; + } + public synchronized @Nullable Uri getMessageRingtone() { if (messageRingtone != null && messageRingtone.getScheme() != null && messageRingtone.getScheme().startsWith("file")) { return null;