Groups V2 invite decline.

This commit is contained in:
Alan Evans
2020-07-15 15:40:13 -03:00
committed by Greyson Parrelli
parent 1ce36c1069
commit 644af87782
13 changed files with 245 additions and 87 deletions

View File

@@ -127,11 +127,15 @@ public final class GroupManager {
}
@WorkerThread
public static boolean silentLeaveGroup(@NonNull Context context, @NonNull GroupId.Push groupId) {
public static void leaveGroupFromBlockOrMessageRequest(@NonNull Context context, @NonNull GroupId.Push groupId)
throws IOException, GroupChangeBusyException, GroupChangeFailedException
{
if (groupId.isV2()) {
throw new AssertionError("NYI"); // TODO [Alan] GV2 support silent leave for block and leave operations on GV2
leaveGroup(context, groupId.requireV2());
} else {
return GroupManagerV1.silentLeaveGroup(context, groupId.requireV1());
if (!GroupManagerV1.silentLeaveGroup(context, groupId.requireV1())) {
throw new GroupChangeFailedException();
}
}
}

View File

@@ -14,6 +14,8 @@ import org.signal.storageservice.protos.groups.Member;
import org.signal.storageservice.protos.groups.local.DecryptedGroup;
import org.signal.storageservice.protos.groups.local.DecryptedGroupChange;
import org.signal.storageservice.protos.groups.local.DecryptedMember;
import org.signal.storageservice.protos.groups.local.DecryptedPendingMember;
import org.signal.zkgroup.InvalidInputException;
import org.signal.zkgroup.VerificationFailedException;
import org.signal.zkgroup.groups.GroupMasterKey;
import org.signal.zkgroup.groups.GroupSecretParams;
@@ -54,6 +56,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
@@ -268,7 +271,20 @@ final class GroupManagerV2 {
@NonNull GroupManager.GroupActionResult leaveGroup()
throws GroupChangeFailedException, GroupInsufficientRightsException, IOException, GroupNotAMemberException
{
return ejectMember(Recipient.self().getId());
Recipient self = Recipient.self();
GroupDatabase.GroupRecord groupRecord = groupDatabase.getGroup(groupId).get();
List<DecryptedPendingMember> pendingMembersList = groupRecord.requireV2GroupProperties().getDecryptedGroup().getPendingMembersList();
Optional<DecryptedPendingMember> selfPendingMember = DecryptedGroupUtil.findPendingByUuid(pendingMembersList, selfUuid);
if (selfPendingMember.isPresent()) {
try {
return cancelInvites(Collections.singleton(new UuidCiphertext(selfPendingMember.get().getUuidCipherText().toByteArray())));
} catch (InvalidInputException e) {
throw new AssertionError(e);
}
} else {
return ejectMember(self.getId());
}
}
@WorkerThread

View File

@@ -28,6 +28,7 @@ import org.thoughtcrime.securesms.groups.ui.GroupChangeFailureReason;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
@@ -160,6 +161,17 @@ final class ManageGroupRepository {
});
}
void blockAndLeaveGroup(@NonNull GroupChangeErrorCallback error) {
SignalExecutors.UNBOUNDED.execute(() -> {
try {
RecipientUtil.block(context, Recipient.externalGroup(context, groupId));
} catch (GroupChangeFailedException | GroupChangeBusyException | IOException e) {
Log.w(TAG, e);
error.onError(GroupChangeFailureReason.OTHER);
}
});
}
static final class GroupStateResult {
private final long threadId;

View File

@@ -25,6 +25,8 @@ import org.thoughtcrime.securesms.database.MediaDatabase;
import org.thoughtcrime.securesms.database.loaders.MediaLoader;
import org.thoughtcrime.securesms.database.loaders.ThreadMediaLoader;
import org.thoughtcrime.securesms.groups.GroupAccessControl;
import org.thoughtcrime.securesms.groups.GroupChangeBusyException;
import org.thoughtcrime.securesms.groups.GroupChangeFailedException;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.LiveGroup;
import org.thoughtcrime.securesms.groups.ui.GroupChangeFailureReason;
@@ -41,6 +43,7 @@ import org.thoughtcrime.securesms.util.SingleLiveEvent;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -205,8 +208,10 @@ public class ManageGroupViewModel extends ViewModel {
}
void blockAndLeave(@NonNull FragmentActivity activity) {
manageGroupRepository.getRecipient(recipient -> BlockUnblockDialog.showBlockFor(activity, activity.getLifecycle(), recipient,
() -> RecipientUtil.block(context, recipient)));
manageGroupRepository.getRecipient(recipient -> BlockUnblockDialog.showBlockFor(activity,
activity.getLifecycle(),
recipient,
() -> manageGroupRepository.blockAndLeaveGroup(this::showErrorToast)));
}
void unblock(@NonNull FragmentActivity activity) {