diff --git a/res/values/strings.xml b/res/values/strings.xml
index c806d57e61..9e5c0b2da4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -233,8 +233,9 @@
Create group
Creating %1$s…
Updating %1$s...
- Cannot add non-Signal contacts to an existing Signal group
+ Couldn\'t add %1$s because they\'re not a Signal user.
Loading group details...
+ You\'re already in the group.
Me
diff --git a/src/org/thoughtcrime/securesms/GroupCreateActivity.java b/src/org/thoughtcrime/securesms/GroupCreateActivity.java
index 911667d163..eb2085ee8c 100644
--- a/src/org/thoughtcrime/securesms/GroupCreateActivity.java
+++ b/src/org/thoughtcrime/securesms/GroupCreateActivity.java
@@ -26,6 +26,7 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
@@ -75,6 +76,7 @@ import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Set;
@@ -161,7 +163,9 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
getSupportActionBar().setTitle(R.string.GroupCreateActivity_actionbar_mms_title);
} else {
enableSignalGroupViews();
- getSupportActionBar().setTitle(R.string.GroupCreateActivity_actionbar_title);
+ getSupportActionBar().setTitle(groupToUpdate.isPresent()
+ ? R.string.GroupCreateActivity_actionbar_update_title
+ : R.string.GroupCreateActivity_actionbar_title);
}
}
@@ -174,21 +178,12 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
}
}
- private void addSelectedContact(@NonNull Recipient contact) {
- final boolean isPushUser = isActiveInDirectory(this, contact);
- if (groupToUpdate.isPresent() && !isPushUser) {
- Toast.makeText(this, R.string.GroupCreateActivity_cannot_add_non_push_to_existing_group, Toast.LENGTH_LONG).show();
- return;
- }
-
- getAdapter().add(contact, isPushUser);
- updateViewState();
+ private void addSelectedContacts(@NonNull Recipient... recipients) {
+ new AddMembersTask(this).execute(recipients);
}
- private void addAllSelectedContacts(Collection contacts) {
- for (Recipient contact : contacts) {
- addSelectedContact(contact);
- }
+ private void addSelectedContacts(@NonNull Collection recipients) {
+ addSelectedContacts(recipients.toArray(new Recipient[recipients.size()]));
}
private void initializeResources() {
@@ -261,7 +256,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
@Override
public void onRecipientsPanelUpdate(Recipients recipients) {
- if (recipients != null) addAllSelectedContacts(recipients.getRecipientsList());
+ if (recipients != null) addSelectedContacts(recipients.getRecipientsList());
}
private void handleGroupCreate() {
@@ -312,7 +307,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
List selected = data.getStringArrayListExtra("contacts");
for (String contact : selected) {
final Recipient recipient = RecipientFactory.getRecipientsFromString(this, contact, false).getPrimaryRecipient();
- if (recipient != null) addSelectedContact(recipient);
+ if (recipient != null) addSelectedContacts(recipient);
}
break;
@@ -485,6 +480,65 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
}
}
+ private static class AddMembersTask extends AsyncTask> {
+ static class Result {
+ Optional recipient;
+ boolean isPush;
+ String reason;
+
+ public Result(@Nullable Recipient recipient, boolean isPush, @Nullable String reason) {
+ this.recipient = Optional.fromNullable(recipient);
+ this.isPush = isPush;
+ this.reason = reason;
+ }
+ }
+
+ private GroupCreateActivity activity;
+ private boolean failIfNotPush;
+
+ public AddMembersTask(@NonNull GroupCreateActivity activity) {
+ this.activity = activity;
+ this.failIfNotPush = activity.groupToUpdate.isPresent();
+ }
+
+ @Override
+ protected List doInBackground(Recipient... recipients) {
+ final List results = new LinkedList<>();
+
+ for (Recipient recipient : recipients) {
+ boolean isPush = isActiveInDirectory(activity, recipient);
+ String recipientE164 = null;
+ try {
+ recipientE164 = Util.canonicalizeNumber(activity, recipient.getNumber());
+ } catch (InvalidNumberException ine) { /* do nothing */ }
+
+ if (failIfNotPush && !isPush) {
+ results.add(new Result(null, false, activity.getString(R.string.GroupCreateActivity_cannot_add_non_push_to_existing_group,
+ recipient.getNumber())));
+ } else if (TextUtils.equals(TextSecurePreferences.getLocalNumber(activity), recipientE164)) {
+ results.add(new Result(null, false, activity.getString(R.string.GroupCreateActivity_youre_already_in_the_group)));
+ } else {
+ results.add(new Result(recipient, isPush, null));
+ }
+ }
+ return results;
+ }
+
+ @Override
+ protected void onPostExecute(List results) {
+ if (activity.isFinishing()) return;
+
+ for (Result result : results) {
+ if (result.recipient.isPresent()) {
+ activity.getAdapter().add(result.recipient.get(), result.isPush);
+ } else {
+ Toast.makeText(activity, result.reason, Toast.LENGTH_SHORT).show();
+ }
+ }
+ activity.updateViewState();
+ }
+ }
+
private static class FillExistingGroupInfoAsyncTask extends ProgressDialogAsyncTask> {
private GroupCreateActivity activity;
@@ -525,6 +579,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
SelectedRecipientsAdapter adapter = new SelectedRecipientsAdapter(activity, group.get().recipients);
adapter.setOnRecipientDeletedListener(activity);
activity.lv.setAdapter(adapter);
+ activity.updateViewState();
}
}
}