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