From 1d2fbf0ebf8af0f30af71e7d734ec7a9aae7dacd Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 11 Jan 2023 09:07:21 -0500 Subject: [PATCH] Make adding properties to media send result easier. --- .../mediasend/MediaSendActivityResult.java | 165 ------------------ .../mediasend/MediaSendActivityResult.kt | 42 +++++ .../mediasend/v2/MediaSelectionRepository.kt | 36 +++- 3 files changed, 75 insertions(+), 168 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.java deleted file mode 100644 index 62dee53b75..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.java +++ /dev/null @@ -1,165 +0,0 @@ -package org.thoughtcrime.securesms.mediasend; - -import android.content.Intent; -import android.os.Parcel; -import android.os.Parcelable; - -import androidx.annotation.NonNull; - -import org.thoughtcrime.securesms.conversation.ConversationActivity; -import org.thoughtcrime.securesms.conversation.MessageSendType; -import org.thoughtcrime.securesms.database.model.Mention; -import org.thoughtcrime.securesms.database.model.StoryType; -import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.sms.MessageSender.PreUploadResult; -import org.thoughtcrime.securesms.util.ParcelUtil; -import org.whispersystems.signalservice.api.util.Preconditions; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * A class that lets us nicely format data that we'll send back to {@link ConversationActivity}. - */ -public class MediaSendActivityResult implements Parcelable { - - public static final String EXTRA_RESULT = "result"; - - private final RecipientId recipientId; - private final Collection uploadResults; - private final Collection nonUploadedMedia; - private final String body; - private final MessageSendType sendType; - private final boolean viewOnce; - private final Collection mentions; - private final StoryType storyType; - - public static @NonNull MediaSendActivityResult fromData(@NonNull Intent data) { - MediaSendActivityResult result = data.getParcelableExtra(MediaSendActivityResult.EXTRA_RESULT); - if (result == null) { - throw new IllegalArgumentException(); - } - - return result; - } - - public static @NonNull MediaSendActivityResult forPreUpload(@NonNull RecipientId recipientId, - @NonNull Collection uploadResults, - @NonNull String body, - @NonNull MessageSendType sendType, - boolean viewOnce, - @NonNull List mentions, - @NonNull StoryType storyType) - { - Preconditions.checkArgument(uploadResults.size() > 0, "Must supply uploadResults!"); - return new MediaSendActivityResult(recipientId, uploadResults, Collections.emptyList(), body, sendType, viewOnce, mentions, storyType); - } - - public static @NonNull MediaSendActivityResult forTraditionalSend(@NonNull RecipientId recipientId, - @NonNull List nonUploadedMedia, - @NonNull String body, - @NonNull MessageSendType sendType, - boolean viewOnce, - @NonNull List mentions, - @NonNull StoryType storyType) - { - Preconditions.checkArgument(nonUploadedMedia.size() > 0, "Must supply media!"); - return new MediaSendActivityResult(recipientId, Collections.emptyList(), nonUploadedMedia, body, sendType, viewOnce, mentions, storyType); - } - - private MediaSendActivityResult(@NonNull RecipientId recipientId, - @NonNull Collection uploadResults, - @NonNull List nonUploadedMedia, - @NonNull String body, - @NonNull MessageSendType sendType, - boolean viewOnce, - @NonNull List mentions, - @NonNull StoryType storyType) - { - this.recipientId = recipientId; - this.uploadResults = uploadResults; - this.nonUploadedMedia = nonUploadedMedia; - this.body = body; - this.sendType = sendType; - this.viewOnce = viewOnce; - this.mentions = mentions; - this.storyType = storyType; - } - - private MediaSendActivityResult(Parcel in) { - this.recipientId = in.readParcelable(RecipientId.class.getClassLoader()); - this.uploadResults = ParcelUtil.readParcelableCollection(in, PreUploadResult.class); - this.nonUploadedMedia = ParcelUtil.readParcelableCollection(in, Media.class); - this.body = in.readString(); - this.sendType = in.readParcelable(MessageSendType.class.getClassLoader()); - this.viewOnce = ParcelUtil.readBoolean(in); - this.mentions = ParcelUtil.readParcelableCollection(in, Mention.class); - this.storyType = StoryType.fromCode(in.readInt()); - } - - public @NonNull RecipientId getRecipientId() { - return recipientId; - } - - public boolean isPushPreUpload() { - return uploadResults.size() > 0; - } - - public @NonNull Collection getPreUploadResults() { - return uploadResults; - } - - public @NonNull Collection getNonUploadedMedia() { - return nonUploadedMedia; - } - - public @NonNull String getBody() { - return body; - } - - public @NonNull MessageSendType getMessageSendType() { - return sendType; - } - - public boolean isViewOnce() { - return viewOnce; - } - - public @NonNull Collection getMentions() { - return mentions; - } - - public @NonNull StoryType getStoryType() { - return storyType; - } - - public static final Creator CREATOR = new Creator() { - @Override - public MediaSendActivityResult createFromParcel(Parcel in) { - return new MediaSendActivityResult(in); - } - - @Override - public MediaSendActivityResult[] newArray(int size) { - return new MediaSendActivityResult[size]; - } - }; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeParcelable(recipientId, 0); - ParcelUtil.writeParcelableCollection(dest, uploadResults); - ParcelUtil.writeParcelableCollection(dest, nonUploadedMedia); - dest.writeString(body); - dest.writeParcelable(sendType, 0); - ParcelUtil.writeBoolean(dest, viewOnce); - ParcelUtil.writeParcelableCollection(dest, mentions); - dest.writeInt(storyType.getCode()); - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt new file mode 100644 index 0000000000..0d1e96be91 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt @@ -0,0 +1,42 @@ +package org.thoughtcrime.securesms.mediasend + +import android.content.Intent +import android.os.Parcelable +import kotlinx.parcelize.Parcelize +import org.thoughtcrime.securesms.conversation.MessageSendType +import org.thoughtcrime.securesms.database.model.Mention +import org.thoughtcrime.securesms.database.model.StoryType +import org.thoughtcrime.securesms.recipients.RecipientId +import org.thoughtcrime.securesms.sms.MessageSender.PreUploadResult + +/** + * A class that lets us nicely format data that we'll send back to [ConversationActivity]. + */ +@Parcelize +class MediaSendActivityResult( + val recipientId: RecipientId, + val preUploadResults: List = emptyList(), + val nonUploadedMedia: List = emptyList(), + val body: String, + val messageSendType: MessageSendType, + val isViewOnce: Boolean, + val mentions: List, + val storyType: StoryType +) : Parcelable { + + val isPushPreUpload: Boolean + get() = preUploadResults.isNotEmpty() + + init { + require((preUploadResults.isNotEmpty() && nonUploadedMedia.isEmpty()) || (preUploadResults.isEmpty() && nonUploadedMedia.isNotEmpty())) + } + + companion object { + const val EXTRA_RESULT = "result" + + @JvmStatic + fun fromData(data: Intent): MediaSendActivityResult { + return data.getParcelableExtra(EXTRA_RESULT) ?: throw IllegalArgumentException() + } + } +} 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 11c2e20d25..65994d3a84 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 @@ -111,7 +111,17 @@ class MediaSelectionRepository(context: Context) { if (isSms || MessageSender.isLocalSelfSend(context, singleRecipient, MessageSender.SendType.SIGNAL)) { Log.i(TAG, "SMS or local self-send. Skipping pre-upload.") - emitter.onSuccess(MediaSendActivityResult.forTraditionalSend(singleRecipient!!.id, updatedMedia, trimmedBody, sendType, isViewOnce, trimmedMentions, StoryType.NONE)) + emitter.onSuccess( + MediaSendActivityResult( + recipientId = singleRecipient!!.id, + nonUploadedMedia = updatedMedia, + body = trimmedBody, + messageSendType = sendType, + isViewOnce = isViewOnce, + mentions = trimmedMentions, + storyType = StoryType.NONE + ) + ) } else { val splitMessage = MessageUtil.getSplitMessage(context, trimmedBody, sendType.calculateCharacters(trimmedBody).maxPrimaryMessageSize) val splitBody = splitMessage.body @@ -148,10 +158,30 @@ class MediaSelectionRepository(context: Context) { uploadRepository.deleteAbandonedAttachments() emitter.onComplete() } else if (uploadResults.isNotEmpty()) { - emitter.onSuccess(MediaSendActivityResult.forPreUpload(singleRecipient!!.id, uploadResults, splitBody, sendType, isViewOnce, trimmedMentions, storyType)) + emitter.onSuccess( + MediaSendActivityResult( + recipientId = singleRecipient!!.id, + preUploadResults = uploadResults.toList(), + body = splitBody, + messageSendType = sendType, + isViewOnce = isViewOnce, + mentions = trimmedMentions, + storyType = storyType + ) + ) } else { Log.w(TAG, "Got empty upload results! isSms: $isSms, updatedMedia.size(): ${updatedMedia.size}, isViewOnce: $isViewOnce, target: $singleContact") - emitter.onSuccess(MediaSendActivityResult.forTraditionalSend(singleRecipient!!.id, updatedMedia, trimmedBody, sendType, isViewOnce, trimmedMentions, storyType)) + emitter.onSuccess( + MediaSendActivityResult( + recipientId = singleRecipient!!.id, + nonUploadedMedia = updatedMedia, + body = trimmedBody, + messageSendType = sendType, + isViewOnce = isViewOnce, + mentions = trimmedMentions, + storyType = storyType + ) + ) } } }