PeopleActivity.java revision 971116e466757434f4979a61d4f58ea0deac1ea4
17aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/*
2fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
37aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project *
47aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * you may not use this file except in compliance with the License.
67aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * You may obtain a copy of the License at
77aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project *
87aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project *
107aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * See the License for the specific language governing permissions and
147aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * limitations under the License.
157aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */
167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
1727834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovpackage com.android.contacts.activities;
187aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
1979700889dad553dcde9e22a2fd23df768f68080fKatherine Kuanimport com.android.contacts.ContactLoader;
2018ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.ContactSaveService;
216f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikovimport com.android.contacts.ContactsActivity;
2227834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R;
2318ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.detail.ContactDetailFragment;
24b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.group.GroupBrowseListFragment;
25be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuanimport com.android.contacts.group.GroupBrowseListFragment.OnGroupBrowserActionListener;
26be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuanimport com.android.contacts.group.GroupDetailFragment;
279692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikovimport com.android.contacts.interactions.ContactDeletionInteraction;
28261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmannimport com.android.contacts.interactions.ImportExportDialogFragment;
29b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikovimport com.android.contacts.interactions.PhoneNumberInteraction;
30416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikovimport com.android.contacts.list.ContactBrowseListContextMenuAdapter;
3108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactBrowseListFragment;
3259fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikovimport com.android.contacts.list.ContactEntryListFragment;
33009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikovimport com.android.contacts.list.ContactListFilter;
3415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController;
35f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaroimport com.android.contacts.list.ContactTileAdapter.DisplayType;
360906ee326a5553a224eb7b004536f35b340bdcd3Dmitri Plotnikovimport com.android.contacts.list.ContactsIntentResolver;
371ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikovimport com.android.contacts.list.ContactsRequest;
388b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ContactsUnavailableFragment;
396e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikovimport com.android.contacts.list.CustomContactListFilterActivity;
40b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.list.DefaultContactBrowseListFragment;
414d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikovimport com.android.contacts.list.DirectoryListLoader;
42732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport com.android.contacts.list.OnContactBrowserActionListener;
438b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.OnContactsUnavailableActionListener;
448b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ProviderStatusLoader;
458b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ProviderStatusLoader.ProviderStatusListener;
46b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.list.StrequentContactListFragment;
47971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport com.android.contacts.model.AccountTypeManager;
48c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikovimport com.android.contacts.preference.ContactsPreferenceActivity;
498b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.util.AccountSelectionUtil;
50971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport com.android.contacts.util.AccountsListAdapter;
513391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager;
521323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikovimport com.android.contacts.widget.ContextMenuAdapter;
5357cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka
54caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikovimport android.accounts.Account;
553d48a46d6ea2d0ad43f1d6253399db45414ac9b7Dmitri Plotnikovimport android.app.ActionBar;
56b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.ActionBar.Tab;
57b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.ActionBar.TabListener;
587aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.app.Activity;
5992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikovimport android.app.Fragment;
60b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.FragmentManager;
61b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.FragmentTransaction;
6260be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmannimport android.content.ActivityNotFoundException;
637aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.content.ContentValues;
647aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.content.Intent;
65b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.content.res.TypedArray;
667aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.net.Uri;
677aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.os.Bundle;
68d7c4af2b932ffc65476fb1ac6d74feac74b48f3cDmitri Plotnikovimport android.provider.ContactsContract;
69e05296673449dc6686c4fec4dd2e98ab47a78056Jeff Hamiltonimport android.provider.ContactsContract.Contacts;
70971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.provider.ContactsContract.Intents;
718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport android.provider.ContactsContract.ProviderStatus;
729692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikovimport android.provider.Settings;
73a35a7e2aabc4edfafb9b4171e279bdb4c0c03d44Daniel Lehmannimport android.util.Log;
747aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.KeyEvent;
757aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.Menu;
76d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkeyimport android.view.MenuInflater;
777aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.MenuItem;
787aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.View;
79971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.view.View.OnClickListener;
804af3b0710ac6f08450b723a3784495469e45ba05Dmitri Plotnikovimport android.view.Window;
81971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.widget.AdapterView;
82971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.widget.AdapterView.OnItemClickListener;
83971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.widget.ListPopupWindow;
84b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.widget.SearchView;
85424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikovimport android.widget.Toast;
867aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
87caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikovimport java.util.ArrayList;
88caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
897aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/**
90bd772a5bfd907f3b14589a07378fb26dfd924d93Daniel Lehmann * Displays a list to browse contacts. For xlarge screens, this also displays a detail-pane on
91a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov * the right.
927aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */
939856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuanpublic class PeopleActivity extends ContactsActivity
94fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        implements View.OnCreateContextMenuListener, ActionBarAdapter.Listener,
956e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        DialogManager.DialogShowingViewActivity,
968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        ContactListFilterController.ContactListFilterListener, ProviderStatusListener {
9757d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov
985e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro    private static final String TAG = "PeopleActivity";
997aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
10022fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann    private static final int SUBACTIVITY_NEW_CONTACT = 2;
101c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann    private static final int SUBACTIVITY_EDIT_CONTACT = 3;
102c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    private static final int SUBACTIVITY_NEW_GROUP = 4;
103c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    private static final int SUBACTIVITY_EDIT_GROUP = 5;
104c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 6;
105c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
106f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro    private static final int FAVORITES_COLUMN_COUNT = 4;
1073c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
10815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private static final String KEY_SEARCH_MODE = "searchMode";
10915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov
1103b7d5949bfa524534e5d1aa29b8eaff8733ae00cDaniel Lehmann    private DialogManager mDialogManager = new DialogManager(this);
1113391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann
112ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov    private ContactsIntentResolver mIntentResolver;
113fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ContactsRequest mRequest;
114caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov
115fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ActionBarAdapter mActionBarAdapter;
1167c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov
11715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private boolean mSearchMode;
118fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov
119fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ContactBrowseListFragment mListFragment;
1200dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro
1210dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro    /**
122be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan     * Whether we have a right-side contact or group detail pane for displaying info on that
123be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan     * contact or group while browsing. Generally means "this is a tablet".
1240dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro     */
125be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private boolean mContentPaneDisplayed;
1260dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro
127be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private ContactDetailFragment mContactDetailFragment;
128c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    private final ContactDetailFragmentListener mContactDetailFragmentListener =
129be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            new ContactDetailFragmentListener();
130c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    private final GroupDetailFragmentListener mGroupDetailFragmentListener =
131c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            new GroupDetailFragmentListener();
132be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
133be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private GroupDetailFragment mGroupDetailFragment;
134424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
135ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    private StrequentContactListFragment.Listener mFavoritesFragmentListener =
136ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            new StrequentContactListFragmentListener();
137ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
138fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private boolean mSearchInitiated;
139e1d4c0617ede33b4b0cdb1137aca971b3dacc747Dmitri Plotnikov
14015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private ContactListFilterController mContactListFilterController;
1413c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
1428b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private ContactsUnavailableFragment mContactsUnavailableFragment;
1438b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private ProviderStatusLoader mProviderStatusLoader;
1448b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private int mProviderStatus = -1;
1458b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1460cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    private boolean mOptionsMenuContactsAvailable;
1470cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
148b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private DefaultContactBrowseListFragment mContactsFragment;
149b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private StrequentContactListFragment mFavoritesFragment;
150f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro    private StrequentContactListFragment mFrequentFragment;
151b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private GroupBrowseListFragment mGroupsFragment;
152b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
153f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro    private View mFavoritesView;
154f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro    private View mBrowserView;
155f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro    private View mDetailsView;
156f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
157971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan    private View mAddGroupImageView;
158971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
1598268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    private enum TabState {
1608268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        FAVORITES, CONTACTS, GROUPS
1618268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    }
1628268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
1638268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    private TabState mSelectedTab;
1648268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
1659856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan    public PeopleActivity() {
1661540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov        mIntentResolver = new ContactsIntentResolver(this);
167b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // TODO: Get rid of the ContactListFilterController class because there aren't any
168b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // dropdown filters anymore. Just store the selected filter as a member variable.
16915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mContactListFilterController = new ContactListFilterController(this);
1706e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        mContactListFilterController.addListener(this);
1718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatusLoader = new ProviderStatusLoader(this);
1726178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov    }
1736178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
1748b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean areContactsAvailable() {
1758b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        return mProviderStatus == ProviderStatus.STATUS_NORMAL;
1768b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
1778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1787aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
17992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    public void onAttachFragment(Fragment fragment) {
18092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        if (fragment instanceof ContactBrowseListFragment) {
18192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov            mListFragment = (ContactBrowseListFragment)fragment;
18292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov            mListFragment.setOnContactListActionListener(new ContactBrowserActionListener());
183a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov            if (!getWindow().hasFeature(Window.FEATURE_ACTION_BAR)) {
184fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                mListFragment.setContextMenuAdapter(
185fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                        new ContactBrowseListContextMenuAdapter(mListFragment));
1868daa1797310aca2333efcff0a0e0b0ed03187fffDmitri Plotnikov            }
187be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        } else if (fragment instanceof GroupBrowseListFragment) {
188be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            mGroupsFragment = (GroupBrowseListFragment) fragment;
189be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            mGroupsFragment.setListener(new GroupBrowserActionListener());
190d364314c460152db7089b304beec81b3675893baDmitri Plotnikov        } else if (fragment instanceof ContactDetailFragment) {
191be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            mContactDetailFragment = (ContactDetailFragment) fragment;
192be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            mContactDetailFragment.setListener(mContactDetailFragmentListener);
193be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            mContentPaneDisplayed = true;
1948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        } else if (fragment instanceof ContactsUnavailableFragment) {
1958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment;
1968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment.setProviderStatusLoader(mProviderStatusLoader);
1978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
1988b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new ContactsUnavailableFragmentListener());
199be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        } else if (fragment instanceof GroupDetailFragment) {
200be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            mGroupDetailFragment = (GroupDetailFragment) fragment;
201c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            mGroupDetailFragment.setListener(mGroupDetailFragmentListener);
202be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            mContentPaneDisplayed = true;
203ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        } else if (fragment instanceof StrequentContactListFragment) {
204ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            mFavoritesFragment = (StrequentContactListFragment) fragment;
205ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            mFavoritesFragment.setListener(mFavoritesFragmentListener);
206f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro            mFavoritesFragment.setColumnCount(FAVORITES_COLUMN_COUNT);
207f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro            mFavoritesFragment.setDisplayType(DisplayType.STARRED_ONLY);
20892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
20992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
21092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
21192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    @Override
21208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onCreate(Bundle savedState) {
21308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onCreate(savedState);
2147aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
215fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        configureContentView(true, savedState);
216fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
217fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
218fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
219fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    protected void onNewIntent(Intent intent) {
220fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        setIntent(intent);
221fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        configureContentView(false, null);
222fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
223fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
224fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    private void configureContentView(boolean createContentView, Bundle savedState) {
2251ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // Extract relevant information from the intent
2261ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        mRequest = mIntentResolver.resolveIntent(getIntent());
2271ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (!mRequest.isValid()) {
2286178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            setResult(RESULT_CANCELED);
2297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            finish();
2301ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            return;
2316178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov        }
2326178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
2331ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        Intent redirect = mRequest.getRedirectIntent();
2341ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (redirect != null) {
2351ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            // Need to start a different activity
2366178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            startActivity(redirect);
2377aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            finish();
2381ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            return;
2397aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
2407aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
241fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (createContentView) {
2429856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            setContentView(R.layout.people_activity);
243b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
244f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro            mFavoritesView = findViewById(R.id.favorites_view);
245f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro            mDetailsView = findViewById(R.id.details_view);
246f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro            mBrowserView = findViewById(R.id.browse_view);
247f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
248b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            final FragmentManager fragmentManager = getFragmentManager();
249b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mFavoritesFragment = (StrequentContactListFragment) fragmentManager
250b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    .findFragmentById(R.id.favorites_fragment);
251f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro            mFrequentFragment = (StrequentContactListFragment) fragmentManager
252f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                    .findFragmentById(R.id.frequent_fragment);
253b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mContactsFragment = (DefaultContactBrowseListFragment) fragmentManager
254b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    .findFragmentById(R.id.contacts_fragment);
255b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mGroupsFragment = (GroupBrowseListFragment) fragmentManager
256b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    .findFragmentById(R.id.groups_fragment);
257b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            // Hide all tabs (the current tab will later be reshown once a tab is selected)
258b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            final FragmentTransaction transaction = fragmentManager.beginTransaction();
259b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            transaction.hide(mContactsFragment);
260b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            transaction.hide(mGroupsFragment);
261f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
262f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro            if (mFrequentFragment != null) {
263f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                mFrequentFragment.setDisplayType(DisplayType.FREQUENT_ONLY);
264f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro            }
265be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            if (mContactDetailFragment != null) {
266be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                transaction.hide(mContactDetailFragment);
267be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            }
268be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            if (mGroupDetailFragment != null) {
269be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                transaction.hide(mGroupDetailFragment);
270be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            }
271b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            transaction.commit();
272fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
27365ad5eedb8f44f11e1d29cce141eddd88c0941b3Dmitri Plotnikov
27490715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov        if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT
275be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                && !mContentPaneDisplayed) {
27690715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            redirect = new Intent(this, ContactDetailActivity.class);
27790715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            redirect.setAction(Intent.ACTION_VIEW);
27890715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            redirect.setData(mRequest.getContactUri());
27990715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            startActivity(redirect);
28090715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            finish();
28190715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            return;
28227b97bca14c84b3f830c7a433e14ae5c180a32c3Dmitri Plotnikov        }
28327b97bca14c84b3f830c7a433e14ae5c180a32c3Dmitri Plotnikov
28490715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov        setTitle(mRequest.getActivityTitle());
285b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        ActionBar actionBar = getActionBar();
2861ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan        mActionBarAdapter = new ActionBarAdapter(this, this);
2871ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan        mActionBarAdapter.onCreate(savedState, mRequest, getActionBar(), !mContentPaneDisplayed);
288b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        mActionBarAdapter.setContactListFilterController(mContactListFilterController);
289fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
2903bf12640a267146a6a0134367f7236401db8e754Daniel Lehmann        if (createContentView) {
291b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.removeAllTabs();
292b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            Tab favoritesTab = actionBar.newTab();
293b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            favoritesTab.setText(getString(R.string.strequentList));
294be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment,
295f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                    mFrequentFragment, TabState.FAVORITES));
296b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.addTab(favoritesTab);
2973d48a46d6ea2d0ad43f1d6253399db45414ac9b7Dmitri Plotnikov
298b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            Tab peopleTab = actionBar.newTab();
299b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            peopleTab.setText(getString(R.string.people));
300be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            peopleTab.setTabListener(new TabChangeListener(mContactsFragment,
3018268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    mContactDetailFragment, TabState.CONTACTS));
302b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.addTab(peopleTab);
303b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
304b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            Tab groupsTab = actionBar.newTab();
305b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            groupsTab.setText(getString(R.string.contactsGroupsLabel));
306be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            groupsTab.setTabListener(new TabChangeListener(mGroupsFragment,
3078268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    mGroupDetailFragment, TabState.GROUPS));
308b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.addTab(groupsTab);
309b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.setDisplayShowTitleEnabled(true);
310b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
311b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            TypedArray a = obtainStyledAttributes(null, R.styleable.ActionBarHomeIcon);
312b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            boolean showHomeIcon = a.getBoolean(R.styleable.ActionBarHomeIcon_show_home_icon, true);
313b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.setDisplayShowHomeEnabled(showHomeIcon);
314b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
3158268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            invalidateOptionsMenuIfNeeded();
316d364314c460152db7089b304beec81b3675893baDmitri Plotnikov        }
31708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
318fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        configureFragments(savedState == null);
3193c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov    }
3203c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
321b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    /**
322b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan     * Tab change listener that is instantiated once for each tab. Handles showing/hiding fragments.
323b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan     * TODO: Use ViewPager so that tabs can be swiped left and right. Figure out how to use the
324b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan     * support library in our app.
325b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan     */
326b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private class TabChangeListener implements TabListener {
327be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        private final Fragment mBrowseListFragment;
328be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
329be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        /**
330be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan         * Right pane fragment that is present on larger screen sizes (can be
331be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan         * null for smaller screen sizes).
332be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan         */
333be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        private final Fragment mDetailFragment;
3348268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        private final TabState mTabState;
335b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
3368268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        public TabChangeListener(Fragment listFragment, Fragment detailFragment, TabState state) {
337be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            mBrowseListFragment = listFragment;
338be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            mDetailFragment = detailFragment;
3398268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            mTabState = state;
340b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
341b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
342b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        @Override
343b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
344be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            ft.hide(mBrowseListFragment);
345be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            if (mDetailFragment != null) {
346be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                ft.hide(mDetailFragment);
347be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            }
348b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
349b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
350b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        @Override
351b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        public void onTabSelected(Tab tab, FragmentTransaction ft) {
352be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            ft.show(mBrowseListFragment);
353be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            if (mDetailFragment != null) {
354be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                ft.show(mDetailFragment);
355be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            }
3568268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            setSelectedTab(mTabState);
3578268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            invalidateOptionsMenu();
358b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
359b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
360b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        @Override
361b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        public void onTabReselected(Tab tab, FragmentTransaction ft) {
362b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
363b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    }
364b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
3658268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    private void setSelectedTab(TabState tab) {
3668268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        mSelectedTab = tab;
367f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
368aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro        if (mContentPaneDisplayed) {
369f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro            switch (mSelectedTab) {
370f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                case FAVORITES:
371f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                    mFavoritesView.setVisibility(View.VISIBLE);
372f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                    mBrowserView.setVisibility(View.GONE);
373f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                    mDetailsView.setVisibility(View.GONE);
374f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                    break;
375f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                case GROUPS:
376f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                case CONTACTS:
377f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                    mFavoritesView.setVisibility(View.GONE);
378f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                    mBrowserView.setVisibility(View.VISIBLE);
379f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                    mDetailsView.setVisibility(View.VISIBLE);
380f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                    break;
381f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro            }
382f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro        }
3838268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    }
3848268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
3856e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
386174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onPause() {
387174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        if (mActionBarAdapter != null) {
388174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov            mActionBarAdapter.setListener(null);
389174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        }
390fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
391fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mOptionsMenuContactsAvailable = false;
392fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
393fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mProviderStatus = -1;
3948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatusLoader.setProviderStatusListener(null);
395174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onPause();
396174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
397174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
398174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
399174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onResume() {
400174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onResume();
401174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        if (mActionBarAdapter != null) {
402174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov            mActionBarAdapter.setListener(this);
403174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        }
4048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatusLoader.setProviderStatusListener(this);
4058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        updateFragmentVisibility();
406174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
407174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
408174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
4096e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    protected void onStart() {
410e4e52199057ffb57bad42caa33e6b402fd80697aDmitri Plotnikov        mContactListFilterController.onStart();
4116e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        super.onStart();
412caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov    }
413caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
414955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov    private void configureFragments(boolean fromRequest) {
415009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov        if (fromRequest) {
41691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            ContactListFilter filter = null;
41791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            int actionCode = mRequest.getActionCode();
41891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            switch (actionCode) {
41991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_ALL_CONTACTS:
420be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
421be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                            ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
42291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
42391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
424be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
42591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                            ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
42691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
42791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
42891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                // TODO: handle FREQUENT and STREQUENT according to the spec
42991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_FREQUENT:
43091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STREQUENT:
43191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    // For now they are treated the same as STARRED
43291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STARRED:
433be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
434be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                            ContactListFilter.FILTER_TYPE_STARRED);
43591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
43691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            }
43791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
4380edd4071ddcb23bf2a7b95582df0657de9ff0c60Dmitri Plotnikov            mSearchMode = mRequest.isSearchMode();
43991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            if (filter != null) {
44091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                mContactListFilterController.setContactListFilter(filter, false);
441fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                mSearchMode = false;
44248cc25047d2c61828e9137c50b3496feada7a175Dmitri Plotnikov            } else if (mRequest.getActionCode() == ContactsRequest.ACTION_ALL_CONTACTS) {
443be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                mContactListFilterController.setContactListFilter(
444be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                        ContactListFilter.createFilterWithType(
44548cc25047d2c61828e9137c50b3496feada7a175Dmitri Plotnikov                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS), false);
446009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov            }
447d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
448d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            if (mRequest.getContactUri() != null) {
449fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                mSearchMode = false;
450d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
451d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
452fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mListFragment.setContactsRequest(mRequest);
4530ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan            configureContactListFragmentForRequest();
454a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov
455b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        } else {
456a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov            mSearchMode = mActionBarAdapter.isSearchMode();
457fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
458fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
4590ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        configureContactListFragment();
4600ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        configureGroupListFragment();
461fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
4628268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
4636e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
4646e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
4656e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
466d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void onContactListFiltersLoaded() {
4678daa1797310aca2333efcff0a0e0b0ed03187fffDmitri Plotnikov        if (mListFragment == null || !mListFragment.isAdded()) {
468955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov            return;
469955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov        }
470955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov
471d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mListFragment.setFilter(mContactListFilterController.getFilter());
472bc5bc44eb0e6f86a093929885547fe37efe60a54Dmitri Plotnikov
4738268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
474174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
475174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
476d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    @Override
477d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void onContactListFilterChanged() {
4788daa1797310aca2333efcff0a0e0b0ed03187fffDmitri Plotnikov        if (mListFragment == null || !mListFragment.isAdded()) {
479d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov            return;
480d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov        }
481d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov
482d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mListFragment.setFilter(mContactListFilterController.getFilter());
483e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
4848268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
4853ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov    }
4863ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov
4876e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
4886e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    public void onContactListFilterCustomizationRequest() {
4896e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        startActivityForResult(new Intent(this, CustomContactListFilterActivity.class),
4906e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                SUBACTIVITY_CUSTOMIZE_FILTER);
4916e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
4926e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
493a6c2198bc5ad37119500c4857125ad732548c402Dmitri Plotnikov    private void setupContactDetailFragment(final Uri contactLookupUri) {
494be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        mContactDetailFragment.loadUri(contactLookupUri);
4958268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
496be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    }
497be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
498be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private void setupGroupDetailFragment(Uri groupUri) {
499be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        mGroupDetailFragment.loadGroup(groupUri);
5008268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
501c0ca13a86793082c8969e44c70d4dc8fb83eb1f8Dmitri Plotnikov    }
502c0ca13a86793082c8969e44c70d4dc8fb83eb1f8Dmitri Plotnikov
503fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    /**
504fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     * Handler for action bar actions.
505fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     */
506fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    @Override
507b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    public void onAction(Action action) {
508b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        switch (action) {
509b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case START_SEARCH_MODE:
510aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro                // Checking if multi fragments are being displayed
511aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro                if (mContentPaneDisplayed) {
512aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro                    mFavoritesView.setVisibility(View.GONE);
513aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro                    mBrowserView.setVisibility(View.VISIBLE);
514aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro                    mDetailsView.setVisibility(View.VISIBLE);
515aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro                }
5168268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                // Bring the contact list fragment (and detail fragment if applicable) to the front
517b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                FragmentTransaction ft = getFragmentManager().beginTransaction();
518b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                ft.show(mContactsFragment);
5198268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                if (mContactDetailFragment != null) ft.show(mContactDetailFragment);
520b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                ft.commit();
5218268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                clearSearch();
522b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
523b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case STOP_SEARCH_MODE:
5248268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                // Refresh the fragments because search mode was using them to display search
5258268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                // results.
5268268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                clearSearch();
5278268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
5288268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                // If the last selected tab was not the "All contacts" tab, then hide these
5298268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                // fragments because we need to show favorites or groups.
5308268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                if (mSelectedTab != null && !mSelectedTab.equals(TabState.CONTACTS)) {
5318268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    FragmentTransaction transaction = getFragmentManager().beginTransaction();
5328268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    transaction.hide(mContactsFragment);
5338268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    if (mContactDetailFragment != null) transaction.hide(mContactDetailFragment);
5348268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    transaction.commit();
5358268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                }
536f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro                if (mSelectedTab != null) setSelectedTab(mSelectedTab);
5378268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                break;
538b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case CHANGE_SEARCH_QUERY:
5398268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                loadSearch(mActionBarAdapter.getQueryString());
540b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
541b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            default:
542b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action);
543b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
544fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    }
545fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov
5468268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    private void clearSearch() {
5478268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        loadSearch("");
5488268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    }
5498268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
5508268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    private void loadSearch(String query) {
5518268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        configureFragments(false /* from request */);
5528268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        mListFragment.setQueryString(query, true);
5538268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    }
5548268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
5550ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragmentForRequest() {
556fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        Uri contactUri = mRequest.getContactUri();
557fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (contactUri != null) {
558fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mListFragment.setSelectedContactUri(contactUri);
559fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
560238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
5610edd4071ddcb23bf2a7b95582df0657de9ff0c60Dmitri Plotnikov        mListFragment.setSearchMode(mRequest.isSearchMode());
5625251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov        mListFragment.setQueryString(mRequest.getQueryString(), false);
563238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
564fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mRequest.isDirectorySearchEnabled()) {
565fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
566fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        } else {
567fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
568fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
569238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
570fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mContactListFilterController.isLoaded()) {
571fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mListFragment.setFilter(mContactListFilterController.getFilter());
5721ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
57308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
57408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
5750ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragment() {
576fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mListFragment.setSearchMode(mSearchMode);
577fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
578fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mListFragment.setVisibleScrollbarEnabled(!mSearchMode);
579fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mListFragment.setVerticalScrollbarPosition(
580be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                mContentPaneDisplayed
5815245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov                        ? View.SCROLLBAR_POSITION_LEFT
5825245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov                        : View.SCROLLBAR_POSITION_RIGHT);
583be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        mListFragment.setSelectionVisible(mContentPaneDisplayed);
584be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        mListFragment.setQuickContactEnabled(!mContentPaneDisplayed);
5851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
5861323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
5870ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureGroupListFragment() {
5880ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        mGroupsFragment.setVerticalScrollbarPosition(
5890ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan                mContentPaneDisplayed
5900ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan                        ? View.SCROLLBAR_POSITION_LEFT
5910ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan                        : View.SCROLLBAR_POSITION_RIGHT);
5920ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        mGroupsFragment.setSelectionVisible(mContentPaneDisplayed);
5930ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    }
5940ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan
5958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
5968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public void onProviderStatusChange() {
5978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        updateFragmentVisibility();
5988b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
5998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private void updateFragmentVisibility() {
6018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        int providerStatus = mProviderStatusLoader.getProviderStatus();
6028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (providerStatus == mProviderStatus) {
6038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return;
6048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
6058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6068b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatus = providerStatus;
6078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view);
6098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View mainView = findViewById(R.id.main_view);
6108b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (mProviderStatus == ProviderStatus.STATUS_NORMAL) {
612c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.GONE);
613b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mainView != null) {
614b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mainView.setVisibility(View.VISIBLE);
615b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
6168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mListFragment != null) {
6178b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mListFragment.setEnabled(true);
6188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
6198b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        } else {
6208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mListFragment != null) {
6218b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mListFragment.setEnabled(false);
6228b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
6238b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mContactsUnavailableFragment == null) {
6248b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment = new ContactsUnavailableFragment();
6258b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.setProviderStatusLoader(mProviderStatusLoader);
6268b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
6278b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        new ContactsUnavailableFragmentListener());
6283ed426c842a68895a759548fef87bac359f937bbDianne Hackborn                getFragmentManager().beginTransaction()
6298b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
6308b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        .commit();
6318b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            } else {
6328b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.update();
6338b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
6348b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.VISIBLE);
635b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mainView != null) {
636b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mainView.setVisibility(View.INVISIBLE);
637b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
6388b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
6398b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6408268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
6418b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
6428b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6431ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
644d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
645e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
646d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onSelectionChange() {
647be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            if (mContentPaneDisplayed) {
648d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                setupContactDetailFragment(mListFragment.getSelectedContactUri());
649d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
650d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
651e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov
652d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        @Override
653d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onViewContactAction(Uri contactLookupUri) {
654be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            if (mContentPaneDisplayed) {
655d364314c460152db7089b304beec81b3675893baDmitri Plotnikov                setupContactDetailFragment(contactLookupUri);
656424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov            } else {
657424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov                startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
658424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov            }
6591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
660e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
661e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
6621ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onCreateNewContactAction() {
6631ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
6641ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            Bundle extras = getIntent().getExtras();
6651ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            if (extras != null) {
6661ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov                intent.putExtras(extras);
667416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov            }
6681ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            startActivity(intent);
6691ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
670416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
671e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
6721ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onEditContactAction(Uri contactLookupUri) {
673e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
674e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            Bundle extras = getIntent().getExtras();
675e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            if (extras != null) {
676e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann                intent.putExtras(extras);
6771ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            }
678e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT);
6791ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
680413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov
681e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
6821ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onAddToFavoritesAction(Uri contactUri) {
6831ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            ContentValues values = new ContentValues(1);
6841ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            values.put(Contacts.STARRED, 1);
6851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            getContentResolver().update(contactUri, values, null, null);
6861ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
6878a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
688e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
6891ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onRemoveFromFavoritesAction(Uri contactUri) {
6901ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            ContentValues values = new ContentValues(1);
6911ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            values.put(Contacts.STARRED, 0);
6921ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            getContentResolver().update(contactUri, values, null, null);
6931ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
694416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
695e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
6961ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onCallContactAction(Uri contactUri) {
697b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa            PhoneNumberInteraction.startInteractionForPhoneCall(PeopleActivity.this, contactUri);
6981ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
699416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
700e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
7011ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onSmsContactAction(Uri contactUri) {
702b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa            PhoneNumberInteraction.startInteractionForTextMessage(PeopleActivity.this, contactUri);
7031ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
704e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
705e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
7061ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onDeleteContactAction(Uri contactUri) {
7079856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
7081ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
7098a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
710e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
7111ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onFinishAction() {
7121ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            onBackPressed();
7131ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
7146e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
7156e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        @Override
7166e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        public void onInvalidSelection() {
7178fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            ContactListFilter filter;
7188fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            ContactListFilter currentFilter = mListFragment.getFilter();
7198fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            if (currentFilter != null
7208fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                    && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
721be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                filter = ContactListFilter.createFilterWithType(
722be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
7238fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                mListFragment.setFilter(filter);
7248fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            } else {
725be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                filter = ContactListFilter.createFilterWithType(
726be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                        ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
7278fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                mListFragment.setFilter(filter, false);
7288fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            }
729d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mContactListFilterController.setContactListFilter(filter, true);
7306e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        }
7311ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
732416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
733be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private class ContactDetailFragmentListener implements ContactDetailFragment.Listener {
73469e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
735424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onContactNotFound() {
736d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            // Nothing needs to be done here
737424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
738424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
73969e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
740424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onEditRequested(Uri contactLookupUri) {
7418c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov            startActivityForResult(
7428c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov                    new Intent(Intent.ACTION_EDIT, contactLookupUri), SUBACTIVITY_EDIT_CONTACT);
743424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
744424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
74569e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
746424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onItemClicked(Intent intent) {
74760be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            try {
74860be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann                startActivity(intent);
74960be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            } catch (ActivityNotFoundException e) {
75060be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann                Log.e(TAG, "No activity found for intent: " + intent);
75160be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            }
752424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
753424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
75469e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
75566bca8f360c9e21b6a47006f21db7b46b6b46340Dmitri Plotnikov        public void onDeleteRequested(Uri contactUri) {
7569856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
757424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
758caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
759caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov        @Override
760caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov        public void onCreateRawContactRequested(ArrayList<ContentValues> values, Account account) {
7619856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            Toast.makeText(PeopleActivity.this, R.string.toast_making_personal_copy,
762caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov                    Toast.LENGTH_LONG).show();
763caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov            Intent serviceIntent = ContactSaveService.createNewRawContactIntent(
7649856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan                    PeopleActivity.this, values, account,
7659856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan                    PeopleActivity.class, Intent.ACTION_VIEW);
766caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov            startService(serviceIntent);
767caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov        }
768424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov    }
769424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
7708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private class ContactsUnavailableFragmentListener
7718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            implements OnContactsUnavailableActionListener {
7728b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
7738b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
7748b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onCreateNewContactAction() {
7758b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
7768b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
7778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
7788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
7798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onAddAccountAction() {
7808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT);
7811fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
7828b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            intent.putExtra(Settings.EXTRA_AUTHORITIES,
7838b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new String[] { ContactsContract.AUTHORITY });
7848b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(intent);
7858b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
7868b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
7878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
7888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onImportContactsFromFileAction() {
7899856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            AccountSelectionUtil.doImportFromSdCard(PeopleActivity.this, null);
7908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
7918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
7928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
7938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onFreeInternalStorageAction() {
7948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS));
7958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
7968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
7978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
798ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    private final class StrequentContactListFragmentListener
799ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            implements StrequentContactListFragment.Listener {
800ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        @Override
801ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        public void onContactSelected(Uri contactUri) {
802ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            if (mContentPaneDisplayed) {
803ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa                setupContactDetailFragment(contactUri);
804ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            } else {
805ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa                startActivity(new Intent(Intent.ACTION_VIEW, contactUri));
806ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            }
807ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        }
808ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    }
809ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
810be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private final class GroupBrowserActionListener implements OnGroupBrowserActionListener {
811be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
812be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        @Override
813be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        public void onViewGroupAction(Uri groupUri) {
814be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            if (mContentPaneDisplayed) {
815be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                setupGroupDetailFragment(groupUri);
816be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            } else {
817be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                Intent intent = new Intent(PeopleActivity.this, GroupDetailActivity.class);
818be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                intent.setData(groupUri);
819be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                startActivity(intent);
820be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            }
821be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        }
822be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    }
823be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
824c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    private class GroupDetailFragmentListener implements GroupDetailFragment.Listener {
825c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        @Override
826c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        public void onGroupSizeUpdated(String size) {
827c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // Nothing needs to be done here because the size will be displayed in the detail
828c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // fragment
829c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        }
830c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
831c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        @Override
832c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        public void onGroupTitleUpdated(String title) {
833c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // Nothing needs to be done here because the title will be displayed in the detail
834c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // fragment
835c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        }
836c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
837c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        @Override
838c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        public void onEditRequested(Uri groupUri) {
839c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // TODO: Send off an intent with the groups URI, so we don't need to specify
840c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // the editor activity class. Then it would be declared as:
841c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // new Intent(Intent.ACTION_EDIT, groupUri), SUBACTIVITY_EDIT_GROUP);
842c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            final Intent intent = new Intent(PeopleActivity.this, GroupEditorActivity.class);
843c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            intent.setData(groupUri);
844c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            intent.setAction(Intent.ACTION_EDIT);
845c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            startActivityForResult(intent, SUBACTIVITY_EDIT_GROUP);
846c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        }
847c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    }
848c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
849732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    public void startActivityAndForwardResult(final Intent intent) {
850732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
851732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
852732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        // Forward extras to the new activity
853732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        Bundle extras = getIntent().getExtras();
854732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        if (extras != null) {
855732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov            intent.putExtras(extras);
856732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        }
857732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        startActivity(intent);
858732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        finish();
859732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
860732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
8617aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
8628b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean onCreatePanelMenu(int featureId, Menu menu) {
8638b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        // No menu if contacts are unavailable
8648b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (!areContactsAvailable()) {
8658b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
8668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
8678b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8688b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        return super.onCreatePanelMenu(featureId, menu);
8698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
8708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
8728b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean onPreparePanel(int featureId, View view, Menu menu) {
8738b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        // No menu if contacts are unavailable
8748b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (!areContactsAvailable()) {
8758b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
8768b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
8778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        return super.onPreparePanel(featureId, view, menu);
8798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
8808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8818b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
8827aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
8838b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (!areContactsAvailable()) {
8848b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
8858b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
886d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        super.onCreateOptionsMenu(menu);
887d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey
888d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        MenuInflater inflater = getMenuInflater();
889b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        inflater.inflate(R.menu.actions, menu);
890b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
891b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        if (searchMenuItem != null && searchMenuItem.getActionView() instanceof SearchView) {
892b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            SearchView searchView = (SearchView) searchMenuItem.getActionView();
893b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            searchView.setQueryHint(getString(R.string.hint_findContacts));
894b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            searchView.setIconifiedByDefault(false);
895b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
896b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mActionBarAdapter != null) {
897b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mActionBarAdapter.setSearchView(searchView);
898b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
8997aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
900971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
901971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        // On narrow screens we specify a NEW group button in the {@link ActionBar}, so that
902971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        // it can be in the overflow menu. On wide screens, we use a custom view because we need
903971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        // its location for anchoring the account-selector popup.
904971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        final MenuItem addGroup = menu.findItem(R.id.menu_custom_add_group);
905971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        if (addGroup != null) {
906971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            mAddGroupImageView = getLayoutInflater().inflate(
907971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                    R.layout.add_group_menu_item, null, false);
908971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            View item = mAddGroupImageView.findViewById(R.id.menu_item);
909971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            item.setOnClickListener(new OnClickListener() {
910971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                @Override
911971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                public void onClick(View v) {
912971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                    createNewGroupWithAccountDisambiguation();
913971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                }
914971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            });
915971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            addGroup.setActionView(mAddGroupImageView);
916971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        }
917b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        return true;
918d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    }
9197aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
9208268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    private void invalidateOptionsMenuIfNeeded() {
9210cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (isOptionsMenuChanged()) {
9228268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            invalidateOptionsMenu();
9230cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
9240cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
9250cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
9260cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    public boolean isOptionsMenuChanged() {
9270cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (mOptionsMenuContactsAvailable != areContactsAvailable()) {
9280cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
9290cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
9300cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
9318268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        if (mListFragment != null && mListFragment.isOptionsMenuChanged()) {
9320cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
9330cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
9340cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
9358268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        if (mContactDetailFragment != null && mContactDetailFragment.isOptionsMenuChanged()) {
9360cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
9370cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
9380cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
9398268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        if (mGroupDetailFragment != null && mGroupDetailFragment.isOptionsMenuChanged()) {
9400cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
9410cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
9420cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
9430cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        return false;
9440cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
9450cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
9460cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    @Override
947d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    public boolean onPrepareOptionsMenu(Menu menu) {
9480cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        mOptionsMenuContactsAvailable = areContactsAvailable();
9490cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (!mOptionsMenuContactsAvailable) {
9508b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
9518b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
9528b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
9531ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan        final MenuItem searchMenu = menu.findItem(R.id.menu_search);
954971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        final MenuItem addContactMenu = menu.findItem(R.id.menu_add_contact);
955971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        MenuItem addGroupMenu = menu.findItem(R.id.menu_add_group);
956971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        if (addGroupMenu == null) {
957971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            addGroupMenu = menu.findItem(R.id.menu_custom_add_group);
958971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        }
959e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
9608268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        if (mActionBarAdapter.isSearchMode()) {
9618268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            addContactMenu.setVisible(false);
9628268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            addGroupMenu.setVisible(false);
9631ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan            // If search is normally in the overflow menu, when we are in search
9641ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan            // mode, hide this option.
9651ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan            if (mActionBarAdapter.isSearchInOverflowMenu()) {
9661ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan                searchMenu.setVisible(false);
9671ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan            }
9688268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        } else {
9698268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            switch (mSelectedTab) {
9708268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                case FAVORITES:
9718268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    // TODO: Fall through until we determine what the menu items should be for
9728268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    // this tab
9738268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                case CONTACTS:
9748268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    addContactMenu.setVisible(true);
9758268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    addGroupMenu.setVisible(false);
9768268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    break;
9778268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                case GROUPS:
9788268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    addContactMenu.setVisible(false);
9798268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    addGroupMenu.setVisible(true);
9808268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    break;
9818268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            }
982e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        }
983e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
9848268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        MenuItem settings = menu.findItem(R.id.menu_settings);
9858268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        if (settings != null) {
9868268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            settings.setVisible(!ContactsPreferenceActivity.isEmpty(this));
987e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        }
988e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
989d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        return true;
9907aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
9917aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
9927aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
9937aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
9947aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (item.getItemId()) {
995c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov            case R.id.menu_settings: {
996c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov                final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
997c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann                startActivity(intent);
9987aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
999d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
1000b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case R.id.menu_contacts_filter: {
1001b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                final Intent intent = new Intent(this, CustomContactListFilterActivity.class);
1002b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
1003b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                return true;
1004b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
1005d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_search: {
10068e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov                onSearchRequested();
10077aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1008d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
10098268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            case R.id.menu_add_contact: {
1010d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
101122fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann                startActivityForResult(intent, SUBACTIVITY_NEW_CONTACT);
1012d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1013d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
10148268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            case R.id.menu_add_group: {
1015971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                createNewGroupWithAccountDisambiguation();
10168268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                return true;
10178268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            }
101849d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey            case R.id.menu_import_export: {
1019261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmann                ImportExportDialogFragment.show(getFragmentManager());
1020d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1021d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
1022d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_accounts: {
1023d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
1024fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov                intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
1025d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                    ContactsContract.AUTHORITY
1026d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                });
10271fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
1028d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                startActivity(intent);
1029d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1030d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
10317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
10327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return false;
10337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
10347aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
1035971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan    private void createNewGroupWithAccountDisambiguation() {
1036971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        final ArrayList<Account> accounts =
1037971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                AccountTypeManager.getInstance(this).getAccounts(true);
1038971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        if (accounts.size() <= 1 || mAddGroupImageView == null) {
1039971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            // No account to choose or no control to anchor the popup-menu to
1040971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            // ==> just go straight to the editor which will disambig if necessary
1041971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            final Intent intent = new Intent(this, GroupEditorActivity.class);
1042971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            intent.setAction(Intent.ACTION_INSERT);
1043971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            startActivityForResult(intent, SUBACTIVITY_NEW_GROUP);
1044971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            return;
1045971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        }
1046971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
1047971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        final ListPopupWindow popup = new ListPopupWindow(this, null);
1048971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.setWidth(getResources().getDimensionPixelSize(R.dimen.account_selector_popup_width));
1049971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.setAnchorView(mAddGroupImageView);
1050971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        // Create a list adapter with all writeable accounts (assume that the writeable accounts all
1051971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        // allow group creation).
1052971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        final AccountsListAdapter adapter = new AccountsListAdapter(this, true);
1053971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.setAdapter(adapter);
1054971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.setOnItemClickListener(new OnItemClickListener() {
1055971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            @Override
1056971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
1057971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                popup.dismiss();
1058971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                final Intent intent = new Intent(PeopleActivity.this, GroupEditorActivity.class);
1059971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                intent.setAction(Intent.ACTION_INSERT);
1060971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                intent.putExtra(Intents.Insert.ACCOUNT, adapter.getItem(position));
1061971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                startActivityForResult(intent, SUBACTIVITY_NEW_GROUP);
1062971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            }
1063971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        });
1064971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.setModal(true);
1065971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.show();
1066971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan    }
1067971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
10688e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov    @Override
10698e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov    public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
10708e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov            boolean globalSearch) {
1071691e93397eae9a29d979a5e404f0b90130c2e9d4Dmitri Plotnikov        if (mListFragment != null && mListFragment.isAdded() && !globalSearch) {
1072d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov            mListFragment.startSearch(initialQuery);
1073691e93397eae9a29d979a5e404f0b90130c2e9d4Dmitri Plotnikov        } else {
1074691e93397eae9a29d979a5e404f0b90130c2e9d4Dmitri Plotnikov            super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
1075db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov        }
1076db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov    }
1077db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
107849d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey    @Override
1079d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
1080d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        switch (requestCode) {
10816e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov            case SUBACTIVITY_CUSTOMIZE_FILTER: {
10826e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                if (resultCode == Activity.RESULT_OK) {
10836e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                    mContactListFilterController.selectCustomFilter();
10846e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                }
10856e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                break;
10866e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov            }
10878c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov
1088d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            case SUBACTIVITY_EDIT_CONTACT:
108922fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann            case SUBACTIVITY_NEW_CONTACT: {
1090be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                if (resultCode == RESULT_OK && mContentPaneDisplayed) {
10916e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                    mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
1092a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov                    mListFragment.reloadDataAndSetSelectedUri(data.getData());
109322fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann                }
109422fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann                break;
109522fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann            }
1096d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
1097c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            case SUBACTIVITY_NEW_GROUP:
1098c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            case SUBACTIVITY_EDIT_GROUP: {
1099c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                if (resultCode == RESULT_OK && mContentPaneDisplayed) {
1100c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                    mRequest.setActionCode(ContactsRequest.ACTION_GROUP);
1101c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                    mGroupsFragment.setSelectedUri(data.getData());
1102c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                }
1103c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                break;
1104c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            }
1105c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
11067aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
11077aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // anymore
1108e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
1109d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                if (resultCode == RESULT_OK) {
1110e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov                    mListFragment.onPickerResult(data);
1111d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                }
1112d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
1113d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code
1114d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov//                else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
11151ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // Finish the activity if the sub activity was canceled as back key is used
11161ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
11171ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    finish();
11181ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
11191ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
1120d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        }
1121d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    }
11227aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
11237aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
11247aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
1125502741df555dc7cf59a10885272d432940ae35adDmitri Plotnikov        ContextMenuAdapter menuAdapter = mListFragment.getContextMenuAdapter();
1126502741df555dc7cf59a10885272d432940ae35adDmitri Plotnikov        if (menuAdapter != null) {
1127502741df555dc7cf59a10885272d432940ae35adDmitri Plotnikov            return menuAdapter.onContextItemSelected(item);
11287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
11297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
11307aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return super.onContextItemSelected(item);
11317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
11327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
11337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
11347aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
11351ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
11367aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (keyCode) {
11371ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            case KeyEvent.KEYCODE_CALL: {
11381ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                if (callSelection()) {
11391ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    return true;
11401ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
11411ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
11421ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            }
1143db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
11447aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            case KeyEvent.KEYCODE_DEL: {
11456c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov                if (deleteSelection()) {
11467aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                    return true;
11477aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                }
11487aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                break;
11497aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            }
11507bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            default: {
11517bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                // Bring up the search UI if the user starts typing
11527bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                final int unicodeChar = event.getUnicodeChar();
11534f3aa85131e16594fef22ca60439f4320016767fDaniel Lehmann                if (unicodeChar != 0 && !Character.isWhitespace(unicodeChar)) {
11547bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    String query = new String(new int[]{ unicodeChar }, 0, 1);
1155b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    if (!mActionBarAdapter.isSearchMode()) {
1156b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        mActionBarAdapter.setQueryString(query);
1157b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        mActionBarAdapter.setSearchMode(true);
1158b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        return true;
11597bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    } else if (!mRequest.isSearchMode()) {
11607bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                        if (!mSearchInitiated) {
11617bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                            mSearchInitiated = true;
11627bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                            startSearch(query, false, null, false);
11637bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                            return true;
11647bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                        }
11657bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    }
11667bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                }
11677bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            }
11687aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
11697aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
11707aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return super.onKeyDown(keyCode, event);
11717aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
1172ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov
1173ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    @Override
1174ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    public void onBackPressed() {
1175ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        if (mSearchMode && mActionBarAdapter != null) {
1176ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            mActionBarAdapter.setSearchMode(false);
1177ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        } else {
1178ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            super.onBackPressed();
1179ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        }
1180ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    }
11817aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
11826c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov    private boolean deleteSelection() {
11831ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
11841ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//        if (mActionCode == ContactsRequest.ACTION_DEFAULT) {
11851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            final int position = mListView.getSelectedItemPosition();
11861ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            if (position != ListView.INVALID_POSITION) {
11871ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                Uri contactUri = getContactUri(position);
11881ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                if (contactUri != null) {
11891ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    doContactDelete(contactUri);
11901ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    return true;
11911ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
11921ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            }
11931ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//        }
11946c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov        return false;
11956c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov    }
11966c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov
119708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
119808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onSaveInstanceState(Bundle outState) {
119908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onSaveInstanceState(outState);
120015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        outState.putBoolean(KEY_SEARCH_MODE, mSearchMode);
1201fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        if (mActionBarAdapter != null) {
1202fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            mActionBarAdapter.onSaveInstanceState(outState);
120308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
120408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
120508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
1206fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
1207fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    protected void onRestoreInstanceState(Bundle inState) {
1208fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        super.onRestoreInstanceState(inState);
1209fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mSearchMode = inState.getBoolean(KEY_SEARCH_MODE);
1210fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mActionBarAdapter != null) {
1211fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mActionBarAdapter.onRestoreInstanceState(inState);
1212fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
1213fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
1214fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
12153391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    @Override
12163391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    public DialogManager getDialogManager() {
12173391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann        return mDialogManager;
12183391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    }
1219ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
1220ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    // Visible for testing
1221ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    public ContactBrowseListFragment getListFragment() {
1222ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov        return mListFragment;
1223ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    }
1224ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
1225ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    // Visible for testing
1226ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    public ContactDetailFragment getDetailFragment() {
1227be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        return mContactDetailFragment;
1228ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    }
12297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project}
1230