1501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov/*
2e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project
3501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov *
4501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov * you may not use this file except in compliance with the License.
6501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov * You may obtain a copy of the License at
7501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov *
8501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov *
10501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov * See the License for the specific language governing permissions and
14501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov * limitations under the License.
15501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov */
16501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
17d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikovpackage com.android.contacts.activities;
18501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
196e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
20a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.app.ActionBar;
21ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawaimport android.app.ActionBar.LayoutParams;
22d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikovimport android.app.Fragment;
23ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawaimport android.content.Context;
24501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikovimport android.content.Intent;
25501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikovimport android.net.Uri;
26e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.os.Bundle;
27501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikovimport android.provider.ContactsContract;
28ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawaimport android.text.TextUtils;
29501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikovimport android.util.Log;
30ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawaimport android.view.LayoutInflater;
31a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawaimport android.view.MenuItem;
32ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawaimport android.view.View;
33ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawaimport android.view.View.OnFocusChangeListener;
34ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawaimport android.view.inputmethod.InputMethodManager;
35ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawaimport android.widget.SearchView;
36ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawaimport android.widget.SearchView.OnCloseListener;
37ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawaimport android.widget.SearchView.OnQueryTextListener;
38501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
39e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.ContactsActivity;
40e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R;
41821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment;
42e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.JoinContactListFragment;
43e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.OnContactPickerActionListener;
44e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
45501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov/**
46501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov * An activity that shows a list of contacts that can be joined with the target contact.
47501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov */
48ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawapublic class JoinContactActivity extends ContactsActivity
49ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        implements OnQueryTextListener, OnCloseListener, OnFocusChangeListener {
50501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
51501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov    private static final String TAG = "JoinContactActivity";
52501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
53501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov    /**
54501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov     * The action for the join contact activity.
55501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov     * <p>
56501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov     * Input: extra field {@link #EXTRA_TARGET_CONTACT_ID} is the aggregate ID.
57501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov     * TODO: move to {@link ContactsContract}.
58501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov     */
59501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov    public static final String JOIN_CONTACT = "com.android.contacts.action.JOIN_CONTACT";
60501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
61501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov    /**
62501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov     * Used with {@link #JOIN_CONTACT} to give it the target for aggregation.
63501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov     * <p>
64501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov     * Type: LONG
65501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov     */
66501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov    public static final String EXTRA_TARGET_CONTACT_ID = "com.android.contacts.action.CONTACT_ID";
67501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
68d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    private static final String KEY_TARGET_CONTACT_ID = "targetContactId";
69d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov
70501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov    private long mTargetContactId;
71501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
72e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    private JoinContactListFragment mListFragment;
73ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    private SearchView mSearchView;
74e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov
75501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov    @Override
76d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    public void onAttachFragment(Fragment fragment) {
77d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov        if (fragment instanceof JoinContactListFragment) {
78d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov            mListFragment = (JoinContactListFragment) fragment;
79d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov            setupActionListener();
80d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov        }
81d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    }
82d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov
83d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    @Override
84e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    protected void onCreate(Bundle savedInstanceState) {
85e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        super.onCreate(savedInstanceState);
86e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
87e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        Intent intent = getIntent();
88501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov        mTargetContactId = intent.getLongExtra(EXTRA_TARGET_CONTACT_ID, -1);
89501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov        if (mTargetContactId == -1) {
90501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov            Log.e(TAG, "Intent " + intent.getAction() + " is missing required extra: "
91501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov                    + EXTRA_TARGET_CONTACT_ID);
92501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov            setResult(RESULT_CANCELED);
93501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov            finish();
94e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov            return;
95501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov        }
9659fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov
97d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov        setContentView(R.layout.join_contact_picker);
98d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov        setTitle(R.string.titleJoinContactDataWith);
99d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov
100d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov        if (mListFragment == null) {
101d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov            mListFragment = new JoinContactListFragment();
102d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov
103d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov            getFragmentManager().beginTransaction()
104d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov                    .replace(R.id.list_container, mListFragment)
1054b25da79091157935042d2942a8961ceba92166fMinh Pham                    .commitAllowingStateLoss();
106d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov        }
107a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
108ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        prepareSearchViewAndActionBar();
109d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    }
110d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov
111a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    private void setupActionListener() {
112e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        mListFragment.setTargetContactId(mTargetContactId);
113e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        mListFragment.setOnContactPickerActionListener(new OnContactPickerActionListener() {
11486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            @Override
115e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov            public void onPickContactAction(Uri contactUri) {
116e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov                Intent intent = new Intent(null, contactUri);
117e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov                setResult(RESULT_OK, intent);
118e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov                finish();
119501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov            }
120501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
12186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            @Override
122e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov            public void onShortcutIntentCreated(Intent intent) {
123501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov            }
124501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
12586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            @Override
126e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov            public void onCreateNewContactAction() {
127e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov            }
12886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
12986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            @Override
13086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            public void onEditContactAction(Uri contactLookupUri) {
13186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            }
132e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        });
133d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    }
134501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov
135ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    private void prepareSearchViewAndActionBar() {
136ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        final ActionBar actionBar = getActionBar();
137ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        if (actionBar != null) {
138ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            final View searchViewOnLayout = findViewById(R.id.search_view);
139ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            if (searchViewOnLayout != null) {
140ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                searchViewOnLayout.setVisibility(View.GONE);
141ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            }
142ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
143ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            final View searchViewLayout = LayoutInflater.from(actionBar.getThemedContext())
144ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                    .inflate(R.layout.custom_action_bar, null);
145ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView = (SearchView) searchViewLayout.findViewById(R.id.search_view);
146ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
147ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            // In order to make the SearchView look like "shown via search menu", we need to
148ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            // manually setup its state. See also DialtactsActivity.java and ActionBarAdapter.java.
149ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView.setIconifiedByDefault(true);
150ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView.setQueryHint(getString(R.string.hint_findContacts));
151ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView.setIconified(false);
152ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
153ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView.setOnQueryTextListener(this);
154ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView.setOnCloseListener(this);
155ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView.setOnQueryTextFocusChangeListener(this);
156ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
157ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            actionBar.setCustomView(searchViewLayout,
158ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                    new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
159ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            actionBar.setDisplayShowCustomEnabled(true);
160ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            actionBar.setDisplayShowHomeEnabled(true);
161ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            actionBar.setDisplayHomeAsUpEnabled(true);
162ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        } else {
163ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView = (SearchView) findViewById(R.id.search_view);
164ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView.setQueryHint(getString(R.string.hint_findContacts));
165ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView.setOnQueryTextListener(this);
166ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView.setOnQueryTextFocusChangeListener(this);
167ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        }
168ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
169ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        // Clear focus and suppress keyboard show-up.
170ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        mSearchView.clearFocus();
171ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    }
172ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
173ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    @Override
174ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    public boolean onQueryTextChange(String newText) {
175ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        mListFragment.setQueryString(newText, true);
176ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        return false;
177ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    }
178ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
179ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    @Override
180ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    public boolean onQueryTextSubmit(String query) {
181ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        return false;
182ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    }
183ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
184ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    @Override
185ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    public boolean onClose() {
186ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        if (!TextUtils.isEmpty(mSearchView.getQuery())) {
187ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            mSearchView.setQuery(null, true);
188ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        }
189ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        return true;
190ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    }
191ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
192ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    @Override
193ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    public void onFocusChange(View view, boolean hasFocus) {
194ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        switch (view.getId()) {
195ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            case R.id.search_view: {
196ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                if (hasFocus) {
197ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                    showInputMethod(mSearchView.findFocus());
198ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                }
199ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            }
200ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        }
201ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    }
202ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
203d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    @Override
204a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    public boolean onOptionsItemSelected(MenuItem item) {
205a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        switch (item.getItemId()) {
206a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            case android.R.id.home:
207a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                // Go back to previous screen, intending "cancel"
208a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                setResult(RESULT_CANCELED);
209a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                finish();
210a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                return true;
211a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        }
212a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        return super.onOptionsItemSelected(item);
213a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    }
214a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa
215a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    @Override
216d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    protected void onSaveInstanceState(Bundle outState) {
217d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov        super.onSaveInstanceState(outState);
218d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov        outState.putLong(KEY_TARGET_CONTACT_ID, mTargetContactId);
219d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    }
220d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov
221d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    @Override
222d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov    protected void onRestoreInstanceState(Bundle savedInstanceState) {
223d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov        super.onRestoreInstanceState(savedInstanceState);
224d21ddb2c96e71f43eaf7addc25e163181d1ca87dDmitri Plotnikov        mTargetContactId = savedInstanceState.getLong(KEY_TARGET_CONTACT_ID);
225501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov    }
226e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov
227e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    @Override
228e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
229e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        if (requestCode == ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER
230e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov                && resultCode == RESULT_OK) {
231e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov            mListFragment.onPickerResult(data);
232e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        }
233e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    }
234ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa
235ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    private void showInputMethod(View view) {
236ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        final InputMethodManager imm = (InputMethodManager)
237ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                getSystemService(Context.INPUT_METHOD_SERVICE);
238ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        if (imm != null) {
239ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            if (!imm.showSoftInput(view, 0)) {
240ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                Log.w(TAG, "Failed to show soft input method.");
241ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            }
242ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        }
243ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa    }
244501b7eac6f85c4100fbd1b00d7c7841fe6472e7cDmitri Plotnikov}
245