Ensure images sent to stories respect media quality settings.

Stories should always use "Standard" quality, not L3 (high quality). This change ensures that we:

1. Always send stories at the appropriate quality
2. Do not corrupt or overwrite pre-existing image attachments
3. Close several streams when done (thanks StrictMode!)
This commit is contained in:
Alex Hart
2022-07-13 12:48:17 -03:00
committed by Cody Henthorne
parent c4bef8099f
commit b18542a839
20 changed files with 384 additions and 79 deletions

View File

@@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey;
import org.thoughtcrime.securesms.conversation.MessageSendType;
import org.thoughtcrime.securesms.conversation.colors.ChatColors;
import org.thoughtcrime.securesms.database.AttachmentDatabase;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.database.model.Mention;
@@ -32,9 +33,11 @@ import org.thoughtcrime.securesms.keyvalue.StorySend;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.mediasend.Media;
import org.thoughtcrime.securesms.mediasend.v2.text.TextStoryBackgroundColors;
import org.thoughtcrime.securesms.mms.ImageSlide;
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage;
import org.thoughtcrime.securesms.mms.OutgoingSecureMediaMessage;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.mms.SentMediaQuality;
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.mms.SlideDeck;
import org.thoughtcrime.securesms.mms.SlideFactory;
@@ -266,6 +269,8 @@ public final class MultiShareSender {
.flatMap(slide -> {
if (slide instanceof VideoSlide) {
return expandToClips(context, (VideoSlide) slide).stream();
} else if (slide instanceof ImageSlide) {
return java.util.stream.Stream.of(ensureDefaultQuality(context, (ImageSlide) slide));
} else {
return java.util.stream.Stream.of(slide);
}
@@ -273,8 +278,6 @@ public final class MultiShareSender {
.filter(it -> MediaUtil.isStorySupportedType(it.getContentType()))
.collect(Collectors.toList());
// For each video slide, we want to convert it into a media, then clip it, and then transform it BACK into a slide.
for (final Slide slide : storySupportedSlides) {
SlideDeck singletonDeck = new SlideDeck();
singletonDeck.addSlide(slide);
@@ -348,6 +351,26 @@ public final class MultiShareSender {
}
}
private static Slide ensureDefaultQuality(@NonNull Context context, @NonNull ImageSlide imageSlide) {
Attachment attachment = imageSlide.asAttachment();
if (attachment.getTransformProperties().getSentMediaQuality() == SentMediaQuality.HIGH.getCode()) {
return new ImageSlide(
context,
attachment.getUri(),
attachment.getContentType(),
attachment.getSize(),
attachment.getWidth(),
attachment.getHeight(),
attachment.isBorderless(),
attachment.getCaption(),
attachment.getBlurHash(),
AttachmentDatabase.TransformProperties.empty()
);
} else {
return imageSlide;
}
}
private static void sendTextMessage(@NonNull Context context,
@NonNull MultiShareArgs multiShareArgs,
@NonNull Recipient recipient,
@@ -434,7 +457,7 @@ public final class MultiShareSender {
slideDeck.addSlide(new StickerSlide(context, multiShareArgs.getDataUri(), 0, multiShareArgs.getStickerLocator(), multiShareArgs.getDataType()));
} else if (!multiShareArgs.getMedia().isEmpty()) {
for (Media media : multiShareArgs.getMedia()) {
Slide slide = SlideFactory.getSlide(context, media.getMimeType(), media.getUri(), media.getWidth(), media.getHeight());
Slide slide = SlideFactory.getSlide(context, media.getMimeType(), media.getUri(), media.getWidth(), media.getHeight(), media.getTransformProperties().orElse(null));
if (slide != null) {
slideDeck.addSlide(slide);
} else {
@@ -442,7 +465,7 @@ public final class MultiShareSender {
}
}
} else if (multiShareArgs.getDataUri() != null) {
Slide slide = SlideFactory.getSlide(context, multiShareArgs.getDataType(), multiShareArgs.getDataUri(), 0, 0);
Slide slide = SlideFactory.getSlide(context, multiShareArgs.getDataType(), multiShareArgs.getDataUri(), 0, 0, null);
if (slide != null) {
slideDeck.addSlide(slide);
} else {