+ public Pair<DecryptedGroup, GroupChange> removeMembers(
+ GroupInfoV2 groupInfoV2, Set<RecipientId> members
+ ) throws IOException {
+ final var memberUuids = members.stream()
+ .map(addressResolver::resolveSignalServiceAddress)
+ .map(SignalServiceAddress::getUuid)
+ .filter(Optional::isPresent)
+ .map(Optional::get)
+ .collect(Collectors.toSet());
+ return ejectMembers(groupInfoV2, memberUuids);
+ }
+
+ public Pair<DecryptedGroup, GroupChange> revokeInvitedMembers(
+ GroupInfoV2 groupInfoV2, Set<RecipientId> members
+ ) throws IOException {
+ var pendingMembersList = groupInfoV2.getGroup().getPendingMembersList();
+ final var memberUuids = members.stream()
+ .map(addressResolver::resolveSignalServiceAddress)
+ .map(SignalServiceAddress::getUuid)
+ .filter(Optional::isPresent)
+ .map(Optional::get)
+ .map(uuid -> DecryptedGroupUtil.findPendingByUuid(pendingMembersList, uuid))
+ .filter(Optional::isPresent)
+ .map(Optional::get)
+ .collect(Collectors.toSet());
+ return revokeInvites(groupInfoV2, memberUuids);
+ }
+