Improve image and sticker notifications.

This commit is contained in:
Greyson Parrelli 2019-11-27 14:39:37 -05:00
parent 207dd23c86
commit de52bf50a2

View File

@ -33,6 +33,7 @@ import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.BitmapUtil;
import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.libsignal.util.guava.Optional;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -42,6 +43,9 @@ public class SingleRecipientNotificationBuilder extends AbstractNotificationBuil
private static final String TAG = SingleRecipientNotificationBuilder.class.getSimpleName(); private static final String TAG = SingleRecipientNotificationBuilder.class.getSimpleName();
private static final int BIG_PICTURE_DIMEN = 500;
private static final int LARGE_ICON_DIMEN = 250;
private final List<CharSequence> messageBodies = new LinkedList<>(); private final List<CharSequence> messageBodies = new LinkedList<>();
private SlideDeck slideDeck; private SlideDeck slideDeck;
@ -216,10 +220,17 @@ public class SingleRecipientNotificationBuilder extends AbstractNotificationBuil
@Override @Override
public Notification build() { public Notification build() {
if (privacy.isDisplayMessage()) { if (privacy.isDisplayMessage()) {
if (messageBodies.size() == 1 && hasBigPictureSlide(slideDeck)) { Optional<Uri> largeIconUri = getLargeIconUri(slideDeck);
Optional<Uri> bigPictureUri = getBigPictureUri(slideDeck);
if (messageBodies.size() == 1 && largeIconUri.isPresent()) {
setLargeIcon(getNotificationPicture(largeIconUri.get(), LARGE_ICON_DIMEN));
}
if (messageBodies.size() == 1 && bigPictureUri.isPresent()) {
setStyle(new NotificationCompat.BigPictureStyle() setStyle(new NotificationCompat.BigPictureStyle()
.bigPicture(getBigPicture(slideDeck)) .bigPicture(getNotificationPicture(bigPictureUri.get(), BIG_PICTURE_DIMEN))
.setSummaryText(getBigText(messageBodies))); .setSummaryText(getBigText(messageBodies)));
} else { } else {
setStyle(new NotificationCompat.BigTextStyle().bigText(getBigText(messageBodies))); setStyle(new NotificationCompat.BigTextStyle().bigText(getBigText(messageBodies)));
} }
@ -239,34 +250,44 @@ public class SingleRecipientNotificationBuilder extends AbstractNotificationBuil
} }
} }
private boolean hasBigPictureSlide(@Nullable SlideDeck slideDeck) { private static Optional<Uri> getLargeIconUri(@Nullable SlideDeck slideDeck) {
if (slideDeck == null) { if (slideDeck == null) {
return false; return Optional.absent();
}
Slide thumbnailSlide = Optional.fromNullable(slideDeck.getThumbnailSlide()).or(Optional.fromNullable(slideDeck.getStickerSlide())).orNull();
return getThumbnailUri(thumbnailSlide);
}
private static Optional<Uri> getBigPictureUri(@Nullable SlideDeck slideDeck) {
if (slideDeck == null) {
return Optional.absent();
} }
Slide thumbnailSlide = slideDeck.getThumbnailSlide(); Slide thumbnailSlide = slideDeck.getThumbnailSlide();
return getThumbnailUri(thumbnailSlide);
return thumbnailSlide != null &&
thumbnailSlide.hasImage() &&
!thumbnailSlide.isInProgress() &&
thumbnailSlide.getThumbnailUri() != null;
} }
private Bitmap getBigPicture(@NonNull SlideDeck slideDeck) private static Optional<Uri> getThumbnailUri(@Nullable Slide slide) {
if (slide != null && !slide.isInProgress() && slide.getThumbnailUri() != null) {
return Optional.of(slide.getThumbnailUri());
} else {
return Optional.absent();
}
}
private Bitmap getNotificationPicture(@NonNull Uri uri, int dimension)
{ {
try { try {
@SuppressWarnings("ConstantConditions")
Uri uri = slideDeck.getThumbnailSlide().getThumbnailUri();
return GlideApp.with(context.getApplicationContext()) return GlideApp.with(context.getApplicationContext())
.asBitmap() .asBitmap()
.load(new DecryptableStreamUriLoader.DecryptableUri(uri)) .load(new DecryptableStreamUriLoader.DecryptableUri(uri))
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
.submit(500, 500) .submit(dimension, dimension)
.get(); .get();
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
Log.w(TAG, e); Log.w(TAG, e);
return Bitmap.createBitmap(500, 500, Bitmap.Config.RGB_565); return Bitmap.createBitmap(dimension, dimension, Bitmap.Config.RGB_565);
} }
} }