From ec47b83f7675af882acc73046a5291ee9fe47871 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 15 May 2026 12:21:05 -0400 Subject: [PATCH] Add sync message encrypt local metric to send flows. --- .../securesms/jobs/IndividualSendJob.kt | 4 +++ .../securesms/messages/GroupSendUtil.java | 10 +++++++ .../securesms/util/SignalLocalMetrics.java | 15 ++++++++++ .../api/SignalServiceMessageSender.java | 28 +++++++++++++++---- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.kt index bf72123ed5..def36ed531 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.kt @@ -409,6 +409,10 @@ class IndividualSendJob private constructor(parameters: Parameters, private val SignalLocalMetrics.IndividualMessageSend.onMessageSent(messageId) } + override fun onSyncMessageEncrypted() { + SignalLocalMetrics.IndividualMessageSend.onSyncMessageEncrypted(messageId) + } + override fun onSyncMessageSent() { SignalLocalMetrics.IndividualMessageSend.onSyncMessageSent(messageId) } 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 117630ff3f..76b5fe9486 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java @@ -942,6 +942,11 @@ public final class GroupSendUtil { public void onSyncMessageSent() { SignalLocalMetrics.GroupMessageSend.onSenderKeySyncSent(messageId); } + + @Override + public void onSyncMessageEncrypted() { + SignalLocalMetrics.GroupMessageSend.onSenderKeySyncEncrypted(messageId); + } } private static final class LegacyMetricEventListener implements LegacyGroupEvents { @@ -964,6 +969,11 @@ public final class GroupSendUtil { public void onSyncMessageSent() { SignalLocalMetrics.GroupMessageSend.onLegacySyncFinished(messageId); } + + @Override + public void onSyncMessageEncrypted() { + SignalLocalMetrics.GroupMessageSend.onLegacySyncEncrypted(messageId); + } } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java b/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java index d354da9e3e..2ac80d3d97 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java @@ -133,6 +133,7 @@ public final class SignalLocalMetrics { private static final String SPLIT_JOB_PRE_NETWORK = "job-pre-network"; private static final String SPLIT_ENCRYPT = "encrypt"; private static final String SPLIT_NETWORK_MAIN = "network-main"; + private static final String SPLIT_SYNC_ENCRYPT = "sync-encrypt"; private static final String SPLIT_NETWORK_SYNC = "network-sync"; private static final String SPLIT_JOB_POST_NETWORK = "job-post-network"; private static final String SPLIT_UI_UPDATE = "ui-update"; @@ -173,6 +174,10 @@ public final class SignalLocalMetrics { split(messageId, SPLIT_NETWORK_MAIN); } + public static void onSyncMessageEncrypted(long messageId) { + split(messageId, SPLIT_SYNC_ENCRYPT); + } + public static void onSyncMessageSent(long messageId) { split(messageId, SPLIT_NETWORK_SYNC); } @@ -318,9 +323,11 @@ public final class SignalLocalMetrics { private static final String SPLIT_SENDER_KEY_SHARED = "sk-shared"; private static final String SPLIT_ENCRYPTION = "encryption"; private static final String SPLIT_NETWORK_SENDER_KEY = "network-sk"; + private static final String SPLIT_SENDER_KEY_SYNC_ENCRYPT = "sk-sync-encrypt"; private static final String SPLIT_NETWORK_SENDER_KEY_SYNC = "network-sk-sync"; private static final String SPLIT_MSL_SENDER_KEY = "msl-sk"; private static final String SPLIT_NETWORK_LEGACY = "network-legacy"; + private static final String SPLIT_LEGACY_SYNC_ENCRYPT = "legacy-sync-encrypt"; private static final String SPLIT_NETWORK_LEGACY_SYNC = "network-legacy-sync"; private static final String SPLIT_JOB_POST_NETWORK = "job-post-network"; private static final String SPLIT_UI_UPDATE = "ui-update"; @@ -367,6 +374,10 @@ public final class SignalLocalMetrics { split(messageId, SPLIT_NETWORK_SENDER_KEY); } + public static void onSenderKeySyncEncrypted(long messageId) { + split(messageId, SPLIT_SENDER_KEY_SYNC_ENCRYPT); + } + public static void onSenderKeySyncSent(long messageId) { split(messageId, SPLIT_NETWORK_SENDER_KEY_SYNC); } @@ -379,6 +390,10 @@ public final class SignalLocalMetrics { split(messageId, SPLIT_NETWORK_LEGACY); } + public static void onLegacySyncEncrypted(long messageId) { + split(messageId, SPLIT_LEGACY_SYNC_ENCRYPT); + } + public static void onLegacySyncFinished(long messageId) { split(messageId, SPLIT_NETWORK_LEGACY_SYNC); } diff --git a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index cda9534042..8c6ee6999b 100644 --- a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -500,7 +500,7 @@ public class SignalServiceMessageSender { Content syncMessage = createMultiDeviceSentTranscriptContent(content, Optional.of(recipient), timestamp, Collections.singletonList(result), false, Collections.emptySet()); EnvelopeContent syncMessageContent = EnvelopeContent.encrypted(syncMessage, ContentHint.IMPLICIT, Optional.empty()); - sendMessage(localAddress, SealedSenderAccess.NONE, timestamp, syncMessageContent, false, null, null, false, false); + sendMessage(localAddress, SealedSenderAccess.NONE, timestamp, syncMessageContent, false, null, sendEvents, false, false); } sendEvents.onSyncMessageSent(); @@ -602,7 +602,7 @@ public class SignalServiceMessageSender { Content syncMessage = createMultiDeviceSentTranscriptContent(content, Optional.empty(), message.getTimestamp(), results, isRecipientUpdate, Collections.emptySet()); EnvelopeContent syncMessageContent = EnvelopeContent.encrypted(syncMessage, ContentHint.IMPLICIT, Optional.empty()); - sendMessage(localAddress, SealedSenderAccess.NONE, message.getTimestamp(), syncMessageContent, false, null, null, false, false); + sendMessage(localAddress, SealedSenderAccess.NONE, message.getTimestamp(), syncMessageContent, false, null, sendEvents, false, false); } sendEvents.onSyncMessageSent(); @@ -653,7 +653,7 @@ public class SignalServiceMessageSender { Content syncMessage = createMultiDeviceSentTranscriptContent(content, recipient, timestamp, results, isRecipientUpdate, Collections.emptySet()); EnvelopeContent syncMessageContent = EnvelopeContent.encrypted(syncMessage, ContentHint.IMPLICIT, Optional.empty()); - sendMessage(localAddress, SealedSenderAccess.NONE, timestamp, syncMessageContent, false, null, null, false, false); + sendMessage(localAddress, SealedSenderAccess.NONE, timestamp, syncMessageContent, false, null, sendEvents, false, false); } sendEvents.onSyncMessageSent(); @@ -705,7 +705,7 @@ public class SignalServiceMessageSender { Content syncMessage = createMultiDeviceSentTranscriptContent(content, recipient, timestamp, results, isRecipientUpdate, Collections.emptySet()); EnvelopeContent syncMessageContent = EnvelopeContent.encrypted(syncMessage, ContentHint.IMPLICIT, Optional.empty()); - sendMessage(localAddress, SealedSenderAccess.NONE, timestamp, syncMessageContent, false, null, null, false, false); + sendMessage(localAddress, SealedSenderAccess.NONE, timestamp, syncMessageContent, false, null, sendEvents, false, false); } sendEvents.onSyncMessageSent(); @@ -2035,11 +2035,17 @@ public class SignalServiceMessageSender { online, urgent, story); + boolean isSentSyncTranscript = content.getContent().isPresent() && content.getContent().get().syncMessage != null && content.getContent().get().syncMessage.sent != null; + if (i == 0 && sendEvents != null) { - sendEvents.onMessageEncrypted(); + if (isSentSyncTranscript) { + sendEvents.onSyncMessageEncrypted(); + } else { + sendEvents.onMessageEncrypted(); + } } - if (content.getContent().isPresent() && content.getContent().get().syncMessage != null && content.getContent().get().syncMessage.sent != null) { + if (isSentSyncTranscript) { Log.d(TAG, "[sendMessage][" + timestamp + "] Sending a sent sync message to devices: " + messages.getDevices()); } else if (content.getContent().isPresent() && content.getContent().get().senderKeyDistributionMessage != null) { Log.d(TAG, "[sendMessage][" + timestamp + "] Sending a SKDM to " + messages.getDestination() + " for devices: " + messages.getDevices() + (content.getContent().get().dataMessage != null ? " (it's piggy-backing on a DataMessage)" : "")); @@ -3044,6 +3050,7 @@ public class SignalServiceMessageSender { void onMessageEncrypted(); void onMessageSent(); void onSyncMessageSent(); + void onSyncMessageEncrypted(); } public interface IndividualSendEvents extends SendEvents { @@ -3056,6 +3063,9 @@ public class SignalServiceMessageSender { @Override public void onSyncMessageSent() { } + + @Override + public void onSyncMessageEncrypted() { } }; } @@ -3072,6 +3082,9 @@ public class SignalServiceMessageSender { @Override public void onSyncMessageSent() { } + + @Override + public void onSyncMessageEncrypted() { } }; void onSenderKeyShared(); @@ -3087,6 +3100,9 @@ public class SignalServiceMessageSender { @Override public void onSyncMessageSent() { } + + @Override + public void onSyncMessageEncrypted() { } }; }