DialtactsActivity.java revision c36c75318f8e47679d5281b7de2a2b5295eede50
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; 22aae838c5a7ef38f4f2778cff6dfaa1f650a44522Daniel Lehmannimport com.android.contacts.interactions.PhoneNumberInteraction; 238f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawaimport com.android.contacts.list.AccountFilterActivity; 248f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawaimport com.android.contacts.list.ContactListFilter; 258f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawaimport com.android.contacts.list.ContactListFilterController; 268f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawaimport com.android.contacts.list.ContactListFilterController.ContactListFilterListener; 2737efa3aeea2e26fdee640b797efc39279500c4daFrank Sposaroimport com.android.contacts.list.ContactTileAdapter.DisplayType; 288f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawaimport com.android.contacts.list.ContactTileListFragment; 29b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport com.android.contacts.list.OnPhoneNumberPickerActionListener; 30b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport com.android.contacts.list.PhoneNumberPickerFragment; 31b25c13ec8b060cc74f91285929c4535adf4260f0Jeff Hamiltonimport com.android.internal.telephony.ITelephony; 32b25c13ec8b060cc74f91285929c4535adf4260f0Jeff Hamilton 33c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.ActionBar; 34b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.app.ActionBar.LayoutParams; 35c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.ActionBar.Tab; 36c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.ActionBar.TabListener; 37032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.app.Activity; 38c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.Fragment; 39c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.FragmentManager; 40c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.app.FragmentTransaction; 41c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasaniimport android.content.Context; 42032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.content.Intent; 43903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamiltonimport android.content.SharedPreferences; 44032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.net.Uri; 45032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.os.Bundle; 46032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.os.RemoteException; 47032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.os.ServiceManager; 48032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.provider.CallLog.Calls; 49b25c13ec8b060cc74f91285929c4535adf4260f0Jeff Hamiltonimport android.provider.ContactsContract.Intents.UI; 50438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawaimport android.support.v13.app.FragmentPagerAdapter; 51438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawaimport android.support.v4.view.ViewPager; 52438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawaimport android.support.v4.view.ViewPager.OnPageChangeListener; 53b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.text.TextUtils; 54032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikovimport android.util.Log; 55c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.view.Menu; 56c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.view.MenuInflater; 57c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannimport android.view.MenuItem; 58aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawaimport android.view.MenuItem.OnMenuItemClickListener; 59b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.view.View; 60c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasaniimport android.view.View.OnAttachStateChangeListener; 61c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasaniimport android.view.inputmethod.InputMethodManager; 62b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.widget.SearchView; 63b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.widget.SearchView.OnCloseListener; 64b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawaimport android.widget.SearchView.OnQueryTextListener; 65032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 66032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov/** 6708832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * The dialer activity that has one tab with the virtual 12key 6808832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * dialer, a tab with recent calls in it, a tab with the contacts and 6908832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * a tab with the favorite. This is the container and the tabs are 7008832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * embedded using intents. 7108832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * The dialer tab's title is 'phone', a more common name (see strings.xml). 72032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov */ 73c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmannpublic class DialtactsActivity extends Activity { 7409fba0a6d82a7f88ce3c8cbb74eddd4bb96eb7e4Daniel Lehmann private static final String TAG = "DialtactsActivity"; 757675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 7643105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa /** Used to open Call Setting */ 7743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa private static final String PHONE_PACKAGE = "com.android.phone"; 7843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa private static final String CALL_SETTINGS_CLASS_NAME = 7943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa "com.android.phone.CallFeaturesSetting"; 8043105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 81438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa /** Used both by {@link ActionBar} and {@link ViewPagerAdapter} */ 82032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private static final int TAB_INDEX_DIALER = 0; 83032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private static final int TAB_INDEX_CALL_LOG = 1; 8420962611bd54c64c206351d53b51686081d89e53Daisuke Miyakawa private static final int TAB_INDEX_FAVORITES = 2; 8520962611bd54c64c206351d53b51686081d89e53Daisuke Miyakawa 8620962611bd54c64c206351d53b51686081d89e53Daisuke Miyakawa private static final int TAB_INDEX_COUNT = 3; 8708832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 888f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa private static final int SUBACTIVITY_ACCOUNT_FILTER = 0; 898f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa 90903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton /** Name of the dialtacts shared preferences */ 91903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton static final String PREFS_DIALTACTS = "dialtacts"; 92903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton static final boolean PREF_FAVORITES_AS_CONTACTS_DEFAULT = false; 93903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton 947675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann /** Last manually selected tab index */ 957675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann private static final String PREF_LAST_MANUALLY_SELECTED_TAB = "last_manually_selected_tab"; 967675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann private static final int PREF_LAST_MANUALLY_SELECTED_TAB_DEFAULT = TAB_INDEX_DIALER; 977675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 98438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa /** 99438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa * Listener interface for Fragments accommodated in {@link ViewPager} enabling them to know 100438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa * when it becomes visible or invisible inside the ViewPager. 101438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa */ 102438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa public interface ViewPagerVisibilityListener { 103aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa public void onVisibilityChanged(boolean visible); 104438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 105438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa 106438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa public class ViewPagerAdapter extends FragmentPagerAdapter { 107cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell private DialpadFragment mDialpadFragment; 108cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell private CallLogFragment mCallLogFragment; 109cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell private ContactTileListFragment mContactTileListFragment; 110cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell 111438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa public ViewPagerAdapter(FragmentManager fm) { 112438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa super(fm); 113438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 114438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa 115438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa @Override 116438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa public Fragment getItem(int position) { 117438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa switch (position) { 118438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa case TAB_INDEX_DIALER: 119cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell if (mDialpadFragment == null) { 120cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell mDialpadFragment = new DialpadFragment(); 121cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell } 122cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell return mDialpadFragment; 123438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa case TAB_INDEX_CALL_LOG: 124cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell if (mCallLogFragment == null) { 125cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell mCallLogFragment = new CallLogFragment(); 126cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell } 127cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell return mCallLogFragment; 128438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa case TAB_INDEX_FAVORITES: 129cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell if (mContactTileListFragment == null) { 130cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell mContactTileListFragment = new ContactTileListFragment(); 131cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell } 132cce61178a881b20f69b0249599a792d7dacef7ceAdam Powell return mContactTileListFragment; 133438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 134438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa throw new IllegalStateException("No fragment at position " + position); 135438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 136438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa 137438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa @Override 138438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa public int getCount() { 139438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa return TAB_INDEX_COUNT; 140438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 141438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 142438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa 143438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa private class PageChangeListener implements OnPageChangeListener { 144f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa private int mCurrentPosition = -1; 145f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa /** 146f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa * Used during page migration, to remember the next position {@link #onPageSelected(int)} 147f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa * specified. 148f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa */ 149f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa private int mNextPosition = -1; 150aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa 151438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa @Override 152438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa public void onPageScrolled( 153438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa int position, float positionOffset, int positionOffsetPixels) { 154438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 155438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa 156438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa @Override 157438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa public void onPageSelected(int position) { 158438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa final ActionBar actionBar = getActionBar(); 159f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa if (mCurrentPosition == position) { 160aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa Log.w(TAG, "Previous position and next position became same (" + position + ")"); 161aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa } 162aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa 163438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa actionBar.selectTab(actionBar.getTabAt(position)); 164f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa mNextPosition = position; 165438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 166438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa 16743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa public void setCurrentPosition(int position) { 168f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa mCurrentPosition = position; 16943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 17043105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 171438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa @Override 172438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa public void onPageScrollStateChanged(int state) { 173f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa switch (state) { 174f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa case ViewPager.SCROLL_STATE_IDLE: { 175f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa if (mCurrentPosition >= 0) { 176f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa sendFragmentVisibilityChange(mCurrentPosition, false); 177f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa } 178f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa if (mNextPosition >= 0) { 179f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa sendFragmentVisibilityChange(mNextPosition, true); 180f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa } 181f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa invalidateOptionsMenu(); 182f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa 183f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa mCurrentPosition = mNextPosition; 184f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa break; 185f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa } 186f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa case ViewPager.SCROLL_STATE_DRAGGING: 187f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa case ViewPager.SCROLL_STATE_SETTLING: 188f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa default: 189f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa break; 190f6828029b127f60d758bf30052989d64f50cfa86Daisuke Miyakawa } 191438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 192438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 193438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa 19408832404d96360ac386a98fd977e45fde936ec30Nicolas Catania private String mFilterText; 195032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private Uri mDialUri; 196438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa 197438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa /** Enables horizontal swipe between Fragments. */ 198438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa private ViewPager mViewPager; 19943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa private final PageChangeListener mPageChangeListener = new PageChangeListener(); 200c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private DialpadFragment mDialpadFragment; 201c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private CallLogFragment mCallLogFragment; 2027979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro private ContactTileListFragment mStrequentFragment; 203032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 2042c1f7878d72184a56e9c2b0d9f4d74be439979c2Daisuke Miyakawa private final TabListener mTabListener = new TabListener() { 20543105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa @Override 20643105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa public void onTabUnselected(Tab tab, FragmentTransaction ft) { 20743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 20843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 20943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa @Override 21043105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa public void onTabSelected(Tab tab, FragmentTransaction ft) { 21143105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa if (mViewPager.getCurrentItem() != tab.getPosition()) { 2126a3515380fb0658c7e07c3569054646b8473fa3eDaisuke Miyakawa mViewPager.setCurrentItem(tab.getPosition(), true); 21343105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 21443105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 21543105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa // During the call, we don't remember the tab position. 21643105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa if (!DialpadFragment.phoneIsInUse()) { 21743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa // Remember this tab index. This function is also called, if the tab is set 21843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa // automatically in which case the setter (setCurrentTab) has to set this to its old 21943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa // value afterwards 22043105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa mLastManuallySelectedFragment = tab.getPosition(); 22143105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 22243105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 22343105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 22443105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa @Override 22543105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa public void onTabReselected(Tab tab, FragmentTransaction ft) { 22643105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 22743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa }; 22843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 2297675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann /** 230b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Fragment for searching phone numbers. Unlike the other Fragments, this doesn't correspond 231b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * to tab but is shown by a search action. 232b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 233aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa private PhoneNumberPickerFragment mSearchFragment; 234b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 235b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * True when this Activity is in its search UI (with a {@link SearchView} and 236b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * {@link PhoneNumberPickerFragment}). 237b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 238b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private boolean mInSearchUi; 239aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa private SearchView mSearchView; 240b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 241b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 242aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa * The index of the Fragment (or, the tab) that has last been manually selected. 243cfcd0764a1ec53c6014df9ce3e7d3a3da511599fDaisuke Miyakawa * This value does not keep track of programmatically set Tabs (e.g. Call Log after a Call) 244cfcd0764a1ec53c6014df9ce3e7d3a3da511599fDaisuke Miyakawa */ 245aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa private int mLastManuallySelectedFragment; 246cfcd0764a1ec53c6014df9ce3e7d3a3da511599fDaisuke Miyakawa 2478f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa private ContactListFilterController mContactListFilterController; 2488f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa private OnMenuItemClickListener mFilterOptionsMenuItemClickListener = 2498f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa new OnMenuItemClickListener() { 2508f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa @Override 2518f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa public boolean onMenuItemClick(MenuItem item) { 2528f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa final Intent intent = 2538f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa new Intent(DialtactsActivity.this, AccountFilterActivity.class); 2548f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa ContactListFilter filter = mContactListFilterController.getFilter(); 2558f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa startActivityForResult(intent, SUBACTIVITY_ACCOUNT_FILTER); 2568f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa return true; 2578f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } 2588f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa }; 2598f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa 2608f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa private OnMenuItemClickListener mSearchMenuItemClickListener = 2618f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa new OnMenuItemClickListener() { 2628f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa @Override 2638f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa public boolean onMenuItemClick(MenuItem item) { 2648f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa enterSearchUi(); 2658f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa return true; 2668f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } 2678f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa }; 2688f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa 269cfcd0764a1ec53c6014df9ce3e7d3a3da511599fDaisuke Miyakawa /** 270b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Listener used when one of phone numbers in search UI is selected. This will initiate a 271b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * phone call using the phone number. 272b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 273b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private final OnPhoneNumberPickerActionListener mPhoneNumberPickerActionListener = 274b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa new OnPhoneNumberPickerActionListener() { 275b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 276b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public void onPickPhoneNumberAction(Uri dataUri) { 277b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa PhoneNumberInteraction.startInteractionForPhoneCall( 278b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa DialtactsActivity.this, dataUri); 279b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 280b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 281b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 282b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public void onShortcutIntentCreated(Intent intent) { 283b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa Log.w(TAG, "Unsupported intent has come (" + intent + "). Ignoring."); 284b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 28588f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa 28688f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa @Override 28788f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa public void onHomeInActionBarSelected() { 28888f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa exitSearchUi(); 28988f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa } 290b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa }; 291b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 292b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 293b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Listener used to send search queries to the phone search fragment. 294b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 295b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private final OnQueryTextListener mPhoneSearchQueryTextListener = 296b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa new OnQueryTextListener() { 297b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 298b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public boolean onQueryTextSubmit(String query) { 299d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa View view = getCurrentFocus(); 300d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa if (view != null) { 301d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa hideInputMethod(view); 302d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa view.clearFocus(); 303d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa } 304b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa return true; 305b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 306b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 307b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 308b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public boolean onQueryTextChange(String newText) { 309b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // Show search result with non-empty text. Show a bare list otherwise. 310aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa mSearchFragment.setQueryString(newText, true); 311aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa mSearchFragment.setSearchMode(!TextUtils.isEmpty(newText)); 312b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa return true; 313b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 314b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa }; 315b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 316b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 317b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Listener used to handle the "close" button on the right side of {@link SearchView}. 318b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * If some text is in the search view, this will clean it up. Otherwise this will exit 319b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * the search UI and let users go back to usual Phone UI. 320b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * 321b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * This does _not_ handle back button. 322b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 323b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private final OnCloseListener mPhoneSearchCloseListener = 324b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa new OnCloseListener() { 325b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 326b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public boolean onClose() { 327d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa if (!TextUtils.isEmpty(mSearchView.getQuery())) { 328b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.setQuery(null, true); 329b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 330b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa return true; 331b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 332b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa }; 333b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 334032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov @Override 335032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov protected void onCreate(Bundle icicle) { 336032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov super.onCreate(icicle); 337032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 338032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov final Intent intent = getIntent(); 339032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov fixIntent(intent); 34008832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 34109fba0a6d82a7f88ce3c8cbb74eddd4bb96eb7e4Daniel Lehmann setContentView(R.layout.dialtacts_activity); 342032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 3438f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa mContactListFilterController = new ContactListFilterController(this); 3448f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa mContactListFilterController.addListener(new ContactListFilterListener() { 3458f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa @Override 3468f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa public void onContactListFilterChanged() { 3478f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa if (mSearchFragment == null || !mSearchFragment.isAdded()) { 3488f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa Log.w(TAG, "Search Fragment isn't available when ContactListFilter is changed"); 3498f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa return; 3508f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } 3518f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa mSearchFragment .setFilter(mContactListFilterController.getFilter()); 3528f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa 3538f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa invalidateOptionsMenu(); 3548f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } 3558f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa }); 3568f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa 357438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa mViewPager = (ViewPager) findViewById(R.id.pager); 358438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa mViewPager.setAdapter(new ViewPagerAdapter(getFragmentManager())); 35943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa mViewPager.setOnPageChangeListener(mPageChangeListener); 360c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 361c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann // Setup the ActionBar tabs (the order matches the tab-index contants TAB_INDEX_*) 362c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann setupDialer(); 363c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann setupCallLog(); 364c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann setupFavorites(); 365c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 366c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().setDisplayShowTitleEnabled(false); 367c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().setDisplayShowHomeEnabled(false); 368032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 3697675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann // Load the last manually loaded tab 3707675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann final SharedPreferences prefs = getSharedPreferences(PREFS_DIALTACTS, MODE_PRIVATE); 371aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa mLastManuallySelectedFragment = prefs.getInt(PREF_LAST_MANUALLY_SELECTED_TAB, 3727675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann PREF_LAST_MANUALLY_SELECTED_TAB_DEFAULT); 373aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa if (mLastManuallySelectedFragment >= TAB_INDEX_COUNT) { 37420962611bd54c64c206351d53b51686081d89e53Daisuke Miyakawa // Stored value may have exceeded the number of current tabs. Reset it. 375aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa mLastManuallySelectedFragment = PREF_LAST_MANUALLY_SELECTED_TAB_DEFAULT; 37620962611bd54c64c206351d53b51686081d89e53Daisuke Miyakawa } 3777675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 378032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov setCurrentTab(intent); 379903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton 3807fa3cd652fdaa5284fdf5fa9c306f2ca89227c1aJeff Hamilton if (UI.FILTER_CONTACTS_ACTION.equals(intent.getAction()) 381903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton && icicle == null) { 382903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton setupFilterText(intent); 383903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 384032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 385032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 386903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton @Override 38743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa public void onAttachFragment(Fragment fragment) { 38843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa // This method can be called before onCreate(), at which point we cannot rely on ViewPager. 38943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa // In that case, we will setup the "current position" soon after the ViewPager is ready. 39043105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa final int currentPosition = mViewPager != null ? mViewPager.getCurrentItem() : -1; 39143105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 39243105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa if (fragment instanceof DialpadFragment) { 39343105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa mDialpadFragment = (DialpadFragment) fragment; 39443105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa mDialpadFragment.setListener(mDialpadListener); 395c36c75318f8e47679d5281b7de2a2b5295eede50Flavio Lerda if (currentPosition == TAB_INDEX_DIALER) { 396c36c75318f8e47679d5281b7de2a2b5295eede50Flavio Lerda mDialpadFragment.onVisibilityChanged(true); 397c36c75318f8e47679d5281b7de2a2b5295eede50Flavio Lerda } 39843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } else if (fragment instanceof CallLogFragment) { 39943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa mCallLogFragment = (CallLogFragment) fragment; 400c36c75318f8e47679d5281b7de2a2b5295eede50Flavio Lerda if (currentPosition == TAB_INDEX_CALL_LOG) { 401c36c75318f8e47679d5281b7de2a2b5295eede50Flavio Lerda mCallLogFragment.onVisibilityChanged(true); 402c36c75318f8e47679d5281b7de2a2b5295eede50Flavio Lerda } 4037979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro } else if (fragment instanceof ContactTileListFragment) { 4047979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro mStrequentFragment = (ContactTileListFragment) fragment; 4057979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro mStrequentFragment.enableQuickContact(false); 40643105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa mStrequentFragment.setListener(mStrequentListener); 40737efa3aeea2e26fdee640b797efc39279500c4daFrank Sposaro mStrequentFragment.setDisplayType(DisplayType.STREQUENT_PHONE_ONLY); 40843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } else if (fragment instanceof PhoneNumberPickerFragment) { 40943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa mSearchFragment = (PhoneNumberPickerFragment) fragment; 41043105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa mSearchFragment.setOnPhoneNumberPickerActionListener(mPhoneNumberPickerActionListener); 41143105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa mSearchFragment.setQuickContactEnabled(true); 41243105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa final FragmentTransaction transaction = getFragmentManager().beginTransaction(); 41343105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa if (mInSearchUi) { 41443105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa transaction.show(mSearchFragment); 41543105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } else { 41643105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa transaction.hide(mSearchFragment); 41743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 41843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa transaction.commit(); 41943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 42043105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 42143105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 42243105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa @Override 423903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton protected void onPause() { 424903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton super.onPause(); 42508832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 4267675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann final SharedPreferences.Editor editor = 4277675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann getSharedPreferences(PREFS_DIALTACTS, MODE_PRIVATE).edit(); 428aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa editor.putInt(PREF_LAST_MANUALLY_SELECTED_TAB, mLastManuallySelectedFragment); 4297675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 430909271c9b60f755a5298c611400502e7418d161bBrad Fitzpatrick editor.apply(); 431903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 43208832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 433032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private void fixIntent(Intent intent) { 434032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // This should be cleaned up: the call key used to send an Intent 435032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // that just said to go to the recent calls list. It now sends this 436032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // abstract action, but this class hasn't been rewritten to deal with it. 437032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (Intent.ACTION_CALL_BUTTON.equals(intent.getAction())) { 438032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov intent.setDataAndType(Calls.CONTENT_URI, Calls.CONTENT_TYPE); 439032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov intent.putExtra("call_key", true); 440032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov setIntent(intent); 441032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 442032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 44308832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 444c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private void setupDialer() { 445c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Tab tab = getActionBar().newTab(); 44600848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown // TODO: Temporarily disable tab text labels (in all 4 tabs in this 44700848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown // activity) so that the current tabs will all fit onscreen in 44800848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown // portrait (bug 4520620). (Also note we do setText("") rather 44900848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown // leaving the text null, to work around bug 4521549.) 45000848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown tab.setText(""); // R.string.dialerIconLabel 45143105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa tab.setTabListener(mTabListener); 452c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann tab.setIcon(R.drawable.ic_tab_dialer); 453c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().addTab(tab); 454032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 455032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 456c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private void setupCallLog() { 457c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Tab tab = getActionBar().newTab(); 45800848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown tab.setText(""); // R.string.recentCallsIconLabel 459c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann tab.setIcon(R.drawable.ic_tab_recent); 46043105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa tab.setTabListener(mTabListener); 461c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().addTab(tab); 462032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 463032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 464c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann private void setupFavorites() { 465c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann final Tab tab = getActionBar().newTab(); 46600848d5b0cd3199fb91171936eb59db7c5e4b6afDavid Brown tab.setText(""); // R.string.contactsFavoritesLabel 467c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann tab.setIcon(R.drawable.ic_tab_starred); 46843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa tab.setTabListener(mTabListener); 469c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann getActionBar().addTab(tab); 4709add0e5ef2a267acbe104e04f4cf6ab24cb8ba3eKatherine Kuan } 4719add0e5ef2a267acbe104e04f4cf6ab24cb8ba3eKatherine Kuan 472032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov /** 473032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * Returns true if the intent is due to hitting the green send key while in a call. 47408832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * 475032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * @param intent the intent that launched this activity 476032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * @param recentCallsRequest true if the intent is requesting to view recent calls 47708832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * @return true if the intent is due to hitting the green send key while in a call 478032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov */ 479aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa private boolean isSendKeyWhileInCall(final Intent intent, 480aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa final boolean recentCallsRequest) { 481032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // If there is a call in progress go to the call screen 482032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (recentCallsRequest) { 483032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov final boolean callKey = intent.getBooleanExtra("call_key", false); 484032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 485032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov try { 486032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); 487032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (callKey && phone != null && phone.showCallScreen()) { 488032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return true; 489032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 490032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } catch (RemoteException e) { 491032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov Log.e(TAG, "Failed to handle send while in call", e); 492032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 493032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 494032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 495032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return false; 496032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 497032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 498032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov /** 499032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov * Sets the current tab based on the intent's request type 50008832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * 5017675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann * @param intent Intent that contains information about which tab should be selected 502032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov */ 503032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private void setCurrentTab(Intent intent) { 504032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // If we got here by hitting send and we're in call forward along to the in-call activity 505032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov final boolean recentCallsRequest = Calls.CONTENT_TYPE.equals(intent.getType()); 506032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (isSendKeyWhileInCall(intent, recentCallsRequest)) { 507032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov finish(); 508032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return; 509032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 51008832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 5117675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann // Remember the old manually selected tab index so that it can be restored if it is 5127675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann // overwritten by one of the programmatic tab selections 513aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa final int savedTabIndex = mLastManuallySelectedFragment; 5147675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann 515438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa final int tabIndex; 516438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa if (DialpadFragment.phoneIsInUse() || isDialIntent(intent)) { 517438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa tabIndex = TAB_INDEX_DIALER; 518c18f9b7cb0846d0c10fe0398224b53530a2194ecDaisuke Miyakawa } else if (recentCallsRequest) { 519438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa tabIndex = TAB_INDEX_CALL_LOG; 520903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } else { 521aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa tabIndex = mLastManuallySelectedFragment; 522032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 523aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa mViewPager.setCurrentItem(tabIndex, false /* smoothScroll */); 52443105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa if (mViewPager.getCurrentItem() == tabIndex) { 52543105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa mPageChangeListener.setCurrentPosition(tabIndex); 52643105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa sendFragmentVisibilityChange(tabIndex, true); 52743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } else { 52843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa getActionBar().selectTab(getActionBar().getTabAt(tabIndex)); 52943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 530032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 5317675e12b55f9492bf0f6062811f2a0ed030dc1cfDaniel Lehmann // Restore to the previous manual selection 532aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa mLastManuallySelectedFragment = savedTabIndex; 533032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 534032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 535032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov @Override 536032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov public void onNewIntent(Intent newIntent) { 537032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov setIntent(newIntent); 538032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov fixIntent(newIntent); 539032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov setCurrentTab(newIntent); 540903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton final String action = newIntent.getAction(); 5417fa3cd652fdaa5284fdf5fa9c306f2ca89227c1aJeff Hamilton if (UI.FILTER_CONTACTS_ACTION.equals(action)) { 542903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton setupFilterText(newIntent); 543032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 54443105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa if (mInSearchUi || mSearchFragment.isVisible()) { 545438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa exitSearchUi(); 546438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa } 547b15498a22a1b4dae0fc4be681f7b63d1d7dab1ebDaisuke Miyakawa 548b15498a22a1b4dae0fc4be681f7b63d1d7dab1ebDaisuke Miyakawa if (mViewPager.getCurrentItem() == TAB_INDEX_DIALER) { 549b15498a22a1b4dae0fc4be681f7b63d1d7dab1ebDaisuke Miyakawa if (mDialpadFragment != null) { 550b15498a22a1b4dae0fc4be681f7b63d1d7dab1ebDaisuke Miyakawa mDialpadFragment.configureScreenFromIntent(newIntent); 551b15498a22a1b4dae0fc4be681f7b63d1d7dab1ebDaisuke Miyakawa } else { 552b15498a22a1b4dae0fc4be681f7b63d1d7dab1ebDaisuke Miyakawa Log.e(TAG, "DialpadFragment isn't ready yet when the tab is already selected."); 553b15498a22a1b4dae0fc4be681f7b63d1d7dab1ebDaisuke Miyakawa } 554b15498a22a1b4dae0fc4be681f7b63d1d7dab1ebDaisuke Miyakawa } 555032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 556032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 557032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov /** Returns true if the given intent contains a phone number to populate the dialer with */ 558032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov private boolean isDialIntent(Intent intent) { 559032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov final String action = intent.getAction(); 560032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (Intent.ACTION_DIAL.equals(action)) { 561032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return true; 562032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 563032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (Intent.ACTION_VIEW.equals(action)) { 564032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov final Uri data = intent.getData(); 565032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov if (data != null && "tel".equals(data.getScheme())) { 566032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return true; 567032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 568032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 569032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov return false; 570032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 57108832404d96360ac386a98fd977e45fde936ec30Nicolas Catania 572903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton /** 573903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * Retrieves the filter text stored in {@link #setupFilterText(Intent)}. 574903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * This text originally came from a FILTER_CONTACTS_ACTION intent received 575903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * by this activity. The stored text will then be cleared after after this 576903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * method returns. 57708832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * 578903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * @return The stored filter text 579903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton */ 580903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton public String getAndClearFilterText() { 581903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton String filterText = mFilterText; 582903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton mFilterText = null; 583903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton return filterText; 584903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 585903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton 586903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton /** 587903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * Stores the filter text associated with a FILTER_CONTACTS_ACTION intent. 588903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * This is so child activities can check if they are supposed to display a filter. 58908832404d96360ac386a98fd977e45fde936ec30Nicolas Catania * 590903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton * @param intent The intent received in {@link #onNewIntent(Intent)} 591903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton */ 592903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton private void setupFilterText(Intent intent) { 593903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton // If the intent was relaunched from history, don't apply the filter text. 594903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { 595903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton return; 596903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 597b25c13ec8b060cc74f91285929c4535adf4260f0Jeff Hamilton String filter = intent.getStringExtra(UI.FILTER_TEXT_EXTRA_KEY); 598903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton if (filter != null && filter.length() > 0) { 599903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton mFilterText = filter; 600903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 601903137768d56ca85d026c2f4b92e4ace6e068d3bJeff Hamilton } 602032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 603032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov @Override 604242599a0f1ab23e2a46eff963484a70ec7981befDianne Hackborn public void onBackPressed() { 605b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa if (mInSearchUi) { 606b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // We should let the user go back to usual screens with tabs. 607b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa exitSearchUi(); 608b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } else if (isTaskRoot()) { 609032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // Instead of stopping, simply push this to the back of the stack. 610032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // This is only done when running at the top of the stack; 611032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // otherwise, we have been launched by someone else so need to 612032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov // allow the user to go back to the caller. 613032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov moveTaskToBack(false); 614242599a0f1ab23e2a46eff963484a70ec7981befDianne Hackborn } else { 615242599a0f1ab23e2a46eff963484a70ec7981befDianne Hackborn super.onBackPressed(); 616032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 617032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov } 618032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov 61943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa private DialpadFragment.Listener mDialpadListener = new DialpadFragment.Listener() { 620c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 62143105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa public void onSearchButtonPressed() { 62243105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa enterSearchUi(); 623c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 62443105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa }; 625c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 6267979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro private ContactTileListFragment.Listener mStrequentListener = 6277979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro new ContactTileListFragment.Listener() { 62832f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro @Override 62932f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro public void onContactSelected(Uri contactUri) { 630b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa PhoneNumberInteraction.startInteractionForPhoneCall( 631b1f0e5e8a4de69bd80276742900441e930fa4c86Daisuke Miyakawa DialtactsActivity.this, contactUri); 63232f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro } 63332f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro }; 63432f395567c9d103e9101c2549f76945c9dee20b5Frank Sposaro 635c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 636c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann public boolean onCreateOptionsMenu(Menu menu) { 637c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann MenuInflater inflater = getMenuInflater(); 638aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa inflater.inflate(R.menu.dialtacts_options, menu); 639c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann return true; 640c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 641c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann 642c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann @Override 643aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa public boolean onPrepareOptionsMenu(Menu menu) { 644aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa final MenuItem searchMenuItem = menu.findItem(R.id.search_on_action_bar); 6458f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option); 6468f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa Tab tab = getActionBar().getSelectedTab(); 6478f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa if (mInSearchUi) { 648aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa searchMenuItem.setVisible(false); 6498f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa filterOptionMenuItem.setVisible(true); 6508f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa filterOptionMenuItem.setOnMenuItemClickListener( 6518f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa mFilterOptionsMenuItemClickListener); 6528f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } else if (tab == null || tab.getPosition() == TAB_INDEX_DIALER) { 6538f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa searchMenuItem.setVisible(false); 6548f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa filterOptionMenuItem.setVisible(false); 655aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa } else { 6568f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa filterOptionMenuItem.setVisible(false); 657aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa searchMenuItem.setVisible(true); 6588f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa searchMenuItem.setOnMenuItemClickListener(mSearchMenuItemClickListener); 659c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 660aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa 661aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa return true; 662c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann } 663b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 664b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa @Override 665b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa public void startSearch(String initialQuery, boolean selectInitialQuery, 666b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa Bundle appSearchData, boolean globalSearch) { 66743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa if (mSearchFragment != null && mSearchFragment.isAdded() && !globalSearch) { 668b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa enterSearchUi(); 669b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } else { 670b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch); 671b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 672b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 673b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 674b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 675b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Hides every tab and shows search UI for phone lookup. 676b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 677b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private void enterSearchUi() { 678b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final ActionBar actionBar = getActionBar(); 679b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 680b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final Tab tab = actionBar.getSelectedTab(); 681c18f9b7cb0846d0c10fe0398224b53530a2194ecDaisuke Miyakawa 682c18f9b7cb0846d0c10fe0398224b53530a2194ecDaisuke Miyakawa // User can search during the call, but we don't want to remember the status. 683c18f9b7cb0846d0c10fe0398224b53530a2194ecDaisuke Miyakawa if (tab != null && !DialpadFragment.phoneIsInUse()) { 684aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa mLastManuallySelectedFragment = tab.getPosition(); 685b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 686b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 687b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // Instantiate or reset SearchView in ActionBar. 688b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa if (mSearchView == null) { 689b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final View searchViewLayout = 690b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa getLayoutInflater().inflate(R.layout.custom_action_bar, null); 691b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView = (SearchView) searchViewLayout.findViewById(R.id.search_view); 692b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.setOnQueryTextListener(mPhoneSearchQueryTextListener); 693b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.setOnCloseListener(mPhoneSearchCloseListener); 694d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa // Since we're using a custom layout for showing SearchView instead of letting the 695d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa // search menu icon do that job, we need to manually configure the View so it looks 696d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa // "shown via search menu". 697d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa // - it should be iconified by default 698d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa // - it should not be iconified at this time 699d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa // See also comments for onActionViewExpanded()/onActionViewCollapsed() 700d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa mSearchView.setIconifiedByDefault(true); 701d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa mSearchView.setQueryHint(getString(R.string.hint_findContacts)); 702d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa mSearchView.setIconified(false); 703b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.requestFocus(); 70436c33609482ae5c961ac5f3b67c581a0bb430f38Daisuke Miyakawa // Show soft keyboard when SearchView has a focus. Need to delay the request in order 70536c33609482ae5c961ac5f3b67c581a0bb430f38Daisuke Miyakawa // to let InputMethodManager handle it correctly. 706c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani mSearchView.addOnAttachStateChangeListener(new OnAttachStateChangeListener() { 707c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani @Override 708c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani public void onViewDetachedFromWindow(View v) { 709c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani } 710c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani 711c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani @Override 712c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani public void onViewAttachedToWindow(View v) { 713c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani if (mSearchView.hasFocus()) { 714c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani mSearchView.postDelayed(new Runnable() { 715c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani public void run() { 716c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani showInputMethod(mSearchView.findFocus()); 717c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani } 718c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani }, 0); 719c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani } 720c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani } 721c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani }); 722b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa actionBar.setCustomView(searchViewLayout, 723b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 724b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } else { 725b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mSearchView.setQuery(null, true); 726b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 727b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 728b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa actionBar.setDisplayShowCustomEnabled(true); 729b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 73088f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa actionBar.setDisplayShowHomeEnabled(true); 73188f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa actionBar.setDisplayHomeAsUpEnabled(true); 732b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 73343105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa sendFragmentVisibilityChange(mViewPager.getCurrentItem(), false); 73443105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 735b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // Show the search fragment and hide everything else. 736b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final FragmentTransaction transaction = getFragmentManager().beginTransaction(); 737aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa transaction.show(mSearchFragment); 738b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa transaction.commit(); 739438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa mViewPager.setVisibility(View.GONE); 740b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 741d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa // We need to call this and onActionViewCollapsed() manually, since we are using a custom 742d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa // layout instead of asking the search menu item to take care of SearchView. 743d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa mSearchView.onActionViewExpanded(); 744b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mInSearchUi = true; 745b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 746b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 747c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani private void showInputMethod(View view) { 748c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 749c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani if (imm != null) { 750c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani imm.showSoftInput(view, 0); 751c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani } 752c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani } 753c5be9585f664a893392486e3f86c67f3e083f271Amith Yamasani 75488f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa private void hideInputMethod(View view) { 75588f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 75688f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa if (imm != null) { 75788f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 75888f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa } 75988f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa } 76088f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa 761b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa /** 762b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * Goes back to usual Phone UI with tags. Previously selected Tag and associated Fragment 763b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa * should be automatically focused again. 764b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa */ 765b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa private void exitSearchUi() { 766b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa final ActionBar actionBar = getActionBar(); 767b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 768a5ed6df7d3702e648075204b790cf15dcd98a6e6Daisuke Miyakawa final FragmentTransaction transaction = getFragmentManager().beginTransaction(); 769a5ed6df7d3702e648075204b790cf15dcd98a6e6Daisuke Miyakawa transaction.hide(mSearchFragment); 770a5ed6df7d3702e648075204b790cf15dcd98a6e6Daisuke Miyakawa transaction.commit(); 771a5ed6df7d3702e648075204b790cf15dcd98a6e6Daisuke Miyakawa 772b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa // We want to hide SearchView and show Tabs. Also focus on previously selected one. 773b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa actionBar.setDisplayShowCustomEnabled(false); 77488f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa actionBar.setDisplayShowHomeEnabled(false); 775b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 776b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa 77743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa sendFragmentVisibilityChange(mViewPager.getCurrentItem(), true); 77843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 779438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa mViewPager.setVisibility(View.VISIBLE); 780438e1f19279ea058e145c84dbe3ba62cc14df645Daisuke Miyakawa 78188f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa hideInputMethod(getCurrentFocus()); 78288f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa 783350e8d53a135e0bb62308a93dd09777364c08a58Daisuke Miyakawa // Request to update option menu. 784350e8d53a135e0bb62308a93dd09777364c08a58Daisuke Miyakawa invalidateOptionsMenu(); 785350e8d53a135e0bb62308a93dd09777364c08a58Daisuke Miyakawa 786d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa // See comments in onActionViewExpanded() 787d04768a41fc0c1918eec625fb61e3c8b90719b13Daisuke Miyakawa mSearchView.onActionViewCollapsed(); 788b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa mInSearchUi = false; 789b2e626ad4fedc0fd726f66b9942d1b2f30d9cfefDaisuke Miyakawa } 790aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa 791aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa private Fragment getFragmentAt(int position) { 792aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa switch (position) { 793aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa case TAB_INDEX_DIALER: 794aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa return mDialpadFragment; 795aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa case TAB_INDEX_CALL_LOG: 796aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa return mCallLogFragment; 797aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa case TAB_INDEX_FAVORITES: 798aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa return mStrequentFragment; 799aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa default: 800aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa throw new IllegalStateException("Unknown fragment index: " + position); 801aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa } 802aa72f08effc0b2bac7c56dd2fed9bbeae3a6f109Daisuke Miyakawa } 80343105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa 80443105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa private void sendFragmentVisibilityChange(int position, boolean visibility) { 80543105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa final Fragment fragment = getFragmentAt(position); 80643105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa if (fragment instanceof ViewPagerVisibilityListener) { 80743105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa ((ViewPagerVisibilityListener) fragment).onVisibilityChanged(visibility); 80843105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 80943105d0b04963ac96acc1fa7f97278f927f48948Daisuke Miyakawa } 810bd762dc826d85e5b7db634ef14a0dbb70c42eaabDaisuke Miyakawa 811bd762dc826d85e5b7db634ef14a0dbb70c42eaabDaisuke Miyakawa /** Returns an Intent to launch Call Settings screen */ 812bd762dc826d85e5b7db634ef14a0dbb70c42eaabDaisuke Miyakawa public static Intent getCallSettingsIntent() { 813bd762dc826d85e5b7db634ef14a0dbb70c42eaabDaisuke Miyakawa final Intent intent = new Intent(Intent.ACTION_MAIN); 814bd762dc826d85e5b7db634ef14a0dbb70c42eaabDaisuke Miyakawa intent.setClassName(PHONE_PACKAGE, CALL_SETTINGS_CLASS_NAME); 815147618fa21a2ed187e79aa2eb0414d5f9170310dDaisuke Miyakawa intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 816bd762dc826d85e5b7db634ef14a0dbb70c42eaabDaisuke Miyakawa return intent; 817bd762dc826d85e5b7db634ef14a0dbb70c42eaabDaisuke Miyakawa } 8188f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa 8198f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa @Override 8208f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa protected void onActivityResult(int requestCode, int resultCode, Intent data) { 8218f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa if (resultCode != Activity.RESULT_OK) { 8228f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa return; 8238f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } 8248f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa switch (requestCode) { 8258f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa case SUBACTIVITY_ACCOUNT_FILTER: { 8268f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa ContactListFilter filter = (ContactListFilter) data.getParcelableExtra( 8278f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER); 8288f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa if (filter == null) { 8298f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa return; 8308f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } 8318f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) { 8328f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa mContactListFilterController.selectCustomFilter(); 8338f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } else { 8348f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa mContactListFilterController.setContactListFilter(filter, true); 8358f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } 8368f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } 8378f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa break; 8388f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } 8398f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa } 840032bb36086d55529b59cbd6ea03d2f9b6cfe36afDmitri Plotnikov} 841