move db query off main thread, fix group self-add

fixes #4168
Closes #4502
// FREEBIE
This commit is contained in:
Jake McGinty 2015-11-12 12:20:14 -08:00 committed by Moxie Marlinspike
parent e51e5cdfd4
commit 76b0183e0f
2 changed files with 73 additions and 17 deletions

View File

@ -233,8 +233,9 @@
<string name="GroupCreateActivity_menu_create_title">Create group</string>
<string name="GroupCreateActivity_creating_group">Creating %1$s&#8230;</string>
<string name="GroupCreateActivity_updating_group">Updating %1$s...</string>
<string name="GroupCreateActivity_cannot_add_non_push_to_existing_group">Cannot add non-Signal contacts to an existing Signal group</string>
<string name="GroupCreateActivity_cannot_add_non_push_to_existing_group">Couldn\'t add %1$s because they\'re not a Signal user.</string>
<string name="GroupCreateActivity_loading_group_details">Loading group details...</string>
<string name="GroupCreateActivity_youre_already_in_the_group">You\'re already in the group.</string>
<!-- GroupMembersDialog -->
<string name="GroupMembersDialog_me">Me</string>

View File

@ -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<Recipient> contacts) {
for (Recipient contact : contacts) {
addSelectedContact(contact);
}
private void addSelectedContacts(@NonNull Collection<Recipient> 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<String> 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<Recipient,Void,List<AddMembersTask.Result>> {
static class Result {
Optional<Recipient> 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<Result> doInBackground(Recipient... recipients) {
final List<Result> 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<Result> 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<byte[],Void,Optional<GroupData>> {
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();
}
}
}