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