Home | History | Annotate | Download | only in actionbarmenu
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
      5  * use this file except in compliance with the License. You may obtain a copy of
      6  * the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     13  * License for the specific language governing permissions and limitations under
     14  * the License.
     15  */
     16 
     17 package com.android.deskclock.actionbarmenu;
     18 
     19 import android.os.Bundle;
     20 import android.support.v4.view.MenuItemCompat;
     21 import android.support.v7.widget.SearchView;
     22 import android.support.v7.widget.SearchView.OnQueryTextListener;
     23 import android.view.Menu;
     24 import android.view.MenuItem;
     25 import android.view.View;
     26 import android.view.inputmethod.EditorInfo;
     27 
     28 import com.android.deskclock.R;
     29 
     30 /**
     31  * {@link MenuItemController} for search menu.
     32  */
     33 public final class SearchMenuItemController extends AbstractMenuItemController {
     34 
     35     private static final String KEY_SEARCH_QUERY = "search_query";
     36     private static final String KEY_SEARCH_MODE = "search_mode";
     37     private static final int SEARCH_MENU_RES_ID = R.id.menu_item_search;
     38     private final SearchView.OnQueryTextListener mQueryListener;
     39     private final SearchModeChangeListener mSearchModeChangeListener;
     40     private String mQuery = "";
     41     private boolean mSearchMode;
     42 
     43     public SearchMenuItemController(OnQueryTextListener queryListener, Bundle savedState) {
     44         mSearchModeChangeListener = new SearchModeChangeListener();
     45         mQueryListener = queryListener;
     46         if (savedState != null) {
     47             mSearchMode = savedState.getBoolean(KEY_SEARCH_MODE, false);
     48             mQuery = savedState.getString(KEY_SEARCH_QUERY, "");
     49         }
     50     }
     51 
     52     public void saveInstance(Bundle outState) {
     53         outState.putString(KEY_SEARCH_QUERY, mQuery);
     54         outState.putBoolean(KEY_SEARCH_MODE, mSearchMode);
     55     }
     56 
     57     @Override
     58     public int getId() {
     59         return SEARCH_MENU_RES_ID;
     60     }
     61 
     62     @Override
     63     public void setInitialState(Menu menu) {
     64         super.setInitialState(menu);
     65         final MenuItem search = menu.findItem(SEARCH_MENU_RES_ID);
     66         final SearchView searchView = (SearchView) MenuItemCompat.getActionView(search);
     67         searchView.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
     68         searchView.setQuery(mQuery, false);
     69         searchView.setOnCloseListener(mSearchModeChangeListener);
     70         searchView.setOnSearchClickListener(mSearchModeChangeListener);
     71         searchView.setOnQueryTextListener(mQueryListener);
     72         if (mSearchMode) {
     73             searchView.requestFocus();
     74             searchView.setIconified(false);
     75         }
     76     }
     77 
     78     @Override
     79     public void showMenuItem(Menu menu) {
     80         menu.findItem(SEARCH_MENU_RES_ID).setVisible(true);
     81     }
     82 
     83     @Override
     84     public boolean handleMenuItemClick(MenuItem item) {
     85         // The search view is handled by {@link #mSearchListener}. Skip handling here.
     86         return false;
     87     }
     88 
     89     public String getQueryText() {
     90         return mQuery;
     91     }
     92 
     93     public void setQueryText(String query) {
     94         mQuery = query;
     95     }
     96 
     97     /**
     98      * Listener for user actions on search view.
     99      */
    100     private final class SearchModeChangeListener implements View.OnClickListener,
    101             SearchView.OnCloseListener {
    102         @Override
    103         public void onClick(View v) {
    104             mSearchMode = true;
    105         }
    106 
    107         @Override
    108         public boolean onClose() {
    109             mSearchMode = false;
    110             return false;
    111         }
    112     }
    113 }
    114