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
19e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.Fragment;
20e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.FragmentManager;
21e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.FragmentTransaction;
22e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.content.ActivityNotFoundException;
23e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.content.ContentValues;
24e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.content.Intent;
25e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.graphics.Rect;
26e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.net.Uri;
27e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Bundle;
28e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Handler;
29e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Parcelable;
309f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Chengimport android.os.UserManager;
31e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.preference.PreferenceActivity;
32e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract;
33e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.Contacts;
34e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.ProviderStatus;
35e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.QuickContact;
36e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.Settings;
37e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v13.app.FragmentPagerAdapter;
38e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.PagerAdapter;
39e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.ViewPager;
407d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport android.text.TextUtils;
41e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.util.Log;
42e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyCharacterMap;
43e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyEvent;
44e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.Menu;
45e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuInflater;
46e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuItem;
47e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuItem.OnMenuItemClickListener;
48e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.View;
49e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.ViewGroup;
50e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.widget.Toast;
51e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
5218ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.ContactSaveService;
536f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikovimport com.android.contacts.ContactsActivity;
54a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelsonimport com.android.contacts.ContactsUtils;
5527834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R;
564d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onukiimport com.android.contacts.activities.ActionBarAdapter.TabState;
5718ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.detail.ContactDetailFragment;
5858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.detail.ContactDetailLayoutController;
5958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.detail.ContactDetailUpdatesFragment;
6058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.detail.ContactLoaderFragment;
6158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuanimport com.android.contacts.detail.ContactLoaderFragment.ContactLoaderFragmentListener;
62c8dd78c595cfaf9766e59a2df012b16d6c05b213Chiao Chengimport com.android.contacts.common.dialog.ClearFrequentsDialog;
63b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.group.GroupBrowseListFragment;
64be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuanimport com.android.contacts.group.GroupBrowseListFragment.OnGroupBrowserActionListener;
65be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuanimport com.android.contacts.group.GroupDetailFragment;
669692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikovimport com.android.contacts.interactions.ContactDeletionInteraction;
67051f41d0e2e23fa3acd9258ffc91a60cdbe828ecChiao Chengimport com.android.contacts.common.interactions.ImportExportDialogFragment;
6808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactBrowseListFragment;
69821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment;
70a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListFilter;
710d5588da244d0992c3ff8f25d0875fdf95a8c644Chiao Chengimport com.android.contacts.common.list.ContactListFilterController;
72e776d0366d5bf2f93a0cd0f14e48804e564bccf2Chiao Chengimport com.android.contacts.common.list.ContactTileAdapter.DisplayType;
73f7689c377caba183daa41856d01a8c1a2f7ba811Katherine Kuanimport com.android.contacts.list.ContactTileFrequentFragment;
74d78ee90c0d4d93b82ad440396e87ae4f47f53e93Daniel Lehmannimport com.android.contacts.list.ContactTileListFragment;
750906ee326a5553a224eb7b004536f35b340bdcd3Dmitri Plotnikovimport com.android.contacts.list.ContactsIntentResolver;
761ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikovimport com.android.contacts.list.ContactsRequest;
778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ContactsUnavailableFragment;
78b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.list.DefaultContactBrowseListFragment;
79a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.DirectoryListLoader;
80732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport com.android.contacts.list.OnContactBrowserActionListener;
818b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.OnContactsUnavailableActionListener;
82c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher;
83c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener;
84851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.Contact;
85428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.account.AccountWithDataSet;
86c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikovimport com.android.contacts.preference.ContactsPreferenceActivity;
87edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmannimport com.android.contacts.preference.DisplayOptionsPreferenceFragment;
8830868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.util.AccountFilterUtil;
89aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuanimport com.android.contacts.util.AccountPromptUtils;
90d9eab4da8b9946b76a2091e5cce6c858663ef1bbChiao Chengimport com.android.contacts.common.util.Constants;
913391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager;
9270f77ea66f8c842902401d0960dd432d66d38d9eChiao Chengimport com.android.contacts.util.HelpUtils;
93553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onukiimport com.android.contacts.util.PhoneCapabilityTester;
9479a6b5d3a885bc508b4b98c92a946fe12643c444Chiao Chengimport com.android.contacts.common.util.UriUtils;
952f41fe6bcc8d055bf53ad070425552fad57dff21Daniel Lehmannimport com.android.contacts.widget.TransitionAnimationView;
9657cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka
97caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikovimport java.util.ArrayList;
987d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport java.util.Locale;
996d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onukiimport java.util.concurrent.atomic.AtomicInteger;
100caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
1017aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/**
102bd772a5bfd907f3b14589a07378fb26dfd924d93Daniel Lehmann * Displays a list to browse contacts. For xlarge screens, this also displays a detail-pane on
103a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov * the right.
1047aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */
1059856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuanpublic class PeopleActivity extends ContactsActivity
106fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        implements View.OnCreateContextMenuListener, ActionBarAdapter.Listener,
1076e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        DialogManager.DialogShowingViewActivity,
1088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        ContactListFilterController.ContactListFilterListener, ProviderStatusListener {
10957d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov
1105e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro    private static final String TAG = "PeopleActivity";
1117aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
1122a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann    /** Shows a toogle button for hiding/showing updates. Don't submit with true */
1132a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann    private static final boolean DEBUG_TRANSITIONS = false;
1142a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann
115d7b32b6f1293362d1ca186a99a2cc80791a291deYorke Lee    private static final int TAB_FADE_IN_DURATION = 500;
116d7b32b6f1293362d1ca186a99a2cc80791a291deYorke Lee
1179ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!";
1189ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
1195c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    // These values needs to start at 2. See {@link ContactEntryListFragment}.
1205c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    private static final int SUBACTIVITY_NEW_CONTACT = 2;
1215c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    private static final int SUBACTIVITY_EDIT_CONTACT = 3;
1225c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    private static final int SUBACTIVITY_NEW_GROUP = 4;
1235c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    private static final int SUBACTIVITY_EDIT_GROUP = 5;
1245c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    private static final int SUBACTIVITY_ACCOUNT_FILTER = 6;
125c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
12634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa    private final DialogManager mDialogManager = new DialogManager(this);
1273391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann
128ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov    private ContactsIntentResolver mIntentResolver;
129fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ContactsRequest mRequest;
130caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov
131fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ActionBarAdapter mActionBarAdapter;
1327c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov
133be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private ContactDetailFragment mContactDetailFragment;
13458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
13558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private ContactLoaderFragment mContactDetailLoaderFragment;
13658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private final ContactDetailLoaderFragmentListener mContactDetailLoaderFragmentListener =
13758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            new ContactDetailLoaderFragmentListener();
138be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
139be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private GroupDetailFragment mGroupDetailFragment;
14058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private final GroupDetailFragmentListener mGroupDetailFragmentListener =
14158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            new GroupDetailFragmentListener();
142424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
1437979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro    private ContactTileListFragment.Listener mFavoritesFragmentListener =
144ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            new StrequentContactListFragmentListener();
145ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
14615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private ContactListFilterController mContactListFilterController;
1473c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
1488b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private ContactsUnavailableFragment mContactsUnavailableFragment;
149c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki    private ProviderStatusWatcher mProviderStatusWatcher;
150d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki    private ProviderStatusWatcher.Status mProviderStatus;
1518b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1520cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    private boolean mOptionsMenuContactsAvailable;
1530cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
15495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa    /**
15595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa     * Showing a list of Contacts. Also used for showing search results in search mode.
15695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa     */
1576e6c24190257fd77d99b4ab385501795537f6effDaniel Lehmann    private DefaultContactBrowseListFragment mAllFragment;
1587979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro    private ContactTileListFragment mFavoritesFragment;
159f7689c377caba183daa41856d01a8c1a2f7ba811Katherine Kuan    private ContactTileFrequentFragment mFrequentFragment;
160b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private GroupBrowseListFragment mGroupsFragment;
161b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
162f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro    private View mFavoritesView;
163f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro    private View mBrowserView;
164d7b32b6f1293362d1ca186a99a2cc80791a291deYorke Lee    private TransitionAnimationView mPeopleActivityView;
165cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann    private TransitionAnimationView mContactDetailsView;
166cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann    private TransitionAnimationView mGroupDetailsView;
167f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
168250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    /** ViewPager for swipe, used only on the phone (i.e. one-pane mode) */
169250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private ViewPager mTabPager;
170250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private TabPagerAdapter mTabPagerAdapter;
1712e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki    private final TabPagerListener mTabPagerListener = new TabPagerListener();
172250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
17358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private ContactDetailLayoutController mContactDetailLayoutController;
17458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
1759ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private boolean mEnableDebugMenuOptions;
1769ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
17795c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa    private final Handler mHandler = new Handler();
17895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa
179417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
180417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * True if this activity instance is a re-created one.  i.e. set true after orientation change.
181417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * This is set in {@link #onCreate} for later use in {@link #onStart}.
182417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
183417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private boolean mIsRecreatedInstance;
184417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
185417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
186417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * If {@link #configureFragments(boolean)} is already called.  Used to avoid calling it twice
187417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * in {@link #onStart}.
188417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * (This initialization only needs to be done once in onStart() when the Activity was just
189417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * created from scratch -- i.e. onCreate() was just called)
190417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
191417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private boolean mFragmentInitialized;
192417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
193be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    /**
194be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan     * Whether or not the current contact filter is valid or not. We need to do a check on
195be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan     * start of the app to verify that the user is not in single contact mode. If so, we should
196be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan     * dynamically change the filter, unless the incoming intent specifically requested a contact
197be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan     * that should be displayed in that mode.
198be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan     */
199be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    private boolean mCurrentFilterIsValid;
200be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
2016d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    /** Sequential ID assigned to each instance; used for logging */
2026d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private final int mInstanceId;
2036d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private static final AtomicInteger sNextInstanceId = new AtomicInteger();
2046d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki
2059856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan    public PeopleActivity() {
2066d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        mInstanceId = sNextInstanceId.getAndIncrement();
2071540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov        mIntentResolver = new ContactsIntentResolver(this);
208c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher = ProviderStatusWatcher.getInstance(this);
2096178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov    }
2106178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
2116d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    @Override
2126d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    public String toString() {
2136d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        // Shown on logcat
2146d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        return String.format("%s@%d", getClass().getSimpleName(), mInstanceId);
2156d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    }
2166d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki
2178b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean areContactsAvailable() {
218d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki        return (mProviderStatus != null)
219d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki                && mProviderStatus.status == ProviderStatus.STATUS_NORMAL;
2208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
2218b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
2226f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    private boolean areContactWritableAccountsAvailable() {
2236f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki        return ContactsUtils.areContactWritableAccountsAvailable(this);
22449917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson    }
22549917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson
2266f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    private boolean areGroupWritableAccountsAvailable() {
2276f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki        return ContactsUtils.areGroupWritableAccountsAvailable(this);
2286f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    }
22949917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson
23050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    /**
23150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * Initialize fragments that are (or may not be) in the layout.
23250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *
23350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * For the fragments that are in the layout, we initialize them in
234417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * {@link #createViewsAndFragments(Bundle)} after inflating the layout.
23550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *
23650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * However, there are special fragments which may not be in the layout, so we have to do the
23750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * initialization here.
23850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * The target fragments are:
23950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * - {@link ContactDetailFragment} and {@link ContactDetailUpdatesFragment}:  They may not be
24050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *   in the layout depending on the configuration.  (i.e. portrait)
24150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * - {@link ContactsUnavailableFragment}: We always create it at runtime.
24250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     */
2437aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
24492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    public void onAttachFragment(Fragment fragment) {
24550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        if (fragment instanceof ContactDetailFragment) {
2464959ca3d0093a798859660f2914003d0da777645Makoto Onuki            mContactDetailFragment = (ContactDetailFragment) fragment;
2474959ca3d0093a798859660f2914003d0da777645Makoto Onuki        } else if (fragment instanceof ContactsUnavailableFragment) {
2488b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment;
2498b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
2508b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new ContactsUnavailableFragmentListener());
25192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
25292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
25392a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
25492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    @Override
25508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onCreate(Bundle savedState) {
25649627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
25749627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki            Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate start");
25849627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        }
25908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onCreate(savedState);
2607aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
2616d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        if (!processIntent(false)) {
262417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            finish();
263417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return;
264417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
265a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mContactListFilterController = ContactListFilterController.getInstance(this);
266be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mContactListFilterController.checkFilterValidity(false);
267a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mContactListFilterController.addListener(this);
268a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa
269c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.addListener(this);
270c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki
271417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mIsRecreatedInstance = (savedState != null);
272417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        createViewsAndFragments(savedState);
273d7901b91e9f319cc633df54343a1d1796af9d4b1Yorke Lee        getWindow().setBackgroundDrawableResource(R.color.background_primary);
27449627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
27549627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki            Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish");
27649627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        }
277fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
278fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
279fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
280fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    protected void onNewIntent(Intent intent) {
281fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        setIntent(intent);
2826d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        if (!processIntent(true)) {
283417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            finish();
284417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return;
285417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
286417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mActionBarAdapter.initialize(null, mRequest);
287417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
288be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mContactListFilterController.checkFilterValidity(false);
289be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mCurrentFilterIsValid = true;
290be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
291417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Re-configure fragments.
292417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        configureFragments(true /* from request */);
293417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        invalidateOptionsMenuIfNeeded();
294fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
295fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
296417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
297417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * Resolve the intent and initialize {@link #mRequest}, and launch another activity if redirect
298417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * is needed.
299417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *
3006d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki     * @param forNewIntent set true if it's called from {@link #onNewIntent(Intent)}.
301417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * @return {@code true} if {@link PeopleActivity} should continue running.  {@code false}
302417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *         if it shouldn't, in which case the caller should finish() itself and shouldn't do
303417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *         farther initialization.
304417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
3056d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private boolean processIntent(boolean forNewIntent) {
3061ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // Extract relevant information from the intent
3071ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        mRequest = mIntentResolver.resolveIntent(getIntent());
308ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki        if (Log.isLoggable(TAG, Log.DEBUG)) {
3096d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki            Log.d(TAG, this + " processIntent: forNewIntent=" + forNewIntent
3106d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki                    + " intent=" + getIntent() + " request=" + mRequest);
3116d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        }
3121ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (!mRequest.isValid()) {
3136178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            setResult(RESULT_CANCELED);
314417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
3156178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov        }
3166178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
3171ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        Intent redirect = mRequest.getRedirectIntent();
3181ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (redirect != null) {
3191ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            // Need to start a different activity
3206178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            startActivity(redirect);
321417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
3227aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
3237aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
32450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT
32550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki                && !PhoneCapabilityTester.isUsingTwoPanes(this)) {
32650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            redirect = new Intent(this, ContactDetailActivity.class);
32750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            redirect.setAction(Intent.ACTION_VIEW);
32850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            redirect.setData(mRequest.getContactUri());
32950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            startActivity(redirect);
330417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
33150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        }
332417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        return true;
333417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    }
33450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
335417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private void createViewsAndFragments(Bundle savedState) {
336417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        setContentView(R.layout.people_activity);
337417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
338417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        final FragmentManager fragmentManager = getFragmentManager();
339417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
340417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Hide all tabs (the current tab will later be reshown once a tab is selected)
341417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        final FragmentTransaction transaction = fragmentManager.beginTransaction();
342417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
343417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Prepare the fragments which are used both on 1-pane and on 2-pane.
344cc5b1294abc5633de65084d0da3711ad1bc71938Maurice Chu        final boolean isUsingTwoPanes = PhoneCapabilityTester.isUsingTwoPanes(this);
345aaadf9393e98b04a40d249cd97ec758047268ed9Katherine Kuan        if (isUsingTwoPanes) {
346417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFavoritesFragment = getFragment(R.id.favorites_fragment);
347417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mAllFragment = getFragment(R.id.all_fragment);
348417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mGroupsFragment = getFragment(R.id.groups_fragment);
349417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        } else {
350417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mTabPager = getView(R.id.tab_pager);
351417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mTabPagerAdapter = new TabPagerAdapter();
352417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mTabPager.setAdapter(mTabPagerAdapter);
3532e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(mTabPagerListener);
354417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
355417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            final String FAVORITE_TAG = "tab-pager-favorite";
356417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            final String ALL_TAG = "tab-pager-all";
357417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            final String GROUPS_TAG = "tab-pager-groups";
358417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
359417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // Create the fragments and add as children of the view pager.
360417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // The pager adapter will only change the visibility; it'll never create/destroy
361417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // fragments.
362417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // However, if it's after screen rotation, the fragments have been re-created by
363417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // the fragment manager, so first see if there're already the target fragments
364417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // existing.
3657979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro            mFavoritesFragment = (ContactTileListFragment)
366417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                    fragmentManager.findFragmentByTag(FAVORITE_TAG);
367417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mAllFragment = (DefaultContactBrowseListFragment)
368417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                    fragmentManager.findFragmentByTag(ALL_TAG);
369417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mGroupsFragment = (GroupBrowseListFragment)
370417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                    fragmentManager.findFragmentByTag(GROUPS_TAG);
371417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
372417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            if (mFavoritesFragment == null) {
3737979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro                mFavoritesFragment = new ContactTileListFragment();
374417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                mAllFragment = new DefaultContactBrowseListFragment();
375417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                mGroupsFragment = new GroupBrowseListFragment();
376417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
377417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                transaction.add(R.id.tab_pager, mFavoritesFragment, FAVORITE_TAG);
378417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG);
379417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki                transaction.add(R.id.tab_pager, mGroupsFragment, GROUPS_TAG);
380250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
381417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
382250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
383417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mFavoritesFragment.setListener(mFavoritesFragmentListener);
38450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
385417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener());
38650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
387417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mGroupsFragment.setListener(new GroupBrowserActionListener());
38850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
389417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Hide all fragments for now.  We adjust visibility when we get onSelectedTabChanged()
390417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // from ActionBarAdapter.
391417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mFavoritesFragment);
392417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mAllFragment);
393417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mGroupsFragment);
394f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
395aaadf9393e98b04a40d249cd97ec758047268ed9Katherine Kuan        if (isUsingTwoPanes) {
396417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // Prepare 2-pane only fragments/views...
39750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
398417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // Container views for fragments
399d7b32b6f1293362d1ca186a99a2cc80791a291deYorke Lee            mPeopleActivityView = getView(R.id.people_view);
400417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFavoritesView = getView(R.id.favorites_view);
401cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann            mContactDetailsView = getView(R.id.contact_details_view);
402cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann            mGroupDetailsView = getView(R.id.group_details_view);
403417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mBrowserView = getView(R.id.browse_view);
40450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
4052871d61514f014926d991e8b037828c67438e522Maurice Chu            // Only favorites tab with two panes has a separate frequent fragment
4062871d61514f014926d991e8b037828c67438e522Maurice Chu            if (PhoneCapabilityTester.isUsingTwoPanesInFavorites(this)) {
4072871d61514f014926d991e8b037828c67438e522Maurice Chu                mFrequentFragment = getFragment(R.id.frequent_fragment);
4082871d61514f014926d991e8b037828c67438e522Maurice Chu                mFrequentFragment.setListener(mFavoritesFragmentListener);
4092871d61514f014926d991e8b037828c67438e522Maurice Chu                mFrequentFragment.setDisplayType(DisplayType.FREQUENT_ONLY);
4102871d61514f014926d991e8b037828c67438e522Maurice Chu                mFrequentFragment.enableQuickContact(true);
4112871d61514f014926d991e8b037828c67438e522Maurice Chu            }
41250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
413417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mContactDetailLoaderFragment = getFragment(R.id.contact_detail_loader_fragment);
414417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mContactDetailLoaderFragment.setListener(mContactDetailLoaderFragmentListener);
41550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
416417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mGroupDetailFragment = getFragment(R.id.group_detail_fragment);
417417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mGroupDetailFragment.setListener(mGroupDetailFragmentListener);
418417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mGroupDetailFragment.setQuickContact(true);
41950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
4203bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan            if (mContactDetailFragment != null) {
4213bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan                transaction.hide(mContactDetailFragment);
4223bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan            }
423417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            transaction.hide(mGroupDetailFragment);
42427b97bca14c84b3f830c7a433e14ae5c180a32c3Dmitri Plotnikov
425417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            // Configure contact details
4263bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan            mContactDetailLayoutController = new ContactDetailLayoutController(this, savedState,
427cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann                    getFragmentManager(), mContactDetailsView,
428cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann                    findViewById(R.id.contact_detail_container),
4293bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan                    new ContactDetailFragmentListener());
4304d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
4314b25da79091157935042d2942a8961ceba92166fMinh Pham        transaction.commitAllowingStateLoss();
432417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        fragmentManager.executePendingTransactions();
4334d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
4340c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro        // Setting Properties after fragment is created
4352871d61514f014926d991e8b037828c67438e522Maurice Chu        if (PhoneCapabilityTester.isUsingTwoPanesInFavorites(this)) {
4360c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro            mFavoritesFragment.enableQuickContact(true);
4370c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro            mFavoritesFragment.setDisplayType(DisplayType.STARRED_ONLY);
4380c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro        } else {
439cc5b1294abc5633de65084d0da3711ad1bc71938Maurice Chu            // For 2-pane in All and Groups but not in Favorites fragment, show the chevron
440cc5b1294abc5633de65084d0da3711ad1bc71938Maurice Chu            // for quick contact popup
441cc5b1294abc5633de65084d0da3711ad1bc71938Maurice Chu            mFavoritesFragment.enableQuickContact(isUsingTwoPanes);
4420c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro            mFavoritesFragment.setDisplayType(DisplayType.STREQUENT);
4430c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro        }
4440c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro
445417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Configure action bar
446aaadf9393e98b04a40d249cd97ec758047268ed9Katherine Kuan        mActionBarAdapter = new ActionBarAdapter(this, this, getActionBar(), isUsingTwoPanes);
447417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mActionBarAdapter.initialize(savedState, mRequest);
44858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
449417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        invalidateOptionsMenuIfNeeded();
450417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    }
45108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
452417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    @Override
453417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    protected void onStart() {
454417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        if (!mFragmentInitialized) {
455417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFragmentInitialized = true;
456417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            /* Configure fragments if we haven't.
457417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
458417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * Note it's a one-shot initialization, so we want to do this in {@link #onCreate}.
459417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
460417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * However, because this method may indirectly touch views in fragments but fragments
461417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * created in {@link #configureContentView} using a {@link FragmentTransaction} will NOT
462417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * have views until {@link Activity#onCreate} finishes (they would if they were inflated
463417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * from a layout), we need to do it here in {@link #onStart()}.
464417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
465417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * (When {@link Fragment#onCreateView} is called is different in the former case and
466417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * in the latter case, unfortunately.)
467417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
468417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * Also, we skip most of the work in it if the activity is a re-created one.
469417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * (so the argument.)
470417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             */
471417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            configureFragments(!mIsRecreatedInstance);
472be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        } else if (PhoneCapabilityTester.isUsingTwoPanes(this) && !mCurrentFilterIsValid) {
473be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // We only want to do the filter check in onStart for wide screen devices where it
474be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // is often possible to get into single contact mode. Only do this check if
475be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // the filter hasn't already been set properly (i.e. onCreate or onActivityResult).
476be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
477be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // Since there is only one {@link ContactListFilterController} across multiple
478be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // activity instances, make sure the filter controller is in sync withthe current
479be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // contact list fragment filter.
480be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // TODO: Clean this up. Perhaps change {@link ContactListFilterController} to not be a
481be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            // singleton?
482be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            mContactListFilterController.setContactListFilter(mAllFragment.getFilter(), true);
483be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            mContactListFilterController.checkFilterValidity(true);
484be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan            mCurrentFilterIsValid = true;
485417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
486417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        super.onStart();
4873c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov    }
4883c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
4896e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
490174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onPause() {
491fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mOptionsMenuContactsAvailable = false;
492c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.stop();
493174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onPause();
494174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
495174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
496174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
497174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onResume() {
498174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onResume();
499697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus
500c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.start();
501697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus        updateViewConfiguration(true);
5024d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
5034d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // Re-register the listener, which may have been cleared when onSaveInstanceState was
5044d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // called.  See also: onSaveInstanceState
5054d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.setListener(this);
5062e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        if (mTabPager != null) {
5072e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(mTabPagerListener);
5082e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        }
509a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        // Current tab may have changed since the last onSaveInstanceState().  Make sure
510a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        // the actual contents match the tab.
511a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        updateFragmentsVisibility();
512174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
513174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
514174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
515be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    protected void onStop() {
516be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        super.onStop();
517be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mCurrentFilterIsValid = false;
518be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    }
519be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
520be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    @Override
5214d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    protected void onDestroy() {
522c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.removeListener(this);
523c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki
524b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        // Some of variables will be null if this Activity redirects Intent.
525b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        // See also onCreate() or other methods called during the Activity's initialization.
526c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki        if (mActionBarAdapter != null) {
527c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki            mActionBarAdapter.setListener(null);
528c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki        }
529b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        if (mContactListFilterController != null) {
530b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa            mContactListFilterController.removeListener(this);
531b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        }
532b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa
5334d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        super.onDestroy();
5344d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
5354d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
536955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov    private void configureFragments(boolean fromRequest) {
537009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov        if (fromRequest) {
53891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            ContactListFilter filter = null;
53991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            int actionCode = mRequest.getActionCode();
54053b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki            boolean searchMode = mRequest.isSearchMode();
54152aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            final int tabToOpen;
54291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            switch (actionCode) {
54391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_ALL_CONTACTS:
544be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
545be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                            ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
546ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
54791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
54891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
549be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
55091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                            ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
551ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
55291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
55391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
55491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_FREQUENT:
55591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STREQUENT:
55691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STARRED:
557ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.FAVORITES;
55891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
5599e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro                case ContactsRequest.ACTION_VIEW_CONTACT:
560ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    // We redirect this intent to the detail activity on 1-pane, so we don't get
561ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    // here.  It's only for 2-pane.
5626e607d54ce08ebcc78d94963646a42605697f132Maurice Chu                    Uri currentlyLoadedContactUri = mContactDetailFragment.getUri();
5636e607d54ce08ebcc78d94963646a42605697f132Maurice Chu                    if (currentlyLoadedContactUri != null
5646e607d54ce08ebcc78d94963646a42605697f132Maurice Chu                            && !mRequest.getContactUri().equals(currentlyLoadedContactUri)) {
5656e607d54ce08ebcc78d94963646a42605697f132Maurice Chu                        mContactDetailsView.setMaskVisibility(true);
5666e607d54ce08ebcc78d94963646a42605697f132Maurice Chu                    }
567ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
568ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    break;
569ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                case ContactsRequest.ACTION_GROUP:
570ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.GROUPS;
571ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    break;
57252aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                default:
57352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    tabToOpen = -1;
57452aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    break;
575ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki            }
57652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            if (tabToOpen != -1) {
577ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                mActionBarAdapter.setCurrentTab(tabToOpen);
57891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            }
57991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
58091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            if (filter != null) {
58191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                mContactListFilterController.setContactListFilter(filter, false);
58253b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki                searchMode = false;
583009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov            }
584d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
585d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            if (mRequest.getContactUri() != null) {
58653b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki                searchMode = false;
587d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
588d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
58953b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki            mActionBarAdapter.setSearchMode(searchMode);
5900ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan            configureContactListFragmentForRequest();
591fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
592fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
5930ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        configureContactListFragment();
5940ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        configureGroupListFragment();
595fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
5968268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
5976e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
5986e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
5996e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
600d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void onContactListFilterChanged() {
60195c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        if (mAllFragment == null || !mAllFragment.isAdded()) {
602d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov            return;
603d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov        }
604d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov
60595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
606e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
6078268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
6083ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov    }
6093ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov
610a6c2198bc5ad37119500c4857125ad732548c402Dmitri Plotnikov    private void setupContactDetailFragment(final Uri contactLookupUri) {
61158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        mContactDetailLoaderFragment.loadUri(contactLookupUri);
6128268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
613be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    }
614be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
615be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private void setupGroupDetailFragment(Uri groupUri) {
616cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann        // If we are switching from one group to another, do a cross-fade
617cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann        if (mGroupDetailFragment != null && mGroupDetailFragment.getGroupUri() != null &&
618cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann                !UriUtils.areEqual(mGroupDetailFragment.getGroupUri(), groupUri)) {
619d7b32b6f1293362d1ca186a99a2cc80791a291deYorke Lee            mGroupDetailsView.startMaskTransition(false, -1);
620cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann        }
621be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        mGroupDetailFragment.loadGroup(groupUri);
6228268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
623c0ca13a86793082c8969e44c70d4dc8fb83eb1f8Dmitri Plotnikov    }
624c0ca13a86793082c8969e44c70d4dc8fb83eb1f8Dmitri Plotnikov
625fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    /**
626fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     * Handler for action bar actions.
627fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     */
628fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    @Override
629311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann    public void onAction(int action) {
630b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        switch (action) {
631311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann            case ActionBarAdapter.Listener.Action.START_SEARCH_MODE:
632ff64220c681b48d54ff9cb3d82687fc53e2139e5Makoto Onuki                // Tell the fragments that we're in the search mode
633ff64220c681b48d54ff9cb3d82687fc53e2139e5Makoto Onuki                configureFragments(false /* from request */);
6344d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                updateFragmentsVisibility();
6358811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
636b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
637311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann            case ActionBarAdapter.Listener.Action.STOP_SEARCH_MODE:
6381db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki                setQueryTextToFragment("");
6394d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                updateFragmentsVisibility();
6408811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
6418268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                break;
642311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann            case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY:
6439ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                final String queryString = mActionBarAdapter.getQueryString();
6449ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                setQueryTextToFragment(queryString);
6459ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                updateDebugOptionsVisibility(
6469ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                        ENABLE_DEBUG_OPTIONS_HIDDEN_CODE.equals(queryString));
647b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
648b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            default:
649b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action);
650b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
651fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    }
652fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov
6534d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    @Override
6544d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    public void onSelectedTabChanged() {
6554d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        updateFragmentsVisibility();
6564d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
6574d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
6589ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private void updateDebugOptionsVisibility(boolean visible) {
6599ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        if (mEnableDebugMenuOptions != visible) {
6609ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            mEnableDebugMenuOptions = visible;
6619ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            invalidateOptionsMenu();
6629ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        }
6639ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    }
6649ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
6654d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    /**
6664d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     * Updates the fragment/view visibility according to the current mode, such as
6674d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     * {@link ActionBarAdapter#isSearchMode()} and {@link ActionBarAdapter#getCurrentTab()}.
6684d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     */
6694d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    private void updateFragmentsVisibility() {
67052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann        int tab = mActionBarAdapter.getCurrentTab();
6714d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
672250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        // We use ViewPager on 1-pane.
673250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        if (!PhoneCapabilityTester.isUsingTwoPanes(this)) {
674250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mActionBarAdapter.isSearchMode()) {
675250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mTabPagerAdapter.setSearchMode(true);
676250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
67741164239bf48685394b1aff7b807ea8983feda81Makoto Onuki                // No smooth scrolling if quitting from the search mode.
67841164239bf48685394b1aff7b807ea8983feda81Makoto Onuki                final boolean wasSearchMode = mTabPagerAdapter.isSearchMode();
679250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mTabPagerAdapter.setSearchMode(false);
68052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                if (mTabPager.getCurrentItem() != tab) {
68152aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    mTabPager.setCurrentItem(tab, !wasSearchMode);
682250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
683250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
6848811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki            invalidateOptionsMenu();
68566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            showEmptyStateForTab(tab);
68666606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            if (tab == TabState.GROUPS) {
6876f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                mGroupsFragment.setAddAccountsVisibility(!areGroupWritableAccountsAvailable());
68866606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            }
689250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return;
690250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
691250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
692250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        // for the tablet...
693250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
6944d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // If in search mode, we use the all list + contact details to show the result.
6954d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        if (mActionBarAdapter.isSearchMode()) {
6964d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki            tab = TabState.ALL;
6974d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
698d7b32b6f1293362d1ca186a99a2cc80791a291deYorke Lee
699250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        switch (tab) {
70052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            case TabState.FAVORITES:
701250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mFavoritesView.setVisibility(View.VISIBLE);
702250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mBrowserView.setVisibility(View.GONE);
703cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann                mGroupDetailsView.setVisibility(View.GONE);
704cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann                mContactDetailsView.setVisibility(View.GONE);
705250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                break;
70652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            case TabState.GROUPS:
70766606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                mFavoritesView.setVisibility(View.GONE);
70866606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                mBrowserView.setVisibility(View.VISIBLE);
709cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann                mGroupDetailsView.setVisibility(View.VISIBLE);
710cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann                mContactDetailsView.setVisibility(View.GONE);
7116f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                mGroupsFragment.setAddAccountsVisibility(!areGroupWritableAccountsAvailable());
71266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                break;
71352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            case TabState.ALL:
714250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mFavoritesView.setVisibility(View.GONE);
715250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mBrowserView.setVisibility(View.VISIBLE);
716cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann                mContactDetailsView.setVisibility(View.VISIBLE);
717cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann                mGroupDetailsView.setVisibility(View.GONE);
718250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                break;
7194d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
720d7b32b6f1293362d1ca186a99a2cc80791a291deYorke Lee        mPeopleActivityView.startMaskTransition(false, TAB_FADE_IN_DURATION);
7214d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        FragmentManager fragmentManager = getFragmentManager();
7224d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        FragmentTransaction ft = fragmentManager.beginTransaction();
7234d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
7249c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki        // Note mContactDetailLoaderFragment is an invisible fragment, but we still have to show/
7259c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki        // hide it so its options menu will be shown/hidden.
7264d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        switch (tab) {
72752aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            case TabState.FAVORITES:
7284d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mFavoritesFragment);
7294d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mFrequentFragment);
7304d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mAllFragment);
7319c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki                hideFragment(ft, mContactDetailLoaderFragment);
7324d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mContactDetailFragment);
7334d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mGroupsFragment);
7344d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mGroupDetailFragment);
7354d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                break;
73652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            case TabState.ALL:
7374d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mFavoritesFragment);
7384d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mFrequentFragment);
7394d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mAllFragment);
7409c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki                showFragment(ft, mContactDetailLoaderFragment);
7414d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mContactDetailFragment);
7424d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mGroupsFragment);
7434d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mGroupDetailFragment);
7444d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                break;
74552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            case TabState.GROUPS:
7464d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mFavoritesFragment);
7474d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mFrequentFragment);
7484d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mAllFragment);
7499c0e8ac3a90e01ebca4b83f1f8ef78e9e98a9922Makoto Onuki                hideFragment(ft, mContactDetailLoaderFragment);
7504d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                hideFragment(ft, mContactDetailFragment);
7514d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mGroupsFragment);
7524d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                showFragment(ft, mGroupDetailFragment);
7534d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                break;
7544d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
7554d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        if (!ft.isEmpty()) {
7564b25da79091157935042d2942a8961ceba92166fMinh Pham            ft.commitAllowingStateLoss();
7574d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki            fragmentManager.executePendingTransactions();
758a023ddd7788bc7cde35ca7bbeaf3edb99ff34441Makoto Onuki            // When switching tabs, we need to invalidate options menu, but executing a
759a023ddd7788bc7cde35ca7bbeaf3edb99ff34441Makoto Onuki            // fragment transaction does it implicitly.  We don't have to call invalidateOptionsMenu
760a023ddd7788bc7cde35ca7bbeaf3edb99ff34441Makoto Onuki            // manually.
7614d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
76266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        showEmptyStateForTab(tab);
76366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson    }
76466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson
76552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann    private void showEmptyStateForTab(int tab) {
76666606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        if (mContactsUnavailableFragment != null) {
76766606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            switch (tab) {
76852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.FAVORITES:
76966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    mContactsUnavailableFragment.setMessageText(
770a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelson                            R.string.listTotalAllContactsZeroStarred, -1);
77166606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
77252aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.GROUPS:
773a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelson                    mContactsUnavailableFragment.setMessageText(R.string.noGroups,
7746f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                            areGroupWritableAccountsAvailable() ? -1 : R.string.noAccounts);
77566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
77652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.ALL:
777a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelson                    mContactsUnavailableFragment.setMessageText(R.string.noContacts, -1);
77866606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
77966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            }
78066606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        }
7814d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
7824d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
783250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private class TabPagerListener implements ViewPager.OnPageChangeListener {
78470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
78570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // This package-protected constructor is here because of a possible compiler bug.
78670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // PeopleActivity$1.class should be generated due to the private outer/inner class access
78770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // needed here.  But for some reason, PeopleActivity$1.class is missing.
78870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // Since $1 class is needed as a jvm work around to get access to the inner class,
78970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // changing the constructor to package-protected or public will solve the problem.
79070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // To verify whether $1 class is needed, javap PeopleActivity$TabPagerListener and look for
79170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // references to PeopleActivity$1.
79270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        //
79370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // When the constructor is private and PeopleActivity$1.class is missing, proguard will
79470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // correctly catch this and throw warnings and error out the build on user/userdebug builds.
79570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        //
79670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // All private inner classes below also need this fix.
79770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        TabPagerListener() {}
79870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
799250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
800250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageScrollStateChanged(int state) {
801250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
802250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
803250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
804250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
805250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
806250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
807250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
808250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageSelected(int position) {
809250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            // Make sure not in the search mode, in which case position != TabState.ordinal().
810250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (!mTabPagerAdapter.isSearchMode()) {
81152aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                mActionBarAdapter.setCurrentTab(position, false);
81252aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                showEmptyStateForTab(position);
81352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                if (position == TabState.GROUPS) {
8146f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                    mGroupsFragment.setAddAccountsVisibility(!areGroupWritableAccountsAvailable());
81566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                }
8168811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
817250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
818250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
819250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    }
820250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
821250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    /**
822250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * Adapter for the {@link ViewPager}.  Unlike {@link FragmentPagerAdapter},
823250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * {@link #instantiateItem} returns existing fragments, and {@link #instantiateItem}/
824250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * {@link #destroyItem} show/hide fragments instead of attaching/detaching.
825250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     *
826250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * In search mode, we always show the "all" fragment, and disable the swipe.  We change the
827250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * number of items to 1 to disable the swipe.
828250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     *
829250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * TODO figure out a more straight way to disable swipe.
830250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     */
831250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private class TabPagerAdapter extends PagerAdapter {
832250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private final FragmentManager mFragmentManager;
833250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private FragmentTransaction mCurTransaction = null;
834250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
835250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private boolean mTabPagerAdapterSearchMode;
836250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
837746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        private Fragment mCurrentPrimaryItem;
838746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
839250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public TabPagerAdapter() {
840250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mFragmentManager = getFragmentManager();
841250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
842250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
843250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public boolean isSearchMode() {
844250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return mTabPagerAdapterSearchMode;
845250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
846250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
847250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void setSearchMode(boolean searchMode) {
848250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (searchMode == mTabPagerAdapterSearchMode) {
849250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                return;
850250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
851250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mTabPagerAdapterSearchMode = searchMode;
852250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            notifyDataSetChanged();
853250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
854250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
855250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
856250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public int getCount() {
85752aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            return mTabPagerAdapterSearchMode ? 1 : TabState.COUNT;
858250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
859250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
860250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        /** Gets called when the number of items changes. */
861250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
862250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public int getItemPosition(Object object) {
863250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mTabPagerAdapterSearchMode) {
864250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mAllFragment) {
865250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return 0; // Only 1 page in search mode
866250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
867250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
868250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mFavoritesFragment) {
86952aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    return TabState.FAVORITES;
870250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
871250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mAllFragment) {
87252aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    return TabState.ALL;
873250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
874250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mGroupsFragment) {
87552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    return TabState.GROUPS;
876250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
877250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
878250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return POSITION_NONE;
879250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
880250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
881250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
882970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void startUpdate(ViewGroup container) {
883250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
884250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
885250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private Fragment getFragment(int position) {
886250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mTabPagerAdapterSearchMode) {
8878d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                if (position != 0) {
8888d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    // This has only been observed in monkey tests.
8898d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    // Let's log this issue, but not crash
8908d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    Log.w(TAG, "Request fragment at position=" + position + ", eventhough we " +
8918d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                            "are in search mode");
892250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
8938d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                return mAllFragment;
894250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
89552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                if (position == TabState.FAVORITES) {
896250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mFavoritesFragment;
89752aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                } else if (position == TabState.ALL) {
898250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mAllFragment;
89952aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                } else if (position == TabState.GROUPS) {
900250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mGroupsFragment;
901250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
902250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
903250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            throw new IllegalArgumentException("position: " + position);
904250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
905250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
906250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
907970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public Object instantiateItem(ViewGroup container, int position) {
908250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction == null) {
909250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = mFragmentManager.beginTransaction();
910250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
911250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            Fragment f = getFragment(position);
912250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mCurTransaction.show(f);
913746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
9149bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell            // Non primary pages are not visible.
9159bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell            f.setUserVisibleHint(f == mCurrentPrimaryItem);
916250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return f;
917250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
918250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
919250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
920970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void destroyItem(ViewGroup container, int position, Object object) {
921250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction == null) {
922250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = mFragmentManager.beginTransaction();
923250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
924250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mCurTransaction.hide((Fragment) object);
925250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
926250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
927250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
928970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void finishUpdate(ViewGroup container) {
929250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction != null) {
9304b25da79091157935042d2942a8961ceba92166fMinh Pham                mCurTransaction.commitAllowingStateLoss();
931250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = null;
932250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mFragmentManager.executePendingTransactions();
933250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
934250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
935250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
936250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
937250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public boolean isViewFromObject(View view, Object object) {
938250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return ((Fragment) object).getView() == view;
939250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
940250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
941250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
942970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void setPrimaryItem(ViewGroup container, int position, Object object) {
943746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            Fragment fragment = (Fragment) object;
944746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            if (mCurrentPrimaryItem != fragment) {
945746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                if (mCurrentPrimaryItem != null) {
9469bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell                    mCurrentPrimaryItem.setUserVisibleHint(false);
947746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                }
948746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                if (fragment != null) {
9499bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell                    fragment.setUserVisibleHint(true);
950746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                }
951746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                mCurrentPrimaryItem = fragment;
952746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            }
953746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        }
954746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
955746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        @Override
956250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public Parcelable saveState() {
957250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return null;
958250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
959250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
960250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
961250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void restoreState(Parcelable state, ClassLoader loader) {
962250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
963250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    }
964250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
9651db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki    private void setQueryTextToFragment(String query) {
96695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setQueryString(query, true);
9671db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki        mAllFragment.setVisibleScrollbarEnabled(!mAllFragment.isSearchMode());
9688268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    }
9698268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
9700ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragmentForRequest() {
971fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        Uri contactUri = mRequest.getContactUri();
972fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (contactUri != null) {
973e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan            // For an incoming request, explicitly require a selection if we are on 2-pane UI,
974e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan            // (i.e. even if we view the same selected contact, the contact may no longer be
975e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan            // in the list, so we must refresh the list).
976e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan            if (PhoneCapabilityTester.isUsingTwoPanes(this)) {
977e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan                mAllFragment.setSelectionRequired(true);
978e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan            }
97995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setSelectedContactUri(contactUri);
980fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
981238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
982a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
9831db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki        setQueryTextToFragment(mActionBarAdapter.getQueryString());
984238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
985fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mRequest.isDirectorySearchEnabled()) {
98695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
987fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        } else {
98895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
989fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
99008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
99108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
9920ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragment() {
993a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        // Filter may be changed when this Activity is in background.
994a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
995a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa
996553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki        final boolean useTwoPane = PhoneCapabilityTester.isUsingTwoPanes(this);
9977d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglio        final Locale locale = Locale.getDefault();
9987d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglio        final int layoutDirection = TextUtils.getLayoutDirectionFromLocale(locale);
9997d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglio        final boolean isLayoutRtl = (layoutDirection == View.LAYOUT_DIRECTION_RTL);
10007d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglio        final int position;
10017d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglio        if (useTwoPane)  {
10027d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglio            position = isLayoutRtl ? View.SCROLLBAR_POSITION_RIGHT : View.SCROLLBAR_POSITION_LEFT;
10037d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglio        } else {
10047d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglio            position = isLayoutRtl ? View.SCROLLBAR_POSITION_LEFT: View.SCROLLBAR_POSITION_RIGHT;
10057d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglio        }
10067d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglio        mAllFragment.setVerticalScrollbarPosition(position);
1007553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki        mAllFragment.setSelectionVisible(useTwoPane);
1008553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki        mAllFragment.setQuickContactEnabled(!useTwoPane);
10091ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
10101323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
10110ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureGroupListFragment() {
1012553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki        final boolean useTwoPane = PhoneCapabilityTester.isUsingTwoPanes(this);
10130ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        mGroupsFragment.setVerticalScrollbarPosition(
1014553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki                useTwoPane
10150ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan                        ? View.SCROLLBAR_POSITION_LEFT
10160ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan                        : View.SCROLLBAR_POSITION_RIGHT);
1017553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki        mGroupsFragment.setSelectionVisible(useTwoPane);
10180ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    }
10190ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan
10208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
10218b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public void onProviderStatusChange() {
1022697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus        updateViewConfiguration(false);
10238b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
10248b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1025697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus    private void updateViewConfiguration(boolean forceUpdate) {
1026d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki        ProviderStatusWatcher.Status providerStatus = mProviderStatusWatcher.getProviderStatus();
1027d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki        if (!forceUpdate && (mProviderStatus != null)
1028d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki                && (providerStatus.status == mProviderStatus.status)) return;
10298b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatus = providerStatus;
10308b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10318b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view);
10328b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View mainView = findViewById(R.id.main_view);
10338b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1034d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki        if (mProviderStatus.status == ProviderStatus.STATUS_NORMAL) {
1035b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // Ensure that the mTabPager is visible; we may have made it invisible below.
1036c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.GONE);
1037b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            if (mTabPager != null) {
1038b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus                mTabPager.setVisibility(View.VISIBLE);
1039b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            }
1040b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
1041b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mainView != null) {
1042b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mainView.setVisibility(View.VISIBLE);
1043b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
104495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            if (mAllFragment != null) {
104595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                mAllFragment.setEnabled(true);
10468b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
10478b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        } else {
1048aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // If there are no accounts on the device and we should show the "no account" prompt
1049aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // (based on {@link SharedPreferences}), then launch the account setup activity so the
1050aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // user can sign-in or create an account.
10519f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            //
10529f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            // Also check for ability to modify accounts.  In limited user mode, you can't modify
10539f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            // accounts so there is no point sending users to account setup activity.
10549f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            final UserManager userManager = UserManager.get(this);
10559f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            final boolean disallowModifyAccounts = userManager.getUserRestrictions().getBoolean(
10569f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng                    UserManager.DISALLOW_MODIFY_ACCOUNTS);
10579f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            if (!disallowModifyAccounts && !areContactWritableAccountsAvailable() &&
10586f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                    AccountPromptUtils.shouldShowAccountPrompt(this)) {
1059aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan                AccountPromptUtils.launchAccountPrompt(this);
1060aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan                return;
1061aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            }
1062aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan
1063aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // Otherwise, continue setting up the page so that the user can still use the app
1064aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // without an account.
106595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            if (mAllFragment != null) {
106695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                mAllFragment.setEnabled(false);
10678b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
10688b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mContactsUnavailableFragment == null) {
10698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment = new ContactsUnavailableFragment();
10708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
10718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        new ContactsUnavailableFragmentListener());
10723ed426c842a68895a759548fef87bac359f937bbDianne Hackborn                getFragmentManager().beginTransaction()
10738b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
10744b25da79091157935042d2942a8961ceba92166fMinh Pham                        .commitAllowingStateLoss();
10758b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
1076d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki            mContactsUnavailableFragment.updateStatus(mProviderStatus);
1077b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
1078b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // Show the contactsUnavailableView, and hide the mTabPager so that we don't
1079b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // see it sliding in underneath the contactsUnavailableView at the edges.
10808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.VISIBLE);
1081b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            if (mTabPager != null) {
1082b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus                mTabPager.setVisibility(View.GONE);
1083b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            }
1084b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
1085b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mainView != null) {
1086b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mainView.setVisibility(View.INVISIBLE);
1087b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
108866606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson
108952aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            showEmptyStateForTab(mActionBarAdapter.getCurrentTab());
10908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
10918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10928268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
10938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
10948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10951ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
109670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        ContactBrowserActionListener() {}
1097d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
1098e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
1099d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onSelectionChange() {
1100553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki            if (PhoneCapabilityTester.isUsingTwoPanes(PeopleActivity.this)) {
110195c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                setupContactDetailFragment(mAllFragment.getSelectedContactUri());
1102d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
1103d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
1104e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov
1105d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        @Override
1106d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onViewContactAction(Uri contactLookupUri) {
1107553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki            if (PhoneCapabilityTester.isUsingTwoPanes(PeopleActivity.this)) {
1108d364314c460152db7089b304beec81b3675893baDmitri Plotnikov                setupContactDetailFragment(contactLookupUri);
1109424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov            } else {
1110d8a61b7296bf7388505f0211d7ef44700e766193Katherine Kuan                Intent intent = new Intent(Intent.ACTION_VIEW, contactLookupUri);
1111d8a61b7296bf7388505f0211d7ef44700e766193Katherine Kuan                startActivity(intent);
1112424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov            }
11131ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
1114e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
1115e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
11161ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onCreateNewContactAction() {
11171ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
11181ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            Bundle extras = getIntent().getExtras();
11191ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            if (extras != null) {
11201ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov                intent.putExtras(extras);
1121416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov            }
11221ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            startActivity(intent);
11231ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
1124416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
1125e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
11261ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onEditContactAction(Uri contactLookupUri) {
1127e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
1128e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            Bundle extras = getIntent().getExtras();
1129e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann            if (extras != null) {
1130e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann                intent.putExtras(extras);
11311ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            }
11325c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            intent.putExtra(
11335c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    ContactEditorActivity.INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
11345c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT);
11351ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
1136413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov
1137e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
11381ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onAddToFavoritesAction(Uri contactUri) {
11391ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            ContentValues values = new ContentValues(1);
11401ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            values.put(Contacts.STARRED, 1);
11411ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            getContentResolver().update(contactUri, values, null, null);
11421ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
11438a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
1144e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
11451ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onRemoveFromFavoritesAction(Uri contactUri) {
11461ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            ContentValues values = new ContentValues(1);
11471ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            values.put(Contacts.STARRED, 0);
11481ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            getContentResolver().update(contactUri, values, null, null);
11491ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
1150416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
1151e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
11521ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onDeleteContactAction(Uri contactUri) {
11539856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
11541ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
11558a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
1156e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
11571ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onFinishAction() {
11581ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            onBackPressed();
11591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
11606e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
11616e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        @Override
11626e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        public void onInvalidSelection() {
1163b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            ContactListFilter filter;
1164b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            ContactListFilter currentFilter = mAllFragment.getFilter();
1165b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            if (currentFilter != null
1166b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                    && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
1167b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                filter = ContactListFilter.createFilterWithType(
1168b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
1169b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                mAllFragment.setFilter(filter);
1170b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            } else {
1171b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                filter = ContactListFilter.createFilterWithType(
1172b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                        ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
1173b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                mAllFragment.setFilter(filter, false);
1174b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            }
1175d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mContactListFilterController.setContactListFilter(filter, true);
11766e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        }
11771ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
1178416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
117958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    private class ContactDetailLoaderFragmentListener implements ContactLoaderFragmentListener {
118070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        ContactDetailLoaderFragmentListener() {}
118170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
118269e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
1183424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onContactNotFound() {
1184d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            // Nothing needs to be done here
1185424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
1186424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
118769e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
1188851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        public void onDetailsLoaded(final Contact result) {
118958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            if (result == null) {
1190050c3893fadaf6d02951a3fe29684f4cd94fa9c9Daisuke Miyakawa                // Nothing is loaded. Show empty state.
1191050c3893fadaf6d02951a3fe29684f4cd94fa9c9Daisuke Miyakawa                mContactDetailLayoutController.showEmptyState();
119258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                return;
119358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            }
119458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            // Since {@link FragmentTransaction}s cannot be done in the onLoadFinished() of the
119558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            // {@link LoaderCallbacks}, then post this {@link Runnable} to the {@link Handler}
119658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            // on the main thread to execute later.
119758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            mHandler.post(new Runnable() {
119858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                @Override
119958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                public void run() {
1200bed71bedbaae4d6b26b2b64db476bffa710753e5Makoto Onuki                    // If the activity is destroyed (or will be destroyed soon), don't update the UI
1201bed71bedbaae4d6b26b2b64db476bffa710753e5Makoto Onuki                    if (isFinishing()) {
120293f625d8f2825575b4f63f4cf78ecbb7b56354ebKatherine Kuan                        return;
120393f625d8f2825575b4f63f4cf78ecbb7b56354ebKatherine Kuan                    }
120458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                    mContactDetailLayoutController.setContactData(result);
120558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                }
120658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            });
120758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        }
120858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
120958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        @Override
1210424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onEditRequested(Uri contactLookupUri) {
12115c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
12125c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            intent.putExtra(
12135c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    ContactEditorActivity.INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
12145c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT);
1215424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
1216424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
121769e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
121858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        public void onDeleteRequested(Uri contactUri) {
121958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
122058fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        }
122158fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    }
122258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
122358fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan    public class ContactDetailFragmentListener implements ContactDetailFragment.Listener {
122458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        @Override
1225424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        public void onItemClicked(Intent intent) {
122608bcf715d5ea7f07ce18a282d9850ac70552ca9dKatherine Kuan            if (intent == null) {
122708bcf715d5ea7f07ce18a282d9850ac70552ca9dKatherine Kuan                return;
122808bcf715d5ea7f07ce18a282d9850ac70552ca9dKatherine Kuan            }
122960be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            try {
123060be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann                startActivity(intent);
123160be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            } catch (ActivityNotFoundException e) {
123260be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann                Log.e(TAG, "No activity found for intent: " + intent);
123360be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann            }
1234424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov        }
1235424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
123669e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann        @Override
12372b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro        public void onCreateRawContactRequested(ArrayList<ContentValues> values,
12382b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro                AccountWithDataSet account) {
12399856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            Toast.makeText(PeopleActivity.this, R.string.toast_making_personal_copy,
1240caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov                    Toast.LENGTH_LONG).show();
1241caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov            Intent serviceIntent = ContactSaveService.createNewRawContactIntent(
12429856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan                    PeopleActivity.this, values, account,
12439856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan                    PeopleActivity.class, Intent.ACTION_VIEW);
1244caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov            startService(serviceIntent);
1245caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov        }
1246424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov    }
1247424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov
12488b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private class ContactsUnavailableFragmentListener
12498b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            implements OnContactsUnavailableActionListener {
125070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        ContactsUnavailableFragmentListener() {}
12518b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
12528b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
12538b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onCreateNewContactAction() {
12548b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
12558b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
12568b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
12578b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
12588b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onAddAccountAction() {
12598b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT);
12601fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
12618b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            intent.putExtra(Settings.EXTRA_AUTHORITIES,
12628b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new String[] { ContactsContract.AUTHORITY });
12638b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(intent);
12648b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
12658b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
12668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
12678b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onImportContactsFromFileAction() {
1268a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng            ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
1269a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng                    PeopleActivity.class);
12708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
12718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
12728b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
12738b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onFreeInternalStorageAction() {
12748b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS));
12758b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
12768b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
12778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1278ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    private final class StrequentContactListFragmentListener
12797979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro            implements ContactTileListFragment.Listener {
128070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        StrequentContactListFragmentListener() {}
128170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
1282ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        @Override
12837a700cf798a19a8452b8671f643a05336f63f611Katherine Kuan        public void onContactSelected(Uri contactUri, Rect targetRect) {
1284553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki            if (PhoneCapabilityTester.isUsingTwoPanes(PeopleActivity.this)) {
12857a700cf798a19a8452b8671f643a05336f63f611Katherine Kuan                QuickContact.showQuickContact(PeopleActivity.this, targetRect, contactUri, 0, null);
1286ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            } else {
1287ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa                startActivity(new Intent(Intent.ACTION_VIEW, contactUri));
1288ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            }
1289ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        }
12904e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus
12914e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus        @Override
12924e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus        public void onCallNumberDirectly(String phoneNumber) {
12934e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus            // No need to call phone number directly from People app.
12944e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus            Log.w(TAG, "unexpected invocation of onCallNumberDirectly()");
12954e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus        }
1296ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    }
1297ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
1298be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    private final class GroupBrowserActionListener implements OnGroupBrowserActionListener {
1299be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
130070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        GroupBrowserActionListener() {}
130170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
1302be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        @Override
1303be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        public void onViewGroupAction(Uri groupUri) {
1304553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki            if (PhoneCapabilityTester.isUsingTwoPanes(PeopleActivity.this)) {
1305be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                setupGroupDetailFragment(groupUri);
1306be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            } else {
1307be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                Intent intent = new Intent(PeopleActivity.this, GroupDetailActivity.class);
1308be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                intent.setData(groupUri);
1309be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                startActivity(intent);
1310be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            }
1311be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        }
1312be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan    }
1313be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan
1314c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    private class GroupDetailFragmentListener implements GroupDetailFragment.Listener {
131570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
131670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        GroupDetailFragmentListener() {}
131770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
1318c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        @Override
1319c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        public void onGroupSizeUpdated(String size) {
1320c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // Nothing needs to be done here because the size will be displayed in the detail
1321c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // fragment
1322c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        }
1323c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
1324c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        @Override
1325c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        public void onGroupTitleUpdated(String title) {
1326c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // Nothing needs to be done here because the title will be displayed in the detail
1327c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            // fragment
1328c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        }
1329c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
1330c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        @Override
1331d78ee90c0d4d93b82ad440396e87ae4f47f53e93Daniel Lehmann        public void onAccountTypeUpdated(String accountTypeString, String dataSet) {
1332703cda7119b710446f7abc38843043b7cbbf3a47Katherine Kuan            // Nothing needs to be done here because the group source will be displayed in the
1333703cda7119b710446f7abc38843043b7cbbf3a47Katherine Kuan            // detail fragment
1334703cda7119b710446f7abc38843043b7cbbf3a47Katherine Kuan        }
1335703cda7119b710446f7abc38843043b7cbbf3a47Katherine Kuan
1336703cda7119b710446f7abc38843043b7cbbf3a47Katherine Kuan        @Override
1337c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        public void onEditRequested(Uri groupUri) {
1338c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            final Intent intent = new Intent(PeopleActivity.this, GroupEditorActivity.class);
1339c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            intent.setData(groupUri);
1340c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            intent.setAction(Intent.ACTION_EDIT);
1341c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            startActivityForResult(intent, SUBACTIVITY_EDIT_GROUP);
1342c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan        }
13434e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro
13444e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro        @Override
13454e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro        public void onContactSelected(Uri contactUri) {
13464e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro            // Nothing needs to be done here because either quickcontact will be displayed
13474e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro            // or activity will take care of selection
13484e2bb32000f391ceb0de7309a159bee5d8e04fc5Frank Sposaro        }
1349c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan    }
1350c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
1351732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    public void startActivityAndForwardResult(final Intent intent) {
1352732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
1353732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
1354732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        // Forward extras to the new activity
1355732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        Bundle extras = getIntent().getExtras();
1356732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        if (extras != null) {
1357732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov            intent.putExtras(extras);
1358732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        }
1359732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        startActivity(intent);
1360732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        finish();
1361732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
1362732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
13637aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
13647aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
1365946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki        if (!areContactsAvailable()) {
1366946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki            // If contacts aren't available, hide all menu items.
1367946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki            return false;
1368946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki        }
1369d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        super.onCreateOptionsMenu(menu);
1370d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey
1371d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        MenuInflater inflater = getMenuInflater();
137218e0cabec8df2e20ab4b33320804cc3472f195c2Daisuke Miyakawa        inflater.inflate(R.menu.people_options, menu);
1373971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
13742a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann        if (DEBUG_TRANSITIONS && mContactDetailLoaderFragment != null) {
13752a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann            final MenuItem toggleSocial =
13762a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann                    menu.add(mContactDetailLoaderFragment.getLoadStreamItems() ? "less" : "more");
13772a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann            toggleSocial.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
13782a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann            toggleSocial.setOnMenuItemClickListener(new OnMenuItemClickListener() {
13792a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann                @Override
13802a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann                public boolean onMenuItemClick(MenuItem item) {
13812a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann                    mContactDetailLoaderFragment.toggleLoadStreamItems();
13822a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann                    invalidateOptionsMenu();
13832a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann                    return false;
13842a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann                }
13852a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann            });
13862a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann        }
13872a45e35ab3273c8901d9df3671e51614dc0250c6Daniel Lehmann
1388b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        return true;
1389d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    }
13907aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
13918268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    private void invalidateOptionsMenuIfNeeded() {
13920cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (isOptionsMenuChanged()) {
13938268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            invalidateOptionsMenu();
13940cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
13950cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
13960cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
13970cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    public boolean isOptionsMenuChanged() {
13980cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (mOptionsMenuContactsAvailable != areContactsAvailable()) {
13990cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
14000cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
14010cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
140295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        if (mAllFragment != null && mAllFragment.isOptionsMenuChanged()) {
14030cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
14040cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
14050cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
140658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        if (mContactDetailLoaderFragment != null &&
140758fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan                mContactDetailLoaderFragment.isOptionsMenuChanged()) {
14080cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
14090cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
14100cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
14118268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        if (mGroupDetailFragment != null && mGroupDetailFragment.isOptionsMenuChanged()) {
14120cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
14130cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
14140cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
14150cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        return false;
14160cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
14170cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
14180cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    @Override
1419d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    public boolean onPrepareOptionsMenu(Menu menu) {
14200cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        mOptionsMenuContactsAvailable = areContactsAvailable();
14210cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (!mOptionsMenuContactsAvailable) {
14228b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
14238b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
14248b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
14252fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu        // Get references to individual menu items in the menu
1426971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        final MenuItem addContactMenu = menu.findItem(R.id.menu_add_contact);
1427789bc596877861da26ca862c699a269783d8d42aIsaac Katzenelson        final MenuItem contactsFilterMenu = menu.findItem(R.id.menu_contacts_filter);
1428789bc596877861da26ca862c699a269783d8d42aIsaac Katzenelson
1429971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan        MenuItem addGroupMenu = menu.findItem(R.id.menu_add_group);
1430e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
14312fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu        final MenuItem clearFrequentsMenu = menu.findItem(R.id.menu_clear_frequents);
1432692d46364f2f0e32fd481b977c9e16832e70de5cMaurice Chu        final MenuItem helpMenu = menu.findItem(R.id.menu_help);
14332fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu
1434af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        final boolean isSearchMode = mActionBarAdapter.isSearchMode();
1435af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        if (isSearchMode) {
14368268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            addContactMenu.setVisible(false);
14378268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            addGroupMenu.setVisible(false);
1438683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson            contactsFilterMenu.setVisible(false);
14392fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            clearFrequentsMenu.setVisible(false);
1440692d46364f2f0e32fd481b977c9e16832e70de5cMaurice Chu            helpMenu.setVisible(false);
14418268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        } else {
14424d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki            switch (mActionBarAdapter.getCurrentTab()) {
144352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.FAVORITES:
1444683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    addContactMenu.setVisible(false);
1445683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    addGroupMenu.setVisible(false);
1446683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    contactsFilterMenu.setVisible(false);
14472fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                    clearFrequentsMenu.setVisible(hasFrequents());
1448683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    break;
144952aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.ALL:
14508268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    addContactMenu.setVisible(true);
14518268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    addGroupMenu.setVisible(false);
1452683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    contactsFilterMenu.setVisible(true);
14532fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                    clearFrequentsMenu.setVisible(false);
14548268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    break;
145552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.GROUPS:
145649917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson                    // Do not display the "new group" button if no accounts are available
14576f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                    if (areGroupWritableAccountsAvailable()) {
145849917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson                        addGroupMenu.setVisible(true);
145949917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson                    } else {
146049917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson                        addGroupMenu.setVisible(false);
146149917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson                    }
14628268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    addContactMenu.setVisible(false);
1463683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    contactsFilterMenu.setVisible(false);
14642fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                    clearFrequentsMenu.setVisible(false);
14658268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    break;
14668268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            }
1467692d46364f2f0e32fd481b977c9e16832e70de5cMaurice Chu            HelpUtils.prepareHelpMenuItem(this, helpMenu, R.string.help_url_people_main);
1468e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        }
1469af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        final boolean showMiscOptions = !isSearchMode;
1470af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_search, showMiscOptions);
1471af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_import_export, showMiscOptions);
1472af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_accounts, showMiscOptions);
1473af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_settings,
1474af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki                showMiscOptions && !ContactsPreferenceActivity.isEmpty(this));
1475e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
14769ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        // Debug options need to be visible even in search mode.
14779ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        makeMenuItemVisible(menu, R.id.export_database, mEnableDebugMenuOptions);
14789ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
1479d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        return true;
14807aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
14817aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
14822fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    /**
14832fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     * Returns whether there are any frequently contacted people being displayed
14842fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     * @return
14852fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     */
14862fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    private boolean hasFrequents() {
14872871d61514f014926d991e8b037828c67438e522Maurice Chu        if (PhoneCapabilityTester.isUsingTwoPanesInFavorites(this)) {
14882fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            return mFrequentFragment.hasFrequents();
14892fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu        } else {
14902fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            return mFavoritesFragment.hasFrequents();
14912fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu        }
14922fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    }
14932fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu
1494af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki    private void makeMenuItemVisible(Menu menu, int itemId, boolean visible) {
1495af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        MenuItem item =menu.findItem(itemId);
1496af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        if (item != null) {
1497af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki            item.setVisible(visible);
1498af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        }
1499af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki    }
1500af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki
15017aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
15027aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
15037aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (item.getItemId()) {
1504e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki            case android.R.id.home: {
1505e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                // The home icon on the action bar is pressed
1506e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                if (mActionBarAdapter.isUpShowing()) {
1507e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                    // "UP" icon press -- should be treated as "back".
1508e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                    onBackPressed();
1509e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                }
1510e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                return true;
1511e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki            }
1512c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov            case R.id.menu_settings: {
1513c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov                final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
1514edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                // as there is only one section right now, make sure it is selected
1515edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                // on small screens, this also hides the section selector
1516edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                // Due to b/5045558, this code unfortunately only works properly on phones
1517edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                boolean settingsAreMultiPane = getResources().getBoolean(
1518edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                        com.android.internal.R.bool.preferences_prefer_dual_pane);
1519edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                if (!settingsAreMultiPane) {
1520edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                    intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT,
1521edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                            DisplayOptionsPreferenceFragment.class.getName());
1522edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                    intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_TITLE,
1523b20ff0bdc379307dbc8337240fd35f8193f3100fYorke Lee                            R.string.activity_title_settings);
1524edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmann                }
1525c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann                startActivity(intent);
15267aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1527d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
1528b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case R.id.menu_contacts_filter: {
1529b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                AccountFilterUtil.startAccountFilterActivityForResult(
1530b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                        this, SUBACTIVITY_ACCOUNT_FILTER,
1531b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                        mContactListFilterController.getFilter());
1532b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                return true;
1533b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
1534d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_search: {
15358e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov                onSearchRequested();
15367aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1537d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
15388268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            case R.id.menu_add_contact: {
1539d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
15405c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                // On 2-pane UI, we can let the editor activity finish itself and return
15415c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                // to this activity to display the new contact.
15425c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                if (PhoneCapabilityTester.isUsingTwoPanes(this)) {
15435c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    intent.putExtra(
154470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng                            ContactEditorActivity.INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED,
154570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng                            true);
15465c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    startActivityForResult(intent, SUBACTIVITY_NEW_CONTACT);
15475c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                } else {
15485c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    // Otherwise, on 1-pane UI, we need the editor to launch the view contact
15495c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    // intent itself.
15505c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    startActivity(intent);
15515c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                }
1552d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1553d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
15548268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            case R.id.menu_add_group: {
155570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng                createNewGroup();
15568268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                return true;
15578268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            }
155849d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey            case R.id.menu_import_export: {
1559a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng                ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
1560a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng                        PeopleActivity.class);
1561d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1562d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
15632fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            case R.id.menu_clear_frequents: {
15642fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                ClearFrequentsDialog.show(getFragmentManager());
15652fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                return true;
15662fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            }
1567d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_accounts: {
1568d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
1569fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov                intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
1570d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                    ContactsContract.AUTHORITY
1571d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                });
15721fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
1573d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                startActivity(intent);
1574d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1575d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
15769ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            case R.id.export_database: {
15779ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE");
15789ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
15799ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                startActivity(intent);
15809ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                return true;
15819ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            }
15827aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
15837aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return false;
15847aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
15857aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
158670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng    private void createNewGroup() {
158770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        final Intent intent = new Intent(this, GroupEditorActivity.class);
158870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        intent.setAction(Intent.ACTION_INSERT);
158970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        startActivityForResult(intent, SUBACTIVITY_NEW_GROUP);
1590971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan    }
1591971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
15928e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov    @Override
159353b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki    public boolean onSearchRequested() { // Search key pressed.
159453b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        mActionBarAdapter.setSearchMode(true);
159553b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        return true;
1596db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov    }
1597db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
159849d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey    @Override
1599d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
1600d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        switch (requestCode) {
160134b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa            case SUBACTIVITY_ACCOUNT_FILTER: {
160234b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                AccountFilterUtil.handleAccountFilterResult(
160334b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                        mContactListFilterController, resultCode, data);
1604495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan                break;
1605495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            }
1606d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
16075c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            case SUBACTIVITY_NEW_CONTACT:
16085c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            case SUBACTIVITY_EDIT_CONTACT: {
16095c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                if (resultCode == RESULT_OK && PhoneCapabilityTester.isUsingTwoPanes(this)) {
16105c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
1611e1cabcd0956f24a3d3cbe0777b430030f681a739Katherine Kuan                    mAllFragment.setSelectionRequired(true);
16120b3af925788b4fa885b7cd9ad6811dbfca6736ffKatherine Kuan                    mAllFragment.setSelectedContactUri(data.getData());
16135c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    // Suppress IME if in search mode
16145c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    if (mActionBarAdapter != null) {
16155c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                        mActionBarAdapter.clearFocusOnSearchView();
16165c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                    }
1617be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan                    // No need to change the contact filter
1618be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan                    mCurrentFilterIsValid = true;
16195c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                }
16205c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan                break;
16215c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan            }
16225c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan
1623c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            case SUBACTIVITY_NEW_GROUP:
1624c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            case SUBACTIVITY_EDIT_GROUP: {
1625553c8893a37ce11ec7a46eed4048921b196fc91bMakoto Onuki                if (resultCode == RESULT_OK && PhoneCapabilityTester.isUsingTwoPanes(this)) {
1626c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                    mRequest.setActionCode(ContactsRequest.ACTION_GROUP);
1627c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                    mGroupsFragment.setSelectedUri(data.getData());
1628c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                }
1629c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan                break;
1630c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan            }
1631c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
16327aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
16337aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // anymore
1634e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
1635d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                if (resultCode == RESULT_OK) {
163695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                    mAllFragment.onPickerResult(data);
1637d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                }
1638d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
1639d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code
1640d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov//                else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
16411ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // Finish the activity if the sub activity was canceled as back key is used
16421ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
16431ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    finish();
16441ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
16451ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
1646d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        }
1647d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    }
16487aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
16497aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
16507aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
16511ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
16527aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (keyCode) {
16531ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            case KeyEvent.KEYCODE_CALL: {
16541ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                if (callSelection()) {
16551ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    return true;
16561ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
16571ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
16581ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            }
1659db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
16607aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            case KeyEvent.KEYCODE_DEL: {
16616c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov                if (deleteSelection()) {
16627aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                    return true;
16637aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                }
16647aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                break;
16657aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            }
16667bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            default: {
16677bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                // Bring up the search UI if the user starts typing
16687bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                final int unicodeChar = event.getUnicodeChar();
16696b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki                if ((unicodeChar != 0)
16706b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki                        // If COMBINING_ACCENT is set, it's not a unicode character.
16716b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki                        && ((unicodeChar & KeyCharacterMap.COMBINING_ACCENT) == 0)
16726b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki                        && !Character.isWhitespace(unicodeChar)) {
16737bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    String query = new String(new int[]{ unicodeChar }, 0, 1);
1674b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    if (!mActionBarAdapter.isSearchMode()) {
1675b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        mActionBarAdapter.setQueryString(query);
1676b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        mActionBarAdapter.setSearchMode(true);
1677b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        return true;
16787bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    }
16797bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                }
16807bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            }
16817aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
16827aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
16837aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return super.onKeyDown(keyCode, event);
16847aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
1685ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov
1686ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    @Override
1687ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    public void onBackPressed() {
168853b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        if (mActionBarAdapter.isSearchMode()) {
1689ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            mActionBarAdapter.setSearchMode(false);
1690ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        } else {
1691ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            super.onBackPressed();
1692ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        }
1693ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    }
16947aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
16956c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov    private boolean deleteSelection() {
16961ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
16971ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//        if (mActionCode == ContactsRequest.ACTION_DEFAULT) {
16981ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            final int position = mListView.getSelectedItemPosition();
16991ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            if (position != ListView.INVALID_POSITION) {
17001ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                Uri contactUri = getContactUri(position);
17011ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                if (contactUri != null) {
17021ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    doContactDelete(contactUri);
17031ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    return true;
17041ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
17051ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            }
17061ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//        }
17076c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov        return false;
17086c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov    }
17096c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov
171008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
171108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onSaveInstanceState(Bundle outState) {
171208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onSaveInstanceState(outState);
17134d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.onSaveInstanceState(outState);
171458fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        if (mContactDetailLayoutController != null) {
171558fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan            mContactDetailLayoutController.onSaveInstanceState(outState);
171658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan        }
17174d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
17184d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // Clear the listener to make sure we don't get callbacks after onSaveInstanceState,
17194d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // in order to avoid doing fragment transactions after it.
17204d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // TODO Figure out a better way to deal with the issue.
17214d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.setListener(null);
17222e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        if (mTabPager != null) {
17232e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(null);
17242e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        }
172508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
172608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
1727fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
172809d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    protected void onRestoreInstanceState(Bundle savedInstanceState) {
172909d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        super.onRestoreInstanceState(savedInstanceState);
173009d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // In our own lifecycle, the focus is saved and restore but later taken away by the
173109d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // ViewPager. As a hack, we force focus on the SearchView if we know that we are searching.
173209d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // This fixes the keyboard going away on screen rotation
173309d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        if (mActionBarAdapter.isSearchMode()) {
173409d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann            mActionBarAdapter.setFocusOnSearchView();
173509d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        }
173609d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    }
173709d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann
173809d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    @Override
17393391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    public DialogManager getDialogManager() {
17403391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann        return mDialogManager;
17413391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    }
1742ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
1743ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    // Visible for testing
1744ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    public ContactBrowseListFragment getListFragment() {
174595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        return mAllFragment;
1746ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    }
1747ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
1748ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    // Visible for testing
1749ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    public ContactDetailFragment getDetailFragment() {
1750be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan        return mContactDetailFragment;
1751ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov    }
17527aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project}
1753