diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java index 5b8b26a7a..f0c681ce0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java @@ -140,7 +140,7 @@ final class GroupStateMapper { } }, (groupB, groupA) -> GroupChangeReconstruct.reconstructGroupChange(groupA, groupB), - (groupA, groupB) -> DecryptedGroupUtil.changeIsEmpty(GroupChangeReconstruct.reconstructGroupChange(groupA, groupB)) + (groupA, groupB) -> groupA.getRevision() == groupB.getRevision() && DecryptedGroupUtil.changeIsEmpty(GroupChangeReconstruct.reconstructGroupChange(groupA, groupB)) ); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupV2InfoWorkerJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupV2InfoWorkerJob.java index 98cce1e73..b5f7cac4a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupV2InfoWorkerJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupV2InfoWorkerJob.java @@ -10,12 +10,12 @@ import org.thoughtcrime.securesms.groups.GroupChangeBusyException; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.groups.GroupManager; import org.thoughtcrime.securesms.groups.GroupNotAMemberException; +import org.thoughtcrime.securesms.groups.v2.processing.GroupsV2StateProcessor; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.util.FeatureFlags; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.groupsv2.NoCredentialForRedemptionTimeException; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; @@ -71,7 +71,11 @@ final class RequestGroupV2InfoWorkerJob extends BaseJob { @Override public void onRun() throws IOException, GroupNotAMemberException, GroupChangeBusyException { - Log.i(TAG, "Updating group to revision " + toRevision); + if (toRevision == GroupsV2StateProcessor.LATEST) { + Log.i(TAG, "Updating group to latest revision"); + } else { + Log.i(TAG, "Updating group to revision " + toRevision); + } Optional group = DatabaseFactory.getGroupDatabase(context).getGroup(groupId); diff --git a/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapperTest.java b/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapperTest.java index dc80149c9..3864a9860 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapperTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapperTest.java @@ -439,6 +439,30 @@ public final class GroupStateMapperTest { assertEquals(log8.getGroup(), advanceGroupStateResult.getNewGlobalGroupState().getLocalState()); } + @Test + public void no_actual_change() { + DecryptedGroup currentState = state(0); + ServerGroupLogEntry log1 = serverLogEntry(1); + ServerGroupLogEntry log2 = new ServerGroupLogEntry(DecryptedGroup.newBuilder(log1.getGroup()) + .setRevision(2) + .build(), + DecryptedGroupChange.newBuilder() + .setRevision(2) + .setEditor(UuidUtil.toByteString(KNOWN_EDITOR)) + .setNewTitle(DecryptedString.newBuilder().setValue(log1.getGroup().getTitle())) + .build()); + + AdvanceGroupStateResult advanceGroupStateResult = GroupStateMapper.partiallyAdvanceGroupState(new GlobalGroupState(currentState, asList(log1, log2)), 2); + + assertThat(advanceGroupStateResult.getProcessedLogEntries(), is(asList(asLocal(log1), + new LocalGroupLogEntry(log2.getGroup(), DecryptedGroupChange.newBuilder() + .setRevision(2) + .setEditor(UuidUtil.toByteString(KNOWN_EDITOR)) + .build())))); + assertTrue(advanceGroupStateResult.getNewGlobalGroupState().getServerHistory().isEmpty()); + assertEquals(log2.getGroup(), advanceGroupStateResult.getNewGlobalGroupState().getLocalState()); + } + private static void assertNewState(GlobalGroupState expected, GlobalGroupState actual) { assertEquals(expected.getLocalState(), actual.getLocalState()); assertThat(actual.getServerHistory(), is(expected.getServerHistory()));