From 60a701f84fc18e7de07a134f51a65a1b81702aa8 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Sat, 9 Jan 2021 20:12:10 -0400 Subject: [PATCH] Fix missing dialog message on single user add confirm. --- .../ui/addmembers/AddMembersActivity.java | 42 ++++------- .../ui/addmembers/AddMembersRepository.java | 21 ++++-- .../ui/addmembers/AddMembersViewModel.java | 74 ++++++------------- 3 files changed, 54 insertions(+), 83 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java index c1926ccdc7..82326993de 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.groups.ui.addmembers; -import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.Toast; @@ -23,7 +22,6 @@ public class AddMembersActivity extends PushContactSelectionActivity { public static final String GROUP_ID = "group_id"; private View done; - private AlertDialog alert; private AddMembersViewModel viewModel; @Override @@ -34,17 +32,12 @@ public class AddMembersActivity extends PushContactSelectionActivity { AddMembersViewModel.Factory factory = new AddMembersViewModel.Factory(getGroupId()); done = findViewById(R.id.done); - alert = buildConfirmationAlertDialog(); viewModel = ViewModelProviders.of(this, factory) .get(AddMembersViewModel.class); - viewModel.getAddMemberDialogState().observe(this, state -> AddMembersActivity.updateAlertMessage(alert, state)); - - //noinspection CodeBlock2Expr - done.setOnClickListener(v -> { - viewModel.setDialogStateForSelectedContacts(contactsFragment.getSelectedContacts()); - alert.show(); - }); + done.setOnClickListener(v -> + viewModel.getDialogStateForSelectedContacts(contactsFragment.getSelectedContacts(), this::displayAlertMessage) + ); disableDone(); } @@ -99,23 +92,20 @@ public class AddMembersActivity extends PushContactSelectionActivity { return GroupId.parseOrThrow(getIntent().getStringExtra(GROUP_ID)); } - private AlertDialog buildConfirmationAlertDialog() { - return new AlertDialog.Builder(this) - .setMessage(" ") - .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel()) - .setPositiveButton(R.string.AddMembersActivity__add, (dialog, which) -> { - dialog.dismiss(); - onFinishedSelection(); - }) - .setCancelable(true) - .create(); - } - - private static void updateAlertMessage(@NonNull AlertDialog alertDialog, @NonNull AddMembersViewModel.AddMemberDialogMessageState state) { - Context context = alertDialog.getContext(); + private void displayAlertMessage(@NonNull AddMembersViewModel.AddMemberDialogMessageState state) { Recipient recipient = Util.firstNonNull(state.getRecipient(), Recipient.UNKNOWN); - alertDialog.setMessage(context.getResources().getQuantityString(R.plurals.AddMembersActivity__add_d_members_to_s, state.getSelectionCount(), - recipient.getDisplayName(context), state.getGroupTitle(), state.getSelectionCount())); + String message = getResources().getQuantityString(R.plurals.AddMembersActivity__add_d_members_to_s, state.getSelectionCount(), + recipient.getDisplayName(this), state.getGroupTitle(), state.getSelectionCount()); + + new AlertDialog.Builder(this) + .setMessage(message) + .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel()) + .setPositiveButton(R.string.AddMembersActivity__add, (dialog, which) -> { + dialog.dismiss(); + onFinishedSelection(); + }) + .setCancelable(true) + .show(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersRepository.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersRepository.java index 20517da034..55a3dd1ba0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersRepository.java @@ -3,22 +3,31 @@ package org.thoughtcrime.securesms.groups.ui.addmembers; import android.content.Context; import androidx.annotation.NonNull; -import androidx.core.util.Consumer; +import androidx.annotation.WorkerThread; -import org.signal.core.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.contacts.SelectedContact; +import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.recipients.RecipientId; -class AddMembersRepository { +final class AddMembersRepository { private final Context context; + private final GroupId groupId; - AddMembersRepository() { + AddMembersRepository(@NonNull GroupId groupId) { + this.groupId = groupId; this.context = ApplicationDependencies.getApplication(); } - void getOrCreateRecipientId(@NonNull SelectedContact selectedContact, @NonNull Consumer consumer) { - SignalExecutors.BOUNDED.execute(() -> consumer.accept(selectedContact.getOrCreateRecipientId(context))); + @WorkerThread + RecipientId getOrCreateRecipientId(@NonNull SelectedContact selectedContact) { + return selectedContact.getOrCreateRecipientId(context); + } + + @WorkerThread + String getGroupTitle() { + return DatabaseFactory.getGroupDatabase(context).requireGroup(groupId).getTitle(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersViewModel.java index 33031577e4..7076386b7c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersViewModel.java @@ -4,9 +4,8 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.Transformations; +import androidx.annotation.WorkerThread; +import androidx.core.util.Consumer; import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; @@ -14,11 +13,9 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.SelectedContact; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.groups.GroupId; -import org.thoughtcrime.securesms.groups.LiveGroup; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.DefaultValueLiveData; -import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; +import org.thoughtcrime.securesms.util.concurrent.SimpleTask; import org.whispersystems.libsignal.util.guava.Preconditions; import java.util.List; @@ -26,51 +23,34 @@ import java.util.Objects; public final class AddMembersViewModel extends ViewModel { - private final AddMembersRepository repository; - private final LiveData addMemberDialogState; - private final MutableLiveData partialState; + private final AddMembersRepository repository; private AddMembersViewModel(@NonNull GroupId groupId) { - repository = new AddMembersRepository(); - partialState = new MutableLiveData<>(); - addMemberDialogState = LiveDataUtil.combineLatest(Transformations.map(new LiveGroup(groupId).getTitle(), AddMembersViewModel::titleOrDefault), - Transformations.switchMap(partialState, AddMembersViewModel::getStateWithoutGroupTitle), - AddMembersViewModel::getStateWithGroupTitle); + this.repository = new AddMembersRepository(groupId); } - LiveData getAddMemberDialogState() { - return addMemberDialogState; + void getDialogStateForSelectedContacts(@NonNull List selectedContacts, + @NonNull Consumer callback) + { + SimpleTask.run( + () -> { + AddMemberDialogMessageStatePartial partialState = selectedContacts.size() == 1 ? getDialogStateForSingleRecipient(selectedContacts.get(0)) + : getDialogStateForMultipleRecipients(selectedContacts.size()); + + return new AddMemberDialogMessageState(partialState.recipientId == null ? Recipient.UNKNOWN : Recipient.resolved(partialState.recipientId), + partialState.memberCount, titleOrDefault(repository.getGroupTitle())); + }, + callback::accept + ); } - void setDialogStateForSelectedContacts(@NonNull List selectedContacts) { - if (selectedContacts.size() == 1) { - setDialogStateForSingleRecipient(selectedContacts.get(0)); - } else { - setDialogStateForMultipleRecipients(selectedContacts.size()); - } + @WorkerThread + private AddMemberDialogMessageStatePartial getDialogStateForSingleRecipient(@NonNull SelectedContact selectedContact) { + return new AddMemberDialogMessageStatePartial(repository.getOrCreateRecipientId(selectedContact)); } - private void setDialogStateForSingleRecipient(@NonNull SelectedContact selectedContact) { - //noinspection CodeBlock2Expr - repository.getOrCreateRecipientId(selectedContact, recipientId -> { - partialState.postValue(new AddMemberDialogMessageStatePartial(recipientId)); - }); - } - - private void setDialogStateForMultipleRecipients(int recipientCount) { - partialState.setValue(new AddMemberDialogMessageStatePartial(recipientCount)); - } - - private static LiveData getStateWithoutGroupTitle(@NonNull AddMemberDialogMessageStatePartial partialState) { - if (partialState.recipientId != null) { - return Transformations.map(Recipient.live(partialState.recipientId).getLiveData(), r -> new AddMemberDialogMessageState(r, "")); - } else { - return new DefaultValueLiveData<>(new AddMemberDialogMessageState(partialState.memberCount, "")); - } - } - - private static AddMemberDialogMessageState getStateWithGroupTitle(@NonNull String title, @NonNull AddMemberDialogMessageState stateWithoutTitle) { - return new AddMemberDialogMessageState(stateWithoutTitle.recipient, stateWithoutTitle.selectionCount, title); + private AddMemberDialogMessageStatePartial getDialogStateForMultipleRecipients(int recipientCount) { + return new AddMemberDialogMessageStatePartial(recipientCount); } private static @NonNull String titleOrDefault(@Nullable String title) { @@ -99,14 +79,6 @@ public final class AddMembersViewModel extends ViewModel { private final String groupTitle; private final int selectionCount; - private AddMemberDialogMessageState(@NonNull Recipient recipient, @NonNull String groupTitle) { - this(recipient, 1, groupTitle); - } - - private AddMemberDialogMessageState(int selectionCount, @NonNull String groupTitle) { - this(null, selectionCount, groupTitle); - } - private AddMemberDialogMessageState(@Nullable Recipient recipient, int selectionCount, @NonNull String groupTitle) { this.recipient = recipient; this.groupTitle = groupTitle;