ContactLoaderFragment.java revision 685157e0635ee33350d3dd1c6551e188d3df9f22
12eb969cc399d87b659a45568fa951d394c216917Katherine Kuan/* 22eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * Copyright (C) 2011 The Android Open Source Project 32eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * 42eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * Licensed under the Apache License, Version 2.0 (the "License"); 52eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * you may not use this file except in compliance with the License. 62eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * You may obtain a copy of the License at 72eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * 82eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * http://www.apache.org/licenses/LICENSE-2.0 92eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * 102eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * Unless required by applicable law or agreed to in writing, software 112eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * distributed under the License is distributed on an "AS IS" BASIS, 122eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * See the License for the specific language governing permissions and 142eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * limitations under the License 152eb969cc399d87b659a45568fa951d394c216917Katherine Kuan */ 162eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 172eb969cc399d87b659a45568fa951d394c216917Katherine Kuanpackage com.android.contacts.detail; 182eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 192eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport com.android.contacts.ContactLoader; 20683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelsonimport com.android.contacts.ContactSaveService; 212eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport com.android.contacts.R; 2258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.activities.ContactDetailActivity.FragmentKeyListener; 2358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.util.PhoneCapabilityTester; 242eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport com.android.internal.util.Objects; 252eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 262eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.app.Activity; 272eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.app.Fragment; 282eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.app.LoaderManager; 292eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.app.LoaderManager.LoaderCallbacks; 3058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.content.ActivityNotFoundException; 312eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.content.Context; 3258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.content.Intent; 332eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.content.Loader; 34683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelsonimport android.media.RingtoneManager; 352eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.net.Uri; 362eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.os.Bundle; 3758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.provider.ContactsContract.Contacts; 382eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.util.Log; 3958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.view.KeyEvent; 402eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.view.LayoutInflater; 4158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.view.Menu; 4258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.view.MenuInflater; 4358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.view.MenuItem; 442eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.view.View; 452eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.view.ViewGroup; 4658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.widget.Toast; 472eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 482eb969cc399d87b659a45568fa951d394c216917Katherine Kuan/** 492eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * This is an invisible worker {@link Fragment} that loads the contact details for the contact card. 502eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * The data is then passed to the listener, who can then pass the data to other {@link View}s. 512eb969cc399d87b659a45568fa951d394c216917Katherine Kuan */ 5258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanpublic class ContactLoaderFragment extends Fragment implements FragmentKeyListener { 532eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 542eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private static final String TAG = ContactLoaderFragment.class.getSimpleName(); 552eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 56683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson /** The launch code when picking a ringtone */ 57683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson private static final int REQUEST_CODE_PICK_RINGTONE = 1; 58683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 59683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 6058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan private boolean mOptionsMenuOptions; 6158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan private boolean mOptionsMenuEditable; 6258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan private boolean mOptionsMenuShareable; 63683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson private boolean mSendToVoicemailState; 64683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson private String mCustomRingtone; 6558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 662eb969cc399d87b659a45568fa951d394c216917Katherine Kuan /** 672eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * This is a listener to the {@link ContactLoaderFragment} and will be notified when the 6858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * contact details have finished loading or if the user selects any menu options. 692eb969cc399d87b659a45568fa951d394c216917Katherine Kuan */ 702eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public static interface ContactLoaderFragmentListener { 7158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan /** 7258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * Contact was not found, so somehow close this fragment. This is raised after a contact 7358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * is removed via Menu/Delete 7458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan */ 7558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public void onContactNotFound(); 7658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 7758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan /** 7858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * Contact details have finished loading. 7958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan */ 802eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void onDetailsLoaded(ContactLoader.Result result); 8158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 8258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan /** 8358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * User decided to go to Edit-Mode 8458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan */ 8558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public void onEditRequested(Uri lookupUri); 8658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 8758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan /** 8858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * User decided to delete the contact 8958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan */ 9058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public void onDeleteRequested(Uri lookupUri); 9158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 922eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 932eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 942eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private static final int LOADER_DETAILS = 1; 952eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 962eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private static final String KEY_CONTACT_URI = "contactUri"; 972eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private static final String LOADER_ARG_CONTACT_URI = "contactUri"; 982eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 992eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private Context mContext; 1002eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private Uri mLookupUri; 1012eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private ContactLoaderFragmentListener mListener; 1022eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1032eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private ContactLoader.Result mContactData; 1042eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1052eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public ContactLoaderFragment() { 1062eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1072eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1082eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1092eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void onCreate(Bundle savedInstanceState) { 1102eb969cc399d87b659a45568fa951d394c216917Katherine Kuan super.onCreate(savedInstanceState); 1112eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (savedInstanceState != null) { 1122eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mLookupUri = savedInstanceState.getParcelable(KEY_CONTACT_URI); 1132eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1142eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1152eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1162eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1172eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void onSaveInstanceState(Bundle outState) { 1182eb969cc399d87b659a45568fa951d394c216917Katherine Kuan super.onSaveInstanceState(outState); 1192eb969cc399d87b659a45568fa951d394c216917Katherine Kuan outState.putParcelable(KEY_CONTACT_URI, mLookupUri); 1202eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1212eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1222eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1232eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void onAttach(Activity activity) { 1242eb969cc399d87b659a45568fa951d394c216917Katherine Kuan super.onAttach(activity); 1252eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mContext = activity; 1262eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1272eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1282eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1292eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { 13058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan setHasOptionsMenu(true); 1319c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki // This is an invisible view. This fragment is declared in a layout, so it can't be 1329c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki // "viewless". (i.e. can't return null here.) 1339c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki // See also the comment in the layout file. 1342eb969cc399d87b659a45568fa951d394c216917Katherine Kuan return inflater.inflate(R.layout.contact_detail_loader_fragment, container, false); 1352eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1362eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1372eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1382eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void onActivityCreated(Bundle savedInstanceState) { 1392eb969cc399d87b659a45568fa951d394c216917Katherine Kuan super.onActivityCreated(savedInstanceState); 1402eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1412eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (mLookupUri != null) { 1422eb969cc399d87b659a45568fa951d394c216917Katherine Kuan Bundle args = new Bundle(); 1432eb969cc399d87b659a45568fa951d394c216917Katherine Kuan args.putParcelable(LOADER_ARG_CONTACT_URI, mLookupUri); 1442eb969cc399d87b659a45568fa951d394c216917Katherine Kuan getLoaderManager().initLoader(LOADER_DETAILS, args, mDetailLoaderListener); 1452eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1462eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1472eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1482eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void loadUri(Uri lookupUri) { 1492eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (Objects.equal(lookupUri, mLookupUri)) { 1502eb969cc399d87b659a45568fa951d394c216917Katherine Kuan // Same URI, no need to load the data again 1512eb969cc399d87b659a45568fa951d394c216917Katherine Kuan return; 1522eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1532eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1542eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mLookupUri = lookupUri; 1552eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (mLookupUri == null) { 1562eb969cc399d87b659a45568fa951d394c216917Katherine Kuan getLoaderManager().destroyLoader(LOADER_DETAILS); 1572eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mContactData = null; 1582eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (mListener != null) { 1592eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mListener.onDetailsLoaded(mContactData); 1602eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1612eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } else if (getActivity() != null) { 1622eb969cc399d87b659a45568fa951d394c216917Katherine Kuan Bundle args = new Bundle(); 1632eb969cc399d87b659a45568fa951d394c216917Katherine Kuan args.putParcelable(LOADER_ARG_CONTACT_URI, mLookupUri); 1642eb969cc399d87b659a45568fa951d394c216917Katherine Kuan getLoaderManager().restartLoader(LOADER_DETAILS, args, mDetailLoaderListener); 1652eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1662eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1672eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1682eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void setListener(ContactLoaderFragmentListener value) { 1692eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mListener = value; 1702eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1712eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1722eb969cc399d87b659a45568fa951d394c216917Katherine Kuan /** 1732eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * The listener for the detail loader 1742eb969cc399d87b659a45568fa951d394c216917Katherine Kuan */ 1752eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private final LoaderManager.LoaderCallbacks<ContactLoader.Result> mDetailLoaderListener = 1762eb969cc399d87b659a45568fa951d394c216917Katherine Kuan new LoaderCallbacks<ContactLoader.Result>() { 1772eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1782eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public Loader<ContactLoader.Result> onCreateLoader(int id, Bundle args) { 1792eb969cc399d87b659a45568fa951d394c216917Katherine Kuan Uri lookupUri = args.getParcelable(LOADER_ARG_CONTACT_URI); 1803915600d2b0ff499e0129e951dfd39bff46b2f42Dave Santoro return new ContactLoader(mContext, lookupUri, true /* loadGroupMetaData */, 1813e6991e5ee91ea2cc82a02bd3ea4ed7e941b08afMakoto Onuki true /* loadStreamItems */, true /* load invitable account types */); 1822eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1832eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1842eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1852eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void onLoadFinished(Loader<ContactLoader.Result> loader, ContactLoader.Result data) { 186685157e0635ee33350d3dd1c6551e188d3df9f22Daniel Lehmann if (!mLookupUri.equals(data.getRequestedUri())) { 1872eb969cc399d87b659a45568fa951d394c216917Katherine Kuan return; 1882eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1892eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1909e7b5da669fcf92a6a627fb720749e5cb627684aMakoto Onuki if (data.isError()) { 1913acaef02bdbc612ba7573f005168cec48aa42905Katherine Kuan // This shouldn't ever happen, so throw an exception. The {@link ContactLoader} 1923acaef02bdbc612ba7573f005168cec48aa42905Katherine Kuan // should log the actual exception. 1939e7b5da669fcf92a6a627fb720749e5cb627684aMakoto Onuki throw new IllegalStateException("Failed to load contact", data.getException()); 1943acaef02bdbc612ba7573f005168cec48aa42905Katherine Kuan } else if (data == ContactLoader.Result.NOT_FOUND) { 1952eb969cc399d87b659a45568fa951d394c216917Katherine Kuan Log.i(TAG, "No contact found: " + ((ContactLoader)loader).getLookupUri()); 1962eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mContactData = null; 1973acaef02bdbc612ba7573f005168cec48aa42905Katherine Kuan } else { 1983acaef02bdbc612ba7573f005168cec48aa42905Katherine Kuan mContactData = data; 1992eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 2002eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 2012eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (mListener != null) { 20258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mContactData == null) { 20358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mListener.onContactNotFound(); 20458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } else { 20558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mListener.onDetailsLoaded(mContactData); 20658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 2072eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 208683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Make sure the options menu is setup correctly with the loaded data. 209683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson getActivity().invalidateOptionsMenu(); 2102eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 2112eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 2124ff31284ff6bd263621771bbfa6b24e0da5af031Daniel Lehmann @Override 213fab516143c60565b9cc0d18fbe0af33902764546Katherine Kuan public void onLoaderReset(Loader<ContactLoader.Result> loader) {} 2142eb969cc399d87b659a45568fa951d394c216917Katherine Kuan }; 21558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 21658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan @Override 21758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) { 21858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan inflater.inflate(R.menu.view_contact, menu); 21958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 22058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 22158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean isOptionsMenuChanged() { 22258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return mOptionsMenuOptions != isContactOptionsChangeEnabled() 22358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan || mOptionsMenuEditable != isContactEditable() 22458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan || mOptionsMenuShareable != isContactShareable(); 22558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 22658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 22758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan @Override 22858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public void onPrepareOptionsMenu(Menu menu) { 22958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mOptionsMenuOptions = isContactOptionsChangeEnabled(); 23058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mOptionsMenuEditable = isContactEditable(); 23158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mOptionsMenuShareable = isContactShareable(); 232683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (mContactData != null) { 233683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mSendToVoicemailState = mContactData.isSendToVoicemail(); 234683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mCustomRingtone = mContactData.getCustomRingtone(); 235683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 23658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 237683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Hide telephony-related settings (ringtone, send to voicemail) 238683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // if we don't have a telephone 239683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson final MenuItem optionsSendToVoicemail = menu.findItem(R.id.menu_send_to_voicemail); 240683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (optionsSendToVoicemail != null) { 241683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson optionsSendToVoicemail.setChecked(mSendToVoicemailState); 242683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson optionsSendToVoicemail.setVisible(mOptionsMenuOptions); 243683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 244683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson final MenuItem optionsRingtone = menu.findItem(R.id.menu_set_ringtone); 245683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (optionsRingtone != null) { 246683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson optionsRingtone.setVisible(mOptionsMenuOptions); 247683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 24858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 24958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final MenuItem editMenu = menu.findItem(R.id.menu_edit); 25058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan editMenu.setVisible(mOptionsMenuEditable); 25158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 25258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final MenuItem deleteMenu = menu.findItem(R.id.menu_delete); 25358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan deleteMenu.setVisible(mOptionsMenuEditable); 25458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 25558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final MenuItem shareMenu = menu.findItem(R.id.menu_share); 25658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan shareMenu.setVisible(mOptionsMenuShareable); 25758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 25858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 25958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean isContactOptionsChangeEnabled() { 26058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return mContactData != null && !mContactData.isDirectoryEntry() 26158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan && PhoneCapabilityTester.isPhone(mContext); 26258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 26358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 26458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean isContactEditable() { 26558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return mContactData != null && !mContactData.isDirectoryEntry(); 26658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 26758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 26858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean isContactShareable() { 2694ff31284ff6bd263621771bbfa6b24e0da5af031Daniel Lehmann return mContactData != null && !mContactData.isDirectoryEntry(); 27058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 27158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 27258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan @Override 27358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean onOptionsItemSelected(MenuItem item) { 27458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan switch (item.getItemId()) { 27558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan case R.id.menu_edit: { 27658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mListener != null) mListener.onEditRequested(mLookupUri); 27758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan break; 27858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 27958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan case R.id.menu_delete: { 28058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mListener != null) mListener.onDeleteRequested(mLookupUri); 28158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return true; 28258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 283683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson case R.id.menu_set_ringtone: { 28458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mContactData == null) return false; 285683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson doPickRingtone(); 28658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return true; 28758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 28858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan case R.id.menu_share: { 28958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mContactData == null) return false; 29058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 29158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final String lookupKey = mContactData.getLookupKey(); 29258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final Uri shareUri = Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, lookupKey); 29358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 29458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final Intent intent = new Intent(Intent.ACTION_SEND); 29558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan intent.setType(Contacts.CONTENT_VCARD_TYPE); 29658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan intent.putExtra(Intent.EXTRA_STREAM, shareUri); 29758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 29858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan // Launch chooser to share contact via 29958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final CharSequence chooseTitle = mContext.getText(R.string.share_via); 30058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final Intent chooseIntent = Intent.createChooser(intent, chooseTitle); 30158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 30258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan try { 30358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mContext.startActivity(chooseIntent); 30458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } catch (ActivityNotFoundException ex) { 30558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan Toast.makeText(mContext, R.string.share_error, Toast.LENGTH_SHORT).show(); 30658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 30758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return true; 30858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 309683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson case R.id.menu_send_to_voicemail: { 310683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Update state and save 311683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mSendToVoicemailState = !mSendToVoicemailState; 312683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson item.setChecked(mSendToVoicemailState); 313683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson Intent intent = ContactSaveService.createSetSendToVoicemail( 314683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mContext, mLookupUri, mSendToVoicemailState); 315683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mContext.startService(intent); 316683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson return true; 317683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 31858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 31958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return false; 32058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 32158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 32258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan @Override 32358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean handleKeyDown(int keyCode) { 32458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan switch (keyCode) { 32558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan case KeyEvent.KEYCODE_DEL: { 32658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mListener != null) mListener.onDeleteRequested(mLookupUri); 32758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return true; 32858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 32958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 33058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return false; 33158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 332683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 333683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson private void doPickRingtone() { 334683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 335683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); 336683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Allow user to pick 'Default' 337683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); 338683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Show only ringtones 339683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE); 340683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Don't show 'Silent' 341683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); 342683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 343683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson Uri ringtoneUri; 344683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (mCustomRingtone != null) { 345683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson ringtoneUri = Uri.parse(mCustomRingtone); 346683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } else { 347683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Otherwise pick default ringtone Uri so that something is selected. 348683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 349683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 350683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 351683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Put checkmark next to the current ringtone for this contact 352683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri); 353683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 354683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Launch! 355683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson startActivityForResult(intent, REQUEST_CODE_PICK_RINGTONE); 356683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 357683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 358683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson @Override 359683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson public void onActivityResult(int requestCode, int resultCode, Intent data) { 360683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (resultCode != Activity.RESULT_OK) { 361683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson return; 362683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 363683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 364683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson switch (requestCode) { 365683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson case REQUEST_CODE_PICK_RINGTONE: { 366683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson Uri pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); 367683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson handleRingtonePicked(pickedUri); 368683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson break; 369683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 370683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 371683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 372683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 373683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson private void handleRingtonePicked(Uri pickedUri) { 374683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) { 375683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mCustomRingtone = null; 376683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } else { 377683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mCustomRingtone = pickedUri.toString(); 378683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 379683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson Intent intent = ContactSaveService.createSetRingtone( 380683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mContext, mLookupUri, mCustomRingtone); 381683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mContext.startService(intent); 382683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 3832eb969cc399d87b659a45568fa951d394c216917Katherine Kuan} 384