diff --git a/src/org/thoughtcrime/securesms/GroupMembersDialog.java b/src/org/thoughtcrime/securesms/GroupMembersDialog.java index 497216d6d4..8cb314a3c9 100644 --- a/src/org/thoughtcrime/securesms/GroupMembersDialog.java +++ b/src/org/thoughtcrime/securesms/GroupMembersDialog.java @@ -2,7 +2,11 @@ package org.thoughtcrime.securesms; import android.app.ProgressDialog; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Rect; import android.os.AsyncTask; +import android.provider.ContactsContract; import android.util.Log; import com.afollestad.materialdialogs.AlertDialogWrapper; @@ -45,7 +49,7 @@ public class GroupMembersDialog extends AsyncTask { return DatabaseFactory.getGroupDatabase(context) .getGroupMembers(GroupUtil.getDecodedId(groupId), true); } catch (IOException e) { - Log.w("ConverstionActivity", e); + Log.w(TAG, e); return new Recipients(new LinkedList()); } } @@ -56,20 +60,12 @@ public class GroupMembersDialog extends AsyncTask { progress.dismiss(); } - List recipientStrings = new LinkedList<>(); - recipientStrings.add(context.getString(R.string.GroupMembersDialog_me)); - - for (Recipient recipient : members.getRecipientsList()) { - if (!isLocalNumber(recipient)) { - recipientStrings.add(recipient.toShortString()); - } - } - + GroupMembers groupMembers = new GroupMembers(members); AlertDialogWrapper.Builder builder = new AlertDialogWrapper.Builder(context); builder.setTitle(R.string.ConversationActivity_group_members); builder.setIconAttribute(R.attr.group_members_dialog_icon); builder.setCancelable(true); - builder.setItems(recipientStrings.toArray(new String[]{}), null); + builder.setItems(groupMembers.getRecipientStrings(), new GroupMembersOnClickListener(context, groupMembers)); builder.setPositiveButton(android.R.string.ok, null); builder.show(); } @@ -79,15 +75,83 @@ public class GroupMembersDialog extends AsyncTask { else onPostExecute(recipients); } - private boolean isLocalNumber(Recipient recipient) { - try { - String localNumber = TextSecurePreferences.getLocalNumber(context); - String e164Number = Util.canonicalizeNumber(context, recipient.getNumber()); + private class GroupMembersOnClickListener implements DialogInterface.OnClickListener { + private final GroupMembers groupMembers; + private final Context context; - return e164Number != null && e164Number.equals(localNumber); - } catch (InvalidNumberException e) { - Log.w(TAG, e); - return false; + public GroupMembersOnClickListener(Context context, GroupMembers members) { + this.context = context; + this.groupMembers = members; + } + + @Override + public void onClick(DialogInterface dialogInterface, int item) { + Recipient recipient = groupMembers.get(item); + + if (recipient.getContactUri() != null) { + ContactsContract.QuickContact.showQuickContact(context, new Rect(0,0,0,0), + recipient.getContactUri(), + ContactsContract.QuickContact.MODE_LARGE, null); + } else { + final Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT); + intent.putExtra(ContactsContract.Intents.Insert.PHONE, recipient.getNumber()); + intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); + context.startActivity(intent); + } + } + } + + /** + * Wraps a List of Recipient (just like @class Recipients), + * but with focus on the order of the Recipients. + * So that the order of the RecipientStrings[] matches + * the internal order. + * + * @author Christoph Haefner + */ + private class GroupMembers { + private final String TAG = GroupMembers.class.getSimpleName(); + + private final LinkedList members = new LinkedList<>(); + + public GroupMembers(Recipients recipients) { + for (Recipient recipient : recipients.getRecipientsList()) { + if (isLocalNumber(recipient)) { + members.push(recipient); + } else { + members.add(recipient); + } + } + } + + public String[] getRecipientStrings() { + List recipientStrings = new LinkedList<>(); + + for (Recipient recipient : members) { + if (isLocalNumber(recipient)) { + recipientStrings.add(context.getString(R.string.GroupMembersDialog_me)); + } else { + recipientStrings.add(recipient.toShortString()); + } + } + + return recipientStrings.toArray(new String[members.size()]); + } + + public Recipient get(int index) { + return members.get(index); + } + + private boolean isLocalNumber(Recipient recipient) { + try { + String localNumber = TextSecurePreferences.getLocalNumber(context); + String e164Number = Util.canonicalizeNumber(context, recipient.getNumber()); + + return e164Number != null && e164Number.equals(localNumber); + } catch (InvalidNumberException e) { + Log.w(TAG, e); + return false; + } } } }