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