1b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov/*
2b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * Copyright (C) 2007 The Android Open Source Project
3b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov *
4b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * you may not use this file except in compliance with the License.
6b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * You may obtain a copy of the License at
7b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov *
8b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov *
10b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * See the License for the specific language governing permissions and
14b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * limitations under the License.
15b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov */
16b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
17b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikovpackage com.android.contacts.activities;
18b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
19a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.app.ActionBar;
20a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.app.ActionBar.LayoutParams;
2137bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuanimport android.app.Activity;
2284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikovimport android.app.Fragment;
23a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.content.Context;
24b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikovimport android.content.Intent;
25b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikovimport android.net.Uri;
26b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikovimport android.os.Bundle;
27b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
2837bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuanimport android.provider.ContactsContract.Intents.Insert;
294d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikovimport android.text.TextUtils;
30a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.util.Log;
31a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.view.LayoutInflater;
32a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.view.Menu;
33a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.view.MenuInflater;
34b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikovimport android.view.MenuItem;
35b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikovimport android.view.View;
3663c311a278cd8ba28d6d8f3b49c0ccd4dffeb57dDmitri Plotnikovimport android.view.View.OnClickListener;
37a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.view.View.OnFocusChangeListener;
38a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.view.inputmethod.InputMethodManager;
394d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikovimport android.widget.SearchView;
40a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.widget.SearchView.OnCloseListener;
41c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powellimport android.widget.SearchView.OnQueryTextListener;
42b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
43e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.ContactsActivity;
44e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R;
45821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment;
46e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.ContactPickerFragment;
47e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.ContactsIntentResolver;
48e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.ContactsRequest;
49a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.DirectoryListLoader;
50e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.EmailAddressPickerFragment;
51a953aa785610afcda67a17a1c109d09c4773ca90Chiao Chengimport com.android.contacts.list.LegacyPhoneNumberPickerFragment;
52e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.OnContactPickerActionListener;
53e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.OnEmailAddressPickerActionListener;
54821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
55e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.OnPostalAddressPickerActionListener;
56821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.PhoneNumberPickerFragment;
57e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.PostalAddressPickerFragment;
58e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.google.common.collect.Sets;
59e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
6037bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuanimport java.util.Set;
6137bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan
62b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov/**
63b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * Displays a list of contacts (or phone numbers or postal addresses) for the
64b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov * purposes of selecting one.
65b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov */
666f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikovpublic class ContactSelectionActivity extends ContactsActivity
67a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        implements View.OnCreateContextMenuListener, OnQueryTextListener, OnClickListener,
68a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                OnCloseListener, OnFocusChangeListener {
69b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    private static final String TAG = "ContactSelectionActivity";
70b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
7137bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan    private static final int SUBACTIVITY_ADD_TO_EXISTING_CONTACT = 0;
7237bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan
7384b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    private static final String KEY_ACTION_CODE = "actionCode";
744d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov    private static final int DEFAULT_DIRECTORY_RESULT_LIMIT = 20;
7584b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
7642b314030c3c9b16afc5a84805a481225a6d9de9Dmitri Plotnikov    // Delay to allow the UI to settle before making search view visible
7742b314030c3c9b16afc5a84805a481225a6d9de9Dmitri Plotnikov    private static final int FOCUS_DELAY = 200;
7842b314030c3c9b16afc5a84805a481225a6d9de9Dmitri Plotnikov
79b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    private ContactsIntentResolver mIntentResolver;
80b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    protected ContactEntryListFragment<?> mListFragment;
81b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
8284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    private int mActionCode = -1;
83b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
84b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    private ContactsRequest mRequest;
854d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov    private SearchView mSearchView;
86a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    /**
87a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa     * Can be null. If null, the "Create New Contact" button should be on the menu.
88a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa     */
89594dc44c34396fc4a3acbe9bed836648b0ad6b09Daisuke Miyakawa    private View mCreateNewContactButton;
90b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
91b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    public ContactSelectionActivity() {
92b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        mIntentResolver = new ContactsIntentResolver(this);
93b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    }
94b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
95b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    @Override
9684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    public void onAttachFragment(Fragment fragment) {
9784b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        if (fragment instanceof ContactEntryListFragment<?>) {
9884b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            mListFragment = (ContactEntryListFragment<?>) fragment;
9984b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            setupActionListener();
10084b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        }
10184b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    }
10284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
10384b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    @Override
10484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    protected void onCreate(Bundle savedState) {
10584b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        super.onCreate(savedState);
10684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
10784b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        if (savedState != null) {
10884b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            mActionCode = savedState.getInt(KEY_ACTION_CODE);
10984b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        }
110acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan
111b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        // Extract relevant information from the intent
112b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        mRequest = mIntentResolver.resolveIntent(getIntent());
113b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        if (!mRequest.isValid()) {
114b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            setResult(RESULT_CANCELED);
115b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            finish();
116b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            return;
117b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        }
118b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
119b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        Intent redirect = mRequest.getRedirectIntent();
120b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        if (redirect != null) {
121b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            // Need to start a different activity
122b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            startActivity(redirect);
123b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            finish();
124b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            return;
125b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        }
126b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
12784b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        configureActivityTitle();
1284d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov
1294d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov        setContentView(R.layout.contact_picker);
1304d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov
131a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        if (mActionCode != mRequest.getActionCode()) {
132a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mActionCode = mRequest.getActionCode();
133a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            configureListFragment();
134a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        }
135a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
136a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        prepareSearchViewAndActionBar();
1374d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov
138594dc44c34396fc4a3acbe9bed836648b0ad6b09Daisuke Miyakawa        mCreateNewContactButton = findViewById(R.id.new_contact);
139a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        if (mCreateNewContactButton != null) {
140a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            if (shouldShowCreateNewContactButton()) {
141a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                mCreateNewContactButton.setVisibility(View.VISIBLE);
142a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                mCreateNewContactButton.setOnClickListener(this);
143a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            } else {
144a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                mCreateNewContactButton.setVisibility(View.GONE);
145a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            }
146a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        }
147a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    }
14863c311a278cd8ba28d6d8f3b49c0ccd4dffeb57dDmitri Plotnikov
149a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    private boolean shouldShowCreateNewContactButton() {
150a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        return (mActionCode == ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT
151a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                || (mActionCode == ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT
152a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                        && !mRequest.isSearchMode()));
153a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    }
154a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
155a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    private void prepareSearchViewAndActionBar() {
156d1af8adb1acc56f6c1709d38efe69be9497356a9Daniel Lehmann        // Postal address pickers (and legacy pickers) don't support search, so just show
157d1af8adb1acc56f6c1709d38efe69be9497356a9Daniel Lehmann        // "HomeAsUp" button and title.
158d1af8adb1acc56f6c1709d38efe69be9497356a9Daniel Lehmann        if (mRequest.getActionCode() == ContactsRequest.ACTION_PICK_POSTAL ||
159d1af8adb1acc56f6c1709d38efe69be9497356a9Daniel Lehmann                mRequest.isLegacyCompatibilityMode()) {
160a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            findViewById(R.id.search_view).setVisibility(View.GONE);
161a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            final ActionBar actionBar = getActionBar();
162a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            if (actionBar != null) {
163a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                actionBar.setDisplayShowHomeEnabled(true);
164a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                actionBar.setDisplayHomeAsUpEnabled(true);
165a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                actionBar.setDisplayShowTitleEnabled(true);
166a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            }
167a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            return;
168a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        }
169a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
170a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        // If ActionBar is available, show SearchView on it. If not, show SearchView inside the
171a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        // Activity's layout.
172a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        final ActionBar actionBar = getActionBar();
173a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        if (actionBar != null) {
174a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            final View searchViewOnLayout = findViewById(R.id.search_view);
175a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            if (searchViewOnLayout != null) {
176a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                searchViewOnLayout.setVisibility(View.GONE);
177a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            }
178a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
179a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            final View searchViewContainer = LayoutInflater.from(actionBar.getThemedContext())
180a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                    .inflate(R.layout.custom_action_bar, null);
181a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView = (SearchView) searchViewContainer.findViewById(R.id.search_view);
182a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
183a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            // In order to make the SearchView look like "shown via search menu", we need to
184a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            // manually setup its state. See also DialtactsActivity.java and ActionBarAdapter.java.
185a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView.setIconifiedByDefault(true);
186a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView.setQueryHint(getString(R.string.hint_findContacts));
187a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView.setIconified(false);
188a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
189a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView.setOnQueryTextListener(this);
190a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView.setOnCloseListener(this);
191a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView.setOnQueryTextFocusChangeListener(this);
192a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
193a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            actionBar.setCustomView(searchViewContainer,
194a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                    new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
195a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            actionBar.setDisplayShowCustomEnabled(true);
196a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            actionBar.setDisplayShowHomeEnabled(true);
197a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            actionBar.setDisplayHomeAsUpEnabled(true);
198d66d4158d832ceec0e7754908b0c5541311613d4Dmitri Plotnikov        } else {
199a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView = (SearchView) findViewById(R.id.search_view);
200a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView.setQueryHint(getString(R.string.hint_findContacts));
201a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView.setOnQueryTextListener(this);
202a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
203d66d4158d832ceec0e7754908b0c5541311613d4Dmitri Plotnikov            // This is a hack to prevent the search view from grabbing focus
204d66d4158d832ceec0e7754908b0c5541311613d4Dmitri Plotnikov            // at this point.  If search view were visible, it would always grabs focus
205d66d4158d832ceec0e7754908b0c5541311613d4Dmitri Plotnikov            // because it is the first focusable widget in the window.
206d66d4158d832ceec0e7754908b0c5541311613d4Dmitri Plotnikov            mSearchView.setVisibility(View.INVISIBLE);
20742b314030c3c9b16afc5a84805a481225a6d9de9Dmitri Plotnikov            mSearchView.postDelayed(new Runnable() {
208d66d4158d832ceec0e7754908b0c5541311613d4Dmitri Plotnikov                @Override
209d66d4158d832ceec0e7754908b0c5541311613d4Dmitri Plotnikov                public void run() {
210d66d4158d832ceec0e7754908b0c5541311613d4Dmitri Plotnikov                    mSearchView.setVisibility(View.VISIBLE);
211d66d4158d832ceec0e7754908b0c5541311613d4Dmitri Plotnikov                }
21242b314030c3c9b16afc5a84805a481225a6d9de9Dmitri Plotnikov            }, FOCUS_DELAY);
213d66d4158d832ceec0e7754908b0c5541311613d4Dmitri Plotnikov        }
214004a30319057436182d98e530fb424f185cd2adeDaisuke Miyakawa
215004a30319057436182d98e530fb424f185cd2adeDaisuke Miyakawa        // Clear focus and suppress keyboard show-up.
216004a30319057436182d98e530fb424f185cd2adeDaisuke Miyakawa        mSearchView.clearFocus();
217a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    }
218a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
219a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    @Override
220a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    public boolean onCreateOptionsMenu(Menu menu) {
221a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        // If we want "Create New Contact" button but there's no such a button in the layout,
222a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        // try showing a menu for it.
223a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        if (shouldShowCreateNewContactButton() && mCreateNewContactButton == null) {
224a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            MenuInflater inflater = getMenuInflater();
225a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            inflater.inflate(R.menu.contact_picker_options, menu);
226a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        }
227a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        return true;
228a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    }
229a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
230a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    @Override
231a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    public boolean onOptionsItemSelected(MenuItem item) {
232a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        switch (item.getItemId()) {
233a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            case android.R.id.home:
234a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                // Go back to previous screen, intending "cancel"
235a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                setResult(RESULT_CANCELED);
236a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                finish();
237a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                return true;
238a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            case R.id.create_new_contact: {
239a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                startCreateNewContactActivity();
240a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                return true;
241a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            }
242a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        }
243a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        return super.onOptionsItemSelected(item);
24484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    }
245b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
24684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    @Override
24784b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    protected void onSaveInstanceState(Bundle outState) {
24884b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        super.onSaveInstanceState(outState);
24984b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        outState.putInt(KEY_ACTION_CODE, mActionCode);
250b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    }
251b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
25284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    private void configureActivityTitle() {
253b7a1da621e7ba54a4e9c97a14f35b2650b8e7471Makoto Onuki        if (!TextUtils.isEmpty(mRequest.getActivityTitle())) {
25484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            setTitle(mRequest.getActivityTitle());
25584b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            return;
25684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        }
25784b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
25884b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        int actionCode = mRequest.getActionCode();
25984b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        switch (actionCode) {
26084b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            case ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT: {
26184b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                setTitle(R.string.contactPickerActivityTitle);
26284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                break;
26384b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            }
26484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
26584b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            case ContactsRequest.ACTION_PICK_CONTACT: {
26684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                setTitle(R.string.contactPickerActivityTitle);
26784b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                break;
26884b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            }
26984b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
27084b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            case ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT: {
27184b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                setTitle(R.string.contactPickerActivityTitle);
27284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                break;
27384b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            }
27484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
27584b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            case ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT: {
27684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                setTitle(R.string.shortcutActivityTitle);
27784b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                break;
27884b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            }
27984b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
28084b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            case ContactsRequest.ACTION_PICK_PHONE: {
28184b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                setTitle(R.string.contactPickerActivityTitle);
28284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                break;
28384b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            }
28484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
285c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann            case ContactsRequest.ACTION_PICK_EMAIL: {
286c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann                setTitle(R.string.contactPickerActivityTitle);
287c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann                break;
288c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann            }
289c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann
29084b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            case ContactsRequest.ACTION_CREATE_SHORTCUT_CALL: {
29184b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                setTitle(R.string.callShortcutActivityTitle);
29284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                break;
29384b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            }
29484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
29584b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            case ContactsRequest.ACTION_CREATE_SHORTCUT_SMS: {
29684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                setTitle(R.string.messageShortcutActivityTitle);
29784b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                break;
29884b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            }
29984b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
30084b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            case ContactsRequest.ACTION_PICK_POSTAL: {
30184b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                setTitle(R.string.contactPickerActivityTitle);
30284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                break;
30384b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            }
30484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        }
30584b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    }
30684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
307b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    /**
308b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov     * Creates the fragment based on the current request.
309b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov     */
31084b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    public void configureListFragment() {
311b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        switch (mActionCode) {
312b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            case ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT: {
31386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov                ContactPickerFragment fragment = new ContactPickerFragment();
31486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov                fragment.setEditMode(true);
31586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov                fragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
316b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                mListFragment = fragment;
317b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                break;
318b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            }
319b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
320b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            case ContactsRequest.ACTION_PICK_CONTACT: {
321b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                ContactPickerFragment fragment = new ContactPickerFragment();
3220a4d2258411478c7c78790cd55ba25c99f588c26Dave Santoro                fragment.setIncludeProfile(mRequest.shouldIncludeProfile());
323b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                mListFragment = fragment;
324b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                break;
325b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            }
326b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
327b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            case ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT: {
328b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                ContactPickerFragment fragment = new ContactPickerFragment();
329b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                mListFragment = fragment;
330b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                break;
331b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            }
332b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
333b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            case ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT: {
334b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                ContactPickerFragment fragment = new ContactPickerFragment();
335b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                fragment.setShortcutRequested(true);
336b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                mListFragment = fragment;
337b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                break;
338b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            }
339b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
340b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            case ContactsRequest.ACTION_PICK_PHONE: {
341a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng                PhoneNumberPickerFragment fragment = getPhoneNumberPickerFragment(mRequest);
342b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                mListFragment = fragment;
343b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                break;
344b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            }
345b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
346c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann            case ContactsRequest.ACTION_PICK_EMAIL: {
347c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann                mListFragment = new EmailAddressPickerFragment();
348c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann                break;
349c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann            }
350c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann
351b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            case ContactsRequest.ACTION_CREATE_SHORTCUT_CALL: {
352a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng                PhoneNumberPickerFragment fragment = getPhoneNumberPickerFragment(mRequest);
353b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                fragment.setShortcutAction(Intent.ACTION_CALL);
354b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
355b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                mListFragment = fragment;
356b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                break;
357b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            }
358b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
359b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            case ContactsRequest.ACTION_CREATE_SHORTCUT_SMS: {
360a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng                PhoneNumberPickerFragment fragment = getPhoneNumberPickerFragment(mRequest);
361b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                fragment.setShortcutAction(Intent.ACTION_SENDTO);
362b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
363b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                mListFragment = fragment;
364b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                break;
365b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            }
366b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
367b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            case ContactsRequest.ACTION_PICK_POSTAL: {
368b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                PostalAddressPickerFragment fragment = new PostalAddressPickerFragment();
369b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                mListFragment = fragment;
370b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                break;
371b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            }
372b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
373b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            default:
374b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov                throw new IllegalStateException("Invalid action code: " + mActionCode);
375b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        }
37684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
377a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng        // Setting compatibility is no longer needed for PhoneNumberPickerFragment since that logic
378a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng        // has been separated into LegacyPhoneNumberPickerFragment.  But we still need to set
379a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng        // compatibility for other fragments.
38084b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        mListFragment.setLegacyCompatibilityMode(mRequest.isLegacyCompatibilityMode());
3814d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov        mListFragment.setDirectoryResultLimit(DEFAULT_DIRECTORY_RESULT_LIMIT);
3824d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov
3833ed426c842a68895a759548fef87bac359f937bbDianne Hackborn        getFragmentManager().beginTransaction()
38484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                .replace(R.id.list_container, mListFragment)
3854b25da79091157935042d2942a8961ceba92166fMinh Pham                .commitAllowingStateLoss();
38684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    }
38784b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov
388a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng    private PhoneNumberPickerFragment getPhoneNumberPickerFragment(ContactsRequest request) {
389a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng        if (mRequest.isLegacyCompatibilityMode()) {
390a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng            return new LegacyPhoneNumberPickerFragment();
391a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng        } else {
392a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng            return new PhoneNumberPickerFragment();
393a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng        }
394a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng    }
395a953aa785610afcda67a17a1c109d09c4773ca90Chiao Cheng
39684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov    public void setupActionListener() {
3976e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        if (mListFragment instanceof ContactPickerFragment) {
39884b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            ((ContactPickerFragment) mListFragment).setOnContactPickerActionListener(
39984b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                    new ContactPickerActionListener());
40084b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        } else if (mListFragment instanceof PhoneNumberPickerFragment) {
40184b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            ((PhoneNumberPickerFragment) mListFragment).setOnPhoneNumberPickerActionListener(
40284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                    new PhoneNumberPickerActionListener());
40384b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        } else if (mListFragment instanceof PostalAddressPickerFragment) {
40484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            ((PostalAddressPickerFragment) mListFragment).setOnPostalAddressPickerActionListener(
40584b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov                    new PostalAddressPickerActionListener());
406c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann        } else if (mListFragment instanceof EmailAddressPickerFragment) {
407c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann            ((EmailAddressPickerFragment) mListFragment).setOnEmailAddressPickerActionListener(
408c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann                    new EmailAddressPickerActionListener());
40984b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        } else {
41084b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov            throw new IllegalStateException("Unsupported list fragment type: " + mListFragment);
41184b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        }
412b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    }
413b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
414b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    private final class ContactPickerActionListener implements OnContactPickerActionListener {
415e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
416b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        public void onCreateNewContactAction() {
417a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            startCreateNewContactActivity();
418b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        }
419b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
420e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
42186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        public void onEditContactAction(Uri contactLookupUri) {
42237bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            Bundle extras = getIntent().getExtras();
42337bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            if (launchAddToContactDialog(extras)) {
42437bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                // Show a confirmation dialog to add the value(s) to the existing contact.
42537bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                Intent intent = new Intent(ContactSelectionActivity.this,
42637bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                        ConfirmAddDetailActivity.class);
42737bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                intent.setData(contactLookupUri);
42837bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                if (extras != null) {
429acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan                    // First remove name key if present because the dialog does not support name
430acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan                    // editing. This is fine because the user wants to add information to an
431acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan                    // existing contact, who should already have a name and we wouldn't want to
432acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan                    // override the name.
433acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan                    extras.remove(Insert.NAME);
43437bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                    intent.putExtras(extras);
43537bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                }
436acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan
43737bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                // Wait for the activity result because we want to keep the picker open (in case the
43837bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                // user cancels adding the info to a contact and wants to pick someone else).
43937bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                startActivityForResult(intent, SUBACTIVITY_ADD_TO_EXISTING_CONTACT);
44037bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            } else {
44137bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                // Otherwise launch the full contact editor.
44237bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                startActivityAndForwardResult(new Intent(Intent.ACTION_EDIT, contactLookupUri));
44337bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            }
44486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        }
44586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
44686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        @Override
447b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        public void onPickContactAction(Uri contactUri) {
448d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov            returnPickerResult(contactUri);
449b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        }
450b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
451e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
452b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        public void onShortcutIntentCreated(Intent intent) {
453d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov            returnPickerResult(intent);
454b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        }
45537bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan
45637bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan        /**
45737bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan         * Returns true if is a single email or single phone number provided in the {@link Intent}
45837bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan         * extras bundle so that a pop-up confirmation dialog can be used to add the data to
45937bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan         * a contact. Otherwise return false if there are other intent extras that require launching
460acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan         * the full contact editor. Ignore extras with the key {@link Insert.NAME} because names
461acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan         * are a special case and we typically don't want to replace the name of an existing
462acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan         * contact.
46337bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan         */
46437bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan        private boolean launchAddToContactDialog(Bundle extras) {
46537bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            if (extras == null) {
46637bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                return false;
46737bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            }
468acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan
469acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan            // Copy extras because the set may be modified in the next step
470acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan            Set<String> intentExtraKeys = Sets.newHashSet();
471acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan            intentExtraKeys.addAll(extras.keySet());
472acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan
473acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan            // Ignore name key because this is an existing contact.
474acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan            if (intentExtraKeys.contains(Insert.NAME)) {
475acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan                intentExtraKeys.remove(Insert.NAME);
476acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan            }
477acd8e8ba4e8e3595a5d12b47b5972aff4a63e131Katherine Kuan
47837bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            int numIntentExtraKeys = intentExtraKeys.size();
47937bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            if (numIntentExtraKeys == 2) {
48037bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                boolean hasPhone = intentExtraKeys.contains(Insert.PHONE) &&
48137bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                        intentExtraKeys.contains(Insert.PHONE_TYPE);
48237bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                boolean hasEmail = intentExtraKeys.contains(Insert.EMAIL) &&
48337bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                        intentExtraKeys.contains(Insert.EMAIL_TYPE);
48437bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                return hasPhone || hasEmail;
48537bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            } else if (numIntentExtraKeys == 1) {
48637bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                return intentExtraKeys.contains(Insert.PHONE) ||
48737bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                        intentExtraKeys.contains(Insert.EMAIL);
48837bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            }
48937bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            // Having 0 or more than 2 intent extra keys means that we should launch
49037bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            // the full contact editor to properly handle the intent extras.
49137bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            return false;
49237bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan        }
493b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    }
494b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
495b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    private final class PhoneNumberPickerActionListener implements
496b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            OnPhoneNumberPickerActionListener {
497e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
498b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        public void onPickPhoneNumberAction(Uri dataUri) {
499d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov            returnPickerResult(dataUri);
500b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        }
501b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
502e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
503b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        public void onShortcutIntentCreated(Intent intent) {
504d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov            returnPickerResult(intent);
505b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        }
50688f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa
50788f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa        public void onHomeInActionBarSelected() {
50888f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa            ContactSelectionActivity.this.onBackPressed();
50988f70fc83cdd119e85d9890b2875faf5c981b47dDaisuke Miyakawa        }
510b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    }
511b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
512b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    private final class PostalAddressPickerActionListener implements
513b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            OnPostalAddressPickerActionListener {
514e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
515b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        public void onPickPostalAddressAction(Uri dataUri) {
516d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov            returnPickerResult(dataUri);
517b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        }
518b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    }
519b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
520c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann    private final class EmailAddressPickerActionListener implements
521c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann            OnEmailAddressPickerActionListener {
522c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann        @Override
523c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann        public void onPickEmailAddressAction(Uri dataUri) {
524c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann            returnPickerResult(dataUri);
525c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann        }
526c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann    }
527c86ace78ca5c2e10dcb001a916386c8a9865e230Daniel Lehmann
528b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    public void startActivityAndForwardResult(final Intent intent) {
529b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
530b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
531b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        // Forward extras to the new activity
532b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        Bundle extras = getIntent().getExtras();
533b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        if (extras != null) {
534b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov            intent.putExtras(extras);
535b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        }
536b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        startActivity(intent);
537b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        finish();
538b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    }
539b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
540b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    @Override
541c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powell    public boolean onQueryTextChange(String newText) {
5425251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov        mListFragment.setQueryString(newText, true);
5434d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov        return false;
544b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    }
545b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov
546b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    @Override
547c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powell    public boolean onQueryTextSubmit(String query) {
548b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov        return false;
549b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov    }
55063c311a278cd8ba28d6d8f3b49c0ccd4dffeb57dDmitri Plotnikov
551a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    @Override
552a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    public boolean onClose() {
553a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        if (!TextUtils.isEmpty(mSearchView.getQuery())) {
554a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mSearchView.setQuery(null, true);
555a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        }
556a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        return true;
557a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    }
558a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
559a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    @Override
560a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    public void onFocusChange(View view, boolean hasFocus) {
561a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        switch (view.getId()) {
562a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            case R.id.search_view: {
563a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                if (hasFocus) {
564a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                    showInputMethod(mSearchView.findFocus());
565a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                }
566a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            }
567a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        }
568a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    }
569a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
570d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov    public void returnPickerResult(Uri data) {
571d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov        Intent intent = new Intent();
572d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov        intent.setData(data);
573d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov        returnPickerResult(intent);
574d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov    }
575d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov
576d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov    public void returnPickerResult(Intent intent) {
577d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
578d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov        setResult(RESULT_OK, intent);
579d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov        finish();
580d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov    }
581d11bca23766abf3325cebbec5b1b225e3fe4663fDmitri Plotnikov
58263c311a278cd8ba28d6d8f3b49c0ccd4dffeb57dDmitri Plotnikov    @Override
583a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    public void onClick(View view) {
584a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        switch (view.getId()) {
585a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            case R.id.new_contact: {
586a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                startCreateNewContactActivity();
587a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                break;
588a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            }
589a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        }
590a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    }
591a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
592a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    private void startCreateNewContactActivity() {
593a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
59464cdc91cae0e08b7d225cd60a91cfc4db85c915dJosh Gargus        intent.putExtra(ContactEditorActivity.INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
595a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        startActivityAndForwardResult(intent);
596a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    }
597a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
598a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    private void showInputMethod(View view) {
599a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        final InputMethodManager imm = (InputMethodManager)
600a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                getSystemService(Context.INPUT_METHOD_SERVICE);
601a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        if (imm != null) {
602a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            if (!imm.showSoftInput(view, 0)) {
603a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                Log.w(TAG, "Failed to show soft input method.");
604a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            }
60563c311a278cd8ba28d6d8f3b49c0ccd4dffeb57dDmitri Plotnikov        }
60663c311a278cd8ba28d6d8f3b49c0ccd4dffeb57dDmitri Plotnikov    }
60737bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan
60837bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan    @Override
60937bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
61037bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan        super.onActivityResult(requestCode, resultCode, data);
61137bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan        if (requestCode == SUBACTIVITY_ADD_TO_EXISTING_CONTACT) {
61237bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            if (resultCode == Activity.RESULT_OK) {
61337bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                if (data != null) {
61437bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                    startActivity(data);
61537bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                }
61637bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan                finish();
61737bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan            }
61837bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan        }
61937bddc2fa266fa0378fcd85ac5047b1fb0af2dc0Katherine Kuan    }
620b979b4294c14f2bc562a5279910bafb7ac1a92b4Dmitri Plotnikov}
621