diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java index 34af38b7b9..09f46804c8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java @@ -532,7 +532,11 @@ public final class GroupSendUtil { return Collections.singletonList(result); } else { LegacyGroupEvents listener = relatedMessageId != null ? new LegacyMetricEventListener(relatedMessageId.getId()) : LegacyGroupEvents.EMPTY; - return messageSender.sendDataMessage(targets, access, isRecipientUpdate, contentHint, message, listener, partialListener, cancelationSignal, urgent); + if (editMessage != null) { + return messageSender.sendEditMessage(targets, access, isRecipientUpdate, contentHint, message, listener, partialListener, cancelationSignal, urgent, editMessage.getTargetSentTimestamp()); + } else { + return messageSender.sendDataMessage(targets, access, isRecipientUpdate, contentHint, message, listener, partialListener, cancelationSignal, urgent); + } } } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index 10e04f6535..b189f948e1 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -639,6 +639,58 @@ public class SignalServiceMessageSender { return results; } + /** + * Sends an edit message to a group using client-side fanout. + * + * @param partialListener A listener that will be called when an individual send is completed. Will be invoked on an arbitrary background thread, *not* + * the calling thread. + */ + public List sendEditMessage(List recipients, + List> unidentifiedAccess, + boolean isRecipientUpdate, + ContentHint contentHint, + SignalServiceDataMessage message, + LegacyGroupEvents sendEvents, + PartialSendCompleteListener partialListener, + CancelationSignal cancelationSignal, + boolean urgent, + long targetSentTimestamp) + throws IOException, UntrustedIdentityException + { + Log.d(TAG, "[" + message.getTimestamp() + "] Sending a edit message to " + recipients.size() + " recipients."); + + Content content = createEditMessageContent(new SignalServiceEditMessage(targetSentTimestamp, message)); + EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, contentHint, message.getGroupId()); + long timestamp = message.getTimestamp(); + List results = sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, envelopeContent, false, partialListener, cancelationSignal, urgent, false); + boolean needsSyncInResults = false; + + sendEvents.onMessageSent(); + + for (SendMessageResult result : results) { + if (result.getSuccess() != null && result.getSuccess().isNeedsSync()) { + needsSyncInResults = true; + break; + } + } + + if (needsSyncInResults || aciStore.isMultiDevice()) { + Optional recipient = Optional.empty(); + if (!message.getGroupContext().isPresent() && recipients.size() == 1) { + recipient = Optional.of(recipients.get(0)); + } + + Content syncMessage = createMultiDeviceSentTranscriptContent(content, recipient, timestamp, results, isRecipientUpdate, Collections.emptySet()); + EnvelopeContent syncMessageContent = EnvelopeContent.encrypted(syncMessage, ContentHint.IMPLICIT, Optional.empty()); + + sendMessage(localAddress, Optional.empty(), timestamp, syncMessageContent, false, null, false, false); + } + + sendEvents.onSyncMessageSent(); + + return results; + } + public SendMessageResult sendSyncMessage(SignalServiceDataMessage dataMessage) throws IOException, UntrustedIdentityException {