DialtactsActivity.java revision 350e8d53a135e0bb62308a93dd09777364c08a58
1032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov/* 2032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * Copyright (C) 2008 The Android Open Source Project 3032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * 4032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * you may not use this file except in compliance with the License. 6032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * You may obtain a copy of the License at 7032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * 8032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * 10032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * See the License for the specific language governing permissions and 14032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * limitations under the License. 15032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov */ 16032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 1709fba0a6d82a7f88ce3c8cbb74eddd4bb96eb7e4Daniel Lehmannpackage com.android.contacts.activities; 18032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 1909fba0a6d82a7f88ce3c8cbb74eddd4bb96eb7e4Daniel Lehmannimport com.android.contacts.R; 20c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport com.android.contacts.calllog.CallLogFragment; 21c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport com.android.contacts.dialpad.DialpadFragment; 22261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmannimport com.android.contacts.interactions.ImportExportDialogFragment; 23aae838c5a7ef38f4f2778cff6dfaa1f650a44522Daniel Lehmannimport com.android.contacts.interactions.PhoneNumberInteraction; 24c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport com.android.contacts.list.ContactListFilter; 25c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport com.android.contacts.list.ContactsIntentResolver; 26c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport com.android.contacts.list.ContactsRequest; 27c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport com.android.contacts.list.DefaultContactBrowseListFragment; 28c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport com.android.contacts.list.DirectoryListLoader; 29c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport com.android.contacts.list.OnContactBrowserActionListener; 30b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport com.android.contacts.list.OnPhoneNumberPickerActionListener; 31b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport com.android.contacts.list.PhoneNumberPickerFragment; 32aae838c5a7ef38f4f2778cff6dfaa1f650a44522Daniel Lehmannimport com.android.contacts.list.StrequentContactListFragment; 33c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport com.android.contacts.preference.ContactsPreferenceActivity; 34b25c13ec8b060cc74f91285929c4535adf4260f0Jeff Hamiltonimport com.android.internal.telephony.ITelephony; 35b25c13ec8b060cc74f91285929c4535adf4260f0Jeff Hamilton 36c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.ActionBar; 37b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.app.ActionBar.LayoutParams; 38c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.ActionBar.Tab; 39c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.ActionBar.TabListener; 40032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.app.Activity; 41c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.Fragment; 42c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.FragmentManager; 43c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.FragmentTransaction; 44032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.content.Intent; 45903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamiltonimport android.content.SharedPreferences; 46032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.net.Uri; 47032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.os.Bundle; 48032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.os.RemoteException; 49032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.os.ServiceManager; 50032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.provider.CallLog.Calls; 51c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.provider.ContactsContract; 52c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.provider.ContactsContract.Contacts; 53b25c13ec8b060cc74f91285929c4535adf4260f0Jeff Hamiltonimport android.provider.ContactsContract.Intents.UI; 54261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmannimport android.provider.Settings; 55b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.text.TextUtils; 56032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.util.Log; 57c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.view.Menu; 58c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.view.MenuInflater; 59c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.view.MenuItem; 60b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.view.View; 61b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.widget.SearchView; 62b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.widget.SearchView.OnCloseListener; 63b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.widget.SearchView.OnQueryTextListener; 64032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 65032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov/** 6608832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * The dialer activity that has one tab with the virtual 12key 6708832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * dialer, a tab with recent calls in it, a tab with the contacts and 6808832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * a tab with the favorite. This is the container and the tabs are 6908832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * embedded using intents. 7008832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * The dialer tab's title is 'phone', a more common name (see strings.xml). 71032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov */ 72c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannpublic class DialtactsActivity extends Activity { 7309fba0a6d82a7f88ce3c8cbb74eddd4bb96eb7e4Daniel Lehmann private static final String TAG = "DialtactsActivity"; 747675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 75032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private static final int TAB_INDEX_DIALER = 0; 76032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private static final int TAB_INDEX_CALL_LOG = 1; 77903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton private static final int TAB_INDEX_CONTACTS = 2; 78903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton private static final int TAB_INDEX_FAVORITES = 3; 7908832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 80285fdc6bed0f2bcfb95b4d5f8cf9066a4f8ab888David Brown public static final String EXTRA_IGNORE_STATE = "ignore-state"; 81032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 82903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton /** Name of the dialtacts shared preferences */ 83903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton static final String PREFS_DIALTACTS = "dialtacts"; 84903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton /** If true, when handling the contacts intent the favorites tab will be shown instead */ 85903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton static final String PREF_FAVORITES_AS_CONTACTS = "favorites_as_contacts"; 86903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton static final boolean PREF_FAVORITES_AS_CONTACTS_DEFAULT = false; 87903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton 887675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann /** Last manually selected tab index */ 897675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann private static final String PREF_LAST_MANUALLY_SELECTED_TAB = "last_manually_selected_tab"; 907675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann private static final int PREF_LAST_MANUALLY_SELECTED_TAB_DEFAULT = TAB_INDEX_DIALER; 917675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 9208832404d96360ac386a98fd977e45fde936ec30Nicolas Catania private String mFilterText; 93032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private Uri mDialUri; 94c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private DialpadFragment mDialpadFragment; 95c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private CallLogFragment mCallLogFragment; 96c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private DefaultContactBrowseListFragment mContactsFragment; 97aae838c5a7ef38f4f2778cff6dfaa1f650a44522Daniel Lehmann private StrequentContactListFragment mStrequentFragment; 98032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 997675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann /** 1007675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann * The index of the tab that has last been manually selected (the user clicked on a tab). 1017675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann * This value does not keep track of programmatically set Tabs (e.g. Call Log after a Call) 1027675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann */ 1037675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann private int mLastManuallySelectedTab; 1047675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 105b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 106b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Fragment for searching phone numbers. Unlike the other Fragments, this doesn't correspond 107b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * to tab but is shown by a search action. 108b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 109b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private PhoneNumberPickerFragment mPhoneNumberPickerFragment; 110b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 111b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private SearchView mSearchView; 112b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 113b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 114b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * True when this Activity is in its search UI (with a {@link SearchView} and 115b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * {@link PhoneNumberPickerFragment}). 116b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 117b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private boolean mInSearchUi; 118b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 119b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 120b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Listener used when one of phone numbers in search UI is selected. This will initiate a 121b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * phone call using the phone number. 122b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 123b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private final OnPhoneNumberPickerActionListener mPhoneNumberPickerActionListener = 124b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa new OnPhoneNumberPickerActionListener() { 125b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 126b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public void onPickPhoneNumberAction(Uri dataUri) { 127b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa PhoneNumberInteraction.startInteractionForPhoneCall( 128b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa DialtactsActivity.this, dataUri); 129b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 130b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 131b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 132b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public void onShortcutIntentCreated(Intent intent) { 133b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa Log.w(TAG, "Unsupported intent has come (" + intent + "). Ignoring."); 134b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 135b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa }; 136b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 137b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 138b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Listener used to send search queries to the phone search fragment. 139b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 140b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private final OnQueryTextListener mPhoneSearchQueryTextListener = 141b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa new OnQueryTextListener() { 142b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 143b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public boolean onQueryTextSubmit(String query) { 144b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // Ignore. 145b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa return true; 146b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 147b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 148b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 149b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public boolean onQueryTextChange(String newText) { 150b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // Show search result with non-empty text. Show a bare list otherwise. 151b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mPhoneNumberPickerFragment.setQueryString(newText, true); 152b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mPhoneNumberPickerFragment.setSearchMode(!TextUtils.isEmpty(newText)); 153b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa return true; 154b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 155b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa }; 156b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 157b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 158b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Listener used to handle the "close" button on the right side of {@link SearchView}. 159b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * If some text is in the search view, this will clean it up. Otherwise this will exit 160b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * the search UI and let users go back to usual Phone UI. 161b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * 162b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * This does _not_ handle back button. 163b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * 164b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * TODO: need "up" button instead of close button 165b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 166b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private final OnCloseListener mPhoneSearchCloseListener = 167b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa new OnCloseListener() { 168b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 169b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public boolean onClose() { 170b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa if (TextUtils.isEmpty(mSearchView.getQuery())) { 171b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa exitSearchUi(); 172b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } else { 173b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.setQuery(null, true); 174b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 175b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa return true; 176b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 177b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa }; 178b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 179032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov @Override 180032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov protected void onCreate(Bundle icicle) { 181032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov super.onCreate(icicle); 182032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 183032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov final Intent intent = getIntent(); 184032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov fixIntent(intent); 18508832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 18609fba0a6d82a7f88ce3c8cbb74eddd4bb96eb7e4Daniel Lehmann setContentView(R.layout.dialtacts_activity); 187032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 188c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final FragmentManager fragmentManager = getFragmentManager(); 189c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mDialpadFragment = (DialpadFragment) fragmentManager 190c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann .findFragmentById(R.id.dialpad_fragment); 191c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mCallLogFragment = (CallLogFragment) fragmentManager 192c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann .findFragmentById(R.id.call_log_fragment); 193c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mContactsFragment = (DefaultContactBrowseListFragment) fragmentManager 194c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann .findFragmentById(R.id.contacts_fragment); 195aae838c5a7ef38f4f2778cff6dfaa1f650a44522Daniel Lehmann mStrequentFragment = (StrequentContactListFragment) fragmentManager 196c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann .findFragmentById(R.id.favorites_fragment); 197b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mPhoneNumberPickerFragment = (PhoneNumberPickerFragment) fragmentManager 198b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa .findFragmentById(R.id.phone_number_picker_fragment); 199b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mPhoneNumberPickerFragment.setOnPhoneNumberPickerActionListener( 200b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mPhoneNumberPickerActionListener); 201c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 202c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // Hide all tabs (the current tab will later be reshown once a tab is selected) 203c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final FragmentTransaction transaction = fragmentManager.beginTransaction(); 204c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann transaction.hide(mDialpadFragment); 205c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann transaction.hide(mCallLogFragment); 206c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann transaction.hide(mContactsFragment); 207aae838c5a7ef38f4f2778cff6dfaa1f650a44522Daniel Lehmann transaction.hide(mStrequentFragment); 208b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa transaction.hide(mPhoneNumberPickerFragment); 209c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann transaction.commit(); 210c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 211c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // Setup the ActionBar tabs (the order matches the tab-index contants TAB_INDEX_*) 212c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann setupDialer(); 213c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann setupCallLog(); 214c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann setupContacts(); 215c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann setupFavorites(); 216c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 217c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().setDisplayShowTitleEnabled(false); 218c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().setDisplayShowHomeEnabled(false); 219032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 2207675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann // Load the last manually loaded tab 2217675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann final SharedPreferences prefs = getSharedPreferences(PREFS_DIALTACTS, MODE_PRIVATE); 2227675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann mLastManuallySelectedTab = prefs.getInt(PREF_LAST_MANUALLY_SELECTED_TAB, 2237675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann PREF_LAST_MANUALLY_SELECTED_TAB_DEFAULT); 2247675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 225032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov setCurrentTab(intent); 226903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton 2277fa3cd652fdaa5284fdf5fa9c306f2ca89227c1aJeff Hamilton if (UI.FILTER_CONTACTS_ACTION.equals(intent.getAction()) 228903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton && icicle == null) { 229903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton setupFilterText(intent); 230903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 231032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 232032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 233903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton @Override 234903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton protected void onPause() { 235903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton super.onPause(); 23608832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 2377675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann final SharedPreferences.Editor editor = 2387675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann getSharedPreferences(PREFS_DIALTACTS, MODE_PRIVATE).edit(); 239b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // selectedTab becomes null in search UI. 240b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final Tab selectedTab = getActionBar().getSelectedTab(); 241b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa if (selectedTab != null) { 242b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final int currentTabIndex = selectedTab.getPosition(); 243b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa if (currentTabIndex == TAB_INDEX_CONTACTS || currentTabIndex == TAB_INDEX_FAVORITES) { 244b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa editor.putBoolean( 245b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa PREF_FAVORITES_AS_CONTACTS, currentTabIndex == TAB_INDEX_FAVORITES); 246b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 247903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 2487675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann editor.putInt(PREF_LAST_MANUALLY_SELECTED_TAB, mLastManuallySelectedTab); 2497675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 250909271c9b60f755a5298c611400502e7418d161bBrad Fitzpatrick editor.apply(); 251903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 25208832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 253032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private void fixIntent(Intent intent) { 254032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // This should be cleaned up: the call key used to send an Intent 255032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // that just said to go to the recent calls list. It now sends this 256032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // abstract action, but this class hasn't been rewritten to deal with it. 257032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (Intent.ACTION_CALL_BUTTON.equals(intent.getAction())) { 258032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov intent.setDataAndType(Calls.CONTENT_URI, Calls.CONTENT_TYPE); 259032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov intent.putExtra("call_key", true); 260032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov setIntent(intent); 261032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 262032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 26308832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 264c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private void setupDialer() { 265c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Tab tab = getActionBar().newTab(); 26600848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown // TODO: Temporarily disable tab text labels (in all 4 tabs in this 26700848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown // activity) so that the current tabs will all fit onscreen in 26800848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown // portrait (bug 4520620). (Also note we do setText("") rather 26900848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown // leaving the text null, to work around bug 4521549.) 27000848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown tab.setText(""); // R.string.dialerIconLabel 271c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann tab.setTabListener(new TabChangeListener(mDialpadFragment)); 272c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann tab.setIcon(R.drawable.ic_tab_dialer); 273c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().addTab(tab); 274c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mDialpadFragment.resolveIntent(); 275032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 276032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 277c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private void setupCallLog() { 278c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Tab tab = getActionBar().newTab(); 27900848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown tab.setText(""); // R.string.recentCallsIconLabel 280c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann tab.setIcon(R.drawable.ic_tab_recent); 281c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann tab.setTabListener(new TabChangeListener(mCallLogFragment)); 282c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().addTab(tab); 283032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 284032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 285c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private void setupContacts() { 286c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Tab tab = getActionBar().newTab(); 28700848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown tab.setText(""); // R.string.contactsIconLabel 288c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann tab.setIcon(R.drawable.ic_tab_contacts); 289c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann tab.setTabListener(new TabChangeListener(mContactsFragment)); 290c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().addTab(tab); 291c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 292c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // TODO: We should not artificially create Intents and put them into the Fragment. 293c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // It would be nicer to directly pass in the UI constant 2947134a00efd66e95ea0d1484e04869c5cbd45f25dDaniel Lehmann Intent intent = new Intent(UI.LIST_ALL_CONTACTS_ACTION); 2959856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan intent.setClass(this, PeopleActivity.class); 296903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton 297c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann ContactsIntentResolver resolver = new ContactsIntentResolver(this); 298c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann ContactsRequest request = resolver.resolveIntent(intent); 299be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan final ContactListFilter filter = ContactListFilter.createFilterWithType( 300c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS); 301c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mContactsFragment.setFilter(filter, false); 302c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mContactsFragment.setSearchMode(request.isSearchMode()); 303c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mContactsFragment.setQueryString(request.getQueryString(), false); 304c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mContactsFragment.setContactsRequest(request); 305c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mContactsFragment.setDirectorySearchMode(request.isDirectorySearchEnabled() 306c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann ? DirectoryListLoader.SEARCH_MODE_DEFAULT 307c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann : DirectoryListLoader.SEARCH_MODE_NONE); 308c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mContactsFragment.setOnContactListActionListener(mListFragmentListener); 309903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 310903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton 311c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private void setupFavorites() { 312c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Tab tab = getActionBar().newTab(); 31300848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown tab.setText(""); // R.string.contactsFavoritesLabel 314c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann tab.setIcon(R.drawable.ic_tab_starred); 315aae838c5a7ef38f4f2778cff6dfaa1f650a44522Daniel Lehmann tab.setTabListener(new TabChangeListener(mStrequentFragment)); 316c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().addTab(tab); 31732f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro mStrequentFragment.setListener(mStrequentListener); 3189add0e5ef2a267acbe104e04f4cf6ab24cb8ba3eKatherine Kuan } 3199add0e5ef2a267acbe104e04f4cf6ab24cb8ba3eKatherine Kuan 320032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov /** 321032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * Returns true if the intent is due to hitting the green send key while in a call. 32208832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * 323032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * @param intent the intent that launched this activity 324032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * @param recentCallsRequest true if the intent is requesting to view recent calls 32508832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * @return true if the intent is due to hitting the green send key while in a call 326032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov */ 327032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private boolean isSendKeyWhileInCall(final Intent intent, final boolean recentCallsRequest) { 328032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // If there is a call in progress go to the call screen 329032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (recentCallsRequest) { 330032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov final boolean callKey = intent.getBooleanExtra("call_key", false); 331032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 332032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov try { 333032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); 334032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (callKey && phone != null && phone.showCallScreen()) { 335032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return true; 336032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 337032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } catch (RemoteException e) { 338032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov Log.e(TAG, "Failed to handle send while in call", e); 339032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 340032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 341032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 342032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return false; 343032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 344032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 345032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov /** 346032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * Sets the current tab based on the intent's request type 34708832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * 3487675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann * @param intent Intent that contains information about which tab should be selected 349032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov */ 350032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private void setCurrentTab(Intent intent) { 351032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // If we got here by hitting send and we're in call forward along to the in-call activity 352032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov final boolean recentCallsRequest = Calls.CONTENT_TYPE.equals(intent.getType()); 353032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (isSendKeyWhileInCall(intent, recentCallsRequest)) { 354032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov finish(); 355032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return; 356032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 35708832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 358032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // Tell the children activities that they should ignore any possible saved 359032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // state and instead reload their state from the parent's intent 360032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov intent.putExtra(EXTRA_IGNORE_STATE, true); 361032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 3627675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann // Remember the old manually selected tab index so that it can be restored if it is 3637675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann // overwritten by one of the programmatic tab selections 3647675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann final int savedTabIndex = mLastManuallySelectedTab; 3657675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 36668f33150cf394279fc97f06ba5601482741147b7Daisuke Miyakawa if (recentCallsRequest) { 36768f33150cf394279fc97f06ba5601482741147b7Daisuke Miyakawa getActionBar().selectTab(getActionBar().getTabAt(TAB_INDEX_CALL_LOG)); 368903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } else { 3699856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan getActionBar().selectTab(getActionBar().getTabAt(mLastManuallySelectedTab)); 370032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 371032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 3727675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann // Restore to the previous manual selection 3737675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann mLastManuallySelectedTab = savedTabIndex; 3747675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 375032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // Tell the children activities that they should honor their saved states 376032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // instead of the state from the parent's intent 377032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov intent.putExtra(EXTRA_IGNORE_STATE, false); 378032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 379032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 380032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov @Override 381032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov public void onNewIntent(Intent newIntent) { 382032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov setIntent(newIntent); 383032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov fixIntent(newIntent); 384032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov setCurrentTab(newIntent); 385903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton final String action = newIntent.getAction(); 3867fa3cd652fdaa5284fdf5fa9c306f2ca89227c1aJeff Hamilton if (UI.FILTER_CONTACTS_ACTION.equals(action)) { 387903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton setupFilterText(newIntent); 388903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } else if (isDialIntent(newIntent)) { 389032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov setupDialUri(newIntent); 390032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 3915d96befd4cc61df08f89b83aa01b669765470315Daisuke Miyakawa // Fill in a phone number again. 3925d96befd4cc61df08f89b83aa01b669765470315Daisuke Miyakawa mDialpadFragment.resolveIntent(); 393032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 394032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 395032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov /** Returns true if the given intent contains a phone number to populate the dialer with */ 396032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private boolean isDialIntent(Intent intent) { 397032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov final String action = intent.getAction(); 398032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (Intent.ACTION_DIAL.equals(action)) { 399032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return true; 400032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 401032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (Intent.ACTION_VIEW.equals(action)) { 402032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov final Uri data = intent.getData(); 403032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (data != null && "tel".equals(data.getScheme())) { 404032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return true; 405032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 406032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 407032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return false; 408032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 40908832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 410903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton /** 411903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * Retrieves the filter text stored in {@link #setupFilterText(Intent)}. 412903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * This text originally came from a FILTER_CONTACTS_ACTION intent received 413903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * by this activity. The stored text will then be cleared after after this 414903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * method returns. 41508832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * 416903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * @return The stored filter text 417903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton */ 418903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton public String getAndClearFilterText() { 419903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton String filterText = mFilterText; 420903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton mFilterText = null; 421903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton return filterText; 422903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 423903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton 424903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton /** 425903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * Stores the filter text associated with a FILTER_CONTACTS_ACTION intent. 426903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * This is so child activities can check if they are supposed to display a filter. 42708832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * 428903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * @param intent The intent received in {@link #onNewIntent(Intent)} 429903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton */ 430903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton private void setupFilterText(Intent intent) { 431903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton // If the intent was relaunched from history, don't apply the filter text. 432903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { 433903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton return; 434903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 435b25c13ec8b060cc74f91285929c4535adf4260f0Jeff Hamilton String filter = intent.getStringExtra(UI.FILTER_TEXT_EXTRA_KEY); 436903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton if (filter != null && filter.length() > 0) { 437903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton mFilterText = filter; 438903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 439903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 440032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 441032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov /** 442032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * Retrieves the uri stored in {@link #setupDialUri(Intent)}. This uri 443032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * originally came from a dial intent received by this activity. The stored 444032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * uri will then be cleared after after this method returns. 44508832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * 446032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * @return The stored uri 447032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov */ 448032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov public Uri getAndClearDialUri() { 449032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov Uri dialUri = mDialUri; 450032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov mDialUri = null; 451032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return dialUri; 452032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 453032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 454032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov /** 455032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * Stores the uri associated with a dial intent. This is so child activities can 456032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * check if they are supposed to display new dial info. 45708832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * 458032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * @param intent The intent received in {@link #onNewIntent(Intent)} 459032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov */ 460032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private void setupDialUri(Intent intent) { 461032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // If the intent was relaunched from history, don't reapply the intent. 462032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { 463032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return; 464032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 465032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov mDialUri = intent.getData(); 466032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 467032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 468032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov @Override 469242599a0f1ab23e2a46eff963484a70ec7981befDianne Hackborn public void onBackPressed() { 470b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa if (mInSearchUi) { 471b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // We should let the user go back to usual screens with tabs. 472b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa exitSearchUi(); 473b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } else if (isTaskRoot()) { 474032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // Instead of stopping, simply push this to the back of the stack. 475032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // This is only done when running at the top of the stack; 476032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // otherwise, we have been launched by someone else so need to 477032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // allow the user to go back to the caller. 478032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov moveTaskToBack(false); 479242599a0f1ab23e2a46eff963484a70ec7981befDianne Hackborn } else { 480242599a0f1ab23e2a46eff963484a70ec7981befDianne Hackborn super.onBackPressed(); 481032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 482032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 483032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 484c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 485c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann protected void onPostCreate(Bundle savedInstanceState) { 486c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann super.onPostCreate(savedInstanceState); 487c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 488c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // Pass this lifecycle event down to the fragment 489c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mDialpadFragment.onPostCreate(); 490c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 491c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 492c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann /** 493c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann * Tab change listener that is instantiated once for each tab. Handles showing/hiding tabs 494c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann * and remembers manual tab selections 495c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann */ 496c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private class TabChangeListener implements TabListener { 497c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private final Fragment mFragment; 498c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 499c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public TabChangeListener(Fragment fragment) { 500c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mFragment = fragment; 501c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 502c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 503c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 504c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onTabUnselected(Tab tab, FragmentTransaction ft) { 505c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann ft.hide(mFragment); 506c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 507c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 508c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 509c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onTabSelected(Tab tab, FragmentTransaction ft) { 510c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann ft.show(mFragment); 511b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa ft.hide(mPhoneNumberPickerFragment); 512c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 513c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // Remember this tab index. This function is also called, if the tab is set 514c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // automatically in which case the setter (setCurrentTab) has to set this to its old 515c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // value afterwards 516c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann mLastManuallySelectedTab = tab.getPosition(); 517c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 518c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 519c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 520c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onTabReselected(Tab tab, FragmentTransaction ft) { 521c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 522c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 523c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 524c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private OnContactBrowserActionListener mListFragmentListener = 525c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann new OnContactBrowserActionListener() { 526c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 527c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onViewContactAction(Uri contactLookupUri) { 528c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri)); 529c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 530c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 531c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 532c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onSmsContactAction(Uri contactUri) { 533c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 534c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 535c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 536c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onSelectionChange() { 537c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 538c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 539c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 540c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onRemoveFromFavoritesAction(Uri contactUri) { 541c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 542c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 543c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 544c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onInvalidSelection() { 545c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 546c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 547c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 548c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onFinishAction() { 549c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 550c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 551c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 552c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onEditContactAction(Uri contactLookupUri) { 553c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 554c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 555c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 556c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onDeleteContactAction(Uri contactUri) { 557c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 558c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 559c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 560c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onCreateNewContactAction() { 561c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 562c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 563c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 564c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onCallContactAction(Uri contactUri) { 565b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa PhoneNumberInteraction.startInteractionForPhoneCall( 566b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa DialtactsActivity.this, contactUri); 567c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 568c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 569c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 570c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public void onAddToFavoritesAction(Uri contactUri) { 571c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 572c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann }; 573c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 57432f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro private StrequentContactListFragment.Listener mStrequentListener = 57532f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro new StrequentContactListFragment.Listener() { 57632f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro @Override 57732f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro public void onContactSelected(Uri contactUri) { 578b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa PhoneNumberInteraction.startInteractionForPhoneCall( 579b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa DialtactsActivity.this, contactUri); 58032f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro } 58132f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro }; 58232f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro 583c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 584c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public boolean onCreateOptionsMenu(Menu menu) { 585c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // For now, create the menu in here. It would be nice to do this in the Fragment, 586c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // but that Fragment is re-used in other views. 587c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final ActionBar actionBar = getActionBar(); 588c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann if (actionBar == null) return false; 589c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Tab tab = actionBar.getSelectedTab(); 590c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann if (tab == null) return false; 591c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final int tabIndex = tab.getPosition(); 592c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann if (tabIndex != TAB_INDEX_CONTACTS && tabIndex != TAB_INDEX_FAVORITES) return false; 593c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 594c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann MenuInflater inflater = getMenuInflater(); 595c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann inflater.inflate(R.menu.list, menu); 596c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann return true; 597c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 598c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 599c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 600c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public boolean onOptionsItemSelected(MenuItem item) { 6015e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro // This is currently a copy of the equivalent code of PeopleActivity (with the 602c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // exception of menu_add, because we do not select items in the list). 603c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // Should be consolidated 604c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann switch (item.getItemId()) { 605c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann case R.id.menu_settings: { 606c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Intent intent = new Intent(this, ContactsPreferenceActivity.class); 607c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann startActivity(intent); 608c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann return true; 609c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 610c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann case R.id.menu_search: { 611c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann onSearchRequested(); 612c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann return true; 613c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 614c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann case R.id.menu_add: { 615c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); 616c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann startActivity(intent); 617c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann return true; 618c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 619c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann case R.id.menu_import_export: { 620261cd5650d07fbc41ea8f19d4e422094612d1454Daniel Lehmann ImportExportDialogFragment.show(getFragmentManager()); 621c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann return true; 622032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 623c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann case R.id.menu_accounts: { 624c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS); 625c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] { 626c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann ContactsContract.AUTHORITY 627c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann }); 628c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 629c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann startActivity(intent); 630c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann return true; 631c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 632c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann default: 633c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann return super.onOptionsItemSelected(item); 634c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 635c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 636b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 637b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 638b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public void startSearch(String initialQuery, boolean selectInitialQuery, 639b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa Bundle appSearchData, boolean globalSearch) { 640b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa if (mPhoneNumberPickerFragment != null && mPhoneNumberPickerFragment.isAdded() 641b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa && !globalSearch) { 642b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa enterSearchUi(); 643b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } else { 644b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch); 645b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 646b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 647b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 648b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 649b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Hides every tab and shows search UI for phone lookup. 650b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 651b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private void enterSearchUi() { 652b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final ActionBar actionBar = getActionBar(); 653b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 654b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final Tab tab = actionBar.getSelectedTab(); 655b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa if (tab != null) { 656b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mLastManuallySelectedTab = tab.getPosition(); 657b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 658b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 659b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // Instantiate or reset SearchView in ActionBar. 660b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa if (mSearchView == null) { 661b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // TODO: layout is not what we want. Need "up" button instead of "close" button, etc. 662b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final View searchViewLayout = 663b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa getLayoutInflater().inflate(R.layout.custom_action_bar, null); 664b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView = (SearchView) searchViewLayout.findViewById(R.id.search_view); 665b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.setQueryHint(getString(R.string.hint_findContacts)); 666b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.setOnQueryTextListener(mPhoneSearchQueryTextListener); 667b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.setOnCloseListener(mPhoneSearchCloseListener); 668b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.requestFocus(); 669b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa actionBar.setCustomView(searchViewLayout, 670b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 671b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } else { 672b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.setQuery(null, true); 673b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 674b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 675b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa actionBar.setDisplayShowCustomEnabled(true); 676b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 677b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 678b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // Show the search fragment and hide everything else. 679b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final FragmentTransaction transaction = getFragmentManager().beginTransaction(); 680b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa transaction.show(mPhoneNumberPickerFragment); 681b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa transaction.hide(mDialpadFragment); 682b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa transaction.hide(mCallLogFragment); 683b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa transaction.hide(mContactsFragment); 684b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa transaction.hide(mStrequentFragment); 685b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa transaction.commit(); 686b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 687b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mInSearchUi = true; 688b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 689b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 690b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 691b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Goes back to usual Phone UI with tags. Previously selected Tag and associated Fragment 692b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * should be automatically focused again. 693b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 694b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private void exitSearchUi() { 695b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final ActionBar actionBar = getActionBar(); 696b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 697b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // We want to hide SearchView and show Tabs. Also focus on previously selected one. 698b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa actionBar.setDisplayShowCustomEnabled(false); 699b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 700b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 701350e8d53a135e0bb62308a93dd09777364c08a58Daisuke Miyakawa // Request to update option menu. 702350e8d53a135e0bb62308a93dd09777364c08a58Daisuke Miyakawa invalidateOptionsMenu(); 703350e8d53a135e0bb62308a93dd09777364c08a58Daisuke Miyakawa 704b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mInSearchUi = false; 705b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 706032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov} 707