mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 18:00:02 +01:00
Adapt message requests to support invite flow.
This commit is contained in:
@@ -496,6 +496,11 @@ public final class GroupDatabase extends Database {
|
||||
}
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
public boolean isPendingMember(@NonNull GroupId.Push groupId, @NonNull Recipient recipient) {
|
||||
return getGroup(groupId).transform(g -> g.isPendingMember(recipient)).or(false);
|
||||
}
|
||||
|
||||
private static String serializeV2GroupMembers(@NonNull Context context, @NonNull DecryptedGroup decryptedGroup) {
|
||||
List<RecipientId> groupMembers = new ArrayList<>(decryptedGroup.getMembersCount());
|
||||
|
||||
@@ -707,6 +712,17 @@ public final class GroupDatabase extends Database {
|
||||
return id.isV1() ? GroupAccessControl.ALL_MEMBERS : GroupAccessControl.ONLY_ADMINS;
|
||||
}
|
||||
}
|
||||
|
||||
boolean isPendingMember(@NonNull Recipient recipient) {
|
||||
if (isV2Group()) {
|
||||
Optional<UUID> uuid = recipient.getUuid();
|
||||
if (uuid.isPresent()) {
|
||||
return DecryptedGroupUtil.findPendingByUuid(requireV2GroupProperties().getDecryptedGroup().getPendingMembersList(), uuid.get())
|
||||
.isPresent();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static class V2GroupProperties {
|
||||
|
||||
@@ -31,6 +31,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
import net.sqlcipher.database.SQLiteDatabase;
|
||||
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedGroup;
|
||||
import org.thoughtcrime.securesms.contactshare.Contact;
|
||||
import org.thoughtcrime.securesms.contactshare.ContactUtil;
|
||||
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
|
||||
@@ -51,6 +52,7 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.whispersystems.libsignal.util.Pair;
|
||||
import org.whispersystems.libsignal.util.guava.Optional;
|
||||
import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
@@ -61,6 +63,7 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class ThreadDatabase extends Database {
|
||||
|
||||
@@ -761,12 +764,21 @@ public class ThreadDatabase extends Database {
|
||||
RecipientId threadRecipientId = getRecipientIdForThreadId(record.getThreadId());
|
||||
|
||||
if (!messageRequestAccepted && threadRecipientId != null) {
|
||||
boolean isPushGroup = Recipient.resolved(threadRecipientId).isPushGroup();
|
||||
if (isPushGroup) {
|
||||
RecipientId recipientId = DatabaseFactory.getMmsSmsDatabase(context).getGroupAddedBy(record.getThreadId());
|
||||
Recipient resolved = Recipient.resolved(threadRecipientId);
|
||||
if (resolved.isPushGroup()) {
|
||||
if (resolved.isPushV2Group()) {
|
||||
DecryptedGroup decryptedGroup = DatabaseFactory.getGroupDatabase(context).requireGroup(resolved.requireGroupId().requireV2()).requireV2GroupProperties().getDecryptedGroup();
|
||||
Optional<UUID> inviter = DecryptedGroupUtil.findInviter(decryptedGroup.getPendingMembersList(), Recipient.self().getUuid().get());
|
||||
|
||||
if (recipientId != null) {
|
||||
return Extra.forGroupMessageRequest(recipientId);
|
||||
RecipientId recipientId = inviter.isPresent() ? RecipientId.from(inviter.get(), null) : RecipientId.UNKNOWN;
|
||||
|
||||
return Extra.forGroupV2invite(recipientId);
|
||||
} else {
|
||||
RecipientId recipientId = DatabaseFactory.getMmsSmsDatabase(context).getGroupAddedBy(record.getThreadId());
|
||||
|
||||
if (recipientId != null) {
|
||||
return Extra.forGroupMessageRequest(recipientId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -903,6 +915,7 @@ public class ThreadDatabase extends Database {
|
||||
@JsonProperty private final boolean isAlbum;
|
||||
@JsonProperty private final boolean isRemoteDelete;
|
||||
@JsonProperty private final boolean isMessageRequestAccepted;
|
||||
@JsonProperty private final boolean isGv2Invite;
|
||||
@JsonProperty private final String groupAddedBy;
|
||||
|
||||
public Extra(@JsonProperty("isRevealable") boolean isRevealable,
|
||||
@@ -910,6 +923,7 @@ public class ThreadDatabase extends Database {
|
||||
@JsonProperty("isAlbum") boolean isAlbum,
|
||||
@JsonProperty("isRemoteDelete") boolean isRemoteDelete,
|
||||
@JsonProperty("isMessageRequestAccepted") boolean isMessageRequestAccepted,
|
||||
@JsonProperty("isGv2Invite") boolean isGv2Invite,
|
||||
@JsonProperty("groupAddedBy") String groupAddedBy)
|
||||
{
|
||||
this.isRevealable = isRevealable;
|
||||
@@ -917,31 +931,36 @@ public class ThreadDatabase extends Database {
|
||||
this.isAlbum = isAlbum;
|
||||
this.isRemoteDelete = isRemoteDelete;
|
||||
this.isMessageRequestAccepted = isMessageRequestAccepted;
|
||||
this.isGv2Invite = isGv2Invite;
|
||||
this.groupAddedBy = groupAddedBy;
|
||||
}
|
||||
|
||||
public static @NonNull Extra forViewOnce() {
|
||||
return new Extra(true, false, false, false, true, null);
|
||||
return new Extra(true, false, false, false, true, false, null);
|
||||
}
|
||||
|
||||
public static @NonNull Extra forSticker() {
|
||||
return new Extra(false, true, false, false, true, null);
|
||||
return new Extra(false, true, false, false, true, false, null);
|
||||
}
|
||||
|
||||
public static @NonNull Extra forAlbum() {
|
||||
return new Extra(false, false, true, false, true, null);
|
||||
return new Extra(false, false, true, false, true, false, null);
|
||||
}
|
||||
|
||||
public static @NonNull Extra forRemoteDelete() {
|
||||
return new Extra(false, false, false, true, true, null);
|
||||
return new Extra(false, false, false, true, true, false, null);
|
||||
}
|
||||
|
||||
public static @NonNull Extra forMessageRequest() {
|
||||
return new Extra(false, false, false, false, false, null);
|
||||
return new Extra(false, false, false, false, false, false, null);
|
||||
}
|
||||
|
||||
public static @NonNull Extra forGroupMessageRequest(RecipientId recipientId) {
|
||||
return new Extra(false, false, false, false, false, recipientId.serialize());
|
||||
return new Extra(false, false, false, false, false, false, recipientId.serialize());
|
||||
}
|
||||
|
||||
public static @NonNull Extra forGroupV2invite(RecipientId recipientId) {
|
||||
return new Extra(false, false, false, false, false, true, recipientId.serialize());
|
||||
}
|
||||
|
||||
public boolean isViewOnce() {
|
||||
@@ -964,6 +983,10 @@ public class ThreadDatabase extends Database {
|
||||
return isMessageRequestAccepted;
|
||||
}
|
||||
|
||||
public boolean isGv2Invite() {
|
||||
return isGv2Invite;
|
||||
}
|
||||
|
||||
public @Nullable String getGroupAddedBy() {
|
||||
return groupAddedBy;
|
||||
}
|
||||
|
||||
@@ -19,13 +19,14 @@ package org.thoughtcrime.securesms.database.model;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.TextUtils;
|
||||
import android.text.style.StyleSpan;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.database.MmsSmsColumns;
|
||||
import org.thoughtcrime.securesms.database.SmsDatabase;
|
||||
@@ -79,7 +80,9 @@ public class ThreadRecord extends DisplayRecord {
|
||||
@Override
|
||||
public SpannableString getDisplayBody(@NonNull Context context) {
|
||||
if (getGroupAddedBy() != null) {
|
||||
return emphasisAdded(context.getString(R.string.ThreadRecord_s_added_you_to_the_group, Recipient.live(getGroupAddedBy()).get().getDisplayName(context)));
|
||||
return emphasisAdded(context.getString(isGv2Invite() ? R.string.ThreadRecord_s_invited_you_to_the_group
|
||||
: R.string.ThreadRecord_s_added_you_to_the_group,
|
||||
Recipient.live(getGroupAddedBy()).get().getDisplayName(context)));
|
||||
} else if (!isMessageRequestAccepted()) {
|
||||
return emphasisAdded(context.getString(R.string.ThreadRecord_message_request));
|
||||
} else if (isGroupUpdate()) {
|
||||
@@ -194,6 +197,10 @@ public class ThreadRecord extends DisplayRecord {
|
||||
else return null;
|
||||
}
|
||||
|
||||
public boolean isGv2Invite() {
|
||||
return extra != null && extra.isGv2Invite();
|
||||
}
|
||||
|
||||
public boolean isMessageRequestAccepted() {
|
||||
if (extra != null) return extra.isMessageRequestAccepted();
|
||||
else return true;
|
||||
|
||||
Reference in New Issue
Block a user