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
1958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.ContactLoader;
2018ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.ContactSaveService;
216f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikovimport com.android.contacts.ContactsActivity;
22a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelsonimport com.android.contacts.ContactsUtils;
2327834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R;
244d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onukiimport com.android.contacts.activities.ActionBarAdapter.TabState;
2518ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.detail.ContactDetailFragment;
2658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.detail.ContactDetailLayoutController;
2758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.detail.ContactDetailUpdatesFragment;
2858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.detail.ContactLoaderFragment;
2958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.detail.ContactLoaderFragment.ContactLoaderFragmentListener;
30b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.group.GroupBrowseListFragment;
31be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuanimport com.android.contacts.group.GroupBrowseListFragment.OnGroupBrowserActionListener;
32be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuanimport com.android.contacts.group.GroupDetailFragment;
339692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikovimport com.android.contacts.interactions.ContactDeletionInteraction;
34261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmannimport com.android.contacts.interactions.ImportExportDialogFragment;
35b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikovimport com.android.contacts.interactions.PhoneNumberInteraction;
3608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactBrowseListFragment;
3759fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikovimport com.android.contacts.list.ContactEntryListFragment;
38009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikovimport com.android.contacts.list.ContactListFilter;
3915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController;
40f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaroimport com.android.contacts.list.ContactTileAdapter.DisplayType;
41f7689c377caba183daa41856d01a8c1a2f7ba811Katherine Kuanimport com.android.contacts.list.ContactTileFrequentFragment;
42d78ee90c0d4d93b82ad440396e87ae4f47f53e93Daniel Lehmannimport com.android.contacts.list.ContactTileListFragment;
430906ee326a5553a224eb7b004536f35b340bdcd3Dmitri Plotnikovimport com.android.contacts.list.ContactsIntentResolver;
441ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikovimport com.android.contacts.list.ContactsRequest;
458b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ContactsUnavailableFragment;
46b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.list.DefaultContactBrowseListFragment;
474d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikovimport com.android.contacts.list.DirectoryListLoader;
48732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport com.android.contacts.list.OnContactBrowserActionListener;
498b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.OnContactsUnavailableActionListener;
508b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ProviderStatusLoader;
518b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ProviderStatusLoader.ProviderStatusListener;
52971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport com.android.contacts.model.AccountTypeManager;
532b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoroimport com.android.contacts.model.AccountWithDataSet;
54c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikovimport com.android.contacts.preference.ContactsPreferenceActivity;
55edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmannimport com.android.contacts.preference.DisplayOptionsPreferenceFragment;
5634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawaimport com.android.contacts.util.AccountFilterUtil;
57aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuanimport com.android.contacts.util.AccountPromptUtils;
588b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.util.AccountSelectionUtil;
59971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport com.android.contacts.util.AccountsListAdapter;
606f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onukiimport com.android.contacts.util.AccountsListAdapter.AccountListFilter;
6149627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onukiimport com.android.contacts.util.Constants;
623391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager;
63553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onukiimport com.android.contacts.util.PhoneCapabilityTester;
6457cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka
6592a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikovimport android.app.Fragment;
66b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.FragmentManager;
67b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.FragmentTransaction;
6860be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmannimport android.content.ActivityNotFoundException;
697aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.content.ContentValues;
707aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.content.Intent;
717a700cf798a19a8452b8671f643a05336f63f611Katherine Kuanimport android.graphics.Rect;
727aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.net.Uri;
737aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.os.Bundle;
7458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.os.Handler;
75250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onukiimport android.os.Parcelable;
76edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmannimport android.preference.PreferenceActivity;
77d7c4af2b932ffc65476fb1ac6d74feac74b48f3cDmitri Plotnikovimport android.provider.ContactsContract;
78e05296673449dc6686c4fec4dd2e98ab47a78056Jeff Hamiltonimport android.provider.ContactsContract.Contacts;
79971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.provider.ContactsContract.Intents;
808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport android.provider.ContactsContract.ProviderStatus;
817a700cf798a19a8452b8671f643a05336f63f611Katherine Kuanimport android.provider.ContactsContract.QuickContact;
829692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikovimport android.provider.Settings;
83250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onukiimport android.support.v13.app.FragmentPagerAdapter;
84250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onukiimport android.support.v4.view.PagerAdapter;
8558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport android.support.v4.view.ViewPager;
86a35a7e2aabc4edfafb9b4171e279bdb4c0c03d44Daniel Lehmannimport android.util.Log;
877aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.KeyEvent;
887aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.Menu;
89d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkeyimport android.view.MenuInflater;
907aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.MenuItem;
917aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.View;
92971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.view.View.OnClickListener;
93971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.widget.AdapterView;
94971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.widget.AdapterView.OnItemClickListener;
95971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.widget.ListPopupWindow;
96424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikovimport android.widget.Toast;
977aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
98caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikovimport java.util.ArrayList;
992b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoroimport java.util.List;
1006d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onukiimport java.util.concurrent.atomic.AtomicInteger;
101caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
1027aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/**
103bd772a5bfd907f3b14589a07378fb26dfd924d93Daniel Lehmann * Displays a list to browse contacts. For xlarge screens, this also displays a detail-pane on
104a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov * the right.
1057aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */
1069856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuanpublic class PeopleActivity extends ContactsActivity
107fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        implements View.OnCreateContextMenuListener, ActionBarAdapter.Listener,
1086e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        DialogManager.DialogShowingViewActivity,
1098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        ContactListFilterController.ContactListFilterListener, ProviderStatusListener {
11057d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov
1115e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro    private static final String TAG = "PeopleActivity";
1127aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
1135c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    // These values needs to start at 2. See {@link ContactEntryListFragment}.
1145c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    private static final int SUBACTIVITY_NEW_CONTACT = 2;
1155c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    private static final int SUBACTIVITY_EDIT_CONTACT = 3;
1165c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    private static final int SUBACTIVITY_NEW_GROUP = 4;
1175c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    private static final int SUBACTIVITY_EDIT_GROUP = 5;
1185c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    private static final int SUBACTIVITY_ACCOUNT_FILTER = 6;
119c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
12034b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa    private final DialogManager mDialogManager = new DialogManager(this);
1213391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann
122ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov    private ContactsIntentResolver mIntentResolver;
123fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ContactsRequest mRequest;
124caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov
125fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ActionBarAdapter mActionBarAdapter;
1267c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov
127be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private ContactDetailFragment mContactDetailFragment;
12858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private ContactDetailUpdatesFragment mContactDetailUpdatesFragment;
12958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
13058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private ContactLoaderFragment mContactDetailLoaderFragment;
13158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private final ContactDetailLoaderFragmentListener mContactDetailLoaderFragmentListener =
13258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            new ContactDetailLoaderFragmentListener();
133be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
134be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private GroupDetailFragment mGroupDetailFragment;
13558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private final GroupDetailFragmentListener mGroupDetailFragmentListener =
13658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            new GroupDetailFragmentListener();
137424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
1387979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro    private ContactTileListFragment.Listener mFavoritesFragmentListener =
139ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            new StrequentContactListFragmentListener();
140ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
14115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private ContactListFilterController mContactListFilterController;
1423c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
1438b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private ContactsUnavailableFragment mContactsUnavailableFragment;
1448b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private ProviderStatusLoader mProviderStatusLoader;
1458b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private int mProviderStatus = -1;
1468b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1470cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    private boolean mOptionsMenuContactsAvailable;
1480cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
14995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa    /**
15095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa     * Showing a list of Contacts. Also used for showing search results in search mode.
15195c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa     */
1526e6c24190257fd77d99b4ab385501795537f6effDaniel Lehmann    private DefaultContactBrowseListFragment mAllFragment;
1537979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro    private ContactTileListFragment mFavoritesFragment;
154f7689c377caba183daa41856d01a8c1a2f7ba811Katherine Kuan    private ContactTileFrequentFragment mFrequentFragment;
155b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private GroupBrowseListFragment mGroupsFragment;
156b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
157f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro    private View mFavoritesView;
158f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro    private View mBrowserView;
159f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro    private View mDetailsView;
160f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
161971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan    private View mAddGroupImageView;
162971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
163250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    /** ViewPager for swipe, used only on the phone (i.e. one-pane mode) */
164250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private ViewPager mTabPager;
165250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private TabPagerAdapter mTabPagerAdapter;
1662e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki    private final TabPagerListener mTabPagerListener = new TabPagerListener();
167250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
16858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private ContactDetailLayoutController mContactDetailLayoutController;
16958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
17095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa    private final Handler mHandler = new Handler();
17195c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa
172417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
173417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * True if this activity instance is a re-created one.  i.e. set true after orientation change.
174417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * This is set in {@link #onCreate} for later use in {@link #onStart}.
175417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
176417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private boolean mIsRecreatedInstance;
177417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
178417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
179417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * If {@link #configureFragments(boolean)} is already called.  Used to avoid calling it twice
180417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * in {@link #onStart}.
181417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * (This initialization only needs to be done once in onStart() when the Activity was just
182417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * created from scratch -- i.e. onCreate() was just called)
183417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
184417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private boolean mFragmentInitialized;
185417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
186be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    /**
187be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan     * Whether or not the current contact filter is valid or not. We need to do a check on
188be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan     * start of the app to verify that the user is not in single contact mode. If so, we should
189be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan     * dynamically change the filter, unless the incoming intent specifically requested a contact
190be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan     * that should be displayed in that mode.
191be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan     */
192be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    private boolean mCurrentFilterIsValid;
193be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
1946d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    /** Sequential ID assigned to each instance; used for logging */
1956d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private final int mInstanceId;
1966d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private static final AtomicInteger sNextInstanceId = new AtomicInteger();
1976d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki
1989856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan    public PeopleActivity() {
1996d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        mInstanceId = sNextInstanceId.getAndIncrement();
2001540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov        mIntentResolver = new ContactsIntentResolver(this);
2018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatusLoader = new ProviderStatusLoader(this);
2026178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov    }
2036178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
2046d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    @Override
2056d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    public String toString() {
2066d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        // Shown on logcat
2076d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        return String.format("%s@%d", getClass().getSimpleName(), mInstanceId);
2086d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    }
2096d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki
2108b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean areContactsAvailable() {
2118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        return mProviderStatus == ProviderStatus.STATUS_NORMAL;
2128b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
2138b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
2146f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    private boolean areContactWritableAccountsAvailable() {
2156f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki        return ContactsUtils.areContactWritableAccountsAvailable(this);
21649917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson    }
21749917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson
2186f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    private boolean areGroupWritableAccountsAvailable() {
2196f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki        return ContactsUtils.areGroupWritableAccountsAvailable(this);
2206f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    }
22149917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson
22250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    /**
22350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * Initialize fragments that are (or may not be) in the layout.
22450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *
22550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * For the fragments that are in the layout, we initialize them in
226417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * {@link #createViewsAndFragments(Bundle)} after inflating the layout.
22750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *
22850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * However, there are special fragments which may not be in the layout, so we have to do the
22950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * initialization here.
23050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * The target fragments are:
23150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * - {@link ContactDetailFragment} and {@link ContactDetailUpdatesFragment}:  They may not be
23250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *   in the layout depending on the configuration.  (i.e. portrait)
23350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * - {@link ContactsUnavailableFragment}: We always create it at runtime.
23450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     */
2357aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
23692a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    public void onAttachFragment(Fragment fragment) {
23750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        if (fragment instanceof ContactDetailFragment) {
2384959ca3d0093a798859660f2914003d0da777645Makoto Onuki            mContactDetailFragment = (ContactDetailFragment) fragment;
2394959ca3d0093a798859660f2914003d0da777645Makoto Onuki        } else if (fragment instanceof ContactDetailUpdatesFragment) {
2404959ca3d0093a798859660f2914003d0da777645Makoto Onuki            mContactDetailUpdatesFragment = (ContactDetailUpdatesFragment) fragment;
2414959ca3d0093a798859660f2914003d0da777645Makoto Onuki        } else if (fragment instanceof ContactsUnavailableFragment) {
2428b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment;
2438b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment.setProviderStatusLoader(mProviderStatusLoader);
2448b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
2458b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new ContactsUnavailableFragmentListener());
24692a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
24792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
24892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
24992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    @Override
25008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onCreate(Bundle savedState) {
25149627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
25249627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki            Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate start");
25349627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        }
25408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onCreate(savedState);
2557aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
2566d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        if (!processIntent(false)) {
257417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            finish();
258417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return;
259417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
260417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
261a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mContactListFilterController = ContactListFilterController.getInstance(this);
262be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mContactListFilterController.checkFilterValidity(false);
263a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mContactListFilterController.addListener(this);
264a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa
265417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mIsRecreatedInstance = (savedState != null);
266417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        createViewsAndFragments(savedState);
26749627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
26849627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki            Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish");
26949627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        }
270fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
271fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
272fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
273fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    protected void onNewIntent(Intent intent) {
274fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        setIntent(intent);
2756d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        if (!processIntent(true)) {
276417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            finish();
277417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return;
278417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
279417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mActionBarAdapter.initialize(null, mRequest);
280417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
281be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mContactListFilterController.checkFilterValidity(false);
282be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mCurrentFilterIsValid = true;
283be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
284417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Re-configure fragments.
285417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        configureFragments(true /* from request */);
286417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        invalidateOptionsMenuIfNeeded();
287fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
288fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
289417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
290417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * Resolve the intent and initialize {@link #mRequest}, and launch another activity if redirect
291417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * is needed.
292417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *
2936d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki     * @param forNewIntent set true if it's called from {@link #onNewIntent(Intent)}.
294417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * @return {@code true} if {@link PeopleActivity} should continue running.  {@code false}
295417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *         if it shouldn't, in which case the caller should finish() itself and shouldn't do
296417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *         farther initialization.
297417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
2986d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private boolean processIntent(boolean forNewIntent) {
2991ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // Extract relevant information from the intent
3001ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        mRequest = mIntentResolver.resolveIntent(getIntent());
301ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki        if (Log.isLoggable(TAG, Log.DEBUG)) {
3026d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki            Log.d(TAG, this + " processIntent: forNewIntent=" + forNewIntent
3036d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki                    + " intent=" + getIntent() + " request=" + mRequest);
3046d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        }
3051ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (!mRequest.isValid()) {
3066178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            setResult(RESULT_CANCELED);
307417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
3086178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov        }
3096178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
3101ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        Intent redirect = mRequest.getRedirectIntent();
3111ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (redirect != null) {
3121ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            // Need to start a different activity
3136178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            startActivity(redirect);
314417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
3157aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
3167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
31750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT
31850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki                && !PhoneCapabilityTester.isUsingTwoPanes(this)) {
31950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            redirect = new Intent(this, ContactDetailActivity.class);
32050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            redirect.setAction(Intent.ACTION_VIEW);
32150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            redirect.setData(mRequest.getContactUri());
32250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            startActivity(redirect);
323417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
32450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        }
325417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        setTitle(mRequest.getActivityTitle());
326417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        return true;
327417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    }
32850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
329417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private void createViewsAndFragments(Bundle savedState) {
330417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        setContentView(R.layout.people_activity);
331417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
332417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        final FragmentManager fragmentManager = getFragmentManager();
333417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
334417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Hide all tabs (the current tab will later be reshown once a tab is selected)
335417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        final FragmentTransaction transaction = fragmentManager.beginTransaction();
336417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
337417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Prepare the fragments which are used both on 1-pane and on 2-pane.
338aaadf9393e98b04a40d249cd97ec758047268ed9Katherine Kuan        boolean isUsingTwoPanes = PhoneCapabilityTester.isUsingTwoPanes(this);
339aaadf9393e98b04a40d249cd97ec758047268ed9Katherine Kuan        if (isUsingTwoPanes) {
340417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFavoritesFragment = getFragment(R.id.favorites_fragment);
341417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mAllFragment = getFragment(R.id.all_fragment);
342417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mGroupsFragment = getFragment(R.id.groups_fragment);
343417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        } else {
344417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mTabPager = getView(R.id.tab_pager);
345417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mTabPagerAdapter = new TabPagerAdapter();
346417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mTabPager.setAdapter(mTabPagerAdapter);
3472e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(mTabPagerListener);
348417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
349417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            final String FAVORITE_TAG = "tab-pager-favorite";
350417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            final String ALL_TAG = "tab-pager-all";
351417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            final String GROUPS_TAG = "tab-pager-groups";
352417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
353417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // Create the fragments and add as children of the view pager.
354417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // The pager adapter will only change the visibility; it'll never create/destroy
355417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // fragments.
356417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // However, if it's after screen rotation, the fragments have been re-created by
357417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // the fragment manager, so first see if there're already the target fragments
358417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // existing.
3597979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro            mFavoritesFragment = (ContactTileListFragment)
360417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                    fragmentManager.findFragmentByTag(FAVORITE_TAG);
361417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mAllFragment = (DefaultContactBrowseListFragment)
362417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                    fragmentManager.findFragmentByTag(ALL_TAG);
363417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mGroupsFragment = (GroupBrowseListFragment)
364417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                    fragmentManager.findFragmentByTag(GROUPS_TAG);
365417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
366417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            if (mFavoritesFragment == null) {
3677979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro                mFavoritesFragment = new ContactTileListFragment();
368417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                mAllFragment = new DefaultContactBrowseListFragment();
369417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                mGroupsFragment = new GroupBrowseListFragment();
370417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
371417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                transaction.add(R.id.tab_pager, mFavoritesFragment, FAVORITE_TAG);
372417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG);
373417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                transaction.add(R.id.tab_pager, mGroupsFragment, GROUPS_TAG);
374250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
375417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
376250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
377417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mFavoritesFragment.setListener(mFavoritesFragmentListener);
37850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
379417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener());
38050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
381417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mGroupsFragment.setListener(new GroupBrowserActionListener());
38250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
383417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Hide all fragments for now.  We adjust visibility when we get onSelectedTabChanged()
384417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // from ActionBarAdapter.
385417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mFavoritesFragment);
386417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mAllFragment);
387417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mGroupsFragment);
388f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
389aaadf9393e98b04a40d249cd97ec758047268ed9Katherine Kuan        if (isUsingTwoPanes) {
390417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // Prepare 2-pane only fragments/views...
39150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
392417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // Container views for fragments
393417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFavoritesView = getView(R.id.favorites_view);
394417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mDetailsView = getView(R.id.details_view);
395417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mBrowserView = getView(R.id.browse_view);
39650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
397417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // 2-pane only fragments
398417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFrequentFragment = getFragment(R.id.frequent_fragment);
399417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFrequentFragment.setListener(mFavoritesFragmentListener);
400417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFrequentFragment.setDisplayType(DisplayType.FREQUENT_ONLY);
4017979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro            mFrequentFragment.enableQuickContact(true);
40250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
403417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mContactDetailLoaderFragment = getFragment(R.id.contact_detail_loader_fragment);
404417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mContactDetailLoaderFragment.setListener(mContactDetailLoaderFragmentListener);
40550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
406417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mGroupDetailFragment = getFragment(R.id.group_detail_fragment);
407417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mGroupDetailFragment.setListener(mGroupDetailFragmentListener);
408417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mGroupDetailFragment.setQuickContact(true);
40950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
4103bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan            if (mContactDetailFragment != null) {
4113bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan                transaction.hide(mContactDetailFragment);
4123bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan            }
413417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            transaction.hide(mGroupDetailFragment);
41427b97bca14c84b3f830c7a433e14ae5c180a32c3Dmitri Plotnikov
415417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // Configure contact details
4163bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan            mContactDetailLayoutController = new ContactDetailLayoutController(this, savedState,
4173bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan                    getFragmentManager(), findViewById(R.id.contact_detail_container),
4183bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan                    new ContactDetailFragmentListener());
4194d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
4204b25da79091157935042d2942a8961ceba92166fMinh Pham        transaction.commitAllowingStateLoss();
421417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        fragmentManager.executePendingTransactions();
4224d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
4230c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro        // Setting Properties after fragment is created
4240c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro        if (PhoneCapabilityTester.isUsingTwoPanes(this)) {
4250c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro            mFavoritesFragment.enableQuickContact(true);
4260c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro            mFavoritesFragment.setDisplayType(DisplayType.STARRED_ONLY);
4270c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro        } else {
4280c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro            mFavoritesFragment.setDisplayType(DisplayType.STREQUENT);
4290c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro        }
4300c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro
431417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Configure action bar
432aaadf9393e98b04a40d249cd97ec758047268ed9Katherine Kuan        mActionBarAdapter = new ActionBarAdapter(this, this, getActionBar(), isUsingTwoPanes);
433417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mActionBarAdapter.initialize(savedState, mRequest);
43458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
435417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        invalidateOptionsMenuIfNeeded();
436417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    }
43708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
438417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    @Override
439417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    protected void onStart() {
440417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        if (!mFragmentInitialized) {
441417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFragmentInitialized = true;
442417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            /* Configure fragments if we haven't.
443417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
444417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * Note it's a one-shot initialization, so we want to do this in {@link #onCreate}.
445417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
446417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * However, because this method may indirectly touch views in fragments but fragments
447417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * created in {@link #configureContentView} using a {@link FragmentTransaction} will NOT
448417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * have views until {@link Activity#onCreate} finishes (they would if they were inflated
449417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * from a layout), we need to do it here in {@link #onStart()}.
450417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
451417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * (When {@link Fragment#onCreateView} is called is different in the former case and
452417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * in the latter case, unfortunately.)
453417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
454417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * Also, we skip most of the work in it if the activity is a re-created one.
455417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * (so the argument.)
456417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             */
457417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            configureFragments(!mIsRecreatedInstance);
458be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        } else if (PhoneCapabilityTester.isUsingTwoPanes(this) && !mCurrentFilterIsValid) {
459be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // We only want to do the filter check in onStart for wide screen devices where it
460be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // is often possible to get into single contact mode. Only do this check if
461be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // the filter hasn't already been set properly (i.e. onCreate or onActivityResult).
462be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
463be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // Since there is only one {@link ContactListFilterController} across multiple
464be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // activity instances, make sure the filter controller is in sync withthe current
465be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // contact list fragment filter.
466be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // TODO: Clean this up. Perhaps change {@link ContactListFilterController} to not be a
467be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // singleton?
468be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            mContactListFilterController.setContactListFilter(mAllFragment.getFilter(), true);
469be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            mContactListFilterController.checkFilterValidity(true);
470be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            mCurrentFilterIsValid = true;
471417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
472417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        super.onStart();
4733c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov    }
4743c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
4756e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
476174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onPause() {
477fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mOptionsMenuContactsAvailable = false;
478fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
479fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mProviderStatus = -1;
4808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatusLoader.setProviderStatusListener(null);
481174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onPause();
482174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
483174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
484174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
485174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onResume() {
486174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onResume();
4878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatusLoader.setProviderStatusListener(this);
48805b1600927a903b833c3c31a85bd23449d41e535Makoto Onuki        showContactsUnavailableFragmentIfNecessary();
4894d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
4904d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // Re-register the listener, which may have been cleared when onSaveInstanceState was
4914d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // called.  See also: onSaveInstanceState
4924d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.setListener(this);
4932e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        if (mTabPager != null) {
4942e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(mTabPagerListener);
4952e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        }
496a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        // Current tab may have changed since the last onSaveInstanceState().  Make sure
497a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        // the actual contents match the tab.
498a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        updateFragmentsVisibility();
499174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
500174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
501174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
502be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    protected void onStop() {
503be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        super.onStop();
504be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mCurrentFilterIsValid = false;
505be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    }
506be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
507be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    @Override
5084d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    protected void onDestroy() {
509b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        // Some of variables will be null if this Activity redirects Intent.
510b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        // See also onCreate() or other methods called during the Activity's initialization.
511c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki        if (mActionBarAdapter != null) {
512c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki            mActionBarAdapter.setListener(null);
513c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki        }
514b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        if (mContactListFilterController != null) {
515b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa            mContactListFilterController.removeListener(this);
516b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        }
517b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa
5184d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        super.onDestroy();
5194d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
5204d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
521955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov    private void configureFragments(boolean fromRequest) {
522009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov        if (fromRequest) {
52391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            ContactListFilter filter = null;
52491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            int actionCode = mRequest.getActionCode();
52553b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki            boolean searchMode = mRequest.isSearchMode();
526ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki            TabState tabToOpen = null;
52791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            switch (actionCode) {
52891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_ALL_CONTACTS:
529be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
530be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                            ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
531ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
53291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
53391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
534be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
53591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                            ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
536ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
53791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
53891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
53991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_FREQUENT:
54091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STREQUENT:
54191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STARRED:
542ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.FAVORITES;
54391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
5449e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro                case ContactsRequest.ACTION_VIEW_CONTACT:
545ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    // We redirect this intent to the detail activity on 1-pane, so we don't get
546ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    // here.  It's only for 2-pane.
547ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
548ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    break;
549ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                case ContactsRequest.ACTION_GROUP:
550ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.GROUPS;
551ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    break;
552ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki            }
553ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki            if (tabToOpen != null) {
554ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                mActionBarAdapter.setCurrentTab(tabToOpen);
55591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            }
55691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
55791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            if (filter != null) {
55891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                mContactListFilterController.setContactListFilter(filter, false);
55953b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki                searchMode = false;
560009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov            }
561d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
562d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            if (mRequest.getContactUri() != null) {
56353b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki                searchMode = false;
564d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
565d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
56653b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki            mActionBarAdapter.setSearchMode(searchMode);
5670ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan            configureContactListFragmentForRequest();
568fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
569fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
5700ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        configureContactListFragment();
5710ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        configureGroupListFragment();
572fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
5738268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
5746e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
5756e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
5766e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
577d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void onContactListFilterChanged() {
57895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        if (mAllFragment == null || !mAllFragment.isAdded()) {
579d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov            return;
580d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov        }
581d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov
58295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
583e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
5848268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
5853ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov    }
5863ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov
587a6c2198bc5ad37119500c4857125ad732548c402Dmitri Plotnikov    private void setupContactDetailFragment(final Uri contactLookupUri) {
58858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        mContactDetailLoaderFragment.loadUri(contactLookupUri);
5898268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
590be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    }
591be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
592be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private void setupGroupDetailFragment(Uri groupUri) {
593be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        mGroupDetailFragment.loadGroup(groupUri);
5948268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
595c0ca13a86793082c8969e44c70d4dc8fb83eb1f8Dmitri Plotnikov    }
596c0ca13a86793082c8969e44c70d4dc8fb83eb1f8Dmitri Plotnikov
597fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    /**
598fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     * Handler for action bar actions.
599fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     */
600fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    @Override
601b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    public void onAction(Action action) {
602b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        switch (action) {
603b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case START_SEARCH_MODE:
604ff64220c681b48d54ff9cb3d82687fc53e2139e5Makoto Onuki                // Tell the fragments that we're in the search mode
605ff64220c681b48d54ff9cb3d82687fc53e2139e5Makoto Onuki                configureFragments(false /* from request */);
6064d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                updateFragmentsVisibility();
6078811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
608b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
609b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case STOP_SEARCH_MODE:
6101db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki                setQueryTextToFragment("");
6114d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                updateFragmentsVisibility();
6128811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
6138268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                break;
614b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case CHANGE_SEARCH_QUERY:
6151db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki                setQueryTextToFragment(mActionBarAdapter.getQueryString());
616b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
617b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            default:
618b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action);
619b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
620fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    }
621fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov
6224d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    @Override
6234d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    public void onSelectedTabChanged() {
6244d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        updateFragmentsVisibility();
6254d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
6264d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
6274d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    /**
6284d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     * Updates the fragment/view visibility according to the current mode, such as
6294d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     * {@link ActionBarAdapter#isSearchMode()} and {@link ActionBarAdapter#getCurrentTab()}.
6304d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     */
6314d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    private void updateFragmentsVisibility() {
6324d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        TabState tab = mActionBarAdapter.getCurrentTab();
6334d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
634250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        // We use ViewPager on 1-pane.
635250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        if (!PhoneCapabilityTester.isUsingTwoPanes(this)) {
636250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mActionBarAdapter.isSearchMode()) {
637250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mTabPagerAdapter.setSearchMode(true);
638250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
63941164239bf48685394b1aff7b807ea8983feda81Makoto Onuki                // No smooth scrolling if quitting from the search mode.
64041164239bf48685394b1aff7b807ea8983feda81Makoto Onuki                final boolean wasSearchMode = mTabPagerAdapter.isSearchMode();
641250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mTabPagerAdapter.setSearchMode(false);
642250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                int tabIndex = tab.ordinal();
643250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (mTabPager.getCurrentItem() != tabIndex) {
64441164239bf48685394b1aff7b807ea8983feda81Makoto Onuki                    mTabPager.setCurrentItem(tabIndex, !wasSearchMode);
645250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
646250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
6478811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki            invalidateOptionsMenu();
64866606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            showEmptyStateForTab(tab);
64966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            if (tab == TabState.GROUPS) {
6506f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                mGroupsFragment.setAddAccountsVisibility(!areGroupWritableAccountsAvailable());
65166606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            }
652250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return;
653250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
654250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
655250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        // for the tablet...
656250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
6574d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // If in search mode, we use the all list + contact details to show the result.
6584d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        if (mActionBarAdapter.isSearchMode()) {
6594d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki            tab = TabState.ALL;
6604d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
661250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        switch (tab) {
662250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            case FAVORITES:
663250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mFavoritesView.setVisibility(View.VISIBLE);
664250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mBrowserView.setVisibility(View.GONE);
665250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mDetailsView.setVisibility(View.GONE);
666250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                break;
667250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            case GROUPS:
66866606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                mFavoritesView.setVisibility(View.GONE);
66966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                mBrowserView.setVisibility(View.VISIBLE);
67066606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                mDetailsView.setVisibility(View.VISIBLE);
6716f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                mGroupsFragment.setAddAccountsVisibility(!areGroupWritableAccountsAvailable());
67266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                break;
673250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            case ALL:
674250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mFavoritesView.setVisibility(View.GONE);
675250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mBrowserView.setVisibility(View.VISIBLE);
676250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mDetailsView.setVisibility(View.VISIBLE);
677250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                break;
6784d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
6794d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        FragmentManager fragmentManager = getFragmentManager();
6804d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        FragmentTransaction ft = fragmentManager.beginTransaction();
6814d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
6829c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki        // Note mContactDetailLoaderFragment is an invisible fragment, but we still have to show/
6839c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki        // hide it so its options menu will be shown/hidden.
6844d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        switch (tab) {
6854d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki            case FAVORITES:
6864d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mFavoritesFragment);
6874d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mFrequentFragment);
6884d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mAllFragment);
6899c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki                hideFragment(ft, mContactDetailLoaderFragment);
6904d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mContactDetailFragment);
6914d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mGroupsFragment);
6924d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mGroupDetailFragment);
6934d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                break;
6944d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki            case ALL:
6954d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mFavoritesFragment);
6964d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mFrequentFragment);
6974d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mAllFragment);
6989c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki                showFragment(ft, mContactDetailLoaderFragment);
6994d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mContactDetailFragment);
7004d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mGroupsFragment);
7014d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mGroupDetailFragment);
7024d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                break;
7034d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki            case GROUPS:
7044d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mFavoritesFragment);
7054d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mFrequentFragment);
7064d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mAllFragment);
7079c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki                hideFragment(ft, mContactDetailLoaderFragment);
7084d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mContactDetailFragment);
7094d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mGroupsFragment);
7104d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mGroupDetailFragment);
7114d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                break;
7124d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
7134d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        if (!ft.isEmpty()) {
7144b25da79091157935042d2942a8961ceba92166fMinh Pham            ft.commitAllowingStateLoss();
7154d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki            fragmentManager.executePendingTransactions();
716a023ddd7788bc7cde35ca7bbeaf3edb99ff34441Makoto Onuki            // When switching tabs, we need to invalidate options menu, but executing a
717a023ddd7788bc7cde35ca7bbeaf3edb99ff34441Makoto Onuki            // fragment transaction does it implicitly.  We don't have to call invalidateOptionsMenu
718a023ddd7788bc7cde35ca7bbeaf3edb99ff34441Makoto Onuki            // manually.
7194d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
72066606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        showEmptyStateForTab(tab);
72166606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson    }
72266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson
72366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson    private void showEmptyStateForTab(TabState tab) {
72466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        if (mContactsUnavailableFragment != null) {
72566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            switch (tab) {
72666606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                case FAVORITES:
72766606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    mContactsUnavailableFragment.setMessageText(
728a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelson                            R.string.listTotalAllContactsZeroStarred, -1);
72966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
73066606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                case GROUPS:
731a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelson                    mContactsUnavailableFragment.setMessageText(R.string.noGroups,
7326f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                            areGroupWritableAccountsAvailable() ? -1 : R.string.noAccounts);
73366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
73466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                case ALL:
735a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelson                    mContactsUnavailableFragment.setMessageText(R.string.noContacts, -1);
73666606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
73766606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            }
73866606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        }
7394d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
7404d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
741250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private class TabPagerListener implements ViewPager.OnPageChangeListener {
742250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
743250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageScrollStateChanged(int state) {
744250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
745250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
746250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
747250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
748250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
749250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
750250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
751250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageSelected(int position) {
752250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            // Make sure not in the search mode, in which case position != TabState.ordinal().
753250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (!mTabPagerAdapter.isSearchMode()) {
75466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                TabState selectedTab = TabState.fromInt(position);
75566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                mActionBarAdapter.setCurrentTab(selectedTab, false);
75666606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                showEmptyStateForTab(selectedTab);
75766606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                if (selectedTab == TabState.GROUPS) {
7586f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                    mGroupsFragment.setAddAccountsVisibility(!areGroupWritableAccountsAvailable());
75966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                }
7608811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
761250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
762250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
763250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    }
764250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
765250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    /**
766250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * Adapter for the {@link ViewPager}.  Unlike {@link FragmentPagerAdapter},
767250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * {@link #instantiateItem} returns existing fragments, and {@link #instantiateItem}/
768250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * {@link #destroyItem} show/hide fragments instead of attaching/detaching.
769250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     *
770250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * In search mode, we always show the "all" fragment, and disable the swipe.  We change the
771250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * number of items to 1 to disable the swipe.
772250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     *
773250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * TODO figure out a more straight way to disable swipe.
774250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     */
775250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private class TabPagerAdapter extends PagerAdapter {
776250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private final FragmentManager mFragmentManager;
777250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private FragmentTransaction mCurTransaction = null;
778250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
779250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private boolean mTabPagerAdapterSearchMode;
780250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
781746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        private Fragment mCurrentPrimaryItem;
782746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
783250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public TabPagerAdapter() {
784250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mFragmentManager = getFragmentManager();
785250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
786250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
787250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public boolean isSearchMode() {
788250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return mTabPagerAdapterSearchMode;
789250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
790250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
791250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void setSearchMode(boolean searchMode) {
792250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (searchMode == mTabPagerAdapterSearchMode) {
793250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                return;
794250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
795250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mTabPagerAdapterSearchMode = searchMode;
796250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            notifyDataSetChanged();
797250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
798250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
799250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
800250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public int getCount() {
801250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return mTabPagerAdapterSearchMode ? 1 : TabState.values().length;
802250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
803250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
804250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        /** Gets called when the number of items changes. */
805250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
806250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public int getItemPosition(Object object) {
807250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mTabPagerAdapterSearchMode) {
808250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mAllFragment) {
809250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return 0; // Only 1 page in search mode
810250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
811250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
812250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mFavoritesFragment) {
813250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return TabState.FAVORITES.ordinal();
814250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
815250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mAllFragment) {
816250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return TabState.ALL.ordinal();
817250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
818250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mGroupsFragment) {
819250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return TabState.GROUPS.ordinal();
820250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
821250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
822250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return POSITION_NONE;
823250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
824250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
825250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
826250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void startUpdate(View container) {
827250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
828250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
829250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private Fragment getFragment(int position) {
830250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mTabPagerAdapterSearchMode) {
831250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (position == 0) {
832250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mAllFragment;
833250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
834250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
835250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (position == TabState.FAVORITES.ordinal()) {
836250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mFavoritesFragment;
837250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                } else if (position == TabState.ALL.ordinal()) {
838250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mAllFragment;
839250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                } else if (position == TabState.GROUPS.ordinal()) {
840250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mGroupsFragment;
841250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
842250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
843250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            throw new IllegalArgumentException("position: " + position);
844250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
845250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
846250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
847250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public Object instantiateItem(View container, int position) {
848250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction == null) {
849250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = mFragmentManager.beginTransaction();
850250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
851250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            Fragment f = getFragment(position);
852250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mCurTransaction.show(f);
853746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
8549bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell            // Non primary pages are not visible.
8559bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell            f.setUserVisibleHint(f == mCurrentPrimaryItem);
856250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return f;
857250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
858250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
859250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
860250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void destroyItem(View container, int position, Object object) {
861250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction == null) {
862250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = mFragmentManager.beginTransaction();
863250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
864250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mCurTransaction.hide((Fragment) object);
865250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
866250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
867250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
868250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void finishUpdate(View container) {
869250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction != null) {
8704b25da79091157935042d2942a8961ceba92166fMinh Pham                mCurTransaction.commitAllowingStateLoss();
871250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = null;
872250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mFragmentManager.executePendingTransactions();
873250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
874250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
875250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
876250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
877250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public boolean isViewFromObject(View view, Object object) {
878250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return ((Fragment) object).getView() == view;
879250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
880250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
881250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
882746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        public void setPrimaryItem(View container, int position, Object object) {
883746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            Fragment fragment = (Fragment) object;
884746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            if (mCurrentPrimaryItem != fragment) {
885746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                if (mCurrentPrimaryItem != null) {
8869bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell                    mCurrentPrimaryItem.setUserVisibleHint(false);
887746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                }
888746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                if (fragment != null) {
8899bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell                    fragment.setUserVisibleHint(true);
890746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                }
891746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                mCurrentPrimaryItem = fragment;
892746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            }
893746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        }
894746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
895746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        @Override
896250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public Parcelable saveState() {
897250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return null;
898250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
899250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
900250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
901250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void restoreState(Parcelable state, ClassLoader loader) {
902250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
903250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    }
904250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
9051db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki    private void setQueryTextToFragment(String query) {
90695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setQueryString(query, true);
9071db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki        mAllFragment.setVisibleScrollbarEnabled(!mAllFragment.isSearchMode());
9088268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    }
9098268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
9100ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragmentForRequest() {
911fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        Uri contactUri = mRequest.getContactUri();
912fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (contactUri != null) {
913e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan            // For an incoming request, explicitly require a selection if we are on 2-pane UI,
914e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan            // (i.e. even if we view the same selected contact, the contact may no longer be
915e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan            // in the list, so we must refresh the list).
916e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan            if (PhoneCapabilityTester.isUsingTwoPanes(this)) {
917e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan                mAllFragment.setSelectionRequired(true);
918e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan            }
91995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setSelectedContactUri(contactUri);
920fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
921238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
922a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
9231db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki        setQueryTextToFragment(mActionBarAdapter.getQueryString());
924238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
925fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mRequest.isDirectorySearchEnabled()) {
92695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
927fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        } else {
92895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
929fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
93008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
93108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
9320ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragment() {
933a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        // Filter may be changed when this Activity is in background.
934a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
935a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa
936553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki        final boolean useTwoPane = PhoneCapabilityTester.isUsingTwoPanes(this);
93795c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setVerticalScrollbarPosition(
938553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki                useTwoPane
9395245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov                        ? View.SCROLLBAR_POSITION_LEFT
9405245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov                        : View.SCROLLBAR_POSITION_RIGHT);
941553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki        mAllFragment.setSelectionVisible(useTwoPane);
942553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki        mAllFragment.setQuickContactEnabled(!useTwoPane);
9431ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
9441323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
9450ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureGroupListFragment() {
946553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki        final boolean useTwoPane = PhoneCapabilityTester.isUsingTwoPanes(this);
9470ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        mGroupsFragment.setVerticalScrollbarPosition(
948553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki                useTwoPane
9490ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan                        ? View.SCROLLBAR_POSITION_LEFT
9500ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan                        : View.SCROLLBAR_POSITION_RIGHT);
951553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki        mGroupsFragment.setSelectionVisible(useTwoPane);
9520ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    }
9530ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan
9548b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
9558b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public void onProviderStatusChange() {
95605b1600927a903b833c3c31a85bd23449d41e535Makoto Onuki        showContactsUnavailableFragmentIfNecessary();
9578b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
9588b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
95905b1600927a903b833c3c31a85bd23449d41e535Makoto Onuki    private void showContactsUnavailableFragmentIfNecessary() {
9608b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        int providerStatus = mProviderStatusLoader.getProviderStatus();
9618b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (providerStatus == mProviderStatus) {
9628b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return;
9638b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
9648b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
9658b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatus = providerStatus;
9668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
9678b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view);
9688b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View mainView = findViewById(R.id.main_view);
9698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
9708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (mProviderStatus == ProviderStatus.STATUS_NORMAL) {
971c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.GONE);
972b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mainView != null) {
973b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mainView.setVisibility(View.VISIBLE);
974b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
97595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            if (mAllFragment != null) {
97695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                mAllFragment.setEnabled(true);
9778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
9788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        } else {
979aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // If there are no accounts on the device and we should show the "no account" prompt
980aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // (based on {@link SharedPreferences}), then launch the account setup activity so the
981aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // user can sign-in or create an account.
9826f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki            if (!areContactWritableAccountsAvailable() &&
9836f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                    AccountPromptUtils.shouldShowAccountPrompt(this)) {
984aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan                AccountPromptUtils.launchAccountPrompt(this);
985aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan                return;
986aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            }
987aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan
988aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // Otherwise, continue setting up the page so that the user can still use the app
989aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // without an account.
99095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            if (mAllFragment != null) {
99195c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                mAllFragment.setEnabled(false);
9928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
9938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mContactsUnavailableFragment == null) {
9948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment = new ContactsUnavailableFragment();
9958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.setProviderStatusLoader(mProviderStatusLoader);
9968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
9978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        new ContactsUnavailableFragmentListener());
9983ed426c842a68895a759548fef87bac359f937bbDianne Hackborn                getFragmentManager().beginTransaction()
9998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
10004b25da79091157935042d2942a8961ceba92166fMinh Pham                        .commitAllowingStateLoss();
10018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            } else {
10028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.update();
10038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
10048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.VISIBLE);
1005b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mainView != null) {
1006b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mainView.setVisibility(View.INVISIBLE);
1007b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
100866606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson
100966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            TabState tab = mActionBarAdapter.getCurrentTab();
101048b526d9f63df121e1ee54188cc860732056c53dIsaac Katzenelson            showEmptyStateForTab(tab);
10118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
10128b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10138268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
10148b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
10158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10161ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
1017d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
1018e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
1019d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onSelectionChange() {
1020553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki            if (PhoneCapabilityTester.isUsingTwoPanes(PeopleActivity.this)) {
102195c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                setupContactDetailFragment(mAllFragment.getSelectedContactUri());
1022d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
1023d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
1024e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov
1025d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        @Override
1026d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onViewContactAction(Uri contactLookupUri) {
1027553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki            if (PhoneCapabilityTester.isUsingTwoPanes(PeopleActivity.this)) {
1028d364314c460152db7089b304beec81b3675893baDmitri Plotnikov                setupContactDetailFragment(contactLookupUri);
1029424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov            } else {
1030d8a61b7296bf7388505f0211d7ef44700e766193Katherine Kuan                Intent intent = new Intent(Intent.ACTION_VIEW, contactLookupUri);
1031d8a61b7296bf7388505f0211d7ef44700e766193Katherine Kuan                // In search mode, the "up" affordance in the contact detail page should return the
10325c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                // user to the search results, so finish the activity when that button is selected.
1033d8a61b7296bf7388505f0211d7ef44700e766193Katherine Kuan                if (mActionBarAdapter.isSearchMode()) {
10345c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    intent.putExtra(
10355c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                            ContactDetailActivity.INTENT_KEY_FINISH_ACTIVITY_ON_UP_SELECTED, true);
1036d8a61b7296bf7388505f0211d7ef44700e766193Katherine Kuan                }
1037d8a61b7296bf7388505f0211d7ef44700e766193Katherine Kuan                startActivity(intent);
1038424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov            }
10391ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
1040e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
1041e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
10421ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onCreateNewContactAction() {
10431ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
10441ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            Bundle extras = getIntent().getExtras();
10451ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            if (extras != null) {
10461ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov                intent.putExtras(extras);
1047416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov            }
10481ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            startActivity(intent);
10491ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
1050416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
1051e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
10521ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onEditContactAction(Uri contactLookupUri) {
1053e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
1054e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            Bundle extras = getIntent().getExtras();
1055e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            if (extras != null) {
1056e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann                intent.putExtras(extras);
10571ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            }
10585c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            intent.putExtra(
10595c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    ContactEditorActivity.INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
10605c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT);
10611ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
1062413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov
1063e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
10641ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onAddToFavoritesAction(Uri contactUri) {
10651ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            ContentValues values = new ContentValues(1);
10661ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            values.put(Contacts.STARRED, 1);
10671ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            getContentResolver().update(contactUri, values, null, null);
10681ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
10698a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
1070e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
10711ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onRemoveFromFavoritesAction(Uri contactUri) {
10721ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            ContentValues values = new ContentValues(1);
10731ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            values.put(Contacts.STARRED, 0);
10741ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            getContentResolver().update(contactUri, values, null, null);
10751ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
1076416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
1077e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
10781ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onCallContactAction(Uri contactUri) {
1079b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa            PhoneNumberInteraction.startInteractionForPhoneCall(PeopleActivity.this, contactUri);
10801ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
1081416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
1082e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
10831ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onSmsContactAction(Uri contactUri) {
1084b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa            PhoneNumberInteraction.startInteractionForTextMessage(PeopleActivity.this, contactUri);
10851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
1086e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
1087e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
10881ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onDeleteContactAction(Uri contactUri) {
10899856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
10901ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
10918a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
1092e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
10931ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onFinishAction() {
10941ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            onBackPressed();
10951ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
10966e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
10976e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        @Override
10986e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        public void onInvalidSelection() {
1099b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            ContactListFilter filter;
1100b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            ContactListFilter currentFilter = mAllFragment.getFilter();
1101b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            if (currentFilter != null
1102b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                    && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
1103b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                filter = ContactListFilter.createFilterWithType(
1104b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
1105b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                mAllFragment.setFilter(filter);
1106b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            } else {
1107b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                filter = ContactListFilter.createFilterWithType(
1108b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                        ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
1109b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                mAllFragment.setFilter(filter, false);
1110b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            }
1111d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mContactListFilterController.setContactListFilter(filter, true);
11126e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        }
11131ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
1114416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
111558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private class ContactDetailLoaderFragmentListener implements ContactLoaderFragmentListener {
111669e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
1117424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onContactNotFound() {
1118d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            // Nothing needs to be done here
1119424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
1120424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
112169e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
112258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        public void onDetailsLoaded(final ContactLoader.Result result) {
112358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            if (result == null) {
1124050c3893fadaf6d02951a3fe29684f4cd94fa9c9Daisuke Miyakawa                // Nothing is loaded. Show empty state.
1125050c3893fadaf6d02951a3fe29684f4cd94fa9c9Daisuke Miyakawa                mContactDetailLayoutController.showEmptyState();
112658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                return;
112758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            }
112858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            // Since {@link FragmentTransaction}s cannot be done in the onLoadFinished() of the
112958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            // {@link LoaderCallbacks}, then post this {@link Runnable} to the {@link Handler}
113058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            // on the main thread to execute later.
113158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            mHandler.post(new Runnable() {
113258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                @Override
113358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                public void run() {
1134bed71bedbaae4d6b26b2b64db476bffa710753e5Makoto Onuki                    // If the activity is destroyed (or will be destroyed soon), don't update the UI
1135bed71bedbaae4d6b26b2b64db476bffa710753e5Makoto Onuki                    if (isFinishing()) {
113693f625d8f2825575b4f63f4cf78ecbb7b56354ebKatherine Kuan                        return;
113793f625d8f2825575b4f63f4cf78ecbb7b56354ebKatherine Kuan                    }
113858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                    mContactDetailLayoutController.setContactData(result);
113958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                }
114058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            });
114158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        }
114258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
114358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        @Override
1144424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onEditRequested(Uri contactLookupUri) {
11455c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
11465c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            intent.putExtra(
11475c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    ContactEditorActivity.INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
11485c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT);
1149424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
1150424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
115169e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
115258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        public void onDeleteRequested(Uri contactUri) {
115358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
115458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        }
115558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    }
115658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
115758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    public class ContactDetailFragmentListener implements ContactDetailFragment.Listener {
115858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        @Override
1159424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onItemClicked(Intent intent) {
116008bcf715d5ea7f07ce18a282d9850ac70552ca9dKatherine Kuan            if (intent == null) {
116108bcf715d5ea7f07ce18a282d9850ac70552ca9dKatherine Kuan                return;
116208bcf715d5ea7f07ce18a282d9850ac70552ca9dKatherine Kuan            }
116360be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            try {
116460be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann                startActivity(intent);
116560be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            } catch (ActivityNotFoundException e) {
116660be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann                Log.e(TAG, "No activity found for intent: " + intent);
116760be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            }
1168424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
1169424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
117069e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
11712b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro        public void onCreateRawContactRequested(ArrayList<ContentValues> values,
11722b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro                AccountWithDataSet account) {
11739856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            Toast.makeText(PeopleActivity.this, R.string.toast_making_personal_copy,
1174caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov                    Toast.LENGTH_LONG).show();
1175caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov            Intent serviceIntent = ContactSaveService.createNewRawContactIntent(
11769856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan                    PeopleActivity.this, values, account,
11779856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan                    PeopleActivity.class, Intent.ACTION_VIEW);
1178caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov            startService(serviceIntent);
1179caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov        }
1180424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov    }
1181424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
11828b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private class ContactsUnavailableFragmentListener
11838b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            implements OnContactsUnavailableActionListener {
11848b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
11858b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
11868b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onCreateNewContactAction() {
11878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
11888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
11898b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
11908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
11918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onAddAccountAction() {
11928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT);
11931fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
11948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            intent.putExtra(Settings.EXTRA_AUTHORITIES,
11958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new String[] { ContactsContract.AUTHORITY });
11968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(intent);
11978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
11988b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
11998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
12008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onImportContactsFromFileAction() {
1201477366ac89828fcf85a94d63b76cda754a85d2ceKatherine Kuan            ImportExportDialogFragment.show(getFragmentManager());
12028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
12038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
12048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
12058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onFreeInternalStorageAction() {
12068b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS));
12078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
12088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
12098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1210ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    private final class StrequentContactListFragmentListener
12117979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro            implements ContactTileListFragment.Listener {
1212ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        @Override
12137a700cf798a19a8452b8671f643a05336f63f611Katherine Kuan        public void onContactSelected(Uri contactUri, Rect targetRect) {
1214553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki            if (PhoneCapabilityTester.isUsingTwoPanes(PeopleActivity.this)) {
12157a700cf798a19a8452b8671f643a05336f63f611Katherine Kuan                QuickContact.showQuickContact(PeopleActivity.this, targetRect, contactUri, 0, null);
1216ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            } else {
1217ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa                startActivity(new Intent(Intent.ACTION_VIEW, contactUri));
1218ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            }
1219ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        }
1220ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    }
1221ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
1222be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private final class GroupBrowserActionListener implements OnGroupBrowserActionListener {
1223be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
1224be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        @Override
1225be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        public void onViewGroupAction(Uri groupUri) {
1226553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki            if (PhoneCapabilityTester.isUsingTwoPanes(PeopleActivity.this)) {
1227be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                setupGroupDetailFragment(groupUri);
1228be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            } else {
1229be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                Intent intent = new Intent(PeopleActivity.this, GroupDetailActivity.class);
1230be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                intent.setData(groupUri);
1231be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                startActivity(intent);
1232be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            }
1233be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        }
1234be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    }
1235be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
1236c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    private class GroupDetailFragmentListener implements GroupDetailFragment.Listener {
1237c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        @Override
1238c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        public void onGroupSizeUpdated(String size) {
1239c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // Nothing needs to be done here because the size will be displayed in the detail
1240c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // fragment
1241c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        }
1242c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
1243c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        @Override
1244c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        public void onGroupTitleUpdated(String title) {
1245c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // Nothing needs to be done here because the title will be displayed in the detail
1246c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // fragment
1247c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        }
1248c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
1249c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        @Override
1250d78ee90c0d4d93b82ad440396e87ae4f47f53e93Daniel Lehmann        public void onAccountTypeUpdated(String accountTypeString, String dataSet) {
1251703cda7119b710446f7abc38843043b7cbbf3a47Katherine Kuan            // Nothing needs to be done here because the group source will be displayed in the
1252703cda7119b710446f7abc38843043b7cbbf3a47Katherine Kuan            // detail fragment
1253703cda7119b710446f7abc38843043b7cbbf3a47Katherine Kuan        }
1254703cda7119b710446f7abc38843043b7cbbf3a47Katherine Kuan
1255703cda7119b710446f7abc38843043b7cbbf3a47Katherine Kuan        @Override
1256c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        public void onEditRequested(Uri groupUri) {
1257c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            final Intent intent = new Intent(PeopleActivity.this, GroupEditorActivity.class);
1258c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            intent.setData(groupUri);
1259c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            intent.setAction(Intent.ACTION_EDIT);
1260c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            startActivityForResult(intent, SUBACTIVITY_EDIT_GROUP);
1261c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        }
12624e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro
12634e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro        @Override
12644e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro        public void onContactSelected(Uri contactUri) {
12654e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro            // Nothing needs to be done here because either quickcontact will be displayed
12664e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro            // or activity will take care of selection
12674e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro        }
1268c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    }
1269c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
1270732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    public void startActivityAndForwardResult(final Intent intent) {
1271732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
1272732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
1273732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        // Forward extras to the new activity
1274732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        Bundle extras = getIntent().getExtras();
1275732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        if (extras != null) {
1276732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov            intent.putExtras(extras);
1277732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        }
1278732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        startActivity(intent);
1279732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        finish();
1280732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
1281732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
12827aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
12837aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
1284946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki        if (!areContactsAvailable()) {
1285946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki            // If contacts aren't available, hide all menu items.
1286946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki            return false;
1287946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki        }
1288d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        super.onCreateOptionsMenu(menu);
1289d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey
1290d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        MenuInflater inflater = getMenuInflater();
1291b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        inflater.inflate(R.menu.actions, menu);
1292971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
1293971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        // On narrow screens we specify a NEW group button in the {@link ActionBar}, so that
1294971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        // it can be in the overflow menu. On wide screens, we use a custom view because we need
1295971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        // its location for anchoring the account-selector popup.
1296971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        final MenuItem addGroup = menu.findItem(R.id.menu_custom_add_group);
1297971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        if (addGroup != null) {
1298971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            mAddGroupImageView = getLayoutInflater().inflate(
1299971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                    R.layout.add_group_menu_item, null, false);
1300e1316f0168f27107f46fa0161a2e9b9baac66f05Katherine Kuan            mAddGroupImageView.setOnClickListener(new OnClickListener() {
1301971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                @Override
1302971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                public void onClick(View v) {
1303971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                    createNewGroupWithAccountDisambiguation();
1304971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                }
1305971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            });
1306971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            addGroup.setActionView(mAddGroupImageView);
1307971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        }
1308b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        return true;
1309d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    }
13107aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
13118268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    private void invalidateOptionsMenuIfNeeded() {
13120cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (isOptionsMenuChanged()) {
13138268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            invalidateOptionsMenu();
13140cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
13150cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
13160cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
13170cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    public boolean isOptionsMenuChanged() {
13180cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (mOptionsMenuContactsAvailable != areContactsAvailable()) {
13190cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
13200cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
13210cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
132295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        if (mAllFragment != null && mAllFragment.isOptionsMenuChanged()) {
13230cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
13240cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
13250cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
132658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        if (mContactDetailLoaderFragment != null &&
132758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                mContactDetailLoaderFragment.isOptionsMenuChanged()) {
13280cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
13290cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
13300cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
13318268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        if (mGroupDetailFragment != null && mGroupDetailFragment.isOptionsMenuChanged()) {
13320cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
13330cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
13340cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
13350cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        return false;
13360cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
13370cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
13380cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    @Override
1339d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    public boolean onPrepareOptionsMenu(Menu menu) {
13400cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        mOptionsMenuContactsAvailable = areContactsAvailable();
13410cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (!mOptionsMenuContactsAvailable) {
13428b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
13438b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
13448b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1345971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        final MenuItem addContactMenu = menu.findItem(R.id.menu_add_contact);
1346789bc596877861da26ca862c699a269783d8d42aIsaac Katzenelson        final MenuItem contactsFilterMenu = menu.findItem(R.id.menu_contacts_filter);
1347789bc596877861da26ca862c699a269783d8d42aIsaac Katzenelson
1348971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        MenuItem addGroupMenu = menu.findItem(R.id.menu_add_group);
1349971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        if (addGroupMenu == null) {
1350971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            addGroupMenu = menu.findItem(R.id.menu_custom_add_group);
1351971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        }
1352e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
1353af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        final boolean isSearchMode = mActionBarAdapter.isSearchMode();
1354af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        if (isSearchMode) {
13558268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            addContactMenu.setVisible(false);
13568268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            addGroupMenu.setVisible(false);
1357683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson            contactsFilterMenu.setVisible(false);
13588268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        } else {
13594d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki            switch (mActionBarAdapter.getCurrentTab()) {
13608268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                case FAVORITES:
1361683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    addContactMenu.setVisible(false);
1362683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    addGroupMenu.setVisible(false);
1363683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    contactsFilterMenu.setVisible(false);
1364683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    break;
13656e6c24190257fd77d99b4ab385501795537f6effDaniel Lehmann                case ALL:
13668268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    addContactMenu.setVisible(true);
13678268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    addGroupMenu.setVisible(false);
1368683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    contactsFilterMenu.setVisible(true);
13698268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    break;
13708268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                case GROUPS:
137149917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson                    // Do not display the "new group" button if no accounts are available
13726f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                    if (areGroupWritableAccountsAvailable()) {
137349917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson                        addGroupMenu.setVisible(true);
137449917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson                    } else {
137549917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson                        addGroupMenu.setVisible(false);
137649917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson                    }
13778268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    addContactMenu.setVisible(false);
1378683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    contactsFilterMenu.setVisible(false);
13798268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    break;
13808268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            }
1381e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        }
1382af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        final boolean showMiscOptions = !isSearchMode;
1383af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_search, showMiscOptions);
1384af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_import_export, showMiscOptions);
1385af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_accounts, showMiscOptions);
1386af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_settings,
1387af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki                showMiscOptions && !ContactsPreferenceActivity.isEmpty(this));
1388e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
1389d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        return true;
13907aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
13917aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
1392af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki    private void makeMenuItemVisible(Menu menu, int itemId, boolean visible) {
1393af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        MenuItem item =menu.findItem(itemId);
1394af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        if (item != null) {
1395af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki            item.setVisible(visible);
1396af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        }
1397af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki    }
1398af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki
13997aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
14007aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
14017aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (item.getItemId()) {
1402e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki            case android.R.id.home: {
1403e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                // The home icon on the action bar is pressed
1404e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                if (mActionBarAdapter.isUpShowing()) {
1405e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                    // "UP" icon press -- should be treated as "back".
1406e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                    onBackPressed();
1407e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                }
1408e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                return true;
1409e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki            }
1410c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov            case R.id.menu_settings: {
1411c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov                final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
1412edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                // as there is only one section right now, make sure it is selected
1413edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                // on small screens, this also hides the section selector
1414edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                // Due to b/5045558, this code unfortunately only works properly on phones
1415edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                boolean settingsAreMultiPane = getResources().getBoolean(
1416edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                        com.android.internal.R.bool.preferences_prefer_dual_pane);
1417edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                if (!settingsAreMultiPane) {
1418edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                    intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT,
1419edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                            DisplayOptionsPreferenceFragment.class.getName());
1420edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                    intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_TITLE,
1421edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                            R.string.preference_displayOptions);
1422edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                }
1423c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann                startActivity(intent);
14247aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1425d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
1426b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case R.id.menu_contacts_filter: {
142734b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                AccountFilterUtil.startAccountFilterActivityForResult(this,
142834b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                        SUBACTIVITY_ACCOUNT_FILTER);
1429b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                return true;
1430b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
1431d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_search: {
14328e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov                onSearchRequested();
14337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1434d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
14358268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            case R.id.menu_add_contact: {
1436d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
14375c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                // On 2-pane UI, we can let the editor activity finish itself and return
14385c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                // to this activity to display the new contact.
14395c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                if (PhoneCapabilityTester.isUsingTwoPanes(this)) {
14405c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    intent.putExtra(
14415c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                        ContactEditorActivity.INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
14425c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    startActivityForResult(intent, SUBACTIVITY_NEW_CONTACT);
14435c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                } else {
14445c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    // Otherwise, on 1-pane UI, we need the editor to launch the view contact
14455c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    // intent itself.
14465c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    startActivity(intent);
14475c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                }
1448d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1449d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
14508268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            case R.id.menu_add_group: {
1451971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                createNewGroupWithAccountDisambiguation();
14528268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                return true;
14538268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            }
145449d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey            case R.id.menu_import_export: {
1455261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmann                ImportExportDialogFragment.show(getFragmentManager());
1456d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1457d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
1458d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_accounts: {
1459d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
1460fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov                intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
1461d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                    ContactsContract.AUTHORITY
1462d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                });
14631fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
1464d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                startActivity(intent);
1465d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1466d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
14677aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
14687aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return false;
14697aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
14707aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
1471971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan    private void createNewGroupWithAccountDisambiguation() {
14722b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro        final List<AccountWithDataSet> accounts =
1473971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                AccountTypeManager.getInstance(this).getAccounts(true);
1474971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        if (accounts.size() <= 1 || mAddGroupImageView == null) {
1475971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            // No account to choose or no control to anchor the popup-menu to
1476971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            // ==> just go straight to the editor which will disambig if necessary
1477971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            final Intent intent = new Intent(this, GroupEditorActivity.class);
1478971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            intent.setAction(Intent.ACTION_INSERT);
1479971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            startActivityForResult(intent, SUBACTIVITY_NEW_GROUP);
1480971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            return;
1481971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        }
1482971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
1483971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        final ListPopupWindow popup = new ListPopupWindow(this, null);
1484971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.setWidth(getResources().getDimensionPixelSize(R.dimen.account_selector_popup_width));
1485971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.setAnchorView(mAddGroupImageView);
1486971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        // Create a list adapter with all writeable accounts (assume that the writeable accounts all
1487971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        // allow group creation).
14886f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki        final AccountsListAdapter adapter = new AccountsListAdapter(this,
14896f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                AccountListFilter.ACCOUNTS_GROUP_WRITABLE);
1490971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.setAdapter(adapter);
1491971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.setOnItemClickListener(new OnItemClickListener() {
1492971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            @Override
1493971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
1494971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                popup.dismiss();
14952b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro                AccountWithDataSet account = adapter.getItem(position);
1496971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                final Intent intent = new Intent(PeopleActivity.this, GroupEditorActivity.class);
1497971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                intent.setAction(Intent.ACTION_INSERT);
14982b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro                intent.putExtra(Intents.Insert.ACCOUNT, account);
14992b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro                intent.putExtra(Intents.Insert.DATA_SET, account.dataSet);
1500971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan                startActivityForResult(intent, SUBACTIVITY_NEW_GROUP);
1501971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan            }
1502971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        });
1503971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.setModal(true);
1504971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        popup.show();
1505971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan    }
1506971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
15078e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov    @Override
150853b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki    public boolean onSearchRequested() { // Search key pressed.
150953b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        mActionBarAdapter.setSearchMode(true);
151053b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        return true;
1511db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov    }
1512db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
151349d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey    @Override
1514d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
1515d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        switch (requestCode) {
151634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa            case SUBACTIVITY_ACCOUNT_FILTER: {
151734b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                AccountFilterUtil.handleAccountFilterResult(
151834b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                        mContactListFilterController, resultCode, data);
1519495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan                break;
1520495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            }
1521d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
15225c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            case SUBACTIVITY_NEW_CONTACT:
15235c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            case SUBACTIVITY_EDIT_CONTACT: {
15245c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                if (resultCode == RESULT_OK && PhoneCapabilityTester.isUsingTwoPanes(this)) {
15255c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
1526e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan                    mAllFragment.setSelectionRequired(true);
15275c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    mAllFragment.reloadDataAndSetSelectedUri(data.getData());
15285c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    // Suppress IME if in search mode
15295c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    if (mActionBarAdapter != null) {
15305c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                        mActionBarAdapter.clearFocusOnSearchView();
15315c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    }
1532be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan                    // No need to change the contact filter
1533be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan                    mCurrentFilterIsValid = true;
15345c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                }
15355c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                break;
15365c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            }
15375c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan
1538c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            case SUBACTIVITY_NEW_GROUP:
1539c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            case SUBACTIVITY_EDIT_GROUP: {
1540553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki                if (resultCode == RESULT_OK && PhoneCapabilityTester.isUsingTwoPanes(this)) {
1541c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                    mRequest.setActionCode(ContactsRequest.ACTION_GROUP);
1542c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                    mGroupsFragment.setSelectedUri(data.getData());
1543c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                }
1544c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                break;
1545c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            }
1546c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
15477aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
15487aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // anymore
1549e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
1550d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                if (resultCode == RESULT_OK) {
155195c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                    mAllFragment.onPickerResult(data);
1552d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                }
1553d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
1554d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code
1555d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov//                else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
15561ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // Finish the activity if the sub activity was canceled as back key is used
15571ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
15581ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    finish();
15591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
15601ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
1561d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        }
1562d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    }
15637aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
15647aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
15657aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
15661ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
15677aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (keyCode) {
15681ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            case KeyEvent.KEYCODE_CALL: {
15691ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                if (callSelection()) {
15701ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    return true;
15711ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
15721ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
15731ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            }
1574db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
15757aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            case KeyEvent.KEYCODE_DEL: {
15766c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov                if (deleteSelection()) {
15777aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                    return true;
15787aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                }
15797aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                break;
15807aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            }
15817bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            default: {
15827bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                // Bring up the search UI if the user starts typing
15837bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                final int unicodeChar = event.getUnicodeChar();
15844f3aa85131e16594fef22ca60439f4320016767fDaniel Lehmann                if (unicodeChar != 0 && !Character.isWhitespace(unicodeChar)) {
15857bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    String query = new String(new int[]{ unicodeChar }, 0, 1);
1586b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    if (!mActionBarAdapter.isSearchMode()) {
1587b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        mActionBarAdapter.setQueryString(query);
1588b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        mActionBarAdapter.setSearchMode(true);
1589b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        return true;
15907bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    }
15917bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                }
15927bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            }
15937aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
15947aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
15957aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return super.onKeyDown(keyCode, event);
15967aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
1597ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov
1598ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    @Override
1599ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    public void onBackPressed() {
160053b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        if (mActionBarAdapter.isSearchMode()) {
1601ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            mActionBarAdapter.setSearchMode(false);
1602ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        } else {
1603ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            super.onBackPressed();
1604ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        }
1605ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    }
16067aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
16076c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov    private boolean deleteSelection() {
16081ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
16091ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//        if (mActionCode == ContactsRequest.ACTION_DEFAULT) {
16101ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            final int position = mListView.getSelectedItemPosition();
16111ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            if (position != ListView.INVALID_POSITION) {
16121ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                Uri contactUri = getContactUri(position);
16131ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                if (contactUri != null) {
16141ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    doContactDelete(contactUri);
16151ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    return true;
16161ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
16171ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            }
16181ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//        }
16196c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov        return false;
16206c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov    }
16216c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov
162208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
162308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onSaveInstanceState(Bundle outState) {
162408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onSaveInstanceState(outState);
16254d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.onSaveInstanceState(outState);
162658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        if (mContactDetailLayoutController != null) {
162758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            mContactDetailLayoutController.onSaveInstanceState(outState);
162858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        }
16294d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
16304d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // Clear the listener to make sure we don't get callbacks after onSaveInstanceState,
16314d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // in order to avoid doing fragment transactions after it.
16324d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // TODO Figure out a better way to deal with the issue.
16334d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.setListener(null);
16342e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        if (mTabPager != null) {
16352e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(null);
16362e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        }
163708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
163808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
1639fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
16403391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    public DialogManager getDialogManager() {
16413391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann        return mDialogManager;
16423391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    }
1643ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
1644ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    // Visible for testing
1645ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    public ContactBrowseListFragment getListFragment() {
164695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        return mAllFragment;
1647ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    }
1648ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
1649ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    // Visible for testing
1650ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    public ContactDetailFragment getDetailFragment() {
1651be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        return mContactDetailFragment;
1652ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    }
16537aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project}
1654