From d17896ea097333f51e56b352fbf4a79397104a1e Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 6 Jul 2022 16:34:44 -0300 Subject: [PATCH] Reuse video preupload for unclipped media. --- .../mediasend/MediaUploadRepository.java | 2 +- .../mediasend/v2/MediaSelectionRepository.kt | 13 ++++---- .../securesms/sms/MessageSender.java | 30 ++++++++++--------- .../thoughtcrime/securesms/stories/Stories.kt | 3 +- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaUploadRepository.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaUploadRepository.java index 5f55eee009..1941e0e933 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaUploadRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaUploadRepository.java @@ -144,7 +144,7 @@ public class MediaUploadRepository { @WorkerThread private void uploadMediaInternal(@NonNull Media media, @Nullable Recipient recipient) { Attachment attachment = asAttachment(context, media); - PreUploadResult result = MessageSender.preUploadPushAttachment(context, attachment, recipient, MediaUtil.isVideo(media.getMimeType())); + PreUploadResult result = MessageSender.preUploadPushAttachment(context, attachment, recipient, media); if (result != null) { uploadResults.put(media, result); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionRepository.kt index 3864358c16..cfd91b9924 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionRepository.kt @@ -41,7 +41,6 @@ import org.thoughtcrime.securesms.scribbles.ImageEditorFragment import org.thoughtcrime.securesms.sms.MessageSender import org.thoughtcrime.securesms.sms.MessageSender.PreUploadResult import org.thoughtcrime.securesms.stories.Stories -import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.MessageUtil import java.util.Collections import java.util.concurrent.TimeUnit @@ -129,12 +128,10 @@ class MediaSelectionRepository(context: Context) { } val clippedMediaForStories = if (singleContact?.isStory == true || contacts.any { it.isStory }) { - updatedMedia.filter { MediaUtil.isVideo(it.mimeType) }.map { media -> - if (Stories.MediaTransform.getSendRequirements(media) == Stories.MediaTransform.SendRequirements.REQUIRES_CLIP) { - Stories.MediaTransform.clipMediaToStoryDuration(media) - } else { - listOf(media) - } + updatedMedia.filter { + Stories.MediaTransform.getSendRequirements(it) == Stories.MediaTransform.SendRequirements.REQUIRES_CLIP + }.map { media -> + Stories.MediaTransform.clipMediaToStoryDuration(media) }.flatten() } else emptyList() @@ -274,7 +271,7 @@ class MediaSelectionRepository(context: Context) { ) if (isStory) { - preUploadResults.filterNot { it.isVideo }.forEach { + preUploadResults.filterNot { result -> storyClips.any { it.uri == result.media.uri } }.forEach { val list = storyPreUploadMessages[it] ?: mutableListOf() list.add( OutgoingSecureMediaMessage(message).withSentTimestamp( diff --git a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java index bb5546f088..4caf4c5d9b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java @@ -67,6 +67,7 @@ import org.thoughtcrime.securesms.jobs.ResumableUploadSpecJob; import org.thoughtcrime.securesms.jobs.SmsSendJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.linkpreview.LinkPreview; +import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.mms.OutgoingMediaMessage; import org.thoughtcrime.securesms.mms.OutgoingSecureMediaMessage; @@ -215,7 +216,8 @@ public class MessageSender { database.setTransactionSuccessful(); } catch (MmsException e) { - Log.w(TAG, e); + Log.w(TAG, "Failed to send stories.", e); + return; } finally { database.endTransaction(); } @@ -443,7 +445,7 @@ public class MessageSender { * @return A result if the attachment was enqueued, or null if it failed to enqueue or shouldn't * be enqueued (like in the case of a local self-send). */ - public static @Nullable PreUploadResult preUploadPushAttachment(@NonNull Context context, @NonNull Attachment attachment, @Nullable Recipient recipient, boolean isStoryClip) { + public static @Nullable PreUploadResult preUploadPushAttachment(@NonNull Context context, @NonNull Attachment attachment, @Nullable Recipient recipient, @NonNull Media media) { if (isLocalSelfSend(context, recipient, false)) { return null; } @@ -463,7 +465,7 @@ public class MessageSender { .then(uploadJob) .enqueue(); - return new PreUploadResult(isStoryClip, databaseAttachment.getAttachmentId(), Arrays.asList(compressionJob.getId(), resumableUploadSpecJob.getId(), uploadJob.getId())); + return new PreUploadResult(media, databaseAttachment.getAttachmentId(), Arrays.asList(compressionJob.getId(), resumableUploadSpecJob.getId(), uploadJob.getId())); } catch (MmsException e) { Log.w(TAG, "preUploadPushAttachment() - Failed to upload!", e); return null; @@ -751,24 +753,20 @@ public class MessageSender { } public static class PreUploadResult implements Parcelable { - private final boolean isVideo; - private final AttachmentId attachmentId; + private final Media media; + private final AttachmentId attachmentId; private final Collection jobIds; - PreUploadResult(boolean isVideo, @NonNull AttachmentId attachmentId, @NonNull Collection jobIds) { - this.isVideo = isVideo; + PreUploadResult(@NonNull Media media, @NonNull AttachmentId attachmentId, @NonNull Collection jobIds) { + this.media = media; this.attachmentId = attachmentId; this.jobIds = jobIds; } private PreUploadResult(Parcel in) { this.attachmentId = in.readParcelable(AttachmentId.class.getClassLoader()); - this.jobIds = ParcelUtil.readStringCollection(in); - this.isVideo = ParcelUtil.readBoolean(in); - } - - public boolean isVideo() { - return isVideo; + this.jobIds = ParcelUtil.readStringCollection(in); + this.media = in.readParcelable(Media.class.getClassLoader()); } public @NonNull AttachmentId getAttachmentId() { @@ -779,6 +777,10 @@ public class MessageSender { return jobIds; } + public @NonNull Media getMedia() { + return media; + } + public static final Creator CREATOR = new Creator() { @Override public PreUploadResult createFromParcel(Parcel in) { @@ -800,7 +802,7 @@ public class MessageSender { public void writeToParcel(Parcel dest, int flags) { dest.writeParcelable(attachmentId, flags); ParcelUtil.writeStringCollection(dest, jobIds); - ParcelUtil.writeBoolean(dest, isVideo); + dest.writeParcelable(media, flags); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt index 40bedb492a..65391d63a7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt @@ -300,10 +300,11 @@ object Stories { * Callers can utilize canClipMedia to determine if the given media can and should be clipped. */ @JvmStatic + @WorkerThread fun clipMediaToStoryDuration(media: Media): List { val storyDurationUs = TimeUnit.MILLISECONDS.toMicros(MAX_VIDEO_DURATION_MILLIS) val startOffsetUs = media.transformProperties.map { it.videoTrimStartTimeUs }.orElse(0L) - val endOffsetUs = media.transformProperties.map { it.videoTrimEndTimeUs }.orElse(TimeUnit.MILLISECONDS.toMicros(media.duration)) + val endOffsetUs = media.transformProperties.map { it.videoTrimEndTimeUs }.orElse(TimeUnit.MILLISECONDS.toMicros(getVideoDuration(media.uri))) val durationUs = endOffsetUs - startOffsetUs if (durationUs <= 0L) {