diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index 517800d76..a364adad3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -33,6 +33,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import net.sqlcipher.database.SQLiteDatabase; import org.signal.storageservice.protos.groups.local.DecryptedGroup; +import org.signal.storageservice.protos.groups.local.DecryptedMember; import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.database.RecipientDatabase.RecipientSettings; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; @@ -55,6 +56,7 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; +import org.whispersystems.signalservice.api.util.UuidUtil; import java.io.Closeable; import java.io.IOException; @@ -964,9 +966,16 @@ public class ThreadDatabase extends Database { DecryptedGroup decryptedGroup = DatabaseFactory.getGroupDatabase(context).requireGroup(resolved.requireGroupId().requireV2()).requireV2GroupProperties().getDecryptedGroup(); Optional inviter = DecryptedGroupUtil.findInviter(decryptedGroup.getPendingMembersList(), Recipient.self().getUuid().get()); - RecipientId recipientId = inviter.isPresent() ? RecipientId.from(inviter.get(), null) : RecipientId.UNKNOWN; + if (inviter.isPresent()) { + RecipientId recipientId = RecipientId.from(inviter.get(), null); + return Extra.forGroupV2invite(recipientId); + } else if (decryptedGroup.getRevision() == 0) { + Optional foundingMember = DecryptedGroupUtil.firstMember(decryptedGroup.getMembersList()); - return Extra.forGroupV2invite(recipientId); + if (foundingMember.isPresent()) { + return Extra.forGroupMessageRequest(RecipientId.from(UuidUtil.fromByteString(foundingMember.get().getUuid()), null)); + } + } } else { RecipientId recipientId = DatabaseFactory.getMmsSmsDatabase(context).getGroupAddedBy(record.getThreadId()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java index eb710d412..933110e7b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java @@ -7,12 +7,17 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; +import com.google.protobuf.ByteString; + 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.VerificationFailedException; import org.signal.zkgroup.groups.GroupMasterKey; import org.signal.zkgroup.groups.GroupSecretParams; +import org.signal.zkgroup.util.UUIDUtil; +import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; @@ -152,8 +157,8 @@ public final class GroupsV2StateProcessor { .transform(g -> g.requireV2GroupProperties().getDecryptedGroup()) .orNull(); - if (signedGroupChange != null && - localState != null && + if (signedGroupChange != null && + localState != null && localState.getRevision() + 1 == signedGroupChange.getRevision() && revision == signedGroupChange.getRevision()) { @@ -274,9 +279,30 @@ public final class GroupsV2StateProcessor { jobManager.add(new AvatarGroupsV2DownloadJob(groupId, newLocalState.getAvatar())); } - final boolean fullMemberPostUpdate = GroupProtoUtil.isMember(Recipient.self().getUuid().get(), newLocalState.getMembersList()); - if (fullMemberPostUpdate) { + boolean fullMemberPostUpdate = GroupProtoUtil.isMember(Recipient.self().getUuid().get(), newLocalState.getMembersList()); + boolean trustedAdder = false; + + if (newLocalState.getRevision() == 0) { + Optional foundingMember = DecryptedGroupUtil.firstMember(newLocalState.getMembersList()); + + if (foundingMember.isPresent()) { + UUID foundingMemberUuid = UuidUtil.fromByteString(foundingMember.get().getUuid()); + Recipient foundingRecipient = Recipient.externalPush(context, foundingMemberUuid, null, false); + + if (foundingRecipient.isSystemContact() || foundingRecipient.isProfileSharing()) { + Log.i(TAG, "Group 'adder' is trusted. contact: " + foundingRecipient.isSystemContact() + ", profileSharing: " + foundingRecipient.isProfileSharing()); + trustedAdder = true; + } + } else { + Log.i(TAG, "Could not find founding member during gv2 create. Not enabling profile sharing."); + } + } + + if (fullMemberPostUpdate && trustedAdder) { + Log.i(TAG, "Added to a group and auto-enabling profile sharing"); recipientDatabase.setProfileSharing(Recipient.externalGroup(context, groupId).getId(), true); + } else { + Log.i(TAG, "Added to a group, but not enabling profile sharing. fullMember: " + fullMemberPostUpdate + ", trustedAdded: " + trustedAdder); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java index dcc400f68..645977f8b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java @@ -68,12 +68,7 @@ final class MessageRequestRepository { void getMessageRequestState(@NonNull Recipient recipient, long threadId, @NonNull Consumer state) { executor.execute(() -> { - if (recipient.isPushV2Group()) { - boolean pendingMember = DatabaseFactory.getGroupDatabase(context) - .isPendingMember(recipient.requireGroupId().requireV2(), Recipient.self()); - state.accept(pendingMember ? MessageRequestState.UNACCEPTED - : MessageRequestState.ACCEPTED); - } else if (!RecipientUtil.isMessageRequestAccepted(context, threadId)) { + if (!RecipientUtil.isMessageRequestAccepted(context, threadId)) { state.accept(MessageRequestState.UNACCEPTED); } else if (RecipientUtil.isPreMessageRequestThread(context, threadId) && !RecipientUtil.isLegacyProfileSharingAccepted(recipient)) { state.accept(MessageRequestState.LEGACY); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java index b183cde97..cf18d3946 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java @@ -71,11 +71,7 @@ public class MessageRequestsBottomView extends ConstraintLayout { setActiveInactiveGroups(blockedButtons, normalButtons); } else { if (recipient.isGroup()) { - if (recipient.isPushV2Group()) { - question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_you_were_invited_to_join_the_group_s, HtmlUtil.bold(recipient.getDisplayName(getContext()))), 0)); - } else { - question.setText(R.string.MessageRequestBottomView_do_you_want_to_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept); - } + question.setText(R.string.MessageRequestBottomView_do_you_want_to_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept); } else { String name = recipient.getShortDisplayName(getContext()); question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_they_wont_know_youve_seen_their_messages_until_you_accept, HtmlUtil.bold(name)), 0)); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 48536459c..c596d6e83 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -895,7 +895,6 @@ Let %1$s message you and share your name and photo with them? They won\'t know you\'ve seen their message until you accept. Let %1$s message you and share your name and photo with them? You won\'t receive any messages until you unblock them. Join this group and share your name and photo with its members? They won\'t know you\'ve seen their messages until you accept. - You were invited to join the group %1$s. Do you want to let members of this group message you? Unblock this group and share your name and photo with its members? You won\'t receive any messages until you unblock them. Member of %1$s Member of %1$s and %2$s