Options Menu layout changes
Show correct buttons for each tab
Show correct buttons for contact viewer and editor
Removed ContactOptions activity and now showing ringtone picker
directly.
Removed all "contact options" from XMLs.
Bug: 5062002
Change-Id: Ic52eaacdc5d9b5aab55fde37181c6ad6d7154b74
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ff7c089..657bf5d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -532,16 +532,6 @@
android:name=".ContactSaveService"
android:exported="false" />
- <!-- Views the details of a single contact -->
- <activity android:name="ContactOptionsActivity"
- android:label="@string/contactOptionsTitle"
- >
- <intent-filter>
- <action android:name="android.intent.action.EDIT" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
<!-- Attaches a photo to a contact. Started from external applications -->
<activity android:name=".activities.AttachPhotoActivity"
android:label="@string/attach_photo_dialog_title"
diff --git a/res/layout/contact_options.xml b/res/layout/contact_options.xml
deleted file mode 100644
index 5bd8836..0000000
--- a/res/layout/contact_options.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
->
-
- <include layout="@layout/preference_with_more_button" android:id="@+id/ringtone" />
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider"
- />
- <include layout="@layout/edit_contact_entry_voicemail" android:id="@+id/voicemail"/>
-
-</LinearLayout>
diff --git a/res/menu-sw580dp-w720dp/actions.xml b/res/menu-sw580dp-w720dp/actions.xml
index d87b091..ff12772 100644
--- a/res/menu-sw580dp-w720dp/actions.xml
+++ b/res/menu-sw580dp-w720dp/actions.xml
@@ -29,21 +29,25 @@
<item
android:id="@+id/menu_contacts_filter"
android:icon="@drawable/ic_menu_settings_holo_light"
+ android:orderInCategory="1"
android:title="@string/menu_contacts_filter" />
<item
android:id="@+id/menu_settings"
android:icon="@drawable/ic_menu_settings_holo_light"
+ android:orderInCategory="2"
android:title="@string/menu_settings" />
<item
- android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
- android:title="@string/menu_accounts" />
-
- <item
android:id="@+id/menu_import_export"
android:icon="@drawable/ic_menu_import_export_holo_light"
+ android:orderInCategory="3"
android:title="@string/menu_import_export" />
+ <item
+ android:id="@+id/menu_accounts"
+ android:icon="@drawable/ic_menu_accounts_holo_light"
+ android:orderInCategory="4"
+ android:title="@string/menu_accounts" />
+
</menu>
diff --git a/res/menu-sw580dp-w720dp/view_contact.xml b/res/menu-sw580dp-w720dp/view_contact.xml
index 733ab25..0fc918b 100644
--- a/res/menu-sw580dp-w720dp/view_contact.xml
+++ b/res/menu-sw580dp-w720dp/view_contact.xml
@@ -23,18 +23,14 @@
android:showAsAction="always" />
<item
+ android:id="@+id/menu_delete"
+ android:icon="@drawable/ic_menu_trash_holo_light"
+ android:title="@string/menu_deleteContact" />
+
+ <item
android:id="@+id/menu_share"
android:icon="@drawable/ic_menu_share_holo_light"
android:title="@string/menu_share"
android:alphabeticShortcut="s" />
- <item
- android:id="@+id/menu_options"
- android:icon="@drawable/ic_menu_mark"
- android:title="@string/menu_contactOptions" />
-
- <item
- android:id="@+id/menu_delete"
- android:icon="@drawable/ic_menu_trash_holo_light"
- android:title="@string/menu_deleteContact" />
</menu>
diff --git a/res/menu-sw580dp/actions.xml b/res/menu-sw580dp/actions.xml
index fea883e..43b998d 100644
--- a/res/menu-sw580dp/actions.xml
+++ b/res/menu-sw580dp/actions.xml
@@ -26,24 +26,33 @@
android:title="@string/menu_new_group_action_bar"
android:showAsAction="withText" />
+ <!-- Added orderInCategory to keep the following buttons at the end of the menu
+ Buttons will be added in the order added/inflated. Ordered buttons will be added
+ at the end according to the orderInCategory. This setup insures that the buttons below
+ will be the last buttons in the menu regardless of how many buttons are added
+ -->
<item
android:id="@+id/menu_contacts_filter"
android:icon="@drawable/ic_menu_settings_holo_light"
+ android:orderInCategory="1"
android:title="@string/menu_contacts_filter" />
<item
android:id="@+id/menu_settings"
android:icon="@drawable/ic_menu_settings_holo_light"
+ android:orderInCategory="2"
android:title="@string/menu_settings" />
<item
- android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
- android:title="@string/menu_accounts" />
-
- <item
android:id="@+id/menu_import_export"
android:icon="@drawable/ic_menu_import_export_holo_light"
+ android:orderInCategory="3"
android:title="@string/menu_import_export" />
+ <item
+ android:id="@+id/menu_accounts"
+ android:icon="@drawable/ic_menu_accounts_holo_light"
+ android:orderInCategory="4"
+ android:title="@string/menu_accounts" />
+
</menu>
diff --git a/res/menu-sw580dp/view_contact.xml b/res/menu-sw580dp/view_contact.xml
index 542cfe3..e4b4b37 100644
--- a/res/menu-sw580dp/view_contact.xml
+++ b/res/menu-sw580dp/view_contact.xml
@@ -22,18 +22,14 @@
android:alphabeticShortcut="e" />
<item
+ android:id="@+id/menu_delete"
+ android:icon="@drawable/ic_menu_trash_holo_light"
+ android:title="@string/menu_deleteContact" />
+
+ <item
android:id="@+id/menu_share"
android:icon="@drawable/ic_menu_share_holo_light"
android:title="@string/menu_share"
android:alphabeticShortcut="s" />
- <item
- android:id="@+id/menu_options"
- android:icon="@drawable/ic_menu_mark"
- android:title="@string/menu_contactOptions" />
-
- <item
- android:id="@+id/menu_delete"
- android:icon="@drawable/ic_menu_trash_holo_light"
- android:title="@string/menu_deleteContact" />
</menu>
diff --git a/res/menu/actions.xml b/res/menu/actions.xml
index fd2b967..346875b 100644
--- a/res/menu/actions.xml
+++ b/res/menu/actions.xml
@@ -43,13 +43,13 @@
android:title="@string/menu_settings" />
<item
- android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
- android:title="@string/menu_accounts" />
-
- <item
android:id="@+id/menu_import_export"
android:icon="@drawable/ic_menu_import_export_holo_light"
android:title="@string/menu_import_export" />
+ <item
+ android:id="@+id/menu_accounts"
+ android:icon="@drawable/ic_menu_accounts_holo_light"
+ android:title="@string/menu_accounts" />
+
</menu>
diff --git a/res/menu/view_contact.xml b/res/menu/view_contact.xml
index 7cf17d6..17ed7c6 100644
--- a/res/menu/view_contact.xml
+++ b/res/menu/view_contact.xml
@@ -28,12 +28,17 @@
android:alphabeticShortcut="s" />
<item
- android:id="@+id/menu_options"
- android:icon="@drawable/ic_menu_mark"
- android:title="@string/menu_contactOptions" />
-
- <item
android:id="@+id/menu_delete"
android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteContact" />
+
+ <item
+ android:id="@+id/menu_set_ringtone"
+ android:icon="@drawable/ic_menu_mark"
+ android:title="@string/menu_set_ring_tone" />
+
+ <item
+ android:id="@+id/menu_send_to_voicemail"
+ android:checkable="true"
+ android:title="@string/menu_redirect_calls_to_vm" />
</menu>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4069c49..04dce39 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -176,15 +176,18 @@
<!-- Toast shown after two contacts have been joined by a user action -->
<string name="contactsJoinedMessage">Contacts joined</string>
- <!-- Menu item that opens the Options activity for a given contact -->
- <string name="menu_contactOptions">Options</string>
-
<!-- Title for the Options activity for a given contact -->
<string name="contactOptionsTitle">Options</string>
<!-- Confirmation dialog title after users selects to delete a contact. -->
<string name="deleteConfirmation_title">Delete</string>
+ <!-- Menu item that opens the Options activity 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">Redirect calls to voicemail</string>
+
<!-- Warning dialog contents after users selects to delete a ReadOnly contact. -->
<string name="readOnlyContactWarning">You cannot delete contacts from read-only accounts, but you can hide them in your contacts lists.</string>
diff --git a/src/com/android/contacts/ContactLoader.java b/src/com/android/contacts/ContactLoader.java
index 4078598..e759efe 100644
--- a/src/com/android/contacts/ContactLoader.java
+++ b/src/com/android/contacts/ContactLoader.java
@@ -126,6 +126,8 @@
private boolean mLoadingPhoto;
private byte[] mPhotoBinaryData;
+ private boolean mSendToVoicemail;
+ private String mCustomRingtone;
/**
* Constructor for case "no contact found". This must only be used for the
@@ -150,6 +152,8 @@
mStarred = false;
mPresence = null;
mInvitableAccountTypes = null;
+ mSendToVoicemail = false;
+ mCustomRingtone = null;
}
/**
@@ -158,7 +162,7 @@
private Result(Uri uri, Uri lookupUri, long directoryId, String lookupKey, long id,
long nameRawContactId, int displayNameSource, long photoId, String photoUri,
String displayName, String altDisplayName, String phoneticName, boolean starred,
- Integer presence) {
+ Integer presence, boolean sendToVoicemail, String customRingtone) {
mLookupUri = lookupUri;
mUri = uri;
mDirectoryId = directoryId;
@@ -177,6 +181,8 @@
mStarred = starred;
mPresence = presence;
mInvitableAccountTypes = Lists.newArrayList();
+ mSendToVoicemail = sendToVoicemail;
+ mCustomRingtone = customRingtone;
}
private Result(Result from) {
@@ -209,6 +215,8 @@
mLoadingPhoto = from.mLoadingPhoto;
mPhotoBinaryData = from.mPhotoBinaryData;
+ mSendToVoicemail = from.mSendToVoicemail;
+ mCustomRingtone = from.mCustomRingtone;
}
/**
@@ -378,6 +386,14 @@
public List<GroupMetaData> getGroupMetaData() {
return mGroups;
}
+
+ public boolean isSendToVoicemail() {
+ return mSendToVoicemail;
+ }
+
+ public String getCustomRingtone() {
+ return mCustomRingtone;
+ }
}
/**
@@ -451,6 +467,8 @@
Data.STATUS_TIMESTAMP,
Contacts.PHOTO_URI,
+ Contacts.SEND_TO_VOICEMAIL,
+ Contacts.CUSTOM_RINGTONE,
};
public final static int NAME_RAW_CONTACT_ID = 0;
@@ -518,6 +536,8 @@
public final static int STATUS_TIMESTAMP = 58;
public final static int PHOTO_URI = 59;
+ public final static int SEND_TO_VOICEMAIL = 60;
+ public final static int CUSTOM_RINGTONE = 61;
}
/**
@@ -773,6 +793,8 @@
final Integer presence = cursor.isNull(ContactQuery.CONTACT_PRESENCE)
? null
: cursor.getInt(ContactQuery.CONTACT_PRESENCE);
+ final boolean sendToVoicemail = cursor.getInt(ContactQuery.SEND_TO_VOICEMAIL) == 1;
+ final String customRingtone = cursor.getString(ContactQuery.CUSTOM_RINGTONE);
Uri lookupUri;
if (directoryId == Directory.DEFAULT || directoryId == Directory.LOCAL_INVISIBLE) {
@@ -784,7 +806,8 @@
return new Result(contactUri, lookupUri, directoryId, lookupKey, contactId,
nameRawContactId, displayNameSource, photoId, photoUri, displayName,
- altDisplayName, phoneticName, starred, presence);
+ altDisplayName, phoneticName, starred, presence, sendToVoicemail,
+ customRingtone);
}
/**
diff --git a/src/com/android/contacts/ContactOptionsActivity.java b/src/com/android/contacts/ContactOptionsActivity.java
deleted file mode 100644
index dd7387f..0000000
--- a/src/com/android/contacts/ContactOptionsActivity.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts;
-
-import com.android.contacts.activities.PeopleActivity;
-
-import android.app.ActionBar;
-import android.app.Activity;
-import android.content.ContentValues;
-import android.content.Intent;
-import android.database.Cursor;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.ContactsContract.Contacts;
-import android.util.Log;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.CheckBox;
-import android.widget.TextView;
-
-/**
- * An activity for selecting options for a given contact: custom ringtone and send-to-voicemail.
- */
-public class ContactOptionsActivity extends Activity implements View.OnClickListener {
-
- private static final String TAG = "ContactOptionsActivity";
-
- private static final String[] AGGREGATES_PROJECTION = new String[] {
- Contacts.CUSTOM_RINGTONE, Contacts.SEND_TO_VOICEMAIL
- };
-
- private static final int COL_CUSTOM_RINGTONE = 0;
- private static final int COL_SEND_TO_VOICEMAIL = 1;
-
- /** The launch code when picking a ringtone */
- private static final int RINGTONE_PICKED = 3023;
-
- private String mCustomRingtone;
- private boolean mSendToVoicemail;
- private TextView mRingtoneTitle;
- private CheckBox mSendToVoicemailCheckbox;
-
- private Uri mLookupUri;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- mLookupUri = getIntent().getData();
-
- setContentView(R.layout.contact_options);
-
- View ringtoneLayout = findViewById(R.id.ringtone);
- ringtoneLayout.setFocusable(true);
- ringtoneLayout.setOnClickListener(this);
- TextView label = (TextView)findViewById(R.id.label);
- label.setText(getString(R.string.label_ringtone));
-
- mRingtoneTitle = (TextView)ringtoneLayout.findViewById(R.id.data);
-
- View sendToVoicemailLayout = findViewById(R.id.voicemail);
- sendToVoicemailLayout.setOnClickListener(this);
- label = (TextView)sendToVoicemailLayout.findViewById(R.id.label);
- label.setText(getString(R.string.actionIncomingCall));
-
- ActionBar actionBar = getActionBar();
- if (actionBar != null) {
- actionBar.setDisplayHomeAsUpEnabled(true);
- }
-
- mSendToVoicemailCheckbox = (CheckBox)sendToVoicemailLayout.findViewById(R.id.checkbox);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- if (!loadData()) {
- finish();
- }
-
- updateView();
- }
-
- private void updateView() {
- if (mCustomRingtone == null) {
- mRingtoneTitle.setText(getString(R.string.default_ringtone));
- } else {
- Uri ringtoneUri = Uri.parse(mCustomRingtone);
- Ringtone ringtone = RingtoneManager.getRingtone(this, ringtoneUri);
- if (ringtone == null) {
- Log.w(TAG, "ringtone's URI doesn't resolve to a Ringtone");
- return;
- }
- mRingtoneTitle.setText(ringtone.getTitle(this));
- }
-
- mSendToVoicemailCheckbox.setChecked(mSendToVoicemail);
- }
-
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.ringtone: {
- doPickRingtone();
- break;
- }
- case R.id.voicemail: {
- doToggleSendToVoicemail();
- break;
- }
- }
- }
-
- private void doPickRingtone() {
-
- 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);
- // Don't show 'Silent'
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
-
- Uri ringtoneUri;
- if (mCustomRingtone != null) {
- ringtoneUri = Uri.parse(mCustomRingtone);
- } else {
- // Otherwise pick default ringtone Uri so that something is selected.
- ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
- }
-
- // Put checkmark next to the current ringtone for this contact
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);
-
- // Launch!
- startActivityForResult(intent, RINGTONE_PICKED);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (resultCode != RESULT_OK) {
- return;
- }
-
- switch (requestCode) {
- case RINGTONE_PICKED: {
- Uri pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
- handleRingtonePicked(pickedUri);
- break;
- }
- }
- }
-
- private void handleRingtonePicked(Uri pickedUri) {
- if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) {
- mCustomRingtone = null;
- } else {
- mCustomRingtone = pickedUri.toString();
- }
- saveData();
- updateView();
- }
-
- private void doToggleSendToVoicemail() {
- mSendToVoicemailCheckbox.toggle();
- mSendToVoicemail = mSendToVoicemailCheckbox.isChecked();
- saveData();
- updateView();
- }
-
- private boolean loadData() {
- Cursor c =
- getContentResolver().query(mLookupUri, AGGREGATES_PROJECTION, null, null, null);
- try {
- if (!c.moveToFirst()) {
- return false;
- }
-
- mCustomRingtone = c.getString(COL_CUSTOM_RINGTONE);
- mSendToVoicemail = c.getInt(COL_SEND_TO_VOICEMAIL) != 0;
-
- } finally {
- c.close();
- }
- return true;
- }
-
- private void saveData() {
- ContentValues values = new ContentValues(2);
- values.put(Contacts.CUSTOM_RINGTONE, mCustomRingtone);
- values.put(Contacts.SEND_TO_VOICEMAIL, mSendToVoicemail);
- getContentResolver().update(mLookupUri, values, null, null);
- }
-
- @Override
- public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
- boolean globalSearch) {
- if (globalSearch) {
- super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
- } else {
- ContactsSearchManager.startSearch(this, initialQuery);
- }
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
-
- switch (item.getItemId()) {
- case android.R.id.home:
- Intent intent = new Intent(this, PeopleActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- finish();
- return true;
- default:
- break;
- }
- return super.onOptionsItemSelected(item);
- }
-}
-
-
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index 775009e..e2ab6b0 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -98,6 +98,12 @@
public static final String EXTRA_CONTACT_ID2 = "contactId2";
public static final String EXTRA_CONTACT_WRITABLE = "contactWritable";
+ public static final String ACTION_SET_SEND_TO_VOICEMAIL = "sendToVoicemail";
+ public static final String EXTRA_SEND_TO_VOICEMAIL_FLAG = "sendToVoicemailFlag";
+
+ public static final String ACTION_SET_RINGTONE = "setRingtone";
+ public static final String EXTRA_CUSTOM_RINGTONE = "customRingtone";
+
private static final HashSet<String> ALLOWED_DATA_COLUMNS = Sets.newHashSet(
Data.MIMETYPE,
Data.IS_PRIMARY,
@@ -185,6 +191,10 @@
deleteContact(intent);
} else if (ACTION_JOIN_CONTACTS.equals(action)) {
joinContacts(intent);
+ } else if (ACTION_SET_SEND_TO_VOICEMAIL.equals(action)) {
+ setSendToVoicemail(intent);
+ } else if (ACTION_SET_RINGTONE.equals(action)) {
+ setRingtone(intent);
}
}
@@ -382,6 +392,7 @@
* @param callbackActivity is the activity to send the callback intent to
* @param callbackAction is the intent action for the callback intent
*/
+
public static Intent createNewGroupIntent(Context context, Account account,
String label, long[] rawContactsToAdd, Class<?> callbackActivity,
String callbackAction) {
@@ -657,6 +668,57 @@
}
/**
+ * Creates an intent that can be sent to this service to set the redirect to voicemail.
+ */
+ public static Intent createSetSendToVoicemail(Context context, Uri contactUri,
+ boolean value) {
+ Intent serviceIntent = new Intent(context, ContactSaveService.class);
+ serviceIntent.setAction(ContactSaveService.ACTION_SET_SEND_TO_VOICEMAIL);
+ serviceIntent.putExtra(ContactSaveService.EXTRA_CONTACT_URI, contactUri);
+ serviceIntent.putExtra(ContactSaveService.EXTRA_SEND_TO_VOICEMAIL_FLAG, value);
+
+ return serviceIntent;
+ }
+
+ private void setSendToVoicemail(Intent intent) {
+ Uri contactUri = intent.getParcelableExtra(EXTRA_CONTACT_URI);
+ boolean value = intent.getBooleanExtra(EXTRA_SEND_TO_VOICEMAIL_FLAG, false);
+ if (contactUri == null) {
+ Log.e(TAG, "Invalid arguments for setRedirectToVoicemail");
+ return;
+ }
+
+ final ContentValues values = new ContentValues(1);
+ values.put(Contacts.SEND_TO_VOICEMAIL, value);
+ getContentResolver().update(contactUri, values, null, null);
+ }
+
+ /**
+ * Creates an intent that can be sent to this service to save the contact's ringtone.
+ */
+ public static Intent createSetRingtone(Context context, Uri contactUri,
+ String value) {
+ Intent serviceIntent = new Intent(context, ContactSaveService.class);
+ serviceIntent.setAction(ContactSaveService.ACTION_SET_RINGTONE);
+ serviceIntent.putExtra(ContactSaveService.EXTRA_CONTACT_URI, contactUri);
+ serviceIntent.putExtra(ContactSaveService.EXTRA_CUSTOM_RINGTONE, value);
+
+ return serviceIntent;
+ }
+
+ private void setRingtone(Intent intent) {
+ Uri contactUri = intent.getParcelableExtra(EXTRA_CONTACT_URI);
+ String value = intent.getStringExtra(EXTRA_CUSTOM_RINGTONE);
+ if (contactUri == null) {
+ Log.e(TAG, "Invalid arguments for setRingtone");
+ return;
+ }
+ ContentValues values = new ContentValues(1);
+ values.put(Contacts.CUSTOM_RINGTONE, value);
+ getContentResolver().update(contactUri, values, null, null);
+ }
+
+ /**
* Creates an intent that sets the selected data item as super primary (default)
*/
public static Intent createSetSuperPrimaryIntent(Context context, long dataId) {
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 579c833..0560a20 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -1244,14 +1244,18 @@
if (mActionBarAdapter.isSearchMode()) {
addContactMenu.setVisible(false);
addGroupMenu.setVisible(false);
+ contactsFilterMenu.setVisible(false);
} else {
switch (mActionBarAdapter.getCurrentTab()) {
case FAVORITES:
- // TODO: Fall through until we determine what the menu items should be for
- // this tab
+ addContactMenu.setVisible(false);
+ addGroupMenu.setVisible(false);
+ contactsFilterMenu.setVisible(false);
+ break;
case ALL:
addContactMenu.setVisible(true);
addGroupMenu.setVisible(false);
+ contactsFilterMenu.setVisible(true);
break;
case GROUPS:
// Do not display the "new group" button if no accounts are available
@@ -1261,6 +1265,7 @@
addGroupMenu.setVisible(false);
}
addContactMenu.setVisible(false);
+ contactsFilterMenu.setVisible(false);
break;
}
}
@@ -1270,9 +1275,6 @@
searchMenu.setVisible(!mActionBarAdapter.isSearchMode());
}
- if (contactsFilterMenu != null) {
- contactsFilterMenu.setVisible(!mActionBarAdapter.isSearchMode());
- }
MenuItem settings = menu.findItem(R.id.menu_settings);
if (settings != null) {
diff --git a/src/com/android/contacts/detail/ContactLoaderFragment.java b/src/com/android/contacts/detail/ContactLoaderFragment.java
index daa6012..f8cbb24 100644
--- a/src/com/android/contacts/detail/ContactLoaderFragment.java
+++ b/src/com/android/contacts/detail/ContactLoaderFragment.java
@@ -17,8 +17,9 @@
package com.android.contacts.detail;
import com.android.contacts.ContactLoader;
-import com.android.contacts.ContactOptionsActivity;
+import com.android.contacts.ContactSaveService;
import com.android.contacts.R;
+import com.android.contacts.activities.ContactDetailActivity;
import com.android.contacts.activities.ContactDetailActivity.FragmentKeyListener;
import com.android.contacts.util.PhoneCapabilityTester;
import com.android.internal.util.Objects;
@@ -28,9 +29,11 @@
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.ActivityNotFoundException;
+import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.Loader;
+import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
@@ -52,9 +55,15 @@
private static final String TAG = ContactLoaderFragment.class.getSimpleName();
+ /** The launch code when picking a ringtone */
+ private static final int REQUEST_CODE_PICK_RINGTONE = 1;
+
+
private boolean mOptionsMenuOptions;
private boolean mOptionsMenuEditable;
private boolean mOptionsMenuShareable;
+ private boolean mSendToVoicemailState;
+ private String mCustomRingtone;
/**
* This is a listener to the {@link ContactLoaderFragment} and will be notified when the
@@ -194,6 +203,8 @@
mListener.onDetailsLoaded(mContactData);
}
}
+ // Make sure the options menu is setup correctly with the loaded data.
+ getActivity().invalidateOptionsMenu();
}
@Override
@@ -222,11 +233,22 @@
mOptionsMenuOptions = isContactOptionsChangeEnabled();
mOptionsMenuEditable = isContactEditable();
mOptionsMenuShareable = isContactShareable();
+ if (mContactData != null) {
+ mSendToVoicemailState = mContactData.isSendToVoicemail();
+ mCustomRingtone = mContactData.getCustomRingtone();
+ }
- // Options only shows telephony-related settings (ringtone, send to voicemail).
- // ==> Hide if we don't have a telephone
- final MenuItem optionsMenu = menu.findItem(R.id.menu_options);
- optionsMenu.setVisible(mOptionsMenuOptions);
+ // Hide telephony-related settings (ringtone, send to voicemail)
+ // if we don't have a telephone
+ final MenuItem optionsSendToVoicemail = menu.findItem(R.id.menu_send_to_voicemail);
+ if (optionsSendToVoicemail != null) {
+ optionsSendToVoicemail.setChecked(mSendToVoicemailState);
+ optionsSendToVoicemail.setVisible(mOptionsMenuOptions);
+ }
+ final MenuItem optionsRingtone = menu.findItem(R.id.menu_set_ringtone);
+ if (optionsRingtone != null) {
+ optionsRingtone.setVisible(mOptionsMenuOptions);
+ }
final MenuItem editMenu = menu.findItem(R.id.menu_edit);
editMenu.setVisible(mOptionsMenuEditable);
@@ -262,11 +284,9 @@
if (mListener != null) mListener.onDeleteRequested(mLookupUri);
return true;
}
- case R.id.menu_options: {
+ case R.id.menu_set_ringtone: {
if (mContactData == null) return false;
- final Intent intent = new Intent(mContext, ContactOptionsActivity.class);
- intent.setData(mContactData.getLookupUri());
- mContext.startActivity(intent);
+ doPickRingtone();
return true;
}
case R.id.menu_share: {
@@ -290,6 +310,15 @@
}
return true;
}
+ case R.id.menu_send_to_voicemail: {
+ // Update state and save
+ mSendToVoicemailState = !mSendToVoicemailState;
+ item.setChecked(mSendToVoicemailState);
+ Intent intent = ContactSaveService.createSetSendToVoicemail(
+ mContext, mLookupUri, mSendToVoicemailState);
+ mContext.startService(intent);
+ return true;
+ }
}
return false;
}
@@ -304,4 +333,55 @@
}
return false;
}
+
+ private void doPickRingtone() {
+
+ 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);
+ // Don't show 'Silent'
+ intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
+
+ Uri ringtoneUri;
+ if (mCustomRingtone != null) {
+ ringtoneUri = Uri.parse(mCustomRingtone);
+ } else {
+ // Otherwise pick default ringtone Uri so that something is selected.
+ ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
+ }
+
+ // Put checkmark next to the current ringtone for this contact
+ intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);
+
+ // Launch!
+ startActivityForResult(intent, REQUEST_CODE_PICK_RINGTONE);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode != Activity.RESULT_OK) {
+ return;
+ }
+
+ switch (requestCode) {
+ case REQUEST_CODE_PICK_RINGTONE: {
+ Uri pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
+ handleRingtonePicked(pickedUri);
+ break;
+ }
+ }
+ }
+
+ private void handleRingtonePicked(Uri pickedUri) {
+ if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) {
+ mCustomRingtone = null;
+ } else {
+ mCustomRingtone = pickedUri.toString();
+ }
+ Intent intent = ContactSaveService.createSetRingtone(
+ mContext, mLookupUri, mCustomRingtone);
+ mContext.startService(intent);
+ }
}