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