PeopleActivity.java revision b5760b94bbf56ce348876ec36f4669d20a1530f5
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
1918ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.ContactSaveService;
206f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikovimport com.android.contacts.ContactsActivity;
2127834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R;
22b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.calllog.CallLogFragment;
2318ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.detail.ContactDetailFragment;
24b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.dialpad.DialpadFragment;
25b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.group.GroupBrowseListFragment;
269692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikovimport com.android.contacts.interactions.ContactDeletionInteraction;
27e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikovimport com.android.contacts.interactions.GroupDeletionDialogFragment;
28e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikovimport com.android.contacts.interactions.GroupRenamingDialogFragment;
29261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmannimport com.android.contacts.interactions.ImportExportDialogFragment;
30b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikovimport com.android.contacts.interactions.PhoneNumberInteraction;
31416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikovimport com.android.contacts.list.ContactBrowseListContextMenuAdapter;
3208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactBrowseListFragment;
3359fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikovimport com.android.contacts.list.ContactEntryListFragment;
34009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikovimport com.android.contacts.list.ContactListFilter;
3515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController;
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;
47a07fa5f37031e4c5cd2933de02d2db41ec153e2bDmitri Plotnikovimport com.android.contacts.model.AccountTypeManager;
48c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikovimport com.android.contacts.preference.ContactsPreferenceActivity;
498b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.util.AccountSelectionUtil;
503391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager;
511323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikovimport com.android.contacts.widget.ContextMenuAdapter;
5257cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka
53caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikovimport android.accounts.Account;
543d48a46d6ea2d0ad43f1d6253399db45414ac9b7Dmitri Plotnikovimport android.app.ActionBar;
55b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.ActionBar.Tab;
56b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.ActionBar.TabListener;
577aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.app.Activity;
5849d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkeyimport android.app.Dialog;
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;
702013058703aa110a1d7aac87ef408c96a3919472Daniel Lehmannimport 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;
792013058703aa110a1d7aac87ef408c96a3919472Daniel Lehmannimport android.view.View.OnClickListener;
804af3b0710ac6f08450b723a3784495469e45ba05Dmitri Plotnikovimport android.view.Window;
81b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.widget.SearchView;
82424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikovimport android.widget.Toast;
837aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
84caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikovimport java.util.ArrayList;
85caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
867aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/**
87bd772a5bfd907f3b14589a07378fb26dfd924d93Daniel Lehmann * Displays a list to browse contacts. For xlarge screens, this also displays a detail-pane on
88a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov * the right.
897aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */
909856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuanpublic class PeopleActivity extends ContactsActivity
91fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        implements View.OnCreateContextMenuListener, ActionBarAdapter.Listener,
926e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        DialogManager.DialogShowingViewActivity,
938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        ContactListFilterController.ContactListFilterListener, ProviderStatusListener {
9457d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov
95bd772a5bfd907f3b14589a07378fb26dfd924d93Daniel Lehmann    private static final String TAG = "ContactBrowserActivity";
967aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
9722fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann    private static final int SUBACTIVITY_NEW_CONTACT = 2;
98c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann    private static final int SUBACTIVITY_EDIT_CONTACT = 3;
99c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 4;
1003c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
10115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private static final String KEY_SEARCH_MODE = "searchMode";
10215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov
1033b7d5949bfa524534e5d1aa29b8eaff8733ae00cDaniel Lehmann    private DialogManager mDialogManager = new DialogManager(this);
1043391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann
105ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov    private ContactsIntentResolver mIntentResolver;
106fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ContactsRequest mRequest;
107caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov
108fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ActionBarAdapter mActionBarAdapter;
1097c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov
11015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private boolean mSearchMode;
111fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov
112fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ContactBrowseListFragment mListFragment;
1130dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro
1140dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro    /**
1150dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro     * Whether we have a right-side contact pane for displaying contact info while browsing.
1160dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro     * Generally means "this is a tablet".
1170dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro     */
118fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private boolean mContactContentDisplayed;
1190dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro
120424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov    private ContactDetailFragment mDetailFragment;
121424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov    private DetailFragmentListener mDetailFragmentListener = new DetailFragmentListener();
122424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
123fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private PhoneNumberInteraction mPhoneNumberCallInteraction;
124fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private PhoneNumberInteraction mSendTextMessageInteraction;
1254af3b0710ac6f08450b723a3784495469e45ba05Dmitri Plotnikov
126fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private boolean mSearchInitiated;
127e1d4c0617ede33b4b0cdb1137aca971b3dacc747Dmitri Plotnikov
12815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private ContactListFilterController mContactListFilterController;
1293c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
1303d48a46d6ea2d0ad43f1d6253399db45414ac9b7Dmitri Plotnikov    private View mAddContactImageView;
1312013058703aa110a1d7aac87ef408c96a3919472Daniel Lehmann
1328b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private ContactsUnavailableFragment mContactsUnavailableFragment;
1338b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private ProviderStatusLoader mProviderStatusLoader;
1348b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private int mProviderStatus = -1;
1358b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1360cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    private boolean mOptionsMenuContactsAvailable;
1370cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    private boolean mOptionsMenuGroupActionsEnabled;
1380cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
139b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private DefaultContactBrowseListFragment mContactsFragment;
140b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private StrequentContactListFragment mFavoritesFragment;
141b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private GroupBrowseListFragment mGroupsFragment;
142b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
1439856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan    public PeopleActivity() {
1441540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov        mIntentResolver = new ContactsIntentResolver(this);
145b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // TODO: Get rid of the ContactListFilterController class because there aren't any
146b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // dropdown filters anymore. Just store the selected filter as a member variable.
14715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mContactListFilterController = new ContactListFilterController(this);
1486e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        mContactListFilterController.addListener(this);
1498b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatusLoader = new ProviderStatusLoader(this);
1506178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov    }
1516178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
1528b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean areContactsAvailable() {
1538b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        return mProviderStatus == ProviderStatus.STATUS_NORMAL;
1548b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
1558b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1567aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
15792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    public void onAttachFragment(Fragment fragment) {
15892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        if (fragment instanceof ContactBrowseListFragment) {
15992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov            mListFragment = (ContactBrowseListFragment)fragment;
16092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov            mListFragment.setOnContactListActionListener(new ContactBrowserActionListener());
161a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov            if (!getWindow().hasFeature(Window.FEATURE_ACTION_BAR)) {
162fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                mListFragment.setContextMenuAdapter(
163fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                        new ContactBrowseListContextMenuAdapter(mListFragment));
1648daa1797310aca2333efcff0a0e0b0ed03187fffDmitri Plotnikov            }
165d364314c460152db7089b304beec81b3675893baDmitri Plotnikov        } else if (fragment instanceof ContactDetailFragment) {
166d364314c460152db7089b304beec81b3675893baDmitri Plotnikov            mDetailFragment = (ContactDetailFragment)fragment;
167d364314c460152db7089b304beec81b3675893baDmitri Plotnikov            mDetailFragment.setListener(mDetailFragmentListener);
168a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov            mContactContentDisplayed = true;
1698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        } else if (fragment instanceof ContactsUnavailableFragment) {
1708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment;
1718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment.setProviderStatusLoader(mProviderStatusLoader);
1728b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
1738b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new ContactsUnavailableFragmentListener());
17492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
17592a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
17692a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
17792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    @Override
17808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onCreate(Bundle savedState) {
17908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onCreate(savedState);
1807aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
181fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mAddContactImageView = getLayoutInflater().inflate(
182fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                R.layout.add_contact_menu_item, null, false);
183fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        View item = mAddContactImageView.findViewById(R.id.menu_item);
184fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        item.setOnClickListener(new OnClickListener() {
185fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            @Override
186fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            public void onClick(View v) {
18751e8d634f2d16aeaed73b6fba42d02a1c2d48b20Daniel Lehmann                final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
18851e8d634f2d16aeaed73b6fba42d02a1c2d48b20Daniel Lehmann                startActivityForResult(intent, SUBACTIVITY_NEW_CONTACT);
189fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            }
190fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        });
19192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
192fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        configureContentView(true, savedState);
193fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
194fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
195fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
196fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    protected void onNewIntent(Intent intent) {
197fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        setIntent(intent);
198fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        configureContentView(false, null);
199fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
200fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
201fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    private void configureContentView(boolean createContentView, Bundle savedState) {
2021ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // Extract relevant information from the intent
2031ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        mRequest = mIntentResolver.resolveIntent(getIntent());
2041ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (!mRequest.isValid()) {
2056178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            setResult(RESULT_CANCELED);
2067aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            finish();
2071ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            return;
2086178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov        }
2096178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
2101ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        Intent redirect = mRequest.getRedirectIntent();
2111ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (redirect != null) {
2121ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            // Need to start a different activity
2136178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            startActivity(redirect);
2147aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            finish();
2151ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            return;
2167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
2177aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
218fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (createContentView) {
2199856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            setContentView(R.layout.people_activity);
220b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
221b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            final FragmentManager fragmentManager = getFragmentManager();
222b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mFavoritesFragment = (StrequentContactListFragment) fragmentManager
223b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    .findFragmentById(R.id.favorites_fragment);
224b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mContactsFragment = (DefaultContactBrowseListFragment) fragmentManager
225b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    .findFragmentById(R.id.contacts_fragment);
226b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mGroupsFragment = (GroupBrowseListFragment) fragmentManager
227b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    .findFragmentById(R.id.groups_fragment);
228b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
229b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            // Hide all tabs (the current tab will later be reshown once a tab is selected)
230b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            final FragmentTransaction transaction = fragmentManager.beginTransaction();
231b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            transaction.hide(mFavoritesFragment);
232b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            transaction.hide(mContactsFragment);
233b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            transaction.hide(mGroupsFragment);
234b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            transaction.commit();
235fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
23665ad5eedb8f44f11e1d29cce141eddd88c0941b3Dmitri Plotnikov
23790715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov        if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT
23890715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov                && !mContactContentDisplayed) {
23990715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            redirect = new Intent(this, ContactDetailActivity.class);
24090715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            redirect.setAction(Intent.ACTION_VIEW);
24190715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            redirect.setData(mRequest.getContactUri());
24290715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            startActivity(redirect);
24390715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            finish();
24490715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            return;
24527b97bca14c84b3f830c7a433e14ae5c180a32c3Dmitri Plotnikov        }
24627b97bca14c84b3f830c7a433e14ae5c180a32c3Dmitri Plotnikov
24790715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov        setTitle(mRequest.getActivityTitle());
248b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        ActionBar actionBar = getActionBar();
249b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        mActionBarAdapter = new ActionBarAdapter(this);
250b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        mActionBarAdapter.onCreate(savedState, mRequest, getActionBar());
251b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        mActionBarAdapter.setContactListFilterController(mContactListFilterController);
252fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
2533bf12640a267146a6a0134367f7236401db8e754Daniel Lehmann        if (createContentView) {
254b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.removeAllTabs();
255b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            Tab favoritesTab = actionBar.newTab();
256b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            favoritesTab.setText(getString(R.string.strequentList));
257b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment));
258b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.addTab(favoritesTab);
2593d48a46d6ea2d0ad43f1d6253399db45414ac9b7Dmitri Plotnikov
260b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            Tab peopleTab = actionBar.newTab();
261b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            peopleTab.setText(getString(R.string.people));
262b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            peopleTab.setTabListener(new TabChangeListener(mContactsFragment));
263b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.addTab(peopleTab);
264b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
265b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            Tab groupsTab = actionBar.newTab();
266b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            groupsTab.setText(getString(R.string.contactsGroupsLabel));
267b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            groupsTab.setTabListener(new TabChangeListener(mGroupsFragment));
268b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.addTab(groupsTab);
269b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.setDisplayShowTitleEnabled(true);
270b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
271b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            TypedArray a = obtainStyledAttributes(null, R.styleable.ActionBarHomeIcon);
272b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            boolean showHomeIcon = a.getBoolean(R.styleable.ActionBarHomeIcon_show_home_icon, true);
273b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            actionBar.setDisplayShowHomeEnabled(showHomeIcon);
274b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
275b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            invalidateOptionsMenu();
276d364314c460152db7089b304beec81b3675893baDmitri Plotnikov        }
27708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
278fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        configureFragments(savedState == null);
2793c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov    }
2803c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
281b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    /**
282b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan     * Tab change listener that is instantiated once for each tab. Handles showing/hiding fragments.
283b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan     * TODO: Use ViewPager so that tabs can be swiped left and right. Figure out how to use the
284b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan     * support library in our app.
285b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan     */
286b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private class TabChangeListener implements TabListener {
287b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        private final Fragment mFragment;
288b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
289b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        public TabChangeListener(Fragment fragment) {
290b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mFragment = fragment;
291b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
292b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
293b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        @Override
294b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
295b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            ft.hide(mFragment);
296b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
297b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
298b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        @Override
299b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        public void onTabSelected(Tab tab, FragmentTransaction ft) {
300b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            ft.show(mFragment);
301b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
302b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
303b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        @Override
304b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        public void onTabReselected(Tab tab, FragmentTransaction ft) {
305b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
306b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    }
307b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
3086e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
309174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onPause() {
310174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        if (mActionBarAdapter != null) {
311174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov            mActionBarAdapter.setListener(null);
312174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        }
313fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
314fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mOptionsMenuContactsAvailable = false;
315fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mOptionsMenuGroupActionsEnabled = false;
316fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
317fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mProviderStatus = -1;
3188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatusLoader.setProviderStatusListener(null);
319174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onPause();
320174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
321174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
322174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
323174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onResume() {
324174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onResume();
325174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        if (mActionBarAdapter != null) {
326174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov            mActionBarAdapter.setListener(this);
327174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        }
3288b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatusLoader.setProviderStatusListener(this);
3298b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        updateFragmentVisibility();
330174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
331174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
332174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
3336e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    protected void onStart() {
334e4e52199057ffb57bad42caa33e6b402fd80697aDmitri Plotnikov        mContactListFilterController.onStart();
3356e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        super.onStart();
336caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov    }
337caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
338955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov    private void configureFragments(boolean fromRequest) {
339009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov        if (fromRequest) {
34091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            ContactListFilter filter = null;
34191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            int actionCode = mRequest.getActionCode();
34291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            switch (actionCode) {
34391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_ALL_CONTACTS:
34491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
34591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
34691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
34791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    filter = new ContactListFilter(
34891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                            ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
34991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
35091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
35191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                // TODO: handle FREQUENT and STREQUENT according to the spec
35291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_FREQUENT:
35391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STREQUENT:
35491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    // For now they are treated the same as STARRED
35591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STARRED:
35691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED);
35791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
35891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            }
35991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
3600edd4071ddcb23bf2a7b95582df0657de9ff0c60Dmitri Plotnikov            mSearchMode = mRequest.isSearchMode();
36191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            if (filter != null) {
36291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                mContactListFilterController.setContactListFilter(filter, false);
363fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                mSearchMode = false;
36448cc25047d2c61828e9137c50b3496feada7a175Dmitri Plotnikov            } else if (mRequest.getActionCode() == ContactsRequest.ACTION_ALL_CONTACTS) {
36548cc25047d2c61828e9137c50b3496feada7a175Dmitri Plotnikov                mContactListFilterController.setContactListFilter(new ContactListFilter(
36648cc25047d2c61828e9137c50b3496feada7a175Dmitri Plotnikov                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS), false);
367009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov            }
368d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
369d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            if (mRequest.getContactUri() != null) {
370fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                mSearchMode = false;
371d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
372d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
373fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mListFragment.setContactsRequest(mRequest);
374fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            configureListFragmentForRequest();
375a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov
376b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        } else {
377a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov            mSearchMode = mActionBarAdapter.isSearchMode();
378fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
379fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
380fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        configureListFragment();
381fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
382fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        invalidateOptionsMenu();
3836e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
3846e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
3856e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
386d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void onContactListFiltersLoaded() {
3878daa1797310aca2333efcff0a0e0b0ed03187fffDmitri Plotnikov        if (mListFragment == null || !mListFragment.isAdded()) {
388955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov            return;
389955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov        }
390955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov
391d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mListFragment.setFilter(mContactListFilterController.getFilter());
392bc5bc44eb0e6f86a093929885547fe37efe60a54Dmitri Plotnikov
393e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        invalidateOptionsMenu();
394174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
395174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
396d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    @Override
397d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void onContactListFilterChanged() {
3988daa1797310aca2333efcff0a0e0b0ed03187fffDmitri Plotnikov        if (mListFragment == null || !mListFragment.isAdded()) {
399d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov            return;
400d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov        }
401d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov
402d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mListFragment.setFilter(mContactListFilterController.getFilter());
403e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
404e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        invalidateOptionsMenu();
4053ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov    }
4063ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov
4076e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
4086e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    public void onContactListFilterCustomizationRequest() {
4096e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        startActivityForResult(new Intent(this, CustomContactListFilterActivity.class),
4106e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                SUBACTIVITY_CUSTOMIZE_FILTER);
4116e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
4126e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
413a6c2198bc5ad37119500c4857125ad732548c402Dmitri Plotnikov    private void setupContactDetailFragment(final Uri contactLookupUri) {
414d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mDetailFragment.loadUri(contactLookupUri);
415c0ca13a86793082c8969e44c70d4dc8fb83eb1f8Dmitri Plotnikov    }
416c0ca13a86793082c8969e44c70d4dc8fb83eb1f8Dmitri Plotnikov
417fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    /**
418fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     * Handler for action bar actions.
419fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     */
420fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    @Override
421b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    public void onAction(Action action) {
422b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        switch (action) {
423b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case START_SEARCH_MODE:
424b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                // Bring the contact list fragment to the front.
425b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                FragmentTransaction ft = getFragmentManager().beginTransaction();
426b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                ft.show(mContactsFragment);
427b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                ft.commit();
428b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
429b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case STOP_SEARCH_MODE:
430b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case CHANGE_SEARCH_QUERY:
431b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                // Refresh the contact list fragment.
432b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                configureFragments(false /* from request */);
433b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mListFragment.setQueryString(mActionBarAdapter.getQueryString(), true);
434b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
435b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            default:
436b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action);
437b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
438fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    }
439fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov
440fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    private void configureListFragmentForRequest() {
441fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        Uri contactUri = mRequest.getContactUri();
442fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (contactUri != null) {
443fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mListFragment.setSelectedContactUri(contactUri);
444fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
445238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
4460edd4071ddcb23bf2a7b95582df0657de9ff0c60Dmitri Plotnikov        mListFragment.setSearchMode(mRequest.isSearchMode());
4475251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov        mListFragment.setQueryString(mRequest.getQueryString(), false);
448238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
449fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mRequest.isDirectorySearchEnabled()) {
450fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
451fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        } else {
452fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
453fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
454238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
455fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mContactListFilterController.isLoaded()) {
456fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mListFragment.setFilter(mContactListFilterController.getFilter());
4571ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
45808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
45908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
460fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    private void configureListFragment() {
461fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mListFragment.setSearchMode(mSearchMode);
462fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
463fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mListFragment.setVisibleScrollbarEnabled(!mSearchMode);
464fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mListFragment.setVerticalScrollbarPosition(
4655245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov                mContactContentDisplayed
4665245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov                        ? View.SCROLLBAR_POSITION_LEFT
4675245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov                        : View.SCROLLBAR_POSITION_RIGHT);
468fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mListFragment.setSelectionVisible(mContactContentDisplayed);
469fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mListFragment.setQuickContactEnabled(!mContactContentDisplayed);
4701ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
4711323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
4728b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
4738b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public void onProviderStatusChange() {
4748b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        updateFragmentVisibility();
4758b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
4768b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
4778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private void updateFragmentVisibility() {
4788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        int providerStatus = mProviderStatusLoader.getProviderStatus();
4798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (providerStatus == mProviderStatus) {
4808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return;
4818b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
4828b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
4838b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatus = providerStatus;
4848b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
4858b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view);
4868b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View mainView = findViewById(R.id.main_view);
4878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
4888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (mProviderStatus == ProviderStatus.STATUS_NORMAL) {
489c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.GONE);
490b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mainView != null) {
491b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mainView.setVisibility(View.VISIBLE);
492b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
4938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mListFragment != null) {
4948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mListFragment.setEnabled(true);
4958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
4968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        } else {
4978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mListFragment != null) {
4988b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mListFragment.setEnabled(false);
4998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
5008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mContactsUnavailableFragment == null) {
5018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment = new ContactsUnavailableFragment();
5028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.setProviderStatusLoader(mProviderStatusLoader);
5038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
5048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        new ContactsUnavailableFragmentListener());
5053ed426c842a68895a759548fef87bac359f937bbDianne Hackborn                getFragmentManager().beginTransaction()
5068b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
5078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        .commit();
5088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            } else {
5098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.update();
5108b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
5118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.VISIBLE);
512b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mainView != null) {
513b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mainView.setVisibility(View.INVISIBLE);
514b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
5158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
5168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
5178b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        invalidateOptionsMenu();
5188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
5198b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
5201ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
521d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
522e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
523d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onSelectionChange() {
524e1d4c0617ede33b4b0cdb1137aca971b3dacc747Dmitri Plotnikov            if (mContactContentDisplayed) {
525d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                setupContactDetailFragment(mListFragment.getSelectedContactUri());
526d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
527d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
528e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov
529d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        @Override
530d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onViewContactAction(Uri contactLookupUri) {
531d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            if (mContactContentDisplayed) {
532d364314c460152db7089b304beec81b3675893baDmitri Plotnikov                setupContactDetailFragment(contactLookupUri);
533424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov            } else {
534424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov                startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
535424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov            }
5361ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
537e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
538e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
5391ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onCreateNewContactAction() {
5401ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
5411ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            Bundle extras = getIntent().getExtras();
5421ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            if (extras != null) {
5431ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov                intent.putExtras(extras);
544416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov            }
5451ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            startActivity(intent);
5461ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
547416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
548e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
5491ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onEditContactAction(Uri contactLookupUri) {
550e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
551e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            Bundle extras = getIntent().getExtras();
552e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            if (extras != null) {
553e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann                intent.putExtras(extras);
5541ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            }
555e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT);
5561ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
557413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov
558e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
5591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onAddToFavoritesAction(Uri contactUri) {
5601ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            ContentValues values = new ContentValues(1);
5611ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            values.put(Contacts.STARRED, 1);
5621ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            getContentResolver().update(contactUri, values, null, null);
5631ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
5648a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
565e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
5661ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onRemoveFromFavoritesAction(Uri contactUri) {
5671ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            ContentValues values = new ContentValues(1);
5681ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            values.put(Contacts.STARRED, 0);
5691ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            getContentResolver().update(contactUri, values, null, null);
5701ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
571416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
572e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
5731ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onCallContactAction(Uri contactUri) {
574b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov            getPhoneNumberCallInteraction().startInteraction(contactUri);
5751ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
576416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
577e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
5781ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onSmsContactAction(Uri contactUri) {
579b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov            getSendTextMessageInteraction().startInteraction(contactUri);
5801ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
581e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
582e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
5831ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onDeleteContactAction(Uri contactUri) {
5849856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
5851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
5868a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
587e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
5881ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onFinishAction() {
5891ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            onBackPressed();
5901ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
5916e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
5926e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        @Override
5936e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        public void onInvalidSelection() {
5948fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            ContactListFilter filter;
5958fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            ContactListFilter currentFilter = mListFragment.getFilter();
5968fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            if (currentFilter != null
5978fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                    && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
5988fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
5998fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                mListFragment.setFilter(filter);
6008fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            } else {
6018fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
6028fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                mListFragment.setFilter(filter, false);
6038fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            }
604d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mContactListFilterController.setContactListFilter(filter, true);
6056e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        }
6061ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
607416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
608424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov    private class DetailFragmentListener implements ContactDetailFragment.Listener {
60969e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
610424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onContactNotFound() {
611d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            // Nothing needs to be done here
612424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
613424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
61469e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
615424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onEditRequested(Uri contactLookupUri) {
6168c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov            startActivityForResult(
6178c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov                    new Intent(Intent.ACTION_EDIT, contactLookupUri), SUBACTIVITY_EDIT_CONTACT);
618424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
619424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
62069e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
621424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onItemClicked(Intent intent) {
62260be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            try {
62360be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann                startActivity(intent);
62460be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            } catch (ActivityNotFoundException e) {
62560be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann                Log.e(TAG, "No activity found for intent: " + intent);
62660be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            }
627424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
628424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
62969e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
63066bca8f360c9e21b6a47006f21db7b46b6b46340Dmitri Plotnikov        public void onDeleteRequested(Uri contactUri) {
6319856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
632424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
633caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
634caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov        @Override
635caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov        public void onCreateRawContactRequested(ArrayList<ContentValues> values, Account account) {
6369856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            Toast.makeText(PeopleActivity.this, R.string.toast_making_personal_copy,
637caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov                    Toast.LENGTH_LONG).show();
638caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov            Intent serviceIntent = ContactSaveService.createNewRawContactIntent(
6399856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan                    PeopleActivity.this, values, account,
6409856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan                    PeopleActivity.class, Intent.ACTION_VIEW);
641caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov            startService(serviceIntent);
642caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov        }
643424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov    }
644424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
6458b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private class ContactsUnavailableFragmentListener
6468b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            implements OnContactsUnavailableActionListener {
6478b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6488b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
6498b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onCreateNewContactAction() {
6508b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
6518b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
6528b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6538b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
6548b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onAddAccountAction() {
6558b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT);
6561fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
6578b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            intent.putExtra(Settings.EXTRA_AUTHORITIES,
6588b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new String[] { ContactsContract.AUTHORITY });
6598b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(intent);
6608b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
6618b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6628b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
6638b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onImportContactsFromFileAction() {
6649856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            AccountSelectionUtil.doImportFromSdCard(PeopleActivity.this, null);
6658b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
6668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6678b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
6688b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onFreeInternalStorageAction() {
6698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS));
6708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
6718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
6728b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
673732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    public void startActivityAndForwardResult(final Intent intent) {
674732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
675732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
676732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        // Forward extras to the new activity
677732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        Bundle extras = getIntent().getExtras();
678732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        if (extras != null) {
679732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov            intent.putExtras(extras);
680732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        }
681732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        startActivity(intent);
682732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        finish();
683732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
684732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
6857aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
6868b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean onCreatePanelMenu(int featureId, Menu menu) {
6878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        // No menu if contacts are unavailable
6888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (!areContactsAvailable()) {
6898b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
6908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
6918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        return super.onCreatePanelMenu(featureId, menu);
6938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
6948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
6958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
6968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean onPreparePanel(int featureId, View view, Menu menu) {
6978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        // No menu if contacts are unavailable
6988b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (!areContactsAvailable()) {
6998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
7008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
7018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
7028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        return super.onPreparePanel(featureId, view, menu);
7038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
7048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
7058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
7067aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
7078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (!areContactsAvailable()) {
7088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
7098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
710d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        super.onCreateOptionsMenu(menu);
711d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey
712d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        MenuInflater inflater = getMenuInflater();
713b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        inflater.inflate(R.menu.actions, menu);
714b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // TODO: Figure out if R.menu.list or R.menu.search are necessary according to the overflow
715b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // menus on the UX mocks.
716b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
717b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        if (searchMenuItem != null && searchMenuItem.getActionView() instanceof SearchView) {
718b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            SearchView searchView = (SearchView) searchMenuItem.getActionView();
719b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            searchView.setQueryHint(getString(R.string.hint_findContacts));
720b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            searchView.setIconifiedByDefault(false);
721b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
722b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mActionBarAdapter != null) {
723b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mActionBarAdapter.setSearchView(searchView);
724b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
7257aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
726b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
727b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // TODO: Can remove this as a custom view because the account selector is in the editor now.
728b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // Change add contact button to button with a custom view
729b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        final MenuItem addContact = menu.findItem(R.id.menu_add);
730b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        addContact.setActionView(mAddContactImageView);
731b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        return true;
732d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    }
7337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
734d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    @Override
7350cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    public void invalidateOptionsMenu() {
7360cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (isOptionsMenuChanged()) {
7370cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            super.invalidateOptionsMenu();
7380cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
7390cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
7400cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
7410cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    public boolean isOptionsMenuChanged() {
7420cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (mOptionsMenuContactsAvailable != areContactsAvailable()) {
7430cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
7440cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
7450cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
7460cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (mOptionsMenuGroupActionsEnabled != areGroupActionsEnabled()) {
7470cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
7480cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
7490cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
7500cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (mListFragment != null && mListFragment.isOptionsMenuChanged()) {
7510cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
7520cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
7530cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
7540cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (mDetailFragment != null && mDetailFragment.isOptionsMenuChanged()) {
7550cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
7560cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
7570cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
7580cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        return false;
7590cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
7600cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
7610cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    @Override
762d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    public boolean onPrepareOptionsMenu(Menu menu) {
7630cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        mOptionsMenuContactsAvailable = areContactsAvailable();
7640cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (!mOptionsMenuContactsAvailable) {
7658b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
7668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
7678b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
768a053d61c4bc694061f449e00cb1b620b855739bbDmitri Plotnikov        MenuItem settings = menu.findItem(R.id.menu_settings);
7690f1f66a79bf676959d4e0fcfda70c08121ae0c57Daniel Lehmann        if (settings != null) {
7700f1f66a79bf676959d4e0fcfda70c08121ae0c57Daniel Lehmann            settings.setVisible(!ContactsPreferenceActivity.isEmpty(this));
7710f1f66a79bf676959d4e0fcfda70c08121ae0c57Daniel Lehmann        }
772a053d61c4bc694061f449e00cb1b620b855739bbDmitri Plotnikov
7730cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        mOptionsMenuGroupActionsEnabled = areGroupActionsEnabled();
774e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
775e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        MenuItem renameGroup = menu.findItem(R.id.menu_rename_group);
776e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        if (renameGroup != null) {
7770cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            renameGroup.setVisible(mOptionsMenuGroupActionsEnabled);
778e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        }
779e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
780e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        MenuItem deleteGroup = menu.findItem(R.id.menu_delete_group);
781e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        if (deleteGroup != null) {
7820cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            deleteGroup.setVisible(mOptionsMenuGroupActionsEnabled);
783e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        }
784e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
785d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        return true;
7867aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
7877aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
7880cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    private boolean areGroupActionsEnabled() {
7890cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        boolean groupActionsEnabled = false;
7900cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (mListFragment != null) {
7910cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            ContactListFilter filter = mListFragment.getFilter();
7920cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            if (filter != null
7930cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov                    && filter.filterType == ContactListFilter.FILTER_TYPE_GROUP
7940cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov                    && !filter.groupReadOnly) {
7950cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov                groupActionsEnabled = true;
7960cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            }
7970cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
7980cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        return groupActionsEnabled;
7990cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
8000cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
8017aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
8027aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
8037aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (item.getItemId()) {
804c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov            case R.id.menu_settings: {
805c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov                final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
806c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann                startActivity(intent);
8077aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
808d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
809b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case R.id.menu_contacts_filter: {
810b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                final Intent intent = new Intent(this, CustomContactListFilterActivity.class);
811b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
812b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                return true;
813b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
814d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_search: {
8158e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov                onSearchRequested();
8167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
817d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
818d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_add: {
819d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
82022fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann                startActivityForResult(intent, SUBACTIVITY_NEW_CONTACT);
821d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
822d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
82349d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey            case R.id.menu_import_export: {
824261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmann                ImportExportDialogFragment.show(getFragmentManager());
825d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
826d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
827d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_accounts: {
828d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
829fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov                intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
830d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                    ContactsContract.AUTHORITY
831d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                });
8321fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
833d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                startActivity(intent);
834d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
835d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
836e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov            case R.id.menu_rename_group: {
837d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                ContactListFilter filter = mListFragment.getFilter();
838e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov                GroupRenamingDialogFragment.show(getFragmentManager(), filter.groupId,
839e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov                        filter.title);
840e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov                return true;
841e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov            }
842e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov            case R.id.menu_delete_group: {
843d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                ContactListFilter filter = mListFragment.getFilter();
844e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov                GroupDeletionDialogFragment.show(getFragmentManager(), filter.groupId,
845e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov                        filter.title);
846e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov                return true;
847e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov            }
8487aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
8497aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return false;
8507aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
8517aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
8528e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov    @Override
8538e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov    public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
8548e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov            boolean globalSearch) {
855691e93397eae9a29d979a5e404f0b90130c2e9d4Dmitri Plotnikov        if (mListFragment != null && mListFragment.isAdded() && !globalSearch) {
856d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov            mListFragment.startSearch(initialQuery);
857691e93397eae9a29d979a5e404f0b90130c2e9d4Dmitri Plotnikov        } else {
858691e93397eae9a29d979a5e404f0b90130c2e9d4Dmitri Plotnikov            super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
859db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov        }
860db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov    }
861db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
86249d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey    @Override
8633b73d8b49e07b93b80a4f363a40c0680377f5225Dmitri Plotnikov    protected Dialog onCreateDialog(int id, Bundle bundle) {
8643b7d5949bfa524534e5d1aa29b8eaff8733ae00cDaniel Lehmann        if (DialogManager.isManagedId(id)) return mDialogManager.onCreateDialog(id, bundle);
8653391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann
86666bca8f360c9e21b6a47006f21db7b46b6b46340Dmitri Plotnikov        Dialog dialog = getPhoneNumberCallInteraction().onCreateDialog(id, bundle);
867a35a7e2aabc4edfafb9b4171e279bdb4c0c03d44Daniel Lehmann        if (dialog != null) return dialog;
868b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov
869b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov        dialog = getSendTextMessageInteraction().onCreateDialog(id, bundle);
870a35a7e2aabc4edfafb9b4171e279bdb4c0c03d44Daniel Lehmann        if (dialog != null) return dialog;
871b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov
8723b73d8b49e07b93b80a4f363a40c0680377f5225Dmitri Plotnikov        return super.onCreateDialog(id, bundle);
87349d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey    }
87449d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey
8759692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikov    @Override
8769692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikov    protected void onPrepareDialog(int id, Dialog dialog, Bundle bundle) {
877b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov        if (getPhoneNumberCallInteraction().onPrepareDialog(id, dialog, bundle)) {
878b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov            return;
879b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov        }
880b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov
881b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov        if (getSendTextMessageInteraction().onPrepareDialog(id, dialog, bundle)) {
882b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov            return;
883b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov        }
884b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov
8859692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikov        super.onPrepareDialog(id, dialog, bundle);
8869692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikov    }
887d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey
888d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    @Override
889d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
890d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        switch (requestCode) {
8916e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov            case SUBACTIVITY_CUSTOMIZE_FILTER: {
8926e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                if (resultCode == Activity.RESULT_OK) {
8936e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                    mContactListFilterController.selectCustomFilter();
8946e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                }
8956e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                break;
8966e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov            }
8978c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov
898d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            case SUBACTIVITY_EDIT_CONTACT:
89922fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann            case SUBACTIVITY_NEW_CONTACT: {
9000dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro                if (resultCode == RESULT_OK && mContactContentDisplayed) {
9016e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov                    mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
902a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov                    mListFragment.reloadDataAndSetSelectedUri(data.getData());
90322fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann                }
90422fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann                break;
90522fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann            }
906d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
9077aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
9087aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // anymore
909e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
910d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                if (resultCode == RESULT_OK) {
911e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov                    mListFragment.onPickerResult(data);
912d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                }
913d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
914d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code
915d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov//                else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
9161ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // Finish the activity if the sub activity was canceled as back key is used
9171ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
9181ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    finish();
9191ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
9201ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
921d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        }
922d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    }
9237aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
9247aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
9257aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
926502741df555dc7cf59a10885272d432940ae35adDmitri Plotnikov        ContextMenuAdapter menuAdapter = mListFragment.getContextMenuAdapter();
927502741df555dc7cf59a10885272d432940ae35adDmitri Plotnikov        if (menuAdapter != null) {
928502741df555dc7cf59a10885272d432940ae35adDmitri Plotnikov            return menuAdapter.onContextItemSelected(item);
9297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
9307aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
9317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return super.onContextItemSelected(item);
9327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
9337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
9347aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
9357aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
9361ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
9377aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (keyCode) {
9381ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            case KeyEvent.KEYCODE_CALL: {
9391ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                if (callSelection()) {
9401ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    return true;
9411ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
9421ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
9431ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            }
944db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
9457aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            case KeyEvent.KEYCODE_DEL: {
9466c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov                if (deleteSelection()) {
9477aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                    return true;
9487aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                }
9497aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                break;
9507aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            }
9517bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            default: {
9527bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                // Bring up the search UI if the user starts typing
9537bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                final int unicodeChar = event.getUnicodeChar();
9544f3aa85131e16594fef22ca60439f4320016767fDaniel Lehmann                if (unicodeChar != 0 && !Character.isWhitespace(unicodeChar)) {
9557bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    String query = new String(new int[]{ unicodeChar }, 0, 1);
956b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    if (!mActionBarAdapter.isSearchMode()) {
957b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        mActionBarAdapter.setQueryString(query);
958b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        mActionBarAdapter.setSearchMode(true);
959b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        return true;
9607bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    } else if (!mRequest.isSearchMode()) {
9617bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                        if (!mSearchInitiated) {
9627bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                            mSearchInitiated = true;
9637bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                            startSearch(query, false, null, false);
9647bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                            return true;
9657bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                        }
9667bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    }
9677bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                }
9687bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            }
9697aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
9707aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
9717aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return super.onKeyDown(keyCode, event);
9727aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
973ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov
974ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    @Override
975ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    public void onBackPressed() {
976ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        if (mSearchMode && mActionBarAdapter != null) {
977ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            mActionBarAdapter.setSearchMode(false);
978ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        } else {
979ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            super.onBackPressed();
980ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        }
981ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    }
9827aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
9836c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov    private boolean deleteSelection() {
9841ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
9851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//        if (mActionCode == ContactsRequest.ACTION_DEFAULT) {
9861ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            final int position = mListView.getSelectedItemPosition();
9871ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            if (position != ListView.INVALID_POSITION) {
9881ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                Uri contactUri = getContactUri(position);
9891ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                if (contactUri != null) {
9901ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    doContactDelete(contactUri);
9911ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    return true;
9921ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
9931ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            }
9941ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//        }
9956c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov        return false;
9966c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov    }
9976c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov
99808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
99908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onSaveInstanceState(Bundle outState) {
100008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onSaveInstanceState(outState);
100115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        outState.putBoolean(KEY_SEARCH_MODE, mSearchMode);
1002fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        if (mActionBarAdapter != null) {
1003fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            mActionBarAdapter.onSaveInstanceState(outState);
100408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
100508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
100608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
1007fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
1008fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    protected void onRestoreInstanceState(Bundle inState) {
1009fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        super.onRestoreInstanceState(inState);
1010fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mSearchMode = inState.getBoolean(KEY_SEARCH_MODE);
1011fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mActionBarAdapter != null) {
1012fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            mActionBarAdapter.onRestoreInstanceState(inState);
1013fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
1014fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
1015fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
1016b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov    private PhoneNumberInteraction getPhoneNumberCallInteraction() {
1017b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov        if (mPhoneNumberCallInteraction == null) {
1018b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov            mPhoneNumberCallInteraction = new PhoneNumberInteraction(this, false, null);
1019b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov        }
1020b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov        return mPhoneNumberCallInteraction;
1021b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov    }
1022b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov
1023b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov    private PhoneNumberInteraction getSendTextMessageInteraction() {
1024b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov        if (mSendTextMessageInteraction == null) {
1025b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov            mSendTextMessageInteraction = new PhoneNumberInteraction(this, true, null);
10267c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov        }
1027b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikov        return mSendTextMessageInteraction;
10287c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov    }
10299692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikov
10303391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    @Override
10313391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    public DialogManager getDialogManager() {
10323391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann        return mDialogManager;
10333391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    }
1034ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
1035ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    // Visible for testing
1036ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    public ContactBrowseListFragment getListFragment() {
1037ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov        return mListFragment;
1038ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    }
1039ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
1040ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    // Visible for testing
1041ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    public ContactDetailFragment getDetailFragment() {
1042ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov        return mDetailFragment;
1043ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    }
10447aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project}
1045