Fix missing dialog message on single user add confirm.

This commit is contained in:
Alan Evans 2021-01-09 20:12:10 -04:00 committed by GitHub
parent 14f7c01fcb
commit 60a701f84f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 54 additions and 83 deletions

View file

@ -1,6 +1,5 @@
package org.thoughtcrime.securesms.groups.ui.addmembers; package org.thoughtcrime.securesms.groups.ui.addmembers;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
@ -23,7 +22,6 @@ public class AddMembersActivity extends PushContactSelectionActivity {
public static final String GROUP_ID = "group_id"; public static final String GROUP_ID = "group_id";
private View done; private View done;
private AlertDialog alert;
private AddMembersViewModel viewModel; private AddMembersViewModel viewModel;
@Override @Override
@ -34,17 +32,12 @@ public class AddMembersActivity extends PushContactSelectionActivity {
AddMembersViewModel.Factory factory = new AddMembersViewModel.Factory(getGroupId()); AddMembersViewModel.Factory factory = new AddMembersViewModel.Factory(getGroupId());
done = findViewById(R.id.done); done = findViewById(R.id.done);
alert = buildConfirmationAlertDialog();
viewModel = ViewModelProviders.of(this, factory) viewModel = ViewModelProviders.of(this, factory)
.get(AddMembersViewModel.class); .get(AddMembersViewModel.class);
viewModel.getAddMemberDialogState().observe(this, state -> AddMembersActivity.updateAlertMessage(alert, state)); done.setOnClickListener(v ->
viewModel.getDialogStateForSelectedContacts(contactsFragment.getSelectedContacts(), this::displayAlertMessage)
//noinspection CodeBlock2Expr );
done.setOnClickListener(v -> {
viewModel.setDialogStateForSelectedContacts(contactsFragment.getSelectedContacts());
alert.show();
});
disableDone(); disableDone();
} }
@ -99,23 +92,20 @@ public class AddMembersActivity extends PushContactSelectionActivity {
return GroupId.parseOrThrow(getIntent().getStringExtra(GROUP_ID)); return GroupId.parseOrThrow(getIntent().getStringExtra(GROUP_ID));
} }
private AlertDialog buildConfirmationAlertDialog() { private void displayAlertMessage(@NonNull AddMembersViewModel.AddMemberDialogMessageState state) {
return new AlertDialog.Builder(this) Recipient recipient = Util.firstNonNull(state.getRecipient(), Recipient.UNKNOWN);
.setMessage(" ")
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()) .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel())
.setPositiveButton(R.string.AddMembersActivity__add, (dialog, which) -> { .setPositiveButton(R.string.AddMembersActivity__add, (dialog, which) -> {
dialog.dismiss(); dialog.dismiss();
onFinishedSelection(); onFinishedSelection();
}) })
.setCancelable(true) .setCancelable(true)
.create(); .show();
}
private static void updateAlertMessage(@NonNull AlertDialog alertDialog, @NonNull AddMembersViewModel.AddMemberDialogMessageState state) {
Context context = alertDialog.getContext();
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()));
} }
} }

View file

@ -3,22 +3,31 @@ package org.thoughtcrime.securesms.groups.ui.addmembers;
import android.content.Context; import android.content.Context;
import androidx.annotation.NonNull; 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.contacts.SelectedContact;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientId;
class AddMembersRepository { final class AddMembersRepository {
private final Context context; private final Context context;
private final GroupId groupId;
AddMembersRepository() { AddMembersRepository(@NonNull GroupId groupId) {
this.groupId = groupId;
this.context = ApplicationDependencies.getApplication(); this.context = ApplicationDependencies.getApplication();
} }
void getOrCreateRecipientId(@NonNull SelectedContact selectedContact, @NonNull Consumer<RecipientId> consumer) { @WorkerThread
SignalExecutors.BOUNDED.execute(() -> consumer.accept(selectedContact.getOrCreateRecipientId(context))); RecipientId getOrCreateRecipientId(@NonNull SelectedContact selectedContact) {
return selectedContact.getOrCreateRecipientId(context);
}
@WorkerThread
String getGroupTitle() {
return DatabaseFactory.getGroupDatabase(context).requireGroup(groupId).getTitle();
} }
} }

