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; 30e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Bundle; 31e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Parcelable; 322cf389622f504115bc62d5a4380e95f1e3978c44Wenyi Wangimport android.provider.BlockedNumberContract; 33e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract; 34e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.Contacts; 35e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.ProviderStatus; 36ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Waiimport android.provider.ContactsContract.QuickContact; 37e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.Settings; 38e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v13.app.FragmentPagerAdapter; 39e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.PagerAdapter; 40e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.ViewPager; 41b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wangimport android.telecom.TelecomManager; 427d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport android.text.TextUtils; 43e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.util.Log; 44e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyCharacterMap; 45e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyEvent; 46e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.Menu; 47e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuInflater; 48e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuItem; 49e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.View; 50e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.ViewGroup; 51bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport android.view.Window; 522b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulosimport android.widget.ImageButton; 53d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shraunerimport android.widget.Toast; 54bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport android.widget.Toolbar; 55e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 56bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport com.android.contacts.ContactsActivity; 5727834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R; 584d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onukiimport com.android.contacts.activities.ActionBarAdapter.TabState; 59cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.ContactsUtils; 60bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwellimport com.android.contacts.common.activity.RequestPermissionsActivity; 61b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wangimport com.android.contacts.common.compat.TelecomManagerUtil; 62c8dd78c595cfaf9766e59a2df012b16d6c05b213Chiao Chengimport com.android.contacts.common.dialog.ClearFrequentsDialog; 63051f41d0e2e23fa3acd9258ffc91a60cdbe828ecChiao Chengimport com.android.contacts.common.interactions.ImportExportDialogFragment; 64821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment; 65a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListFilter; 660d5588da244d0992c3ff8f25d0875fdf95a8c644Chiao Chengimport com.android.contacts.common.list.ContactListFilterController; 67e776d0366d5bf2f93a0cd0f14e48804e564bccf2Chiao Chengimport com.android.contacts.common.list.ContactTileAdapter.DisplayType; 68f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.list.DirectoryListLoader; 69f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.list.ViewPagerTabs; 70f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.logging.Logger; 7162a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jangimport com.android.contacts.common.logging.ScreenEvent.ScreenType; 72f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.preference.ContactsPreferenceActivity; 73f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.AccountFilterUtil; 74f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.Constants; 755d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliuimport com.android.contacts.common.util.ImplicitIntentsUtil; 76f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.ViewUtil; 775d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliuimport com.android.contacts.common.widget.FloatingActionButtonController; 78f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.editor.EditorIntents; 79f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.interactions.ContactDeletionInteraction; 80d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwellimport com.android.contacts.interactions.ContactMultiDeletionInteraction; 81d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwellimport com.android.contacts.interactions.ContactMultiDeletionInteraction.MultiContactDeleteListener; 82d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwellimport com.android.contacts.interactions.JoinContactsDialogFragment; 83d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwellimport com.android.contacts.interactions.JoinContactsDialogFragment.JoinContactsListener; 84d78ee90c0d4d93b82ad440396e87ae4f47f53e93Daniel Lehmannimport com.android.contacts.list.ContactTileListFragment; 850906ee326a5553a224eb7b004536f35b340bdcd3Dmitri Plotnikovimport com.android.contacts.list.ContactsIntentResolver; 861ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikovimport com.android.contacts.list.ContactsRequest; 878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ContactsUnavailableFragment; 88f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.list.MultiSelectContactsListFragment; 89f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.list.MultiSelectContactsListFragment.OnCheckBoxListActionListener; 90732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport com.android.contacts.list.OnContactBrowserActionListener; 918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.OnContactsUnavailableActionListener; 92c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher; 93c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener; 948a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwellimport com.android.contacts.quickcontact.QuickContactActivity; 953391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager; 96f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.util.PhoneCapabilityTester; 9756bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwellimport com.android.contactsbind.HelpUtils; 9857cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka 9920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwellimport java.util.List; 1007d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport java.util.Locale; 1016d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onukiimport java.util.concurrent.atomic.AtomicInteger; 102caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov 1037aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/** 1042c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * Displays a list to browse contacts. 1057aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */ 106bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangpublic class PeopleActivity extends ContactsActivity implements 1072b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos View.OnCreateContextMenuListener, 1082b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos View.OnClickListener, 1092b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos ActionBarAdapter.Listener, 1106e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov DialogManager.DialogShowingViewActivity, 1112b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos ContactListFilterController.ContactListFilterListener, 112d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell ProviderStatusListener, 113d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell MultiContactDeleteListener, 114d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell JoinContactsListener { 11557d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov 1165e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro private static final String TAG = "PeopleActivity"; 1177aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 1189ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!"; 1199ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 1205c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan // These values needs to start at 2. See {@link ContactEntryListFragment}. 1212c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell private static final int SUBACTIVITY_ACCOUNT_FILTER = 2; 122c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan 12334b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa private final DialogManager mDialogManager = new DialogManager(this); 1243391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann 125ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov private ContactsIntentResolver mIntentResolver; 126fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov private ContactsRequest mRequest; 127caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov 128fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov private ActionBarAdapter mActionBarAdapter; 129865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell private FloatingActionButtonController mFloatingActionButtonController; 130865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell private View mFloatingActionButtonContainer; 131865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell private boolean wasLastFabAnimationScaleIn = false; 1327c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov 1337979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro private ContactTileListFragment.Listener mFavoritesFragmentListener = 134ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa new StrequentContactListFragmentListener(); 135ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa 13615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private ContactListFilterController mContactListFilterController; 1373c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov 1388b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private ContactsUnavailableFragment mContactsUnavailableFragment; 139c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki private ProviderStatusWatcher mProviderStatusWatcher; 140c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell private Integer mProviderStatus; 1418b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 1420cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov private boolean mOptionsMenuContactsAvailable; 1430cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 14495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa /** 14595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa * Showing a list of Contacts. Also used for showing search results in search mode. 14695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa */ 14720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell private MultiSelectContactsListFragment mAllFragment; 1487979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro private ContactTileListFragment mFavoritesFragment; 1492b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos 1502c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell /** ViewPager for swipe */ 151250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private ViewPager mTabPager; 1523c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell private ViewPagerTabs mViewPagerTabs; 153250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private TabPagerAdapter mTabPagerAdapter; 1543c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell private String[] mTabTitles; 1552e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki private final TabPagerListener mTabPagerListener = new TabPagerListener(); 15658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 1579ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki private boolean mEnableDebugMenuOptions; 1589ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 159417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /** 160417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * True if this activity instance is a re-created one. i.e. set true after orientation change. 161417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * This is set in {@link #onCreate} for later use in {@link #onStart}. 162417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 163417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki private boolean mIsRecreatedInstance; 164417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 165417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /** 166417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * If {@link #configureFragments(boolean)} is already called. Used to avoid calling it twice 167417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * in {@link #onStart}. 168417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * (This initialization only needs to be done once in onStart() when the Activity was just 169417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * created from scratch -- i.e. onCreate() was just called) 170417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 171417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki private boolean mFragmentInitialized; 172417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 173be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan /** 17432791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski * This is to disable {@link #onOptionsItemSelected} when we trying to stop the activity. 17532791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski */ 17632791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski private boolean mDisableOptionItemSelected; 17732791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski 1786d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki /** Sequential ID assigned to each instance; used for logging */ 1796d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki private final int mInstanceId; 1806d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki private static final AtomicInteger sNextInstanceId = new AtomicInteger(); 1816d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki 1829856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan public PeopleActivity() { 1836d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki mInstanceId = sNextInstanceId.getAndIncrement(); 1841540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov mIntentResolver = new ContactsIntentResolver(this); 185c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher = ProviderStatusWatcher.getInstance(this); 1866178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov } 1876178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov 1886d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki @Override 1896d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki public String toString() { 1906d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki // Shown on logcat 1916d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki return String.format("%s@%d", getClass().getSimpleName(), mInstanceId); 1926d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki } 1936d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki 1948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public boolean areContactsAvailable() { 1952f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang return (mProviderStatus != null) && mProviderStatus.equals(ProviderStatus.STATUS_NORMAL); 1968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 1978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 1986f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki private boolean areGroupWritableAccountsAvailable() { 1996f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki return ContactsUtils.areGroupWritableAccountsAvailable(this); 2006f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki } 20149917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson 20250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki /** 20350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * Initialize fragments that are (or may not be) in the layout. 20450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * 20550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * For the fragments that are in the layout, we initialize them in 206417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * {@link #createViewsAndFragments(Bundle)} after inflating the layout. 20750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * 2082c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * However, the {@link ContactsUnavailableFragment} is a special fragment which may not 2092c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * be in the layout, so we have to do the initialization here. 2102c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * 2112c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * The ContactsUnavailableFragment is always created at runtime. 21250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki */ 2137aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 21492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov public void onAttachFragment(Fragment fragment) { 2152c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (fragment instanceof ContactsUnavailableFragment) { 2168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment; 2178b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.setOnContactsUnavailableActionListener( 2188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov new ContactsUnavailableFragmentListener()); 21992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 22092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 22192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 22292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov @Override 22308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov protected void onCreate(Bundle savedState) { 22449627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) { 22549627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate start"); 22649627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki } 22708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov super.onCreate(savedState); 2287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 229bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell if (RequestPermissionsActivity.startPermissionActivity(this)) { 230bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell return; 231bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell } 232bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell 2336d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki if (!processIntent(false)) { 234417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki finish(); 235417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return; 236417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 237a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mContactListFilterController = ContactListFilterController.getInstance(this); 238be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan mContactListFilterController.checkFilterValidity(false); 239a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mContactListFilterController.addListener(this); 240a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa 241c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.addListener(this); 242c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki 243417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mIsRecreatedInstance = (savedState != null); 244417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki createViewsAndFragments(savedState); 2454b1af3f8f68c3f5de459d17c218853fb0849d9f5Andrew Lee 24649627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) { 24749627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish"); 24849627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki } 2495b221086e4b994d6325d7396625900a79e27ae51Sai Cheemalapati getWindow().setBackgroundDrawable(null); 250fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 251fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 252fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov @Override 253fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov protected void onNewIntent(Intent intent) { 254fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov setIntent(intent); 2556d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki if (!processIntent(true)) { 256417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki finish(); 257417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return; 258417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 259417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mActionBarAdapter.initialize(null, mRequest); 260417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 261be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan mContactListFilterController.checkFilterValidity(false); 262be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan 263417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // Re-configure fragments. 264417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki configureFragments(true /* from request */); 2659cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell initializeFabVisibility(); 266417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki invalidateOptionsMenuIfNeeded(); 267fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 268fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 269417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /** 270417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * Resolve the intent and initialize {@link #mRequest}, and launch another activity if redirect 271417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * is needed. 272417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 2736d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki * @param forNewIntent set true if it's called from {@link #onNewIntent(Intent)}. 274417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * @return {@code true} if {@link PeopleActivity} should continue running. {@code false} 275417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * if it shouldn't, in which case the caller should finish() itself and shouldn't do 276417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * farther initialization. 277417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 2786d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki private boolean processIntent(boolean forNewIntent) { 2791ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // Extract relevant information from the intent 2801ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov mRequest = mIntentResolver.resolveIntent(getIntent()); 281ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki if (Log.isLoggable(TAG, Log.DEBUG)) { 2826d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki Log.d(TAG, this + " processIntent: forNewIntent=" + forNewIntent 2836d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki + " intent=" + getIntent() + " request=" + mRequest); 2846d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki } 2851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov if (!mRequest.isValid()) { 2866178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov setResult(RESULT_CANCELED); 287417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return false; 2886178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov } 2896178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov 2902c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT) { 291c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent( 292c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell mRequest.getContactUri(), QuickContactActivity.MODE_FULLY_EXPANDED); 29362a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang intent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE, ScreenType.UNKNOWN); 294c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityInApp(this, intent); 295417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return false; 29650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki } 297417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return true; 298417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 29950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki 300417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki private void createViewsAndFragments(Bundle savedState) { 301bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang // Disable the ActionBar so that we can use a Toolbar. This needs to be called before 302bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang // setContentView(). 303bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang getWindow().requestFeature(Window.FEATURE_NO_TITLE); 304bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang 305417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki setContentView(R.layout.people_activity); 306417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 307417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki final FragmentManager fragmentManager = getFragmentManager(); 308417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 309417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // Hide all tabs (the current tab will later be reshown once a tab is selected) 310417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki final FragmentTransaction transaction = fragmentManager.beginTransaction(); 311417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 3123c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mTabTitles = new String[TabState.COUNT]; 3133c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mTabTitles[TabState.FAVORITES] = getString(R.string.favorites_tab_label); 3143c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mTabTitles[TabState.ALL] = getString(R.string.all_contacts_tab_label); 3152c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPager = getView(R.id.tab_pager); 3162c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPagerAdapter = new TabPagerAdapter(); 3172c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPager.setAdapter(mTabPagerAdapter); 3182c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPager.setOnPageChangeListener(mTabPagerListener); 319417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 320bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang // Configure toolbar and toolbar tabs. If in landscape mode, we configure tabs differntly. 3213c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell final Toolbar toolbar = getView(R.id.toolbar); 322bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang setActionBar(toolbar); 3233c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell final ViewPagerTabs portraitViewPagerTabs 3243c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell = (ViewPagerTabs) findViewById(R.id.lists_pager_header); 3253c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell ViewPagerTabs landscapeViewPagerTabs = null; 3263c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell if (portraitViewPagerTabs == null) { 3273c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell landscapeViewPagerTabs = (ViewPagerTabs) getLayoutInflater().inflate( 3283c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell R.layout.people_activity_tabs_lands, toolbar, /* attachToRoot = */ false); 3293c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs = landscapeViewPagerTabs; 3303c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell } else { 3313c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs = portraitViewPagerTabs; 3323c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell } 3333c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs.setViewPager(mTabPager); 3343c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell 3352c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell final String FAVORITE_TAG = "tab-pager-favorite"; 3362c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell final String ALL_TAG = "tab-pager-all"; 3372c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell 3382c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // Create the fragments and add as children of the view pager. 3392c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // The pager adapter will only change the visibility; it'll never create/destroy 3402c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // fragments. 3412c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // However, if it's after screen rotation, the fragments have been re-created by 3422c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // the fragment manager, so first see if there're already the target fragments 3432c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // existing. 3442c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mFavoritesFragment = (ContactTileListFragment) 3452c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell fragmentManager.findFragmentByTag(FAVORITE_TAG); 34620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAllFragment = (MultiSelectContactsListFragment) 3472c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell fragmentManager.findFragmentByTag(ALL_TAG); 3482c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell 3492c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (mFavoritesFragment == null) { 3502c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mFavoritesFragment = new ContactTileListFragment(); 35120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAllFragment = new MultiSelectContactsListFragment(); 3522c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell 3532c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell transaction.add(R.id.tab_pager, mFavoritesFragment, FAVORITE_TAG); 3542c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG); 355417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 356250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 357417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mFavoritesFragment.setListener(mFavoritesFragmentListener); 35850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki 359417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener()); 36020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAllFragment.setCheckBoxListListener(new CheckBoxListListener()); 36150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki 362417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // Hide all fragments for now. We adjust visibility when we get onSelectedTabChanged() 363417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // from ActionBarAdapter. 364417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki transaction.hide(mFavoritesFragment); 365417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki transaction.hide(mAllFragment); 366f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro 3674b25da79091157935042d2942a8961ceba92166fMinh Pham transaction.commitAllowingStateLoss(); 368417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki fragmentManager.executePendingTransactions(); 3694d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 3700c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro // Setting Properties after fragment is created 3712c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mFavoritesFragment.setDisplayType(DisplayType.STREQUENT); 3720c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro 373bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang mActionBarAdapter = new ActionBarAdapter(this, this, getActionBar(), 3743c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell portraitViewPagerTabs, landscapeViewPagerTabs, toolbar); 375417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mActionBarAdapter.initialize(savedState, mRequest); 37658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 377d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell // Add shadow under toolbar 378d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell ViewUtil.addRectangularOutlineProvider(findViewById(R.id.toolbar_parent), getResources()); 379d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell 380865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell // Configure floating action button 381865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonContainer = findViewById(R.id.floating_action_button_container); 382865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell final ImageButton floatingActionButton 383865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell = (ImageButton) findViewById(R.id.floating_action_button); 3842c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell floatingActionButton.setOnClickListener(this); 385865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonController = new FloatingActionButtonController(this, 386865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonContainer, floatingActionButton); 3879cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell initializeFabVisibility(); 3882b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos 389417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki invalidateOptionsMenuIfNeeded(); 390417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 39108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 392417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki @Override 393417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki protected void onStart() { 394417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki if (!mFragmentInitialized) { 395417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mFragmentInitialized = true; 396417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /* Configure fragments if we haven't. 397417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 398417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * Note it's a one-shot initialization, so we want to do this in {@link #onCreate}. 399417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 400417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * However, because this method may indirectly touch views in fragments but fragments 401417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * created in {@link #configureContentView} using a {@link FragmentTransaction} will NOT 402417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * have views until {@link Activity#onCreate} finishes (they would if they were inflated 403417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * from a layout), we need to do it here in {@link #onStart()}. 404417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 405417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * (When {@link Fragment#onCreateView} is called is different in the former case and 406417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * in the latter case, unfortunately.) 407417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 408417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * Also, we skip most of the work in it if the activity is a re-created one. 409417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * (so the argument.) 410417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 411417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki configureFragments(!mIsRecreatedInstance); 412417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 413417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki super.onStart(); 4143c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov } 4153c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov 4166e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 417174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov protected void onPause() { 418fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mOptionsMenuContactsAvailable = false; 419c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.stop(); 420174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov super.onPause(); 421174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 422174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov 423174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov @Override 424174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov protected void onResume() { 425174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov super.onResume(); 426697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus 427c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.start(); 428697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus updateViewConfiguration(true); 4294d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 4304d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // Re-register the listener, which may have been cleared when onSaveInstanceState was 4314d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // called. See also: onSaveInstanceState 4324d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki mActionBarAdapter.setListener(this); 43332791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski mDisableOptionItemSelected = false; 4342e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki if (mTabPager != null) { 4352e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki mTabPager.setOnPageChangeListener(mTabPagerListener); 4362e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki } 437a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki // Current tab may have changed since the last onSaveInstanceState(). Make sure 438a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki // the actual contents match the tab. 439a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki updateFragmentsVisibility(); 440174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 441174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov 442174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov @Override 4434d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki protected void onDestroy() { 444c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.removeListener(this); 445c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki 446b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa // Some of variables will be null if this Activity redirects Intent. 447b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa // See also onCreate() or other methods called during the Activity's initialization. 448c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki if (mActionBarAdapter != null) { 449c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki mActionBarAdapter.setListener(null); 450c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki } 451b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa if (mContactListFilterController != null) { 452b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa mContactListFilterController.removeListener(this); 453b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa } 454b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa 4554d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki super.onDestroy(); 4564d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 4574d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 458955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov private void configureFragments(boolean fromRequest) { 459009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov if (fromRequest) { 46091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov ContactListFilter filter = null; 46191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov int actionCode = mRequest.getActionCode(); 46253b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki boolean searchMode = mRequest.isSearchMode(); 46352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann final int tabToOpen; 46491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov switch (actionCode) { 46591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_ALL_CONTACTS: 466be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 467be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS); 468ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.ALL; 46991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 47091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_CONTACTS_WITH_PHONES: 471be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 47291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY); 473ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.ALL; 47491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 47591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov 47691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_FREQUENT: 47791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_STREQUENT: 47891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_STARRED: 479ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.FAVORITES; 48091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 4819e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro case ContactsRequest.ACTION_VIEW_CONTACT: 482ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.ALL; 483ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki break; 48452aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann default: 48552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann tabToOpen = -1; 48652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann break; 487ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki } 48852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann if (tabToOpen != -1) { 489ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki mActionBarAdapter.setCurrentTab(tabToOpen); 49091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov } 49191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov 49291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov if (filter != null) { 49391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov mContactListFilterController.setContactListFilter(filter, false); 49453b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki searchMode = false; 495009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov } 496d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 497d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov if (mRequest.getContactUri() != null) { 49853b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki searchMode = false; 499d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov } 500d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 50153b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki mActionBarAdapter.setSearchMode(searchMode); 5020ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan configureContactListFragmentForRequest(); 503fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 504fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 5050ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan configureContactListFragment(); 506fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 5078268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 5086e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 5096e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov 510865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell private void initializeFabVisibility() { 511865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell final boolean hideFab = mActionBarAdapter.isSearchMode() 512865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell || mActionBarAdapter.isSelectionMode(); 513865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonContainer.setVisibility(hideFab ? View.GONE : View.VISIBLE); 5149cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell mFloatingActionButtonController.resetIn(); 515865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell wasLastFabAnimationScaleIn = !hideFab; 516865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 517865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell 518865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell private void showFabWithAnimation(boolean showFab) { 519865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell if (mFloatingActionButtonContainer == null) { 520865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell return; 521865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 522865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell if (showFab) { 523865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell if (!wasLastFabAnimationScaleIn) { 524865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonContainer.setVisibility(View.VISIBLE); 525865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonController.scaleIn(0); 526865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 527865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell wasLastFabAnimationScaleIn = true; 528865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell 529865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } else { 530865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell if (wasLastFabAnimationScaleIn) { 531865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonContainer.setVisibility(View.VISIBLE); 532865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mFloatingActionButtonController.scaleOut(); 533865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 534865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell wasLastFabAnimationScaleIn = false; 535865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 536865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell } 537865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell 5386e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 539d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov public void onContactListFilterChanged() { 54095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment == null || !mAllFragment.isAdded()) { 541d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov return; 542d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov } 543d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov 54495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setFilter(mContactListFilterController.getFilter()); 545e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov 5468268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 5473ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov } 5483ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov 549fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov /** 550fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Handler for action bar actions. 551fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov */ 552fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov @Override 553311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann public void onAction(int action) { 554b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan switch (action) { 55520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell case ActionBarAdapter.Listener.Action.START_SELECTION_MODE: 55620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAllFragment.displayCheckBoxes(true); 557a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang startSearchOrSelectionMode(); 558a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang break; 559311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann case ActionBarAdapter.Listener.Action.START_SEARCH_MODE: 560a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang if (!mIsRecreatedInstance) { 56162a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang Logger.logScreenView(this, ScreenType.SEARCH); 562a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang } 563a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang startSearchOrSelectionMode(); 564865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell break; 565865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell case ActionBarAdapter.Listener.Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE: 566865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell showFabWithAnimation(/* showFabWithAnimation = */ true); 567b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan break; 56820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell case ActionBarAdapter.Listener.Action.STOP_SEARCH_AND_SELECTION_MODE: 5691db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki setQueryTextToFragment(""); 5704d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki updateFragmentsVisibility(); 5718811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki invalidateOptionsMenu(); 572865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell showFabWithAnimation(/* showFabWithAnimation = */ true); 5738268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan break; 574311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY: 5759ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki final String queryString = mActionBarAdapter.getQueryString(); 5769ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki setQueryTextToFragment(queryString); 5779ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki updateDebugOptionsVisibility( 5789ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki ENABLE_DEBUG_OPTIONS_HIDDEN_CODE.equals(queryString)); 579b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan break; 580b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan default: 581b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action); 582b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 583fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov } 584fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov 585a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang private void startSearchOrSelectionMode() { 586a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang configureFragments(false /* from request */); 587a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang updateFragmentsVisibility(); 588a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang invalidateOptionsMenu(); 589a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang showFabWithAnimation(/* showFabWithAnimation = */ false); 590a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang } 591a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang 5924d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki @Override 5934d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki public void onSelectedTabChanged() { 5944d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki updateFragmentsVisibility(); 5954d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 5964d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 5976adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell @Override 5986adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell public void onUpButtonPressed() { 5996adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell onBackPressed(); 6006adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell } 6016adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell 6029ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki private void updateDebugOptionsVisibility(boolean visible) { 6039ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki if (mEnableDebugMenuOptions != visible) { 6049ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki mEnableDebugMenuOptions = visible; 6059ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki invalidateOptionsMenu(); 6069ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki } 6079ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki } 6089ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 6094d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki /** 6104d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki * Updates the fragment/view visibility according to the current mode, such as 6114d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki * {@link ActionBarAdapter#isSearchMode()} and {@link ActionBarAdapter#getCurrentTab()}. 6124d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki */ 6134d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki private void updateFragmentsVisibility() { 61452aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann int tab = mActionBarAdapter.getCurrentTab(); 6154d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 61620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (mActionBarAdapter.isSearchMode() || mActionBarAdapter.isSelectionMode()) { 61720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mTabPagerAdapter.setTabsHidden(true); 6182c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell } else { 61920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell // No smooth scrolling if quitting from the search/selection mode. 62020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final boolean wereTabsHidden = mTabPagerAdapter.areTabsHidden() 62120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell || mActionBarAdapter.isSelectionMode(); 62220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mTabPagerAdapter.setTabsHidden(false); 6232c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (mTabPager.getCurrentItem() != tab) { 62420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mTabPager.setCurrentItem(tab, !wereTabsHidden); 6252c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell } 6264d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 627d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell if (!mActionBarAdapter.isSelectionMode()) { 628d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell mAllFragment.displayCheckBoxes(false); 629d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell } 6302c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell invalidateOptionsMenu(); 63166606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson showEmptyStateForTab(tab); 63266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson } 63366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson 63452aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann private void showEmptyStateForTab(int tab) { 63566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson if (mContactsUnavailableFragment != null) { 6369203788d3f55e84d55db4c5a87bbbf1fa1e36b43Brian Attwell switch (getTabPositionForTextDirection(tab)) { 63752aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann case TabState.FAVORITES: 638b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang mContactsUnavailableFragment.setTabInfo( 639b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang R.string.listTotalAllContactsZeroStarred, TabState.FAVORITES); 64066606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson break; 64152aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann case TabState.ALL: 642b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang mContactsUnavailableFragment.setTabInfo(R.string.noContacts, TabState.ALL); 64366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson break; 64466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson } 6458d71f11c70c974518f3482c46a10a5601628a029Brian Attwell // When using the mContactsUnavailableFragment the ViewPager doesn't contain two views. 6468d71f11c70c974518f3482c46a10a5601628a029Brian Attwell // Therefore, we have to trick the ViewPagerTabs into thinking we have changed tabs 6478d71f11c70c974518f3482c46a10a5601628a029Brian Attwell // when the mContactsUnavailableFragment changes. Otherwise the tab strip won't move. 6488d71f11c70c974518f3482c46a10a5601628a029Brian Attwell mViewPagerTabs.onPageScrolled(tab, 0, 0); 64966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson } 6504d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 6514d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 652250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private class TabPagerListener implements ViewPager.OnPageChangeListener { 65370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng 65470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // This package-protected constructor is here because of a possible compiler bug. 65570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // PeopleActivity$1.class should be generated due to the private outer/inner class access 65670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // needed here. But for some reason, PeopleActivity$1.class is missing. 65770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // Since $1 class is needed as a jvm work around to get access to the inner class, 65870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // changing the constructor to package-protected or public will solve the problem. 65970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // To verify whether $1 class is needed, javap PeopleActivity$TabPagerListener and look for 66070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // references to PeopleActivity$1. 66170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // 66270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // When the constructor is private and PeopleActivity$1.class is missing, proguard will 66370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // correctly catch this and throw warnings and error out the build on user/userdebug builds. 66470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // 66570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // All private inner classes below also need this fix. 66670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng TabPagerListener() {} 66770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng 668250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 669250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void onPageScrollStateChanged(int state) { 67020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (!mTabPagerAdapter.areTabsHidden()) { 6713c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs.onPageScrollStateChanged(state); 6723c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell } 673250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 674250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 675250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 676250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 67720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (!mTabPagerAdapter.areTabsHidden()) { 6783c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs.onPageScrolled(position, positionOffset, positionOffsetPixels); 6793c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell } 680250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 681250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 682250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 683250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void onPageSelected(int position) { 684250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki // Make sure not in the search mode, in which case position != TabState.ordinal(). 68520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (!mTabPagerAdapter.areTabsHidden()) { 68652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann mActionBarAdapter.setCurrentTab(position, false); 6873c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell mViewPagerTabs.onPageSelected(position); 68852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann showEmptyStateForTab(position); 6898811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki invalidateOptionsMenu(); 690250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 691250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 692250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 693250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 694250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki /** 695250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * Adapter for the {@link ViewPager}. Unlike {@link FragmentPagerAdapter}, 696250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * {@link #instantiateItem} returns existing fragments, and {@link #instantiateItem}/ 697250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * {@link #destroyItem} show/hide fragments instead of attaching/detaching. 698250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * 699250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * In search mode, we always show the "all" fragment, and disable the swipe. We change the 700250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * number of items to 1 to disable the swipe. 701250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * 702250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * TODO figure out a more straight way to disable swipe. 703250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki */ 704250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private class TabPagerAdapter extends PagerAdapter { 705250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private final FragmentManager mFragmentManager; 706250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private FragmentTransaction mCurTransaction = null; 707250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 70820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell private boolean mAreTabsHiddenInTabPager; 709250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 710746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki private Fragment mCurrentPrimaryItem; 711746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki 712250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public TabPagerAdapter() { 713250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mFragmentManager = getFragmentManager(); 714250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 715250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 71620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell public boolean areTabsHidden() { 71720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell return mAreTabsHiddenInTabPager; 718250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 719250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 72020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell public void setTabsHidden(boolean hideTabs) { 72120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (hideTabs == mAreTabsHiddenInTabPager) { 722250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return; 723250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 72420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAreTabsHiddenInTabPager = hideTabs; 725250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki notifyDataSetChanged(); 726250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 727250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 728250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 729250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public int getCount() { 73020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell return mAreTabsHiddenInTabPager ? 1 : TabState.COUNT; 731250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 732250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 733250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki /** Gets called when the number of items changes. */ 734250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 735250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public int getItemPosition(Object object) { 73620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (mAreTabsHiddenInTabPager) { 737250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (object == mAllFragment) { 738250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return 0; // Only 1 page in search mode 739250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 740250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } else { 741250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (object == mFavoritesFragment) { 742962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell return getTabPositionForTextDirection(TabState.FAVORITES); 743250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 744250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (object == mAllFragment) { 745962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell return getTabPositionForTextDirection(TabState.ALL); 746250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 747250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 748250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return POSITION_NONE; 749250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 750250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 751250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 752970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void startUpdate(ViewGroup container) { 753250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 754250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 755250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private Fragment getFragment(int position) { 756962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell position = getTabPositionForTextDirection(position); 75720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (mAreTabsHiddenInTabPager) { 7588d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann if (position != 0) { 7598d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann // This has only been observed in monkey tests. 7608d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann // Let's log this issue, but not crash 7618d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann Log.w(TAG, "Request fragment at position=" + position + ", eventhough we " + 7628d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann "are in search mode"); 763250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 7648d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann return mAllFragment; 765250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } else { 76652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann if (position == TabState.FAVORITES) { 767250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return mFavoritesFragment; 76852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann } else if (position == TabState.ALL) { 769250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return mAllFragment; 770250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 771250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 772250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki throw new IllegalArgumentException("position: " + position); 773250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 774250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 775250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 776970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public Object instantiateItem(ViewGroup container, int position) { 777250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mCurTransaction == null) { 778250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction = mFragmentManager.beginTransaction(); 779250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 780250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki Fragment f = getFragment(position); 781250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction.show(f); 782746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki 7839bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell // Non primary pages are not visible. 7849bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell f.setUserVisibleHint(f == mCurrentPrimaryItem); 785250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return f; 786250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 787250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 788250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 789970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void destroyItem(ViewGroup container, int position, Object object) { 790250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mCurTransaction == null) { 791250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction = mFragmentManager.beginTransaction(); 792250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 793250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction.hide((Fragment) object); 794250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 795250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 796250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 797970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void finishUpdate(ViewGroup container) { 798250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mCurTransaction != null) { 7994b25da79091157935042d2942a8961ceba92166fMinh Pham mCurTransaction.commitAllowingStateLoss(); 800250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction = null; 801250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mFragmentManager.executePendingTransactions(); 802250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 803250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 804250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 805250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 806250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public boolean isViewFromObject(View view, Object object) { 807250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return ((Fragment) object).getView() == view; 808250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 809250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 810250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 811970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void setPrimaryItem(ViewGroup container, int position, Object object) { 812746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki Fragment fragment = (Fragment) object; 813746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki if (mCurrentPrimaryItem != fragment) { 814746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki if (mCurrentPrimaryItem != null) { 8159bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell mCurrentPrimaryItem.setUserVisibleHint(false); 816746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 817746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki if (fragment != null) { 8189bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell fragment.setUserVisibleHint(true); 819746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 820746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki mCurrentPrimaryItem = fragment; 821746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 822746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 823746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki 824746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki @Override 825250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public Parcelable saveState() { 826250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return null; 827250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 828250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 829250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 830250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void restoreState(Parcelable state, ClassLoader loader) { 831250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 8323c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell 8333c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell @Override 8343c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell public CharSequence getPageTitle(int position) { 8353c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell return mTabTitles[position]; 8363c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell } 837250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 838250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 8391db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki private void setQueryTextToFragment(String query) { 84095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setQueryString(query, true); 8411db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki mAllFragment.setVisibleScrollbarEnabled(!mAllFragment.isSearchMode()); 8428268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 8438268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan 8440ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan private void configureContactListFragmentForRequest() { 845fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov Uri contactUri = mRequest.getContactUri(); 846fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (contactUri != null) { 84795c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setSelectedContactUri(contactUri); 848fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 849238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 850a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mAllFragment.setFilter(mContactListFilterController.getFilter()); 8511db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki setQueryTextToFragment(mActionBarAdapter.getQueryString()); 852238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 853fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (mRequest.isDirectorySearchEnabled()) { 85495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT); 855fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } else { 85695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE); 857fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 85808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 85908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 8600ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan private void configureContactListFragment() { 861a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa // Filter may be changed when this Activity is in background. 862a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mAllFragment.setFilter(mContactListFilterController.getFilter()); 863a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa 8642c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mAllFragment.setVerticalScrollbarPosition(getScrollBarPosition()); 8652c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mAllFragment.setSelectionVisible(false); 866e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng } 867e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng 8682c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell private int getScrollBarPosition() { 8692c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell return isRTL() ? View.SCROLLBAR_POSITION_LEFT : View.SCROLLBAR_POSITION_RIGHT; 870e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng } 871e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng 872e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng private boolean isRTL() { 873e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng final Locale locale = Locale.getDefault(); 874e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng return TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL; 8751ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 8761323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov 8778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 8788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onProviderStatusChange() { 879697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus updateViewConfiguration(false); 8808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8818b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 882697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus private void updateViewConfiguration(boolean forceUpdate) { 883c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell int providerStatus = mProviderStatusWatcher.getProviderStatus(); 884d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki if (!forceUpdate && (mProviderStatus != null) 885c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell && (mProviderStatus.equals(providerStatus))) return; 8868b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mProviderStatus = providerStatus; 8878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view); 8898b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 890c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell if (mProviderStatus.equals(ProviderStatus.STATUS_NORMAL)) { 891b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus // Ensure that the mTabPager is visible; we may have made it invisible below. 892c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov contactsUnavailableView.setVisibility(View.GONE); 893b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus if (mTabPager != null) { 894b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus mTabPager.setVisibility(View.VISIBLE); 895b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus } 896b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus 89795c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment != null) { 89895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setEnabled(true); 8998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } else { 9015d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu // Setting up the page so that the user can still use the app 9025d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu // even without an account. 90395c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment != null) { 90495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setEnabled(false); 9058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9068b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (mContactsUnavailableFragment == null) { 9078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment = new ContactsUnavailableFragment(); 9088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.setOnContactsUnavailableActionListener( 9098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov new ContactsUnavailableFragmentListener()); 9103ed426c842a68895a759548fef87bac359f937bbDianne Hackborn getFragmentManager().beginTransaction() 9118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment) 9124b25da79091157935042d2942a8961ceba92166fMinh Pham .commitAllowingStateLoss(); 9138b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 914d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki mContactsUnavailableFragment.updateStatus(mProviderStatus); 915b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus 916b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus // Show the contactsUnavailableView, and hide the mTabPager so that we don't 917b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus // see it sliding in underneath the contactsUnavailableView at the edges. 9188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov contactsUnavailableView.setVisibility(View.VISIBLE); 919b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus if (mTabPager != null) { 920b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus mTabPager.setVisibility(View.GONE); 921b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus } 922b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus 92352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann showEmptyStateForTab(mActionBarAdapter.getCurrentTab()); 9248b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9258b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 9268268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 9278b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9288b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 9291ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov private final class ContactBrowserActionListener implements OnContactBrowserActionListener { 93070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng ContactBrowserActionListener() {} 931d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 932e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 933d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov public void onSelectionChange() { 934e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov 9351ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 936e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov 937e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 938ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai public void onViewContactAction(Uri contactLookupUri, boolean isEnterpriseContact) { 939ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai if (isEnterpriseContact) { 940ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai // No implicit intent as user may have a different contacts app in work profile. 941ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai QuickContact.showQuickContact(PeopleActivity.this, new Rect(), contactLookupUri, 942ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai QuickContactActivity.MODE_FULLY_EXPANDED, null); 943ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai } else { 944ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent( 94562a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang contactLookupUri, QuickContactActivity.MODE_FULLY_EXPANDED); 94662a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang intent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE, 94762a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang mAllFragment.isSearchMode() ? ScreenType.SEARCH : ScreenType.ALL_CONTACTS); 948ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent); 949ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai } 9501ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 951416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov 952e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 9531ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onDeleteContactAction(Uri contactUri) { 9549856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false); 9551ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 9568a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov 957e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 9581ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onFinishAction() { 9591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov onBackPressed(); 9601ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 9616e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov 9626e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 9636e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov public void onInvalidSelection() { 964b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter filter; 965b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter currentFilter = mAllFragment.getFilter(); 966b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa if (currentFilter != null 967b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) { 968b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa filter = ContactListFilter.createFilterWithType( 969b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS); 970b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa mAllFragment.setFilter(filter); 971b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa } else { 972b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa filter = ContactListFilter.createFilterWithType( 973b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter.FILTER_TYPE_SINGLE_CONTACT); 974b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa mAllFragment.setFilter(filter, false); 975b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa } 976d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov mContactListFilterController.setContactListFilter(filter, true); 9776e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 9781ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 979416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov 98020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell private final class CheckBoxListListener implements OnCheckBoxListActionListener { 98120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell @Override 98220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell public void onStartDisplayingCheckBoxes() { 983865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell mActionBarAdapter.setSelectionMode(true); 984865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell invalidateOptionsMenu(); 98520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 98620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell 98720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell @Override 98820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell public void onSelectedContactIdsChanged() { 98920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mActionBarAdapter.setSelectionCount(mAllFragment.getSelectedContactIds().size()); 99020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell invalidateOptionsMenu(); 99120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 9928f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell 9938f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell @Override 9948f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell public void onStopDisplayingCheckBoxes() { 9958f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell mActionBarAdapter.setSelectionMode(false); 9968f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell } 99720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 99820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell 9998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private class ContactsUnavailableFragmentListener 10008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov implements OnContactsUnavailableActionListener { 100170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng ContactsUnavailableFragmentListener() {} 10028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 10038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 10048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onCreateNewContactAction() { 1005c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, 10065a7a23bdb698b8e741a425c9617c5e33e6314cddWalter Jang EditorIntents.createCompactInsertContactIntent()); 10078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 10088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 10098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 10108b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onAddAccountAction() { 10115d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount(); 1012c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityOutsideApp(PeopleActivity.this, intent); 10138b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 10148b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 10158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 10168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onImportContactsFromFileAction() { 10179379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang showImportExportDialogFragment(); 10188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 10198b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 10208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 1021ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa private final class StrequentContactListFragmentListener 10227979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro implements ContactTileListFragment.Listener { 102370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng StrequentContactListFragmentListener() {} 102470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng 1025ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa @Override 10267a700cf798a19a8452b8671f643a05336f63f611Katherine Kuan public void onContactSelected(Uri contactUri, Rect targetRect) { 1027c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(contactUri, 1028c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell QuickContactActivity.MODE_FULLY_EXPANDED); 102962a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang intent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE, ScreenType.FAVORITES); 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) 11057494e913d7bc044319ff143c02a6b1c108f66dd0Wenyi Wang && ContactsUtils.FLAG_N_FEATURE 11062cf389622f504115bc62d5a4380e95f1e3978c44Wenyi Wang && BlockedNumberContract.canCurrentUserBlockNumbers(this); 1107af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_search, showMiscOptions); 1108af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_import_export, showMiscOptions); 1109af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_accounts, showMiscOptions); 11109d115f0e9222e0f4b95a1ef55085ba6bdd8eb3b4Wenyi Wang makeMenuItemVisible(menu, R.id.menu_blocked_numbers, showMiscOptions && showBlockedNumbers); 1111af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_settings, 1112af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki showMiscOptions && !ContactsPreferenceActivity.isEmpty(this)); 1113e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov 111420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final boolean showSelectedContactOptions = mActionBarAdapter.isSelectionMode() 111520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell && mAllFragment.getSelectedContactIds().size() != 0; 111620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell makeMenuItemVisible(menu, R.id.menu_share, showSelectedContactOptions); 111720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell makeMenuItemVisible(menu, R.id.menu_delete, showSelectedContactOptions); 1118687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang final boolean showLinkContactsOptions = mActionBarAdapter.isSelectionMode() 1119687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang && mAllFragment.getSelectedContactIds().size() > 1; 1120687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang makeMenuItemVisible(menu, R.id.menu_join, showLinkContactsOptions); 112120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell 11229ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki // Debug options need to be visible even in search mode. 11232f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang makeMenuItemVisible(menu, R.id.export_database, mEnableDebugMenuOptions && 11242f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang hasExportIntentHandler()); 11259ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 1126d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 11277aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 11287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 11292f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang private boolean hasExportIntentHandler() { 11302f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang final Intent intent = new Intent(); 11312f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang intent.setAction("com.android.providers.contacts.DUMP_DATABASE"); 11322f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang final List<ResolveInfo> receivers = getPackageManager().queryIntentActivities(intent, 11332f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang PackageManager.MATCH_DEFAULT_ONLY); 11342f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang return receivers != null && receivers.size() > 0; 11352f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang } 11362f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang 11372fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu /** 11382fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu * Returns whether there are any frequently contacted people being displayed 11392fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu * @return 11402fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu */ 11412fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu private boolean hasFrequents() { 11422c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell return mFavoritesFragment.hasFrequents(); 11432fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu } 11442fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu 1145af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki private void makeMenuItemVisible(Menu menu, int itemId, boolean visible) { 1146d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell final MenuItem item = menu.findItem(itemId); 1147af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki if (item != null) { 1148af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki item.setVisible(visible); 1149af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki } 1150af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki } 1151af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki 1152d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell private void makeMenuItemEnabled(Menu menu, int itemId, boolean visible) { 1153d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell final MenuItem item = menu.findItem(itemId); 1154d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell if (item != null) { 1155d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell item.setEnabled(visible); 1156d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell } 1157d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell } 1158d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell 11597aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 11607aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 116132791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski if (mDisableOptionItemSelected) { 116232791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski return false; 116332791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski } 116432791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski 11657aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project switch (item.getItemId()) { 1166e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki case android.R.id.home: { 1167e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki // The home icon on the action bar is pressed 1168e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki if (mActionBarAdapter.isUpShowing()) { 1169e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki // "UP" icon press -- should be treated as "back". 1170e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki onBackPressed(); 1171e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki } 1172e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki return true; 1173e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki } 1174c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov case R.id.menu_settings: { 117586f2a86b99ccd4430dcaa7fcf88e8190cb64eb05Wenyi Wang startActivity(new Intent(this, ContactsPreferenceActivity.class)); 11767aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return true; 1177d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 1178b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan case R.id.menu_contacts_filter: { 1179b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus AccountFilterUtil.startAccountFilterActivityForResult( 1180b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus this, SUBACTIVITY_ACCOUNT_FILTER, 1181b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus mContactListFilterController.getFilter()); 1182b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan return true; 1183b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 1184d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey case R.id.menu_search: { 11858e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov onSearchRequested(); 11867aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return true; 1187d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 118820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell case R.id.menu_share: 118920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell shareSelectedContacts(); 119020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell return true; 1191d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell case R.id.menu_join: 1192d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell joinSelectedContacts(); 1193d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell return true; 1194d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell case R.id.menu_delete: 1195d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell deleteSelectedContacts(); 1196d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell return true; 119749d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey case R.id.menu_import_export: { 11989379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang showImportExportDialogFragment(); 1199d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 1200d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 12012fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu case R.id.menu_clear_frequents: { 12022fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu ClearFrequentsDialog.show(getFragmentManager()); 12032fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu return true; 12042fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu } 120556bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell case R.id.menu_help: 120656bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell HelpUtils.launchHelpAndFeedbackForMainScreen(this); 120756bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell return true; 1208d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey case R.id.menu_accounts: { 1209d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS); 1210fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] { 1211d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey ContactsContract.AUTHORITY 1212d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey }); 12131fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 1214c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityInAppIfPossible(this, intent); 1215d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 1216d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 12171fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang case R.id.menu_blocked_numbers: { 1218350030706b8b9de028c86c5a56d8e84ba3641812Wenyi Wang final Intent intent = TelecomManagerUtil.createManageBlockedNumbersIntent( 1219b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wang (TelecomManager) getSystemService(Context.TELECOM_SERVICE)); 1220350030706b8b9de028c86c5a56d8e84ba3641812Wenyi Wang if (intent != null) { 1221350030706b8b9de028c86c5a56d8e84ba3641812Wenyi Wang startActivity(intent); 1222350030706b8b9de028c86c5a56d8e84ba3641812Wenyi Wang } 12231fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang return true; 12241fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang } 12259ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki case R.id.export_database: { 12269ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE"); 12279ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 1228c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityOutsideApp(this, intent); 12299ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki return true; 12309ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki } 12317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 12327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return false; 12337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 12347aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 12359379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang private void showImportExportDialogFragment(){ 12369379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang final boolean isOnFavoriteTab = mTabPagerAdapter.mCurrentPrimaryItem == mFavoritesFragment; 12379379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang if (isOnFavoriteTab) { 12389379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(), 12399379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang PeopleActivity.class, ImportExportDialogFragment.EXPORT_MODE_FAVORITES); 12409379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang } else { 12419379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(), 12429379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang PeopleActivity.class, ImportExportDialogFragment.EXPORT_MODE_ALL_CONTACTS); 12439379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang } 12449379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang } 12459379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang 12468e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov @Override 124753b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki public boolean onSearchRequested() { // Search key pressed. 124820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (!mActionBarAdapter.isSelectionMode()) { 124920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mActionBarAdapter.setSearchMode(true); 125020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 125153b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki return true; 1252db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov } 1253db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov 125420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell /** 125520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell * Share all contacts that are currently selected in mAllFragment. This method is pretty 125620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell * inefficient for handling large numbers of contacts. I don't expect this to be a problem. 125720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell */ 125820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell private void shareSelectedContacts() { 125920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final StringBuilder uriListBuilder = new StringBuilder(); 126020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell for (Long contactId : mAllFragment.getSelectedContactIds()) { 126120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 126220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), contactUri); 12635b69125ca54b41429374041d73febd33af0dd596Jay Shrauner if (lookupUri == null) { 12645b69125ca54b41429374041d73febd33af0dd596Jay Shrauner continue; 12655b69125ca54b41429374041d73febd33af0dd596Jay Shrauner } 12665b69125ca54b41429374041d73febd33af0dd596Jay Shrauner final List<String> pathSegments = lookupUri.getPathSegments(); 12675b69125ca54b41429374041d73febd33af0dd596Jay Shrauner if (pathSegments.size() < 2) { 12685b69125ca54b41429374041d73febd33af0dd596Jay Shrauner continue; 12695b69125ca54b41429374041d73febd33af0dd596Jay Shrauner } 12705b69125ca54b41429374041d73febd33af0dd596Jay Shrauner final String lookupKey = pathSegments.get(pathSegments.size() - 2); 12715b69125ca54b41429374041d73febd33af0dd596Jay Shrauner if (uriListBuilder.length() > 0) { 12725b69125ca54b41429374041d73febd33af0dd596Jay Shrauner uriListBuilder.append(':'); 12735b69125ca54b41429374041d73febd33af0dd596Jay Shrauner } 12745b69125ca54b41429374041d73febd33af0dd596Jay Shrauner uriListBuilder.append(Uri.encode(lookupKey)); 12755b69125ca54b41429374041d73febd33af0dd596Jay Shrauner } 12765b69125ca54b41429374041d73febd33af0dd596Jay Shrauner if (uriListBuilder.length() == 0) { 12775b69125ca54b41429374041d73febd33af0dd596Jay Shrauner return; 127820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 127920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final Uri uri = Uri.withAppendedPath( 128020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell Contacts.CONTENT_MULTI_VCARD_URI, 128120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell Uri.encode(uriListBuilder.toString())); 128220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final Intent intent = new Intent(Intent.ACTION_SEND); 128320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell intent.setType(Contacts.CONTENT_VCARD_TYPE); 128420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell intent.putExtra(Intent.EXTRA_STREAM, uri); 128520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell ImplicitIntentsUtil.startActivityOutsideApp(this, intent); 128620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } 1287a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang 1288d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell private void joinSelectedContacts() { 1289d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell JoinContactsDialogFragment.start(this, mAllFragment.getSelectedContactIds()); 1290d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell } 1291d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell 1292d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell @Override 1293d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell public void onContactsJoined() { 12941154bbabc1f174f7dca40d92f59d2b2731930b3aBrian Attwell mActionBarAdapter.setSelectionMode(false); 1295d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell } 1296d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell 1297d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell private void deleteSelectedContacts() { 1298d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell ContactMultiDeletionInteraction.start(PeopleActivity.this, 1299d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell mAllFragment.getSelectedContactIds()); 1300d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell } 1301d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell 1302d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell @Override 1303d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell public void onDeletionFinished() { 13041154bbabc1f174f7dca40d92f59d2b2731930b3aBrian Attwell mActionBarAdapter.setSelectionMode(false); 1305d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell } 1306d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell 130749d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey @Override 1308d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov protected void onActivityResult(int requestCode, int resultCode, Intent data) { 1309d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov switch (requestCode) { 131034b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa case SUBACTIVITY_ACCOUNT_FILTER: { 131134b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa AccountFilterUtil.handleAccountFilterResult( 131234b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa mContactListFilterController, resultCode, data); 1313495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan break; 1314495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan } 1315d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 13167aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann // TODO: Using the new startActivityWithResultFromFragment API this should not be needed 13177aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann // anymore 1318e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER: 1319d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov if (resultCode == RESULT_OK) { 132095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.onPickerResult(data); 1321d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 1322d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 1323d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code 1324d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) { 13251ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// // Finish the activity if the sub activity was canceled as back key is used 13261ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// // to confirm user selection in MODE_PICK_MULTIPLE_PHONES. 13271ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// finish(); 13281ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 13291ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// break; 1330d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 1331d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 13327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 13337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 13347aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 13351ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // TODO move to the fragment 1336db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov 133720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell // Bring up the search UI if the user starts typing 133820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell final int unicodeChar = event.getUnicodeChar(); 133920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if ((unicodeChar != 0) 134020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell // If COMBINING_ACCENT is set, it's not a unicode character. 134120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell && ((unicodeChar & KeyCharacterMap.COMBINING_ACCENT) == 0) 134220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell && !Character.isWhitespace(unicodeChar)) { 134320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (mActionBarAdapter.isSelectionMode()) { 134420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell // Ignore keyboard input when in selection mode. 134520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell return true; 13467aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 134720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell String query = new String(new int[]{unicodeChar}, 0, 1); 134820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (!mActionBarAdapter.isSearchMode()) { 134920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mActionBarAdapter.setSearchMode(true); 135020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mActionBarAdapter.setQueryString(query); 135120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell return true; 13527bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann } 13537aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 13547aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 13557aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return super.onKeyDown(keyCode, event); 13567aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 1357ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov 1358ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov @Override 1359ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov public void onBackPressed() { 13607712aef22da432331a67c710cfc18bce2c493887Jay Shrauner if (!isSafeToCommitTransactions()) { 1361c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner return; 1362c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner } 1363c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner 136420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell if (mActionBarAdapter.isSelectionMode()) { 136520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mActionBarAdapter.setSelectionMode(false); 136620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell mAllFragment.displayCheckBoxes(false); 136720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell } else if (mActionBarAdapter.isSearchMode()) { 1368ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov mActionBarAdapter.setSearchMode(false); 1369a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang 1370a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang if (mAllFragment.wasSearchResultClicked()) { 1371a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang mAllFragment.resetSearchResultClicked(); 1372a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang } else { 137362a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang Logger.logScreenView(this, ScreenType.SEARCH_EXIT); 137482c9033a8f17470a335dd85936479669b50e5877Walter Jang Logger.logSearchEvent(mAllFragment.createSearchState()); 1375a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang } 1376ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } else { 1377ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov super.onBackPressed(); 1378ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } 1379ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } 13807aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 138108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov @Override 138208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov protected void onSaveInstanceState(Bundle outState) { 138308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov super.onSaveInstanceState(outState); 13844d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki mActionBarAdapter.onSaveInstanceState(outState); 13854d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 13864d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // Clear the listener to make sure we don't get callbacks after onSaveInstanceState, 13874d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // in order to avoid doing fragment transactions after it. 13884d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // TODO Figure out a better way to deal with the issue. 138932791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski mDisableOptionItemSelected = true; 13904d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki mActionBarAdapter.setListener(null); 13912e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki if (mTabPager != null) { 13922e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki mTabPager.setOnPageChangeListener(null); 13932e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki } 139408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 139508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 1396fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov @Override 139709d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann protected void onRestoreInstanceState(Bundle savedInstanceState) { 139809d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann super.onRestoreInstanceState(savedInstanceState); 139909d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann // In our own lifecycle, the focus is saved and restore but later taken away by the 140009d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann // ViewPager. As a hack, we force focus on the SearchView if we know that we are searching. 140109d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann // This fixes the keyboard going away on screen rotation 140209d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann if (mActionBarAdapter.isSearchMode()) { 140309d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann mActionBarAdapter.setFocusOnSearchView(); 140409d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann } 140509d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann } 140609d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann 140709d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann @Override 14083391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann public DialogManager getDialogManager() { 14093391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann return mDialogManager; 14103391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann } 1411ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov 14122b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos @Override 14132b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos public void onClick(View view) { 14142b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos switch (view.getId()) { 14152b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos case R.id.floating_action_button: 14162b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); 14172b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos Bundle extras = getIntent().getExtras(); 14182b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos if (extras != null) { 14192b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos intent.putExtras(extras); 14202b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos } 1421d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner try { 1422c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent); 1423d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner } catch (ActivityNotFoundException ex) { 1424d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner Toast.makeText(PeopleActivity.this, R.string.missing_app, 1425d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner Toast.LENGTH_SHORT).show(); 1426d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner } 14272b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos break; 14282b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos default: 14292b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos Log.wtf(TAG, "Unexpected onClick event from " + view); 14302b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos } 14312b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos } 1432962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell 1433962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell /** 1434962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell * Returns the tab position adjusted for the text direction. 1435962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell */ 1436962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell private int getTabPositionForTextDirection(int position) { 1437962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell if (isRTL()) { 1438962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell return TabState.COUNT - 1 - position; 1439962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell } 1440962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell return position; 1441962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell } 14427aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project} 1443