Allow empty group creation.

This commit is contained in:
Alan Evans
2021-01-08 12:53:23 -04:00
committed by GitHub
parent 79d6ac100c
commit 9fcf40fdc4
4 changed files with 13 additions and 29 deletions

View File

@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.groups.ui.creategroup;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.Pair;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
@@ -40,7 +41,6 @@ public class CreateGroupActivity extends ContactSelectionActivity {
private static final String TAG = Log.tag(CreateGroupActivity.class); private static final String TAG = Log.tag(CreateGroupActivity.class);
private static final int MINIMUM_GROUP_SIZE = 1;
private static final short REQUEST_CODE_ADD_DETAILS = 17275; private static final short REQUEST_CODE_ADD_DETAILS = 17275;
private View next; private View next;
@@ -68,7 +68,6 @@ public class CreateGroupActivity extends ContactSelectionActivity {
next = findViewById(R.id.next); next = findViewById(R.id.next);
disableNext();
next.setOnClickListener(v -> handleNextPressed()); next.setOnClickListener(v -> handleNextPressed());
} }
@@ -107,10 +106,6 @@ public class CreateGroupActivity extends ContactSelectionActivity {
if (contactsFragment.hasQueryFilter()) { if (contactsFragment.hasQueryFilter()) {
getToolbar().clear(); getToolbar().clear();
} }
if (contactsFragment.getSelectedContactsCount() < MINIMUM_GROUP_SIZE) {
disableNext();
}
} }
private void enableNext() { private void enableNext() {
@@ -167,28 +162,33 @@ public class CreateGroupActivity extends ContactSelectionActivity {
resolved = Recipient.resolvedList(ids); resolved = Recipient.resolvedList(ids);
Pair<Boolean, List<RecipientId>> result;
boolean gv2 = Stream.of(recipientsAndSelf).allMatch(r -> r.getGroupsV2Capability() == Recipient.Capability.SUPPORTED); boolean gv2 = Stream.of(recipientsAndSelf).allMatch(r -> r.getGroupsV2Capability() == Recipient.Capability.SUPPORTED);
if (!gv2 && Stream.of(resolved).anyMatch(r -> !r.hasE164())) if (!gv2 && Stream.of(resolved).anyMatch(r -> !r.hasE164()))
{ {
Log.w(TAG, "Invalid GV1 group..."); Log.w(TAG, "Invalid GV1 group...");
ids = Collections.emptyList(); ids = Collections.emptyList();
result = Pair.create(false, ids);
} else {
result = Pair.create(true, ids);
} }
stopwatch.split("gv1-check"); stopwatch.split("gv1-check");
return ids; return result;
}, ids -> { }, result -> {
dismissibleDialog.dismiss(); dismissibleDialog.dismiss();
stopwatch.stop(TAG); stopwatch.stop(TAG);
if (ids.isEmpty()) { if (result.first) {
startActivityForResult(AddGroupDetailsActivity.newIntent(this, result.second), REQUEST_CODE_ADD_DETAILS);
} else {
new AlertDialog.Builder(this) new AlertDialog.Builder(this)
.setMessage(R.string.CreateGroupActivity_some_contacts_cannot_be_in_legacy_groups) .setMessage(R.string.CreateGroupActivity_some_contacts_cannot_be_in_legacy_groups)
.setPositiveButton(android.R.string.ok, (d, w) -> d.dismiss()) .setPositiveButton(android.R.string.ok, (d, w) -> d.dismiss())
.show(); .show();
} else {
startActivityForResult(AddGroupDetailsActivity.newIntent(this, ids), REQUEST_CODE_ADD_DETAILS);
} }
}); });
} }

View File

@@ -106,13 +106,7 @@ public class AddGroupDetailsFragment extends LoggingFragment {
name.addTextChangedListener(new AfterTextChanged(editable -> viewModel.setName(editable.toString()))); name.addTextChangedListener(new AfterTextChanged(editable -> viewModel.setName(editable.toString())));
toolbar.setNavigationOnClickListener(unused -> callback.onNavigationButtonPressed()); toolbar.setNavigationOnClickListener(unused -> callback.onNavigationButtonPressed());
create.setOnClickListener(v -> handleCreateClicked()); create.setOnClickListener(v -> handleCreateClicked());
viewModel.getMembers().observe(getViewLifecycleOwner(), recipients -> { viewModel.getMembers().observe(getViewLifecycleOwner(), members::setMembers);
members.setMembers(recipients);
if (recipients.isEmpty()) {
toast(R.string.AddGroupDetailsFragment__groups_require_at_least_two_members);
callback.onNavigationButtonPressed();
}
});
viewModel.getCanSubmitForm().observe(getViewLifecycleOwner(), isFormValid -> setCreateEnabled(isFormValid, true)); viewModel.getCanSubmitForm().observe(getViewLifecycleOwner(), isFormValid -> setCreateEnabled(isFormValid, true));
viewModel.getIsMms().observe(getViewLifecycleOwner(), isMms -> { viewModel.getIsMms().observe(getViewLifecycleOwner(), isMms -> {
mmsWarning.setVisibility(isMms ? View.VISIBLE : View.GONE); mmsWarning.setVisibility(isMms ? View.VISIBLE : View.GONE);
@@ -230,10 +224,6 @@ public class AddGroupDetailsFragment extends LoggingFragment {
case ERROR_INVALID_NAME: case ERROR_INVALID_NAME:
name.setError(getString(R.string.AddGroupDetailsFragment__this_field_is_required)); name.setError(getString(R.string.AddGroupDetailsFragment__this_field_is_required));
break; break;
case ERROR_INVALID_MEMBER_COUNT:
toast(R.string.AddGroupDetailsFragment__groups_require_at_least_two_members);
callback.onNavigationButtonPressed();
break;
default: default:
throw new IllegalStateException("Unexpected error: " + error.getErrorType().name()); throw new IllegalStateException("Unexpected error: " + error.getErrorType().name());
} }

View File

@@ -124,11 +124,6 @@ public final class AddGroupDetailsViewModel extends ViewModel {
return; return;
} }
if (memberIds.isEmpty()) {
groupCreateResult.postValue(GroupCreateResult.error(GroupCreateResult.Error.Type.ERROR_INVALID_MEMBER_COUNT));
return;
}
repository.createGroup(memberIds, repository.createGroup(memberIds,
avatarBytes, avatarBytes,
groupName, groupName,

View File

@@ -86,8 +86,7 @@ abstract class GroupCreateResult {
ERROR_IO, ERROR_IO,
ERROR_BUSY, ERROR_BUSY,
ERROR_FAILED, ERROR_FAILED,
ERROR_INVALID_NAME, ERROR_INVALID_NAME
ERROR_INVALID_MEMBER_COUNT
} }
} }