PeopleActivity.java revision 82c9033a8f17470a335dd85936479669b50e5877
17aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/* 2fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project 37aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * 47aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * you may not use this file except in compliance with the License. 67aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * You may obtain a copy of the License at 77aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * 87aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * 107aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * See the License for the specific language governing permissions and 147aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * limitations under the License. 157aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */ 167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 1727834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovpackage com.android.contacts.activities; 187aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 19e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.Fragment; 20e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.FragmentManager; 21e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.FragmentTransaction; 22d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shraunerimport android.content.ActivityNotFoundException; 2320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwellimport android.content.ContentUris; 2473a6764f6724f69496afcce602234621efe7fca0Brian Attwellimport android.content.Context; 25e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.content.Intent; 262f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wangimport android.content.pm.PackageManager; 272f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wangimport android.content.pm.ResolveInfo; 28e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.graphics.Rect; 29e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.net.Uri; 301fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wangimport android.os.Build; 31e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Bundle; 32e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Parcelable; 339f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Chengimport android.os.UserManager; 34e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.preference.PreferenceActivity; 35e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract; 36e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.Contacts; 37e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.ProviderStatus; 38ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Waiimport android.provider.ContactsContract.QuickContact; 39e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.Settings; 40e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v13.app.FragmentPagerAdapter; 41e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.PagerAdapter; 42e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.ViewPager; 43b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wangimport android.telecom.TelecomManager; 447d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport android.text.TextUtils; 45e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.util.Log; 46e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyCharacterMap; 47e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyEvent; 48e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.Menu; 49e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuInflater; 50e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuItem; 51e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.View; 52e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.ViewGroup; 53bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport android.view.Window; 542b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulosimport android.widget.ImageButton; 55d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shraunerimport android.widget.Toast; 56bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport android.widget.Toolbar; 57e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 58bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport com.android.contacts.ContactsActivity; 5927834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R; 604d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onukiimport com.android.contacts.activities.ActionBarAdapter.TabState; 61cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.ContactsUtils; 62bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwellimport com.android.contacts.common.activity.RequestPermissionsActivity; 63b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wangimport com.android.contacts.common.compat.TelecomManagerUtil; 64c8dd78c595cfaf9766e59a2df012b16d6c05b213Chiao Chengimport com.android.contacts.common.dialog.ClearFrequentsDialog; 65051f41d0e2e23fa3acd9258ffc91a60cdbe828ecChiao Chengimport com.android.contacts.common.interactions.ImportExportDialogFragment; 66821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment; 67a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListFilter; 680d5588da244d0992c3ff8f25d0875fdf95a8c644Chiao Chengimport com.android.contacts.common.list.ContactListFilterController; 69e776d0366d5bf2f93a0cd0f14e48804e564bccf2Chiao Chengimport com.android.contacts.common.list.ContactTileAdapter.DisplayType; 70f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.list.DirectoryListLoader; 71f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.list.ViewPagerTabs; 72f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.logging.Logger; 73f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.logging.ScreenEvent; 74f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.preference.ContactsPreferenceActivity; 75f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.preference.DisplayOptionsPreferenceFragment; 76f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.AccountFilterUtil; 77f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.Constants; 785d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliuimport com.android.contacts.common.util.ImplicitIntentsUtil; 79f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.ViewUtil; 805d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliuimport com.android.contacts.common.widget.FloatingActionButtonController; 81f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.editor.EditorIntents; 82f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.interactions.ContactDeletionInteraction; 83d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwellimport com.android.contacts.interactions.ContactMultiDeletionInteraction; 84d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwellimport com.android.contacts.interactions.ContactMultiDeletionInteraction.MultiContactDeleteListener; 85d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwellimport com.android.contacts.interactions.JoinContactsDialogFragment; 86d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwellimport com.android.contacts.interactions.JoinContactsDialogFragment.JoinContactsListener; 87d78ee90c0d4d93b82ad440396e87ae4f47f53e93Daniel Lehmannimport com.android.contacts.list.ContactTileListFragment; 880906ee326a5553a224eb7b004536f35b340bdcd3Dmitri Plotnikovimport com.android.contacts.list.ContactsIntentResolver; 891ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikovimport com.android.contacts.list.ContactsRequest; 908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ContactsUnavailableFragment; 91f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.list.MultiSelectContactsListFragment; 92f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.list.MultiSelectContactsListFragment.OnCheckBoxListActionListener; 93732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport com.android.contacts.list.OnContactBrowserActionListener; 948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.OnContactsUnavailableActionListener; 95c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher; 96c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener; 978a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwellimport com.android.contacts.quickcontact.QuickContactActivity; 983391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager; 99f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.util.PhoneCapabilityTester; 10056bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwellimport com.android.contactsbind.HelpUtils; 10157cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka 10220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwellimport java.util.List; 1037d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport java.util.Locale; 1046d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onukiimport java.util.concurrent.atomic.AtomicInteger; 105caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov 1067aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/** 1072c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * Displays a list to browse contacts. 1087aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */ 109bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangpublic class PeopleActivity extends ContactsActivity implements 1102b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos View.OnCreateContextMenuListener, 1112b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos View.OnClickListener, 1122b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos ActionBarAdapter.Listener, 1136e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov DialogManager.DialogShowingViewActivity, 1142b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos ContactListFilterController.ContactListFilterListener, 115d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell ProviderStatusListener, 116d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell MultiContactDeleteListener, 117d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell JoinContactsListener { 11857d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov 1195e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro private static final String TAG = "PeopleActivity"; 1207aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 1219ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!"; 1229ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 1235c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan // These values needs to start at 2. See {@link ContactEntryListFragment}. 1242c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell private static final int SUBACTIVITY_ACCOUNT_FILTER = 2; 125c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan 12634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa private final DialogManager mDialogManager = new DialogManager(this); 1273391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann 128ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov private ContactsIntentResolver mIntentResolver; 129fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov private ContactsRequest mRequest; 130caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov 131fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov private ActionBarAdapter mActionBarAdapter; 132865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell private FloatingActionButtonController mFloatingActionButtonController; 133865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell private View mFloatingActionButtonContainer; 134865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell private boolean wasLastFabAnimationScaleIn = false; 1357c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov 1367979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro private ContactTileListFragment.Listener mFavoritesFragmentListener = 137ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa new StrequentContactListFragmentListener(); 138ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa 13915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private ContactListFilterController mContactListFilterController; 1403c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov 1418b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private ContactsUnavailableFragment mContactsUnavailableFragment; 142c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki private ProviderStatusWatcher mProviderStatusWatcher; 143c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell private Integer mProviderStatus; 1448b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 1450cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov private boolean mOptionsMenuContactsAvailable; 1460cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 14795c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa /** 14895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa * Showing a list of Contacts. Also used for showing search results in search mode. 14995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa */ 15020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell private MultiSelectContactsListFragment mAllFragment; 1517979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro private ContactTileListFragment mFavoritesFragment; 1522b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos 1532c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell /** ViewPager for swipe */ 154250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private ViewPager mTabPager; 1553c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell private ViewPagerTabs mViewPagerTabs; 156250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private TabPagerAdapter mTabPagerAdapter; 1573c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell private String[] mTabTitles; 1582e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki private final TabPagerListener mTabPagerListener = new TabPagerListener(); 15958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 1609ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki private boolean mEnableDebugMenuOptions; 1619ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 162417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /** 163417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * True if this activity instance is a re-created one. i.e. set true after orientation change. 164417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * This is set in {@link #onCreate} for later use in {@link #onStart}. 165417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 166417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki private boolean mIsRecreatedInstance; 167417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 168417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /** 169417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * If {@link #configureFragments(boolean)} is already called. Used to avoid calling it twice 170417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * in {@link #onStart}. 171417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * (This initialization only needs to be done once in onStart() when the Activity was just 172417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * created from scratch -- i.e. onCreate() was just called) 173417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 174417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki private boolean mFragmentInitialized; 175417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 176be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan /** 17732791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski * This is to disable {@link #onOptionsItemSelected} when we trying to stop the activity. 17832791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski */ 17932791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski private boolean mDisableOptionItemSelected; 18032791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski 1816d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki /** Sequential ID assigned to each instance; used for logging */ 1826d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki private final int mInstanceId; 1836d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki private static final AtomicInteger sNextInstanceId = new AtomicInteger(); 1846d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki 1859856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan public PeopleActivity() { 1866d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki mInstanceId = sNextInstanceId.getAndIncrement(); 1871540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov mIntentResolver = new ContactsIntentResolver(this); 188c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher = ProviderStatusWatcher.getInstance(this); 1896178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov } 1906178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov 1916d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki @Override 1926d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki public String toString() { 1936d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki // Shown on logcat 1946d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki return String.format("%s@%d", getClass().getSimpleName(), mInstanceId); 1956d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki } 1966d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki 1978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public boolean areContactsAvailable() { 1982f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang return (mProviderStatus != null) && mProviderStatus.equals(ProviderStatus.STATUS_NORMAL); 1998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 2008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 2016f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki private boolean areGroupWritableAccountsAvailable() { 2026f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki return ContactsUtils.areGroupWritableAccountsAvailable(this); 2036f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki } 20449917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson 20550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki /** 20650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * Initialize fragments that are (or may not be) in the layout. 20750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * 20850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * For the fragments that are in the layout, we initialize them in 209417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * {@link #createViewsAndFragments(Bundle)} after inflating the layout. 21050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * 2112c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * However, the {@link ContactsUnavailableFragment} is a special fragment which may not 2122c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * be in the layout, so we have to do the initialization here. 2132c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * 2142c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * The ContactsUnavailableFragment is always created at runtime. 21550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki */ 2167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 21792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov public void onAttachFragment(Fragment fragment) { 2182c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (fragment instanceof ContactsUnavailableFragment) { 2198b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment; 2208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.setOnContactsUnavailableActionListener( 2218b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov new ContactsUnavailableFragmentListener()); 22292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 22392a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 22492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 22592a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov @Override 22608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov protected void onCreate(Bundle savedState) { 22749627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) { 22849627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate start"); 22949627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki } 23008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov super.onCreate(savedState); 2317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 232bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell if (RequestPermissionsActivity.startPermissionActivity(this)) { 233bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell return; 234bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell } 235bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell 2366d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki if (!processIntent(false)) { 237417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki finish(); 238417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return; 239417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 240a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mContactListFilterController = ContactListFilterController.getInstance(this); 241be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan mContactListFilterController.checkFilterValidity(false); 242a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mContactListFilterController.addListener(this); 243a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa 244c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.addListener(this); 245c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki 246417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mIsRecreatedInstance = (savedState != null); 247417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki createViewsAndFragments(savedState); 2484b1af3f8f68c3f5de459d17c218853fb0849d9f5Andrew Lee 24949627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) { 25049627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish"); 25149627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki } 2525b221086e4b994d6325d7396625900a79e27ae51Sai Cheemalapati getWindow().setBackgroundDrawable(null); 253fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 254fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 255fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov @Override 256fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov protected void onNewIntent(Intent intent) { 257fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov setIntent(intent); 2586d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki if (!processIntent(true)) { 259417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki finish(); 260417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return; 261417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 262417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mActionBarAdapter.initialize(null, mRequest); 263417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 264be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan mContactListFilterController.checkFilterValidity(false); 265be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan 266417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // Re-configure fragments. 267417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki configureFragments(true /* from request */); 2689cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell initializeFabVisibility(); 269417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki invalidateOptionsMenuIfNeeded(); 270fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 271fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 272417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /** 273417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * Resolve the intent and initialize {@link #mRequest}, and launch another activity if redirect 274417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * is needed. 275417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 2766d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki * @param forNewIntent set true if it's called from {@link #onNewIntent(Intent)}. 277417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * @return {@code true} if {@link PeopleActivity} should continue running. {@code false} 278417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * if it shouldn't, in which case the caller should finish() itself and shouldn't do 279417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * farther initialization. 280417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 2816d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki private boolean processIntent(boolean forNewIntent) { 2821ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // Extract relevant information from the intent 2831ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov mRequest = mIntentResolver.resolveIntent(getIntent()); 284ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki if (Log.isLoggable(TAG, Log.DEBUG)) { 2856d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki Log.d(TAG, this + " processIntent: forNewIntent=" + forNewIntent 2866d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki + " intent=" + getIntent() + " request=" + mRequest); 2876d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki } 2881ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov if (!mRequest.isValid()) { 2896178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov setResult(RESULT_CANCELED); 290417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return false; 2916178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov } 2926178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov 2932c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT) { 294c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent( 295c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell mRequest.getContactUri(), QuickContactActivity.MODE_FULLY_EXPANDED); 296c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityInApp(this, intent); 297417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return false; 29850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki } 299417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return true; 300417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 30150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki 302417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki private void createViewsAndFragments(Bundle savedState) { 303bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang // Disable the ActionBar so that we can use a Toolbar. This needs to be called before 304bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang // setContentView(). 305bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang getWindow().requestFeature(Window.FEATURE_NO_TITLE); 306bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang 307417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki setContentView(R.layout.people_activity); 308417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 309417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki final FragmentManager fragmentManager = getFragmentManager(); 310417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 311417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // Hide all tabs (the current tab will later be reshown once a tab is selected) 312417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki final FragmentTransaction transaction = fragmentManager.beginTransaction(); 313417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 3143c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mTabTitles = new String[TabState.COUNT]; 3153c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mTabTitles[TabState.FAVORITES] = getString(R.string.favorites_tab_label); 3163c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mTabTitles[TabState.ALL] = getString(R.string.all_contacts_tab_label); 3172c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPager = getView(R.id.tab_pager); 3182c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPagerAdapter = new TabPagerAdapter(); 3192c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPager.setAdapter(mTabPagerAdapter); 3202c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPager.setOnPageChangeListener(mTabPagerListener); 321417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 322bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang // Configure toolbar and toolbar tabs. If in landscape mode, we configure tabs differntly. 3233c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell final Toolbar toolbar = getView(R.id.toolbar); 324bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang setActionBar(toolbar); 3253c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell final ViewPagerTabs portraitViewPagerTabs 3263c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell = (ViewPagerTabs) findViewById(R.id.lists_pager_header); 3273c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell ViewPagerTabs landscapeViewPagerTabs = null; 3283c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell if (portraitViewPagerTabs == null) { 3293c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell landscapeViewPagerTabs = (ViewPagerTabs) getLayoutInflater().inflate( 3303c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell R.layout.people_activity_tabs_lands, toolbar, /* attachToRoot = */ false); 3313c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs = landscapeViewPagerTabs; 3323c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell } else { 3333c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs = portraitViewPagerTabs; 3343c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell } 3353c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs.setViewPager(mTabPager); 3363c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell 3372c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell final String FAVORITE_TAG = "tab-pager-favorite"; 3382c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell final String ALL_TAG = "tab-pager-all"; 3392c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell 3402c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // Create the fragments and add as children of the view pager. 3412c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // The pager adapter will only change the visibility; it'll never create/destroy 3422c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // fragments. 3432c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // However, if it's after screen rotation, the fragments have been re-created by 3442c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // the fragment manager, so first see if there're already the target fragments 3452c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // existing. 3462c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mFavoritesFragment = (ContactTileListFragment) 3472c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell fragmentManager.findFragmentByTag(FAVORITE_TAG); 34820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAllFragment = (MultiSelectContactsListFragment) 3492c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell fragmentManager.findFragmentByTag(ALL_TAG); 3502c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell 3512c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (mFavoritesFragment == null) { 3522c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mFavoritesFragment = new ContactTileListFragment(); 35320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAllFragment = new MultiSelectContactsListFragment(); 3542c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell 3552c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell transaction.add(R.id.tab_pager, mFavoritesFragment, FAVORITE_TAG); 3562c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG); 357417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 358250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 359417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mFavoritesFragment.setListener(mFavoritesFragmentListener); 36050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki 361417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener()); 36220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAllFragment.setCheckBoxListListener(new CheckBoxListListener()); 36350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki 364417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // Hide all fragments for now. We adjust visibility when we get onSelectedTabChanged() 365417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // from ActionBarAdapter. 366417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki transaction.hide(mFavoritesFragment); 367417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki transaction.hide(mAllFragment); 368f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro 3694b25da79091157935042d2942a8961ceba92166fMinh Pham transaction.commitAllowingStateLoss(); 370417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki fragmentManager.executePendingTransactions(); 3714d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 3720c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro // Setting Properties after fragment is created 3732c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mFavoritesFragment.setDisplayType(DisplayType.STREQUENT); 3740c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro 375bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang mActionBarAdapter = new ActionBarAdapter(this, this, getActionBar(), 3763c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell portraitViewPagerTabs, landscapeViewPagerTabs, toolbar); 377417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mActionBarAdapter.initialize(savedState, mRequest); 37858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 379d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell // Add shadow under toolbar 380d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell ViewUtil.addRectangularOutlineProvider(findViewById(R.id.toolbar_parent), getResources()); 381d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell 382865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell // Configure floating action button 383865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonContainer = findViewById(R.id.floating_action_button_container); 384865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell final ImageButton floatingActionButton 385865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell = (ImageButton) findViewById(R.id.floating_action_button); 3862c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell floatingActionButton.setOnClickListener(this); 387865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonController = new FloatingActionButtonController(this, 388865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonContainer, floatingActionButton); 3899cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell initializeFabVisibility(); 3902b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos 391417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki invalidateOptionsMenuIfNeeded(); 392417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 39308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 394417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki @Override 395417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki protected void onStart() { 396417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki if (!mFragmentInitialized) { 397417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mFragmentInitialized = true; 398417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /* Configure fragments if we haven't. 399417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 400417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * Note it's a one-shot initialization, so we want to do this in {@link #onCreate}. 401417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 402417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * However, because this method may indirectly touch views in fragments but fragments 403417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * created in {@link #configureContentView} using a {@link FragmentTransaction} will NOT 404417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * have views until {@link Activity#onCreate} finishes (they would if they were inflated 405417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * from a layout), we need to do it here in {@link #onStart()}. 406417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 407417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * (When {@link Fragment#onCreateView} is called is different in the former case and 408417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * in the latter case, unfortunately.) 409417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 410417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * Also, we skip most of the work in it if the activity is a re-created one. 411417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * (so the argument.) 412417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 413417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki configureFragments(!mIsRecreatedInstance); 414417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 415417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki super.onStart(); 4163c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov } 4173c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov 4186e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 419174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov protected void onPause() { 420fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mOptionsMenuContactsAvailable = false; 421c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.stop(); 422174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov super.onPause(); 423174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 424174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov 425174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov @Override 426174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov protected void onResume() { 427174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov super.onResume(); 428697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus 429c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.start(); 430697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus updateViewConfiguration(true); 4314d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 4324d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // Re-register the listener, which may have been cleared when onSaveInstanceState was 4334d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // called. See also: onSaveInstanceState 4344d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki mActionBarAdapter.setListener(this); 43532791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski mDisableOptionItemSelected = false; 4362e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki if (mTabPager != null) { 4372e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki mTabPager.setOnPageChangeListener(mTabPagerListener); 4382e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki } 439a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki // Current tab may have changed since the last onSaveInstanceState(). Make sure 440a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki // the actual contents match the tab. 441a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki updateFragmentsVisibility(); 442174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 443174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov 444174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov @Override 4454d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki protected void onDestroy() { 446c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.removeListener(this); 447c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki 448b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa // Some of variables will be null if this Activity redirects Intent. 449b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa // See also onCreate() or other methods called during the Activity's initialization. 450c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki if (mActionBarAdapter != null) { 451c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki mActionBarAdapter.setListener(null); 452c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki } 453b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa if (mContactListFilterController != null) { 454b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa mContactListFilterController.removeListener(this); 455b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa } 456b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa 4574d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki super.onDestroy(); 4584d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 4594d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 460955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov private void configureFragments(boolean fromRequest) { 461009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov if (fromRequest) { 46291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov ContactListFilter filter = null; 46391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov int actionCode = mRequest.getActionCode(); 46453b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki boolean searchMode = mRequest.isSearchMode(); 46552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann final int tabToOpen; 46691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov switch (actionCode) { 46791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_ALL_CONTACTS: 468be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 469be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS); 470ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.ALL; 47191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 47291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_CONTACTS_WITH_PHONES: 473be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 47491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY); 475ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.ALL; 47691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 47791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov 47891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_FREQUENT: 47991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_STREQUENT: 48091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_STARRED: 481ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.FAVORITES; 48291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 4839e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro case ContactsRequest.ACTION_VIEW_CONTACT: 484ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.ALL; 485ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki break; 48652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann default: 48752aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann tabToOpen = -1; 48852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann break; 489ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki } 49052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann if (tabToOpen != -1) { 491ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki mActionBarAdapter.setCurrentTab(tabToOpen); 49291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov } 49391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov 49491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov if (filter != null) { 49591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov mContactListFilterController.setContactListFilter(filter, false); 49653b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki searchMode = false; 497009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov } 498d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 499d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov if (mRequest.getContactUri() != null) { 50053b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki searchMode = false; 501d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov } 502d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 50353b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki mActionBarAdapter.setSearchMode(searchMode); 5040ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan configureContactListFragmentForRequest(); 505fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 506fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 5070ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan configureContactListFragment(); 508fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 5098268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 5106e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 5116e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov 512865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell private void initializeFabVisibility() { 513865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell final boolean hideFab = mActionBarAdapter.isSearchMode() 514865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell || mActionBarAdapter.isSelectionMode(); 515865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonContainer.setVisibility(hideFab ? View.GONE : View.VISIBLE); 5169cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell mFloatingActionButtonController.resetIn(); 517865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell wasLastFabAnimationScaleIn = !hideFab; 518865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 519865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell 520865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell private void showFabWithAnimation(boolean showFab) { 521865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell if (mFloatingActionButtonContainer == null) { 522865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell return; 523865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 524865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell if (showFab) { 525865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell if (!wasLastFabAnimationScaleIn) { 526865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonContainer.setVisibility(View.VISIBLE); 527865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonController.scaleIn(0); 528865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 529865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell wasLastFabAnimationScaleIn = true; 530865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell 531865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } else { 532865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell if (wasLastFabAnimationScaleIn) { 533865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonContainer.setVisibility(View.VISIBLE); 534865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonController.scaleOut(); 535865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 536865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell wasLastFabAnimationScaleIn = false; 537865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 538865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 539865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell 5406e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 541d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov public void onContactListFilterChanged() { 54295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment == null || !mAllFragment.isAdded()) { 543d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov return; 544d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov } 545d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov 54695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setFilter(mContactListFilterController.getFilter()); 547e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov 5488268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 5493ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov } 5503ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov 551fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov /** 552fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Handler for action bar actions. 553fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov */ 554fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov @Override 555311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann public void onAction(int action) { 556b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan switch (action) { 55720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell case ActionBarAdapter.Listener.Action.START_SELECTION_MODE: 55820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAllFragment.displayCheckBoxes(true); 559a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang startSearchOrSelectionMode(); 560a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang break; 561311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann case ActionBarAdapter.Listener.Action.START_SEARCH_MODE: 562a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang if (!mIsRecreatedInstance) { 56382c9033a8f17470a335dd85936479669b50e5877Walter Jang Logger.logScreenView(ScreenEvent.SEARCH, this, ScreenEvent.TAG_SEARCH); 564a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang } 565a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang startSearchOrSelectionMode(); 566865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell break; 567865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell case ActionBarAdapter.Listener.Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE: 568865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell showFabWithAnimation(/* showFabWithAnimation = */ true); 569b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan break; 57020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell case ActionBarAdapter.Listener.Action.STOP_SEARCH_AND_SELECTION_MODE: 5711db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki setQueryTextToFragment(""); 5724d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki updateFragmentsVisibility(); 5738811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki invalidateOptionsMenu(); 574865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell showFabWithAnimation(/* showFabWithAnimation = */ true); 5758268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan break; 576311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY: 5779ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki final String queryString = mActionBarAdapter.getQueryString(); 5789ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki setQueryTextToFragment(queryString); 5799ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki updateDebugOptionsVisibility( 5809ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki ENABLE_DEBUG_OPTIONS_HIDDEN_CODE.equals(queryString)); 581b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan break; 582b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan default: 583b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action); 584b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 585fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov } 586fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov 587a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang private void startSearchOrSelectionMode() { 588a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang configureFragments(false /* from request */); 589a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang updateFragmentsVisibility(); 590a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang invalidateOptionsMenu(); 591a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang showFabWithAnimation(/* showFabWithAnimation = */ false); 592a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang } 593a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang 5944d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki @Override 5954d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki public void onSelectedTabChanged() { 5964d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki updateFragmentsVisibility(); 5974d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 5984d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 5996adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell @Override 6006adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell public void onUpButtonPressed() { 6016adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell onBackPressed(); 6026adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell } 6036adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell 6049ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki private void updateDebugOptionsVisibility(boolean visible) { 6059ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki if (mEnableDebugMenuOptions != visible) { 6069ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki mEnableDebugMenuOptions = visible; 6079ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki invalidateOptionsMenu(); 6089ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki } 6099ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki } 6109ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 6114d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki /** 6124d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki * Updates the fragment/view visibility according to the current mode, such as 6134d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki * {@link ActionBarAdapter#isSearchMode()} and {@link ActionBarAdapter#getCurrentTab()}. 6144d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki */ 6154d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki private void updateFragmentsVisibility() { 61652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann int tab = mActionBarAdapter.getCurrentTab(); 6174d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 61820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (mActionBarAdapter.isSearchMode() || mActionBarAdapter.isSelectionMode()) { 61920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mTabPagerAdapter.setTabsHidden(true); 6202c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell } else { 62120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell // No smooth scrolling if quitting from the search/selection mode. 62220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final boolean wereTabsHidden = mTabPagerAdapter.areTabsHidden() 62320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell || mActionBarAdapter.isSelectionMode(); 62420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mTabPagerAdapter.setTabsHidden(false); 6252c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (mTabPager.getCurrentItem() != tab) { 62620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mTabPager.setCurrentItem(tab, !wereTabsHidden); 6272c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell } 6284d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 629d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell if (!mActionBarAdapter.isSelectionMode()) { 630d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell mAllFragment.displayCheckBoxes(false); 631d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell } 6322c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell invalidateOptionsMenu(); 63366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson showEmptyStateForTab(tab); 63466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson } 63566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson 63652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann private void showEmptyStateForTab(int tab) { 63766606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson if (mContactsUnavailableFragment != null) { 6389203788d3f55e84d55db4c5a87bbbf1fa1e36b43Brian Attwell switch (getTabPositionForTextDirection(tab)) { 63952aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann case TabState.FAVORITES: 640b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang mContactsUnavailableFragment.setTabInfo( 641b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang R.string.listTotalAllContactsZeroStarred, TabState.FAVORITES); 64266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson break; 64352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann case TabState.ALL: 644b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang mContactsUnavailableFragment.setTabInfo(R.string.noContacts, TabState.ALL); 64566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson break; 64666606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson } 6478d71f11c70c974518f3482c46a10a5601628a029Brian Attwell // When using the mContactsUnavailableFragment the ViewPager doesn't contain two views. 6488d71f11c70c974518f3482c46a10a5601628a029Brian Attwell // Therefore, we have to trick the ViewPagerTabs into thinking we have changed tabs 6498d71f11c70c974518f3482c46a10a5601628a029Brian Attwell // when the mContactsUnavailableFragment changes. Otherwise the tab strip won't move. 6508d71f11c70c974518f3482c46a10a5601628a029Brian Attwell mViewPagerTabs.onPageScrolled(tab, 0, 0); 65166606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson } 6524d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 6534d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 654250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private class TabPagerListener implements ViewPager.OnPageChangeListener { 65570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng 65670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // This package-protected constructor is here because of a possible compiler bug. 65770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // PeopleActivity$1.class should be generated due to the private outer/inner class access 65870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // needed here. But for some reason, PeopleActivity$1.class is missing. 65970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // Since $1 class is needed as a jvm work around to get access to the inner class, 66070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // changing the constructor to package-protected or public will solve the problem. 66170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // To verify whether $1 class is needed, javap PeopleActivity$TabPagerListener and look for 66270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // references to PeopleActivity$1. 66370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // 66470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // When the constructor is private and PeopleActivity$1.class is missing, proguard will 66570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // correctly catch this and throw warnings and error out the build on user/userdebug builds. 66670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // 66770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // All private inner classes below also need this fix. 66870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng TabPagerListener() {} 66970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng 670250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 671250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void onPageScrollStateChanged(int state) { 67220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (!mTabPagerAdapter.areTabsHidden()) { 6733c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs.onPageScrollStateChanged(state); 6743c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell } 675250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 676250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 677250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 678250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 67920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (!mTabPagerAdapter.areTabsHidden()) { 6803c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs.onPageScrolled(position, positionOffset, positionOffsetPixels); 6813c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell } 682250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 683250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 684250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 685250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void onPageSelected(int position) { 686250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki // Make sure not in the search mode, in which case position != TabState.ordinal(). 68720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (!mTabPagerAdapter.areTabsHidden()) { 68852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann mActionBarAdapter.setCurrentTab(position, false); 6893c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs.onPageSelected(position); 69052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann showEmptyStateForTab(position); 6918811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki invalidateOptionsMenu(); 692250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 693250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 694250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 695250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 696250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki /** 697250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * Adapter for the {@link ViewPager}. Unlike {@link FragmentPagerAdapter}, 698250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * {@link #instantiateItem} returns existing fragments, and {@link #instantiateItem}/ 699250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * {@link #destroyItem} show/hide fragments instead of attaching/detaching. 700250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * 701250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * In search mode, we always show the "all" fragment, and disable the swipe. We change the 702250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * number of items to 1 to disable the swipe. 703250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * 704250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * TODO figure out a more straight way to disable swipe. 705250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki */ 706250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private class TabPagerAdapter extends PagerAdapter { 707250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private final FragmentManager mFragmentManager; 708250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private FragmentTransaction mCurTransaction = null; 709250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 71020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell private boolean mAreTabsHiddenInTabPager; 711250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 712746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki private Fragment mCurrentPrimaryItem; 713746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki 714250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public TabPagerAdapter() { 715250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mFragmentManager = getFragmentManager(); 716250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 717250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 71820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell public boolean areTabsHidden() { 71920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell return mAreTabsHiddenInTabPager; 720250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 721250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 72220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell public void setTabsHidden(boolean hideTabs) { 72320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (hideTabs == mAreTabsHiddenInTabPager) { 724250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return; 725250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 72620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAreTabsHiddenInTabPager = hideTabs; 727250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki notifyDataSetChanged(); 728250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 729250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 730250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 731250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public int getCount() { 73220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell return mAreTabsHiddenInTabPager ? 1 : TabState.COUNT; 733250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 734250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 735250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki /** Gets called when the number of items changes. */ 736250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 737250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public int getItemPosition(Object object) { 73820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (mAreTabsHiddenInTabPager) { 739250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (object == mAllFragment) { 740250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return 0; // Only 1 page in search mode 741250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 742250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } else { 743250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (object == mFavoritesFragment) { 744962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell return getTabPositionForTextDirection(TabState.FAVORITES); 745250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 746250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (object == mAllFragment) { 747962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell return getTabPositionForTextDirection(TabState.ALL); 748250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 749250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 750250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return POSITION_NONE; 751250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 752250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 753250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 754970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void startUpdate(ViewGroup container) { 755250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 756250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 757250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private Fragment getFragment(int position) { 758962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell position = getTabPositionForTextDirection(position); 75920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (mAreTabsHiddenInTabPager) { 7608d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann if (position != 0) { 7618d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann // This has only been observed in monkey tests. 7628d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann // Let's log this issue, but not crash 7638d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann Log.w(TAG, "Request fragment at position=" + position + ", eventhough we " + 7648d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann "are in search mode"); 765250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 7668d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann return mAllFragment; 767250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } else { 76852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann if (position == TabState.FAVORITES) { 769250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return mFavoritesFragment; 77052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann } else if (position == TabState.ALL) { 771250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return mAllFragment; 772250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 773250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 774250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki throw new IllegalArgumentException("position: " + position); 775250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 776250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 777250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 778970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public Object instantiateItem(ViewGroup container, int position) { 779250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mCurTransaction == null) { 780250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction = mFragmentManager.beginTransaction(); 781250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 782250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki Fragment f = getFragment(position); 783250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction.show(f); 784746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki 7859bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell // Non primary pages are not visible. 7869bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell f.setUserVisibleHint(f == mCurrentPrimaryItem); 787250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return f; 788250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 789250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 790250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 791970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void destroyItem(ViewGroup container, int position, Object object) { 792250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mCurTransaction == null) { 793250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction = mFragmentManager.beginTransaction(); 794250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 795250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction.hide((Fragment) object); 796250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 797250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 798250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 799970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void finishUpdate(ViewGroup container) { 800250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mCurTransaction != null) { 8014b25da79091157935042d2942a8961ceba92166fMinh Pham mCurTransaction.commitAllowingStateLoss(); 802250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction = null; 803250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mFragmentManager.executePendingTransactions(); 804250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 805250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 806250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 807250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 808250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public boolean isViewFromObject(View view, Object object) { 809250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return ((Fragment) object).getView() == view; 810250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 811250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 812250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 813970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void setPrimaryItem(ViewGroup container, int position, Object object) { 814746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki Fragment fragment = (Fragment) object; 815746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki if (mCurrentPrimaryItem != fragment) { 816746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki if (mCurrentPrimaryItem != null) { 8179bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell mCurrentPrimaryItem.setUserVisibleHint(false); 818746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 819746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki if (fragment != null) { 8209bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell fragment.setUserVisibleHint(true); 821746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 822746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki mCurrentPrimaryItem = fragment; 823746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 824746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 825746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki 826746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki @Override 827250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public Parcelable saveState() { 828250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return null; 829250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 830250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 831250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 832250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void restoreState(Parcelable state, ClassLoader loader) { 833250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 8343c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell 8353c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell @Override 8363c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell public CharSequence getPageTitle(int position) { 8373c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell return mTabTitles[position]; 8383c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell } 839250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 840250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 8411db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki private void setQueryTextToFragment(String query) { 84295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setQueryString(query, true); 8431db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki mAllFragment.setVisibleScrollbarEnabled(!mAllFragment.isSearchMode()); 8448268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 8458268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan 8460ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan private void configureContactListFragmentForRequest() { 847fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov Uri contactUri = mRequest.getContactUri(); 848fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (contactUri != null) { 84995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setSelectedContactUri(contactUri); 850fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 851238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 852a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mAllFragment.setFilter(mContactListFilterController.getFilter()); 8531db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki setQueryTextToFragment(mActionBarAdapter.getQueryString()); 854238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 855fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (mRequest.isDirectorySearchEnabled()) { 85695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT); 857fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } else { 85895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE); 859fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 86008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 86108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 8620ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan private void configureContactListFragment() { 863a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa // Filter may be changed when this Activity is in background. 864a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mAllFragment.setFilter(mContactListFilterController.getFilter()); 865a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa 8662c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mAllFragment.setVerticalScrollbarPosition(getScrollBarPosition()); 8672c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mAllFragment.setSelectionVisible(false); 868e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng } 869e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng 8702c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell private int getScrollBarPosition() { 8712c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell return isRTL() ? View.SCROLLBAR_POSITION_LEFT : View.SCROLLBAR_POSITION_RIGHT; 872e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng } 873e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng 874e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng private boolean isRTL() { 875e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng final Locale locale = Locale.getDefault(); 876e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng return TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL; 8771ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 8781323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov 8798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 8808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onProviderStatusChange() { 881697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus updateViewConfiguration(false); 8828b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8838b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 884697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus private void updateViewConfiguration(boolean forceUpdate) { 885c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell int providerStatus = mProviderStatusWatcher.getProviderStatus(); 886d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki if (!forceUpdate && (mProviderStatus != null) 887c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell && (mProviderStatus.equals(providerStatus))) return; 8888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mProviderStatus = providerStatus; 8898b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view); 8918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 892c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell if (mProviderStatus.equals(ProviderStatus.STATUS_NORMAL)) { 893b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus // Ensure that the mTabPager is visible; we may have made it invisible below. 894c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov contactsUnavailableView.setVisibility(View.GONE); 895b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus if (mTabPager != null) { 896b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus mTabPager.setVisibility(View.VISIBLE); 897b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus } 898b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus 89995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment != null) { 90095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setEnabled(true); 9018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } else { 9035d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu // Setting up the page so that the user can still use the app 9045d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu // even without an account. 90595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment != null) { 90695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setEnabled(false); 9078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (mContactsUnavailableFragment == null) { 9098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment = new ContactsUnavailableFragment(); 9108b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.setOnContactsUnavailableActionListener( 9118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov new ContactsUnavailableFragmentListener()); 9123ed426c842a68895a759548fef87bac359f937bbDianne Hackborn getFragmentManager().beginTransaction() 9138b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment) 9144b25da79091157935042d2942a8961ceba92166fMinh Pham .commitAllowingStateLoss(); 9158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 916d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki mContactsUnavailableFragment.updateStatus(mProviderStatus); 917b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus 918b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus // Show the contactsUnavailableView, and hide the mTabPager so that we don't 919b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus // see it sliding in underneath the contactsUnavailableView at the edges. 9208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov contactsUnavailableView.setVisibility(View.VISIBLE); 921b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus if (mTabPager != null) { 922b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus mTabPager.setVisibility(View.GONE); 923b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus } 924b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus 92552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann showEmptyStateForTab(mActionBarAdapter.getCurrentTab()); 9268b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9278b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 9288268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 9298b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9308b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 9311ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov private final class ContactBrowserActionListener implements OnContactBrowserActionListener { 93270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng ContactBrowserActionListener() {} 933d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 934e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 935d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov public void onSelectionChange() { 936e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov 9371ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 938e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov 939e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 940ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai public void onViewContactAction(Uri contactLookupUri, boolean isEnterpriseContact) { 941ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai if (isEnterpriseContact) { 942ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai // No implicit intent as user may have a different contacts app in work profile. 943ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai QuickContact.showQuickContact(PeopleActivity.this, new Rect(), contactLookupUri, 944ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai QuickContactActivity.MODE_FULLY_EXPANDED, null); 945ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai } else { 946ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent( 947ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai contactLookupUri, 948ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai QuickContactActivity.MODE_FULLY_EXPANDED); 949ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent); 950ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai } 9511ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 952416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov 953e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 9541ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onDeleteContactAction(Uri contactUri) { 9559856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false); 9561ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 9578a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov 958e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 9591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onFinishAction() { 9601ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov onBackPressed(); 9611ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 9626e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov 9636e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 9646e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov public void onInvalidSelection() { 965b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter filter; 966b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter currentFilter = mAllFragment.getFilter(); 967b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa if (currentFilter != null 968b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) { 969b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa filter = ContactListFilter.createFilterWithType( 970b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS); 971b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa mAllFragment.setFilter(filter); 972b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa } else { 973b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa filter = ContactListFilter.createFilterWithType( 974b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter.FILTER_TYPE_SINGLE_CONTACT); 975b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa mAllFragment.setFilter(filter, false); 976b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa } 977d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov mContactListFilterController.setContactListFilter(filter, true); 9786e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 9791ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 980416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov 98120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell private final class CheckBoxListListener implements OnCheckBoxListActionListener { 98220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell @Override 98320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell public void onStartDisplayingCheckBoxes() { 984865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mActionBarAdapter.setSelectionMode(true); 985865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell invalidateOptionsMenu(); 98620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 98720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell 98820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell @Override 98920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell public void onSelectedContactIdsChanged() { 99020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mActionBarAdapter.setSelectionCount(mAllFragment.getSelectedContactIds().size()); 99120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell invalidateOptionsMenu(); 99220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 9938f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell 9948f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell @Override 9958f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell public void onStopDisplayingCheckBoxes() { 9968f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell mActionBarAdapter.setSelectionMode(false); 9978f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell } 99820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 99920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell 10008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private class ContactsUnavailableFragmentListener 10018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov implements OnContactsUnavailableActionListener { 100270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng ContactsUnavailableFragmentListener() {} 10038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 10048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 10058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onCreateNewContactAction() { 1006c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, 10075a7a23bdb698b8e741a425c9617c5e33e6314cddWalter Jang EditorIntents.createCompactInsertContactIntent()); 10088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 10098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 10108b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 10118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onAddAccountAction() { 10125d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount(); 1013c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityOutsideApp(PeopleActivity.this, intent); 10148b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 10158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 10168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 10178b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onImportContactsFromFileAction() { 10189379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang showImportExportDialogFragment(); 10198b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 10208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 10218b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 1022ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa private final class StrequentContactListFragmentListener 10237979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro implements ContactTileListFragment.Listener { 102470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng StrequentContactListFragmentListener() {} 102570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng 1026ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa @Override 10277a700cf798a19a8452b8671f643a05336f63f611Katherine Kuan public void onContactSelected(Uri contactUri, Rect targetRect) { 1028c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(contactUri, 1029c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell QuickContactActivity.MODE_FULLY_EXPANDED); 1030c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent); 1031ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa } 10324e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus 10334e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus @Override 10344e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus public void onCallNumberDirectly(String phoneNumber) { 10354e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus // No need to call phone number directly from People app. 10364e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus Log.w(TAG, "unexpected invocation of onCallNumberDirectly()"); 10374e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus } 1038ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa } 1039ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa 10407aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 10417aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 1042946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki if (!areContactsAvailable()) { 1043946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki // If contacts aren't available, hide all menu items. 1044946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki return false; 1045946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki } 1046d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey super.onCreateOptionsMenu(menu); 1047d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey 1048d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov MenuInflater inflater = getMenuInflater(); 104918e0cabec8df2e20ab4b33320804cc3472f195c2Daisuke Miyakawa inflater.inflate(R.menu.people_options, menu); 1050971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan 1051b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan return true; 1052d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 10537aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 10548268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan private void invalidateOptionsMenuIfNeeded() { 10550cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov if (isOptionsMenuChanged()) { 10568268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenu(); 10570cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 10580cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 10590cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 10600cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov public boolean isOptionsMenuChanged() { 10610cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov if (mOptionsMenuContactsAvailable != areContactsAvailable()) { 10620cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return true; 10630cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 10640cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 106595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment != null && mAllFragment.isOptionsMenuChanged()) { 10660cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return true; 10670cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 10680cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 10690cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return false; 10700cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 10710cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 10720cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov @Override 1073d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey public boolean onPrepareOptionsMenu(Menu menu) { 10740cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov mOptionsMenuContactsAvailable = areContactsAvailable(); 10750cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov if (!mOptionsMenuContactsAvailable) { 10768b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov return false; 10778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 10788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 10792fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu // Get references to individual menu items in the menu 1080789bc596877861da26ca862c699a269783d8d42aIsaac Katzenelson final MenuItem contactsFilterMenu = menu.findItem(R.id.menu_contacts_filter); 10812fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu final MenuItem clearFrequentsMenu = menu.findItem(R.id.menu_clear_frequents); 10828bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwell final MenuItem helpMenu = menu.findItem(R.id.menu_help); 10832fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu 108420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final boolean isSearchOrSelectionMode = mActionBarAdapter.isSearchMode() 108520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell || mActionBarAdapter.isSelectionMode(); 108620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (isSearchOrSelectionMode) { 1087683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson contactsFilterMenu.setVisible(false); 10882fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu clearFrequentsMenu.setVisible(false); 10898bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwell helpMenu.setVisible(false); 10908268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } else { 10919203788d3f55e84d55db4c5a87bbbf1fa1e36b43Brian Attwell switch (getTabPositionForTextDirection(mActionBarAdapter.getCurrentTab())) { 109252aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann case TabState.FAVORITES: 1093683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson contactsFilterMenu.setVisible(false); 10942fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu clearFrequentsMenu.setVisible(hasFrequents()); 1095683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson break; 109652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann case TabState.ALL: 1097683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson contactsFilterMenu.setVisible(true); 10982fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu clearFrequentsMenu.setVisible(false); 10998268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan break; 11008268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 110156bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell helpMenu.setVisible(HelpUtils.isHelpAndFeedbackAvailable()); 1102e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov } 110320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final boolean showMiscOptions = !isSearchOrSelectionMode; 1104b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wang final boolean showBlockedNumbers = PhoneCapabilityTester.isPhone(this) 1105b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wang && ContactsUtils.FLAG_N_FEATURE; 1106af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_search, showMiscOptions); 1107af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_import_export, showMiscOptions); 1108af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_accounts, showMiscOptions); 11099d115f0e9222e0f4b95a1ef55085ba6bdd8eb3b4Wenyi Wang makeMenuItemVisible(menu, R.id.menu_blocked_numbers, showMiscOptions && showBlockedNumbers); 1110af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_settings, 1111af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki showMiscOptions && !ContactsPreferenceActivity.isEmpty(this)); 1112e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov 111320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final boolean showSelectedContactOptions = mActionBarAdapter.isSelectionMode() 111420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell && mAllFragment.getSelectedContactIds().size() != 0; 111520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell makeMenuItemVisible(menu, R.id.menu_share, showSelectedContactOptions); 111620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell makeMenuItemVisible(menu, R.id.menu_delete, showSelectedContactOptions); 1117687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang final boolean showLinkContactsOptions = mActionBarAdapter.isSelectionMode() 1118687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang && mAllFragment.getSelectedContactIds().size() > 1; 1119687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang makeMenuItemVisible(menu, R.id.menu_join, showLinkContactsOptions); 112020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell 11219ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki // Debug options need to be visible even in search mode. 11222f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang makeMenuItemVisible(menu, R.id.export_database, mEnableDebugMenuOptions && 11232f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang hasExportIntentHandler()); 11249ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 1125d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 11267aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 11277aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 11282f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang private boolean hasExportIntentHandler() { 11292f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang final Intent intent = new Intent(); 11302f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang intent.setAction("com.android.providers.contacts.DUMP_DATABASE"); 11312f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang final List<ResolveInfo> receivers = getPackageManager().queryIntentActivities(intent, 11322f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang PackageManager.MATCH_DEFAULT_ONLY); 11332f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang return receivers != null && receivers.size() > 0; 11342f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang } 11352f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang 11362fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu /** 11372fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu * Returns whether there are any frequently contacted people being displayed 11382fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu * @return 11392fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu */ 11402fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu private boolean hasFrequents() { 11412c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell return mFavoritesFragment.hasFrequents(); 11422fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu } 11432fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu 1144af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki private void makeMenuItemVisible(Menu menu, int itemId, boolean visible) { 1145d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell final MenuItem item = menu.findItem(itemId); 1146af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki if (item != null) { 1147af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki item.setVisible(visible); 1148af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki } 1149af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki } 1150af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki 1151d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell private void makeMenuItemEnabled(Menu menu, int itemId, boolean visible) { 1152d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell final MenuItem item = menu.findItem(itemId); 1153d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell if (item != null) { 1154d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell item.setEnabled(visible); 1155d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell } 1156d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell } 1157d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell 11587aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 11597aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 116032791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski if (mDisableOptionItemSelected) { 116132791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski return false; 116232791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski } 116332791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski 11647aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project switch (item.getItemId()) { 1165e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki case android.R.id.home: { 1166e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki // The home icon on the action bar is pressed 1167e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki if (mActionBarAdapter.isUpShowing()) { 1168e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki // "UP" icon press -- should be treated as "back". 1169e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki onBackPressed(); 1170e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki } 1171e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki return true; 1172e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki } 1173c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov case R.id.menu_settings: { 117486f2a86b99ccd4430dcaa7fcf88e8190cb64eb05Wenyi Wang startActivity(new Intent(this, ContactsPreferenceActivity.class)); 11757aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return true; 1176d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 1177b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan case R.id.menu_contacts_filter: { 1178b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus AccountFilterUtil.startAccountFilterActivityForResult( 1179b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus this, SUBACTIVITY_ACCOUNT_FILTER, 1180b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus mContactListFilterController.getFilter()); 1181b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan return true; 1182b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 1183d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey case R.id.menu_search: { 11848e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov onSearchRequested(); 11857aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return true; 1186d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 118720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell case R.id.menu_share: 118820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell shareSelectedContacts(); 118920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell return true; 1190d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell case R.id.menu_join: 1191d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell joinSelectedContacts(); 1192d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell return true; 1193d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell case R.id.menu_delete: 1194d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell deleteSelectedContacts(); 1195d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell return true; 119649d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey case R.id.menu_import_export: { 11979379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang showImportExportDialogFragment(); 1198d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 1199d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 12002fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu case R.id.menu_clear_frequents: { 12012fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu ClearFrequentsDialog.show(getFragmentManager()); 12022fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu return true; 12032fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu } 120456bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell case R.id.menu_help: 120556bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell HelpUtils.launchHelpAndFeedbackForMainScreen(this); 120656bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell return true; 1207d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey case R.id.menu_accounts: { 1208d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS); 1209fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] { 1210d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey ContactsContract.AUTHORITY 1211d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey }); 12121fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 1213c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityInAppIfPossible(this, intent); 1214d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 1215d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 12161fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang case R.id.menu_blocked_numbers: { 1217b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wang TelecomManagerUtil.launchBlockedNumbersActivity( 1218b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wang (TelecomManager) getSystemService(Context.TELECOM_SERVICE)); 12191fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang return true; 12201fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang } 12219ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki case R.id.export_database: { 12229ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE"); 12239ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 1224c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityOutsideApp(this, intent); 12259ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki return true; 12269ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki } 12277aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 12287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return false; 12297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 12307aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 12319379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang private void showImportExportDialogFragment(){ 12329379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang final boolean isOnFavoriteTab = mTabPagerAdapter.mCurrentPrimaryItem == mFavoritesFragment; 12339379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang if (isOnFavoriteTab) { 12349379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(), 12359379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang PeopleActivity.class, ImportExportDialogFragment.EXPORT_MODE_FAVORITES); 12369379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang } else { 12379379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(), 12389379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang PeopleActivity.class, ImportExportDialogFragment.EXPORT_MODE_ALL_CONTACTS); 12399379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang } 12409379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang } 12419379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang 12428e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov @Override 124353b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki public boolean onSearchRequested() { // Search key pressed. 124420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (!mActionBarAdapter.isSelectionMode()) { 124520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mActionBarAdapter.setSearchMode(true); 124620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 124753b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki return true; 1248db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov } 1249db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov 125020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell /** 125120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell * Share all contacts that are currently selected in mAllFragment. This method is pretty 125220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell * inefficient for handling large numbers of contacts. I don't expect this to be a problem. 125320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell */ 125420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell private void shareSelectedContacts() { 125520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final StringBuilder uriListBuilder = new StringBuilder(); 125620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell for (Long contactId : mAllFragment.getSelectedContactIds()) { 125720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 125820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), contactUri); 12595b69125ca54b41429374041d73febd33af0dd596Jay Shrauner if (lookupUri == null) { 12605b69125ca54b41429374041d73febd33af0dd596Jay Shrauner continue; 12615b69125ca54b41429374041d73febd33af0dd596Jay Shrauner } 12625b69125ca54b41429374041d73febd33af0dd596Jay Shrauner final List<String> pathSegments = lookupUri.getPathSegments(); 12635b69125ca54b41429374041d73febd33af0dd596Jay Shrauner if (pathSegments.size() < 2) { 12645b69125ca54b41429374041d73febd33af0dd596Jay Shrauner continue; 12655b69125ca54b41429374041d73febd33af0dd596Jay Shrauner } 12665b69125ca54b41429374041d73febd33af0dd596Jay Shrauner final String lookupKey = pathSegments.get(pathSegments.size() - 2); 12675b69125ca54b41429374041d73febd33af0dd596Jay Shrauner if (uriListBuilder.length() > 0) { 12685b69125ca54b41429374041d73febd33af0dd596Jay Shrauner uriListBuilder.append(':'); 12695b69125ca54b41429374041d73febd33af0dd596Jay Shrauner } 12705b69125ca54b41429374041d73febd33af0dd596Jay Shrauner uriListBuilder.append(Uri.encode(lookupKey)); 12715b69125ca54b41429374041d73febd33af0dd596Jay Shrauner } 12725b69125ca54b41429374041d73febd33af0dd596Jay Shrauner if (uriListBuilder.length() == 0) { 12735b69125ca54b41429374041d73febd33af0dd596Jay Shrauner return; 127420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 127520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final Uri uri = Uri.withAppendedPath( 127620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell Contacts.CONTENT_MULTI_VCARD_URI, 127720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell Uri.encode(uriListBuilder.toString())); 127820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final Intent intent = new Intent(Intent.ACTION_SEND); 127920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell intent.setType(Contacts.CONTENT_VCARD_TYPE); 128020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell intent.putExtra(Intent.EXTRA_STREAM, uri); 128120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell ImplicitIntentsUtil.startActivityOutsideApp(this, intent); 128220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 1283a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang 1284d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell private void joinSelectedContacts() { 1285d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell JoinContactsDialogFragment.start(this, mAllFragment.getSelectedContactIds()); 1286d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell } 1287d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell 1288d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell @Override 1289d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell public void onContactsJoined() { 12901154bbabc1f174f7dca40d92f59d2b2731930b3aBrian Attwell mActionBarAdapter.setSelectionMode(false); 1291d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell } 1292d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell 1293d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell private void deleteSelectedContacts() { 1294d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell ContactMultiDeletionInteraction.start(PeopleActivity.this, 1295d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell mAllFragment.getSelectedContactIds()); 1296d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell } 1297d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell 1298d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell @Override 1299d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell public void onDeletionFinished() { 13001154bbabc1f174f7dca40d92f59d2b2731930b3aBrian Attwell mActionBarAdapter.setSelectionMode(false); 1301d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell } 1302d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell 130349d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey @Override 1304d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov protected void onActivityResult(int requestCode, int resultCode, Intent data) { 1305d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov switch (requestCode) { 130634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa case SUBACTIVITY_ACCOUNT_FILTER: { 130734b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa AccountFilterUtil.handleAccountFilterResult( 130834b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa mContactListFilterController, resultCode, data); 1309495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan break; 1310495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan } 1311d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 13127aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann // TODO: Using the new startActivityWithResultFromFragment API this should not be needed 13137aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann // anymore 1314e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER: 1315d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov if (resultCode == RESULT_OK) { 131695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.onPickerResult(data); 1317d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 1318d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 1319d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code 1320d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) { 13211ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// // Finish the activity if the sub activity was canceled as back key is used 13221ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// // to confirm user selection in MODE_PICK_MULTIPLE_PHONES. 13231ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// finish(); 13241ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 13251ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// break; 1326d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 1327d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 13287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 13297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 13307aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 13311ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // TODO move to the fragment 1332db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov 133320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell // Bring up the search UI if the user starts typing 133420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final int unicodeChar = event.getUnicodeChar(); 133520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if ((unicodeChar != 0) 133620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell // If COMBINING_ACCENT is set, it's not a unicode character. 133720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell && ((unicodeChar & KeyCharacterMap.COMBINING_ACCENT) == 0) 133820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell && !Character.isWhitespace(unicodeChar)) { 133920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (mActionBarAdapter.isSelectionMode()) { 134020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell // Ignore keyboard input when in selection mode. 134120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell return true; 13427aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 134320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell String query = new String(new int[]{unicodeChar}, 0, 1); 134420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (!mActionBarAdapter.isSearchMode()) { 134520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mActionBarAdapter.setSearchMode(true); 134620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mActionBarAdapter.setQueryString(query); 134720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell return true; 13487bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann } 13497aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 13507aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 13517aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return super.onKeyDown(keyCode, event); 13527aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 1353ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov 1354ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov @Override 1355ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov public void onBackPressed() { 13567712aef22da432331a67c710cfc18bce2c493887Jay Shrauner if (!isSafeToCommitTransactions()) { 1357c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner return; 1358c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner } 1359c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner 136020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (mActionBarAdapter.isSelectionMode()) { 136120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mActionBarAdapter.setSelectionMode(false); 136220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAllFragment.displayCheckBoxes(false); 136320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } else if (mActionBarAdapter.isSearchMode()) { 1364ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov mActionBarAdapter.setSearchMode(false); 1365a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang 1366a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang if (mAllFragment.wasSearchResultClicked()) { 1367a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang mAllFragment.resetSearchResultClicked(); 1368a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang } else { 136982c9033a8f17470a335dd85936479669b50e5877Walter Jang Logger.logScreenView(ScreenEvent.SEARCH_EXIT, this, ScreenEvent.TAG_SEARCH_EXIT); 137082c9033a8f17470a335dd85936479669b50e5877Walter Jang Logger.logSearchEvent(mAllFragment.createSearchState()); 1371a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang } 1372ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } else { 1373ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov super.onBackPressed(); 1374ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } 1375ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } 13767aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 137708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov @Override 137808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov protected void onSaveInstanceState(Bundle outState) { 137908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov super.onSaveInstanceState(outState); 13804d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki mActionBarAdapter.onSaveInstanceState(outState); 13814d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 13824d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // Clear the listener to make sure we don't get callbacks after onSaveInstanceState, 13834d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // in order to avoid doing fragment transactions after it. 13844d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // TODO Figure out a better way to deal with the issue. 138532791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski mDisableOptionItemSelected = true; 13864d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki mActionBarAdapter.setListener(null); 13872e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki if (mTabPager != null) { 13882e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki mTabPager.setOnPageChangeListener(null); 13892e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki } 139008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 139108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 1392fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov @Override 139309d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann protected void onRestoreInstanceState(Bundle savedInstanceState) { 139409d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann super.onRestoreInstanceState(savedInstanceState); 139509d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann // In our own lifecycle, the focus is saved and restore but later taken away by the 139609d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann // ViewPager. As a hack, we force focus on the SearchView if we know that we are searching. 139709d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann // This fixes the keyboard going away on screen rotation 139809d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann if (mActionBarAdapter.isSearchMode()) { 139909d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann mActionBarAdapter.setFocusOnSearchView(); 140009d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann } 140109d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann } 140209d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann 140309d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann @Override 14043391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann public DialogManager getDialogManager() { 14053391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann return mDialogManager; 14063391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann } 1407ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov 14082b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos @Override 14092b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos public void onClick(View view) { 14102b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos switch (view.getId()) { 14112b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos case R.id.floating_action_button: 14122b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); 14132b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos Bundle extras = getIntent().getExtras(); 14142b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos if (extras != null) { 14152b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos intent.putExtras(extras); 14162b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos } 1417d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner try { 1418c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent); 1419d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner } catch (ActivityNotFoundException ex) { 1420d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner Toast.makeText(PeopleActivity.this, R.string.missing_app, 1421d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner Toast.LENGTH_SHORT).show(); 1422d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner } 14232b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos break; 14242b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos default: 14252b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos Log.wtf(TAG, "Unexpected onClick event from " + view); 14262b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos } 14272b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos } 1428962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell 1429962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell /** 1430962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell * Returns the tab position adjusted for the text direction. 1431962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell */ 1432962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell private int getTabPositionForTextDirection(int position) { 1433962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell if (isRTL()) { 1434962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell return TabState.COUNT - 1 - position; 1435962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell } 1436962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell return position; 1437962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell } 14387aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project} 1439