DialtactsActivity.java revision 8efbcf920eeebc826c18b3c474e9c62b77dcd232
194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/* 294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Copyright (C) 2008 The Android Open Source Project 394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * you may not use this file except in compliance with the License. 694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * You may obtain a copy of the License at 794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * http://www.apache.org/licenses/LICENSE-2.0 994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 1094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Unless required by applicable law or agreed to in writing, software 1194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS, 1294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * See the License for the specific language governing permissions and 1494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * limitations under the License. 1594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 1694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 1794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpackage com.android.dialer; 1894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 1994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.ActionBar; 2094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.ActionBar.LayoutParams; 2194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.ActionBar.Tab; 2294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.ActionBar.TabListener; 2394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.Activity; 2494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.Fragment; 2594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.FragmentManager; 2694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.FragmentTransaction; 2794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.Context; 2894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.Intent; 2994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.SharedPreferences; 3094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.net.Uri; 3194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.Bundle; 3294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.RemoteException; 3394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.ServiceManager; 3494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.preference.PreferenceManager; 3594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.provider.CallLog.Calls; 3694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.provider.ContactsContract.Contacts; 3794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.provider.ContactsContract.Intents.UI; 3894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.support.v13.app.FragmentPagerAdapter; 3994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.support.v4.view.ViewPager; 4094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.support.v4.view.ViewPager.OnPageChangeListener; 4194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.text.TextUtils; 4294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.util.DisplayMetrics; 4394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.util.Log; 4494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.Menu; 4594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.MenuInflater; 4694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.MenuItem; 4794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.MenuItem.OnMenuItemClickListener; 4894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.View; 4994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.View.OnClickListener; 5094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.View.OnFocusChangeListener; 5194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.ViewConfiguration; 5294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.ViewGroup; 5394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.inputmethod.InputMethodManager; 5494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.PopupMenu; 5594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.SearchView; 5694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.SearchView.OnCloseListener; 5794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.SearchView.OnQueryTextListener; 5894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 599d4f3b20793a007b4489547aa40fc1049d0d8fefChiao Chengimport com.android.contacts.common.CallUtil; 60603ff6858d321e8265b3af6363a63df2827e0334Chiao Chengimport com.android.contacts.common.activity.TransactionSafeActivity; 61963216bccf27ecba7c8917401f1fc8e30e67dd51Chiao Chengimport com.android.contacts.common.list.ContactListFilterController; 62963216bccf27ecba7c8917401f1fc8e30e67dd51Chiao Chengimport com.android.contacts.common.list.ContactListFilterController.ContactListFilterListener; 631429f1a5c2b993a5013bfda7cfd75a2c43ead2bfChiao Chengimport com.android.contacts.common.list.ContactListItemView; 648efbcf920eeebc826c18b3c474e9c62b77dcd232Chiao Chengimport com.android.contacts.common.list.OnPhoneNumberPickerActionListener; 658efbcf920eeebc826c18b3c474e9c62b77dcd232Chiao Chengimport com.android.contacts.common.list.PhoneNumberPickerFragment; 6682d544d5a50499be26861ed46d9d51dd89710f03Chiao Chengimport com.android.contacts.common.util.AccountFilterUtil; 6791197049c458f07092b31501d2ed512180b13d58Chiao Chengimport com.android.dialer.calllog.CallLogFragment; 6891197049c458f07092b31501d2ed512180b13d58Chiao Chengimport com.android.dialer.dialpad.DialpadFragment; 691429f1a5c2b993a5013bfda7cfd75a2c43ead2bfChiao Chengimport com.android.dialer.interactions.PhoneNumberInteraction; 7091197049c458f07092b31501d2ed512180b13d58Chiao Chengimport com.android.dialer.list.PhoneFavoriteFragment; 7135071c06d1587942f5a66c8f12e6247e8f904d26Chiao Chengimport com.android.dialer.util.OrientationUtil; 7294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport com.android.internal.telephony.ITelephony; 7394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 7494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/** 7594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * The dialer activity that has one tab with the virtual 12key 7694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * dialer, a tab with recent calls in it, a tab with the contacts and 7794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * a tab with the favorite. This is the container and the tabs are 7894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * embedded using intents. 7994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * The dialer tab's title is 'phone', a more common name (see strings.xml). 8094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 81603ff6858d321e8265b3af6363a63df2827e0334Chiao Chengpublic class DialtactsActivity extends TransactionSafeActivity implements View.OnClickListener { 8294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final String TAG = "DialtactsActivity"; 8394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 8494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public static final boolean DEBUG = false; 8594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 8694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Used to open Call Setting */ 8794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final String PHONE_PACKAGE = "com.android.phone"; 8894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final String CALL_SETTINGS_CLASS_NAME = 8994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng "com.android.phone.CallFeaturesSetting"; 9094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 9194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** @see #getCallOrigin() */ 9294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final String CALL_ORIGIN_DIALTACTS = 9394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng "com.android.dialer.DialtactsActivity"; 9494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 9594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 9694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Just for backward compatibility. Should behave as same as {@link Intent#ACTION_DIAL}. 9794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 9894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final String ACTION_TOUCH_DIALER = "com.android.phone.action.TOUCH_DIALER"; 9994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 10094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Used both by {@link ActionBar} and {@link ViewPagerAdapter} */ 10194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int TAB_INDEX_DIALER = 0; 10294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int TAB_INDEX_CALL_LOG = 1; 10394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int TAB_INDEX_FAVORITES = 2; 10494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 10594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int TAB_INDEX_COUNT = 3; 10694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 10794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private SharedPreferences mPrefs; 10894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 10994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Last manually selected tab index */ 11094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final String PREF_LAST_MANUALLY_SELECTED_TAB = 11194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng "DialtactsActivity_last_manually_selected_tab"; 11294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int PREF_LAST_MANUALLY_SELECTED_TAB_DEFAULT = TAB_INDEX_DIALER; 11394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 11494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int SUBACTIVITY_ACCOUNT_FILTER = 1; 11594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 11694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public class ViewPagerAdapter extends FragmentPagerAdapter { 11794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public ViewPagerAdapter(FragmentManager fm) { 11894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng super(fm); 11994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 12094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 12194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 12294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public Fragment getItem(int position) { 12394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng switch (position) { 12494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case TAB_INDEX_DIALER: 12594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return new DialpadFragment(); 12694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case TAB_INDEX_CALL_LOG: 12794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return new CallLogFragment(); 12894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case TAB_INDEX_FAVORITES: 12994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return new PhoneFavoriteFragment(); 13094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 13194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng throw new IllegalStateException("No fragment at position " + position); 13294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 13394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 13494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 13594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void setPrimaryItem(ViewGroup container, int position, Object object) { 13694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // The parent's setPrimaryItem() also calls setMenuVisibility(), so we want to know 13794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // when it happens. 13894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) { 13994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.d(TAG, "FragmentPagerAdapter#setPrimaryItem(), position: " + position); 14094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 14194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng super.setPrimaryItem(container, position, object); 14294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 14394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 14494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 14594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int getCount() { 14694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return TAB_INDEX_COUNT; 14794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 14894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 14994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 15094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 15194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * True when the app detects user's drag event. This variable should not become true when 15294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * mUserTabClick is true. 15394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 15494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * During user's drag or tab click, we shouldn't show fake buttons but just show real 15594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * ActionBar at the bottom of the screen, for transition animation. 15694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 15794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng boolean mDuringSwipe = false; 15894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 15994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * True when the app detects user's tab click (at the top of the screen). This variable should 16094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * not become true when mDuringSwipe is true. 16194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 16294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * During user's drag or tab click, we shouldn't show fake buttons but just show real 16394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * ActionBar at the bottom of the screen, for transition animation. 16494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 16594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng boolean mUserTabClick = false; 16694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 16794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private class PageChangeListener implements OnPageChangeListener { 16894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private int mCurrentPosition = -1; 16994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 17094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Used during page migration, to remember the next position {@link #onPageSelected(int)} 17194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * specified. 17294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 17394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private int mNextPosition = -1; 17494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 17594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 17694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onPageScrolled( 17794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng int position, float positionOffset, int positionOffsetPixels) { 17894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 17994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 18094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 18194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onPageSelected(int position) { 18294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) Log.d(TAG, "onPageSelected: position: " + position); 18394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final ActionBar actionBar = getActionBar(); 18494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mDialpadFragment != null) { 18594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mDuringSwipe && position == TAB_INDEX_DIALER) { 18694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // TODO: Figure out if we want this or not. Right now 18794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // - with this call, both fake buttons and real action bar overlap 18894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // - without this call, there's tiny flicker happening to search/menu buttons. 18994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // If we can reduce the flicker without this call, it would be much better. 19094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // updateFakeMenuButtonsVisibility(true); 19194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 19294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 19394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 19494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mCurrentPosition == position) { 19594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.w(TAG, "Previous position and next position became same (" + position + ")"); 19694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 19794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 19894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionBar.selectTab(actionBar.getTabAt(position)); 19994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mNextPosition = position; 20094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 20194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 20294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void setCurrentPosition(int position) { 20394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mCurrentPosition = position; 20494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 20594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 20694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int getCurrentPosition() { 20794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mCurrentPosition; 20894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 20994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 21094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 21194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onPageScrollStateChanged(int state) { 21294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng switch (state) { 21394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case ViewPager.SCROLL_STATE_IDLE: { 21494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mNextPosition == -1) { 21594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // This happens when the user drags the screen just after launching the 21694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // application, and settle down the same screen without actually swiping it. 21794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // At that moment mNextPosition is apparently -1 yet, and we expect it 21894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // being updated by onPageSelected(), which is *not* called if the user 21994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // settle down the exact same tab after the dragging. 22094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) { 22194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.d(TAG, "Next position is not specified correctly. Use current tab (" 22294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng + mViewPager.getCurrentItem() + ")"); 22394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 22494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mNextPosition = mViewPager.getCurrentItem(); 22594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 22694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) { 22794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.d(TAG, "onPageScrollStateChanged() with SCROLL_STATE_IDLE. " 22894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng + "mCurrentPosition: " + mCurrentPosition 22994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng + ", mNextPosition: " + mNextPosition); 23094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 23194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Interpret IDLE as the end of migration (both swipe and tab click) 23294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mDuringSwipe = false; 23394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mUserTabClick = false; 23494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 23594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng updateFakeMenuButtonsVisibility(mNextPosition == TAB_INDEX_DIALER); 23694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng sendFragmentVisibilityChange(mCurrentPosition, false); 23794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng sendFragmentVisibilityChange(mNextPosition, true); 23894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 23994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng invalidateOptionsMenu(); 24094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 24194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mCurrentPosition = mNextPosition; 24294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 24394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 24494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case ViewPager.SCROLL_STATE_DRAGGING: { 24594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) Log.d(TAG, "onPageScrollStateChanged() with SCROLL_STATE_DRAGGING"); 24694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mDuringSwipe = true; 24794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mUserTabClick = false; 24894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 24994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 25094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case ViewPager.SCROLL_STATE_SETTLING: { 25194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) Log.d(TAG, "onPageScrollStateChanged() with SCROLL_STATE_SETTLING"); 25294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mDuringSwipe = true; 25394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mUserTabClick = false; 25494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 25594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 25694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng default: 25794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 25894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 25994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 26094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 26194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 26294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private String mFilterText; 26394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 26494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Enables horizontal swipe between Fragments. */ 26594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private ViewPager mViewPager; 26694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final PageChangeListener mPageChangeListener = new PageChangeListener(); 26794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private DialpadFragment mDialpadFragment; 26894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private CallLogFragment mCallLogFragment; 26994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private PhoneFavoriteFragment mPhoneFavoriteFragment; 27094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 27194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private View mSearchButton; 27294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private View mMenuButton; 27394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 27494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final ContactListFilterListener mContactListFilterListener = 27594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new ContactListFilterListener() { 27694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 27794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onContactListFilterChanged() { 27894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng boolean doInvalidateOptionsMenu = false; 27994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 28094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mPhoneFavoriteFragment != null && mPhoneFavoriteFragment.isAdded()) { 28194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPhoneFavoriteFragment.setFilter(mContactListFilterController.getFilter()); 28294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng doInvalidateOptionsMenu = true; 28394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 28494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 28594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchFragment != null && mSearchFragment.isAdded()) { 28694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setFilter(mContactListFilterController.getFilter()); 28794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng doInvalidateOptionsMenu = true; 28894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 28994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.w(TAG, "Search Fragment isn't available when ContactListFilter is changed"); 29094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 29194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 29294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (doInvalidateOptionsMenu) { 29394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng invalidateOptionsMenu(); 29494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 29594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 29694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }; 29794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 29894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final TabListener mTabListener = new TabListener() { 29994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 30094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onTabUnselected(Tab tab, FragmentTransaction ft) { 30194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) Log.d(TAG, "onTabUnselected(). tab: " + tab); 30294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 30394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 30494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 30594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onTabSelected(Tab tab, FragmentTransaction ft) { 30694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) { 30794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.d(TAG, "onTabSelected(). tab: " + tab + ", mDuringSwipe: " + mDuringSwipe); 30894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 30994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // When the user swipes the screen horizontally, this method will be called after 31094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // ViewPager.SCROLL_STATE_DRAGGING and ViewPager.SCROLL_STATE_SETTLING events, while 31194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // when the user clicks a tab at the ActionBar at the top, this will be called before 31294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // them. This logic interprets the order difference as a difference of the user action. 31394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (!mDuringSwipe) { 31494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) { 31594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.d(TAG, "Tab select. from: " + mPageChangeListener.getCurrentPosition() 31694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng + ", to: " + tab.getPosition()); 31794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 31894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mDialpadFragment != null) { 31994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng updateFakeMenuButtonsVisibility(tab.getPosition() == TAB_INDEX_DIALER); 32094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 32194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mUserTabClick = true; 32294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 32394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 32494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mViewPager.getCurrentItem() != tab.getPosition()) { 32594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mViewPager.setCurrentItem(tab.getPosition(), true); 32694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 32794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 32894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // During the call, we don't remember the tab position. 32994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (!DialpadFragment.phoneIsInUse()) { 33094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Remember this tab index. This function is also called, if the tab is set 33194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // automatically in which case the setter (setCurrentTab) has to set this to its old 33294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // value afterwards 33394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mLastManuallySelectedFragment = tab.getPosition(); 33494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 33594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 33694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 33794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 33894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onTabReselected(Tab tab, FragmentTransaction ft) { 33994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) Log.d(TAG, "onTabReselected"); 34094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 34194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }; 34294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 34394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 34494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Fragment for searching phone numbers. Unlike the other Fragments, this doesn't correspond 34594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * to tab but is shown by a search action. 34694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 34794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private PhoneNumberPickerFragment mSearchFragment; 34894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 34994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * True when this Activity is in its search UI (with a {@link SearchView} and 35094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * {@link PhoneNumberPickerFragment}). 35194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 35294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private boolean mInSearchUi; 35394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private SearchView mSearchView; 35494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 35594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final OnClickListener mFilterOptionClickListener = new OnClickListener() { 35694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 35794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onClick(View view) { 35894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final PopupMenu popupMenu = new PopupMenu(DialtactsActivity.this, view); 35994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Menu menu = popupMenu.getMenu(); 36094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng popupMenu.inflate(R.menu.dialtacts_search_options); 36194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option); 36294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng filterOptionMenuItem.setOnMenuItemClickListener(mFilterOptionsMenuItemClickListener); 36394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem addContactOptionMenuItem = menu.findItem(R.id.add_contact); 36494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng addContactOptionMenuItem.setIntent( 36594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI)); 36694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng popupMenu.show(); 36794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 36894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }; 36994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 37094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 37194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * The index of the Fragment (or, the tab) that has last been manually selected. 37294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * This value does not keep track of programmatically set Tabs (e.g. Call Log after a Call) 37394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 37494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private int mLastManuallySelectedFragment; 37594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 37694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private ContactListFilterController mContactListFilterController; 37794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private OnMenuItemClickListener mFilterOptionsMenuItemClickListener = 37894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new OnMenuItemClickListener() { 37994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 38094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public boolean onMenuItemClick(MenuItem item) { 38194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng AccountFilterUtil.startAccountFilterActivityForResult( 38294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng DialtactsActivity.this, SUBACTIVITY_ACCOUNT_FILTER, 38394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mContactListFilterController.getFilter()); 38494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return true; 38594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 38694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }; 38794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 38894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private OnMenuItemClickListener mSearchMenuItemClickListener = 38994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new OnMenuItemClickListener() { 39094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 39194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public boolean onMenuItemClick(MenuItem item) { 39294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng enterSearchUi(); 39394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return true; 39494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 39594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }; 39694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 39794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 39894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Listener used when one of phone numbers in search UI is selected. This will initiate a 39994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * phone call using the phone number. 40094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 40194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final OnPhoneNumberPickerActionListener mPhoneNumberPickerActionListener = 40294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new OnPhoneNumberPickerActionListener() { 40394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 40494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onPickPhoneNumberAction(Uri dataUri) { 40594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Specify call-origin so that users will see the previous tab instead of 40694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // CallLog screen (search UI will be automatically exited). 40794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PhoneNumberInteraction.startInteractionForPhoneCall( 40894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng DialtactsActivity.this, dataUri, getCallOrigin()); 40994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 41094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 41194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 41294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onShortcutIntentCreated(Intent intent) { 41394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.w(TAG, "Unsupported intent has come (" + intent + "). Ignoring."); 41494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 41594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 41694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 41794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onHomeInActionBarSelected() { 41894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng exitSearchUi(); 41994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 42094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }; 42194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 42294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 42394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Listener used to send search queries to the phone search fragment. 42494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 42594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final OnQueryTextListener mPhoneSearchQueryTextListener = 42694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new OnQueryTextListener() { 42794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 42894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public boolean onQueryTextSubmit(String query) { 42994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng View view = getCurrentFocus(); 43094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (view != null) { 43194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng hideInputMethod(view); 43294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng view.clearFocus(); 43394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 43494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return true; 43594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 43694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 43794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 43894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public boolean onQueryTextChange(String newText) { 43994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Show search result with non-empty text. Show a bare list otherwise. 44094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchFragment != null) { 44194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setQueryString(newText, true); 44294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 44394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return true; 44494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 44594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }; 44694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 44794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 44894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Listener used to handle the "close" button on the right side of {@link SearchView}. 44994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * If some text is in the search view, this will clean it up. Otherwise this will exit 45094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * the search UI and let users go back to usual Phone UI. 45194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 45294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * This does _not_ handle back button. 45394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 45494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final OnCloseListener mPhoneSearchCloseListener = 45594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new OnCloseListener() { 45694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 45794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public boolean onClose() { 45894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (!TextUtils.isEmpty(mSearchView.getQuery())) { 45994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.setQuery(null, true); 46094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 46194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return true; 46294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 46394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }; 46494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 46594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final View.OnLayoutChangeListener mFirstLayoutListener 46694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng = new View.OnLayoutChangeListener() { 46794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 46894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, 46994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng int oldTop, int oldRight, int oldBottom) { 47094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng v.removeOnLayoutChangeListener(this); // Unregister self. 47194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng addSearchFragment(); 47294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 47394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }; 47494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 47594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 47694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng protected void onCreate(Bundle icicle) { 47794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng super.onCreate(icicle); 47894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 47994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Intent intent = getIntent(); 48094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng fixIntent(intent); 48194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 48294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng setContentView(R.layout.dialtacts_activity); 48394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 48494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mContactListFilterController = ContactListFilterController.getInstance(this); 48594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mContactListFilterController.addListener(mContactListFilterListener); 48694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 48794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng findViewById(R.id.dialtacts_frame).addOnLayoutChangeListener(mFirstLayoutListener); 48894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 48994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mViewPager = (ViewPager) findViewById(R.id.pager); 49094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mViewPager.setAdapter(new ViewPagerAdapter(getFragmentManager())); 49194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mViewPager.setOnPageChangeListener(mPageChangeListener); 49294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mViewPager.setOffscreenPageLimit(2); 49394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 49494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Do same width calculation as ActionBar does 49594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng DisplayMetrics dm = getResources().getDisplayMetrics(); 49694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng int minCellSize = getResources().getDimensionPixelSize(R.dimen.fake_menu_button_min_width); 49794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng int cellCount = dm.widthPixels / minCellSize; 49894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng int fakeMenuItemWidth = dm.widthPixels / cellCount; 49994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) Log.d(TAG, "The size of fake menu buttons (in pixel): " + fakeMenuItemWidth); 50094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 50194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Soft menu button should appear only when there's no hardware menu button. 50294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mMenuButton = findViewById(R.id.overflow_menu); 50394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mMenuButton != null) { 50494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mMenuButton.setMinimumWidth(fakeMenuItemWidth); 50594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (ViewConfiguration.get(this).hasPermanentMenuKey()) { 50694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // This is required for dialpad button's layout, so must not use GONE here. 50794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mMenuButton.setVisibility(View.INVISIBLE); 50894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 50994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mMenuButton.setOnClickListener(this); 51094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 51194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 51294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchButton = findViewById(R.id.searchButton); 51394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchButton != null) { 51494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchButton.setMinimumWidth(fakeMenuItemWidth); 51594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchButton.setOnClickListener(this); 51694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 51794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 51894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Setup the ActionBar tabs (the order matches the tab-index contants TAB_INDEX_*) 51994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng setupDialer(); 52094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng setupCallLog(); 52194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng setupFavorites(); 52294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 52394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng getActionBar().setDisplayShowTitleEnabled(false); 52494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng getActionBar().setDisplayShowHomeEnabled(false); 52594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 52694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Load the last manually loaded tab 52794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPrefs = PreferenceManager.getDefaultSharedPreferences(this); 52894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mLastManuallySelectedFragment = mPrefs.getInt(PREF_LAST_MANUALLY_SELECTED_TAB, 52994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PREF_LAST_MANUALLY_SELECTED_TAB_DEFAULT); 53094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mLastManuallySelectedFragment >= TAB_INDEX_COUNT) { 53194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Stored value may have exceeded the number of current tabs. Reset it. 53294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mLastManuallySelectedFragment = PREF_LAST_MANUALLY_SELECTED_TAB_DEFAULT; 53394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 53494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 53594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng setCurrentTab(intent); 53694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 53794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (UI.FILTER_CONTACTS_ACTION.equals(intent.getAction()) 53894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng && icicle == null) { 53994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng setupFilterText(intent); 54094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 54194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 54294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 54394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 54494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onStart() { 54594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng super.onStart(); 54694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mPhoneFavoriteFragment != null) { 54794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPhoneFavoriteFragment.setFilter(mContactListFilterController.getFilter()); 54894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 54994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchFragment != null) { 55094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setFilter(mContactListFilterController.getFilter()); 55194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 55294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 55394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mDuringSwipe || mUserTabClick) { 55494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) Log.d(TAG, "reset buggy flag state.."); 55594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mDuringSwipe = false; 55694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mUserTabClick = false; 55794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 55894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 55994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final int currentPosition = mPageChangeListener.getCurrentPosition(); 56094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) { 56194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.d(TAG, "onStart(). current position: " + mPageChangeListener.getCurrentPosition() 56294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng + ". Reset all menu visibility state."); 56394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 56494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng updateFakeMenuButtonsVisibility(currentPosition == TAB_INDEX_DIALER && !mInSearchUi); 56594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng for (int i = 0; i < TAB_INDEX_COUNT; i++) { 56694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng sendFragmentVisibilityChange(i, i == currentPosition); 56794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 56894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 56994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 57094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 57194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onDestroy() { 57294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng super.onDestroy(); 57394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mContactListFilterController.removeListener(mContactListFilterListener); 57494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 57594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 57694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 57794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onClick(View view) { 57894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng switch (view.getId()) { 57994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case R.id.searchButton: { 58094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng enterSearchUi(); 58194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 58294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 58394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case R.id.overflow_menu: { 58494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mDialpadFragment != null) { 58594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PopupMenu popup = mDialpadFragment.constructPopupMenu(view); 58694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (popup != null) { 58794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng popup.show(); 58894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 58994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 59094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.w(TAG, "DialpadFragment is null during onClick() event for " + view); 59194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 59294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 59394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 59494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng default: { 59594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.wtf(TAG, "Unexpected onClick event from " + view); 59694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 59794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 59894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 59994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 60094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 60194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 60294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Add search fragment. Note this is called during onLayout, so there's some restrictions, 60394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * such as executePendingTransaction can't be used in it. 60494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 60594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void addSearchFragment() { 60694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // In order to take full advantage of "fragment deferred start", we need to create the 60794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // search fragment after all other fragments are created. 60894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // The other fragments are created by the ViewPager on the first onMeasure(). 60994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // We use the first onLayout call, which is after onMeasure(). 61094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 61194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Just return if the fragment is already created, which happens after configuration 61294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // changes. 61394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchFragment != null) return; 61494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 61594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final FragmentTransaction ft = getFragmentManager().beginTransaction(); 61694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Fragment searchFragment = new PhoneNumberPickerFragment(); 61794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 61894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng searchFragment.setUserVisibleHint(false); 61994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng ft.add(R.id.dialtacts_frame, searchFragment); 62094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng ft.hide(searchFragment); 62194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng ft.commitAllowingStateLoss(); 62294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 62394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 62494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void prepareSearchView() { 62594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final View searchViewLayout = 62694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng getLayoutInflater().inflate(R.layout.dialtacts_custom_action_bar, null); 62794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView = (SearchView) searchViewLayout.findViewById(R.id.search_view); 62894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.setOnQueryTextListener(mPhoneSearchQueryTextListener); 62994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.setOnCloseListener(mPhoneSearchCloseListener); 63094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Since we're using a custom layout for showing SearchView instead of letting the 63194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // search menu icon do that job, we need to manually configure the View so it looks 63294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // "shown via search menu". 63394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // - it should be iconified by default 63494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // - it should not be iconified at this time 63594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // See also comments for onActionViewExpanded()/onActionViewCollapsed() 63694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.setIconifiedByDefault(true); 63794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.setQueryHint(getString(R.string.hint_findContacts)); 63894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.setIconified(false); 63994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.setOnQueryTextFocusChangeListener(new OnFocusChangeListener() { 64094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 64194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onFocusChange(View view, boolean hasFocus) { 64294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (hasFocus) { 64394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng showInputMethod(view.findFocus()); 64494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 64594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 64694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }); 64794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 64894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (!ViewConfiguration.get(this).hasPermanentMenuKey()) { 64994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Filter option menu should be shown on the right side of SearchView. 65094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final View filterOptionView = searchViewLayout.findViewById(R.id.search_option); 65194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng filterOptionView.setVisibility(View.VISIBLE); 65294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng filterOptionView.setOnClickListener(mFilterOptionClickListener); 65394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 65494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 65594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng getActionBar().setCustomView(searchViewLayout, 65694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 65794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 65894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 65994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 66094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onAttachFragment(Fragment fragment) { 66194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // This method can be called before onCreate(), at which point we cannot rely on ViewPager. 66294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // In that case, we will setup the "current position" soon after the ViewPager is ready. 66394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final int currentPosition = mViewPager != null ? mViewPager.getCurrentItem() : -1; 66494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 66594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (fragment instanceof DialpadFragment) { 66694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mDialpadFragment = (DialpadFragment) fragment; 66794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (fragment instanceof CallLogFragment) { 66894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mCallLogFragment = (CallLogFragment) fragment; 66994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (fragment instanceof PhoneFavoriteFragment) { 67094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPhoneFavoriteFragment = (PhoneFavoriteFragment) fragment; 67194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPhoneFavoriteFragment.setListener(mPhoneFavoriteListener); 67294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mContactListFilterController != null 67394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng && mContactListFilterController.getFilter() != null) { 67494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPhoneFavoriteFragment.setFilter(mContactListFilterController.getFilter()); 67594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 67694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (fragment instanceof PhoneNumberPickerFragment) { 67794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment = (PhoneNumberPickerFragment) fragment; 67894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setOnPhoneNumberPickerActionListener(mPhoneNumberPickerActionListener); 67994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setQuickContactEnabled(true); 68094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setDarkTheme(true); 68194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setPhotoPosition(ContactListItemView.PhotoPosition.LEFT); 68294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setUseCallableUri(true); 68394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mContactListFilterController != null 68494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng && mContactListFilterController.getFilter() != null) { 68594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setFilter(mContactListFilterController.getFilter()); 68694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 68794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Here we assume that we're not on the search mode, so let's hide the fragment. 68894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // 68994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // We get here either when the fragment is created (normal case), or after configuration 69094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // changes. In the former case, we're not in search mode because we can only 69194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // enter search mode if the fragment is created. (see enterSearchUi()) 69294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // In the latter case we're not in search mode either because we don't retain 69394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // mInSearchUi -- ideally we should but at this point it's not supported. 69494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setUserVisibleHint(false); 69594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // After configuration changes fragments will forget their "hidden" state, so make 69694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // sure to hide it. 69794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (!mSearchFragment.isHidden()) { 69894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final FragmentTransaction transaction = getFragmentManager().beginTransaction(); 69994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng transaction.hide(mSearchFragment); 70094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng transaction.commitAllowingStateLoss(); 70194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 70294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 70394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 70494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 70594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 70694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng protected void onPause() { 70794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng super.onPause(); 70894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 70994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPrefs.edit().putInt(PREF_LAST_MANUALLY_SELECTED_TAB, mLastManuallySelectedFragment) 71094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng .apply(); 71194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 71294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 71394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void fixIntent(Intent intent) { 71494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // This should be cleaned up: the call key used to send an Intent 71594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // that just said to go to the recent calls list. It now sends this 71694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // abstract action, but this class hasn't been rewritten to deal with it. 71794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (Intent.ACTION_CALL_BUTTON.equals(intent.getAction())) { 71894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng intent.setDataAndType(Calls.CONTENT_URI, Calls.CONTENT_TYPE); 71994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng intent.putExtra("call_key", true); 72094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng setIntent(intent); 72194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 72294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 72394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 72494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void setupDialer() { 72594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Tab tab = getActionBar().newTab(); 72694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tab.setContentDescription(R.string.dialerIconLabel); 72794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tab.setTabListener(mTabListener); 72894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tab.setIcon(R.drawable.ic_tab_dialer); 72994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng getActionBar().addTab(tab); 73094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 73194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 73294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void setupCallLog() { 73394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Tab tab = getActionBar().newTab(); 73494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tab.setContentDescription(R.string.recentCallsIconLabel); 73594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tab.setIcon(R.drawable.ic_tab_recent); 73694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tab.setTabListener(mTabListener); 73794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng getActionBar().addTab(tab); 73894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 73994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 74094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void setupFavorites() { 74194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Tab tab = getActionBar().newTab(); 74294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tab.setContentDescription(R.string.contactsFavoritesLabel); 74394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tab.setIcon(R.drawable.ic_tab_all); 74494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tab.setTabListener(mTabListener); 74594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng getActionBar().addTab(tab); 74694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 74794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 74894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 74994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Returns true if the intent is due to hitting the green send key (hardware call button: 75094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * KEYCODE_CALL) while in a call. 75194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 75294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * @param intent the intent that launched this activity 75394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * @param recentCallsRequest true if the intent is requesting to view recent calls 75494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * @return true if the intent is due to hitting the green send key while in a call 75594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 75694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private boolean isSendKeyWhileInCall(final Intent intent, 75794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final boolean recentCallsRequest) { 75894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // If there is a call in progress go to the call screen 75994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (recentCallsRequest) { 76094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final boolean callKey = intent.getBooleanExtra("call_key", false); 76194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 76294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng try { 76394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); 76494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (callKey && phone != null && phone.showCallScreen()) { 76594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return true; 76694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 76794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } catch (RemoteException e) { 76894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.e(TAG, "Failed to handle send while in call", e); 76994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 77094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 77194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 77294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return false; 77394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 77494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 77594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 77694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Sets the current tab based on the intent's request type 77794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 77894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * @param intent Intent that contains information about which tab should be selected 77994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 78094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void setCurrentTab(Intent intent) { 78194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // If we got here by hitting send and we're in call forward along to the in-call activity 78294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng boolean recentCallsRequest = Calls.CONTENT_TYPE.equals(intent.resolveType( 78394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng getContentResolver())); 78494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (isSendKeyWhileInCall(intent, recentCallsRequest)) { 78594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng finish(); 78694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return; 78794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 78894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 78994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Remember the old manually selected tab index so that it can be restored if it is 79094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // overwritten by one of the programmatic tab selections 79194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final int savedTabIndex = mLastManuallySelectedFragment; 79294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 79394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final int tabIndex; 79494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DialpadFragment.phoneIsInUse() || isDialIntent(intent)) { 79594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tabIndex = TAB_INDEX_DIALER; 79694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (recentCallsRequest) { 79794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tabIndex = TAB_INDEX_CALL_LOG; 79894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 79994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng tabIndex = mLastManuallySelectedFragment; 80094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 80194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 80294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final int previousItemIndex = mViewPager.getCurrentItem(); 80394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mViewPager.setCurrentItem(tabIndex, false /* smoothScroll */); 80494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (previousItemIndex != tabIndex) { 80594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng sendFragmentVisibilityChange(previousItemIndex, false /* not visible */ ); 80694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 80794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPageChangeListener.setCurrentPosition(tabIndex); 80894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng sendFragmentVisibilityChange(tabIndex, true /* visible */ ); 80994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 81094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Restore to the previous manual selection 81194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mLastManuallySelectedFragment = savedTabIndex; 81294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mDuringSwipe = false; 81394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mUserTabClick = false; 81494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 81594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 81694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 81794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onNewIntent(Intent newIntent) { 81894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng setIntent(newIntent); 81994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng fixIntent(newIntent); 82094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng setCurrentTab(newIntent); 82194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final String action = newIntent.getAction(); 82294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (UI.FILTER_CONTACTS_ACTION.equals(action)) { 82394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng setupFilterText(newIntent); 82494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 82594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mInSearchUi || (mSearchFragment != null && mSearchFragment.isVisible())) { 82694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng exitSearchUi(); 82794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 82894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 82994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mViewPager.getCurrentItem() == TAB_INDEX_DIALER) { 83094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mDialpadFragment != null) { 831291e976e870d05ec9dd9d8286fb7291c0a76a523Chiao Cheng mDialpadFragment.setStartedFromNewIntent(true); 83294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 83394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.e(TAG, "DialpadFragment isn't ready yet when the tab is already selected."); 83494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 83594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (mViewPager.getCurrentItem() == TAB_INDEX_CALL_LOG) { 83694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mCallLogFragment != null) { 83794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mCallLogFragment.configureScreenFromIntent(newIntent); 83894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 83994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.e(TAG, "CallLogFragment isn't ready yet when the tab is already selected."); 84094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 84194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 84294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng invalidateOptionsMenu(); 84394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 84494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 84594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Returns true if the given intent contains a phone number to populate the dialer with */ 84694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private boolean isDialIntent(Intent intent) { 84794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final String action = intent.getAction(); 84894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (Intent.ACTION_DIAL.equals(action) || ACTION_TOUCH_DIALER.equals(action)) { 84994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return true; 85094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 85194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (Intent.ACTION_VIEW.equals(action)) { 85294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Uri data = intent.getData(); 8539d4f3b20793a007b4489547aa40fc1049d0d8fefChiao Cheng if (data != null && CallUtil.SCHEME_TEL.equals(data.getScheme())) { 85494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return true; 85594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 85694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 85794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return false; 85894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 85994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 86094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 86194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Returns an appropriate call origin for this Activity. May return null when no call origin 86294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * should be used (e.g. when some 3rd party application launched the screen. Call origin is 86394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * for remembering the tab in which the user made a phone call, so the external app's DIAL 86494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * request should not be counted.) 86594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 86694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public String getCallOrigin() { 86794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return !isDialIntent(getIntent()) ? CALL_ORIGIN_DIALTACTS : null; 86894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 86994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 87094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 87194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Retrieves the filter text stored in {@link #setupFilterText(Intent)}. 87294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * This text originally came from a FILTER_CONTACTS_ACTION intent received 87394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * by this activity. The stored text will then be cleared after after this 87494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * method returns. 87594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 87694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * @return The stored filter text 87794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 87894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public String getAndClearFilterText() { 87994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng String filterText = mFilterText; 88094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mFilterText = null; 88194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return filterText; 88294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 88394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 88494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 88594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Stores the filter text associated with a FILTER_CONTACTS_ACTION intent. 88694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * This is so child activities can check if they are supposed to display a filter. 88794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 88894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * @param intent The intent received in {@link #onNewIntent(Intent)} 88994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 89094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void setupFilterText(Intent intent) { 89194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // If the intent was relaunched from history, don't apply the filter text. 89294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { 89394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return; 89494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 89594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng String filter = intent.getStringExtra(UI.FILTER_TEXT_EXTRA_KEY); 89694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (filter != null && filter.length() > 0) { 89794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mFilterText = filter; 89894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 89994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 90094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 90194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 90294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onBackPressed() { 90394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mInSearchUi) { 90494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // We should let the user go back to usual screens with tabs. 90594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng exitSearchUi(); 90694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (isTaskRoot()) { 90794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Instead of stopping, simply push this to the back of the stack. 90894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // This is only done when running at the top of the stack; 90994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // otherwise, we have been launched by someone else so need to 91094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // allow the user to go back to the caller. 91194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng moveTaskToBack(false); 91294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 91394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng super.onBackPressed(); 91494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 91594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 91694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 91794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final PhoneFavoriteFragment.Listener mPhoneFavoriteListener = 91894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new PhoneFavoriteFragment.Listener() { 91994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 92094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onContactSelected(Uri contactUri) { 92194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PhoneNumberInteraction.startInteractionForPhoneCall( 92294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng DialtactsActivity.this, contactUri, getCallOrigin()); 92394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 92494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 92594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 92694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void onCallNumberDirectly(String phoneNumber) { 9279d4f3b20793a007b4489547aa40fc1049d0d8fefChiao Cheng Intent intent = CallUtil.getCallIntent(phoneNumber, getCallOrigin()); 92894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng startActivity(intent); 92994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 93094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }; 93194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 93294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 93394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public boolean onCreateOptionsMenu(Menu menu) { 93494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng MenuInflater inflater = getMenuInflater(); 93594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng inflater.inflate(R.menu.dialtacts_options, menu); 93694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 93794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // set up intents and onClick listeners 93894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem callSettingsMenuItem = menu.findItem(R.id.menu_call_settings); 93994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem searchMenuItem = menu.findItem(R.id.search_on_action_bar); 94094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option); 94194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem addContactOptionMenuItem = menu.findItem(R.id.add_contact); 94294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 94394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng callSettingsMenuItem.setIntent(DialtactsActivity.getCallSettingsIntent()); 94494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng searchMenuItem.setOnMenuItemClickListener(mSearchMenuItemClickListener); 94594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng filterOptionMenuItem.setOnMenuItemClickListener(mFilterOptionsMenuItemClickListener); 94694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng addContactOptionMenuItem.setIntent( 94794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI)); 94894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 94994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return true; 95094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 95194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 95294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 95394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public boolean onPrepareOptionsMenu(Menu menu) { 95494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mInSearchUi) { 95594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng prepareOptionsMenuInSearchMode(menu); 95694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 95794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // get reference to the currently selected tab 95894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Tab tab = getActionBar().getSelectedTab(); 95994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (tab != null) { 96094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng switch(tab.getPosition()) { 96194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case TAB_INDEX_DIALER: 96294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng prepareOptionsMenuForDialerTab(menu); 96394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 96494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case TAB_INDEX_CALL_LOG: 96594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng prepareOptionsMenuForCallLogTab(menu); 96694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 96794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case TAB_INDEX_FAVORITES: 96894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng prepareOptionsMenuForFavoritesTab(menu); 96994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 97094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 97194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 97294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 97394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return true; 97494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 97594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 97694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void prepareOptionsMenuInSearchMode(Menu menu) { 97794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // get references to menu items 97894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem searchMenuItem = menu.findItem(R.id.search_on_action_bar); 97994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option); 98094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem addContactOptionMenuItem = menu.findItem(R.id.add_contact); 98194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem callSettingsMenuItem = menu.findItem(R.id.menu_call_settings); 98294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem emptyRightMenuItem = menu.findItem(R.id.empty_right_menu_item); 98394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 98494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // prepare the menu items 98594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng searchMenuItem.setVisible(false); 98694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng filterOptionMenuItem.setVisible(ViewConfiguration.get(this).hasPermanentMenuKey()); 98794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng addContactOptionMenuItem.setVisible(false); 98894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng callSettingsMenuItem.setVisible(false); 98994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng emptyRightMenuItem.setVisible(false); 99094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 99194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 99294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void prepareOptionsMenuForDialerTab(Menu menu) { 99394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) { 99494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.d(TAG, "onPrepareOptionsMenu(dialer). swipe: " + mDuringSwipe 99594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng + ", user tab click: " + mUserTabClick); 99694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 99794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 99894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // get references to menu items 99994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem searchMenuItem = menu.findItem(R.id.search_on_action_bar); 100094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option); 100194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem addContactOptionMenuItem = menu.findItem(R.id.add_contact); 100294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem callSettingsMenuItem = menu.findItem(R.id.menu_call_settings); 100394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem emptyRightMenuItem = menu.findItem(R.id.empty_right_menu_item); 100494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 100594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // prepare the menu items 100694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng filterOptionMenuItem.setVisible(false); 100794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng addContactOptionMenuItem.setVisible(false); 100894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mDuringSwipe || mUserTabClick) { 100994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // During horizontal movement, the real ActionBar menu items are shown 101094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng searchMenuItem.setVisible(true); 101194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng callSettingsMenuItem.setVisible(true); 101294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // When there is a permanent menu key, there is no overflow icon on the right of 101394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // the action bar which would force the search menu item (if it is visible) to the 101494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // left. This is the purpose of showing the emptyRightMenuItem. 101594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng emptyRightMenuItem.setVisible(ViewConfiguration.get(this).hasPermanentMenuKey()); 101694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 101794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // This is when the user is looking at the dialer pad. In this case, the real 101894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // ActionBar is hidden and fake menu items are shown. 101994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Except in landscape, in which case the real search menu item is shown. 102035071c06d1587942f5a66c8f12e6247e8f904d26Chiao Cheng searchMenuItem.setVisible(OrientationUtil.isLandscape(this)); 102194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // If a permanent menu key is available, then we need to show the call settings item 102294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // so that the call settings item can be invoked by the permanent menu key. 102394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng callSettingsMenuItem.setVisible(ViewConfiguration.get(this).hasPermanentMenuKey()); 102494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng emptyRightMenuItem.setVisible(false); 102594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 102694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 102794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 102894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void prepareOptionsMenuForCallLogTab(Menu menu) { 102994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // get references to menu items 103094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem searchMenuItem = menu.findItem(R.id.search_on_action_bar); 103194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option); 103294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem addContactOptionMenuItem = menu.findItem(R.id.add_contact); 103394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem callSettingsMenuItem = menu.findItem(R.id.menu_call_settings); 103494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem emptyRightMenuItem = menu.findItem(R.id.empty_right_menu_item); 103594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 103694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // prepare the menu items 103794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng searchMenuItem.setVisible(true); 103894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng filterOptionMenuItem.setVisible(false); 103994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng addContactOptionMenuItem.setVisible(false); 104094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng callSettingsMenuItem.setVisible(true); 104194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng emptyRightMenuItem.setVisible(ViewConfiguration.get(this).hasPermanentMenuKey()); 104294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 104394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 104494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void prepareOptionsMenuForFavoritesTab(Menu menu) { 104594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // get references to menu items 104694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem searchMenuItem = menu.findItem(R.id.search_on_action_bar); 104794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option); 104894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem addContactOptionMenuItem = menu.findItem(R.id.add_contact); 104994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem callSettingsMenuItem = menu.findItem(R.id.menu_call_settings); 105094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final MenuItem emptyRightMenuItem = menu.findItem(R.id.empty_right_menu_item); 105194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 105294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // prepare the menu items 105394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng searchMenuItem.setVisible(true); 105494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng filterOptionMenuItem.setVisible(true); 105594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng addContactOptionMenuItem.setVisible(true); 105694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng callSettingsMenuItem.setVisible(true); 105794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng emptyRightMenuItem.setVisible(false); 105894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 105994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 106094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 106194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public void startSearch(String initialQuery, boolean selectInitialQuery, 106294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Bundle appSearchData, boolean globalSearch) { 106394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchFragment != null && mSearchFragment.isAdded() && !globalSearch) { 106494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mInSearchUi) { 106594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchView.hasFocus()) { 106694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng showInputMethod(mSearchView.findFocus()); 106794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 106894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.requestFocus(); 106994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 107094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 107194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng enterSearchUi(); 107294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 107394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 107494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch); 107594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 107694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 107794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 107894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 107994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Hides every tab and shows search UI for phone lookup. 108094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 108194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void enterSearchUi() { 108294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchFragment == null) { 108394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // We add the search fragment dynamically in the first onLayoutChange() and 108494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // mSearchFragment is set sometime later when the fragment transaction is actually 108594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // executed, which means there's a window when users are able to hit the (physical) 108694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // search key but mSearchFragment is still null. 108794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // It's quite hard to handle this case right, so let's just ignore the search key 108894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // in this case. Users can just hit it again and it will work this time. 108994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return; 109094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 109194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchView == null) { 109294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng prepareSearchView(); 109394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 109494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 109594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final ActionBar actionBar = getActionBar(); 109694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 109794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Tab tab = actionBar.getSelectedTab(); 109894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 109994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // User can search during the call, but we don't want to remember the status. 110094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (tab != null && !DialpadFragment.phoneIsInUse()) { 110194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mLastManuallySelectedFragment = tab.getPosition(); 110294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 110394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 110494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.setQuery(null, true); 110594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 110694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionBar.setDisplayShowCustomEnabled(true); 110794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 110894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionBar.setDisplayShowHomeEnabled(true); 110994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionBar.setDisplayHomeAsUpEnabled(true); 111094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 111194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng updateFakeMenuButtonsVisibility(false); 111294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 111394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng for (int i = 0; i < TAB_INDEX_COUNT; i++) { 111494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng sendFragmentVisibilityChange(i, false /* not visible */ ); 111594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 111694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 111794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Show the search fragment and hide everything else. 111894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setUserVisibleHint(true); 111994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final FragmentTransaction transaction = getFragmentManager().beginTransaction(); 112094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng transaction.show(mSearchFragment); 112194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng transaction.commitAllowingStateLoss(); 112294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mViewPager.setVisibility(View.GONE); 112394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 112494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // We need to call this and onActionViewCollapsed() manually, since we are using a custom 112594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // layout instead of asking the search menu item to take care of SearchView. 112694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.onActionViewExpanded(); 112794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mInSearchUi = true; 112894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 112994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 113094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void showInputMethod(View view) { 113194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 113294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (imm != null) { 113394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (!imm.showSoftInput(view, 0)) { 113494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.w(TAG, "Failed to show soft input method."); 113594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 113694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 113794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 113894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 113994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void hideInputMethod(View view) { 114094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 114194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (imm != null && view != null) { 114294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 114394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 114494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 114594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 114694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 114794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Goes back to usual Phone UI with tags. Previously selected Tag and associated Fragment 114894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * should be automatically focused again. 114994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 115094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void exitSearchUi() { 115194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final ActionBar actionBar = getActionBar(); 115294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 115394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Hide the search fragment, if exists. 115494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchFragment != null) { 115594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchFragment.setUserVisibleHint(false); 115694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 115794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final FragmentTransaction transaction = getFragmentManager().beginTransaction(); 115894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng transaction.hide(mSearchFragment); 115994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng transaction.commitAllowingStateLoss(); 116094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 116194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 116294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // We want to hide SearchView and show Tabs. Also focus on previously selected one. 116394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionBar.setDisplayShowCustomEnabled(false); 116494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionBar.setDisplayShowHomeEnabled(false); 116594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 116694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 116794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng for (int i = 0; i < TAB_INDEX_COUNT; i++) { 116894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng sendFragmentVisibilityChange(i, i == mViewPager.getCurrentItem()); 116994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 117094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 117194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Before exiting the search screen, reset swipe state. 117294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mDuringSwipe = false; 117394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mUserTabClick = false; 117494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 117594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mViewPager.setVisibility(View.VISIBLE); 117694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 117794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng hideInputMethod(getCurrentFocus()); 117894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 117994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Request to update option menu. 118094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng invalidateOptionsMenu(); 118194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 118294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // See comments in onActionViewExpanded() 118394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchView.onActionViewCollapsed(); 118494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mInSearchUi = false; 118594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 118694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 118794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private Fragment getFragmentAt(int position) { 118894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng switch (position) { 118994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case TAB_INDEX_DIALER: 119094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mDialpadFragment; 119194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case TAB_INDEX_CALL_LOG: 119294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mCallLogFragment; 119394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case TAB_INDEX_FAVORITES: 119494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mPhoneFavoriteFragment; 119594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng default: 119694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng throw new IllegalStateException("Unknown fragment index: " + position); 119794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 119894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 119994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 120094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void sendFragmentVisibilityChange(int position, boolean visibility) { 120194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) { 120294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.d(TAG, "sendFragmentVisibiltyChange(). position: " + position 120394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng + ", visibility: " + visibility); 120494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 120594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Position can be -1 initially. See PageChangeListener. 120694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (position >= 0) { 120794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Fragment fragment = getFragmentAt(position); 120894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (fragment != null) { 120994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng fragment.setMenuVisibility(visibility); 121094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng fragment.setUserVisibleHint(visibility); 121194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 121294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 121394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 121494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 121594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 121694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Update visibility of the search button and menu button at the bottom. 121794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * They should be invisible when bottom ActionBar's real items are available, and be visible 121894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * otherwise. 121994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 122094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * @param visible True when visible. 122194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 122294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private void updateFakeMenuButtonsVisibility(boolean visible) { 122394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Note: Landscape mode does not have the fake menu and search buttons. 122494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (DEBUG) { 122594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Log.d(TAG, "updateFakeMenuButtonVisibility(" + visible + ")"); 122694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 122794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 122894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mSearchButton != null) { 122994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (visible) { 123094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchButton.setVisibility(View.VISIBLE); 123194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 123294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mSearchButton.setVisibility(View.INVISIBLE); 123394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 123494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 123594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (mMenuButton != null) { 123694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (visible && !ViewConfiguration.get(this).hasPermanentMenuKey()) { 123794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mMenuButton.setVisibility(View.VISIBLE); 123894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 123994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mMenuButton.setVisibility(View.INVISIBLE); 124094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 124194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 124294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 124394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 124494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Returns an Intent to launch Call Settings screen */ 124594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public static Intent getCallSettingsIntent() { 124694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Intent intent = new Intent(Intent.ACTION_MAIN); 124794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng intent.setClassName(PHONE_PACKAGE, CALL_SETTINGS_CLASS_NAME); 124894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 124994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return intent; 125094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 125194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 125294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 125394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng protected void onActivityResult(int requestCode, int resultCode, Intent data) { 125494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (resultCode != Activity.RESULT_OK) { 125594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return; 125694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 125794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng switch (requestCode) { 125894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng case SUBACTIVITY_ACCOUNT_FILTER: { 125994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng AccountFilterUtil.handleAccountFilterResult( 126094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mContactListFilterController, resultCode, data); 126194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 126294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng break; 126394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 126494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 126594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng} 1266