From 3d690faff06afdfe2bec5dde5a2b6aea67b50635 Mon Sep 17 00:00:00 2001 From: Ruben Pollan Date: Thu, 17 Oct 2013 02:28:36 +0200 Subject: [PATCH] New 'add contact info' option on the conversation contextual menu This option is used to add phone numbers from the contact list on the messages. --- res/menu/conversation.xml | 4 ++ res/values/strings.xml | 2 + .../securesms/ConversationActivity.java | 43 +++++++++++++++++++ .../securesms/contacts/ContactAccessor.java | 7 ++- 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/res/menu/conversation.xml b/res/menu/conversation.xml index a95d63fff0..37b884877c 100644 --- a/res/menu/conversation.xml +++ b/res/menu/conversation.xml @@ -5,6 +5,10 @@ android:id="@+id/menu_add_attachment" android:icon="@drawable/ic_menu_attach" /> + + diff --git a/res/values/strings.xml b/res/values/strings.xml index de8a62cefa..9b5c2541ec 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -54,6 +54,7 @@ Delete Thread Confirmation Are you sure that you want to permanently delete this conversation? Add attachment + Select contact info Compose Message Sorry, there was an error setting your attachment. Sorry, the selected video exceeds message size restrictions. @@ -517,6 +518,7 @@ Add attachment + Add contact info Delete thread diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index 4b8648a939..54b9f047bf 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -30,6 +30,7 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; +import android.provider.ContactsContract; import android.telephony.PhoneNumberUtils; import android.text.Editable; import android.text.InputType; @@ -54,6 +55,9 @@ import com.actionbarsherlock.view.MenuItem; import org.thoughtcrime.securesms.components.EmojiDrawer; import org.thoughtcrime.securesms.components.EmojiToggle; import org.thoughtcrime.securesms.components.RecipientsPanel; +import org.thoughtcrime.securesms.contacts.ContactAccessor; +import org.thoughtcrime.securesms.contacts.ContactAccessor.ContactData; +import org.thoughtcrime.securesms.contacts.ContactAccessor.NumberData; import org.thoughtcrime.securesms.crypto.KeyExchangeInitiator; import org.thoughtcrime.securesms.crypto.KeyExchangeProcessor; import org.thoughtcrime.securesms.crypto.KeyUtil; @@ -116,6 +120,7 @@ public class ConversationActivity extends PassphraseRequiredSherlockFragmentActi private static final int PICK_IMAGE = 2; private static final int PICK_VIDEO = 3; private static final int PICK_AUDIO = 4; + private static final int PICK_CONTACT_INFO = 5; private MasterSecret masterSecret; private RecipientsPanel recipientsPanel; @@ -219,6 +224,9 @@ public class ConversationActivity extends PassphraseRequiredSherlockFragmentActi case PICK_AUDIO: addAttachmentAudio(data.getData()); break; + case PICK_CONTACT_INFO: + addContactInfo(data.getData()); + break; } } @@ -262,6 +270,7 @@ public class ConversationActivity extends PassphraseRequiredSherlockFragmentActi switch (item.getItemId()) { case R.id.menu_call: handleDial(getRecipients().getPrimaryRecipient()); return true; case R.id.menu_delete_thread: handleDeleteThread(); return true; + case R.id.menu_add_contact_info: handleAddContactInfo(); return true; case R.id.menu_add_attachment: handleAddAttachment(); return true; case R.id.menu_start_secure_session: handleStartSecureSession(); return true; case R.id.menu_abort_session: handleAbortSecureSession(); return true; @@ -457,6 +466,11 @@ public class ConversationActivity extends PassphraseRequiredSherlockFragmentActi builder.show(); } + private void handleAddContactInfo() { + Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); + startActivityForResult(intent, PICK_CONTACT_INFO); + } + private void handleAddAttachment() { if (this.isMmsEnabled) { AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -721,6 +735,35 @@ public class ConversationActivity extends PassphraseRequiredSherlockFragmentActi } } + private void addContactInfo(Uri contactUri) { + ContactAccessor contactDataList = ContactAccessor.getInstance(); + ContactData contactData = contactDataList.getContactData(this, contactUri); + + if (contactData.numbers.size() == 1) composeText.append(contactData.numbers.get(0).number); + else if (contactData.numbers.size() > 1) selectContactInfo(contactData); + } + + private void selectContactInfo(ContactData contactData) { + final CharSequence[] numbers = new CharSequence[contactData.numbers.size()]; + final CharSequence[] numberItems = new CharSequence[contactData.numbers.size()]; + for (int i = 0; i < contactData.numbers.size(); i++) { + numbers[i] = contactData.numbers.get(i).number; + numberItems[i] = contactData.numbers.get(i).type + ": " + contactData.numbers.get(i).number; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setIcon(R.drawable.ic_contact_picture); + builder.setTitle(R.string.ConversationActivity_select_contact_info); + + builder.setItems(numberItems, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + composeText.append(numbers[which]); + } + }); + builder.show(); + } + private List getDraftsForCurrentState() { List drafts = new LinkedList(); diff --git a/src/org/thoughtcrime/securesms/contacts/ContactAccessor.java b/src/org/thoughtcrime/securesms/contacts/ContactAccessor.java index b439efab53..a4984e8a0b 100644 --- a/src/org/thoughtcrime/securesms/contacts/ContactAccessor.java +++ b/src/org/thoughtcrime/securesms/contacts/ContactAccessor.java @@ -39,6 +39,7 @@ import org.thoughtcrime.securesms.crypto.InvalidKeyException; import org.thoughtcrime.securesms.util.Base64; import java.io.IOException; +import java.lang.Long; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -128,7 +129,11 @@ public class ContactAccessor { return getContactData(context, cursor.getString(cursor.getColumnIndexOrThrow(Contacts.DISPLAY_NAME)), cursor.getLong(cursor.getColumnIndexOrThrow(Contacts._ID))); -} + } + + public ContactData getContactData(Context context, Uri uri) { + return getContactData(context, getNameFromContact(context, uri), Long.parseLong(uri.getLastPathSegment())); + } private ContactData getContactData(Context context, String displayName, long id) { ContactData contactData = new ContactData(id, displayName);