From 5dc51c34ea53b01e871957e347feb8e36f646a7a Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Wed, 22 Jul 2020 10:48:16 -0300 Subject: [PATCH] Fix recipient resolution during add to Groups V2. --- .../groups/GroupsV2CapabilityChecker.java | 8 +++----- .../ui/creategroup/CreateGroupActivity.java | 10 ++++------ .../details/AddGroupDetailsActivity.java | 17 +++++++---------- .../details/AddGroupDetailsFragment.java | 3 ++- .../details/AddGroupDetailsRepository.java | 5 +++-- .../details/AddGroupDetailsViewModel.java | 11 ++++++----- 6 files changed, 25 insertions(+), 29 deletions(-) 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 157726a10..1d60baae4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2CapabilityChecker.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2CapabilityChecker.java @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.groups; import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; -import com.annimon.stream.Collectors; import com.annimon.stream.Stream; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; @@ -67,15 +66,14 @@ public final class GroupsV2CapabilityChecker { throws IOException { Set recipientIdsSet = new HashSet<>(recipientIds); - Set resolved = Stream.of(recipientIdsSet).map(Recipient::resolved).collect(Collectors.toSet()); - - refreshCapabilitiesIfNecessary(resolved); + refreshCapabilitiesIfNecessary(Recipient.resolvedList(recipientIdsSet)); boolean noSelfGV2Support = false; int noGv2Count = 0; int noUuidCount = 0; - for (Recipient member : resolved) { + for (RecipientId id : recipientIds) { + Recipient member = Recipient.resolved(id); Recipient.Capability gv2Capability = member.getGroupsV2Capability(); if (gv2Capability != Recipient.Capability.SUPPORTED) { 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 0ebb3c814..fa8b09f8f 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 @@ -126,13 +126,11 @@ public class CreateGroupActivity extends ContactSelectionActivity { SimpleProgressDialog.DismissibleDialog dismissibleDialog = SimpleProgressDialog.showDelayed(this); SimpleTask.run(getLifecycle(), () -> { - RecipientId[] ids = Stream.of(contactsFragment.getSelectedContacts()) - .map(selectedContact -> selectedContact.getOrCreateRecipientId(this)) - .toArray(RecipientId[]::new); + List ids = Stream.of(contactsFragment.getSelectedContacts()) + .map(selectedContact -> selectedContact.getOrCreateRecipientId(this)) + .toList(); - List resolved = Stream.of(ids) - .map(Recipient::resolved) - .toList(); + List resolved = Recipient.resolvedList(ids); stopwatch.split("resolve"); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java index 0d602d930..476e9c976 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java @@ -4,7 +4,6 @@ import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.os.Parcelable; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -21,6 +20,8 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; public class AddGroupDetailsActivity extends PassphraseRequiredActivity implements AddGroupDetailsFragment.Callback { @@ -29,10 +30,10 @@ public class AddGroupDetailsActivity extends PassphraseRequiredActivity implemen private final DynamicTheme theme = new DynamicNoActionBarTheme(); - public static Intent newIntent(@NonNull Context context, @NonNull RecipientId[] recipients) { + public static Intent newIntent(@NonNull Context context, @NonNull Collection recipients) { Intent intent = new Intent(context, AddGroupDetailsActivity.class); - intent.putExtra(EXTRA_RECIPIENTS, recipients); + intent.putParcelableArrayListExtra(EXTRA_RECIPIENTS, new ArrayList<>(recipients)); return intent; } @@ -44,13 +45,9 @@ public class AddGroupDetailsActivity extends PassphraseRequiredActivity implemen setContentView(R.layout.add_group_details_activity); if (bundle == null) { - Parcelable[] parcelables = getIntent().getParcelableArrayExtra(EXTRA_RECIPIENTS); - RecipientId[] ids = new RecipientId[parcelables.length]; - - System.arraycopy(parcelables, 0, ids, 0, parcelables.length); - - AddGroupDetailsFragmentArgs arguments = new AddGroupDetailsFragmentArgs.Builder(ids).build(); - NavGraph graph = Navigation.findNavController(this, R.id.nav_host_fragment).getGraph(); + ArrayList recipientIds = getIntent().getParcelableArrayListExtra(EXTRA_RECIPIENTS); + AddGroupDetailsFragmentArgs arguments = new AddGroupDetailsFragmentArgs.Builder(recipientIds.toArray(new RecipientId[0])).build(); + NavGraph graph = Navigation.findNavController(this, R.id.nav_host_fragment).getGraph(); Navigation.findNavController(this, R.id.nav_host_fragment).setGraph(graph, arguments.toBundle()); } 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 ca23a6076..941b803be 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 @@ -44,6 +44,7 @@ import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.text.AfterTextChanged; +import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -170,7 +171,7 @@ public class AddGroupDetailsFragment extends LoggingFragment { private void initializeViewModel() { AddGroupDetailsFragmentArgs args = AddGroupDetailsFragmentArgs.fromBundle(requireArguments()); AddGroupDetailsRepository repository = new AddGroupDetailsRepository(requireContext()); - AddGroupDetailsViewModel.Factory factory = new AddGroupDetailsViewModel.Factory(args.getRecipientIds(), repository); + AddGroupDetailsViewModel.Factory factory = new AddGroupDetailsViewModel.Factory(Arrays.asList(args.getRecipientIds()), repository); viewModel = ViewModelProviders.of(this, factory).get(AddGroupDetailsViewModel.class); 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 4409ea72a..6dbfcdc3d 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 @@ -18,6 +18,7 @@ import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -30,9 +31,9 @@ final class AddGroupDetailsRepository { this.context = context; } - void resolveMembers(@NonNull RecipientId[] recipientIds, Consumer> consumer) { + void resolveMembers(@NonNull Collection recipientIds, Consumer> consumer) { SignalExecutors.BOUNDED.execute(() -> { - List members = new ArrayList<>(recipientIds.length); + List members = new ArrayList<>(recipientIds.size()); for (RecipientId id : recipientIds) { members.add(new GroupMemberEntry.NewGroupCandidate(Recipient.resolved(id))); 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 1626889dc..242e1bcda 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 @@ -19,6 +19,7 @@ import org.thoughtcrime.securesms.util.DefaultValueLiveData; import org.thoughtcrime.securesms.util.SingleLiveEvent; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -35,7 +36,7 @@ public final class AddGroupDetailsViewModel extends ViewModel { private final LiveData canSubmitForm; private final AddGroupDetailsRepository repository; - private AddGroupDetailsViewModel(@NonNull RecipientId[] recipientIds, + private AddGroupDetailsViewModel(@NonNull Collection recipientIds, @NonNull AddGroupDetailsRepository repository) { this.repository = repository; @@ -44,7 +45,7 @@ public final class AddGroupDetailsViewModel extends ViewModel { LiveData isValidName = Transformations.map(name, name -> !TextUtils.isEmpty(name)); members = LiveDataUtil.combineLatest(initialMembers, deleted, AddGroupDetailsViewModel::filterDeletedMembers); - isMms = Transformations.map(members, this::isAnyForcedSms); + isMms = Transformations.map(members, AddGroupDetailsViewModel::isAnyForcedSms); canSubmitForm = LiveDataUtil.combineLatest(isMms, isValidName, (mms, validName) -> mms || validName); repository.resolveMembers(recipientIds, initialMembers::postValue); @@ -119,17 +120,17 @@ public final class AddGroupDetailsViewModel extends ViewModel { .toList(); } - private boolean isAnyForcedSms(@NonNull List members) { + private static boolean isAnyForcedSms(@NonNull List members) { return Stream.of(members) .anyMatch(member -> !member.getMember().isRegistered()); } static final class Factory implements ViewModelProvider.Factory { - private final RecipientId[] recipientIds; + private final Collection recipientIds; private final AddGroupDetailsRepository repository; - Factory(@NonNull RecipientId[] recipientIds, @NonNull AddGroupDetailsRepository repository) { + Factory(@NonNull Collection recipientIds, @NonNull AddGroupDetailsRepository repository) { this.recipientIds = recipientIds; this.repository = repository; }