Use a cancelation result instead of an exception for message sends.

This commit is contained in:
Greyson Parrelli
2025-11-04 11:27:40 -05:00
committed by Michelle Tang
parent 95837b09db
commit 42c3f7ead4
6 changed files with 49 additions and 44 deletions

View File

@@ -17,7 +17,6 @@ import org.thoughtcrime.securesms.net.NotPushRegisteredException;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.signalservice.api.CancelationException;
import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage;
import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage.Action;
@@ -127,15 +126,11 @@ public class TypingSendJob extends BaseJob {
SignalServiceTypingMessage typingMessage = new SignalServiceTypingMessage(typing ? Action.STARTED : Action.STOPPED, System.currentTimeMillis(), groupId);
try {
GroupSendUtil.sendTypingMessage(context,
recipient.getGroupId().map(GroupId::requireV2).orElse(null),
recipients,
typingMessage,
this::isCanceled);
} catch (CancelationException e) {
Log.w(TAG, "Canceled during send!");
}
GroupSendUtil.sendTypingMessage(context,
recipient.getGroupId().map(GroupId::requireV2).orElse(null),
recipients,
typingMessage,
this::isCanceled);
}
@Override

View File

@@ -35,7 +35,6 @@ import org.thoughtcrime.securesms.util.RecipientAccessList;
import org.thoughtcrime.securesms.util.RemoteConfig;
import org.thoughtcrime.securesms.util.SignalLocalMetrics;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.signalservice.api.CancelationException;
import org.whispersystems.signalservice.api.SignalServiceMessageSender;
import org.whispersystems.signalservice.api.SignalServiceMessageSender.LegacyGroupEvents;
import org.whispersystems.signalservice.api.SignalServiceMessageSender.SenderKeyGroupEvents;
@@ -446,7 +445,20 @@ public final class GroupSendUtil {
}
if (cancelationSignal != null && cancelationSignal.isCanceled()) {
throw new CancelationException();
Log.i(TAG, "Send canceled. Adding canceled results for " + legacyTargets.size() + " remaining legacy targets.");
for (Recipient recipient : legacyTargets) {
allResults.add(SendMessageResult.canceledFailure(recipients.getAddress(recipient.getId())));
}
if (unregisteredTargets.size() > 0) {
List<SendMessageResult> unregisteredResults = unregisteredTargets.stream()
.filter(Recipient::getHasServiceId)
.map(t -> SendMessageResult.unregisteredFailure(new SignalServiceAddress(t.requireServiceId(), t.getE164().orElse(null))))
.collect(Collectors.toList());
allResults.addAll(unregisteredResults);
}
return allResults;
}
boolean onlyTargetIsSelfWithLinkedDevice = legacyTargets.isEmpty() && senderKeyTargets.isEmpty() && SignalStore.account().isMultiDevice();