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