mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-24 13:08:46 +00:00
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
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2906,6 +2906,10 @@ public class RecipientDatabase extends Database {
|
||||
}
|
||||
|
||||
public void setHasGroupsInCommon(@NonNull List<RecipientId> recipientIds) {
|
||||
if (recipientIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
SqlUtil.Query query = SqlUtil.buildCollectionQuery(ID, recipientIds);
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
try (Cursor cursor = db.query(TABLE_NAME,
|
||||
|
||||
@@ -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<Transformation<Bitmap>> 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();
|
||||
|
||||
4
app/src/main/res/drawable/circle_tint_darker.xml
Normal file
4
app/src/main/res/drawable/circle_tint_darker.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
|
||||
<solid android:color="@color/transparent_black_40"/>
|
||||
</shape>
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user