From c1181478ddb56c3a107c611e9a02fa8bb34cc0f4 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 9 Mar 2022 17:01:00 -0500 Subject: [PATCH] Remove GV2 capability check. --- .../InternalConversationSettingsFragment.kt | 2 - .../securesms/database/RecipientDatabase.kt | 4 +- .../database/model/RecipientRecord.kt | 1 - .../securesms/groups/GroupManagerV2.java | 6 +- .../groups/GroupsV1MigrationUtil.java | 4 +- .../groups/GroupsV2CapabilityChecker.java | 81 ++----------------- .../ui/creategroup/CreateGroupActivity.java | 60 +------------- .../details/AddGroupDetailsFragment.java | 8 -- .../details/AddGroupDetailsRepository.java | 13 --- .../details/AddGroupDetailsViewModel.java | 10 +-- .../dialogs/NonGv2MemberDialog.java | 59 -------------- .../GroupJoinBottomSheetDialogFragment.java | 45 +++-------- .../GroupsV1MigrationRepository.java | 4 +- .../securesms/jobs/GroupV1MigrationJob.java | 3 +- .../logsubmit/LogSectionCapabilities.java | 1 - .../securesms/recipients/Recipient.java | 8 -- .../recipients/RecipientDetails.java | 9 +-- app/src/main/res/values/strings.xml | 21 ----- .../database/RecipientDatabaseTestUtils.kt | 1 - .../api/profiles/SignalServiceProfile.java | 7 -- 20 files changed, 29 insertions(+), 318 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/dialogs/NonGv2MemberDialog.java diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt index 3d7ac8dc0..4b6499fbd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt @@ -186,8 +186,6 @@ class InternalConversationSettingsFragment : DSLSettingsFragment( private fun buildCapabilitySpan(recipient: Recipient): CharSequence { return TextUtils.concat( - colorize("GV2", recipient.groupsV2Capability), - ", ", colorize("GV1Migration", recipient.groupsV1MigrationCapability), ", ", colorize("AnnouncementGroup", recipient.announcementGroupCapability), diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt index 4fd394ab8..82718854c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt @@ -1395,7 +1395,6 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : fun setCapabilities(id: RecipientId, capabilities: SignalServiceProfile.Capabilities) { var value: Long = 0 - value = Bitmask.update(value, Capabilities.GROUPS_V2, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isGv2).serialize().toLong()) value = Bitmask.update(value, Capabilities.GROUPS_V1_MIGRATION, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isGv1Migration).serialize().toLong()) value = Bitmask.update(value, Capabilities.SENDER_KEY, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isSenderKey).serialize().toLong()) value = Bitmask.update(value, Capabilities.ANNOUNCEMENT_GROUPS, Capabilities.BIT_LENGTH, Recipient.Capability.fromBoolean(capabilities.isAnnouncementGroup).serialize().toLong()) @@ -2910,7 +2909,6 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : unidentifiedAccessMode = UnidentifiedAccessMode.fromMode(cursor.requireInt(UNIDENTIFIED_ACCESS_MODE)), forceSmsSelection = cursor.requireBoolean(FORCE_SMS_SELECTION), rawCapabilities = capabilities, - groupsV2Capability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.GROUPS_V2, Capabilities.BIT_LENGTH).toInt()), groupsV1MigrationCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.GROUPS_V1_MIGRATION, Capabilities.BIT_LENGTH).toInt()), senderKeyCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.SENDER_KEY, Capabilities.BIT_LENGTH).toInt()), announcementGroupCapability = Recipient.Capability.deserialize(Bitmask.read(capabilities, Capabilities.ANNOUNCEMENT_GROUPS, Capabilities.BIT_LENGTH).toInt()), @@ -3297,7 +3295,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : */ internal object Capabilities { const val BIT_LENGTH = 2 - const val GROUPS_V2 = 0 +// const val GROUPS_V2 = 0 const val GROUPS_V1_MIGRATION = 1 const val SENDER_KEY = 2 const val ANNOUNCEMENT_GROUPS = 3 diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt b/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt index a90c04aac..21083b449 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt @@ -66,7 +66,6 @@ data class RecipientRecord( @get:JvmName("isForceSmsSelection") val forceSmsSelection: Boolean, val rawCapabilities: Long, - val groupsV2Capability: Recipient.Capability, val groupsV1MigrationCapability: Recipient.Capability, val senderKeyCapability: Recipient.Capability, val announcementGroupCapability: Recipient.Capability, diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java index 19c74479e..7506ad800 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java @@ -329,7 +329,7 @@ final class GroupManagerV2 { @NonNull GroupManager.GroupActionResult addMembers(@NonNull Collection newMembers) throws GroupChangeFailedException, GroupInsufficientRightsException, IOException, GroupNotAMemberException, MembershipNotSuitableForV2Exception { - if (!GroupsV2CapabilityChecker.allHaveUuidAndSupportGroupsV2(newMembers)) { + if (!GroupsV2CapabilityChecker.allHaveServiceId(newMembers)) { throw new MembershipNotSuitableForV2Exception("At least one potential new member does not support GV2 or UUID capabilities"); } @@ -736,7 +736,7 @@ final class GroupManagerV2 { int disappearingMessageTimerSeconds) throws GroupChangeFailedException, IOException, MembershipNotSuitableForV2Exception, GroupAlreadyExistsException { - if (!GroupsV2CapabilityChecker.allAndSelfHaveUuidAndSupportGroupsV2(members)) { + if (!GroupsV2CapabilityChecker.allAndSelfHaveServiceId(members)) { throw new MembershipNotSuitableForV2Exception("At least one potential new member does not support GV2 capability or we don't have their UUID"); } @@ -976,7 +976,7 @@ final class GroupManagerV2 { private @NonNull GroupChange joinGroupOnServer(boolean requestToJoin, int currentRevision) throws GroupChangeFailedException, IOException, MembershipNotSuitableForV2Exception, GroupLinkNotActiveException, GroupJoinAlreadyAMemberException { - if (!GroupsV2CapabilityChecker.allAndSelfHaveUuidAndSupportGroupsV2(Collections.singleton(Recipient.self().getId()))) { + if (!GroupsV2CapabilityChecker.allAndSelfHaveServiceId(Collections.singleton(Recipient.self().getId()))) { throw new MembershipNotSuitableForV2Exception("Self does not support GV2 or UUID capabilities"); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV1MigrationUtil.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV1MigrationUtil.java index 48d80b70f..7d26fdcc2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV1MigrationUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV1MigrationUtil.java @@ -223,8 +223,7 @@ public final class GroupsV1MigrationUtil { */ private static @NonNull List getMigratableManualMigrationMembers(@NonNull List registeredMembers) { return Stream.of(registeredMembers) - .filter(r -> r.getGroupsV2Capability() == Recipient.Capability.SUPPORTED && - r.getGroupsV1MigrationCapability() == Recipient.Capability.SUPPORTED) + .filter(r -> r.getGroupsV1MigrationCapability() == Recipient.Capability.SUPPORTED) .toList(); } @@ -233,7 +232,6 @@ public final class GroupsV1MigrationUtil { */ public static boolean isAutoMigratable(@NonNull Recipient recipient) { return recipient.hasServiceId() && - recipient.getGroupsV2Capability() == Recipient.Capability.SUPPORTED && recipient.getGroupsV1MigrationCapability() == Recipient.Capability.SUPPORTED && recipient.getRegistered() == RecipientDatabase.RegisteredState.REGISTERED && recipient.getProfileKey() != null; diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2CapabilityChecker.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2CapabilityChecker.java index c296703c8..484bf3f38 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2CapabilityChecker.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2CapabilityChecker.java @@ -27,88 +27,19 @@ public final class GroupsV2CapabilityChecker { private GroupsV2CapabilityChecker() {} - /** - * @param resolved A collection of resolved recipients. - * @return True if a recipient needed to be refreshed, otherwise false. - */ @WorkerThread - public static boolean refreshCapabilitiesIfNecessary(@NonNull Collection resolved) throws IOException { - Set needsRefresh = Stream.of(resolved) - .filter(r -> r.getGroupsV2Capability() != Recipient.Capability.SUPPORTED) - .map(Recipient::getId) - .collect(Collectors.toSet()); - - if (needsRefresh.size() > 0) { - Log.d(TAG, "[refreshCapabilitiesIfNecessary] Need to refresh " + needsRefresh.size() + " recipients."); - - List jobs = RetrieveProfileJob.forRecipients(needsRefresh); - JobManager jobManager = ApplicationDependencies.getJobManager(); - - for (Job job : jobs) { - if (!jobManager.runSynchronously(job, TimeUnit.SECONDS.toMillis(10)).isPresent()) { - throw new IOException("Recipient capability was not retrieved in time"); - } - } - - return true; - } else { - return false; - } - } - - @WorkerThread - static boolean allAndSelfHaveUuidAndSupportGroupsV2(@NonNull Collection recipientIds) - throws IOException - { + static boolean allAndSelfHaveServiceId(@NonNull Collection recipientIds) { HashSet recipientIdsSet = new HashSet<>(recipientIds); recipientIdsSet.add(Recipient.self().getId()); - return allHaveUuidAndSupportGroupsV2(recipientIdsSet); + return allHaveServiceId(recipientIdsSet); } @WorkerThread - static boolean allHaveUuidAndSupportGroupsV2(@NonNull Collection recipientIds) - throws IOException - { - Set recipientIdsSet = new HashSet<>(recipientIds); - refreshCapabilitiesIfNecessary(Recipient.resolvedList(recipientIdsSet)); - - boolean noSelfGV2Support = false; - int noGv2Count = 0; - int noUuidCount = 0; - - for (RecipientId id : recipientIds) { - Recipient member = Recipient.resolved(id); - Recipient.Capability gv2Capability = member.getGroupsV2Capability(); - - if (gv2Capability != Recipient.Capability.SUPPORTED) { - Log.w(TAG, "At least one recipient does not support GV2, capability was " + gv2Capability); - - noGv2Count++; - if (member.isSelf()) { - noSelfGV2Support = true; - } - } - - if (!member.hasServiceId()) { - noUuidCount++; - } - } - - if (noGv2Count + noUuidCount > 0) { - if (noUuidCount > 0) { - Log.w(TAG, noUuidCount + " recipient(s) did not have a UUID known to us"); - } - if (noGv2Count > 0) { - Log.w(TAG, noGv2Count + " recipient(s) do not support GV2"); - if (noSelfGV2Support) { - Log.w(TAG, "Self does not support GV2"); - } - } - return false; - } - - return true; + static boolean allHaveServiceId(@NonNull Collection recipientIds) { + return Recipient.resolvedList(recipientIds) + .stream() + .allMatch(Recipient::hasServiceId); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java index 6b03a455c..69c121cf5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java @@ -4,14 +4,11 @@ import android.animation.ValueAnimator; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.util.Pair; import android.view.MenuItem; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import com.annimon.stream.Stream; import com.google.android.material.button.MaterialButton; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; @@ -22,9 +19,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.ContactsCursorLoader; import org.thoughtcrime.securesms.contacts.sync.DirectoryHelper; import org.thoughtcrime.securesms.database.RecipientDatabase; -import org.thoughtcrime.securesms.groups.GroupsV2CapabilityChecker; import org.thoughtcrime.securesms.groups.ui.creategroup.details.AddGroupDetailsActivity; -import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.FeatureFlags; @@ -36,8 +31,6 @@ import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import org.whispersystems.libsignal.util.guava.Optional; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Set; import java.util.function.Consumer; @@ -189,60 +182,13 @@ public class CreateGroupActivity extends ContactSelectionActivity { } } - if (registeredChecks.size() > 0) { - resolved = Recipient.resolvedList(ids); - } - stopwatch.split("registered"); - List recipientsAndSelf = new ArrayList<>(resolved); - recipientsAndSelf.add(Recipient.self().resolve()); - - boolean neededRefresh = false; - - if (!SignalStore.internalValues().gv2DoNotCreateGv2Groups()) { - try { - neededRefresh = GroupsV2CapabilityChecker.refreshCapabilitiesIfNecessary(recipientsAndSelf); - } catch (IOException e) { - Log.w(TAG, "Failed to refresh all recipient capabilities.", e); - } - } - - if (neededRefresh) { - resolved = Recipient.resolvedList(ids); - } - - stopwatch.split("capabilities"); - - - Pair> result; - - boolean gv2 = Stream.of(recipientsAndSelf).allMatch(r -> r.getGroupsV2Capability() == Recipient.Capability.SUPPORTED); - if (!gv2 && Stream.of(resolved).anyMatch(r -> !r.hasE164())) - { - Log.w(TAG, "Invalid GV1 group..."); - ids = Collections.emptyList(); - result = Pair.create(false, ids); - } else { - result = Pair.create(true, ids); - } - - stopwatch.split("gv1-check"); - - return result; - }, result -> { + return ids; + }, recipientIds -> { dismissibleDialog.dismiss(); - stopwatch.stop(TAG); - - if (result.first) { - startActivityForResult(AddGroupDetailsActivity.newIntent(this, result.second), REQUEST_CODE_ADD_DETAILS); - } else { - new AlertDialog.Builder(this) - .setMessage(R.string.CreateGroupActivity_some_contacts_cannot_be_in_legacy_groups) - .setPositiveButton(android.R.string.ok, (d, w) -> d.dismiss()) - .show(); - } + startActivityForResult(AddGroupDetailsActivity.newIntent(this, recipientIds), REQUEST_CODE_ADD_DETAILS); }); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java index 6373947f2..a9f43bd5f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java @@ -35,9 +35,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.avatar.picker.AvatarPickerFragment; import org.thoughtcrime.securesms.components.settings.app.privacy.expire.ExpireTimerSettingsFragment; import org.thoughtcrime.securesms.groups.ui.GroupMemberListView; -import org.thoughtcrime.securesms.groups.ui.creategroup.dialogs.NonGv2MemberDialog; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.mediasend.AvatarSelectionActivity; import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; import org.thoughtcrime.securesms.mms.GlideApp; @@ -131,12 +129,6 @@ public class AddGroupDetailsFragment extends LoggingFragment { name.setHint(isMms ? R.string.AddGroupDetailsFragment__group_name_optional : R.string.AddGroupDetailsFragment__group_name_required); toolbar.setTitle(isMms ? R.string.AddGroupDetailsFragment__create_group : R.string.AddGroupDetailsFragment__name_this_group); }); - viewModel.getNonGv2CapableMembers().observe(getViewLifecycleOwner(), nonGv2CapableMembers -> { - gv2Warning.setVisibility(nonGv2CapableMembers.isEmpty() ? View.GONE : View.VISIBLE); - gv2Warning.setText(requireContext().getResources().getQuantityString(R.plurals.AddGroupDetailsFragment__d_members_do_not_support_new_groups_so_this_group_cannot_be_created, nonGv2CapableMembers.size(), nonGv2CapableMembers.size())); - gv2Warning.setLearnMoreVisible(true); - gv2Warning.setOnLinkClickListener(v -> NonGv2MemberDialog.showNonGv2Members(requireContext(), getViewLifecycleOwner(), nonGv2CapableMembers)); - }); viewModel.getAvatar().observe(getViewLifecycleOwner(), avatarBytes -> { if (avatarBytes == null) { avatar.setImageDrawable(new InsetDrawable(avatarPlaceholder, ViewUtil.dpToPx(AVATAR_PLACEHOLDER_INSET_DP))); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsRepository.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsRepository.java index 62b322a1a..794265f8a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsRepository.java @@ -78,17 +78,4 @@ final class AddGroupDetailsRepository { } }); } - - @WorkerThread - List checkCapabilities(@NonNull Collection newPotentialMemberList) { - try { - GroupsV2CapabilityChecker.refreshCapabilitiesIfNecessary(Recipient.resolvedList(newPotentialMemberList)); - } catch (IOException e) { - Log.w(TAG, "Could not get latest profiles for users, using known gv2 capability state", e); - } - - return Stream.of(Recipient.resolvedList(newPotentialMemberList)) - .filter(m -> m.getGroupsV2Capability() != Recipient.Capability.SUPPORTED) - .toList(); - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsViewModel.java index b2e2fbb28..113b7c8d9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsViewModel.java @@ -41,7 +41,6 @@ public final class AddGroupDetailsViewModel extends ViewModel { private final LiveData isMms; private final LiveData canSubmitForm; private final AddGroupDetailsRepository repository; - private final LiveData> nonGv2CapableMembers; private Media avatarMedia; @@ -64,10 +63,7 @@ public final class AddGroupDetailsViewModel extends ViewModel { } }); - nonGv2CapableMembers = LiveDataUtil.mapAsync(membersToCheckGv2CapabilityOf, memberList -> repository.checkCapabilities(Stream.of(memberList).map(newGroupCandidate -> newGroupCandidate.getMember().getId()).toList())); - canSubmitForm = LiveDataUtil.combineLatest(LiveDataUtil.combineLatest(isMms, isValidName, (mms, validName) -> mms || validName), - nonGv2CapableMembers, - (canSubmit, nonGv2) -> canSubmit && nonGv2.isEmpty()); + canSubmitForm = LiveDataUtil.combineLatest(isMms, isValidName, (mms, validName) -> mms || validName); repository.resolveMembers(recipientIds, initialMembers::postValue); } @@ -92,10 +88,6 @@ public final class AddGroupDetailsViewModel extends ViewModel { return isMms; } - @NonNull LiveData> getNonGv2CapableMembers() { - return nonGv2CapableMembers; - } - @NonNull LiveData getDisappearingMessagesTimer() { return disappearingMessagesTimer; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/dialogs/NonGv2MemberDialog.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/dialogs/NonGv2MemberDialog.java deleted file mode 100644 index 8cf0e8a9c..000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/dialogs/NonGv2MemberDialog.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.thoughtcrime.securesms.groups.ui.creategroup.dialogs; - -import android.app.Dialog; -import android.content.Context; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.lifecycle.LifecycleOwner; - -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry; -import org.thoughtcrime.securesms.groups.ui.GroupMemberListView; -import org.thoughtcrime.securesms.recipients.Recipient; - -import java.util.ArrayList; -import java.util.List; - -public final class NonGv2MemberDialog { - - private NonGv2MemberDialog() { - } - - public static @Nullable Dialog showNonGv2Members(@NonNull Context context, @NonNull LifecycleOwner lifecycleOwner, @NonNull List recipients) { - int size = recipients.size(); - if (size == 0) { - return null; - } - - AlertDialog.Builder builder = new AlertDialog.Builder(context) - // TODO: GV2 Need a URL for learn more - // .setNegativeButton(R.string.NonGv2MemberDialog_learn_more, (dialog, which) -> { - // }) - .setPositiveButton(android.R.string.ok, null); - if (size == 1) { - builder.setMessage(context.getString(R.string.NonGv2MemberDialog_single_users_are_non_gv2_capable_forced_migration, recipients.get(0).getDisplayName(context))); - } else { - builder.setMessage(context.getResources().getQuantityString(R.plurals.NonGv2MemberDialog_d_users_are_non_gv2_capable_forced_migration, size, size)) - .setView(R.layout.dialog_multiple_members_non_gv2_capable); - } - - Dialog dialog = builder.show(); - if (size > 1) { - GroupMemberListView nonGv2CapableMembers = dialog.findViewById(R.id.list_non_gv2_members); - - nonGv2CapableMembers.initializeAdapter(lifecycleOwner); - - List pendingMembers = new ArrayList<>(recipients.size()); - for (Recipient r : recipients) { - pendingMembers.add(new GroupMemberEntry.NewGroupCandidate(r)); - } - - //noinspection ConstantConditions - nonGv2CapableMembers.setMembers(pendingMembers); - } - - return dialog; - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java index 438703887..93c374ced 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java @@ -110,26 +110,15 @@ public final class GroupJoinBottomSheetDialogFragment extends BottomSheetDialogF updateGroupDescription(details.getGroupName(), details.getGroupDescription()); } - switch (getGroupJoinStatus()) { - case UPDATE_LINKED_DEVICE_TO_JOIN: - groupJoinExplain.setText(R.string.GroupJoinUpdateRequiredBottomSheetDialogFragment_update_linked_device_message); - groupCancelButton.setText(android.R.string.ok); - groupJoinButton.setVisibility(View.GONE); - ApplicationDependencies.getJobManager() - .add(RetrieveProfileJob.forRecipient(Recipient.self().getId())); - break; - case LOCAL_CAN_JOIN: - groupJoinExplain.setText(details.joinRequiresAdminApproval() ? R.string.GroupJoinBottomSheetDialogFragment_admin_approval_needed - : R.string.GroupJoinBottomSheetDialogFragment_direct_join); - groupJoinButton.setText(details.joinRequiresAdminApproval() ? R.string.GroupJoinBottomSheetDialogFragment_request_to_join - : R.string.GroupJoinBottomSheetDialogFragment_join); - groupJoinButton.setOnClickListener(v -> { - Log.i(TAG, details.joinRequiresAdminApproval() ? "Attempting to direct join group" : "Attempting to request to join group"); - viewModel.join(details); - }); - groupJoinButton.setVisibility(View.VISIBLE); - break; - } + groupJoinExplain.setText(details.joinRequiresAdminApproval() ? R.string.GroupJoinBottomSheetDialogFragment_admin_approval_needed + : R.string.GroupJoinBottomSheetDialogFragment_direct_join); + groupJoinButton.setText(details.joinRequiresAdminApproval() ? R.string.GroupJoinBottomSheetDialogFragment_request_to_join + : R.string.GroupJoinBottomSheetDialogFragment_join); + groupJoinButton.setOnClickListener(v -> { + Log.i(TAG, details.joinRequiresAdminApproval() ? "Attempting to direct join group" : "Attempting to request to join group"); + viewModel.join(details); + }); + groupJoinButton.setVisibility(View.VISIBLE); avatar.setImageBytesForGroup(details.getAvatarBytes(), new FallbackPhotoProvider(), AvatarColor.UNKNOWN); @@ -167,14 +156,6 @@ public final class GroupJoinBottomSheetDialogFragment extends BottomSheetDialogF () -> GroupDescriptionDialog.show(getChildFragmentManager(), name, description, true)); } - private static ExtendedGroupJoinStatus getGroupJoinStatus() { - if (Recipient.self().getGroupsV2Capability() != Recipient.Capability.SUPPORTED) { - return ExtendedGroupJoinStatus.UPDATE_LINKED_DEVICE_TO_JOIN; - } else { - return ExtendedGroupJoinStatus.LOCAL_CAN_JOIN; - } - } - private @NonNull String errorToMessage(@NonNull FetchGroupDetailsError error) { if (error == FetchGroupDetailsError.GroupLinkNotActive) { return getString(R.string.GroupJoinBottomSheetDialogFragment_this_group_link_is_not_active); @@ -210,12 +191,4 @@ public final class GroupJoinBottomSheetDialogFragment extends BottomSheetDialogF return new ResourceContactPhoto(R.drawable.ic_group_outline_48); } } - - public enum ExtendedGroupJoinStatus { - /** Locally we're using a version that can use group links, but one or more linked devices needs updating for GV2. */ - UPDATE_LINKED_DEVICE_TO_JOIN, - - /** This version of the client allows joining via GV2 group links. */ - LOCAL_CAN_JOIN - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/migration/GroupsV1MigrationRepository.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/migration/GroupsV1MigrationRepository.java index 47628837e..ae00e0a1c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/migration/GroupsV1MigrationRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/migration/GroupsV1MigrationRepository.java @@ -69,8 +69,7 @@ final class GroupsV1MigrationRepository { } Set needsRefresh = Stream.of(group.getParticipants()) - .filter(r -> r.getGroupsV2Capability() != Recipient.Capability.SUPPORTED || - r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED) + .filter(r -> r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED) .map(Recipient::getId) .collect(Collectors.toSet()); @@ -96,7 +95,6 @@ final class GroupsV1MigrationRepository { List ineligible = Stream.of(group.getParticipants()) .filter(r -> !r.hasServiceId() || - r.getGroupsV2Capability() != Recipient.Capability.SUPPORTED || r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED || r.getRegistered() != RecipientDatabase.RegisteredState.REGISTERED) .toList(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java index 009c01966..1a8f7c6e1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java @@ -97,8 +97,7 @@ public class GroupV1MigrationJob extends BaseJob { jobManager.add(new GroupV1MigrationJob(thread.getRecipient().getId())); needsRefresh.addAll(Stream.of(thread.getRecipient().getParticipants()) - .filter(r -> r.getGroupsV2Capability() != Recipient.Capability.SUPPORTED || - r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED) + .filter(r -> r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED) .map(Recipient::getId) .toList()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java index 7b2b87576..0dde1684e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java +++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java @@ -39,7 +39,6 @@ public final class LogSectionCapabilities implements LogSection { .append("Change Number : ").append(capabilities.isChangeNumber()).append("\n") .append("\n") .append("-- Global").append("\n") - .append("GV2 : ").append(self.getGroupsV2Capability()).append("\n") .append("GV1 Migration : ").append(self.getGroupsV1MigrationCapability()).append("\n") .append("Sender Key : ").append(self.getSenderKeyCapability()).append("\n") .append("Announcement Groups: ").append(self.getAnnouncementGroupCapability()).append("\n") diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java index b4a4736a8..f7323b946 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java @@ -112,7 +112,6 @@ public class Recipient { private final String notificationChannel; private final UnidentifiedAccessMode unidentifiedAccessMode; private final boolean forceSmsSelection; - private final Capability groupsV2Capability; private final Capability groupsV1MigrationCapability; private final Capability senderKeyCapability; private final Capability announcementGroupCapability; @@ -380,7 +379,6 @@ public class Recipient { this.notificationChannel = null; this.unidentifiedAccessMode = UnidentifiedAccessMode.DISABLED; this.forceSmsSelection = false; - this.groupsV2Capability = Capability.UNKNOWN; this.groupsV1MigrationCapability = Capability.UNKNOWN; this.senderKeyCapability = Capability.UNKNOWN; this.announcementGroupCapability = Capability.UNKNOWN; @@ -438,7 +436,6 @@ public class Recipient { this.notificationChannel = details.notificationChannel; this.unidentifiedAccessMode = details.unidentifiedAccessMode; this.forceSmsSelection = details.forceSmsSelection; - this.groupsV2Capability = details.groupsV2Capability; this.groupsV1MigrationCapability = details.groupsV1MigrationCapability; this.senderKeyCapability = details.senderKeyCapability; this.announcementGroupCapability = details.announcementGroupCapability; @@ -969,10 +966,6 @@ public class Recipient { return forceSmsSelection; } - public @NonNull Capability getGroupsV2Capability() { - return groupsV2Capability; - } - public @NonNull Capability getGroupsV1MigrationCapability() { return groupsV1MigrationCapability; } @@ -1269,7 +1262,6 @@ public class Recipient { Objects.equals(profileAvatar, other.profileAvatar) && Objects.equals(notificationChannel, other.notificationChannel) && unidentifiedAccessMode == other.unidentifiedAccessMode && - groupsV2Capability == other.groupsV2Capability && groupsV1MigrationCapability == other.groupsV1MigrationCapability && insightsBannerTier == other.insightsBannerTier && Arrays.equals(storageId, other.storageId) && diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientDetails.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientDetails.java index 508dfdf4b..0213ceff9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientDetails.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientDetails.java @@ -69,7 +69,6 @@ public class RecipientDetails { final String notificationChannel; final UnidentifiedAccessMode unidentifiedAccessMode; final boolean forceSmsSelection; - final Recipient.Capability groupsV2Capability; final Recipient.Capability groupsV1MigrationCapability; final Recipient.Capability senderKeyCapability; final Recipient.Capability announcementGroupCapability; @@ -132,7 +131,6 @@ public class RecipientDetails { this.notificationChannel = record.getNotificationChannel(); this.unidentifiedAccessMode = record.getUnidentifiedAccessMode(); this.forceSmsSelection = record.isForceSmsSelection(); - this.groupsV2Capability = record.getGroupsV2Capability(); this.groupsV1MigrationCapability = record.getGroupsV1MigrationCapability(); this.senderKeyCapability = record.getSenderKeyCapability(); this.announcementGroupCapability = record.getAnnouncementGroupCapability(); @@ -159,9 +157,9 @@ public class RecipientDetails { this.groupAvatarId = null; this.systemContactPhoto = null; this.customLabel = null; - this.contactUri = null; - this.serviceId = null; - this.pni = null; + this.contactUri = null; + this.serviceId = null; + this.pni = null; this.username = null; this.e164 = null; this.email = null; @@ -191,7 +189,6 @@ public class RecipientDetails { this.unidentifiedAccessMode = UnidentifiedAccessMode.UNKNOWN; this.forceSmsSelection = false; this.groupName = null; - this.groupsV2Capability = Recipient.Capability.UNKNOWN; this.groupsV1MigrationCapability = Recipient.Capability.UNKNOWN; this.senderKeyCapability = Recipient.Capability.UNKNOWN; this.announcementGroupCapability = Recipient.Capability.UNKNOWN; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2edcea7a7..96d570c5a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -451,7 +451,6 @@ +%1$d - Some contacts cannot be in legacy groups. Select members @@ -752,26 +751,6 @@ Remove SMS contact Remove %1$s from this group? - - %d member does not support New Groups, so this will be a Legacy Group. - %d members do not support New Groups, so this group will be a Legacy Group. - - - %d member does not support New Groups, so this group cannot be created. - %d members do not support New Groups, so this group cannot be created. - - - - A Legacy Group will be created because ā€œ%1$sā€ is using an old version of Signal. You can create a New Style Group with them after they update Signal, or remove them before creating the group. - - A Legacy Group will be created because %1$d member is using an old version of Signal. You can create a New Style Group with them after they update Signal, or remove them before creating the group. - A Legacy Group will be created because %1$d members are using an old version of Signal. You can create a New Style Group with them after they update Signal, or remove them before creating the group. - - This group cannot be created because ā€œ%1$sā€ is using an old version of Signal. You must remove them before creating the group. - - This group cannot be created because %1$d member is using an old version of Signal. You must remove them before creating the group. - This group cannot be created because %1$d members are using an old version of Signal. You must remove them before creating the group. - Member requests & invites diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/RecipientDatabaseTestUtils.kt b/app/src/test/java/org/thoughtcrime/securesms/database/RecipientDatabaseTestUtils.kt index 592c655ad..abb62c6ff 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/RecipientDatabaseTestUtils.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/RecipientDatabaseTestUtils.kt @@ -126,7 +126,6 @@ object RecipientDatabaseTestUtils { unidentifiedAccessMode, forceSmsSelection, capabilities, - Recipient.Capability.deserialize(Bitmask.read(capabilities, RecipientDatabase.Capabilities.GROUPS_V2, RecipientDatabase.Capabilities.BIT_LENGTH).toInt()), Recipient.Capability.deserialize(Bitmask.read(capabilities, RecipientDatabase.Capabilities.GROUPS_V1_MIGRATION, RecipientDatabase.Capabilities.BIT_LENGTH).toInt()), Recipient.Capability.deserialize(Bitmask.read(capabilities, RecipientDatabase.Capabilities.SENDER_KEY, RecipientDatabase.Capabilities.BIT_LENGTH).toInt()), Recipient.Capability.deserialize(Bitmask.read(capabilities, RecipientDatabase.Capabilities.ANNOUNCEMENT_GROUPS, RecipientDatabase.Capabilities.BIT_LENGTH).toInt()), diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java index 6926b3a3b..dee0fed23 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java @@ -175,9 +175,6 @@ public class SignalServiceProfile { } public static class Capabilities { - @JsonProperty - private boolean gv2; - @JsonProperty private boolean storage; @@ -199,10 +196,6 @@ public class SignalServiceProfile { @JsonCreator public Capabilities() {} - public boolean isGv2() { - return gv2; - } - public boolean isStorage() { return storage; }