Loading res/menu/activity.xml +9 −1 Original line number Diff line number Diff line Loading @@ -15,11 +15,19 @@ --> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- showAsAction flag impacts the behavior of SearchView. When set to collapseActionView, collapsing SearchView to icon is the default behavior. It would fit UX, however after expanding SearchView is shown on the left site of the toolbar (replacing title). Since no way to prevent this behavior was found, the flag is set to always. SearchView is always visible by default and it is being collapse manually by calling setIconified() method --> <item android:id="@+id/menu_search" android:title="@string/menu_search" android:icon="@drawable/ic_menu_search" android:showAsAction="always|collapseActionView" android:showAsAction="always" android:actionViewClass="android.widget.SearchView" android:imeOptions="actionSearch" /> <item Loading res/values/colors.xml +2 −0 Original line number Diff line number Diff line Loading @@ -33,4 +33,6 @@ <color name="item_doc_background">#fffafafa</color> <color name="item_doc_background_selected">#ffe0f2f1</color> <color name="menu_search_background">#ff676f74</color> </resources> src/com/android/documentsui/BaseActivity.java +54 −33 Original line number Diff line number Diff line Loading @@ -38,13 +38,15 @@ import android.provider.DocumentsContract; import android.provider.DocumentsContract.Root; import android.support.annotation.LayoutRes; import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; 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; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; Loading Loading @@ -214,6 +216,7 @@ public abstract class BaseActivity extends Activity { case R.id.menu_advanced: case R.id.menu_file_size: case R.id.menu_new_window: case R.id.menu_search: break; default: item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); Loading Loading @@ -315,6 +318,8 @@ public abstract class BaseActivity extends Activity { * the (abstract) directoryChanged method will be called. * @param anim */ // TODO: Refactor the usage of the method - now it is called not only when the directory // changed, but also to refresh the content of the directory while searching final void onCurrentDirectoryChanged(int anim) { mDirectoryContainer.setDrawDisappearingFirst(anim == ANIM_DOWN); onDirectoryChanged(anim); Loading @@ -325,8 +330,12 @@ public abstract class BaseActivity extends Activity { } updateActionBar(); // Prevents searchView from being recreated while searching if (!mSearchManager.isSearching()) { invalidateOptionsMenu(); } } final List<String> getExcludedAuthorities() { List<String> authorities = new ArrayList<>(); Loading Loading @@ -682,7 +691,7 @@ public abstract class BaseActivity extends Activity { * Facade over the various search parts in the menu. */ final class SearchManager implements SearchView.OnCloseListener, OnActionExpandListener, OnQueryTextListener, SearchView.OnCloseListener, OnQueryTextListener, OnClickListener, OnFocusChangeListener, DocumentsToolBar.OnActionViewCollapsedListener { private boolean mSearchExpanded; Loading @@ -700,9 +709,10 @@ public abstract class BaseActivity extends Activity { mView = (SearchView) mMenu.getActionView(); mActionBar.setOnActionViewCollapsedListener(this); mMenu.setOnActionExpandListener(this); mView.setOnQueryTextListener(this); mView.setOnCloseListener(this); mView.setOnSearchClickListener(this); mView.setOnQueryTextFocusChangeListener(this); } /** Loading Loading @@ -755,19 +765,13 @@ public abstract class BaseActivity extends Activity { * search currently. */ boolean cancelSearch() { boolean collapsed = false; boolean closed = false; if (mActionBar.hasExpandedActionView()) { mActionBar.collapseActionView(); collapsed = true; } if (isExpanded() || isSearching()) { onClose(); closed = true; // If the query string is not empty search view won't get iconified mView.setQuery("", false); mView.setIconified(true); return true; } return collapsed || closed; return false; } boolean isSearching() { Loading @@ -778,6 +782,11 @@ public abstract class BaseActivity extends Activity { return mSearchExpanded; } /** * Clears the search. * @return True if the default behavior of clearing/dismissing SearchView should be * overridden. False otherwise. */ @Override public boolean onClose() { mSearchExpanded = false; Loading @@ -786,33 +795,33 @@ public abstract class BaseActivity extends Activity { return false; } mView.setBackgroundColor( getResources().getColor(android.R.color.transparent, null)); // Refresh the directory if a search was done if(mState.currentSearch != null) { mState.currentSearch = null; onCurrentDirectoryChanged(ANIM_NONE); return false; } @Override public boolean onMenuItemActionExpand(MenuItem item) { mSearchExpanded = true; updateActionBar(); return true; 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. */ @Override public boolean onMenuItemActionCollapse(MenuItem item) { mSearchExpanded = false; if (mIgnoreNextCollapse) { mIgnoreNextCollapse = false; return true; } mState.currentSearch = null; onCurrentDirectoryChanged(ANIM_NONE); return true; public void onClick (View v) { mSearchExpanded = true; mView.setBackgroundColor( getResources().getColor(R.color.menu_search_background, null)); } @Override public boolean onQueryTextSubmit(String query) { mSearchExpanded = true; mState.currentSearch = query; mView.clearFocus(); onCurrentDirectoryChanged(ANIM_NONE); Loading @@ -824,6 +833,18 @@ public abstract class BaseActivity extends Activity { return false; } @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus) { if(mState.currentSearch == null) { mView.setIconified(true); } else if(TextUtils.isEmpty(mView.getQuery())) { cancelSearch(); } } } @Override public void onActionViewCollapsed() { updateActionBar(); Loading src/com/android/documentsui/dirlist/DirectoryFragment.java +0 −1 Original line number Diff line number Diff line Loading @@ -403,7 +403,6 @@ public class DirectoryFragment extends Fragment { state.derivedMode = result.mode; } state.derivedSortOrder = result.sortOrder; ((BaseActivity) context).onStateChanged(); updateDisplayState(); Loading Loading
res/menu/activity.xml +9 −1 Original line number Diff line number Diff line Loading @@ -15,11 +15,19 @@ --> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- showAsAction flag impacts the behavior of SearchView. When set to collapseActionView, collapsing SearchView to icon is the default behavior. It would fit UX, however after expanding SearchView is shown on the left site of the toolbar (replacing title). Since no way to prevent this behavior was found, the flag is set to always. SearchView is always visible by default and it is being collapse manually by calling setIconified() method --> <item android:id="@+id/menu_search" android:title="@string/menu_search" android:icon="@drawable/ic_menu_search" android:showAsAction="always|collapseActionView" android:showAsAction="always" android:actionViewClass="android.widget.SearchView" android:imeOptions="actionSearch" /> <item Loading
res/values/colors.xml +2 −0 Original line number Diff line number Diff line Loading @@ -33,4 +33,6 @@ <color name="item_doc_background">#fffafafa</color> <color name="item_doc_background_selected">#ffe0f2f1</color> <color name="menu_search_background">#ff676f74</color> </resources>
src/com/android/documentsui/BaseActivity.java +54 −33 Original line number Diff line number Diff line Loading @@ -38,13 +38,15 @@ import android.provider.DocumentsContract; import android.provider.DocumentsContract.Root; import android.support.annotation.LayoutRes; import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; 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; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; Loading Loading @@ -214,6 +216,7 @@ public abstract class BaseActivity extends Activity { case R.id.menu_advanced: case R.id.menu_file_size: case R.id.menu_new_window: case R.id.menu_search: break; default: item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); Loading Loading @@ -315,6 +318,8 @@ public abstract class BaseActivity extends Activity { * the (abstract) directoryChanged method will be called. * @param anim */ // TODO: Refactor the usage of the method - now it is called not only when the directory // changed, but also to refresh the content of the directory while searching final void onCurrentDirectoryChanged(int anim) { mDirectoryContainer.setDrawDisappearingFirst(anim == ANIM_DOWN); onDirectoryChanged(anim); Loading @@ -325,8 +330,12 @@ public abstract class BaseActivity extends Activity { } updateActionBar(); // Prevents searchView from being recreated while searching if (!mSearchManager.isSearching()) { invalidateOptionsMenu(); } } final List<String> getExcludedAuthorities() { List<String> authorities = new ArrayList<>(); Loading Loading @@ -682,7 +691,7 @@ public abstract class BaseActivity extends Activity { * Facade over the various search parts in the menu. */ final class SearchManager implements SearchView.OnCloseListener, OnActionExpandListener, OnQueryTextListener, SearchView.OnCloseListener, OnQueryTextListener, OnClickListener, OnFocusChangeListener, DocumentsToolBar.OnActionViewCollapsedListener { private boolean mSearchExpanded; Loading @@ -700,9 +709,10 @@ public abstract class BaseActivity extends Activity { mView = (SearchView) mMenu.getActionView(); mActionBar.setOnActionViewCollapsedListener(this); mMenu.setOnActionExpandListener(this); mView.setOnQueryTextListener(this); mView.setOnCloseListener(this); mView.setOnSearchClickListener(this); mView.setOnQueryTextFocusChangeListener(this); } /** Loading Loading @@ -755,19 +765,13 @@ public abstract class BaseActivity extends Activity { * search currently. */ boolean cancelSearch() { boolean collapsed = false; boolean closed = false; if (mActionBar.hasExpandedActionView()) { mActionBar.collapseActionView(); collapsed = true; } if (isExpanded() || isSearching()) { onClose(); closed = true; // If the query string is not empty search view won't get iconified mView.setQuery("", false); mView.setIconified(true); return true; } return collapsed || closed; return false; } boolean isSearching() { Loading @@ -778,6 +782,11 @@ public abstract class BaseActivity extends Activity { return mSearchExpanded; } /** * Clears the search. * @return True if the default behavior of clearing/dismissing SearchView should be * overridden. False otherwise. */ @Override public boolean onClose() { mSearchExpanded = false; Loading @@ -786,33 +795,33 @@ public abstract class BaseActivity extends Activity { return false; } mView.setBackgroundColor( getResources().getColor(android.R.color.transparent, null)); // Refresh the directory if a search was done if(mState.currentSearch != null) { mState.currentSearch = null; onCurrentDirectoryChanged(ANIM_NONE); return false; } @Override public boolean onMenuItemActionExpand(MenuItem item) { mSearchExpanded = true; updateActionBar(); return true; 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. */ @Override public boolean onMenuItemActionCollapse(MenuItem item) { mSearchExpanded = false; if (mIgnoreNextCollapse) { mIgnoreNextCollapse = false; return true; } mState.currentSearch = null; onCurrentDirectoryChanged(ANIM_NONE); return true; public void onClick (View v) { mSearchExpanded = true; mView.setBackgroundColor( getResources().getColor(R.color.menu_search_background, null)); } @Override public boolean onQueryTextSubmit(String query) { mSearchExpanded = true; mState.currentSearch = query; mView.clearFocus(); onCurrentDirectoryChanged(ANIM_NONE); Loading @@ -824,6 +833,18 @@ public abstract class BaseActivity extends Activity { return false; } @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus) { if(mState.currentSearch == null) { mView.setIconified(true); } else if(TextUtils.isEmpty(mView.getQuery())) { cancelSearch(); } } } @Override public void onActionViewCollapsed() { updateActionBar(); Loading
src/com/android/documentsui/dirlist/DirectoryFragment.java +0 −1 Original line number Diff line number Diff line Loading @@ -403,7 +403,6 @@ public class DirectoryFragment extends Fragment { state.derivedMode = result.mode; } state.derivedSortOrder = result.sortOrder; ((BaseActivity) context).onStateChanged(); updateDisplayState(); Loading