From 5ca4db6ea5490eb53b22f2cdfaa1b5f9b464decd Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Sat, 24 Apr 2021 14:31:38 -0400 Subject: [PATCH] Fix crashes and issues with blurred avatars. - Tinting on Android 5/6 caused NPE deep in Android - Invite group flow can have zero members - Missed spot to blur avatar in old notification flow --- .../conversation/ConversationBannerView.java | 7 ++----- .../securesms/database/RecipientDatabase.java | 4 ++++ .../SingleRecipientNotificationBuilder.java | 14 +++++++++++++- app/src/main/res/drawable/circle_tint_darker.xml | 4 ++++ .../main/res/layout/conversation_banner_view.xml | 3 ++- 5 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable/circle_tint_darker.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationBannerView.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationBannerView.java index 58638c850f..a6bc1fdf29 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationBannerView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationBannerView.java @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.conversation; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.PorterDuff; +import android.graphics.drawable.LayerDrawable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; @@ -58,19 +59,15 @@ public class ConversationBannerView extends ConstraintLayout { public void setAvatar(@NonNull GlideRequests requests, @Nullable Recipient recipient) { contactAvatar.setAvatar(requests, recipient, false); - if (recipient.shouldBlurAvatar() && recipient.getContactPhoto() != null) { + if (recipient != null && recipient.shouldBlurAvatar() && recipient.getContactPhoto() != null) { tapToView.setVisibility(VISIBLE); tapToView.setOnClickListener(v -> { SignalExecutors.BOUNDED.execute(() -> DatabaseFactory.getRecipientDatabase(getContext().getApplicationContext()) .manuallyShowAvatar(recipient.getId())); }); - ImageViewCompat.setImageTintList(contactAvatar, ColorStateList.valueOf(ContextCompat.getColor(getContext(), R.color.transparent_black_40))); - ImageViewCompat.setImageTintMode(contactAvatar, PorterDuff.Mode.SRC_ATOP); } else { tapToView.setVisibility(GONE); tapToView.setOnClickListener(null); - ImageViewCompat.setImageTintList(contactAvatar, null); - ImageViewCompat.setImageTintMode(contactAvatar, PorterDuff.Mode.SRC_IN); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java index ef0ffeb20c..b6ccf63a0e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java @@ -2906,6 +2906,10 @@ public class RecipientDatabase extends Database { } public void setHasGroupsInCommon(@NonNull List recipientIds) { + if (recipientIds.isEmpty()) { + return; + } + SqlUtil.Query query = SqlUtil.buildCollectionQuery(ID, recipientIds); SQLiteDatabase db = databaseHelper.getWritableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java index 7ae4497626..5647454dc8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java @@ -20,7 +20,10 @@ import androidx.core.app.RemoteInput; import androidx.core.graphics.drawable.IconCompat; import com.annimon.stream.Stream; +import com.bumptech.glide.load.MultiTransformation; +import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.resource.bitmap.CircleCrop; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; @@ -30,6 +33,7 @@ import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.GeneratedContactPhoto; import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.Slide; @@ -38,12 +42,14 @@ import org.thoughtcrime.securesms.preferences.widgets.NotificationPrivacyPrefere import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.AvatarUtil; import org.thoughtcrime.securesms.util.BitmapUtil; +import org.thoughtcrime.securesms.util.BlurTransformation; import org.thoughtcrime.securesms.util.BubbleUtil; import org.thoughtcrime.securesms.util.ConversationUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.libsignal.util.guava.Optional; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutionException; @@ -103,10 +109,16 @@ public class SingleRecipientNotificationBuilder extends AbstractNotificationBuil if (contactPhoto != null) { try { + List> transforms = new ArrayList<>(); + if (recipient.shouldBlurAvatar()) { + transforms.add(new BlurTransformation(ApplicationDependencies.getApplication(), 0.25f, BlurTransformation.MAX_RADIUS)); + } + transforms.add(new CircleCrop()); + return GlideApp.with(context.getApplicationContext()) .load(contactPhoto) .diskCacheStrategy(DiskCacheStrategy.ALL) - .circleCrop() + .transform(new MultiTransformation<>(transforms)) .submit(context.getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width), context.getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_height)) .get(); diff --git a/app/src/main/res/drawable/circle_tint_darker.xml b/app/src/main/res/drawable/circle_tint_darker.xml new file mode 100644 index 0000000000..54a462b099 --- /dev/null +++ b/app/src/main/res/drawable/circle_tint_darker.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/conversation_banner_view.xml b/app/src/main/res/layout/conversation_banner_view.xml index 934ce19018..1146d365f9 100644 --- a/app/src/main/res/layout/conversation_banner_view.xml +++ b/app/src/main/res/layout/conversation_banner_view.xml @@ -22,7 +22,8 @@ android:layout_height="0dp" android:orientation="vertical" android:gravity="center" - android:visibility="gone" + android:background="@drawable/circle_tint_darker" + android:visibility="visible" android:foreground="?attr/selectableItemBackground" app:layout_constraintBottom_toBottomOf="@+id/message_request_avatar" app:layout_constraintEnd_toEndOf="@+id/message_request_avatar"