Fix missing dialog message on single user add confirm.
This commit is contained in:
parent
14f7c01fcb
commit
60a701f84f
3 changed files with 54 additions and 83 deletions
|
@ -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()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue