From 105862b5248a77bd230f20c09007090b1b6bfce8 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 30 Nov 2020 11:36:01 -0500 Subject: [PATCH] Chunk read sync messages. Same thing we do with read receipts we send to other people. Just missed this part. --- .../jobs/MultiDeviceReadUpdateJob.java | 23 +++++++++++++++++-- .../securesms/jobs/SendReadReceiptJob.java | 4 ++-- .../notifications/MarkReadReceiver.java | 2 +- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java index a5606d6225..478d365e21 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; +import org.thoughtcrime.securesms.jobmanager.JobManager; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.logging.Log; @@ -18,6 +19,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.util.JsonUtils; import org.thoughtcrime.securesms.util.TextSecurePreferences; +import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage; @@ -40,13 +42,13 @@ public class MultiDeviceReadUpdateJob extends BaseJob { private List messageIds; - public MultiDeviceReadUpdateJob(List messageIds) { + private MultiDeviceReadUpdateJob(List messageIds) { this(new Job.Parameters.Builder() .addConstraint(NetworkConstraint.KEY) .setLifespan(TimeUnit.DAYS.toMillis(1)) .setMaxAttempts(Parameters.UNLIMITED) .build(), - messageIds); + SendReadReceiptJob.ensureSize(messageIds, SendReadReceiptJob.MAX_TIMESTAMPS)); } private MultiDeviceReadUpdateJob(@NonNull Job.Parameters parameters, @NonNull List messageIds) { @@ -59,6 +61,23 @@ public class MultiDeviceReadUpdateJob extends BaseJob { } } + /** + * Enqueues all the necessary jobs for read receipts, ensuring that they're all within the + * maximum size. + */ + public static void enqueue(@NonNull List messageIds) { + JobManager jobManager = ApplicationDependencies.getJobManager(); + List> messageIdChunks = Util.chunk(messageIds, SendReadReceiptJob.MAX_TIMESTAMPS); + + if (messageIdChunks.size() > 1) { + Log.w(TAG, "Large receipt count! Had to break into multiple chunks. Total count: " + messageIds.size()); + } + + for (List chunk : messageIdChunks) { + jobManager.add(new MultiDeviceReadUpdateJob(chunk)); + } + } + @Override public @NonNull Data serialize() { String[] ids = new String[messageIds.size()]; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/SendReadReceiptJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SendReadReceiptJob.java index f80a1c1118..bb283cc22e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/SendReadReceiptJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/SendReadReceiptJob.java @@ -35,7 +35,7 @@ public class SendReadReceiptJob extends BaseJob { private static final String TAG = SendReadReceiptJob.class.getSimpleName(); - private static final int MAX_TIMESTAMPS = 500; + static final int MAX_TIMESTAMPS = 500; private static final String KEY_THREAD = "thread"; private static final String KEY_ADDRESS = "address"; @@ -150,7 +150,7 @@ public class SendReadReceiptJob extends BaseJob { Log.w(TAG, "Failed to send read receipts to: " + recipientId); } - private static List ensureSize(@NonNull List list, int maxSize) { + static List ensureSize(@NonNull List list, int maxSize) { if (list.size() > maxSize) { throw new IllegalArgumentException("Too large! Size: " + list.size() + ", maxSize: " + maxSize); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java index 3aa717470e..c0b77a6898 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java @@ -85,7 +85,7 @@ public class MarkReadReceiver extends BroadcastReceiver { scheduleDeletion(context, smsExpirationInfo, mmsExpirationInfo); - ApplicationDependencies.getJobManager().add(new MultiDeviceReadUpdateJob(syncMessageIds)); + MultiDeviceReadUpdateJob.enqueue(syncMessageIds); Map> threadToInfo = Stream.of(markedReadMessages) .collect(Collectors.groupingBy(MarkedMessageInfo::getThreadId));