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