Merge "Modify QuickContact options menu" into ub-contactsdialer-h-dev
diff --git a/res/menu/quickcontact.xml b/res/menu/quickcontact.xml
index a0cbdbb..4d00a67 100644
--- a/res/menu/quickcontact.xml
+++ b/res/menu/quickcontact.xml
@@ -47,6 +47,14 @@
         android:title="@string/menu_create_contact_shortcut" />
 
     <item
+        android:id="@+id/menu_set_ringtone"
+        android:title="@string/menu_set_ring_tone" />
+
+    <item
+        android:id="@+id/menu_send_to_voicemail"
+        android:title="@string/menu_redirect_calls_to_vm"/>
+
+    <item
         android:id="@+id/menu_help"
         android:title="@string/menu_help" />
 </menu>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index cdea367..4f4b298 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -91,7 +91,7 @@
     <string name="menu_change_photo">Change photo</string>
 
     <!-- Menu item used to create a contact shortcut when viewing contact details. [CHAR LIMIT=30] -->
-    <string name="menu_create_contact_shortcut">Place on Home screen</string>
+    <string name="menu_create_contact_shortcut">Create shortcut</string>
 
     <!-- Menu item used to call a specific contact when viewing the details of that contact. -->
     <string name="menu_call">Call contact</string>
@@ -208,11 +208,14 @@
     <!-- Activity title indicating contacts are from a specific account [CHAR LIMIT=15] -->
     <string name="title_from_other_accounts">From <xliff:g id="account">%s</xliff:g></string>
 
-    <!-- Menu item that opens the Options activity for a given contact [CHAR LIMIT=15] -->
+    <!-- Menu item to set ring tone for a given contact [CHAR LIMIT=15] -->
     <string name="menu_set_ring_tone">Set ringtone</string>
 
-    <!-- Menu item that opens the Options activity for a given contact [CHAR LIMIT=30] -->
-    <string name="menu_redirect_calls_to_vm">All calls to voicemail</string>
+    <!-- Menu item to route all calls from a given contact to voice mail [CHAR LIMIT=30] -->
+    <string name="menu_redirect_calls_to_vm">Route to voicemail</string>
+
+    <!-- Menu item to unroute all calls from a given contact to voice mail [CHAR LIMIT=30] -->
+    <string name="menu_unredirect_calls_to_vm">Unroute to voicemail</string>
 
     <!-- Warning dialog contents after users select to delete a ReadOnly contact. [CHAR LIMIT=NONE] -->
     <string name="readOnlyContactWarning">Contacts from your read-only accounts cannot be deleted, but they can be hidden.</string>
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 87c339a..f69f2ec 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -42,6 +42,7 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.media.RingtoneManager;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
@@ -163,6 +164,7 @@
 import com.android.contacts.editor.AggregationSuggestionEngine.Suggestion;
 import com.android.contacts.editor.ContactEditorFragment;
 import com.android.contacts.editor.EditorIntents;
+import com.android.contacts.editor.EditorUiUtils;
 import com.android.contacts.editor.SplitContactConfirmationDialogFragment;
 import com.android.contacts.interactions.CalendarInteractionsLoader;
 import com.android.contacts.interactions.CallLogInteractionsLoader;
@@ -233,12 +235,19 @@
     private static final String KEY_PREVIOUS_CONTACT_ID = "previous_contact_id";
     private static final String KEY_SUGGESTIONS_AUTO_SELECTED = "suggestions_auto_seleted";
 
+    private static final String KEY_SEND_TO_VOICE_MAIL_STATE = "sendToVoicemailState";
+    private static final String KEY_ARE_PHONE_OPTIONS_CHANGEABLE = "arePhoneOptionsChangable";
+    private static final String KEY_CUSTOM_RINGTONE = "customRingtone";
+
     private static final int ANIMATION_STATUS_BAR_COLOR_CHANGE_DURATION = 150;
     private static final int REQUEST_CODE_CONTACT_EDITOR_ACTIVITY = 1;
     private static final int SCRIM_COLOR = Color.argb(0xC8, 0, 0, 0);
     private static final int REQUEST_CODE_CONTACT_SELECTION_ACTIVITY = 2;
     private static final String MIMETYPE_SMS = "vnd.android-dir/mms-sms";
     private static final int REQUEST_CODE_JOIN = 3;
+    private static final int REQUEST_CODE_PICK_RINGTONE = 4;
+
+    private static final int CURRENT_API_VERSION = android.os.Build.VERSION.SDK_INT;
 
     /** This is the Intent action to install a shortcut in the launcher. */
     private static final String ACTION_INSTALL_SHORTCUT =
@@ -246,6 +255,11 @@
 
     public static final String ACTION_SPLIT_COMPLETED = "splitCompleted";
 
+    // Phone specific option menu items
+    private boolean mSendToVoicemailState;
+    private boolean mArePhoneOptionsChangable;
+    private String mCustomRingtone;
+
     @SuppressWarnings("deprecation")
     private static final String LEGACY_AUTHORITY = android.provider.Contacts.AUTHORITY;
 
@@ -953,6 +967,12 @@
         mIsRecreatedInstance = savedInstanceState != null;
         if (mIsRecreatedInstance) {
             mPreviousContactId = savedInstanceState.getLong(KEY_PREVIOUS_CONTACT_ID);
+
+            // Phone specific options menus
+            mSendToVoicemailState = savedInstanceState.getBoolean(KEY_SEND_TO_VOICE_MAIL_STATE);
+            mArePhoneOptionsChangable =
+                    savedInstanceState.getBoolean(KEY_ARE_PHONE_OPTIONS_CHANGEABLE);
+            mCustomRingtone = savedInstanceState.getString(KEY_CUSTOM_RINGTONE);
         }
         mShouldLog = true;
 
