From 1aa9aa97ac306d9c9e35c1b9103a41505a0c41b2 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 19 Aug 2022 12:17:08 -0400 Subject: [PATCH] Only include the first photo in quoteAttachments. Otherwise you spend a bunch of time compressing stuff people will never see. --- .../securesms/jobs/PushSendJob.java | 47 ++++++++++--------- .../securesms/util/ImageCompressionUtil.java | 2 +- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java index 5a99bd4237..b8fdfaf52a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.jobs; import android.content.Context; import android.graphics.Bitmap; +import android.media.Image; import android.os.Build; import android.text.TextUtils; @@ -41,6 +42,7 @@ import org.thoughtcrime.securesms.keyvalue.CertificateType; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; +import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; import org.thoughtcrime.securesms.mms.OutgoingMediaMessage; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.mms.QuoteModel; @@ -53,8 +55,8 @@ import org.thoughtcrime.securesms.transport.RetryLaterException; import org.thoughtcrime.securesms.transport.UndeliverableMessageException; import org.thoughtcrime.securesms.util.Base64; import org.thoughtcrime.securesms.util.BitmapDecodingException; -import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.ImageCompressionUtil; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; @@ -63,7 +65,6 @@ import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentRemo import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; import org.whispersystems.signalservice.api.messages.SignalServicePreview; import org.whispersystems.signalservice.api.messages.shared.SharedContact; -import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException; import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException; import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException; @@ -303,42 +304,42 @@ public abstract class PushSendJob extends SendJob { protected Optional getQuoteFor(OutgoingMediaMessage message) throws IOException { if (message.getOutgoingQuote() == null) return Optional.empty(); - long quoteId = message.getOutgoingQuote().getId(); - String quoteBody = message.getOutgoingQuote().getText(); - RecipientId quoteAuthor = message.getOutgoingQuote().getAuthor(); - List quoteMentions = getMentionsFor(message.getOutgoingQuote().getMentions()); - QuoteModel.Type quoteType = message.getOutgoingQuote().getType(); - List quoteAttachments = new LinkedList<>(); - List filteredAttachments = Stream.of(message.getOutgoingQuote().getAttachments()) - .filterNot(a -> MediaUtil.isViewOnceType(a.getContentType())) - .toList(); + long quoteId = message.getOutgoingQuote().getId(); + String quoteBody = message.getOutgoingQuote().getText(); + RecipientId quoteAuthor = message.getOutgoingQuote().getAuthor(); + List quoteMentions = getMentionsFor(message.getOutgoingQuote().getMentions()); + QuoteModel.Type quoteType = message.getOutgoingQuote().getType(); + List quoteAttachments = new LinkedList<>(); + Optional localQuoteAttachment = message.getOutgoingQuote() + .getAttachments() + .stream() + .filter(a -> !MediaUtil.isViewOnceType(a.getContentType())) + .findFirst(); - for (Attachment attachment : filteredAttachments) { - BitmapUtil.ScaleResult thumbnailData = null; - SignalServiceAttachment thumbnail = null; - String thumbnailType = MediaUtil.IMAGE_JPEG; + if (localQuoteAttachment.isPresent()) { + Attachment attachment = localQuoteAttachment.get(); + + ImageCompressionUtil.Result thumbnailData = null; + SignalServiceAttachment thumbnail = null; try { if (MediaUtil.isImageType(attachment.getContentType()) && attachment.getUri() != null) { - Bitmap.CompressFormat format = BitmapUtil.getCompressFormatForContentType(attachment.getContentType()); - - thumbnailData = BitmapUtil.createScaledBytes(context, new DecryptableStreamUriLoader.DecryptableUri(attachment.getUri()), 100, 100, 500 * 1024, format); - thumbnailType = attachment.getContentType(); + thumbnailData = ImageCompressionUtil.compress(context, attachment.getContentType(), new DecryptableUri(attachment.getUri()), 100, 50); } else if (Build.VERSION.SDK_INT >= 23 && MediaUtil.isVideoType(attachment.getContentType()) && attachment.getUri() != null) { Bitmap bitmap = MediaUtil.getVideoThumbnail(context, attachment.getUri(), 1000); if (bitmap != null) { - thumbnailData = BitmapUtil.createScaledBytes(context, bitmap, 100, 100, 500 * 1024); + thumbnailData = ImageCompressionUtil.compress(context, attachment.getContentType(), new DecryptableUri(attachment.getUri()), 100, 50); } } if (thumbnailData != null) { SignalServiceAttachment.Builder builder = SignalServiceAttachment.newStreamBuilder() - .withContentType(thumbnailType) + .withContentType(thumbnailData.getMimeType()) .withWidth(thumbnailData.getWidth()) .withHeight(thumbnailData.getHeight()) - .withLength(thumbnailData.getBitmap().length) - .withStream(new ByteArrayInputStream(thumbnailData.getBitmap())) + .withLength(thumbnailData.getData().length) + .withStream(new ByteArrayInputStream(thumbnailData.getData())) .withResumableUploadSpec(ApplicationDependencies.getSignalServiceMessageSender().getResumableUploadSpec()); thumbnail = builder.build(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ImageCompressionUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ImageCompressionUtil.java index 9e92fab024..841222d252 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/ImageCompressionUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ImageCompressionUtil.java @@ -80,7 +80,7 @@ public final class ImageCompressionUtil { } private static @NonNull Bitmap.CompressFormat mimeTypeToCompressFormat(@NonNull String mimeType) { - if (MediaUtil.isJpegType(mimeType) || MediaUtil.isHeicType(mimeType) || MediaUtil.isHeifType(mimeType)) { + if (MediaUtil.isJpegType(mimeType) || MediaUtil.isHeicType(mimeType) || MediaUtil.isHeifType(mimeType) || MediaUtil.isVideoType(mimeType)) { return Bitmap.CompressFormat.JPEG; } else { return Bitmap.CompressFormat.PNG;