View file

@ -4,9 +4,8 @@ import android.text.TextUtils;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.lifecycle.LiveData; import androidx.annotation.WorkerThread;
import androidx.lifecycle.MutableLiveData; import androidx.core.util.Consumer;
import androidx.lifecycle.Transformations;
import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
@ -14,11 +13,9 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.contacts.SelectedContact; import org.thoughtcrime.securesms.contacts.SelectedContact;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.LiveGroup;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.DefaultValueLiveData; import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import org.whispersystems.libsignal.util.guava.Preconditions; import org.whispersystems.libsignal.util.guava.Preconditions;
import java.util.List; import java.util.List;
@ -27,50 +24,33 @@ import java.util.Objects;
public final class AddMembersViewModel extends ViewModel { public final class AddMembersViewModel extends ViewModel {
private final AddMembersRepository repository; private final AddMembersRepository repository;
private final LiveData<AddMemberDialogMessageState> addMemberDialogState;
private final MutableLiveData<AddMemberDialogMessageStatePartial> partialState;
private AddMembersViewModel(@NonNull GroupId groupId) { private AddMembersViewModel(@NonNull GroupId groupId) {
repository = new AddMembersRepository(); this.repository = new AddMembersRepository(groupId);
partialState = new MutableLiveData<>();
addMemberDialogState = LiveDataUtil.combineLatest(Transformations.map(new LiveGroup(groupId).getTitle(), AddMembersViewModel::titleOrDefault),
Transformations.switchMap(partialState, AddMembersViewModel::getStateWithoutGroupTitle),
AddMembersViewModel::getStateWithGroupTitle);
} }
LiveData<AddMemberDialogMessageState> getAddMemberDialogState() { void getDialogStateForSelectedContacts(@NonNull List<SelectedContact> selectedContacts,
return addMemberDialogState; @NonNull Consumer<AddMemberDialogMessageState> 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<SelectedContact> selectedContacts) { @WorkerThread
if (selectedContacts.size() == 1) { private AddMemberDialogMessageStatePartial getDialogStateForSingleRecipient(@NonNull SelectedContact selectedContact) {
setDialogStateForSingleRecipient(selectedContacts.get(0)); return new AddMemberDialogMessageStatePartial(repository.getOrCreateRecipientId(selectedContact));
} else {
setDialogStateForMultipleRecipients(selectedContacts.size());
}
} }
private void setDialogStateForSingleRecipient(@NonNull SelectedContact selectedContact) { private AddMemberDialogMessageStatePartial getDialogStateForMultipleRecipients(int recipientCount) {
//noinspection CodeBlock2Expr return new AddMemberDialogMessageStatePartial(recipientCount);
repository.getOrCreateRecipientId(selectedContact, recipientId -> {
partialState.postValue(new AddMemberDialogMessageStatePartial(recipientId));
});
}
private void setDialogStateForMultipleRecipients(int recipientCount) {
partialState.setValue(new AddMemberDialogMessageStatePartial(recipientCount));
}
private static LiveData<AddMemberDialogMessageState> 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 static @NonNull String titleOrDefault(@Nullable String title) { private static @NonNull String titleOrDefault(@Nullable String title) {
@ -99,14 +79,6 @@ public final class AddMembersViewModel extends ViewModel {
private final String groupTitle; private final String groupTitle;
private final int selectionCount; 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) { private AddMemberDialogMessageState(@Nullable Recipient recipient, int selectionCount, @NonNull String groupTitle) {
this.recipient = recipient; this.recipient = recipient;
this.groupTitle = groupTitle; this.groupTitle = groupTitle;