PeopleActivity.java revision 971116e466757434f4979a61d4f58ea0deac1ea4
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 1979700889dad553dcde9e22a2fd23df768f68080fKatherine Kuanimport com.android.contacts.ContactLoader; 2018ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.ContactSaveService; 216f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikovimport com.android.contacts.ContactsActivity; 2227834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R; 2318ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.detail.ContactDetailFragment; 24b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.group.GroupBrowseListFragment; 25be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuanimport com.android.contacts.group.GroupBrowseListFragment.OnGroupBrowserActionListener; 26be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuanimport com.android.contacts.group.GroupDetailFragment; 279692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikovimport com.android.contacts.interactions.ContactDeletionInteraction; 28261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmannimport com.android.contacts.interactions.ImportExportDialogFragment; 29b4e8886bcb25cde3b03eedcc815c0166329af3a4Dmitri Plotnikovimport com.android.contacts.interactions.PhoneNumberInteraction; 30416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikovimport com.android.contacts.list.ContactBrowseListContextMenuAdapter; 3108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactBrowseListFragment; 3259fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikovimport com.android.contacts.list.ContactEntryListFragment; 33009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikovimport com.android.contacts.list.ContactListFilter; 3415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController; 35f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaroimport com.android.contacts.list.ContactTileAdapter.DisplayType; 360906ee326a5553a224eb7b004536f35b340bdcd3Dmitri Plotnikovimport com.android.contacts.list.ContactsIntentResolver; 371ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikovimport com.android.contacts.list.ContactsRequest; 388b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ContactsUnavailableFragment; 396e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikovimport com.android.contacts.list.CustomContactListFilterActivity; 40b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.list.DefaultContactBrowseListFragment; 414d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikovimport com.android.contacts.list.DirectoryListLoader; 42732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport com.android.contacts.list.OnContactBrowserActionListener; 438b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.OnContactsUnavailableActionListener; 448b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ProviderStatusLoader; 458b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ProviderStatusLoader.ProviderStatusListener; 46b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.list.StrequentContactListFragment; 47971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport com.android.contacts.model.AccountTypeManager; 48c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikovimport com.android.contacts.preference.ContactsPreferenceActivity; 498b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.util.AccountSelectionUtil; 50971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport com.android.contacts.util.AccountsListAdapter; 513391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager; 521323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikovimport com.android.contacts.widget.ContextMenuAdapter; 5357cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka 54caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikovimport android.accounts.Account; 553d48a46d6ea2d0ad43f1d6253399db45414ac9b7Dmitri Plotnikovimport android.app.ActionBar; 56b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.ActionBar.Tab; 57b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.ActionBar.TabListener; 587aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.app.Activity; 5992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikovimport android.app.Fragment; 60b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.FragmentManager; 61b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.app.FragmentTransaction; 6260be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmannimport android.content.ActivityNotFoundException; 637aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.content.ContentValues; 647aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.content.Intent; 65b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.content.res.TypedArray; 667aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.net.Uri; 677aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.os.Bundle; 68d7c4af2b932ffc65476fb1ac6d74feac74b48f3cDmitri Plotnikovimport android.provider.ContactsContract; 69e05296673449dc6686c4fec4dd2e98ab47a78056Jeff Hamiltonimport android.provider.ContactsContract.Contacts; 70971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.provider.ContactsContract.Intents; 718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport android.provider.ContactsContract.ProviderStatus; 729692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikovimport android.provider.Settings; 73a35a7e2aabc4edfafb9b4171e279bdb4c0c03d44Daniel Lehmannimport android.util.Log; 747aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.KeyEvent; 757aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.Menu; 76d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkeyimport android.view.MenuInflater; 777aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.MenuItem; 787aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Projectimport android.view.View; 79971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.view.View.OnClickListener; 804af3b0710ac6f08450b723a3784495469e45ba05Dmitri Plotnikovimport android.view.Window; 81971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.widget.AdapterView; 82971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.widget.AdapterView.OnItemClickListener; 83971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuanimport android.widget.ListPopupWindow; 84b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport android.widget.SearchView; 85424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikovimport android.widget.Toast; 867aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 87caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikovimport java.util.ArrayList; 88caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov 897aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/** 90bd772a5bfd907f3b14589a07378fb26dfd924d93Daniel Lehmann * Displays a list to browse contacts. For xlarge screens, this also displays a detail-pane on 91a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov * the right. 927aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */ 939856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuanpublic class PeopleActivity extends ContactsActivity 94fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov implements View.OnCreateContextMenuListener, ActionBarAdapter.Listener, 956e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov DialogManager.DialogShowingViewActivity, 968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov ContactListFilterController.ContactListFilterListener, ProviderStatusListener { 9757d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov 985e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro private static final String TAG = "PeopleActivity"; 997aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 10022fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann private static final int SUBACTIVITY_NEW_CONTACT = 2; 101c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private static final int SUBACTIVITY_EDIT_CONTACT = 3; 102c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan private static final int SUBACTIVITY_NEW_GROUP = 4; 103c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan private static final int SUBACTIVITY_EDIT_GROUP = 5; 104c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 6; 105c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan 106f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro private static final int FAVORITES_COLUMN_COUNT = 4; 1073c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov 10815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private static final String KEY_SEARCH_MODE = "searchMode"; 10915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov 1103b7d5949bfa524534e5d1aa29b8eaff8733ae00cDaniel Lehmann private DialogManager mDialogManager = new DialogManager(this); 1113391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann 112ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov private ContactsIntentResolver mIntentResolver; 113fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov private ContactsRequest mRequest; 114caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov 115fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov private ActionBarAdapter mActionBarAdapter; 1167c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov 11715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private boolean mSearchMode; 118fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov 119fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov private ContactBrowseListFragment mListFragment; 1200dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro 1210dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro /** 122be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan * Whether we have a right-side contact or group detail pane for displaying info on that 123be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan * contact or group while browsing. Generally means "this is a tablet". 1240dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro */ 125be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan private boolean mContentPaneDisplayed; 1260dfbe0339c7319ad02edc34de3d50104f64de735Dave Santoro 127be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan private ContactDetailFragment mContactDetailFragment; 128c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan private final ContactDetailFragmentListener mContactDetailFragmentListener = 129be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan new ContactDetailFragmentListener(); 130c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan private final GroupDetailFragmentListener mGroupDetailFragmentListener = 131c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan new GroupDetailFragmentListener(); 132be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan 133be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan private GroupDetailFragment mGroupDetailFragment; 134424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov 135ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa private StrequentContactListFragment.Listener mFavoritesFragmentListener = 136ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa new StrequentContactListFragmentListener(); 137ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa 138fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov private boolean mSearchInitiated; 139e1d4c0617ede33b4b0cdb1137aca971b3dacc747Dmitri Plotnikov 14015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private ContactListFilterController mContactListFilterController; 1413c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov 1428b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private ContactsUnavailableFragment mContactsUnavailableFragment; 1438b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private ProviderStatusLoader mProviderStatusLoader; 1448b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private int mProviderStatus = -1; 1458b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 1460cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov private boolean mOptionsMenuContactsAvailable; 1470cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 148b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan private DefaultContactBrowseListFragment mContactsFragment; 149b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan private StrequentContactListFragment mFavoritesFragment; 150f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro private StrequentContactListFragment mFrequentFragment; 151b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan private GroupBrowseListFragment mGroupsFragment; 152b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 153f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro private View mFavoritesView; 154f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro private View mBrowserView; 155f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro private View mDetailsView; 156f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro 157971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan private View mAddGroupImageView; 158971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan 1598268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan private enum TabState { 1608268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan FAVORITES, CONTACTS, GROUPS 1618268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 1628268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan 1638268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan private TabState mSelectedTab; 1648268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan 1659856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan public PeopleActivity() { 1661540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov mIntentResolver = new ContactsIntentResolver(this); 167b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan // TODO: Get rid of the ContactListFilterController class because there aren't any 168b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan // dropdown filters anymore. Just store the selected filter as a member variable. 16915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mContactListFilterController = new ContactListFilterController(this); 1706e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov mContactListFilterController.addListener(this); 1718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mProviderStatusLoader = new ProviderStatusLoader(this); 1726178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov } 1736178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov 1748b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public boolean areContactsAvailable() { 1758b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov return mProviderStatus == ProviderStatus.STATUS_NORMAL; 1768b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 1778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 1787aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 17992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov public void onAttachFragment(Fragment fragment) { 18092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov if (fragment instanceof ContactBrowseListFragment) { 18192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov mListFragment = (ContactBrowseListFragment)fragment; 18292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov mListFragment.setOnContactListActionListener(new ContactBrowserActionListener()); 183a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov if (!getWindow().hasFeature(Window.FEATURE_ACTION_BAR)) { 184fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mListFragment.setContextMenuAdapter( 185fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov new ContactBrowseListContextMenuAdapter(mListFragment)); 1868daa1797310aca2333efcff0a0e0b0ed03187fffDmitri Plotnikov } 187be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } else if (fragment instanceof GroupBrowseListFragment) { 188be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mGroupsFragment = (GroupBrowseListFragment) fragment; 189be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mGroupsFragment.setListener(new GroupBrowserActionListener()); 190d364314c460152db7089b304beec81b3675893baDmitri Plotnikov } else if (fragment instanceof ContactDetailFragment) { 191be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mContactDetailFragment = (ContactDetailFragment) fragment; 192be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mContactDetailFragment.setListener(mContactDetailFragmentListener); 193be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mContentPaneDisplayed = true; 1948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } else if (fragment instanceof ContactsUnavailableFragment) { 1958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment; 1968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.setProviderStatusLoader(mProviderStatusLoader); 1978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.setOnContactsUnavailableActionListener( 1988b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov new ContactsUnavailableFragmentListener()); 199be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } else if (fragment instanceof GroupDetailFragment) { 200be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mGroupDetailFragment = (GroupDetailFragment) fragment; 201c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan mGroupDetailFragment.setListener(mGroupDetailFragmentListener); 202be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mContentPaneDisplayed = true; 203ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa } else if (fragment instanceof StrequentContactListFragment) { 204ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa mFavoritesFragment = (StrequentContactListFragment) fragment; 205ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa mFavoritesFragment.setListener(mFavoritesFragmentListener); 206f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mFavoritesFragment.setColumnCount(FAVORITES_COLUMN_COUNT); 207f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mFavoritesFragment.setDisplayType(DisplayType.STARRED_ONLY); 20892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 20992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 21092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 21192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov @Override 21208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov protected void onCreate(Bundle savedState) { 21308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov super.onCreate(savedState); 2147aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 215fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov configureContentView(true, savedState); 216fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 217fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 218fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov @Override 219fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov protected void onNewIntent(Intent intent) { 220fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov setIntent(intent); 221fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov configureContentView(false, null); 222fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 223fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 224fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov private void configureContentView(boolean createContentView, Bundle savedState) { 2251ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // Extract relevant information from the intent 2261ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov mRequest = mIntentResolver.resolveIntent(getIntent()); 2271ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov if (!mRequest.isValid()) { 2286178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov setResult(RESULT_CANCELED); 2297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project finish(); 2301ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov return; 2316178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov } 2326178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov 2331ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov Intent redirect = mRequest.getRedirectIntent(); 2341ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov if (redirect != null) { 2351ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // Need to start a different activity 2366178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov startActivity(redirect); 2377aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project finish(); 2381ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov return; 2397aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 2407aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 241fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (createContentView) { 2429856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan setContentView(R.layout.people_activity); 243b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 244f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mFavoritesView = findViewById(R.id.favorites_view); 245f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mDetailsView = findViewById(R.id.details_view); 246f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mBrowserView = findViewById(R.id.browse_view); 247f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro 248b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan final FragmentManager fragmentManager = getFragmentManager(); 249b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mFavoritesFragment = (StrequentContactListFragment) fragmentManager 250b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan .findFragmentById(R.id.favorites_fragment); 251f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mFrequentFragment = (StrequentContactListFragment) fragmentManager 252f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro .findFragmentById(R.id.frequent_fragment); 253b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mContactsFragment = (DefaultContactBrowseListFragment) fragmentManager 254b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan .findFragmentById(R.id.contacts_fragment); 255b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mGroupsFragment = (GroupBrowseListFragment) fragmentManager 256b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan .findFragmentById(R.id.groups_fragment); 257b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan // Hide all tabs (the current tab will later be reshown once a tab is selected) 258b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan final FragmentTransaction transaction = fragmentManager.beginTransaction(); 259b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan transaction.hide(mContactsFragment); 260b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan transaction.hide(mGroupsFragment); 261f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro 262f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro if (mFrequentFragment != null) { 263f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mFrequentFragment.setDisplayType(DisplayType.FREQUENT_ONLY); 264f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro } 265be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan if (mContactDetailFragment != null) { 266be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan transaction.hide(mContactDetailFragment); 267be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } 268be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan if (mGroupDetailFragment != null) { 269be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan transaction.hide(mGroupDetailFragment); 270be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } 271b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan transaction.commit(); 272fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 27365ad5eedb8f44f11e1d29cce141eddd88c0941b3Dmitri Plotnikov 27490715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT 275be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan && !mContentPaneDisplayed) { 27690715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov redirect = new Intent(this, ContactDetailActivity.class); 27790715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov redirect.setAction(Intent.ACTION_VIEW); 27890715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov redirect.setData(mRequest.getContactUri()); 27990715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov startActivity(redirect); 28090715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov finish(); 28190715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov return; 28227b97bca14c84b3f830c7a433e14ae5c180a32c3Dmitri Plotnikov } 28327b97bca14c84b3f830c7a433e14ae5c180a32c3Dmitri Plotnikov 28490715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov setTitle(mRequest.getActivityTitle()); 285b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan ActionBar actionBar = getActionBar(); 2861ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan mActionBarAdapter = new ActionBarAdapter(this, this); 2871ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan mActionBarAdapter.onCreate(savedState, mRequest, getActionBar(), !mContentPaneDisplayed); 288b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBarAdapter.setContactListFilterController(mContactListFilterController); 289fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 2903bf12640a267146a6a0134367f7236401db8e754Daniel Lehmann if (createContentView) { 291b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan actionBar.removeAllTabs(); 292b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan Tab favoritesTab = actionBar.newTab(); 293b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan favoritesTab.setText(getString(R.string.strequentList)); 294be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment, 295f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mFrequentFragment, TabState.FAVORITES)); 296b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan actionBar.addTab(favoritesTab); 2973d48a46d6ea2d0ad43f1d6253399db45414ac9b7Dmitri Plotnikov 298b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan Tab peopleTab = actionBar.newTab(); 299b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan peopleTab.setText(getString(R.string.people)); 300be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan peopleTab.setTabListener(new TabChangeListener(mContactsFragment, 3018268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan mContactDetailFragment, TabState.CONTACTS)); 302b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan actionBar.addTab(peopleTab); 303b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 304b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan Tab groupsTab = actionBar.newTab(); 305b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan groupsTab.setText(getString(R.string.contactsGroupsLabel)); 306be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan groupsTab.setTabListener(new TabChangeListener(mGroupsFragment, 3078268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan mGroupDetailFragment, TabState.GROUPS)); 308b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan actionBar.addTab(groupsTab); 309b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan actionBar.setDisplayShowTitleEnabled(true); 310b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 311b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan TypedArray a = obtainStyledAttributes(null, R.styleable.ActionBarHomeIcon); 312b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan boolean showHomeIcon = a.getBoolean(R.styleable.ActionBarHomeIcon_show_home_icon, true); 313b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan actionBar.setDisplayShowHomeEnabled(showHomeIcon); 314b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 3158268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 316d364314c460152db7089b304beec81b3675893baDmitri Plotnikov } 31708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 318fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov configureFragments(savedState == null); 3193c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov } 3203c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov 321b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan /** 322b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan * Tab change listener that is instantiated once for each tab. Handles showing/hiding fragments. 323b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan * TODO: Use ViewPager so that tabs can be swiped left and right. Figure out how to use the 324b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan * support library in our app. 325b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan */ 326b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan private class TabChangeListener implements TabListener { 327be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan private final Fragment mBrowseListFragment; 328be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan 329be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan /** 330be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan * Right pane fragment that is present on larger screen sizes (can be 331be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan * null for smaller screen sizes). 332be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan */ 333be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan private final Fragment mDetailFragment; 3348268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan private final TabState mTabState; 335b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 3368268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan public TabChangeListener(Fragment listFragment, Fragment detailFragment, TabState state) { 337be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mBrowseListFragment = listFragment; 338be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mDetailFragment = detailFragment; 3398268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan mTabState = state; 340b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 341b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 342b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan @Override 343b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan public void onTabUnselected(Tab tab, FragmentTransaction ft) { 344be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ft.hide(mBrowseListFragment); 345be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan if (mDetailFragment != null) { 346be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ft.hide(mDetailFragment); 347be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } 348b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 349b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 350b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan @Override 351b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan public void onTabSelected(Tab tab, FragmentTransaction ft) { 352be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ft.show(mBrowseListFragment); 353be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan if (mDetailFragment != null) { 354be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ft.show(mDetailFragment); 355be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } 3568268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan setSelectedTab(mTabState); 3578268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenu(); 358b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 359b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 360b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan @Override 361b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan public void onTabReselected(Tab tab, FragmentTransaction ft) { 362b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 363b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 364b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 3658268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan private void setSelectedTab(TabState tab) { 3668268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan mSelectedTab = tab; 367f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro 368aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro if (mContentPaneDisplayed) { 369f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro switch (mSelectedTab) { 370f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro case FAVORITES: 371f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mFavoritesView.setVisibility(View.VISIBLE); 372f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mBrowserView.setVisibility(View.GONE); 373f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mDetailsView.setVisibility(View.GONE); 374f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro break; 375f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro case GROUPS: 376f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro case CONTACTS: 377f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mFavoritesView.setVisibility(View.GONE); 378f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mBrowserView.setVisibility(View.VISIBLE); 379f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro mDetailsView.setVisibility(View.VISIBLE); 380f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro break; 381f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro } 382f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro } 3838268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 3848268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan 3856e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 386174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov protected void onPause() { 387174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov if (mActionBarAdapter != null) { 388174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov mActionBarAdapter.setListener(null); 389174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 390fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 391fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mOptionsMenuContactsAvailable = false; 392fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 393fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mProviderStatus = -1; 3948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mProviderStatusLoader.setProviderStatusListener(null); 395174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov super.onPause(); 396174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 397174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov 398174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov @Override 399174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov protected void onResume() { 400174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov super.onResume(); 401174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov if (mActionBarAdapter != null) { 402174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov mActionBarAdapter.setListener(this); 403174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 4048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mProviderStatusLoader.setProviderStatusListener(this); 4058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov updateFragmentVisibility(); 406174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 407174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov 408174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov @Override 4096e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov protected void onStart() { 410e4e52199057ffb57bad42caa33e6b402fd80697aDmitri Plotnikov mContactListFilterController.onStart(); 4116e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov super.onStart(); 412caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov } 413caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov 414955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov private void configureFragments(boolean fromRequest) { 415009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov if (fromRequest) { 41691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov ContactListFilter filter = null; 41791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov int actionCode = mRequest.getActionCode(); 41891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov switch (actionCode) { 41991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_ALL_CONTACTS: 420be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 421be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS); 42291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 42391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_CONTACTS_WITH_PHONES: 424be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 42591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY); 42691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 42791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov 42891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov // TODO: handle FREQUENT and STREQUENT according to the spec 42991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_FREQUENT: 43091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_STREQUENT: 43191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov // For now they are treated the same as STARRED 43291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov case ContactsRequest.ACTION_STARRED: 433be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 434be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ContactListFilter.FILTER_TYPE_STARRED); 43591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov break; 43691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov } 43791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov 4380edd4071ddcb23bf2a7b95582df0657de9ff0c60Dmitri Plotnikov mSearchMode = mRequest.isSearchMode(); 43991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov if (filter != null) { 44091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov mContactListFilterController.setContactListFilter(filter, false); 441fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mSearchMode = false; 44248cc25047d2c61828e9137c50b3496feada7a175Dmitri Plotnikov } else if (mRequest.getActionCode() == ContactsRequest.ACTION_ALL_CONTACTS) { 443be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mContactListFilterController.setContactListFilter( 444be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ContactListFilter.createFilterWithType( 44548cc25047d2c61828e9137c50b3496feada7a175Dmitri Plotnikov ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS), false); 446009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov } 447d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 448d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov if (mRequest.getContactUri() != null) { 449fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mSearchMode = false; 450d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov } 451d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 452fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mListFragment.setContactsRequest(mRequest); 4530ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan configureContactListFragmentForRequest(); 454a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov 455b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } else { 456a3f0bce444d97664e282c10e56d09547f3a0e809Dmitri Plotnikov mSearchMode = mActionBarAdapter.isSearchMode(); 457fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 458fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 4590ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan configureContactListFragment(); 4600ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan configureGroupListFragment(); 461fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 4628268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 4636e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 4646e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov 4656e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 466d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov public void onContactListFiltersLoaded() { 4678daa1797310aca2333efcff0a0e0b0ed03187fffDmitri Plotnikov if (mListFragment == null || !mListFragment.isAdded()) { 468955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov return; 469955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov } 470955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov 471d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov mListFragment.setFilter(mContactListFilterController.getFilter()); 472bc5bc44eb0e6f86a093929885547fe37efe60a54Dmitri Plotnikov 4738268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 474174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov } 475174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov 476d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov @Override 477d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov public void onContactListFilterChanged() { 4788daa1797310aca2333efcff0a0e0b0ed03187fffDmitri Plotnikov if (mListFragment == null || !mListFragment.isAdded()) { 479d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov return; 480d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov } 481d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov 482d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov mListFragment.setFilter(mContactListFilterController.getFilter()); 483e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov 4848268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 4853ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov } 4863ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov 4876e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 4886e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov public void onContactListFilterCustomizationRequest() { 4896e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov startActivityForResult(new Intent(this, CustomContactListFilterActivity.class), 4906e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov SUBACTIVITY_CUSTOMIZE_FILTER); 4916e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 4926e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov 493a6c2198bc5ad37119500c4857125ad732548c402Dmitri Plotnikov private void setupContactDetailFragment(final Uri contactLookupUri) { 494be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mContactDetailFragment.loadUri(contactLookupUri); 4958268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 496be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } 497be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan 498be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan private void setupGroupDetailFragment(Uri groupUri) { 499be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mGroupDetailFragment.loadGroup(groupUri); 5008268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 501c0ca13a86793082c8969e44c70d4dc8fb83eb1f8Dmitri Plotnikov } 502c0ca13a86793082c8969e44c70d4dc8fb83eb1f8Dmitri Plotnikov 503fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov /** 504fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Handler for action bar actions. 505fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov */ 506fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov @Override 507b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan public void onAction(Action action) { 508b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan switch (action) { 509b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan case START_SEARCH_MODE: 510aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro // Checking if multi fragments are being displayed 511aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro if (mContentPaneDisplayed) { 512aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro mFavoritesView.setVisibility(View.GONE); 513aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro mBrowserView.setVisibility(View.VISIBLE); 514aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro mDetailsView.setVisibility(View.VISIBLE); 515aa2dfcdf9e7a4701f3954413f1cd75b8e1a26910Frank Sposaro } 5168268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan // Bring the contact list fragment (and detail fragment if applicable) to the front 517b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan FragmentTransaction ft = getFragmentManager().beginTransaction(); 518b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan ft.show(mContactsFragment); 5198268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan if (mContactDetailFragment != null) ft.show(mContactDetailFragment); 520b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan ft.commit(); 5218268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan clearSearch(); 522b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan break; 523b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan case STOP_SEARCH_MODE: 5248268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan // Refresh the fragments because search mode was using them to display search 5258268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan // results. 5268268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan clearSearch(); 5278268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan 5288268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan // If the last selected tab was not the "All contacts" tab, then hide these 5298268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan // fragments because we need to show favorites or groups. 5308268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan if (mSelectedTab != null && !mSelectedTab.equals(TabState.CONTACTS)) { 5318268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan FragmentTransaction transaction = getFragmentManager().beginTransaction(); 5328268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan transaction.hide(mContactsFragment); 5338268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan if (mContactDetailFragment != null) transaction.hide(mContactDetailFragment); 5348268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan transaction.commit(); 5358268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 536f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro if (mSelectedTab != null) setSelectedTab(mSelectedTab); 5378268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan break; 538b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan case CHANGE_SEARCH_QUERY: 5398268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan loadSearch(mActionBarAdapter.getQueryString()); 540b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan break; 541b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan default: 542b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action); 543b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 544fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov } 545fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov 5468268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan private void clearSearch() { 5478268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan loadSearch(""); 5488268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 5498268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan 5508268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan private void loadSearch(String query) { 5518268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan configureFragments(false /* from request */); 5528268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan mListFragment.setQueryString(query, true); 5538268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 5548268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan 5550ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan private void configureContactListFragmentForRequest() { 556fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov Uri contactUri = mRequest.getContactUri(); 557fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (contactUri != null) { 558fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mListFragment.setSelectedContactUri(contactUri); 559fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 560238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 5610edd4071ddcb23bf2a7b95582df0657de9ff0c60Dmitri Plotnikov mListFragment.setSearchMode(mRequest.isSearchMode()); 5625251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov mListFragment.setQueryString(mRequest.getQueryString(), false); 563238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 564fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (mRequest.isDirectorySearchEnabled()) { 565fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT); 566fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } else { 567fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE); 568fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 569238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 570fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (mContactListFilterController.isLoaded()) { 571fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mListFragment.setFilter(mContactListFilterController.getFilter()); 5721ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 57308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 57408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 5750ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan private void configureContactListFragment() { 576fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mListFragment.setSearchMode(mSearchMode); 577fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 578fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mListFragment.setVisibleScrollbarEnabled(!mSearchMode); 579fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mListFragment.setVerticalScrollbarPosition( 580be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mContentPaneDisplayed 5815245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov ? View.SCROLLBAR_POSITION_LEFT 5825245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov : View.SCROLLBAR_POSITION_RIGHT); 583be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mListFragment.setSelectionVisible(mContentPaneDisplayed); 584be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan mListFragment.setQuickContactEnabled(!mContentPaneDisplayed); 5851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 5861323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov 5870ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan private void configureGroupListFragment() { 5880ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan mGroupsFragment.setVerticalScrollbarPosition( 5890ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan mContentPaneDisplayed 5900ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan ? View.SCROLLBAR_POSITION_LEFT 5910ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan : View.SCROLLBAR_POSITION_RIGHT); 5920ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan mGroupsFragment.setSelectionVisible(mContentPaneDisplayed); 5930ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan } 5940ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan 5958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 5968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onProviderStatusChange() { 5978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov updateFragmentVisibility(); 5988b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 5998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 6008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private void updateFragmentVisibility() { 6018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov int providerStatus = mProviderStatusLoader.getProviderStatus(); 6028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (providerStatus == mProviderStatus) { 6038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov return; 6048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 6058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 6068b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mProviderStatus = providerStatus; 6078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 6088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view); 6098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov View mainView = findViewById(R.id.main_view); 6108b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 6118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (mProviderStatus == ProviderStatus.STATUS_NORMAL) { 612c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov contactsUnavailableView.setVisibility(View.GONE); 613b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (mainView != null) { 614b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mainView.setVisibility(View.VISIBLE); 615b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 6168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (mListFragment != null) { 6178b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mListFragment.setEnabled(true); 6188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 6198b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } else { 6208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (mListFragment != null) { 6218b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mListFragment.setEnabled(false); 6228b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 6238b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (mContactsUnavailableFragment == null) { 6248b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment = new ContactsUnavailableFragment(); 6258b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.setProviderStatusLoader(mProviderStatusLoader); 6268b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.setOnContactsUnavailableActionListener( 6278b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov new ContactsUnavailableFragmentListener()); 6283ed426c842a68895a759548fef87bac359f937bbDianne Hackborn getFragmentManager().beginTransaction() 6298b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment) 6308b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov .commit(); 6318b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } else { 6328b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov mContactsUnavailableFragment.update(); 6338b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 6348b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov contactsUnavailableView.setVisibility(View.VISIBLE); 635b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (mainView != null) { 636b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mainView.setVisibility(View.INVISIBLE); 637b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 6388b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 6398b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 6408268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenuIfNeeded(); 6418b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 6428b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 6431ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov private final class ContactBrowserActionListener implements OnContactBrowserActionListener { 644d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov 645e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 646d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov public void onSelectionChange() { 647be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan if (mContentPaneDisplayed) { 648d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov setupContactDetailFragment(mListFragment.getSelectedContactUri()); 649d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov } 650d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov } 651e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov 652d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov @Override 653d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov public void onViewContactAction(Uri contactLookupUri) { 654be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan if (mContentPaneDisplayed) { 655d364314c460152db7089b304beec81b3675893baDmitri Plotnikov setupContactDetailFragment(contactLookupUri); 656424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov } else { 657424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri)); 658424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov } 6591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 660e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov 661e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 6621ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onCreateNewContactAction() { 6631ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); 6641ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov Bundle extras = getIntent().getExtras(); 6651ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov if (extras != null) { 6661ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov intent.putExtras(extras); 667416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov } 6681ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov startActivity(intent); 6691ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 670416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov 671e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 6721ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onEditContactAction(Uri contactLookupUri) { 673e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri); 674e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann Bundle extras = getIntent().getExtras(); 675e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann if (extras != null) { 676e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann intent.putExtras(extras); 6771ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 678e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT); 6791ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 680413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov 681e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 6821ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onAddToFavoritesAction(Uri contactUri) { 6831ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov ContentValues values = new ContentValues(1); 6841ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov values.put(Contacts.STARRED, 1); 6851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov getContentResolver().update(contactUri, values, null, null); 6861ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 6878a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov 688e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 6891ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onRemoveFromFavoritesAction(Uri contactUri) { 6901ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov ContentValues values = new ContentValues(1); 6911ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov values.put(Contacts.STARRED, 0); 6921ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov getContentResolver().update(contactUri, values, null, null); 6931ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 694416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov 695e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 6961ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onCallContactAction(Uri contactUri) { 697b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa PhoneNumberInteraction.startInteractionForPhoneCall(PeopleActivity.this, contactUri); 6981ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 699416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov 700e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 7011ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onSmsContactAction(Uri contactUri) { 702b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa PhoneNumberInteraction.startInteractionForTextMessage(PeopleActivity.this, contactUri); 7031ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 704e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov 705e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 7061ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onDeleteContactAction(Uri contactUri) { 7079856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false); 7081ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 7098a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov 710e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann @Override 7111ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov public void onFinishAction() { 7121ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov onBackPressed(); 7131ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 7146e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov 7156e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov @Override 7166e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov public void onInvalidSelection() { 7178fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov ContactListFilter filter; 7188fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov ContactListFilter currentFilter = mListFragment.getFilter(); 7198fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov if (currentFilter != null 7208fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) { 721be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 722be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS); 7238fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov mListFragment.setFilter(filter); 7248fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov } else { 725be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan filter = ContactListFilter.createFilterWithType( 726be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ContactListFilter.FILTER_TYPE_SINGLE_CONTACT); 7278fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov mListFragment.setFilter(filter, false); 7288fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov } 729d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov mContactListFilterController.setContactListFilter(filter, true); 7306e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 7311ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov } 732416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov 733be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan private class ContactDetailFragmentListener implements ContactDetailFragment.Listener { 73469e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann @Override 735424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov public void onContactNotFound() { 736d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov // Nothing needs to be done here 737424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov } 738424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov 73969e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann @Override 740424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov public void onEditRequested(Uri contactLookupUri) { 7418c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov startActivityForResult( 7428c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov new Intent(Intent.ACTION_EDIT, contactLookupUri), SUBACTIVITY_EDIT_CONTACT); 743424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov } 744424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov 74569e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann @Override 746424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov public void onItemClicked(Intent intent) { 74760be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann try { 74860be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann startActivity(intent); 74960be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann } catch (ActivityNotFoundException e) { 75060be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann Log.e(TAG, "No activity found for intent: " + intent); 75160be1a1e8639a58d16f58686f8a89747d6079cc7Daniel Lehmann } 752424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov } 753424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov 75469e7fec6dd8a3d24054863c6c648512577fce35cDaniel Lehmann @Override 75566bca8f360c9e21b6a47006f21db7b46b6b46340Dmitri Plotnikov public void onDeleteRequested(Uri contactUri) { 7569856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false); 757424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov } 758caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov 759caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov @Override 760caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov public void onCreateRawContactRequested(ArrayList<ContentValues> values, Account account) { 7619856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan Toast.makeText(PeopleActivity.this, R.string.toast_making_personal_copy, 762caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov Toast.LENGTH_LONG).show(); 763caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov Intent serviceIntent = ContactSaveService.createNewRawContactIntent( 7649856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan PeopleActivity.this, values, account, 7659856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan PeopleActivity.class, Intent.ACTION_VIEW); 766caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov startService(serviceIntent); 767caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov } 768424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov } 769424440bd932482c0a08b782a570d600051c56eb4Dmitri Plotnikov 7708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov private class ContactsUnavailableFragmentListener 7718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov implements OnContactsUnavailableActionListener { 7728b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 7738b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 7748b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onCreateNewContactAction() { 7758b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI)); 7768b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 7778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 7788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 7798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onAddAccountAction() { 7808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT); 7811fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 7828b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov intent.putExtra(Settings.EXTRA_AUTHORITIES, 7838b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov new String[] { ContactsContract.AUTHORITY }); 7848b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov startActivity(intent); 7858b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 7868b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 7878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 7888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onImportContactsFromFileAction() { 7899856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan AccountSelectionUtil.doImportFromSdCard(PeopleActivity.this, null); 7908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 7918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 7928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 7938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public void onFreeInternalStorageAction() { 7948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov startActivity(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)); 7958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 7968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 7978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 798ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa private final class StrequentContactListFragmentListener 799ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa implements StrequentContactListFragment.Listener { 800ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa @Override 801ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa public void onContactSelected(Uri contactUri) { 802ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa if (mContentPaneDisplayed) { 803ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa setupContactDetailFragment(contactUri); 804ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa } else { 805ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa startActivity(new Intent(Intent.ACTION_VIEW, contactUri)); 806ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa } 807ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa } 808ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa } 809ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa 810be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan private final class GroupBrowserActionListener implements OnGroupBrowserActionListener { 811be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan 812be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan @Override 813be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan public void onViewGroupAction(Uri groupUri) { 814be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan if (mContentPaneDisplayed) { 815be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan setupGroupDetailFragment(groupUri); 816be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } else { 817be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan Intent intent = new Intent(PeopleActivity.this, GroupDetailActivity.class); 818be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan intent.setData(groupUri); 819be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan startActivity(intent); 820be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } 821be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } 822be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan } 823be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan 824c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan private class GroupDetailFragmentListener implements GroupDetailFragment.Listener { 825c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan @Override 826c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan public void onGroupSizeUpdated(String size) { 827c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan // Nothing needs to be done here because the size will be displayed in the detail 828c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan // fragment 829c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan } 830c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan 831c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan @Override 832c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan public void onGroupTitleUpdated(String title) { 833c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan // Nothing needs to be done here because the title will be displayed in the detail 834c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan // fragment 835c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan } 836c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan 837c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan @Override 838c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan public void onEditRequested(Uri groupUri) { 839c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan // TODO: Send off an intent with the groups URI, so we don't need to specify 840c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan // the editor activity class. Then it would be declared as: 841c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan // new Intent(Intent.ACTION_EDIT, groupUri), SUBACTIVITY_EDIT_GROUP); 842c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan final Intent intent = new Intent(PeopleActivity.this, GroupEditorActivity.class); 843c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan intent.setData(groupUri); 844c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan intent.setAction(Intent.ACTION_EDIT); 845c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan startActivityForResult(intent, SUBACTIVITY_EDIT_GROUP); 846c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan } 847c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan } 848c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan 849732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov public void startActivityAndForwardResult(final Intent intent) { 850732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); 851732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 852732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov // Forward extras to the new activity 853732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov Bundle extras = getIntent().getExtras(); 854732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov if (extras != null) { 855732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov intent.putExtras(extras); 856732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 857732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov startActivity(intent); 858732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov finish(); 859732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 860732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 8617aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 8628b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public boolean onCreatePanelMenu(int featureId, Menu menu) { 8638b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov // No menu if contacts are unavailable 8648b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (!areContactsAvailable()) { 8658b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov return false; 8668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8678b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8688b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov return super.onCreatePanelMenu(featureId, menu); 8698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8718b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 8728b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov public boolean onPreparePanel(int featureId, View view, Menu menu) { 8738b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov // No menu if contacts are unavailable 8748b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (!areContactsAvailable()) { 8758b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov return false; 8768b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov return super.onPreparePanel(featureId, view, menu); 8798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 8808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 8818b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov @Override 8827aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 8838b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov if (!areContactsAvailable()) { 8848b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov return false; 8858b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 886d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey super.onCreateOptionsMenu(menu); 887d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey 888d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov MenuInflater inflater = getMenuInflater(); 889b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan inflater.inflate(R.menu.actions, menu); 890b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan MenuItem searchMenuItem = menu.findItem(R.id.menu_search); 891b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (searchMenuItem != null && searchMenuItem.getActionView() instanceof SearchView) { 892b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan SearchView searchView = (SearchView) searchMenuItem.getActionView(); 893b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan searchView.setQueryHint(getString(R.string.hint_findContacts)); 894b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan searchView.setIconifiedByDefault(false); 895b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 896b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (mActionBarAdapter != null) { 897b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBarAdapter.setSearchView(searchView); 898b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 8997aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 900971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan 901971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan // On narrow screens we specify a NEW group button in the {@link ActionBar}, so that 902971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan // it can be in the overflow menu. On wide screens, we use a custom view because we need 903971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan // its location for anchoring the account-selector popup. 904971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan final MenuItem addGroup = menu.findItem(R.id.menu_custom_add_group); 905971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan if (addGroup != null) { 906971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan mAddGroupImageView = getLayoutInflater().inflate( 907971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan R.layout.add_group_menu_item, null, false); 908971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan View item = mAddGroupImageView.findViewById(R.id.menu_item); 909971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan item.setOnClickListener(new OnClickListener() { 910971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan @Override 911971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan public void onClick(View v) { 912971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan createNewGroupWithAccountDisambiguation(); 913971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan } 914971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan }); 915971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan addGroup.setActionView(mAddGroupImageView); 916971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan } 917b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan return true; 918d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 9197aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 9208268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan private void invalidateOptionsMenuIfNeeded() { 9210cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov if (isOptionsMenuChanged()) { 9228268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan invalidateOptionsMenu(); 9230cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9240cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9250cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 9260cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov public boolean isOptionsMenuChanged() { 9270cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov if (mOptionsMenuContactsAvailable != areContactsAvailable()) { 9280cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return true; 9290cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9300cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 9318268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan if (mListFragment != null && mListFragment.isOptionsMenuChanged()) { 9320cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return true; 9330cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9340cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 9358268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan if (mContactDetailFragment != null && mContactDetailFragment.isOptionsMenuChanged()) { 9360cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return true; 9370cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9380cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 9398268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan if (mGroupDetailFragment != null && mGroupDetailFragment.isOptionsMenuChanged()) { 9400cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return true; 9410cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9420cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 9430cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov return false; 9440cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov } 9450cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov 9460cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov @Override 947d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey public boolean onPrepareOptionsMenu(Menu menu) { 9480cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov mOptionsMenuContactsAvailable = areContactsAvailable(); 9490cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov if (!mOptionsMenuContactsAvailable) { 9508b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov return false; 9518b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 9528b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 9531ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan final MenuItem searchMenu = menu.findItem(R.id.menu_search); 954971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan final MenuItem addContactMenu = menu.findItem(R.id.menu_add_contact); 955971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan MenuItem addGroupMenu = menu.findItem(R.id.menu_add_group); 956971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan if (addGroupMenu == null) { 957971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan addGroupMenu = menu.findItem(R.id.menu_custom_add_group); 958971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan } 959e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov 9608268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan if (mActionBarAdapter.isSearchMode()) { 9618268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan addContactMenu.setVisible(false); 9628268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan addGroupMenu.setVisible(false); 9631ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan // If search is normally in the overflow menu, when we are in search 9641ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan // mode, hide this option. 9651ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan if (mActionBarAdapter.isSearchInOverflowMenu()) { 9661ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan searchMenu.setVisible(false); 9671ee9df6facd2340416d6a33aeb739707643d2fc3Katherine Kuan } 9688268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } else { 9698268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan switch (mSelectedTab) { 9708268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan case FAVORITES: 9718268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan // TODO: Fall through until we determine what the menu items should be for 9728268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan // this tab 9738268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan case CONTACTS: 9748268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan addContactMenu.setVisible(true); 9758268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan addGroupMenu.setVisible(false); 9768268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan break; 9778268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan case GROUPS: 9788268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan addContactMenu.setVisible(false); 9798268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan addGroupMenu.setVisible(true); 9808268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan break; 9818268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 982e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov } 983e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov 9848268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan MenuItem settings = menu.findItem(R.id.menu_settings); 9858268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan if (settings != null) { 9868268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan settings.setVisible(!ContactsPreferenceActivity.isEmpty(this)); 987e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov } 988e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov 989d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 9907aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 9917aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 9927aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 9937aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 9947aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project switch (item.getItemId()) { 995c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov case R.id.menu_settings: { 996c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov final Intent intent = new Intent(this, ContactsPreferenceActivity.class); 997c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann startActivity(intent); 9987aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return true; 999d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 1000b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan case R.id.menu_contacts_filter: { 1001b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan final Intent intent = new Intent(this, CustomContactListFilterActivity.class); 1002b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER); 1003b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan return true; 1004b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 1005d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey case R.id.menu_search: { 10068e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov onSearchRequested(); 10077aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return true; 1008d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 10098268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan case R.id.menu_add_contact: { 1010d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); 101122fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann startActivityForResult(intent, SUBACTIVITY_NEW_CONTACT); 1012d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 1013d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 10148268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan case R.id.menu_add_group: { 1015971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan createNewGroupWithAccountDisambiguation(); 10168268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan return true; 10178268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan } 101849d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey case R.id.menu_import_export: { 1019261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmann ImportExportDialogFragment.show(getFragmentManager()); 1020d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 1021d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 1022d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey case R.id.menu_accounts: { 1023d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS); 1024fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] { 1025d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey ContactsContract.AUTHORITY 1026d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey }); 10271fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 1028d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey startActivity(intent); 1029d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey return true; 1030d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey } 10317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 10327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return false; 10337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 10347aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 1035971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan private void createNewGroupWithAccountDisambiguation() { 1036971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan final ArrayList<Account> accounts = 1037971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan AccountTypeManager.getInstance(this).getAccounts(true); 1038971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan if (accounts.size() <= 1 || mAddGroupImageView == null) { 1039971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan // No account to choose or no control to anchor the popup-menu to 1040971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan // ==> just go straight to the editor which will disambig if necessary 1041971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan final Intent intent = new Intent(this, GroupEditorActivity.class); 1042971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan intent.setAction(Intent.ACTION_INSERT); 1043971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan startActivityForResult(intent, SUBACTIVITY_NEW_GROUP); 1044971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan return; 1045971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan } 1046971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan 1047971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan final ListPopupWindow popup = new ListPopupWindow(this, null); 1048971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan popup.setWidth(getResources().getDimensionPixelSize(R.dimen.account_selector_popup_width)); 1049971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan popup.setAnchorView(mAddGroupImageView); 1050971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan // Create a list adapter with all writeable accounts (assume that the writeable accounts all 1051971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan // allow group creation). 1052971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan final AccountsListAdapter adapter = new AccountsListAdapter(this, true); 1053971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan popup.setAdapter(adapter); 1054971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan popup.setOnItemClickListener(new OnItemClickListener() { 1055971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan @Override 1056971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 1057971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan popup.dismiss(); 1058971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan final Intent intent = new Intent(PeopleActivity.this, GroupEditorActivity.class); 1059971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan intent.setAction(Intent.ACTION_INSERT); 1060971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan intent.putExtra(Intents.Insert.ACCOUNT, adapter.getItem(position)); 1061971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan startActivityForResult(intent, SUBACTIVITY_NEW_GROUP); 1062971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan } 1063971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan }); 1064971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan popup.setModal(true); 1065971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan popup.show(); 1066971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan } 1067971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan 10688e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov @Override 10698e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData, 10708e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov boolean globalSearch) { 1071691e93397eae9a29d979a5e404f0b90130c2e9d4Dmitri Plotnikov if (mListFragment != null && mListFragment.isAdded() && !globalSearch) { 1072d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov mListFragment.startSearch(initialQuery); 1073691e93397eae9a29d979a5e404f0b90130c2e9d4Dmitri Plotnikov } else { 1074691e93397eae9a29d979a5e404f0b90130c2e9d4Dmitri Plotnikov super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch); 1075db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov } 1076db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov } 1077db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov 107849d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey @Override 1079d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov protected void onActivityResult(int requestCode, int resultCode, Intent data) { 1080d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov switch (requestCode) { 10816e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov case SUBACTIVITY_CUSTOMIZE_FILTER: { 10826e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov if (resultCode == Activity.RESULT_OK) { 10836e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov mContactListFilterController.selectCustomFilter(); 10846e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 10856e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov break; 10866e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov } 10878c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov 1088d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov case SUBACTIVITY_EDIT_CONTACT: 108922fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann case SUBACTIVITY_NEW_CONTACT: { 1090be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan if (resultCode == RESULT_OK && mContentPaneDisplayed) { 10916e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT); 1092a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov mListFragment.reloadDataAndSetSelectedUri(data.getData()); 109322fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann } 109422fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann break; 109522fb2053fe2bfe98376bf1a0e564f23ae9cecdedDaniel Lehmann } 1096d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 1097c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan case SUBACTIVITY_NEW_GROUP: 1098c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan case SUBACTIVITY_EDIT_GROUP: { 1099c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan if (resultCode == RESULT_OK && mContentPaneDisplayed) { 1100c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan mRequest.setActionCode(ContactsRequest.ACTION_GROUP); 1101c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan mGroupsFragment.setSelectedUri(data.getData()); 1102c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan } 1103c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan break; 1104c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan } 1105c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan 11067aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann // TODO: Using the new startActivityWithResultFromFragment API this should not be needed 11077aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann // anymore 1108e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER: 1109d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov if (resultCode == RESULT_OK) { 1110e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov mListFragment.onPickerResult(data); 1111d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 1112d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 1113d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code 1114d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) { 11151ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// // Finish the activity if the sub activity was canceled as back key is used 11161ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// // to confirm user selection in MODE_PICK_MULTIPLE_PHONES. 11171ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// finish(); 11181ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 11191ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// break; 1120d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 1121d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 11227aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 11237aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 11247aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onContextItemSelected(MenuItem item) { 1125502741df555dc7cf59a10885272d432940ae35adDmitri Plotnikov ContextMenuAdapter menuAdapter = mListFragment.getContextMenuAdapter(); 1126502741df555dc7cf59a10885272d432940ae35adDmitri Plotnikov if (menuAdapter != null) { 1127502741df555dc7cf59a10885272d432940ae35adDmitri Plotnikov return menuAdapter.onContextItemSelected(item); 11287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 11297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 11307aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return super.onContextItemSelected(item); 11317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 11327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 11337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project @Override 11347aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 11351ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // TODO move to the fragment 11367aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project switch (keyCode) { 11371ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// case KeyEvent.KEYCODE_CALL: { 11381ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// if (callSelection()) { 11391ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// return true; 11401ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 11411ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// break; 11421ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 1143db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov 11447aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project case KeyEvent.KEYCODE_DEL: { 11456c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov if (deleteSelection()) { 11467aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return true; 11477aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 11487aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project break; 11497aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 11507bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann default: { 11517bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann // Bring up the search UI if the user starts typing 11527bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann final int unicodeChar = event.getUnicodeChar(); 11534f3aa85131e16594fef22ca60439f4320016767fDaniel Lehmann if (unicodeChar != 0 && !Character.isWhitespace(unicodeChar)) { 11547bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann String query = new String(new int[]{ unicodeChar }, 0, 1); 1155b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (!mActionBarAdapter.isSearchMode()) { 1156b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBarAdapter.setQueryString(query); 1157b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBarAdapter.setSearchMode(true); 1158b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan return true; 11597bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann } else if (!mRequest.isSearchMode()) { 11607bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann if (!mSearchInitiated) { 11617bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann mSearchInitiated = true; 11627bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann startSearch(query, false, null, false); 11637bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann return true; 11647bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann } 11657bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann } 11667bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann } 11677bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann } 11687aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 11697aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 11707aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project return super.onKeyDown(keyCode, event); 11717aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project } 1172ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov 1173ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov @Override 1174ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov public void onBackPressed() { 1175ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov if (mSearchMode && mActionBarAdapter != null) { 1176ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov mActionBarAdapter.setSearchMode(false); 1177ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } else { 1178ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov super.onBackPressed(); 1179ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } 1180ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } 11817aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project 11826c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov private boolean deleteSelection() { 11831ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov // TODO move to the fragment 11841ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// if (mActionCode == ContactsRequest.ACTION_DEFAULT) { 11851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// final int position = mListView.getSelectedItemPosition(); 11861ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// if (position != ListView.INVALID_POSITION) { 11871ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// Uri contactUri = getContactUri(position); 11881ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// if (contactUri != null) { 11891ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// doContactDelete(contactUri); 11901ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// return true; 11911ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 11921ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 11931ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov// } 11946c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov return false; 11956c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov } 11966c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov 119708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov @Override 119808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov protected void onSaveInstanceState(Bundle outState) { 119908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov super.onSaveInstanceState(outState); 120015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov outState.putBoolean(KEY_SEARCH_MODE, mSearchMode); 1201fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov if (mActionBarAdapter != null) { 1202fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov mActionBarAdapter.onSaveInstanceState(outState); 120308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 120408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 120508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 1206fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov @Override 1207fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov protected void onRestoreInstanceState(Bundle inState) { 1208fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov super.onRestoreInstanceState(inState); 1209fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mSearchMode = inState.getBoolean(KEY_SEARCH_MODE); 1210fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov if (mActionBarAdapter != null) { 1211fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mActionBarAdapter.onRestoreInstanceState(inState); 1212fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 1213fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 1214fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 12153391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann @Override 12163391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann public DialogManager getDialogManager() { 12173391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann return mDialogManager; 12183391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann } 1219ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov 1220ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov // Visible for testing 1221ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov public ContactBrowseListFragment getListFragment() { 1222ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov return mListFragment; 1223ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov } 1224ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov 1225ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov // Visible for testing 1226ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov public ContactDetailFragment getDetailFragment() { 1227be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan return mContactDetailFragment; 1228ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov } 12297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project} 1230