diff --git a/packages/DocumentsUI/res/menu/activity.xml b/packages/DocumentsUI/res/menu/activity.xml
index 2aee569e8086f..95c6f1f357ddb 100644
--- a/packages/DocumentsUI/res/menu/activity.xml
+++ b/packages/DocumentsUI/res/menu/activity.xml
@@ -31,61 +31,64 @@
android:actionViewClass="android.widget.SearchView"
android:imeOptions="actionSearch"
android:visible="false" />
-
-
+
+
+
+
-
-
-
-
- -
-
-
-
-
+
+
+
+
+ -
+
+
+
+
+
diff --git a/packages/DocumentsUI/res/values-sw720dp/colors.xml b/packages/DocumentsUI/res/values-sw720dp/colors.xml
new file mode 100644
index 0000000000000..3ecafe29c8c47
--- /dev/null
+++ b/packages/DocumentsUI/res/values-sw720dp/colors.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ #ff676f74
+
diff --git a/packages/DocumentsUI/res/values-sw720dp/config.xml b/packages/DocumentsUI/res/values-sw720dp/config.xml
new file mode 100644
index 0000000000000..4898e74a61466
--- /dev/null
+++ b/packages/DocumentsUI/res/values-sw720dp/config.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+ false
+
diff --git a/packages/DocumentsUI/res/values/colors.xml b/packages/DocumentsUI/res/values/colors.xml
index 51e04b6da3676..1660e26af4f8f 100644
--- a/packages/DocumentsUI/res/values/colors.xml
+++ b/packages/DocumentsUI/res/values/colors.xml
@@ -24,7 +24,7 @@
#fff1f1f1
#fff1f1f1
#fff7f7f7
- #ff676f74
+ @android:color/transparent
@*android:color/primary_dark_material_dark
@*android:color/material_blue_grey_900
diff --git a/packages/DocumentsUI/res/values/config.xml b/packages/DocumentsUI/res/values/config.xml
index 408603e85f7e5..765211d70fa8b 100644
--- a/packages/DocumentsUI/res/values/config.xml
+++ b/packages/DocumentsUI/res/values/config.xml
@@ -26,4 +26,6 @@
true
true
+
+ true
diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
index 54202d40bda9d..69315f7b84eb0 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
@@ -146,7 +146,8 @@ public abstract class BaseActivity extends Activity
getMenuInflater().inflate(R.menu.activity, menu);
mNavigator.update();
- mSearchManager.install((DocumentsToolbar) findViewById(R.id.toolbar));
+ boolean fullBarSearch = getResources().getBoolean(R.bool.full_bar_search_view);
+ mSearchManager.install((DocumentsToolbar) findViewById(R.id.toolbar), fullBarSearch);
return showMenu;
}
@@ -378,8 +379,12 @@ public abstract class BaseActivity extends Activity
public void onSearchChanged(@Nullable String query) {
// We should not get here if root is not searchable
assert(canSearchRoot());
-
reloadSearch(query);
+ }
+
+ @Override
+ public void onSearchFinished() {
+ // Restores menu icons state
invalidateOptionsMenu();
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
index bed8b298dee3e..3e04e2a5a2181 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
@@ -201,6 +201,8 @@ public class FilesActivity extends BaseActivity {
newWindow.setVisible(true);
Menus.disableHiddenItems(menu, pasteFromCb);
+ // It hides icon if searching in progress
+ mSearchManager.updateMenu();
return true;
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java b/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java
index 4d0ba4b79346b..11b8891b0b12b 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java
@@ -23,7 +23,9 @@ import android.os.Bundle;
import android.provider.DocumentsContract.Root;
import android.text.TextUtils;
import android.util.Log;
+import android.view.Menu;
import android.view.MenuItem;
+import android.view.MenuItem.OnActionExpandListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
@@ -36,10 +38,12 @@ import com.android.documentsui.model.RootInfo;
* Manages searching UI behavior.
*/
final class SearchViewManager implements
- SearchView.OnCloseListener, OnQueryTextListener, OnClickListener, OnFocusChangeListener {
+ SearchView.OnCloseListener, OnQueryTextListener, OnClickListener, OnFocusChangeListener,
+ OnActionExpandListener {
public interface SearchManagerListener {
void onSearchChanged(@Nullable String query);
+ void onSearchFinished();
}
public static final String TAG = "SearchManger";
@@ -48,10 +52,11 @@ final class SearchViewManager implements
private boolean mSearchExpanded;
private String mCurrentSearch;
private boolean mIgnoreNextClose;
+ private boolean mFullBar;
private DocumentsToolbar mActionBar;
- private MenuItem mMenu;
- private SearchView mView;
+ private MenuItem mMenuItem;
+ private SearchView mSearchView;
public SearchViewManager(SearchManagerListener listener, @Nullable Bundle savedState) {
mListener = listener;
@@ -62,45 +67,61 @@ final class SearchViewManager implements
mListener = listener;
}
- public void install(DocumentsToolbar actionBar) {
- // assert(mActionBar == null);
-
+ public void install(DocumentsToolbar actionBar, boolean isFullBarSearch) {
mActionBar = actionBar;
- mMenu = actionBar.getSearchMenu();
- mView = (SearchView) mMenu.getActionView();
+ mMenuItem = actionBar.getSearchMenu();
+ mSearchView = (SearchView) mMenuItem.getActionView();
- mView.setOnQueryTextListener(this);
- mView.setOnCloseListener(this);
- mView.setOnSearchClickListener(this);
- mView.setOnQueryTextFocusChangeListener(this);
+ mSearchView.setOnQueryTextListener(this);
+ mSearchView.setOnCloseListener(this);
+ mSearchView.setOnSearchClickListener(this);
+ mSearchView.setOnQueryTextFocusChangeListener(this);
+
+ mFullBar = isFullBarSearch;
+ if (mFullBar) {
+ mMenuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW
+ | MenuItem.SHOW_AS_ACTION_ALWAYS);
+ mMenuItem.setOnActionExpandListener(this);
+ }
restoreSearch();
}
+ /**
+ * Used to hide menu icons, when the search is being restored. Needed because search restoration
+ * is done before onPrepareOptionsMenu(Menu menu) that is overriding the icons visibility.
+ */
+ public void updateMenu() {
+ if (isSearching() && mFullBar) {
+ Menu menu = mActionBar.getMenu();
+ menu.setGroupVisible(R.id.group_hide_when_searching, false);
+ }
+ }
+
/**
* @param root Info about the current directory.
*/
void update(RootInfo root) {
- if (mMenu == null) {
+ if (mMenuItem == null) {
if (DEBUG) Log.d(TAG, "update called before Search MenuItem installed.");
return;
}
if (mCurrentSearch != null) {
- mMenu.expandActionView();
+ mMenuItem.expandActionView();
- mView.setIconified(false);
- mView.clearFocus();
- mView.setQuery(mCurrentSearch, false);
+ mSearchView.setIconified(false);
+ mSearchView.clearFocus();
+ mSearchView.setQuery(mCurrentSearch, false);
} else {
- mView.clearFocus();
- if (!mView.isIconified()) {
+ mSearchView.clearFocus();
+ if (!mSearchView.isIconified()) {
mIgnoreNextClose = true;
- mView.setIconified(true);
+ mSearchView.setIconified(true);
}
- if (mMenu.isActionViewExpanded()) {
- mMenu.collapseActionView();
+ if (mMenuItem.isActionViewExpanded()) {
+ mMenuItem.collapseActionView();
}
}
@@ -109,7 +130,7 @@ final class SearchViewManager implements
}
void showMenu(boolean visible) {
- if (mMenu == null) {
+ if (mMenuItem == null) {
if (DEBUG) Log.d(TAG, "showMenu called before Search MenuItem installed.");
return;
}
@@ -118,7 +139,7 @@ final class SearchViewManager implements
mCurrentSearch = null;
}
- mMenu.setVisible(visible);
+ mMenuItem.setVisible(visible);
}
/**
@@ -129,46 +150,46 @@ final class SearchViewManager implements
boolean cancelSearch() {
if (isExpanded() || isSearching()) {
// If the query string is not empty search view won't get iconified
- mView.setQuery("", false);
- // Causes calling onClose(). onClose() is triggering directory content update.
- mView.setIconified(true);
+ mSearchView.setQuery("", false);
+
+ if (mFullBar) {
+ onClose();
+ } else {
+ // Causes calling onClose(). onClose() is triggering directory content update.
+ mSearchView.setIconified(true);
+ }
return true;
}
return false;
}
+ /**
+ * Sets search view into the searching state. Used to restore state after device orientation
+ * change.
+ */
private void restoreSearch() {
if (isSearching()) {
+ if(mFullBar) {
+ mMenuItem.expandActionView();
+ } else {
+ mSearchView.setIconified(false);
+ }
onSearchExpanded();
- mView.setIconified(false);
- mView.setQuery(mCurrentSearch, false);
- mView.clearFocus();
+ mSearchView.setQuery(mCurrentSearch, false);
+ mSearchView.clearFocus();
}
}
private void onSearchExpanded() {
mSearchExpanded = true;
- }
-
- boolean isSearching() {
- return mCurrentSearch != null;
- }
-
- boolean isExpanded() {
- return mSearchExpanded;
+ if(mFullBar) {
+ Menu menu = mActionBar.getMenu();
+ menu.setGroupVisible(R.id.group_hide_when_searching, false);
+ }
}
/**
- * Called when owning activity is saving state to be used to restore state during creation.
- * @param state Bundle to save state too
- */
- public void onSaveInstanceState(Bundle state) {
- state.putString(Shared.EXTRA_QUERY, mCurrentSearch);
- }
-
- /**
- * Clears the search. Clears the SearchView background color. Triggers refreshing of the
- * directory content.
+ * Clears the search. Triggers refreshing of the directory content.
* @return True if the default behavior of clearing/dismissing SearchView should be overridden.
* False otherwise.
*/
@@ -187,13 +208,26 @@ final class SearchViewManager implements
mListener.onSearchChanged(mCurrentSearch);
}
}
+
+ if(mFullBar) {
+ mMenuItem.collapseActionView();
+ }
+ mListener.onSearchFinished();
+
return false;
}
/**
- * Sets mSearchExpanded. Called when search icon is clicked to start search. Used to detect when
- * the view expanded instead of onMenuItemActionExpand, because SearchView has showAsAction set
- * to always and onMenuItemAction* methods are not called.
+ * Called when owning activity is saving state to be used to restore state during creation.
+ * @param state Bundle to save state too
+ */
+ public void onSaveInstanceState(Bundle state) {
+ state.putString(Shared.EXTRA_QUERY, mCurrentSearch);
+ }
+
+ /**
+ * Sets mSearchExpanded. Called when search icon is clicked to start search for both search view
+ * modes.
*/
@Override
public void onClick(View v) {
@@ -203,19 +237,22 @@ final class SearchViewManager implements
@Override
public boolean onQueryTextSubmit(String query) {
mCurrentSearch = query;
- mView.clearFocus();
+ mSearchView.clearFocus();
if (mListener != null) {
mListener.onSearchChanged(mCurrentSearch);
}
return true;
}
+ /**
+ * Used to detect and handle back button pressed event when search is expanded.
+ */
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
if (mCurrentSearch == null) {
- mView.setIconified(true);
- } else if (TextUtils.isEmpty(mView.getQuery())) {
+ mSearchView.setIconified(true);
+ } else if (TextUtils.isEmpty(mSearchView.getQuery())) {
cancelSearch();
}
}
@@ -226,8 +263,34 @@ final class SearchViewManager implements
return false;
}
+ @Override
+ public boolean onMenuItemActionCollapse(MenuItem item) {
+ Menu menu = mActionBar.getMenu();
+ menu.setGroupVisible(R.id.group_hide_when_searching, true);
+
+ // Handles case when search view is collapsed by using the arrow on the left of the bar
+ if (isExpanded() || isSearching()) {
+ cancelSearch();
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onMenuItemActionExpand(MenuItem item) {
+ return true;
+ }
+
String getCurrentSearch() {
return mCurrentSearch;
}
+ boolean isSearching() {
+ return mCurrentSearch != null;
+ }
+
+ boolean isExpanded() {
+ return mSearchExpanded;
+ }
+
}