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 android.app.Activity; 202eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.app.Fragment; 212eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.app.LoaderManager; 222eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.app.LoaderManager.LoaderCallbacks; 2358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.content.ActivityNotFoundException; 242eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.content.Context; 2558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.content.Intent; 262eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.content.Loader; 27683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelsonimport android.media.RingtoneManager; 282eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.net.Uri; 292eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.os.Bundle; 30410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoroimport android.provider.ContactsContract; 3158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.provider.ContactsContract.Contacts; 322eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.util.Log; 3358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.view.KeyEvent; 342eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.view.LayoutInflater; 3558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.view.Menu; 3658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.view.MenuInflater; 3758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.view.MenuItem; 382eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.view.View; 392eb969cc399d87b659a45568fa951d394c216917Katherine Kuanimport android.view.ViewGroup; 4058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.widget.Toast; 412eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 42e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.ContactSaveService; 43e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R; 44e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.activities.ContactDetailActivity.FragmentKeyListener; 45e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.ShortcutIntentBuilder; 46e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener; 47851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.Contact; 48851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.ContactLoader; 49e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.util.PhoneCapabilityTester; 50e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.internal.util.Objects; 51e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 522eb969cc399d87b659a45568fa951d394c216917Katherine Kuan/** 532eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * This is an invisible worker {@link Fragment} that loads the contact details for the contact card. 542eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * The data is then passed to the listener, who can then pass the data to other {@link View}s. 552eb969cc399d87b659a45568fa951d394c216917Katherine Kuan */ 5658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanpublic class ContactLoaderFragment extends Fragment implements FragmentKeyListener { 572eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 582eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private static final String TAG = ContactLoaderFragment.class.getSimpleName(); 592eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 60683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson /** The launch code when picking a ringtone */ 61683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson private static final int REQUEST_CODE_PICK_RINGTONE = 1; 62683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 63056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu /** This is the Intent action to install a shortcut in the launcher. */ 64056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu private static final String ACTION_INSTALL_SHORTCUT = 65056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu "com.android.launcher.action.INSTALL_SHORTCUT"; 66683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 6758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan private boolean mOptionsMenuOptions; 6858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan private boolean mOptionsMenuEditable; 6958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan private boolean mOptionsMenuShareable; 70056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu private boolean mOptionsMenuCanCreateShortcut; 71683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson private boolean mSendToVoicemailState; 72683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson private String mCustomRingtone; 7358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 742eb969cc399d87b659a45568fa951d394c216917Katherine Kuan /** 752eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * This is a listener to the {@link ContactLoaderFragment} and will be notified when the 7658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * contact details have finished loading or if the user selects any menu options. 772eb969cc399d87b659a45568fa951d394c216917Katherine Kuan */ 782eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public static interface ContactLoaderFragmentListener { 7958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan /** 8058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * Contact was not found, so somehow close this fragment. This is raised after a contact 8158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * is removed via Menu/Delete 8258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan */ 8358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public void onContactNotFound(); 8458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 8558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan /** 8658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * Contact details have finished loading. 8758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan */ 88851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu public void onDetailsLoaded(Contact result); 8958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 9058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan /** 9158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * User decided to go to Edit-Mode 9258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan */ 9358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public void onEditRequested(Uri lookupUri); 9458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 9558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan /** 9658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan * User decided to delete the contact 9758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan */ 9858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public void onDeleteRequested(Uri lookupUri); 9958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 1002eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1012eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1022eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private static final int LOADER_DETAILS = 1; 1032eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1042eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private static final String KEY_CONTACT_URI = "contactUri"; 1052eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private static final String LOADER_ARG_CONTACT_URI = "contactUri"; 1062eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1072eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private Context mContext; 1082eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private Uri mLookupUri; 1092eb969cc399d87b659a45568fa951d394c216917Katherine Kuan private ContactLoaderFragmentListener mListener; 1102eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 111851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu private Contact mContactData; 1122eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1132eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public ContactLoaderFragment() { 1142eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1152eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1162eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1172eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void onCreate(Bundle savedInstanceState) { 1182eb969cc399d87b659a45568fa951d394c216917Katherine Kuan super.onCreate(savedInstanceState); 1192eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (savedInstanceState != null) { 1202eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mLookupUri = savedInstanceState.getParcelable(KEY_CONTACT_URI); 1212eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1222eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1232eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1242eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1252eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void onSaveInstanceState(Bundle outState) { 1262eb969cc399d87b659a45568fa951d394c216917Katherine Kuan super.onSaveInstanceState(outState); 1272eb969cc399d87b659a45568fa951d394c216917Katherine Kuan outState.putParcelable(KEY_CONTACT_URI, mLookupUri); 1282eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1292eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1302eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1312eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void onAttach(Activity activity) { 1322eb969cc399d87b659a45568fa951d394c216917Katherine Kuan super.onAttach(activity); 1332eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mContext = activity; 1342eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1352eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1362eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1372eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { 13858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan setHasOptionsMenu(true); 1399c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki // This is an invisible view. This fragment is declared in a layout, so it can't be 1409c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki // "viewless". (i.e. can't return null here.) 1419c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki // See also the comment in the layout file. 1422eb969cc399d87b659a45568fa951d394c216917Katherine Kuan return inflater.inflate(R.layout.contact_detail_loader_fragment, container, false); 1432eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1442eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1452eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 1462eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void onActivityCreated(Bundle savedInstanceState) { 1472eb969cc399d87b659a45568fa951d394c216917Katherine Kuan super.onActivityCreated(savedInstanceState); 1482eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1492eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (mLookupUri != null) { 1502eb969cc399d87b659a45568fa951d394c216917Katherine Kuan Bundle args = new Bundle(); 1512eb969cc399d87b659a45568fa951d394c216917Katherine Kuan args.putParcelable(LOADER_ARG_CONTACT_URI, mLookupUri); 1522eb969cc399d87b659a45568fa951d394c216917Katherine Kuan getLoaderManager().initLoader(LOADER_DETAILS, args, mDetailLoaderListener); 1532eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1542eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1552eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1562eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void loadUri(Uri lookupUri) { 1572eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (Objects.equal(lookupUri, mLookupUri)) { 1582eb969cc399d87b659a45568fa951d394c216917Katherine Kuan // Same URI, no need to load the data again 1592eb969cc399d87b659a45568fa951d394c216917Katherine Kuan return; 1602eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1612eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1622eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mLookupUri = lookupUri; 1632eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (mLookupUri == null) { 1642eb969cc399d87b659a45568fa951d394c216917Katherine Kuan getLoaderManager().destroyLoader(LOADER_DETAILS); 1652eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mContactData = null; 1662eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (mListener != null) { 1672eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mListener.onDetailsLoaded(mContactData); 1682eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1692eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } else if (getActivity() != null) { 1702eb969cc399d87b659a45568fa951d394c216917Katherine Kuan Bundle args = new Bundle(); 1712eb969cc399d87b659a45568fa951d394c216917Katherine Kuan args.putParcelable(LOADER_ARG_CONTACT_URI, mLookupUri); 1722eb969cc399d87b659a45568fa951d394c216917Katherine Kuan getLoaderManager().restartLoader(LOADER_DETAILS, args, mDetailLoaderListener); 1732eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1742eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1752eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1762eb969cc399d87b659a45568fa951d394c216917Katherine Kuan public void setListener(ContactLoaderFragmentListener value) { 1772eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mListener = value; 1782eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1792eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1802eb969cc399d87b659a45568fa951d394c216917Katherine Kuan /** 1812eb969cc399d87b659a45568fa951d394c216917Katherine Kuan * The listener for the detail loader 1822eb969cc399d87b659a45568fa951d394c216917Katherine Kuan */ 183851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu private final LoaderManager.LoaderCallbacks<Contact> mDetailLoaderListener = 184851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu new LoaderCallbacks<Contact>() { 1852eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 186851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu public Loader<Contact> onCreateLoader(int id, Bundle args) { 1872eb969cc399d87b659a45568fa951d394c216917Katherine Kuan Uri lookupUri = args.getParcelable(LOADER_ARG_CONTACT_URI); 1883915600d2b0ff499e0129e951dfd39bff46b2f42Dave Santoro return new ContactLoader(mContext, lookupUri, true /* loadGroupMetaData */, 18945ee872fe7be69c6b3f0c59167eecd11af467812Makoto Onuki true /* loadStreamItems */, true /* load invitable account types */, 19010bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu true /* postViewNotification */, true /* computeFormattedPhoneNumber */); 1912eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1922eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 1932eb969cc399d87b659a45568fa951d394c216917Katherine Kuan @Override 194851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu public void onLoadFinished(Loader<Contact> loader, Contact data) { 195685157e0635ee33350d3dd1c6551e188d3df9f22Daniel Lehmann if (!mLookupUri.equals(data.getRequestedUri())) { 196e1cc78a9827d95afa41fb159bc93aa18fdd2c1d5Makoto Onuki Log.e(TAG, "Different URI: requested=" + mLookupUri + " actual=" + data); 1972eb969cc399d87b659a45568fa951d394c216917Katherine Kuan return; 1982eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 1992eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 2009e7b5da669fcf92a6a627fb720749e5cb627684aMakoto Onuki if (data.isError()) { 2013acaef02bdbc612ba7573f005168cec48aa42905Katherine Kuan // This shouldn't ever happen, so throw an exception. The {@link ContactLoader} 2023acaef02bdbc612ba7573f005168cec48aa42905Katherine Kuan // should log the actual exception. 2039e7b5da669fcf92a6a627fb720749e5cb627684aMakoto Onuki throw new IllegalStateException("Failed to load contact", data.getException()); 2042621c5bb7049401c8bce740005fa60bf1b304b86Makoto Onuki } else if (data.isNotFound()) { 2052eb969cc399d87b659a45568fa951d394c216917Katherine Kuan Log.i(TAG, "No contact found: " + ((ContactLoader)loader).getLookupUri()); 2062eb969cc399d87b659a45568fa951d394c216917Katherine Kuan mContactData = null; 2073acaef02bdbc612ba7573f005168cec48aa42905Katherine Kuan } else { 2083acaef02bdbc612ba7573f005168cec48aa42905Katherine Kuan mContactData = data; 2092eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 2102eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 2112eb969cc399d87b659a45568fa951d394c216917Katherine Kuan if (mListener != null) { 21258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mContactData == null) { 21358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mListener.onContactNotFound(); 21458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } else { 21558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mListener.onDetailsLoaded(mContactData); 21658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 2172eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 218683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Make sure the options menu is setup correctly with the loaded data. 21915102c1177c9cec0fce0f2d220b514fe72dcac4eDaniel Lehmann if (getActivity() != null) getActivity().invalidateOptionsMenu(); 2202eb969cc399d87b659a45568fa951d394c216917Katherine Kuan } 2212eb969cc399d87b659a45568fa951d394c216917Katherine Kuan 2224ff31284ff6bd263621771bbfa6b24e0da5af031Daniel Lehmann @Override 223851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu public void onLoaderReset(Loader<Contact> loader) {} 2242eb969cc399d87b659a45568fa951d394c216917Katherine Kuan }; 22558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 22658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan @Override 22758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) { 22858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan inflater.inflate(R.menu.view_contact, menu); 22958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 23058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 23158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean isOptionsMenuChanged() { 23258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return mOptionsMenuOptions != isContactOptionsChangeEnabled() 23358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan || mOptionsMenuEditable != isContactEditable() 234056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu || mOptionsMenuShareable != isContactShareable() 235056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu || mOptionsMenuCanCreateShortcut != isContactCanCreateShortcut(); 23658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 23758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 23858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan @Override 23958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public void onPrepareOptionsMenu(Menu menu) { 24058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mOptionsMenuOptions = isContactOptionsChangeEnabled(); 24158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mOptionsMenuEditable = isContactEditable(); 24258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mOptionsMenuShareable = isContactShareable(); 243056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu mOptionsMenuCanCreateShortcut = isContactCanCreateShortcut(); 244683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (mContactData != null) { 245683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mSendToVoicemailState = mContactData.isSendToVoicemail(); 246683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mCustomRingtone = mContactData.getCustomRingtone(); 247683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 24858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 249683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Hide telephony-related settings (ringtone, send to voicemail) 250683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // if we don't have a telephone 251683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson final MenuItem optionsSendToVoicemail = menu.findItem(R.id.menu_send_to_voicemail); 252683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (optionsSendToVoicemail != null) { 253683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson optionsSendToVoicemail.setChecked(mSendToVoicemailState); 254683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson optionsSendToVoicemail.setVisible(mOptionsMenuOptions); 255683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 256683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson final MenuItem optionsRingtone = menu.findItem(R.id.menu_set_ringtone); 257683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (optionsRingtone != null) { 258683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson optionsRingtone.setVisible(mOptionsMenuOptions); 259683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 26058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 26158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final MenuItem editMenu = menu.findItem(R.id.menu_edit); 26258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan editMenu.setVisible(mOptionsMenuEditable); 26358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 26458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final MenuItem deleteMenu = menu.findItem(R.id.menu_delete); 26558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan deleteMenu.setVisible(mOptionsMenuEditable); 26658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 26758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final MenuItem shareMenu = menu.findItem(R.id.menu_share); 26858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan shareMenu.setVisible(mOptionsMenuShareable); 269056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu 270056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu final MenuItem createContactShortcutMenu = menu.findItem(R.id.menu_create_contact_shortcut); 271056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu createContactShortcutMenu.setVisible(mOptionsMenuCanCreateShortcut); 27258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 27358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 27458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean isContactOptionsChangeEnabled() { 27558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return mContactData != null && !mContactData.isDirectoryEntry() 27658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan && PhoneCapabilityTester.isPhone(mContext); 27758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 27858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 27958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean isContactEditable() { 28058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return mContactData != null && !mContactData.isDirectoryEntry(); 28158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 28258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 28358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean isContactShareable() { 2844ff31284ff6bd263621771bbfa6b24e0da5af031Daniel Lehmann return mContactData != null && !mContactData.isDirectoryEntry(); 28558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 28658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 287056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu public boolean isContactCanCreateShortcut() { 288c4af651a470b0f92f593b77b28a828ce287c4b4aMaurice Chu return mContactData != null && !mContactData.isUserProfile() 289c4af651a470b0f92f593b77b28a828ce287c4b4aMaurice Chu && !mContactData.isDirectoryEntry(); 290056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu } 291056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu 29258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan @Override 29358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean onOptionsItemSelected(MenuItem item) { 29458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan switch (item.getItemId()) { 29558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan case R.id.menu_edit: { 29658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mListener != null) mListener.onEditRequested(mLookupUri); 29758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan break; 29858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 29958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan case R.id.menu_delete: { 30058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mListener != null) mListener.onDeleteRequested(mLookupUri); 30158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return true; 30258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 303683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson case R.id.menu_set_ringtone: { 30458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mContactData == null) return false; 305683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson doPickRingtone(); 30658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return true; 30758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 30858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan case R.id.menu_share: { 30958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mContactData == null) return false; 31058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 31158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final String lookupKey = mContactData.getLookupKey(); 312410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro Uri shareUri = Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, lookupKey); 313410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro if (mContactData.isUserProfile()) { 314410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro // User is sharing the profile. We don't want to force the receiver to have 315410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro // the highly-privileged READ_PROFILE permission, so we need to request a 316410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro // pre-authorized URI from the provider. 317410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro shareUri = getPreAuthorizedUri(shareUri); 318410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro } 31958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 32058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final Intent intent = new Intent(Intent.ACTION_SEND); 32158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan intent.setType(Contacts.CONTENT_VCARD_TYPE); 32258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan intent.putExtra(Intent.EXTRA_STREAM, shareUri); 32358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 32458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan // Launch chooser to share contact via 32558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final CharSequence chooseTitle = mContext.getText(R.string.share_via); 32658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan final Intent chooseIntent = Intent.createChooser(intent, chooseTitle); 32758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 32858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan try { 32958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan mContext.startActivity(chooseIntent); 33058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } catch (ActivityNotFoundException ex) { 33158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan Toast.makeText(mContext, R.string.share_error, Toast.LENGTH_SHORT).show(); 33258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 33358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return true; 33458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 335683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson case R.id.menu_send_to_voicemail: { 336683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Update state and save 337683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mSendToVoicemailState = !mSendToVoicemailState; 338683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson item.setChecked(mSendToVoicemailState); 339683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson Intent intent = ContactSaveService.createSetSendToVoicemail( 340683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mContext, mLookupUri, mSendToVoicemailState); 341683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mContext.startService(intent); 342683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson return true; 343683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 344056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu case R.id.menu_create_contact_shortcut: { 345056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu // Create a launcher shortcut with this contact 346056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu createLauncherShortcutWithContact(); 347056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu return true; 348056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu } 34958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 35058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return false; 35158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 35258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 353410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro /** 354056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu * Creates a launcher shortcut with the current contact. 355056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu */ 356056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu private void createLauncherShortcutWithContact() { 357056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu // Hold the parent activity of this fragment in case this fragment is destroyed 358056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu // before the callback to onShortcutIntentCreated(...) 359056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu final Activity parentActivity = getActivity(); 360056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu 361056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu ShortcutIntentBuilder builder = new ShortcutIntentBuilder(parentActivity, 362056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu new OnShortcutIntentCreatedListener() { 363056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu 364056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu @Override 365056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) { 366056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu // Broadcast the shortcutIntent to the launcher to create a 367056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu // shortcut to this contact 368056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu shortcutIntent.setAction(ACTION_INSTALL_SHORTCUT); 369056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu parentActivity.sendBroadcast(shortcutIntent); 370056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu 371056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu // Send a toast to give feedback to the user that a shortcut to this 372056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu // contact was added to the launcher. 373056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu Toast.makeText(parentActivity, 374056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu R.string.createContactShortcutSuccessful, 375056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu Toast.LENGTH_SHORT).show(); 376056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu } 377056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu 378056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu }); 379056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu builder.createContactShortcutIntent(mLookupUri); 380056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu } 381056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu 382056a8464f820acb0cdd3a7670efee3474826a06bMaurice Chu /** 383410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro * Calls into the contacts provider to get a pre-authorized version of the given URI. 384410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro */ 385410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro private Uri getPreAuthorizedUri(Uri uri) { 386410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro Bundle uriBundle = new Bundle(); 387410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro uriBundle.putParcelable(ContactsContract.Authorization.KEY_URI_TO_AUTHORIZE, uri); 388410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro Bundle authResponse = mContext.getContentResolver().call( 389410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro ContactsContract.AUTHORITY_URI, 390410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro ContactsContract.Authorization.AUTHORIZATION_METHOD, 391410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro null, 392410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro uriBundle); 393410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro if (authResponse != null) { 394410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro return (Uri) authResponse.getParcelable( 395410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro ContactsContract.Authorization.KEY_AUTHORIZED_URI); 396410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro } else { 397410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro return uri; 398410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro } 399410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro } 400410d0dcd2d4119cf1c627adc68bb58775dac461aDave Santoro 40158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan @Override 40258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan public boolean handleKeyDown(int keyCode) { 40358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan switch (keyCode) { 40458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan case KeyEvent.KEYCODE_DEL: { 40558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan if (mListener != null) mListener.onDeleteRequested(mLookupUri); 40658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return true; 40758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 40858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 40958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan return false; 41058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan } 411683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 412683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson private void doPickRingtone() { 413683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 414683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); 415683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Allow user to pick 'Default' 416683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); 417683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Show only ringtones 418683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE); 419683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Don't show 'Silent' 420683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); 421683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 422683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson Uri ringtoneUri; 423683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (mCustomRingtone != null) { 424683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson ringtoneUri = Uri.parse(mCustomRingtone); 425683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } else { 426683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Otherwise pick default ringtone Uri so that something is selected. 427683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 428683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 429683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 430683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Put checkmark next to the current ringtone for this contact 431683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri); 432683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 433683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson // Launch! 434683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson startActivityForResult(intent, REQUEST_CODE_PICK_RINGTONE); 435683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 436683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 437683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson @Override 438683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson public void onActivityResult(int requestCode, int resultCode, Intent data) { 439683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (resultCode != Activity.RESULT_OK) { 440683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson return; 441683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 442683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 443683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson switch (requestCode) { 444683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson case REQUEST_CODE_PICK_RINGTONE: { 445683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson Uri pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); 446683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson handleRingtonePicked(pickedUri); 447683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson break; 448683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 449683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 450683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 451683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson 452683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson private void handleRingtonePicked(Uri pickedUri) { 453683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) { 454683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mCustomRingtone = null; 455683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } else { 456683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mCustomRingtone = pickedUri.toString(); 457683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 458683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson Intent intent = ContactSaveService.createSetRingtone( 459683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mContext, mLookupUri, mCustomRingtone); 460683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson mContext.startService(intent); 461683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson } 4622a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann 4632a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann /** Toggles whether to load stream items. Just for debugging */ 4642a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann public void toggleLoadStreamItems() { 465851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu Loader<Contact> loaderObj = getLoaderManager().getLoader(LOADER_DETAILS); 4662a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann ContactLoader loader = (ContactLoader) loaderObj; 4672a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann loader.setLoadStreamItems(!loader.getLoadStreamItems()); 4682a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann } 4692a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann 4702a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann /** Returns whether to load stream items. Just for debugging */ 4712a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann public boolean getLoadStreamItems() { 472851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu Loader<Contact> loaderObj = getLoaderManager().getLoader(LOADER_DETAILS); 4732a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann ContactLoader loader = (ContactLoader) loaderObj; 4742a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann return loader != null && loader.getLoadStreamItems(); 4752a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann } 4762eb969cc399d87b659a45568fa951d394c216917Katherine Kuan} 477