From ac4b0ed606e01182fb4170d41fe9ff157427db15 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 31 May 2023 15:28:39 -0400 Subject: [PATCH] Improve auto-leave group behavior. --- .../securesms/delete/DeleteAccountRepository.java | 2 +- .../org/thoughtcrime/securesms/groups/GroupManager.java | 8 ++++---- .../thoughtcrime/securesms/groups/GroupManagerV2.java | 9 +++++---- .../securesms/groups/ui/LeaveGroupDialog.java | 2 +- .../thoughtcrime/securesms/jobs/LeaveGroupV2WorkerJob.kt | 6 +++--- .../securesms/groups/GroupManagerV2Test_edit.kt | 2 +- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/delete/DeleteAccountRepository.java b/app/src/main/java/org/thoughtcrime/securesms/delete/DeleteAccountRepository.java index c12e85af2a..7e898ae94c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/delete/DeleteAccountRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/delete/DeleteAccountRepository.java @@ -86,7 +86,7 @@ class DeleteAccountRepository { while (groupRecord != null) { if (groupRecord.getId().isPush() && groupRecord.isActive()) { if (!groupRecord.isV1Group()) { - GroupManager.leaveGroup(ApplicationDependencies.getApplication(), groupRecord.getId().requirePush()); + GroupManager.leaveGroup(ApplicationDependencies.getApplication(), groupRecord.getId().requirePush(), true); } onDeleteAccountEvent.accept(new DeleteAccountEvent.LeaveGroupsProgress(groups.getCount(), ++groupsLeft)); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java index ad4fe25782..1c8284bb7c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java @@ -118,12 +118,12 @@ public final class GroupManager { } @WorkerThread - public static void leaveGroup(@NonNull Context context, @NonNull GroupId.Push groupId) + public static void leaveGroup(@NonNull Context context, @NonNull GroupId.Push groupId, boolean sendToMembers) throws GroupChangeBusyException, GroupChangeFailedException, IOException { if (groupId.isV2()) { try (GroupManagerV2.GroupEditor edit = new GroupManagerV2(context).edit(groupId.requireV2())) { - edit.leaveGroup(); + edit.leaveGroup(sendToMembers); Log.i(TAG, "Left group " + groupId); } catch (GroupInsufficientRightsException e) { Log.w(TAG, "Unexpected prevention from leaving " + groupId + " due to rights", e); @@ -146,7 +146,7 @@ public final class GroupManager { throws IOException, GroupChangeBusyException, GroupChangeFailedException { if (groupId.isV2()) { - leaveGroup(context, groupId.requireV2()); + leaveGroup(context, groupId.requireV2(), true); } else { if (!GroupManagerV1.silentLeaveGroup(context, groupId.requireV1())) { throw new GroupChangeFailedException(); @@ -169,7 +169,7 @@ public final class GroupManager { throws GroupChangeBusyException, GroupChangeFailedException, GroupInsufficientRightsException, GroupNotAMemberException, IOException { try (GroupManagerV2.GroupEditor edit = new GroupManagerV2(context).edit(groupId.requireV2())) { - edit.ejectMember(recipient.requireServiceId(), false, true); + edit.ejectMember(recipient.requireServiceId(), false, true, true); Log.i(TAG, "Member removed from group " + groupId); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java index e0c3f93c9d..5525d3f571 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java @@ -458,7 +458,7 @@ final class GroupManagerV2 { } @WorkerThread - void leaveGroup() + void leaveGroup(boolean sendToMembers) throws GroupChangeFailedException, GroupInsufficientRightsException, IOException, GroupNotAMemberException { GroupRecord groupRecord = groupDatabase.requireGroup(groupId); @@ -483,14 +483,14 @@ final class GroupManagerV2 { throw new AssertionError(e); } } else if (selfMember.isPresent()) { - ejectMember(serviceId, true, false); + ejectMember(serviceId, true, false, sendToMembers); } else { Log.i(TAG, "Unable to leave group we are not pending or in"); } } @WorkerThread - @NonNull GroupManager.GroupActionResult ejectMember(@NonNull ServiceId serviceId, boolean allowWhenBlocked, boolean ban) + @NonNull GroupManager.GroupActionResult ejectMember(@NonNull ServiceId serviceId, boolean allowWhenBlocked, boolean ban, boolean sendToMembers) throws GroupChangeFailedException, GroupInsufficientRightsException, IOException, GroupNotAMemberException { return commitChangeWithConflictResolution(selfAci, @@ -498,7 +498,8 @@ final class GroupManagerV2 { ban, ban ? v2GroupProperties.getDecryptedGroup().getBannedMembersList() : Collections.emptyList()), - allowWhenBlocked); + allowWhenBlocked, + sendToMembers); } @WorkerThread diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/LeaveGroupDialog.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/LeaveGroupDialog.java index a63b24e618..6c55e9809d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/LeaveGroupDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/LeaveGroupDialog.java @@ -104,7 +104,7 @@ public final class LeaveGroupDialog { private @NonNull GroupChangeResult leaveGroup() { try { - GroupManager.leaveGroup(activity, groupId); + GroupManager.leaveGroup(activity, groupId, true); return GroupChangeResult.SUCCESS; } catch (GroupChangeException | IOException e) { Log.w(TAG, e); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/LeaveGroupV2WorkerJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/LeaveGroupV2WorkerJob.kt index e54c7a1a1c..1226917b93 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/LeaveGroupV2WorkerJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/LeaveGroupV2WorkerJob.kt @@ -43,13 +43,13 @@ class LeaveGroupV2WorkerJob(parameters: Parameters, private val groupId: GroupId val groupRecipient = Recipient.externalGroupExact(groupId) - GroupManager.leaveGroup(context, groupId) + GroupManager.leaveGroup(context, groupId, false) val threadId = SignalDatabase.threads.getThreadIdIfExistsFor(groupRecipient.id) if (threadId != -1L) { - SignalDatabase.recipients.setProfileSharing(groupRecipient.id, true) + SignalDatabase.recipients.setProfileSharing(groupRecipient.id, enabled = false) SignalDatabase.threads.setEntireThreadRead(threadId) - SignalDatabase.threads.update(threadId, false, false) + SignalDatabase.threads.update(threadId, unarchive = false, allowDeletion = false) ApplicationDependencies.getMessageNotifier().updateNotification(context) } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/groups/GroupManagerV2Test_edit.kt b/app/src/test/java/org/thoughtcrime/securesms/groups/GroupManagerV2Test_edit.kt index e5855429f1..932a464f40 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/groups/GroupManagerV2Test_edit.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/groups/GroupManagerV2Test_edit.kt @@ -147,7 +147,7 @@ class GroupManagerV2Test_edit { } editGroup { - leaveGroup() + leaveGroup(true) } then { patchedGroup ->