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