From d726da822cf138f3300c6976a89e59cf693a73c9 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Thu, 14 May 2020 15:23:15 -0300 Subject: [PATCH] Add network constraint to GV2 messages. --- .../securesms/database/GroupDatabase.java | 16 ++++++++ .../securesms/jobs/PushProcessMessageJob.java | 41 ++++++++++++------- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java index a146030dfc..5d8a313d07 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -133,6 +133,22 @@ public final class GroupDatabase extends Database { return Optional.fromNullable(reader.getCurrent()); } + /** + * @return local db group revision or -1 if not present. + */ + public int getGroupV2Revision(@NonNull GroupId.V2 groupId) { + try (Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, null, GROUP_ID + " = ?", + new String[] {groupId.toString()}, + null, null, null)) + { + if (cursor != null && cursor.moveToNext()) { + return cursor.getInt(cursor.getColumnIndexOrThrow(V2_REVISION)); + } + + return -1; + } + } + /** * Call if you are sure this group should exist. *

diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java index 2820266747..3b33246f7e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java @@ -56,6 +56,7 @@ import org.thoughtcrime.securesms.groups.GroupV1MessageProcessor; 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.linkpreview.Link; import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil; @@ -132,6 +133,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.concurrent.TimeUnit; public final class PushProcessMessageJob extends BaseJob { @@ -193,11 +195,7 @@ public final class PushProcessMessageJob extends BaseJob { long smsMessageId, long timestamp) { - this(new Parameters.Builder() - .setQueue(buildQueue(content, exceptionMetadata)) - .setMaxAttempts(Parameters.UNLIMITED) - // TODO [Alan] GV2 add network constraint and split queues. - .build(), + this(createParameters(content, exceptionMetadata), messageState, content, exceptionMetadata, @@ -225,30 +223,45 @@ public final class PushProcessMessageJob extends BaseJob { } @WorkerThread - private static @NonNull String buildQueue(@Nullable SignalServiceContent content, @Nullable ExceptionMetadata exceptionMetadata) { - Context context = ApplicationDependencies.getApplication(); - String suffix = ""; + private static @NonNull Parameters createParameters(@Nullable SignalServiceContent content, @Nullable ExceptionMetadata exceptionMetadata) { + Context context = ApplicationDependencies.getApplication(); + String queueSuffix = ""; + Parameters.Builder builder = new Parameters.Builder() + .setMaxAttempts(Parameters.UNLIMITED); if (content != null) { if (content.getDataMessage().isPresent() && content.getDataMessage().get().getGroupContext().isPresent()) { try { - GroupId groupId = GroupUtil.idFromGroupContext(content.getDataMessage().get().getGroupContext().get()); - Recipient recipient = Recipient.externalGroup(context, groupId); + SignalServiceGroupContext signalServiceGroupContext = content.getDataMessage().get().getGroupContext().get(); + GroupId groupId = GroupUtil.idFromGroupContext(signalServiceGroupContext); + Recipient recipient = Recipient.externalGroup(context, groupId); - suffix = recipient.getId().toQueueKey(); + queueSuffix = recipient.getId().toQueueKey(); + + if (groupId.isV2()) { + int localRevision = DatabaseFactory.getGroupDatabase(context) + .getGroupV2Revision(groupId.requireV2()); + + if (signalServiceGroupContext.getGroupV2().get().getRevision() > localRevision) { + builder.addConstraint(NetworkConstraint.KEY) + .setLifespan(TimeUnit.DAYS.toMillis(30)); + } + } } catch (BadGroupIdException e) { Log.w(TAG, "Bad groupId! Using default queue."); } } else { - suffix = RecipientId.from(content.getSender()).toQueueKey(); + queueSuffix = RecipientId.from(content.getSender()).toQueueKey(); } } else if (exceptionMetadata != null) { Recipient recipient = exceptionMetadata.groupId != null ? Recipient.externalGroup(context, exceptionMetadata.groupId) : Recipient.external(context, exceptionMetadata.sender); - suffix = recipient.getId().toQueueKey(); + queueSuffix = recipient.getId().toQueueKey(); } - return QUEUE_PREFIX + suffix; + builder.setQueue(QUEUE_PREFIX + queueSuffix); + + return builder.build(); } @Override