PeopleActivity.java revision 5b221086e4b994d6325d7396625900a79e27ae51
17aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/* 2fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project 37aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * 47aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * you may not use this file except in compliance with the License. 67aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * You may obtain a copy of the License at 77aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * 87aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * 107aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * See the License for the specific language governing permissions and 147aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * limitations under the License. 157aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */ 167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 1727834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovpackage com.android.contacts.activities; 187aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 19e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.Fragment; 20e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.FragmentManager; 21e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.FragmentTransaction; 22e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.content.Intent; 23e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.graphics.Rect; 24e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.net.Uri; 25e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Bundle; 26e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Parcelable; 279f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Chengimport android.os.UserManager; 28e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.preference.PreferenceActivity; 29e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract; 30e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.Contacts; 31e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.ProviderStatus; 32e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.QuickContact; 33e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.Settings; 34e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v13.app.FragmentPagerAdapter; 35e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.PagerAdapter; 36e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.ViewPager; 377d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport android.text.TextUtils; 38e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.util.Log; 39e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyCharacterMap; 40e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyEvent; 41e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.Menu; 42e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuInflater; 43e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuItem; 44e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.View; 45e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.ViewGroup; 462b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulosimport android.widget.ImageButton; 47e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 486f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikovimport com.android.contacts.ContactsActivity; 4927834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R; 504d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onukiimport com.android.contacts.activities.ActionBarAdapter.TabState; 51cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.ContactsUtils; 52c8dd78c595cfaf9766e59a2df012b16d6c05b213Chiao Chengimport com.android.contacts.common.dialog.ClearFrequentsDialog; 539692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikovimport com.android.contacts.interactions.ContactDeletionInteraction; 54051f41d0e2e23fa3acd9258ffc91a60cdbe828ecChiao Chengimport com.android.contacts.common.interactions.ImportExportDialogFragment; 55821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment; 56a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListFilter; 570d5588da244d0992c3ff8f25d0875fdf95a8c644Chiao Chengimport com.android.contacts.common.list.ContactListFilterController; 58e776d0366d5bf2f93a0cd0f14e48804e564bccf2Chiao Chengimport com.android.contacts.common.list.ContactTileAdapter.DisplayType; 59d78ee90c0d4d93b82ad440396e87ae4f47f53e93Daniel Lehmannimport com.android.contacts.list.ContactTileListFragment; 600906ee326a5553a224eb7b004536f35b340bdcd3Dmitri Plotnikovimport com.android.contacts.list.ContactsIntentResolver; 611ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikovimport com.android.contacts.list.ContactsRequest; 628b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ContactsUnavailableFragment; 63b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.list.DefaultContactBrowseListFragment; 64a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.DirectoryListLoader; 65732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport com.android.contacts.list.OnContactBrowserActionListener; 668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.OnContactsUnavailableActionListener; 67c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher; 68c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener; 69c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikovimport com.android.contacts.preference.ContactsPreferenceActivity; 70edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmannimport com.android.contacts.preference.DisplayOptionsPreferenceFragment; 7130868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.util.AccountFilterUtil; 722b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulosimport com.android.contacts.common.util.ViewUtil; 738a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwellimport com.android.contacts.quickcontact.QuickContactActivity; 74aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuanimport com.android.contacts.util.AccountPromptUtils; 75d9eab4da8b9946b76a2091e5cce6c858663ef1bbChiao Chengimport com.android.contacts.common.util.Constants; 763391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager; 778bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwellimport com.android.contacts.util.HelpUtils; 7857cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka 797d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport java.util.Locale; 806d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onukiimport java.util.concurrent.atomic.AtomicInteger; 81caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov 827aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/** 832c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * Displays a list to browse contacts. 847aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */ 852b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulospublic class PeopleActivity extends ContactsActivity implements 862b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos View.OnCreateContextMenuListener, 872b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos View.OnClickListener, 882b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos ActionBarAdapter.Listener, 896e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov DialogManager.DialogShowingViewActivity, 902b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos ContactListFilterController.ContactListFilterListener, 912b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos ProviderStatusListener { 9257d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov 935e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro private static final String TAG = "PeopleActivity"; 947aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 959ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!"; 969ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 975c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan // These values needs to start at 2. See {@link ContactEntryListFragment}. 982c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell private static final int SUBACTIVITY_ACCOUNT_FILTER = 2; 99c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan 10034b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa private final DialogManager mDialogManager = new DialogManager(this); 1013391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann 102ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov private ContactsIntentResolver mIntentResolver; 103fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov private ContactsRequest mRequest; 104caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov 105fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov private ActionBarAdapter mActionBarAdapter; 1067c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov 1077979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro private ContactTileListFragment.Listener mFavoritesFragmentListener = 108ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa new StrequentContactListFragmentListener(); 109ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa 11015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private ContactListFilterController mContactListFilterController; 1113c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov 1128b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private ContactsUnavailableFragment mContactsUnavailableFragment; 113c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki private ProviderStatusWatcher mProviderStatusWatcher; 114d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki private ProviderStatusWatcher.Status mProviderStatus; 1158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 1160cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov private boolean mOptionsMenuContactsAvailable; 1170cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 11895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa /** 11995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa * Showing a list of Contacts. Also used for showing search results in search mode. 12095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa */ 1216e6c24190257fd77d99b4ab385501795537f6effDaniel Lehmann private DefaultContactBrowseListFragment mAllFragment; 1227979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro private ContactTileListFragment mFavoritesFragment; 1232b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos 1242c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell /** ViewPager for swipe */ 125250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private ViewPager mTabPager; 126250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private TabPagerAdapter mTabPagerAdapter; 1272e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki private final TabPagerListener mTabPagerListener = new TabPagerListener(); 12858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 1299ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki private boolean mEnableDebugMenuOptions; 1309ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 131417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /** 132417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * True if this activity instance is a re-created one. i.e. set true after orientation change. 133417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * This is set in {@link #onCreate} for later use in {@link #onStart}. 134417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 135417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki private boolean mIsRecreatedInstance; 136417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 137417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /** 138417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * If {@link #configureFragments(boolean)} is already called. Used to avoid calling it twice 139417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * in {@link #onStart}. 140417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * (This initialization only needs to be done once in onStart() when the Activity was just 141417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * created from scratch -- i.e. onCreate() was just called) 142417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 143417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki private boolean mFragmentInitialized; 144417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 145be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan /** 14632791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski * This is to disable {@link #onOptionsItemSelected} when we trying to stop the activity. 14732791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski */ 14832791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski private boolean mDisableOptionItemSelected; 14932791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski 1506d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki /** Sequential ID assigned to each instance; used for logging */ 1516d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki private final int mInstanceId; 1526d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki private static final AtomicInteger sNextInstanceId = new AtomicInteger(); 1536d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki 1549856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan public PeopleActivity() { 1556d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki mInstanceId = sNextInstanceId.getAndIncrement(); 1561540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov mIntentResolver = new ContactsIntentResolver(this); 157c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher = ProviderStatusWatcher.getInstance(this); 1586178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov } 1596178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov 1606d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki @Override 1616d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki public String toString() { 1626d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki // Shown on logcat 1636d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki return String.format("%s@%d", getClass().getSimpleName(), mInstanceId); 1646d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki } 1656d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki 1668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public boolean areContactsAvailable() { 167d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki return (mProviderStatus != null) 168d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki && mProviderStatus.status == ProviderStatus.STATUS_NORMAL; 1698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 1708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 1716f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki private boolean areContactWritableAccountsAvailable() { 1726f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki return ContactsUtils.areContactWritableAccountsAvailable(this); 17349917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson } 17449917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson 1756f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki private boolean areGroupWritableAccountsAvailable() { 1766f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki return ContactsUtils.areGroupWritableAccountsAvailable(this); 1776f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki } 17849917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson 17950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki /** 18050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * Initialize fragments that are (or may not be) in the layout. 18150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * 18250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * For the fragments that are in the layout, we initialize them in 183417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * {@link #createViewsAndFragments(Bundle)} after inflating the layout. 18450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki * 1852c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * However, the {@link ContactsUnavailableFragment} is a special fragment which may not 1862c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * be in the layout, so we have to do the initialization here. 1872c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * 1882c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * The ContactsUnavailableFragment is always created at runtime. 18950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki */ 1907aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 19192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov public void onAttachFragment(Fragment fragment) { 1922c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (fragment instanceof ContactsUnavailableFragment) { 1938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment; 1948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.setOnContactsUnavailableActionListener( 1958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov new ContactsUnavailableFragmentListener()); 19692a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 19792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 19892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 19992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov @Override 20008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov protected void onCreate(Bundle savedState) { 20149627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) { 20249627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate start"); 20349627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki } 20408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov super.onCreate(savedState); 2057aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 2066d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki if (!processIntent(false)) { 207417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki finish(); 208417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return; 209417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 210a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mContactListFilterController = ContactListFilterController.getInstance(this); 211be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan mContactListFilterController.checkFilterValidity(false); 212a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mContactListFilterController.addListener(this); 213a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa 214c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.addListener(this); 215c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki 216417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mIsRecreatedInstance = (savedState != null); 217417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki createViewsAndFragments(savedState); 2184b1af3f8f68c3f5de459d17c218853fb0849d9f5Andrew Lee 21949627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) { 22049627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish"); 22149627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki } 2225b221086e4b994d6325d7396625900a79e27ae51Sai Cheemalapati getWindow().setBackgroundDrawable(null); 223fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 224fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 225fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov @Override 226fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov protected void onNewIntent(Intent intent) { 227fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov setIntent(intent); 2286d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki if (!processIntent(true)) { 229417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki finish(); 230417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return; 231417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 232417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mActionBarAdapter.initialize(null, mRequest); 233417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 234be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan mContactListFilterController.checkFilterValidity(false); 235be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan 236417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // Re-configure fragments. 237417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki configureFragments(true /* from request */); 238417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki invalidateOptionsMenuIfNeeded(); 239fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 240fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 241417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /** 242417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * Resolve the intent and initialize {@link #mRequest}, and launch another activity if redirect 243417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * is needed. 244417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 2456d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki * @param forNewIntent set true if it's called from {@link #onNewIntent(Intent)}. 246417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * @return {@code true} if {@link PeopleActivity} should continue running. {@code false} 247417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * if it shouldn't, in which case the caller should finish() itself and shouldn't do 248417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * farther initialization. 249417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 2506d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki private boolean processIntent(boolean forNewIntent) { 2511ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // Extract relevant information from the intent 2521ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov mRequest = mIntentResolver.resolveIntent(getIntent()); 253ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki if (Log.isLoggable(TAG, Log.DEBUG)) { 2546d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki Log.d(TAG, this + " processIntent: forNewIntent=" + forNewIntent 2556d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki + " intent=" + getIntent() + " request=" + mRequest); 2566d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki } 2571ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov if (!mRequest.isValid()) { 2586178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov setResult(RESULT_CANCELED); 259417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return false; 2606178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov } 2616178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov 2621ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov Intent redirect = mRequest.getRedirectIntent(); 2631ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov if (redirect != null) { 2641ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // Need to start a different activity 2656178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov startActivity(redirect); 266417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return false; 2677aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 2687aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 2692c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT) { 27050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki redirect = new Intent(this, ContactDetailActivity.class); 27150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki redirect.setAction(Intent.ACTION_VIEW); 27250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki redirect.setData(mRequest.getContactUri()); 27350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki startActivity(redirect); 274417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return false; 27550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki } 276417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki return true; 277417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 27850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki 279417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki private void createViewsAndFragments(Bundle savedState) { 280417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki setContentView(R.layout.people_activity); 281417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 282417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki final FragmentManager fragmentManager = getFragmentManager(); 283417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 284417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // Hide all tabs (the current tab will later be reshown once a tab is selected) 285417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki final FragmentTransaction transaction = fragmentManager.beginTransaction(); 286417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 2872c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPager = getView(R.id.tab_pager); 2882c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPagerAdapter = new TabPagerAdapter(); 2892c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPager.setAdapter(mTabPagerAdapter); 2902c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPager.setOnPageChangeListener(mTabPagerListener); 291417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki 2922c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell final String FAVORITE_TAG = "tab-pager-favorite"; 2932c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell final String ALL_TAG = "tab-pager-all"; 2942c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell 2952c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // Create the fragments and add as children of the view pager. 2962c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // The pager adapter will only change the visibility; it'll never create/destroy 2972c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // fragments. 2982c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // However, if it's after screen rotation, the fragments have been re-created by 2992c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // the fragment manager, so first see if there're already the target fragments 3002c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // existing. 3012c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mFavoritesFragment = (ContactTileListFragment) 3022c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell fragmentManager.findFragmentByTag(FAVORITE_TAG); 3032c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mAllFragment = (DefaultContactBrowseListFragment) 3042c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell fragmentManager.findFragmentByTag(ALL_TAG); 3052c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell 3062c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (mFavoritesFragment == null) { 3072c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mFavoritesFragment = new ContactTileListFragment(); 3082c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mAllFragment = new DefaultContactBrowseListFragment(); 3092c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell 3102c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell transaction.add(R.id.tab_pager, mFavoritesFragment, FAVORITE_TAG); 3112c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG); 312417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 313250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 314417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mFavoritesFragment.setListener(mFavoritesFragmentListener); 31550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki 316417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener()); 31750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki 318417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // Hide all fragments for now. We adjust visibility when we get onSelectedTabChanged() 319417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // from ActionBarAdapter. 320417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki transaction.hide(mFavoritesFragment); 321417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki transaction.hide(mAllFragment); 322f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro 3234b25da79091157935042d2942a8961ceba92166fMinh Pham transaction.commitAllowingStateLoss(); 324417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki fragmentManager.executePendingTransactions(); 3254d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 3260c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro // Setting Properties after fragment is created 3272c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mFavoritesFragment.setDisplayType(DisplayType.STREQUENT); 3280c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro 329417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki // Configure action bar 330a05431fe824f39e60a8b25a244a1fea39805a61bBrian Attwell mActionBarAdapter = new ActionBarAdapter(this, this, getActionBar()); 331417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mActionBarAdapter.initialize(savedState, mRequest); 33258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan 3332b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos // Configure action button 3342c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell final View floatingActionButtonContainer = findViewById( 3352c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell R.id.floating_action_button_container); 3362c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell ViewUtil.setupFloatingActionButton(floatingActionButtonContainer, getResources()); 3372c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell final ImageButton floatingActionButton = (ImageButton) findViewById(R.id.floating_action_button); 3382c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell floatingActionButton.setOnClickListener(this); 3392b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos 340417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki invalidateOptionsMenuIfNeeded(); 341417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 34208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 343417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki @Override 344417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki protected void onStart() { 345417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki if (!mFragmentInitialized) { 346417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki mFragmentInitialized = true; 347417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki /* Configure fragments if we haven't. 348417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 349417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * Note it's a one-shot initialization, so we want to do this in {@link #onCreate}. 350417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 351417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * However, because this method may indirectly touch views in fragments but fragments 352417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * created in {@link #configureContentView} using a {@link FragmentTransaction} will NOT 353417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * have views until {@link Activity#onCreate} finishes (they would if they were inflated 354417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * from a layout), we need to do it here in {@link #onStart()}. 355417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 356417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * (When {@link Fragment#onCreateView} is called is different in the former case and 357417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * in the latter case, unfortunately.) 358417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * 359417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * Also, we skip most of the work in it if the activity is a re-created one. 360417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki * (so the argument.) 361417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki */ 362417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki configureFragments(!mIsRecreatedInstance); 363417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki } 364417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki super.onStart(); 3653c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov } 3663c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov 3676e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 368174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov protected void onPause() { 369fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mOptionsMenuContactsAvailable = false; 370c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.stop(); 371174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov super.onPause(); 372174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 373174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov 374174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov @Override 375174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov protected void onResume() { 376174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov super.onResume(); 377697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus 378c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.start(); 379697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus updateViewConfiguration(true); 3804d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 3814d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // Re-register the listener, which may have been cleared when onSaveInstanceState was 3824d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // called. See also: onSaveInstanceState 3834d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki mActionBarAdapter.setListener(this); 38432791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski mDisableOptionItemSelected = false; 3852e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki if (mTabPager != null) { 3862e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki mTabPager.setOnPageChangeListener(mTabPagerListener); 3872e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki } 388a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki // Current tab may have changed since the last onSaveInstanceState(). Make sure 389a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki // the actual contents match the tab. 390a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki updateFragmentsVisibility(); 391174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 392174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov 393174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov @Override 394be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan protected void onStop() { 395be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan super.onStop(); 396be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan } 397be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan 398be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan @Override 3994d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki protected void onDestroy() { 400c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki mProviderStatusWatcher.removeListener(this); 401c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki 402b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa // Some of variables will be null if this Activity redirects Intent. 403b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa // See also onCreate() or other methods called during the Activity's initialization. 404c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki if (mActionBarAdapter != null) { 405c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki mActionBarAdapter.setListener(null); 406c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki } 407b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa if (mContactListFilterController != null) { 408b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa mContactListFilterController.removeListener(this); 409b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa } 410b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa 4114d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki super.onDestroy(); 4124d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 4134d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 414955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov private void configureFragments(boolean fromRequest) { 415009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov if (fromRequest) { 41691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov ContactListFilter filter = null; 41791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov int actionCode = mRequest.getActionCode(); 41853b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki boolean searchMode = mRequest.isSearchMode(); 41952aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann final int tabToOpen; 42091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov switch (actionCode) { 42191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_ALL_CONTACTS: 422be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 423be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS); 424ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.ALL; 42591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 42691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_CONTACTS_WITH_PHONES: 427be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 42891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY); 429ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.ALL; 43091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 43191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov 43291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_FREQUENT: 43391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_STREQUENT: 43491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_STARRED: 435ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.FAVORITES; 43691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 4379e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro case ContactsRequest.ACTION_VIEW_CONTACT: 438ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki tabToOpen = TabState.ALL; 439ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki break; 44052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann default: 44152aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann tabToOpen = -1; 44252aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann break; 443ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki } 44452aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann if (tabToOpen != -1) { 445ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki mActionBarAdapter.setCurrentTab(tabToOpen); 44691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov } 44791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov 44891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov if (filter != null) { 44991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov mContactListFilterController.setContactListFilter(filter, false); 45053b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki searchMode = false; 451009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov } 452d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 453d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov if (mRequest.getContactUri() != null) { 45453b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki searchMode = false; 455d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov } 456d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 45753b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki mActionBarAdapter.setSearchMode(searchMode); 4580ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan configureContactListFragmentForRequest(); 459fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 460fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 4610ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan configureContactListFragment(); 462fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 4638268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 4646e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 4656e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov 4666e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 467d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov public void onContactListFilterChanged() { 46895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment == null || !mAllFragment.isAdded()) { 469d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov return; 470d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov } 471d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov 47295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setFilter(mContactListFilterController.getFilter()); 473e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov 4748268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 4753ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov } 4763ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov 477fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov /** 478fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Handler for action bar actions. 479fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov */ 480fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov @Override 481311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann public void onAction(int action) { 482b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan switch (action) { 483311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann case ActionBarAdapter.Listener.Action.START_SEARCH_MODE: 484ff64220c681b48d54ff9cb3d82687fc53e2139e5Makoto Onuki // Tell the fragments that we're in the search mode 485ff64220c681b48d54ff9cb3d82687fc53e2139e5Makoto Onuki configureFragments(false /* from request */); 4864d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki updateFragmentsVisibility(); 4878811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki invalidateOptionsMenu(); 488b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan break; 489311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann case ActionBarAdapter.Listener.Action.STOP_SEARCH_MODE: 4901db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki setQueryTextToFragment(""); 4914d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki updateFragmentsVisibility(); 4928811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki invalidateOptionsMenu(); 4938268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan break; 494311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY: 4959ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki final String queryString = mActionBarAdapter.getQueryString(); 4969ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki setQueryTextToFragment(queryString); 4979ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki updateDebugOptionsVisibility( 4989ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki ENABLE_DEBUG_OPTIONS_HIDDEN_CODE.equals(queryString)); 499b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan break; 500b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan default: 501b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action); 502b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 503fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov } 504fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov 5054d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki @Override 5064d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki public void onSelectedTabChanged() { 5074d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki updateFragmentsVisibility(); 5084d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 5094d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 5106adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell @Override 5116adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell public void onUpButtonPressed() { 5126adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell onBackPressed(); 5136adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell } 5146adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell 5159ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki private void updateDebugOptionsVisibility(boolean visible) { 5169ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki if (mEnableDebugMenuOptions != visible) { 5179ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki mEnableDebugMenuOptions = visible; 5189ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki invalidateOptionsMenu(); 5199ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki } 5209ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki } 5219ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 5224d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki /** 5234d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki * Updates the fragment/view visibility according to the current mode, such as 5244d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki * {@link ActionBarAdapter#isSearchMode()} and {@link ActionBarAdapter#getCurrentTab()}. 5254d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki */ 5264d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki private void updateFragmentsVisibility() { 52752aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann int tab = mActionBarAdapter.getCurrentTab(); 5284d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 5294d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki if (mActionBarAdapter.isSearchMode()) { 5302c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPagerAdapter.setSearchMode(true); 5312c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell } else { 5322c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell // No smooth scrolling if quitting from the search mode. 5332c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell final boolean wasSearchMode = mTabPagerAdapter.isSearchMode(); 5342c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPagerAdapter.setSearchMode(false); 5352c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell if (mTabPager.getCurrentItem() != tab) { 5362c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mTabPager.setCurrentItem(tab, !wasSearchMode); 5372c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell } 5384d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 5392c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell invalidateOptionsMenu(); 54066606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson showEmptyStateForTab(tab); 54166606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson } 54266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson 54352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann private void showEmptyStateForTab(int tab) { 54466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson if (mContactsUnavailableFragment != null) { 54566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson switch (tab) { 54652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann case TabState.FAVORITES: 54766606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson mContactsUnavailableFragment.setMessageText( 548a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelson R.string.listTotalAllContactsZeroStarred, -1); 54966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson break; 55052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann case TabState.ALL: 551a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelson mContactsUnavailableFragment.setMessageText(R.string.noContacts, -1); 55266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson break; 55366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson } 55466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson } 5554d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki } 5564d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 557250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private class TabPagerListener implements ViewPager.OnPageChangeListener { 55870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng 55970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // This package-protected constructor is here because of a possible compiler bug. 56070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // PeopleActivity$1.class should be generated due to the private outer/inner class access 56170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // needed here. But for some reason, PeopleActivity$1.class is missing. 56270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // Since $1 class is needed as a jvm work around to get access to the inner class, 56370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // changing the constructor to package-protected or public will solve the problem. 56470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // To verify whether $1 class is needed, javap PeopleActivity$TabPagerListener and look for 56570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // references to PeopleActivity$1. 56670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // 56770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // When the constructor is private and PeopleActivity$1.class is missing, proguard will 56870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // correctly catch this and throw warnings and error out the build on user/userdebug builds. 56970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // 57070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng // All private inner classes below also need this fix. 57170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng TabPagerListener() {} 57270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng 573250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 574250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void onPageScrollStateChanged(int state) { 575250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 576250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 577250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 578250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 579250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 580250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 581250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 582250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void onPageSelected(int position) { 583250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki // Make sure not in the search mode, in which case position != TabState.ordinal(). 584250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (!mTabPagerAdapter.isSearchMode()) { 58552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann mActionBarAdapter.setCurrentTab(position, false); 58652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann showEmptyStateForTab(position); 5878811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki invalidateOptionsMenu(); 588250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 589250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 590250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 591250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 592250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki /** 593250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * Adapter for the {@link ViewPager}. Unlike {@link FragmentPagerAdapter}, 594250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * {@link #instantiateItem} returns existing fragments, and {@link #instantiateItem}/ 595250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * {@link #destroyItem} show/hide fragments instead of attaching/detaching. 596250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * 597250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * In search mode, we always show the "all" fragment, and disable the swipe. We change the 598250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * number of items to 1 to disable the swipe. 599250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * 600250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki * TODO figure out a more straight way to disable swipe. 601250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki */ 602250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private class TabPagerAdapter extends PagerAdapter { 603250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private final FragmentManager mFragmentManager; 604250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private FragmentTransaction mCurTransaction = null; 605250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 606250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private boolean mTabPagerAdapterSearchMode; 607250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 608746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki private Fragment mCurrentPrimaryItem; 609746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki 610250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public TabPagerAdapter() { 611250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mFragmentManager = getFragmentManager(); 612250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 613250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 614250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public boolean isSearchMode() { 615250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return mTabPagerAdapterSearchMode; 616250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 617250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 618250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void setSearchMode(boolean searchMode) { 619250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (searchMode == mTabPagerAdapterSearchMode) { 620250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return; 621250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 622250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mTabPagerAdapterSearchMode = searchMode; 623250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki notifyDataSetChanged(); 624250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 625250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 626250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 627250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public int getCount() { 62852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann return mTabPagerAdapterSearchMode ? 1 : TabState.COUNT; 629250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 630250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 631250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki /** Gets called when the number of items changes. */ 632250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 633250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public int getItemPosition(Object object) { 634250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mTabPagerAdapterSearchMode) { 635250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (object == mAllFragment) { 636250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return 0; // Only 1 page in search mode 637250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 638250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } else { 639250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (object == mFavoritesFragment) { 64052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann return TabState.FAVORITES; 641250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 642250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (object == mAllFragment) { 64352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann return TabState.ALL; 644250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 645250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 646250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return POSITION_NONE; 647250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 648250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 649250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 650970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void startUpdate(ViewGroup container) { 651250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 652250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 653250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki private Fragment getFragment(int position) { 654250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mTabPagerAdapterSearchMode) { 6558d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann if (position != 0) { 6568d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann // This has only been observed in monkey tests. 6578d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann // Let's log this issue, but not crash 6588d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann Log.w(TAG, "Request fragment at position=" + position + ", eventhough we " + 6598d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann "are in search mode"); 660250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 6618d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann return mAllFragment; 662250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } else { 66352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann if (position == TabState.FAVORITES) { 664250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return mFavoritesFragment; 66552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann } else if (position == TabState.ALL) { 666250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return mAllFragment; 667250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 668250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 669250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki throw new IllegalArgumentException("position: " + position); 670250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 671250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 672250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 673970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public Object instantiateItem(ViewGroup container, int position) { 674250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mCurTransaction == null) { 675250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction = mFragmentManager.beginTransaction(); 676250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 677250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki Fragment f = getFragment(position); 678250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction.show(f); 679746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki 6809bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell // Non primary pages are not visible. 6819bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell f.setUserVisibleHint(f == mCurrentPrimaryItem); 682250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return f; 683250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 684250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 685250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 686970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void destroyItem(ViewGroup container, int position, Object object) { 687250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mCurTransaction == null) { 688250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction = mFragmentManager.beginTransaction(); 689250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 690250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction.hide((Fragment) object); 691250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 692250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 693250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 694970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void finishUpdate(ViewGroup container) { 695250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki if (mCurTransaction != null) { 6964b25da79091157935042d2942a8961ceba92166fMinh Pham mCurTransaction.commitAllowingStateLoss(); 697250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mCurTransaction = null; 698250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki mFragmentManager.executePendingTransactions(); 699250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 700250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 701250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 702250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 703250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public boolean isViewFromObject(View view, Object object) { 704250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return ((Fragment) object).getView() == view; 705250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 706250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 707250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 708970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan public void setPrimaryItem(ViewGroup container, int position, Object object) { 709746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki Fragment fragment = (Fragment) object; 710746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki if (mCurrentPrimaryItem != fragment) { 711746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki if (mCurrentPrimaryItem != null) { 7129bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell mCurrentPrimaryItem.setUserVisibleHint(false); 713746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 714746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki if (fragment != null) { 7159bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell fragment.setUserVisibleHint(true); 716746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 717746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki mCurrentPrimaryItem = fragment; 718746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 719746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki } 720746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki 721746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki @Override 722250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public Parcelable saveState() { 723250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki return null; 724250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 725250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 726250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki @Override 727250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki public void restoreState(Parcelable state, ClassLoader loader) { 728250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 729250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki } 730250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki 7311db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki private void setQueryTextToFragment(String query) { 73295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setQueryString(query, true); 7331db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki mAllFragment.setVisibleScrollbarEnabled(!mAllFragment.isSearchMode()); 7348268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 7358268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan 7360ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan private void configureContactListFragmentForRequest() { 737fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov Uri contactUri = mRequest.getContactUri(); 738fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (contactUri != null) { 73995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setSelectedContactUri(contactUri); 740fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 741238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 742a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mAllFragment.setFilter(mContactListFilterController.getFilter()); 7431db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki setQueryTextToFragment(mActionBarAdapter.getQueryString()); 744238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 745fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (mRequest.isDirectorySearchEnabled()) { 74695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT); 747fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } else { 74895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE); 749fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 75008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 75108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 7520ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan private void configureContactListFragment() { 753a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa // Filter may be changed when this Activity is in background. 754a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa mAllFragment.setFilter(mContactListFilterController.getFilter()); 755a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa 7562c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mAllFragment.setVerticalScrollbarPosition(getScrollBarPosition()); 7572c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell mAllFragment.setSelectionVisible(false); 758e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng } 759e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng 7602c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell private int getScrollBarPosition() { 7612c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell return isRTL() ? View.SCROLLBAR_POSITION_LEFT : View.SCROLLBAR_POSITION_RIGHT; 762e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng } 763e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng 764e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng private boolean isRTL() { 765e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng final Locale locale = Locale.getDefault(); 766e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng return TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL; 7671ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 7681323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov 7698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 7708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onProviderStatusChange() { 771697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus updateViewConfiguration(false); 7728b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 7738b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 774697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus private void updateViewConfiguration(boolean forceUpdate) { 775d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki ProviderStatusWatcher.Status providerStatus = mProviderStatusWatcher.getProviderStatus(); 776d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki if (!forceUpdate && (mProviderStatus != null) 777d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki && (providerStatus.status == mProviderStatus.status)) return; 7788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mProviderStatus = providerStatus; 7798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 7808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view); 7818b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 782d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki if (mProviderStatus.status == ProviderStatus.STATUS_NORMAL) { 783b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus // Ensure that the mTabPager is visible; we may have made it invisible below. 784c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov contactsUnavailableView.setVisibility(View.GONE); 785b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus if (mTabPager != null) { 786b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus mTabPager.setVisibility(View.VISIBLE); 787b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus } 788b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus 78995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment != null) { 79095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setEnabled(true); 7918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 7928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } else { 793aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan // If there are no accounts on the device and we should show the "no account" prompt 794aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan // (based on {@link SharedPreferences}), then launch the account setup activity so the 795aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan // user can sign-in or create an account. 7969f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng // 7979f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng // Also check for ability to modify accounts. In limited user mode, you can't modify 7989f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng // accounts so there is no point sending users to account setup activity. 7999f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng final UserManager userManager = UserManager.get(this); 8009f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng final boolean disallowModifyAccounts = userManager.getUserRestrictions().getBoolean( 8019f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng UserManager.DISALLOW_MODIFY_ACCOUNTS); 8029f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng if (!disallowModifyAccounts && !areContactWritableAccountsAvailable() && 8036f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki AccountPromptUtils.shouldShowAccountPrompt(this)) { 804aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan AccountPromptUtils.launchAccountPrompt(this); 805aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan return; 806aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan } 807aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan 808aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan // Otherwise, continue setting up the page so that the user can still use the app 809aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan // without an account. 81095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment != null) { 81195c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.setEnabled(false); 8128b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8138b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (mContactsUnavailableFragment == null) { 8148b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment = new ContactsUnavailableFragment(); 8158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.setOnContactsUnavailableActionListener( 8168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov new ContactsUnavailableFragmentListener()); 8173ed426c842a68895a759548fef87bac359f937bbDianne Hackborn getFragmentManager().beginTransaction() 8188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment) 8194b25da79091157935042d2942a8961ceba92166fMinh Pham .commitAllowingStateLoss(); 8208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 821d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki mContactsUnavailableFragment.updateStatus(mProviderStatus); 822b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus 823b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus // Show the contactsUnavailableView, and hide the mTabPager so that we don't 824b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus // see it sliding in underneath the contactsUnavailableView at the edges. 8258b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov contactsUnavailableView.setVisibility(View.VISIBLE); 826b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus if (mTabPager != null) { 827b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus mTabPager.setVisibility(View.GONE); 828b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus } 829b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus 83052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann showEmptyStateForTab(mActionBarAdapter.getCurrentTab()); 8318b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8328b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8338268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 8348b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8358b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8361ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov private final class ContactBrowserActionListener implements OnContactBrowserActionListener { 83770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng ContactBrowserActionListener() {} 838d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 839e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 840d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov public void onSelectionChange() { 841e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov 8421ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 843e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov 844e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 8452c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell public void onViewContactAction(Uri contactLookupUri) { 8462c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell Intent intent = QuickContact.composeQuickContactsIntent(PeopleActivity.this, 84731c7bf977e06fe3ed198cacf34d94b0a2c131a14Paul Soulos (Rect) null, contactLookupUri, QuickContactActivity.MODE_FULLY_EXPANDED, null); 8481ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov startActivity(intent); 8491ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 850416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov 851e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 8521ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onDeleteContactAction(Uri contactUri) { 8539856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false); 8541ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 8558a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov 856e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 8571ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onFinishAction() { 8581ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov onBackPressed(); 8591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 8606e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov 8616e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 8626e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov public void onInvalidSelection() { 863b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter filter; 864b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter currentFilter = mAllFragment.getFilter(); 865b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa if (currentFilter != null 866b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) { 867b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa filter = ContactListFilter.createFilterWithType( 868b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS); 869b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa mAllFragment.setFilter(filter); 870b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa } else { 871b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa filter = ContactListFilter.createFilterWithType( 872b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa ContactListFilter.FILTER_TYPE_SINGLE_CONTACT); 873b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa mAllFragment.setFilter(filter, false); 874b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa } 875d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov mContactListFilterController.setContactListFilter(filter, true); 8766e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 8771ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 878416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov 8798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private class ContactsUnavailableFragmentListener 8808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov implements OnContactsUnavailableActionListener { 88170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng ContactsUnavailableFragmentListener() {} 8828b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8838b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 8848b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onCreateNewContactAction() { 8858b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI)); 8868b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 8898b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onAddAccountAction() { 8908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT); 8911fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 8928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov intent.putExtra(Settings.EXTRA_AUTHORITIES, 8938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov new String[] { ContactsContract.AUTHORITY }); 8948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov startActivity(intent); 8958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 8988b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onImportContactsFromFileAction() { 899a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(), 900a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng PeopleActivity.class); 9018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 9038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 9048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onFreeInternalStorageAction() { 9058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov startActivity(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)); 9068b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 909ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa private final class StrequentContactListFragmentListener 9107979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro implements ContactTileListFragment.Listener { 91170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng StrequentContactListFragmentListener() {} 91270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng 913ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa @Override 9147a700cf798a19a8452b8671f643a05336f63f611Katherine Kuan public void onContactSelected(Uri contactUri, Rect targetRect) { 9152c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell Intent intent = QuickContact.composeQuickContactsIntent(PeopleActivity.this, 9168a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwell targetRect, contactUri, QuickContactActivity.MODE_FULLY_EXPANDED, null); 9172c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell startActivity(intent); 918ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa } 9194e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus 9204e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus @Override 9214e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus public void onCallNumberDirectly(String phoneNumber) { 9224e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus // No need to call phone number directly from People app. 9234e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus Log.w(TAG, "unexpected invocation of onCallNumberDirectly()"); 9244e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus } 925ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa } 926ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa 9277aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 9287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 929946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki if (!areContactsAvailable()) { 930946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki // If contacts aren't available, hide all menu items. 931946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki return false; 932946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki } 933d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey super.onCreateOptionsMenu(menu); 934d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey 935d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov MenuInflater inflater = getMenuInflater(); 93618e0cabec8df2e20ab4b33320804cc3472f195c2Daisuke Miyakawa inflater.inflate(R.menu.people_options, menu); 937971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan 938b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan return true; 939d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 9407aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 9418268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan private void invalidateOptionsMenuIfNeeded() { 9420cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov if (isOptionsMenuChanged()) { 9438268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenu(); 9440cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9450cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9460cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 9470cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov public boolean isOptionsMenuChanged() { 9480cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov if (mOptionsMenuContactsAvailable != areContactsAvailable()) { 9490cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return true; 9500cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9510cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 95295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa if (mAllFragment != null && mAllFragment.isOptionsMenuChanged()) { 9530cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return true; 9540cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9550cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 9560cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return false; 9570cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9580cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 9590cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov @Override 960d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey public boolean onPrepareOptionsMenu(Menu menu) { 9610cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov mOptionsMenuContactsAvailable = areContactsAvailable(); 9620cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov if (!mOptionsMenuContactsAvailable) { 9638b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov return false; 9648b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9658b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 9662fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu // Get references to individual menu items in the menu 967789bc596877861da26ca862c699a269783d8d42aIsaac Katzenelson final MenuItem contactsFilterMenu = menu.findItem(R.id.menu_contacts_filter); 9682fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu final MenuItem clearFrequentsMenu = menu.findItem(R.id.menu_clear_frequents); 9698bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwell final MenuItem helpMenu = menu.findItem(R.id.menu_help); 9702fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu 971af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki final boolean isSearchMode = mActionBarAdapter.isSearchMode(); 972af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki if (isSearchMode) { 973683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson contactsFilterMenu.setVisible(false); 9742fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu clearFrequentsMenu.setVisible(false); 9758bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwell helpMenu.setVisible(false); 9768268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } else { 9774d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki switch (mActionBarAdapter.getCurrentTab()) { 97852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann case TabState.FAVORITES: 979683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson contactsFilterMenu.setVisible(false); 9802fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu clearFrequentsMenu.setVisible(hasFrequents()); 981683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson break; 98252aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann case TabState.ALL: 983683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson contactsFilterMenu.setVisible(true); 9842fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu clearFrequentsMenu.setVisible(false); 9858268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan break; 9868268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 9878bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwell HelpUtils.prepareHelpMenuItem(this, helpMenu, R.string.help_url_people_main); 988e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov } 989af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki final boolean showMiscOptions = !isSearchMode; 990af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_search, showMiscOptions); 991af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_import_export, showMiscOptions); 992af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_accounts, showMiscOptions); 993af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki makeMenuItemVisible(menu, R.id.menu_settings, 994af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki showMiscOptions && !ContactsPreferenceActivity.isEmpty(this)); 995e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov 9969ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki // Debug options need to be visible even in search mode. 9979ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki makeMenuItemVisible(menu, R.id.export_database, mEnableDebugMenuOptions); 9989ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki 999d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 10007aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 10017aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 10022fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu /** 10032fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu * Returns whether there are any frequently contacted people being displayed 10042fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu * @return 10052fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu */ 10062fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu private boolean hasFrequents() { 10072c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell return mFavoritesFragment.hasFrequents(); 10082fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu } 10092fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu 1010af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki private void makeMenuItemVisible(Menu menu, int itemId, boolean visible) { 1011af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki MenuItem item =menu.findItem(itemId); 1012af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki if (item != null) { 1013af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki item.setVisible(visible); 1014af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki } 1015af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki } 1016af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki 10177aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 10187aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 101932791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski if (mDisableOptionItemSelected) { 102032791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski return false; 102132791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski } 102232791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski 10237aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project switch (item.getItemId()) { 1024e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki case android.R.id.home: { 1025e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki // The home icon on the action bar is pressed 1026e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki if (mActionBarAdapter.isUpShowing()) { 1027e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki // "UP" icon press -- should be treated as "back". 1028e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki onBackPressed(); 1029e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki } 1030e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki return true; 1031e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki } 1032c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov case R.id.menu_settings: { 1033c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov final Intent intent = new Intent(this, ContactsPreferenceActivity.class); 1034c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell // Since there is only one section right now, make sure it is selected on 1035c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell // small screens. 1036c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, 1037c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell DisplayOptionsPreferenceFragment.class.getName()); 1038c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell // By default, the title of the activity should be equivalent to the fragment 1039c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell // title. We set this argument to avoid this. Because of a bug, the following 1040c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell // line isn't necessary. But, once the bug is fixed this may become necessary. 1041c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell // b/5045558 refers to this issue, as well as another. 1042c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_TITLE, 1043c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell R.string.activity_title_settings); 1044c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann startActivity(intent); 10457aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return true; 1046d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 1047b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan case R.id.menu_contacts_filter: { 1048b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus AccountFilterUtil.startAccountFilterActivityForResult( 1049b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus this, SUBACTIVITY_ACCOUNT_FILTER, 1050b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus mContactListFilterController.getFilter()); 1051b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan return true; 1052b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 1053d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey case R.id.menu_search: { 10548e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov onSearchRequested(); 10557aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return true; 1056d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 105749d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey case R.id.menu_import_export: { 1058a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(), 1059a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng PeopleActivity.class); 1060d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 1061d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 10622fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu case R.id.menu_clear_frequents: { 10632fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu ClearFrequentsDialog.show(getFragmentManager()); 10642fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu return true; 10652fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu } 1066d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey case R.id.menu_accounts: { 1067d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS); 1068fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] { 1069d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey ContactsContract.AUTHORITY 1070d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey }); 10711fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 1072d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey startActivity(intent); 1073d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 1074d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 10759ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki case R.id.export_database: { 10769ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE"); 10779ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 10789ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki startActivity(intent); 10799ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki return true; 10809ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki } 10817aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 10827aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return false; 10837aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 10847aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 10858e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov @Override 108653b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki public boolean onSearchRequested() { // Search key pressed. 108753b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki mActionBarAdapter.setSearchMode(true); 108853b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki return true; 1089db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov } 1090db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov 109149d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey @Override 1092d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov protected void onActivityResult(int requestCode, int resultCode, Intent data) { 1093d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov switch (requestCode) { 109434b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa case SUBACTIVITY_ACCOUNT_FILTER: { 109534b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa AccountFilterUtil.handleAccountFilterResult( 109634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa mContactListFilterController, resultCode, data); 1097495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan break; 1098495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan } 1099d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 11007aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann // TODO: Using the new startActivityWithResultFromFragment API this should not be needed 11017aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann // anymore 1102e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER: 1103d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov if (resultCode == RESULT_OK) { 110495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa mAllFragment.onPickerResult(data); 1105d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 1106d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 1107d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code 1108d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) { 11091ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// // Finish the activity if the sub activity was canceled as back key is used 11101ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// // to confirm user selection in MODE_PICK_MULTIPLE_PHONES. 11111ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// finish(); 11121ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 11131ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// break; 1114d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 1115d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 11167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 11177aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 11187aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 11191ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // TODO move to the fragment 11207aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project switch (keyCode) { 11211ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// case KeyEvent.KEYCODE_CALL: { 11221ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// if (callSelection()) { 11231ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// return true; 11241ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 11251ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// break; 11261ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 1127db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov 11287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project case KeyEvent.KEYCODE_DEL: { 11296c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov if (deleteSelection()) { 11307aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return true; 11317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 11327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project break; 11337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 11347bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann default: { 11357bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann // Bring up the search UI if the user starts typing 11367bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann final int unicodeChar = event.getUnicodeChar(); 11376b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki if ((unicodeChar != 0) 11386b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki // If COMBINING_ACCENT is set, it's not a unicode character. 11396b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki && ((unicodeChar & KeyCharacterMap.COMBINING_ACCENT) == 0) 11406b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki && !Character.isWhitespace(unicodeChar)) { 11417bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann String query = new String(new int[]{ unicodeChar }, 0, 1); 1142b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (!mActionBarAdapter.isSearchMode()) { 1143b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBarAdapter.setQueryString(query); 1144b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBarAdapter.setSearchMode(true); 1145b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan return true; 11467bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann } 11477bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann } 11487bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann } 11497aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 11507aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 11517aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return super.onKeyDown(keyCode, event); 11527aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 1153ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov 1154ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov @Override 1155ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov public void onBackPressed() { 115653b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki if (mActionBarAdapter.isSearchMode()) { 1157ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov mActionBarAdapter.setSearchMode(false); 1158ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } else { 1159ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov super.onBackPressed(); 1160ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } 1161ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } 11627aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 11636c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov private boolean deleteSelection() { 11641ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // TODO move to the fragment 11651ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// if (mActionCode == ContactsRequest.ACTION_DEFAULT) { 11661ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// final int position = mListView.getSelectedItemPosition(); 11671ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// if (position != ListView.INVALID_POSITION) { 11681ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// Uri contactUri = getContactUri(position); 11691ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// if (contactUri != null) { 11701ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// doContactDelete(contactUri); 11711ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// return true; 11721ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 11731ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 11741ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 11756c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov return false; 11766c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov } 11776c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov 117808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov @Override 117908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov protected void onSaveInstanceState(Bundle outState) { 118008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov super.onSaveInstanceState(outState); 11814d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki mActionBarAdapter.onSaveInstanceState(outState); 11824d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki 11834d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // Clear the listener to make sure we don't get callbacks after onSaveInstanceState, 11844d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // in order to avoid doing fragment transactions after it. 11854d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki // TODO Figure out a better way to deal with the issue. 118632791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski mDisableOptionItemSelected = true; 11874d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki mActionBarAdapter.setListener(null); 11882e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki if (mTabPager != null) { 11892e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki mTabPager.setOnPageChangeListener(null); 11902e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki } 119108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 119208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 1193fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov @Override 119409d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann protected void onRestoreInstanceState(Bundle savedInstanceState) { 119509d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann super.onRestoreInstanceState(savedInstanceState); 119609d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann // In our own lifecycle, the focus is saved and restore but later taken away by the 119709d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann // ViewPager. As a hack, we force focus on the SearchView if we know that we are searching. 119809d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann // This fixes the keyboard going away on screen rotation 119909d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann if (mActionBarAdapter.isSearchMode()) { 120009d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann mActionBarAdapter.setFocusOnSearchView(); 120109d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann } 120209d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann } 120309d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann 120409d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann @Override 12053391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann public DialogManager getDialogManager() { 12063391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann return mDialogManager; 12073391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann } 1208ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov 12092b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos @Override 12102b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos public void onClick(View view) { 12112b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos switch (view.getId()) { 12122b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos case R.id.floating_action_button: 12132b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); 12142b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos Bundle extras = getIntent().getExtras(); 12152b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos if (extras != null) { 12162b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos intent.putExtras(extras); 12172b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos } 12182b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos startActivity(intent); 12192b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos break; 12202b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos default: 12212b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos Log.wtf(TAG, "Unexpected onClick event from " + view); 12222b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos } 12232b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos } 12247aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project} 1225