kopia lustrzana https://github.com/ryukoposting/Signal-Android
Allow group leave operations on blocked groups.
We should be leaving groups *before* they're blocked, but this helps some other cases.fork-5.53.8
rodzic
67f0ba8624
commit
19dc90b68b
|
@ -161,7 +161,7 @@ public final class GroupManager {
|
|||
throws GroupChangeBusyException, GroupChangeFailedException, GroupInsufficientRightsException, GroupNotAMemberException, IOException
|
||||
{
|
||||
try (GroupManagerV2.GroupEditor edit = new GroupManagerV2(context).edit(groupId.requireV2())) {
|
||||
edit.ejectMember(recipient.getId());
|
||||
edit.ejectMember(recipient.getId(), false);
|
||||
Log.i(TAG, "Member removed from group " + groupId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -431,17 +431,17 @@ final class GroupManagerV2 {
|
|||
throw new AssertionError(e);
|
||||
}
|
||||
} else {
|
||||
return ejectMember(self.getId());
|
||||
return ejectMember(self.getId(), true);
|
||||
}
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
@NonNull GroupManager.GroupActionResult ejectMember(@NonNull RecipientId recipientId)
|
||||
@NonNull GroupManager.GroupActionResult ejectMember(@NonNull RecipientId recipientId, boolean allowWhenBlocked)
|
||||
throws GroupChangeFailedException, GroupInsufficientRightsException, IOException, GroupNotAMemberException
|
||||
{
|
||||
Recipient recipient = Recipient.resolved(recipientId);
|
||||
|
||||
return commitChangeWithConflictResolution(groupOperations.createRemoveMembersChange(Collections.singleton(recipient.requireServiceId().uuid())));
|
||||
return commitChangeWithConflictResolution(groupOperations.createRemoveMembersChange(Collections.singleton(recipient.requireServiceId().uuid())), allowWhenBlocked);
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
|
@ -554,12 +554,18 @@ final class GroupManagerV2 {
|
|||
|
||||
private @NonNull GroupManager.GroupActionResult commitChangeWithConflictResolution(@NonNull GroupChange.Actions.Builder change)
|
||||
throws GroupChangeFailedException, GroupNotAMemberException, GroupInsufficientRightsException, IOException
|
||||
{
|
||||
return commitChangeWithConflictResolution(change, false);
|
||||
}
|
||||
|
||||
private @NonNull GroupManager.GroupActionResult commitChangeWithConflictResolution(@NonNull GroupChange.Actions.Builder change, boolean allowWhenBlocked)
|
||||
throws GroupChangeFailedException, GroupNotAMemberException, GroupInsufficientRightsException, IOException
|
||||
{
|
||||
change.setSourceUuid(UuidUtil.toByteString(selfAci.uuid()));
|
||||
|
||||
for (int attempt = 0; attempt < 5; attempt++) {
|
||||
try {
|
||||
return commitChange(change);
|
||||
return commitChange(change, allowWhenBlocked);
|
||||
} catch (GroupPatchNotAcceptedException e) {
|
||||
throw new GroupChangeFailedException(e);
|
||||
} catch (ConflictException e) {
|
||||
|
@ -611,7 +617,7 @@ final class GroupManagerV2 {
|
|||
}
|
||||
}
|
||||
|
||||
private GroupManager.GroupActionResult commitChange(@NonNull GroupChange.Actions.Builder change)
|
||||
private GroupManager.GroupActionResult commitChange(@NonNull GroupChange.Actions.Builder change, boolean allowWhenBlocked)
|
||||
throws GroupNotAMemberException, GroupChangeFailedException, IOException, GroupInsufficientRightsException
|
||||
{
|
||||
final GroupDatabase.GroupRecord groupRecord = groupDatabase.requireGroup(groupId);
|
||||
|
@ -622,7 +628,7 @@ final class GroupManagerV2 {
|
|||
final DecryptedGroup decryptedGroupState;
|
||||
final DecryptedGroup previousGroupState;
|
||||
|
||||
if (Recipient.externalGroupExact(context, groupId).isBlocked()) {
|
||||
if (!allowWhenBlocked && Recipient.externalGroupExact(context, groupId).isBlocked()) {
|
||||
throw new GroupChangeFailedException("Group is blocked.");
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue