From 85df7b7c242c51ce14e6bfc3693f2a9a4ad490a1 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 27 Jun 2023 19:25:56 -0500 Subject: [PATCH] Move whole avatar stack from Bitmap to Drawable --- .../cheogram/android/ConnectionService.java | 5 +- .../ui/adapter/BackupFileAdapter.java | 10 +-- .../siacs/conversations/entities/Contact.java | 3 +- .../persistance/FileBackend.java | 8 +- .../conversations/services/AvatarService.java | 79 ++++++++++--------- .../services/ContactChooserTargetService.java | 5 +- .../services/NotificationService.java | 24 +++--- ...ublishGroupChatProfilePictureActivity.java | 8 +- .../ui/PublishProfilePictureActivity.java | 8 +- .../ui/util/AvatarWorkerTask.java | 20 +++-- src/main/res/layout/message_sent.xml | 32 ++------ 11 files changed, 101 insertions(+), 101 deletions(-) diff --git a/src/cheogram/java/com/cheogram/android/ConnectionService.java b/src/cheogram/java/com/cheogram/android/ConnectionService.java index 91053749ef3c022716ef04bf6688084651a5a30d..7c85dadab4acb8071d70b6c7d1e8921bf6b223c3 100644 --- a/src/cheogram/java/com/cheogram/android/ConnectionService.java +++ b/src/cheogram/java/com/cheogram/android/ConnectionService.java @@ -44,6 +44,7 @@ import io.michaelrocks.libphonenumber.android.NumberParseException; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; +import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.services.AppRTCAudioManager; import eu.siacs.conversations.services.AvatarService; import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder; @@ -215,11 +216,11 @@ public class ConnectionService extends android.telecom.ConnectionService { this.account = account; this.with = with; - gatewayIcon = Icon.createWithBitmap(xmppConnectionService.getAvatarService().get( + gatewayIcon = Icon.createWithBitmap(FileBackend.drawDrawable(xmppConnectionService.getAvatarService().get( account.getRoster().getContact(Jid.of(with.getDomain())), AvatarService.getSystemUiAvatarSize(xmppConnectionService), false - )); + ))); if (postDialString != null) { for (int i = postDialString.length() - 1; i >= 0; i--) { diff --git a/src/cheogram/java/eu/siacs/conversations/ui/adapter/BackupFileAdapter.java b/src/cheogram/java/eu/siacs/conversations/ui/adapter/BackupFileAdapter.java index 9857dcd8ac34e664c38f8f68a99366d9f139bfe5..d386d822b87396d930c595b70cde834aed1a9e3d 100644 --- a/src/cheogram/java/eu/siacs/conversations/ui/adapter/BackupFileAdapter.java +++ b/src/cheogram/java/eu/siacs/conversations/ui/adapter/BackupFileAdapter.java @@ -86,7 +86,7 @@ public class BackupFileAdapter extends RecyclerView.Adapter { + static class BitmapWorkerTask extends AsyncTask { private final WeakReference imageViewReference; private Jid jid = null; private final int size; @@ -98,17 +98,17 @@ public class BackupFileAdapter extends RecyclerView.Adapter cache = this.mXmppConnectionService.getBitmapCache(); + LruCache cache = this.mXmppConnectionService.getDrawableCache(); for (String key : keys) { cache.remove(key); } @@ -325,9 +326,9 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { } } - private Bitmap get(MucOptions mucOptions, int size, boolean cachedOnly) { + private Drawable get(MucOptions mucOptions, int size, boolean cachedOnly) { final String KEY = key(mucOptions, size); - Bitmap bitmap = this.mXmppConnectionService.getBitmapCache().get(KEY); + Drawable bitmap = this.mXmppConnectionService.getDrawableCache().get(KEY); if (bitmap != null || cachedOnly) { return bitmap; } @@ -348,23 +349,23 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { } } - this.mXmppConnectionService.getBitmapCache().put(KEY, bitmap); + this.mXmppConnectionService.getDrawableCache().put(KEY, bitmap); return bitmap; } - private Bitmap get(List users, int size, boolean cachedOnly) { + private Drawable get(List users, int size, boolean cachedOnly) { final String KEY = key(users, size); - Bitmap bitmap = this.mXmppConnectionService.getBitmapCache().get(KEY); + Drawable bitmap = this.mXmppConnectionService.getDrawableCache().get(KEY); if (bitmap != null || cachedOnly) { return bitmap; } bitmap = getImpl(users, size); - this.mXmppConnectionService.getBitmapCache().put(KEY, bitmap); + this.mXmppConnectionService.getDrawableCache().put(KEY, bitmap); return bitmap; } - private Bitmap getImpl(List users, int size) { + private Drawable getImpl(List users, int size) { int count = users.size(); Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); @@ -395,7 +396,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { drawTile(canvas, "\u2026", PLACEHOLDER_COLOR, size / 2 + 1, size / 2 + 1, size, size); } - return bitmap; + return new BitmapDrawable(bitmap); } public void clear(final MucOptions options) { @@ -404,7 +405,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { } synchronized (this.sizes) { for (Integer size : sizes) { - this.mXmppConnectionService.getBitmapCache().remove(key(options, size)); + this.mXmppConnectionService.getDrawableCache().remove(key(options, size)); } } } @@ -443,13 +444,13 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { return key; } - public Bitmap get(Account account, int size) { + public Drawable get(Account account, int size) { return get(account, size, false); } - public Bitmap get(Account account, int size, boolean cachedOnly) { + public Drawable get(Account account, int size, boolean cachedOnly) { final String KEY = key(account, size); - Bitmap avatar = mXmppConnectionService.getBitmapCache().get(KEY); + Drawable avatar = mXmppConnectionService.getDrawableCache().get(KEY); if (avatar != null || cachedOnly) { return avatar; } @@ -463,11 +464,11 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { avatar = get(jid, null, size, false); } } - mXmppConnectionService.getBitmapCache().put(KEY, avatar); + mXmppConnectionService.getDrawableCache().put(KEY, avatar); return avatar; } - public Bitmap get(Message message, int size, boolean cachedOnly) { + public Drawable get(Message message, int size, boolean cachedOnly) { final Conversational conversation = message.getConversation(); if (message.getType() == Message.TYPE_STATUS && message.getCounterparts() != null && message.getCounterparts().size() > 1) { return get(message.getCounterparts(), size, cachedOnly); @@ -503,7 +504,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { public void clear(Account account) { synchronized (this.sizes) { for (Integer size : sizes) { - this.mXmppConnectionService.getBitmapCache().remove(key(account, size)); + this.mXmppConnectionService.getDrawableCache().remove(key(account, size)); } } } @@ -511,7 +512,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { public void clear(MucOptions.User user) { synchronized (this.sizes) { for (Integer size : sizes) { - this.mXmppConnectionService.getBitmapCache().remove(key(user, size)); + this.mXmppConnectionService.getDrawableCache().remove(key(user, size)); } } } @@ -528,27 +529,27 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { return get(name,null, size,false); }*/ - public Bitmap get(final String name, String seed, final int size, boolean cachedOnly) { + public Drawable get(final String name, String seed, final int size, boolean cachedOnly) { final String KEY = key(seed == null ? name : name+"\0"+seed, size); - Bitmap bitmap = mXmppConnectionService.getBitmapCache().get(KEY); + Drawable bitmap = mXmppConnectionService.getDrawableCache().get(KEY); if (bitmap != null || cachedOnly) { return bitmap; } bitmap = getImpl(name, seed, size); - mXmppConnectionService.getBitmapCache().put(KEY, bitmap); + mXmppConnectionService.getDrawableCache().put(KEY, bitmap); return bitmap; } - public static Bitmap get(final Jid jid, final int size) { + public static Drawable get(final Jid jid, final int size) { return getImpl(jid.asBareJid().toEscapedString(), null, size); } - private static Bitmap getImpl(final String name, final String seed, final int size) { + private static Drawable getImpl(final String name, final String seed, final int size) { Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); final String trimmedName = name == null ? "" : name.trim(); drawTile(canvas, trimmedName, seed, 0, 0, size, size); - return bitmap; + return new BitmapDrawable(bitmap); } private String key(String name, int size) { diff --git a/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java b/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java index c68b502af10af6b10e39b2cf858f391d31492e73..49ffeab513077ef605b0d1a060e0feff2a57e663 100644 --- a/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java +++ b/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java @@ -21,6 +21,7 @@ import java.util.List; import eu.siacs.conversations.Config; import eu.siacs.conversations.entities.Conversation; +import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.ui.ConversationsActivity; import eu.siacs.conversations.utils.Compatibility; @@ -69,8 +70,8 @@ public class ContactChooserTargetService extends ChooserTargetService implements } final String name = conversation.getName().toString(); final Icon icon = - Icon.createWithBitmap( - mXmppConnectionService.getAvatarService().get(conversation, pixel)); + Icon.createWithBitmap(FileBackend.drawDrawable( + mXmppConnectionService.getAvatarService().get(conversation, pixel))); final float score = 1 - (1.0f / MAX_TARGETS) * chooserTargets.size(); final Bundle extras = new Bundle(); extras.putString(ConversationsActivity.EXTRA_CONVERSATION, conversation.getUuid()); diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index 07b2f48ed47a17c0e59a549be0f85ea3b0bff67e..58cf7299bb9c7a80b9af8bb50c0b885b631e2742 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -660,10 +660,10 @@ public class NotificationService { mXmppConnectionService.getString(R.string.rtp_state_incoming_call)); } builder.setStyle(style); - builder.setLargeIcon( + builder.setLargeIcon(FileBackend.drawDrawable( mXmppConnectionService .getAvatarService() - .get(contact, AvatarService.getSystemUiAvatarSize(mXmppConnectionService))); + .get(contact, AvatarService.getSystemUiAvatarSize(mXmppConnectionService)))); final Uri systemAccount = contact.getSystemAccount(); if (systemAccount != null) { builder.addPerson(systemAccount.toString()); @@ -1150,12 +1150,12 @@ public class NotificationService { builder.setContentIntent(createContentIntent(conversation)); builder.setDeleteIntent(createMissedCallsDeleteIntent(conversation)); if (!publicVersion && conversation instanceof Conversation) { - builder.setLargeIcon( + builder.setLargeIcon(FileBackend.drawDrawable( mXmppConnectionService .getAvatarService() .get( (Conversation) conversation, - AvatarService.getSystemUiAvatarSize(mXmppConnectionService))); + AvatarService.getSystemUiAvatarSize(mXmppConnectionService)))); } modifyMissedCall(builder, conversation.getAccount()); return builder; @@ -1250,12 +1250,12 @@ public class NotificationService { quietHours ? "quiet_hours" : (notify ? "messages" : "silent_messages")); if (messages.size() >= 1) { final Conversation conversation = (Conversation) messages.get(0).getConversation(); - mBuilder.setLargeIcon( + mBuilder.setLargeIcon(FileBackend.drawDrawable( mXmppConnectionService .getAvatarService() .get( conversation, - AvatarService.getSystemUiAvatarSize(mXmppConnectionService))); + AvatarService.getSystemUiAvatarSize(mXmppConnectionService)))); mBuilder.setContentTitle(conversation.getName()); if (Config.HIDE_MESSAGE_TEXT_IN_NOTIFICATION) { int count = messages.size(); @@ -1446,14 +1446,14 @@ public class NotificationService { builder.setImportant(c.getBooleanAttribute(Conversation.ATTRIBUTE_PINNED_ON_TOP, false)); } builder.setIcon( - IconCompat.createWithBitmap( + IconCompat.createWithBitmap(FileBackend.drawDrawable( mXmppConnectionService .getAvatarService() .get( message, AvatarService.getSystemUiAvatarSize( mXmppConnectionService), - false))); + false)))); } return builder.build(); } @@ -1473,14 +1473,14 @@ public class NotificationService { builder.setImportant(c.getBooleanAttribute(Conversation.ATTRIBUTE_PINNED_ON_TOP, false)); } builder.setIcon( - IconCompat.createWithBitmap( + IconCompat.createWithBitmap(FileBackend.drawDrawable( mXmppConnectionService .getAvatarService() .get( contact, AvatarService.getSystemUiAvatarSize( mXmppConnectionService), - false))); + false)))); } return builder.build(); } @@ -1492,13 +1492,13 @@ public class NotificationService { new Person.Builder().setName(mXmppConnectionService.getString(R.string.me)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { meBuilder.setIcon( - IconCompat.createWithBitmap( + IconCompat.createWithBitmap(FileBackend.drawDrawable( mXmppConnectionService .getAvatarService() .get( conversation.getAccount(), AvatarService.getSystemUiAvatarSize( - mXmppConnectionService)))); + mXmppConnectionService))))); } final Person me = meBuilder.build(); NotificationCompat.MessagingStyle messagingStyle = diff --git a/src/main/java/eu/siacs/conversations/ui/PublishGroupChatProfilePictureActivity.java b/src/main/java/eu/siacs/conversations/ui/PublishGroupChatProfilePictureActivity.java index 81b0ae15cf50c56db0e42f27c832af2857ad207c..4643a9c814058e427e230063ca81661e7accfc85 100644 --- a/src/main/java/eu/siacs/conversations/ui/PublishGroupChatProfilePictureActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/PublishGroupChatProfilePictureActivity.java @@ -31,6 +31,8 @@ package eu.siacs.conversations.ui; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.util.Log; @@ -76,14 +78,14 @@ public class PublishGroupChatProfilePictureActivity extends XmppActivity impleme private void reloadAvatar() { final int size = (int) getResources().getDimension(R.dimen.publish_avatar_size); - Bitmap bitmap; + Drawable bitmap; if (uri == null) { bitmap = xmppConnectionService.getAvatarService().get(conversation, size); } else { Log.d(Config.LOGTAG, "loading " + uri.toString() + " into preview"); - bitmap = xmppConnectionService.getFileBackend().cropCenterSquare(uri, size); + bitmap = new BitmapDrawable(xmppConnectionService.getFileBackend().cropCenterSquare(uri, size)); } - this.binding.accountImage.setImageBitmap(bitmap); + this.binding.accountImage.setImageDrawable(bitmap); this.binding.publishButton.setEnabled(uri != null); } diff --git a/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java b/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java index 9c74bb70f8759d8cc7aa774f72b8c01627107a0f..1bf8dc9e489d45de81bed116defff5e49fc709b2 100644 --- a/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java @@ -2,6 +2,8 @@ package eu.siacs.conversations.ui; import android.app.Activity; import android.content.Intent; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; @@ -244,12 +246,12 @@ public class PublishProfilePictureActivity extends XmppActivity implements XmppC protected void loadImageIntoPreview(Uri uri) { - Bitmap bm = null; + Drawable bm = null; if (uri == null) { bm = avatarService().get(account, (int) getResources().getDimension(R.dimen.publish_avatar_size)); } else { try { - bm = xmppConnectionService.getFileBackend().cropCenterSquare(uri, (int) getResources().getDimension(R.dimen.publish_avatar_size)); + bm = new BitmapDrawable(xmppConnectionService.getFileBackend().cropCenterSquare(uri, (int) getResources().getDimension(R.dimen.publish_avatar_size))); } catch (Exception e) { Log.d(Config.LOGTAG, "unable to load bitmap into image view", e); } @@ -262,7 +264,7 @@ public class PublishProfilePictureActivity extends XmppActivity implements XmppC this.hintOrWarning.setText(R.string.error_publish_avatar_converting); return; } - this.avatar.setImageBitmap(bm); + this.avatar.setImageDrawable(bm); if (support) { togglePublishButton(uri != null, R.string.publish); this.hintOrWarning.setVisibility(View.INVISIBLE); diff --git a/src/main/java/eu/siacs/conversations/ui/util/AvatarWorkerTask.java b/src/main/java/eu/siacs/conversations/ui/util/AvatarWorkerTask.java index f5331c7a618341304ceafc263bee2706c2cf9067..a7b7080f05838b574b9b6bbd4ae19d320b4c55e1 100644 --- a/src/main/java/eu/siacs/conversations/ui/util/AvatarWorkerTask.java +++ b/src/main/java/eu/siacs/conversations/ui/util/AvatarWorkerTask.java @@ -3,9 +3,11 @@ package eu.siacs.conversations.ui.util; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.drawable.AnimatedImageDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; +import android.os.Build; import android.widget.ImageView; import androidx.annotation.DimenRes; @@ -18,7 +20,7 @@ import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.services.AvatarService; import eu.siacs.conversations.ui.XmppActivity; -public class AvatarWorkerTask extends AsyncTask { +public class AvatarWorkerTask extends AsyncTask { private final WeakReference imageViewReference; private AvatarService.Avatarable avatarable = null; private @DimenRes @@ -30,7 +32,7 @@ public class AvatarWorkerTask extends AsyncTask= 28 && bitmap instanceof AnimatedImageDrawable) { + ((AnimatedImageDrawable) bitmap).start(); + } } } } @@ -81,12 +86,15 @@ public class AvatarWorkerTask extends AsyncTask= 28 && bm instanceof AnimatedImageDrawable) { + ((AnimatedImageDrawable) bm).start(); + } } else { imageView.setBackgroundColor(avatarable.getAvatarBackgroundColor()); imageView.setImageDrawable(null); diff --git a/src/main/res/layout/message_sent.xml b/src/main/res/layout/message_sent.xml index 4531072d899a65db507ab6584bdea3c0b18fc6ef..b99faabb29cb9892038cf88878d08f958a160b7a 100644 --- a/src/main/res/layout/message_sent.xml +++ b/src/main/res/layout/message_sent.xml @@ -10,34 +10,16 @@ android:paddingRight="8dp" android:paddingBottom="3dp"> - - - - - - - - - - + android:layout_alignParentBottom="true" + android:scaleType="fitXY" + app:strokeColor="@color/custom_theme_accent" + app:shapeAppearance="@style/ShapeAppearanceOverlay.Photo" />