1f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska/*
2f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska * Copyright (C) 2013 The Android Open Source Project
3f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska *
4f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska * Licensed under the Apache License, Version 2.0 (the "License");
5f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska * you may not use this file except in compliance with the License.
6f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska * You may obtain a copy of the License at
7f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska *
8f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska *      http://www.apache.org/licenses/LICENSE-2.0
9f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska *
10f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska * Unless required by applicable law or agreed to in writing, software
11f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska * distributed under the License is distributed on an "AS IS" BASIS,
12f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska * See the License for the specific language governing permissions and
14f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska * limitations under the License.
15f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska */
16f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
17f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskapackage com.android.documentsui;
18f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
19ffa829f779d7513c64bba76cc884c62b702f52ddBen Kwaimport static com.android.documentsui.Shared.DEBUG;
20ffa829f779d7513c64bba76cc884c62b702f52ddBen Kwa
21893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronskaimport android.annotation.Nullable;
22893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronskaimport android.os.Bundle;
23f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskaimport android.provider.DocumentsContract.Root;
24f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskaimport android.text.TextUtils;
25f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskaimport android.util.Log;
26b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronskaimport android.view.Menu;
27f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskaimport android.view.MenuItem;
28b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronskaimport android.view.MenuItem.OnActionExpandListener;
29f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskaimport android.view.View;
30f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskaimport android.view.View.OnClickListener;
31f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskaimport android.view.View.OnFocusChangeListener;
32f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskaimport android.widget.SearchView;
33f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskaimport android.widget.SearchView.OnQueryTextListener;
34f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
35f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronskaimport com.android.documentsui.model.RootInfo;
36f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
37f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska/**
38f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska * Manages searching UI behavior.
39f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska */
40893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronskafinal class SearchViewManager implements
41b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        SearchView.OnCloseListener, OnQueryTextListener, OnClickListener, OnFocusChangeListener,
42b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        OnActionExpandListener {
43f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
44f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    public interface SearchManagerListener {
45893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        void onSearchChanged(@Nullable String query);
46b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        void onSearchFinished();
47f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
48f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
49f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    public static final String TAG = "SearchManger";
50f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
51f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    private SearchManagerListener mListener;
52f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    private boolean mSearchExpanded;
53893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska    private String mCurrentSearch;
54f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    private boolean mIgnoreNextClose;
55b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    private boolean mFullBar;
56f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
571f264a8a1a6c3e770e45c52fc08dc06de6b1aa55Steve McKay    private DocumentsToolbar mActionBar;
58b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    private MenuItem mMenuItem;
59b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    private SearchView mSearchView;
60f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
61893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska    public SearchViewManager(SearchManagerListener listener, @Nullable Bundle savedState) {
62f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        mListener = listener;
63893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        mCurrentSearch = savedState != null ? savedState.getString(Shared.EXTRA_QUERY) : null;
64f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
65f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
66f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    public void setSearchMangerListener(SearchManagerListener listener) {
67f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        mListener = listener;
68f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
69f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
70b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    public void install(DocumentsToolbar actionBar, boolean isFullBarSearch) {
71f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        mActionBar = actionBar;
72b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        mMenuItem = actionBar.getSearchMenu();
73b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        mSearchView = (SearchView) mMenuItem.getActionView();
74b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
75b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        mSearchView.setOnQueryTextListener(this);
76b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        mSearchView.setOnCloseListener(this);
77b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        mSearchView.setOnSearchClickListener(this);
78b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        mSearchView.setOnQueryTextFocusChangeListener(this);
79b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
80b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        mFullBar = isFullBarSearch;
81b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        if (mFullBar) {
82b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mMenuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW
83b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska                    | MenuItem.SHOW_AS_ACTION_ALWAYS);
84b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mMenuItem.setOnActionExpandListener(this);
85b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        }
86893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska
87893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        restoreSearch();
88f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
89f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
90f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    /**
91b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     * Used to hide menu icons, when the search is being restored. Needed because search restoration
92b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     * is done before onPrepareOptionsMenu(Menu menu) that is overriding the icons visibility.
93b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     */
94b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    public void updateMenu() {
95b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        if (isSearching() && mFullBar) {
96b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            Menu menu = mActionBar.getMenu();
97b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            menu.setGroupVisible(R.id.group_hide_when_searching, false);
98b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        }
99b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    }
100b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
101b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    /**
102f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska     * @param root Info about the current directory.
103f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska     */
104f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    void update(RootInfo root) {
105b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        if (mMenuItem == null) {
106ffa829f779d7513c64bba76cc884c62b702f52ddBen Kwa            if (DEBUG) Log.d(TAG, "update called before Search MenuItem installed.");
107f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            return;
108f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        }
109f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
110893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        if (mCurrentSearch != null) {
111b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mMenuItem.expandActionView();
112f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
113b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mSearchView.setIconified(false);
114b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mSearchView.clearFocus();
115b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mSearchView.setQuery(mCurrentSearch, false);
116f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        } else {
117b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mSearchView.clearFocus();
118b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            if (!mSearchView.isIconified()) {
119f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska                mIgnoreNextClose = true;
120b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska                mSearchView.setIconified(true);
121f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            }
122f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
123b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            if (mMenuItem.isActionViewExpanded()) {
124b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska                mMenuItem.collapseActionView();
125f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            }
126f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        }
127f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
128f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        showMenu(root != null
129f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska                && ((root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0));
130f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
131f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
132f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    void showMenu(boolean visible) {
133b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        if (mMenuItem == null) {
134ffa829f779d7513c64bba76cc884c62b702f52ddBen Kwa            if (DEBUG) Log.d(TAG, "showMenu called before Search MenuItem installed.");
135f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            return;
136f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        }
137f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
138f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        if (!visible) {
139893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska            mCurrentSearch = null;
140f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        }
141893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska
142b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        mMenuItem.setVisible(visible);
143f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
144f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
145f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    /**
146f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska     * Cancels current search operation. Triggers clearing and collapsing the SearchView.
147f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska     *
148f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska     * @return True if it cancels search. False if it does not operate search currently.
149f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska     */
150f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    boolean cancelSearch() {
151f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        if (isExpanded() || isSearching()) {
152f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            // If the query string is not empty search view won't get iconified
153b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mSearchView.setQuery("", false);
154b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
155b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            if (mFullBar) {
156b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska               onClose();
157b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            } else {
158b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska                // Causes calling onClose(). onClose() is triggering directory content update.
159b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska                mSearchView.setIconified(true);
160b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            }
161f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            return true;
162f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        }
163f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        return false;
164f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
165f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
166b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    /**
167b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     * Sets search view into the searching state. Used to restore state after device orientation
168b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     * change.
169b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     */
170893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska    private void restoreSearch() {
171893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        if (isSearching()) {
172b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            if(mFullBar) {
173b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska                mMenuItem.expandActionView();
174b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            } else {
175b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska                mSearchView.setIconified(false);
176b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            }
177893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska            onSearchExpanded();
178b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mSearchView.setQuery(mCurrentSearch, false);
179b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mSearchView.clearFocus();
180893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        }
181893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska    }
182893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska
183893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska    private void onSearchExpanded() {
184893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        mSearchExpanded = true;
185b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        if(mFullBar) {
186b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            Menu menu = mActionBar.getMenu();
187b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            menu.setGroupVisible(R.id.group_hide_when_searching, false);
188b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        }
189893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska    }
190893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska
191893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska    /**
192b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     * Clears the search. Triggers refreshing of the directory content.
193f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska     * @return True if the default behavior of clearing/dismissing SearchView should be overridden.
194f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska     *         False otherwise.
195f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska     */
196f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    @Override
197f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    public boolean onClose() {
198f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        mSearchExpanded = false;
199f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        if (mIgnoreNextClose) {
200f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            mIgnoreNextClose = false;
201f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            return false;
202f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        }
203f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
204f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        // Refresh the directory if a search was done
205893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        if (mCurrentSearch != null) {
206893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska            mCurrentSearch = null;
207f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            if (mListener != null) {
208893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska                mListener.onSearchChanged(mCurrentSearch);
209f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            }
210f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        }
211b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
212b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        if(mFullBar) {
213b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            mMenuItem.collapseActionView();
214b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        }
215b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        mListener.onSearchFinished();
216b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
217f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        return false;
218f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
219f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
220f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    /**
221b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     * Called when owning activity is saving state to be used to restore state during creation.
222b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     * @param state Bundle to save state too
223b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     */
224b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    public void onSaveInstanceState(Bundle state) {
225b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        state.putString(Shared.EXTRA_QUERY, mCurrentSearch);
226b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    }
227b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
228b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    /**
229b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     * Sets mSearchExpanded. Called when search icon is clicked to start search for both search view
230b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     * modes.
231f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska     */
232f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    @Override
233f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    public void onClick(View v) {
234893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        onSearchExpanded();
235f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
236f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
237f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    @Override
238f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    public boolean onQueryTextSubmit(String query) {
239893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        mCurrentSearch = query;
240b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        mSearchView.clearFocus();
241f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        if (mListener != null) {
242893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska            mListener.onSearchChanged(mCurrentSearch);
243f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        }
244f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        return true;
245f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
246f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
247b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    /**
248b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     * Used to detect and handle back button pressed event when search is expanded.
249b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska     */
250f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    @Override
251f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    public void onFocusChange(View v, boolean hasFocus) {
252f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        if (!hasFocus) {
253893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska            if (mCurrentSearch == null) {
254b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska                mSearchView.setIconified(true);
255b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            } else if (TextUtils.isEmpty(mSearchView.getQuery())) {
256f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska                cancelSearch();
257f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska            }
258f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        }
259f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
260f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska
261f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    @Override
262f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    public boolean onQueryTextChange(String newText) {
263f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska        return false;
264f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska    }
265893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska
266b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    @Override
267b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    public boolean onMenuItemActionCollapse(MenuItem item) {
268b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        Menu menu = mActionBar.getMenu();
269b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        menu.setGroupVisible(R.id.group_hide_when_searching, true);
270b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
271b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        // Handles case when search view is collapsed by using the arrow on the left of the bar
272b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        if (isExpanded() || isSearching()) {
273b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            cancelSearch();
274b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska            return false;
275b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        }
276b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        return true;
277b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    }
278b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
279b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    @Override
280b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    public boolean onMenuItemActionExpand(MenuItem item) {
281b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        return true;
282b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    }
283b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
284893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska    String getCurrentSearch() {
285893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        return mCurrentSearch;
286893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska    }
287893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska
288b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    boolean isSearching() {
289b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        return mCurrentSearch != null;
290b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    }
291b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
292b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    boolean isExpanded() {
293b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska        return mSearchExpanded;
294b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska    }
295b09985639fd116a133cb0ec27abc6975b11b2eb6Aga Wronska
296f6a31d319f3e08d26ca4c0fbfb5803056bafb243Aga Wronska}
297