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