Implement support for 'allows replies' toggle.

This commit is contained in:
Alex Hart
2022-03-01 12:41:45 -04:00
parent ee176cbe3d
commit 35cd36e9fe
40 changed files with 374 additions and 148 deletions

View File

@@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.TransportOption;
import org.thoughtcrime.securesms.conversation.ConversationActivity;
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;
@@ -32,7 +33,7 @@ public class MediaSendActivityResult implements Parcelable {
private final TransportOption transport;
private final boolean viewOnce;
private final Collection<Mention> mentions;
private final boolean isStory;
private final StoryType storyType;
public static @NonNull MediaSendActivityResult fromData(@NonNull Intent data) {
MediaSendActivityResult result = data.getParcelableExtra(MediaSendActivityResult.EXTRA_RESULT);
@@ -49,10 +50,10 @@ public class MediaSendActivityResult implements Parcelable {
@NonNull TransportOption transport,
boolean viewOnce,
@NonNull List<Mention> mentions,
boolean isStory)
@NonNull StoryType storyType)
{
Preconditions.checkArgument(uploadResults.size() > 0, "Must supply uploadResults!");
return new MediaSendActivityResult(recipientId, uploadResults, Collections.emptyList(), body, transport, viewOnce, mentions, isStory);
return new MediaSendActivityResult(recipientId, uploadResults, Collections.emptyList(), body, transport, viewOnce, mentions, storyType);
}
public static @NonNull MediaSendActivityResult forTraditionalSend(@NonNull RecipientId recipientId,
@@ -61,10 +62,10 @@ public class MediaSendActivityResult implements Parcelable {
@NonNull TransportOption transport,
boolean viewOnce,
@NonNull List<Mention> mentions,
boolean isStory)
@NonNull StoryType storyType)
{
Preconditions.checkArgument(nonUploadedMedia.size() > 0, "Must supply media!");
return new MediaSendActivityResult(recipientId, Collections.emptyList(), nonUploadedMedia, body, transport, viewOnce, mentions, isStory);
return new MediaSendActivityResult(recipientId, Collections.emptyList(), nonUploadedMedia, body, transport, viewOnce, mentions, storyType);
}
private MediaSendActivityResult(@NonNull RecipientId recipientId,
@@ -74,7 +75,7 @@ public class MediaSendActivityResult implements Parcelable {
@NonNull TransportOption transport,
boolean viewOnce,
@NonNull List<Mention> mentions,
boolean isStory)
@NonNull StoryType storyType)
{
this.recipientId = recipientId;
this.uploadResults = uploadResults;
@@ -83,7 +84,7 @@ public class MediaSendActivityResult implements Parcelable {
this.transport = transport;
this.viewOnce = viewOnce;
this.mentions = mentions;
this.isStory = isStory;
this.storyType = storyType;
}
private MediaSendActivityResult(Parcel in) {
@@ -94,7 +95,7 @@ public class MediaSendActivityResult implements Parcelable {
this.transport = in.readParcelable(TransportOption.class.getClassLoader());
this.viewOnce = ParcelUtil.readBoolean(in);
this.mentions = ParcelUtil.readParcelableCollection(in, Mention.class);
this.isStory = ParcelUtil.readBoolean(in);
this.storyType = StoryType.fromCode(in.readInt());
}
public @NonNull RecipientId getRecipientId() {
@@ -129,8 +130,8 @@ public class MediaSendActivityResult implements Parcelable {
return mentions;
}
public boolean isStory() {
return isStory;
public @NonNull StoryType getStoryType() {
return storyType;
}
public static final Creator<MediaSendActivityResult> CREATOR = new Creator<MediaSendActivityResult>() {
@@ -159,6 +160,6 @@ public class MediaSendActivityResult implements Parcelable {
dest.writeParcelable(transport, 0);
ParcelUtil.writeBoolean(dest, viewOnce);
ParcelUtil.writeParcelableCollection(dest, mentions);
ParcelUtil.writeBoolean(dest, isStory);
dest.writeInt(storyType.getCode());
}
}

View File

@@ -14,8 +14,10 @@ import org.thoughtcrime.securesms.TransportOption
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
import org.thoughtcrime.securesms.contacts.paged.RecipientSearchKey
import org.thoughtcrime.securesms.database.AttachmentDatabase.TransformProperties
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.ThreadDatabase
import org.thoughtcrime.securesms.database.model.Mention
import org.thoughtcrime.securesms.database.model.StoryType
import org.thoughtcrime.securesms.mediasend.CompositeMediaTransform
import org.thoughtcrime.securesms.mediasend.ImageEditorModelRenderMediaTransform
import org.thoughtcrime.securesms.mediasend.Media
@@ -95,9 +97,15 @@ class MediaSelectionRepository(context: Context) {
}
val singleRecipient: Recipient? = singleContact?.let { Recipient.resolved(it.recipientId) }
val storyType: StoryType = if (singleRecipient?.isDistributionList == true) {
SignalDatabase.distributionLists.getStoryType(singleRecipient.requireDistributionListId())
} else {
StoryType.NONE
}
if (isSms || MessageSender.isLocalSelfSend(context, singleRecipient, isSms)) {
Log.i(TAG, "SMS or local self-send. Skipping pre-upload.")
emitter.onSuccess(MediaSendActivityResult.forTraditionalSend(singleRecipient!!.id, updatedMedia, trimmedBody, transport, isViewOnce, trimmedMentions, false))
emitter.onSuccess(MediaSendActivityResult.forTraditionalSend(singleRecipient!!.id, updatedMedia, trimmedBody, transport, isViewOnce, trimmedMentions, StoryType.NONE))
} else {
val splitMessage = MessageUtil.getSplitMessage(context, trimmedBody, transport.calculateCharacters(trimmedBody).maxPrimaryMessageSize)
val splitBody = splitMessage.body
@@ -126,10 +134,10 @@ class MediaSelectionRepository(context: Context) {
uploadRepository.deleteAbandonedAttachments()
emitter.onComplete()
} else if (uploadResults.isNotEmpty()) {
emitter.onSuccess(MediaSendActivityResult.forPreUpload(singleRecipient!!.id, uploadResults, splitBody, transport, isViewOnce, trimmedMentions, singleContact.isStory))
emitter.onSuccess(MediaSendActivityResult.forPreUpload(singleRecipient!!.id, uploadResults, splitBody, transport, isViewOnce, trimmedMentions, 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, transport, isViewOnce, trimmedMentions, singleContact.isStory))
emitter.onSuccess(MediaSendActivityResult.forTraditionalSend(singleRecipient!!.id, updatedMedia, trimmedBody, transport, isViewOnce, trimmedMentions, storyType))
}
}
}
@@ -196,6 +204,13 @@ class MediaSelectionRepository(context: Context) {
for (contact in contacts) {
val recipient = Recipient.resolved(contact.recipientId)
val isStory = contact is ContactSearchKey.Story || recipient.isDistributionList
val storyType: StoryType = when {
recipient.isDistributionList -> SignalDatabase.distributionLists.getStoryType(recipient.requireDistributionListId())
isStory -> StoryType.STORY_WITH_REPLIES
else -> StoryType.NONE
}
val message = OutgoingMediaMessage(
recipient,
body,
@@ -205,7 +220,7 @@ class MediaSelectionRepository(context: Context) {
TimeUnit.SECONDS.toMillis(recipient.expiresInSeconds.toLong()),
isViewOnce,
ThreadDatabase.DistributionTypes.DEFAULT,
isStory,
storyType,
null,
null,
emptyList(),