Fix recipient resolution during add to Groups V2.

master
Alan Evans 2020-07-22 10:48:16 -03:00 committed by Greyson Parrelli
parent 5bf7a55bfa
commit 5dc51c34ea
6 changed files with 25 additions and 29 deletions

View File

@ -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<RecipientId> recipientIdsSet = new HashSet<>(recipientIds);
Set<Recipient> 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) {

View File

@ -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<RecipientId> ids = Stream.of(contactsFragment.getSelectedContacts())
.map(selectedContact -> selectedContact.getOrCreateRecipientId(this))
.toList();
List<Recipient> resolved = Stream.of(ids)
.map(Recipient::resolved)
.toList();
List<Recipient> resolved = Recipient.resolvedList(ids);
stopwatch.split("resolve");

View File

@ -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<RecipientId> 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<RecipientId> 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());
}

View File

@ -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);

View File

@ -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<List<GroupMemberEntry.NewGroupCandidate>> consumer) {
void resolveMembers(@NonNull Collection<RecipientId> recipientIds, Consumer<List<GroupMemberEntry.NewGroupCandidate>> consumer) {
SignalExecutors.BOUNDED.execute(() -> {
List<GroupMemberEntry.NewGroupCandidate> members = new ArrayList<>(recipientIds.length);
List<GroupMemberEntry.NewGroupCandidate> members = new ArrayList<>(recipientIds.size());
for (RecipientId id : recipientIds) {
members.add(new GroupMemberEntry.NewGroupCandidate(Recipient.resolved(id)));

View File

@ -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<Boolean> canSubmitForm;
private final AddGroupDetailsRepository repository;
private AddGroupDetailsViewModel(@NonNull RecipientId[] recipientIds,
private AddGroupDetailsViewModel(@NonNull Collection<RecipientId> recipientIds,
@NonNull AddGroupDetailsRepository repository)
{
this.repository = repository;
@ -44,7 +45,7 @@ public final class AddGroupDetailsViewModel extends ViewModel {
LiveData<Boolean> 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<GroupMemberEntry.NewGroupCandidate> members) {
private static boolean isAnyForcedSms(@NonNull List<GroupMemberEntry.NewGroupCandidate> members) {
return Stream.of(members)
.anyMatch(member -> !member.getMember().isRegistered());
}
static final class Factory implements ViewModelProvider.Factory {
private final RecipientId[] recipientIds;
private final Collection<RecipientId> recipientIds;
private final AddGroupDetailsRepository repository;
Factory(@NonNull RecipientId[] recipientIds, @NonNull AddGroupDetailsRepository repository) {
Factory(@NonNull Collection<RecipientId> recipientIds, @NonNull AddGroupDetailsRepository repository) {
this.recipientIds = recipientIds;
this.repository = repository;
}