Add network constraint to GV2 messages.

This commit is contained in:
Alan Evans 2020-05-14 15:23:15 -03:00 committed by GitHub
parent 7894f72b0f
commit d726da822c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 14 deletions

View File

@ -133,6 +133,22 @@ public final class GroupDatabase extends Database {
return Optional.fromNullable(reader.getCurrent()); 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. * Call if you are sure this group should exist.
* <p> * <p>

View File

@ -56,6 +56,7 @@ import org.thoughtcrime.securesms.groups.GroupV1MessageProcessor;
import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager; import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.linkpreview.Link; import org.thoughtcrime.securesms.linkpreview.Link;
import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil; import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil;
@ -132,6 +133,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
public final class PushProcessMessageJob extends BaseJob { public final class PushProcessMessageJob extends BaseJob {
@ -193,11 +195,7 @@ public final class PushProcessMessageJob extends BaseJob {
long smsMessageId, long smsMessageId,
long timestamp) long timestamp)
{ {
this(new Parameters.Builder() this(createParameters(content, exceptionMetadata),
.setQueue(buildQueue(content, exceptionMetadata))
.setMaxAttempts(Parameters.UNLIMITED)
// TODO [Alan] GV2 add network constraint and split queues.
.build(),
messageState, messageState,
content, content,
exceptionMetadata, exceptionMetadata,
@ -225,30 +223,45 @@ public final class PushProcessMessageJob extends BaseJob {
} }
@WorkerThread @WorkerThread
private static @NonNull String buildQueue(@Nullable SignalServiceContent content, @Nullable ExceptionMetadata exceptionMetadata) { private static @NonNull Parameters createParameters(@Nullable SignalServiceContent content, @Nullable ExceptionMetadata exceptionMetadata) {
Context context = ApplicationDependencies.getApplication(); Context context = ApplicationDependencies.getApplication();
String suffix = ""; String queueSuffix = "";
Parameters.Builder builder = new Parameters.Builder()
.setMaxAttempts(Parameters.UNLIMITED);
if (content != null) { if (content != null) {
if (content.getDataMessage().isPresent() && content.getDataMessage().get().getGroupContext().isPresent()) { if (content.getDataMessage().isPresent() && content.getDataMessage().get().getGroupContext().isPresent()) {
try { try {
GroupId groupId = GroupUtil.idFromGroupContext(content.getDataMessage().get().getGroupContext().get()); SignalServiceGroupContext signalServiceGroupContext = content.getDataMessage().get().getGroupContext().get();
Recipient recipient = Recipient.externalGroup(context, groupId); 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) { } catch (BadGroupIdException e) {
Log.w(TAG, "Bad groupId! Using default queue."); Log.w(TAG, "Bad groupId! Using default queue.");
} }
} else { } else {
suffix = RecipientId.from(content.getSender()).toQueueKey(); queueSuffix = RecipientId.from(content.getSender()).toQueueKey();
} }
} else if (exceptionMetadata != null) { } else if (exceptionMetadata != null) {
Recipient recipient = exceptionMetadata.groupId != null ? Recipient.externalGroup(context, exceptionMetadata.groupId) Recipient recipient = exceptionMetadata.groupId != null ? Recipient.externalGroup(context, exceptionMetadata.groupId)
: Recipient.external(context, exceptionMetadata.sender); : 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 @Override