189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang/* 289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * Copyright (C) 2015 The Android Open Source Project 389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * 489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * Licensed under the Apache License, Version 2.0 (the "License"); you may not 589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * use this file except in compliance with the License. You may obtain a copy of 689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * the License at 789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * 889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * http://www.apache.org/licenses/LICENSE-2.0 989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * 1089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * Unless required by applicable law or agreed to in writing, software 1189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 1289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 1389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * License for the specific language governing permissions and limitations under 1489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * the License. 1589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang */ 1689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 1789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangpackage com.android.deskclock.actionbarmenu; 1889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 1989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangimport android.os.Bundle; 2089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangimport android.support.v4.view.MenuItemCompat; 2189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangimport android.support.v7.widget.SearchView; 2289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangimport android.support.v7.widget.SearchView.OnQueryTextListener; 2389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangimport android.view.Menu; 2489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangimport android.view.MenuItem; 2589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangimport android.view.View; 2689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangimport android.view.inputmethod.EditorInfo; 2789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 2889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangimport com.android.deskclock.R; 2989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 3089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang/** 3189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * {@link MenuItemController} for search menu. 3289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang */ 3389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhangpublic final class SearchMenuItemController extends AbstractMenuItemController { 3489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 3589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang private static final String KEY_SEARCH_QUERY = "search_query"; 3689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang private static final String KEY_SEARCH_MODE = "search_mode"; 3789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang private static final int SEARCH_MENU_RES_ID = R.id.menu_item_search; 3889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang private final SearchView.OnQueryTextListener mQueryListener; 3989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang private final SearchModeChangeListener mSearchModeChangeListener; 4089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang private String mQuery = ""; 4189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang private boolean mSearchMode; 4289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 4389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang public SearchMenuItemController(OnQueryTextListener queryListener, Bundle savedState) { 4489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang mSearchModeChangeListener = new SearchModeChangeListener(); 4589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang mQueryListener = queryListener; 4689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang if (savedState != null) { 4789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang mSearchMode = savedState.getBoolean(KEY_SEARCH_MODE, false); 4889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang mQuery = savedState.getString(KEY_SEARCH_QUERY, ""); 4989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 5089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 5189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 5289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang public void saveInstance(Bundle outState) { 5389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang outState.putString(KEY_SEARCH_QUERY, mQuery); 5489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang outState.putBoolean(KEY_SEARCH_MODE, mSearchMode); 5589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 5689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 5789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang @Override 5889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang public int getId() { 5989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang return SEARCH_MENU_RES_ID; 6089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 6189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 6289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang @Override 6389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang public void setInitialState(Menu menu) { 6489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang super.setInitialState(menu); 6589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang final MenuItem search = menu.findItem(SEARCH_MENU_RES_ID); 6689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang final SearchView searchView = (SearchView) MenuItemCompat.getActionView(search); 6789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang searchView.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); 6889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang searchView.setQuery(mQuery, false); 6989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang searchView.setOnCloseListener(mSearchModeChangeListener); 7089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang searchView.setOnSearchClickListener(mSearchModeChangeListener); 7189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang searchView.setOnQueryTextListener(mQueryListener); 7289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang if (mSearchMode) { 7389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang searchView.requestFocus(); 7489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang searchView.setIconified(false); 7589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 7689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 7789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 7889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang @Override 7989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang public void showMenuItem(Menu menu) { 8089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang menu.findItem(SEARCH_MENU_RES_ID).setVisible(true); 8189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 8289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 8389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang @Override 8489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang public boolean handleMenuItemClick(MenuItem item) { 8589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang // The search view is handled by {@link #mSearchListener}. Skip handling here. 8689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang return false; 8789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 8889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 8989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang public String getQueryText() { 9089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang return mQuery; 9189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 9289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 9389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang public void setQueryText(String query) { 9489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang mQuery = query; 9589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 9689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 9789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang /** 9889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang * Listener for user actions on search view. 9989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang */ 10089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang private final class SearchModeChangeListener implements View.OnClickListener, 10189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang SearchView.OnCloseListener { 10289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang @Override 10389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang public void onClick(View v) { 10489b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang mSearchMode = true; 10589b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 10689b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang 10789b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang @Override 10889b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang public boolean onClose() { 10989b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang mSearchMode = false; 11089b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang return false; 11189b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 11289b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang } 11389b52a96f4aef42bf423a7f18b0c124945ec0ec3Fan Zhang} 114