Allow forwarding of contacts.

This commit is contained in:
Alex Hart
2023-04-05 13:16:06 -03:00
parent 9771b53c79
commit 921c903190
6 changed files with 57 additions and 24 deletions

View File

@@ -14,6 +14,7 @@ import com.google.protobuf.InvalidProtocolBufferException;
import org.signal.core.util.BreakIteratorCompat;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey;
import org.thoughtcrime.securesms.contactshare.Contact;
import org.thoughtcrime.securesms.database.model.Mention;
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
@@ -23,6 +24,7 @@ import org.thoughtcrime.securesms.stories.Stories;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.ParcelUtil;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.signalservice.api.messages.shared.SharedContact;
import java.io.IOException;
import java.util.ArrayList;
@@ -50,6 +52,7 @@ public final class MultiShareArgs implements Parcelable {
private final long expiresAt;
private final boolean isTextStory;
private final BodyRangeList bodyRanges;
private final List<Contact> sharedContacts;
private MultiShareArgs(@NonNull Builder builder) {
contactSearchKeys = builder.contactSearchKeys;
@@ -66,6 +69,7 @@ public final class MultiShareArgs implements Parcelable {
expiresAt = builder.expiresAt;
isTextStory = builder.isTextStory;
bodyRanges = builder.bodyRanges;
sharedContacts = builder.sharedContacts == null ? new ArrayList<>() : new ArrayList<>(builder.sharedContacts);
}
protected MultiShareArgs(Parcel in) {
@@ -104,6 +108,7 @@ public final class MultiShareArgs implements Parcelable {
Log.w(TAG, "Invalid body range", e);
}
this.bodyRanges = bodyRanges;
sharedContacts = in.createTypedArrayList(Contact.CREATOR);
}
public Set<ContactSearchKey> getContactSearchKeys() {
@@ -169,6 +174,10 @@ public final class MultiShareArgs implements Parcelable {
return bodyRanges;
}
public @NonNull List<Contact> getSharedContacts() {
return sharedContacts;
}
public boolean isValidForStories() {
if (isViewOnce()) {
return false;
@@ -269,6 +278,8 @@ public final class MultiShareArgs implements Parcelable {
} else {
ParcelUtil.writeByteArray(dest, null);
}
dest.writeTypedList(sharedContacts);
}
public Builder buildUpon() {
@@ -288,7 +299,8 @@ public final class MultiShareArgs implements Parcelable {
.withTimestamp(timestamp)
.withExpiration(expiresAt)
.asTextStory(isTextStory)
.withBodyRanges(bodyRanges);
.withBodyRanges(bodyRanges)
.withSharedContacts(sharedContacts);
}
private boolean requiresInterstitial() {
@@ -303,19 +315,20 @@ public final class MultiShareArgs implements Parcelable {
private final Set<ContactSearchKey> contactSearchKeys;
private List<Media> media;
private String draftText;
private StickerLocator stickerLocator;
private boolean borderless;
private Uri dataUri;
private String dataType;
private LinkPreview linkPreview;
private boolean viewOnce;
private List<Mention> mentions;
private long timestamp;
private long expiresAt;
private boolean isTextStory;
private BodyRangeList bodyRanges;
private List<Media> media;
private String draftText;
private StickerLocator stickerLocator;
private boolean borderless;
private Uri dataUri;
private String dataType;
private LinkPreview linkPreview;
private boolean viewOnce;
private List<Mention> mentions;
private long timestamp;
private long expiresAt;
private boolean isTextStory;
private BodyRangeList bodyRanges;
private List<Contact> sharedContacts;
public Builder() {
this(Collections.emptySet());
@@ -390,6 +403,11 @@ public final class MultiShareArgs implements Parcelable {
return this;
}
public @NonNull Builder withSharedContacts(List<Contact> sharedContacts) {
this.sharedContacts = new ArrayList<>(sharedContacts);
return this;
}
public @NonNull MultiShareArgs build() {
return new MultiShareArgs(this);
}

View File

@@ -19,6 +19,7 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.attachments.UriAttachment;
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey;
import org.thoughtcrime.securesms.contactshare.Contact;
import org.thoughtcrime.securesms.conversation.MessageSendType;
import org.thoughtcrime.securesms.conversation.colors.ChatColors;
import org.thoughtcrime.securesms.database.AttachmentTable;
@@ -111,6 +112,7 @@ public final class MultiShareSender {
boolean forceSms = recipient.isForceSmsSelection() && sendType.usesSmsTransport();
int subscriptionId = sendType.getSimSubscriptionIdOr(-1);
long expiresIn = TimeUnit.SECONDS.toMillis(recipient.getExpiresInSeconds());
List<Contact> contacts = multiShareArgs.getSharedContacts();
boolean needsSplit = !sendType.usesSmsTransport() &&
message != null &&
message.length() > sendType.calculateCharacters(message).maxPrimaryMessageSize;
@@ -122,7 +124,8 @@ public final class MultiShareSender {
boolean hasPushMedia = hasMmsMedia ||
multiShareArgs.getLinkPreview() != null ||
!mentions.isEmpty() ||
needsSplit;
needsSplit ||
!contacts.isEmpty();
MultiShareTimestampProvider sentTimestamp = recipient.isDistributionList() ? distributionListSentTimestamps : MultiShareTimestampProvider.create();
boolean canSendAsTextStory = recipientSearchKey.isStory() && multiShareArgs.isValidForTextStoryGeneration();
@@ -145,7 +148,8 @@ public final class MultiShareSender {
sentTimestamp,
canSendAsTextStory,
storiesBatch,
generatedTextStoryBackgroundColor);
generatedTextStoryBackgroundColor,
contacts);
results.add(new MultiShareSendResult(recipientSearchKey, MultiShareSendResult.Type.SUCCESS));
} else if (recipientSearchKey.isStory()) {
results.add(new MultiShareSendResult(recipientSearchKey, MultiShareSendResult.Type.INVALID_SHARE_TO_STORY));
@@ -213,7 +217,8 @@ public final class MultiShareSender {
@NonNull MultiShareTimestampProvider sentTimestamps,
boolean canSendAsTextStory,
@NonNull List<OutgoingMessage> storiesToBatchSend,
@NonNull ChatColors generatedTextStoryBackgroundColor)
@NonNull ChatColors generatedTextStoryBackgroundColor,
@NonNull List<Contact> contacts)
{
String body = multiShareArgs.getDraftText();
if (sendType.usesSignalTransport() && !forceSms && body != null) {
@@ -251,7 +256,8 @@ public final class MultiShareSender {
buildLinkPreviews(context, multiShareArgs.getLinkPreview()),
Collections.emptyList(),
false,
multiShareArgs.getBodyRanges());
multiShareArgs.getBodyRanges(),
contacts);
outgoingMessages.add(outgoingMessage);
} else if (canSendAsTextStory) {
@@ -288,7 +294,8 @@ public final class MultiShareSender {
Collections.emptyList(),
validatedMentions,
false,
multiShareArgs.getBodyRanges());
multiShareArgs.getBodyRanges(),
contacts);
outgoingMessages.add(outgoingMessage);
}
@@ -305,7 +312,8 @@ public final class MultiShareSender {
buildLinkPreviews(context, multiShareArgs.getLinkPreview()),
validatedMentions,
false,
multiShareArgs.getBodyRanges());
multiShareArgs.getBodyRanges(),
contacts);
outgoingMessages.add(outgoingMessage);
}