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