@@ -1191,9 +1211,20 @@
             if (data != null) {
                 joinAggregate(ContentUris.parseId(data.getData()));
             }
+        } else if (requestCode == REQUEST_CODE_PICK_RINGTONE && data != null) {
+            final Uri pickedUri = data.getParcelableExtra(
+                        RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
+            onRingtonePicked(pickedUri);
         }
     }
 
+    private void onRingtonePicked(Uri pickedUri) {
+        mCustomRingtone = EditorUiUtils.getRingtoneStringFromUri(pickedUri, CURRENT_API_VERSION);
+        Intent intent = ContactSaveService.createSetRingtone(
+                this, mLookupUri, mCustomRingtone);
+        this.startService(intent);
+    }
+
     @Override
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
@@ -1215,6 +1246,11 @@
                 KEY_SUGGESTIONS_AUTO_SELECTED, mSuggestionsShouldAutoSelected);
         savedInstanceState.putSerializable(
                 KEY_SELECTED_SUGGESTION_CONTACTS, mSelectedAggregationIds);
+
+        // Phone specific options
+        savedInstanceState.putBoolean(KEY_SEND_TO_VOICE_MAIL_STATE, mSendToVoicemailState);
+        savedInstanceState.putBoolean(KEY_ARE_PHONE_OPTIONS_CHANGEABLE, mArePhoneOptionsChangable);
+        savedInstanceState.putString(KEY_CUSTOM_RINGTONE, mCustomRingtone);
     }
 
     private void processIntent(Intent intent) {
@@ -1350,6 +1386,7 @@
         }
         mContactType = newContactType;
 
+        setStateForPhoneMenuItems(mContactData);
         invalidateOptionsMenu();
 
         Trace.endSection();
@@ -2972,6 +3009,15 @@
         return receivers != null && receivers.size() > 0;
     }
 
+    private void setStateForPhoneMenuItems(Contact contact) {
+        if (contact != null) {
+            mSendToVoicemailState = contact.isSendToVoicemail();
+            mCustomRingtone = contact.getCustomRingtone();
+            mArePhoneOptionsChangable = isContactEditable()
+                    && PhoneCapabilityTester.isPhone(this);
+        }
+    }
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         final MenuInflater inflater = getMenuInflater();
@@ -3018,6 +3064,17 @@
             final MenuItem shortcutMenuItem = menu.findItem(R.id.menu_create_contact_shortcut);
             shortcutMenuItem.setVisible(isShortcutCreatable());
 
+            // Hide telephony-related settings (ringtone, send to voicemail)
+            // if we don't have a telephone
+            final MenuItem ringToneMenuItem = menu.findItem(R.id.menu_set_ringtone);
+            ringToneMenuItem.setVisible(!mContactData.isUserProfile() && mArePhoneOptionsChangable);
+
+            final MenuItem sendToVoiceMailMenuItem = menu.findItem(R.id.menu_send_to_voicemail);
+            sendToVoiceMailMenuItem.setVisible(!mContactData.isUserProfile()
+                    && mArePhoneOptionsChangable);
+            sendToVoiceMailMenuItem.setTitle(mSendToVoicemailState
+                    ? R.string.menu_unredirect_calls_to_vm : R.string.menu_redirect_calls_to_vm);
+
             final MenuItem helpMenu = menu.findItem(R.id.menu_help);
             helpMenu.setVisible(HelpUtils.isHelpAndFeedbackAvailable());
 
@@ -3136,6 +3193,19 @@
                     createLauncherShortcutWithContact();
                 }
                 return true;
+            case R.id.menu_set_ringtone:
+                doPickRingtone();
+                return true;
+            case R.id.menu_send_to_voicemail:
+                // Update state and save
+                mSendToVoicemailState = !mSendToVoicemailState;
+                item.setTitle(mSendToVoicemailState
+                        ? R.string.menu_unredirect_calls_to_vm
+                        : R.string.menu_redirect_calls_to_vm);
+                final Intent intent = ContactSaveService.createSetSendToVoicemail(
+                        this, mLookupUri, mSendToVoicemailState);
+                this.startService(intent);
+                return true;
             case R.id.menu_help:
                 Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
                         ActionType.HELP, /* thirdPartyAction */ null);
@@ -3195,4 +3265,27 @@
         ContactSaveService.startService(this, intent,
                 ContactEditorActivity.ContactEditor.SaveMode.SPLIT);
     }
+
+    private void doPickRingtone() {
+        final Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
+        // Allow user to pick 'Default'
+        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
+        // Show only ringtones
+        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
+        // Allow the user to pick a silent ringtone
+        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
+
+        final Uri ringtoneUri = EditorUiUtils.getRingtoneUriFromString(mCustomRingtone,
+                CURRENT_API_VERSION);
+
+        // Put checkmark next to the current ringtone for this contact
+        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);
+
+        // Launch!
+        try {
+            startActivityForResult(intent, REQUEST_CODE_PICK_RINGTONE);
+        } catch (ActivityNotFoundException ex) {
+            Toast.makeText(this, R.string.missing_app, Toast.LENGTH_SHORT).show();
+        }
+    }
 }