GV2 message contexts.

This commit is contained in:
Alan Evans
2020-05-13 13:36:57 -03:00
committed by Alex Hart
parent f099c3591c
commit b8df90531f
14 changed files with 286 additions and 108 deletions

View File

@@ -6,15 +6,13 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.google.protobuf.ByteString;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.groups.BadGroupIdException;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.OutgoingGroupUpdateMessage;
import org.thoughtcrime.securesms.mms.MessageGroupContext;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientForeverObserver;
import org.thoughtcrime.securesms.recipients.RecipientId;
@@ -23,15 +21,10 @@ import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext;
import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
import org.whispersystems.signalservice.api.util.UuidUtil;
import java.io.IOException;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import static org.whispersystems.signalservice.internal.push.SignalServiceProtos.GroupContext;
public final class GroupUtil {
private GroupUtil() {
@@ -74,34 +67,13 @@ public final class GroupUtil {
return Optional.absent();
}
@WorkerThread
public static Optional<OutgoingGroupUpdateMessage> createGroupLeaveMessage(@NonNull Context context, @NonNull Recipient groupRecipient) {
GroupId encodedGroupId = groupRecipient.requireGroupId();
GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
if (!groupDatabase.isActive(encodedGroupId)) {
Log.w(TAG, "Group has already been left.");
return Optional.absent();
}
ByteString decodedGroupId = ByteString.copyFrom(encodedGroupId.getDecodedId());
GroupContext groupContext = GroupContext.newBuilder()
.setId(decodedGroupId)
.setType(GroupContext.Type.QUIT)
.build();
return Optional.of(new OutgoingGroupUpdateMessage(groupRecipient, groupContext, null, System.currentTimeMillis(), 0, false, null, Collections.emptyList(), Collections.emptyList()));
}
public static @NonNull GroupDescription getDescription(@NonNull Context context, @Nullable String encodedGroup) {
public static @NonNull GroupDescription getDescription(@NonNull Context context, @Nullable String encodedGroup, boolean isV2) {
if (encodedGroup == null) {
return new GroupDescription(context, null);
}
try {
GroupContext groupContext = GroupContext.parseFrom(Base64.decode(encodedGroup));
MessageGroupContext groupContext = new MessageGroupContext(encodedGroup, isV2);
return new GroupDescription(context, groupContext);
} catch (IOException e) {
Log.w(TAG, e);
@@ -129,25 +101,19 @@ public final class GroupUtil {
public static class GroupDescription {
@NonNull private final Context context;
@Nullable private final GroupContext groupContext;
@Nullable private final List<RecipientId> members;
@NonNull private final Context context;
@Nullable private final MessageGroupContext groupContext;
@Nullable private final List<RecipientId> members;
GroupDescription(@NonNull Context context, @Nullable GroupContext groupContext) {
GroupDescription(@NonNull Context context, @Nullable MessageGroupContext groupContext) {
this.context = context.getApplicationContext();
this.groupContext = groupContext;
if (groupContext == null || groupContext.getMembersList().isEmpty()) {
if (groupContext == null) {
this.members = null;
} else {
this.members = new LinkedList<>();
for (GroupContext.Member member : groupContext.getMembersList()) {
RecipientId recipientId = RecipientId.from(UuidUtil.parseOrNull(member.getUuid()), member.getE164());
if (!recipientId.equals(Recipient.self().getId())) {
this.members.add(recipientId);
}
}
List<RecipientId> membersList = groupContext.getMembersListExcludingSelf();
this.members = membersList.isEmpty() ? null : membersList;
}
}