mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-20 00:29:11 +01:00
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:
committed by
Cody Henthorne
parent
c4bef8099f
commit
b18542a839
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user