diff options
author | 2020-04-22 23:59:18 -0700 | |
---|---|---|
committer | 2020-04-28 16:03:39 -0700 | |
commit | bc616ee4f3005a1e66d09e2a11114d2d171e736a (patch) | |
tree | 0f8e947fe163f47d60b7b933cc452e09032f6e5f | |
parent | 23e1ab5fa18dca4369c5b65a9051e3cdd6c415da (diff) |
Add menu item for show hidden files.
Bug: 138309749
Test: atest DocumentsUIGoogleTests
Change-Id: I5c7c0d9e0853c0462fb2ce78285cde8536517dcc
-rw-r--r-- | res/menu/activity.xml | 5 | ||||
-rw-r--r-- | res/values/strings.xml | 4 | ||||
-rw-r--r-- | src/com/android/documentsui/BaseActivity.java | 27 | ||||
-rw-r--r-- | src/com/android/documentsui/DirectoryLoader.java | 6 | ||||
-rw-r--r-- | src/com/android/documentsui/MenuManager.java | 8 | ||||
-rw-r--r-- | src/com/android/documentsui/MetricConsts.java | 6 | ||||
-rw-r--r-- | src/com/android/documentsui/MultiRootDocumentsLoader.java | 9 | ||||
-rw-r--r-- | src/com/android/documentsui/base/State.java | 1 | ||||
-rw-r--r-- | tests/common/com/android/documentsui/testing/TestMenu.java | 1 | ||||
-rw-r--r-- | tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java | 16 | ||||
-rw-r--r-- | tests/unit/com/android/documentsui/RecentsLoaderTests.java | 16 | ||||
-rw-r--r-- | tests/unit/com/android/documentsui/files/MenuManagerTest.java | 3 | ||||
-rw-r--r-- | tests/unit/com/android/documentsui/picker/MenuManagerTest.java | 3 |
13 files changed, 93 insertions, 12 deletions
diff --git a/res/menu/activity.xml b/res/menu/activity.xml index e6fc1d4a2..39be106ca 100644 --- a/res/menu/activity.xml +++ b/res/menu/activity.xml @@ -77,6 +77,11 @@ android:visible="false" app:showAsAction="never"/> <item + android:id="@+id/option_menu_show_hidden_files" + android:title="@string/menu_show_hidden_files" + android:visible="false" + app:showAsAction="never"/> + <item android:id="@+id/option_menu_launcher" android:visible="false" app:showAsAction="never"/> diff --git a/res/values/strings.xml b/res/values/strings.xml index feb767355..0f14f881f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -75,6 +75,10 @@ <string name="menu_rename">Rename</string> <!-- Menu item that displays properties about the selected document [CHAR LIMIT=28] --> <string name="menu_inspect">Get info</string> + <!-- Menu item that shows hidden files [CHAR LIMIT=28] --> + <string name="menu_show_hidden_files">Show hidden files</string> + <!-- Menu item that hides hidden files [CHAR LIMIT=28] --> + <string name="menu_hide_hidden_files">Don\u2019t show hidden files</string> <!-- Menu item that renames the selected document [CHAR LIMIT=28] --> <string name="menu_view_in_owner">View in <xliff:g id="source" example="Google Drive">%1$s</xliff:g></string> diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java index 478ac7c87..5e73e1cef 100644 --- a/src/com/android/documentsui/BaseActivity.java +++ b/src/com/android/documentsui/BaseActivity.java @@ -20,6 +20,7 @@ import static com.android.documentsui.base.Shared.EXTRA_BENCHMARK; import static com.android.documentsui.base.SharedMinimal.DEBUG; import static com.android.documentsui.base.State.MODE_GRID; +import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @@ -416,6 +417,11 @@ public abstract class BaseActivity state.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false); state.excludedAuthorities = getExcludedAuthorities(); state.restrictScopeStorage = Shared.shouldRestrictStorageAccessFramework(this); + state.showHiddenFiles = LocalPreferences.getShowHiddenFiles( + getApplicationContext(), + getApplicationContext() + .getResources() + .getBoolean(R.bool.show_hidden_files_by_default)); includeState(state); @@ -537,6 +543,10 @@ public abstract class BaseActivity getInjector().actions.switchLauncherIcon(); return true; + case R.id.option_menu_show_hidden_files: + onClickedShowHiddenFiles(); + return true; + case R.id.sub_menu_grid: setViewMode(State.MODE_GRID); return true; @@ -665,6 +675,23 @@ public abstract class BaseActivity } /** + * Updates hidden files visibility based on user action. + */ + private void onClickedShowHiddenFiles() { + boolean showHiddenFiles = !mState.showHiddenFiles; + Context context = getApplicationContext(); + + Metrics.logUserAction(showHiddenFiles + ? MetricConsts.USER_ACTION_SHOW_HIDDEN_FILES + : MetricConsts.USER_ACTION_HIDE_HIDDEN_FILES); + LocalPreferences.setShowHiddenFiles(context, showHiddenFiles); + mState.showHiddenFiles = showHiddenFiles; + + // Calls this to trigger either MultiRootDocumentsLoader or DirectoryLoader reloading. + mInjector.actions.loadDocumentsForCurrentStack(); + } + + /** * Set mode based on explicit user action. */ void setViewMode(@ViewMode int mode) { diff --git a/src/com/android/documentsui/DirectoryLoader.java b/src/com/android/documentsui/DirectoryLoader.java index 619f34593..458f86112 100644 --- a/src/com/android/documentsui/DirectoryLoader.java +++ b/src/com/android/documentsui/DirectoryLoader.java @@ -46,7 +46,6 @@ import com.android.documentsui.base.MimeTypes; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.State; import com.android.documentsui.base.UserId; -import com.android.documentsui.prefs.LocalPreferences; import com.android.documentsui.roots.RootCursorWrapper; import com.android.documentsui.sorting.SortModel; @@ -179,9 +178,8 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { } cursor.registerContentObserver(mObserver); - boolean showHiddenFiles = LocalPreferences.getShowHiddenFiles(getContext(), - getContext().getResources().getBoolean(R.bool.show_hidden_files_by_default)); - cursor = new FilteringCursorWrapper(cursor, showHiddenFiles); + // Filter hidden files. + cursor = new FilteringCursorWrapper(cursor, mState.showHiddenFiles); if (mSearchMode && !mFeatures.isFoldersInSearchResultsEnabled()) { // There is no findDocumentPath API. Enable filtering on folders in search mode. diff --git a/src/com/android/documentsui/MenuManager.java b/src/com/android/documentsui/MenuManager.java index ee210c8d8..701f0a980 100644 --- a/src/com/android/documentsui/MenuManager.java +++ b/src/com/android/documentsui/MenuManager.java @@ -96,6 +96,7 @@ public abstract class MenuManager { updateInspect(mOptionMenu.findItem(R.id.option_menu_inspect)); updateSort(mOptionMenu.findItem(R.id.option_menu_sort)); updateLauncher(mOptionMenu.findItem(R.id.option_menu_launcher)); + updateShowHiddenFiles(mOptionMenu.findItem(R.id.option_menu_show_hidden_files)); Menus.disableHiddenItems(mOptionMenu); mSearchManager.updateMenu(); @@ -258,6 +259,13 @@ public abstract class MenuManager { Menus.setEnabledAndVisible(list, mState.derivedMode != State.MODE_LIST); } + protected void updateShowHiddenFiles(MenuItem showHidden) { + Menus.setEnabledAndVisible(showHidden, true); + showHidden.setTitle(mState.showHiddenFiles + ? R.string.menu_hide_hidden_files + : R.string.menu_show_hidden_files); + } + protected void updateSort(MenuItem sort) { Menus.setEnabledAndVisible(sort, true); } diff --git a/src/com/android/documentsui/MetricConsts.java b/src/com/android/documentsui/MetricConsts.java index 63ab34ff0..853dbe9b6 100644 --- a/src/com/android/documentsui/MetricConsts.java +++ b/src/com/android/documentsui/MetricConsts.java @@ -242,6 +242,8 @@ public class MetricConsts { public static final int USER_ACTION_INSPECTOR = 31; public static final int USER_ACTION_SEARCH_CHIP = 32; public static final int USER_ACTION_SEARCH_HISTORY = 33; + public static final int USER_ACTION_SHOW_HIDDEN_FILES = 34; + public static final int USER_ACTION_HIDE_HIDDEN_FILES = 35; @IntDef(flag = false, value = { USER_ACTION_UNKNOWN, @@ -277,7 +279,9 @@ public class MetricConsts { USER_ACTION_VIEW_IN_APPLICATION, USER_ACTION_INSPECTOR, USER_ACTION_SEARCH_CHIP, - USER_ACTION_SEARCH_HISTORY + USER_ACTION_SEARCH_HISTORY, + USER_ACTION_SHOW_HIDDEN_FILES, + USER_ACTION_HIDE_HIDDEN_FILES }) @Retention(RetentionPolicy.SOURCE) public @interface UserAction { diff --git a/src/com/android/documentsui/MultiRootDocumentsLoader.java b/src/com/android/documentsui/MultiRootDocumentsLoader.java index 21748df55..643f122ff 100644 --- a/src/com/android/documentsui/MultiRootDocumentsLoader.java +++ b/src/com/android/documentsui/MultiRootDocumentsLoader.java @@ -41,7 +41,6 @@ import com.android.documentsui.base.FilteringCursorWrapper; import com.android.documentsui.base.Lookup; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.State; -import com.android.documentsui.prefs.LocalPreferences; import com.android.documentsui.roots.ProvidersAccess; import com.android.documentsui.roots.RootCursorWrapper; @@ -182,12 +181,8 @@ public abstract class MultiRootDocumentsLoader extends AsyncTaskLoader<Directory continue; } - boolean fallback = getContext() - .getResources() - .getBoolean(R.bool.show_hidden_files_by_default); - boolean showHiddenFiles = - LocalPreferences.getShowHiddenFiles(getContext(), fallback); - cursor = new FilteringCursorWrapper(cursor, showHiddenFiles); + // Filter hidden files. + cursor = new FilteringCursorWrapper(cursor, mState.showHiddenFiles); final FilteringCursorWrapper filtered = new FilteringCursorWrapper( cursor, mState.acceptMimes, getRejectMimes(), rejectBefore) { diff --git a/src/com/android/documentsui/base/State.java b/src/com/android/documentsui/base/State.java index 00d5bf9fa..cff5ce480 100644 --- a/src/com/android/documentsui/base/State.java +++ b/src/com/android/documentsui/base/State.java @@ -84,6 +84,7 @@ public class State implements android.os.Parcelable { public boolean openableOnly; public boolean restrictScopeStorage; + public boolean showHiddenFiles; /** * Represents whether the state supports cross-profile file picking. diff --git a/tests/common/com/android/documentsui/testing/TestMenu.java b/tests/common/com/android/documentsui/testing/TestMenu.java index 3ee4b3cbc..5181c730b 100644 --- a/tests/common/com/android/documentsui/testing/TestMenu.java +++ b/tests/common/com/android/documentsui/testing/TestMenu.java @@ -80,6 +80,7 @@ public abstract class TestMenu implements Menu { R.id.option_menu_settings, R.id.option_menu_inspect, R.id.option_menu_sort, + R.id.option_menu_show_hidden_files, R.id.option_menu_launcher, R.id.sub_menu_grid, R.id.sub_menu_list); diff --git a/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java b/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java index 6f40a4602..1c86f39df 100644 --- a/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java +++ b/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java @@ -141,6 +141,22 @@ public class GlobalSearchLoaderTest { } @Test + public void testShowOrHideHiddenFiles() { + final DocumentInfo doc = mEnv.model.createFile(".test" + SEARCH_STRING); + doc.lastModified = System.currentTimeMillis(); + mEnv.mockProviders.get(TestProvidersAccess.DOWNLOADS.authority) + .setNextChildDocumentsReturns(doc); + + assertEquals(false, mLoader.mState.showHiddenFiles); + DirectoryResult result = mLoader.loadInBackground(); + assertEquals(0, result.cursor.getCount()); + + mLoader.mState.showHiddenFiles = true; + result = mLoader.loadInBackground(); + assertEquals(1, result.cursor.getCount()); + } + + @Test public void testSearchResult_isNotMovable() { final DirectoryResult result = mLoader.loadInBackground(); diff --git a/tests/unit/com/android/documentsui/RecentsLoaderTests.java b/tests/unit/com/android/documentsui/RecentsLoaderTests.java index a1b96ee1f..575baf3f1 100644 --- a/tests/unit/com/android/documentsui/RecentsLoaderTests.java +++ b/tests/unit/com/android/documentsui/RecentsLoaderTests.java @@ -104,6 +104,22 @@ public class RecentsLoaderTests { } @Test + public void testShowOrHideHiddenFiles() { + final DocumentInfo doc = mEnv.model.createFile(".test"); + doc.lastModified = System.currentTimeMillis(); + mEnv.mockProviders.get(TestProvidersAccess.HOME.authority) + .setNextRecentDocumentsReturns(doc); + + assertEquals(false, mLoader.mState.showHiddenFiles); + DirectoryResult result = mLoader.loadInBackground(); + assertEquals(0, result.cursor.getCount()); + + mLoader.mState.showHiddenFiles = true; + result = mLoader.loadInBackground(); + assertEquals(1, result.cursor.getCount()); + } + + @Test public void testDocumentsNotMovable() { final DocumentInfo doc = mEnv.model.createFile("freddy.jpg", Document.FLAG_SUPPORTS_MOVE diff --git a/tests/unit/com/android/documentsui/files/MenuManagerTest.java b/tests/unit/com/android/documentsui/files/MenuManagerTest.java index 825632787..fe1d02209 100644 --- a/tests/unit/com/android/documentsui/files/MenuManagerTest.java +++ b/tests/unit/com/android/documentsui/files/MenuManagerTest.java @@ -103,6 +103,7 @@ public final class MenuManagerTest { private TestMenuItem optionInspector; private TestMenuItem optionSort; private TestMenuItem mOptionLauncher; + private TestMenuItem mOptionShowHiddenFiles; /* Sub Option Menu items */ private TestMenuItem subOptionGrid; @@ -172,6 +173,7 @@ public final class MenuManagerTest { optionInspector = testMenu.findItem(R.id.option_menu_inspect); optionSort = testMenu.findItem(R.id.option_menu_sort); mOptionLauncher = testMenu.findItem(R.id.option_menu_launcher); + mOptionShowHiddenFiles = testMenu.findItem(R.id.option_menu_show_hidden_files); // Menu actions on root title row. subOptionGrid = testMenu.findItem(R.id.sub_menu_grid); @@ -435,6 +437,7 @@ public final class MenuManagerTest { optionDebug.assertDisabledAndInvisible(); optionSort.assertEnabledAndVisible(); mOptionLauncher.assertDisabledAndInvisible(); + mOptionShowHiddenFiles.assertEnabledAndVisible(); assertTrue(testSearchManager.updateMenuCalled()); } diff --git a/tests/unit/com/android/documentsui/picker/MenuManagerTest.java b/tests/unit/com/android/documentsui/picker/MenuManagerTest.java index 064842fe5..d3e2f2d9f 100644 --- a/tests/unit/com/android/documentsui/picker/MenuManagerTest.java +++ b/tests/unit/com/android/documentsui/picker/MenuManagerTest.java @@ -101,6 +101,7 @@ public final class MenuManagerTest { private TestMenuItem optionSettings; private TestMenuItem optionSort; private TestMenuItem mOptionLauncher; + private TestMenuItem mOptionShowHiddenFiles; private TestMenuItem subOptionGrid; private TestMenuItem subOptionList; @@ -160,6 +161,7 @@ public final class MenuManagerTest { optionSettings = testMenu.findItem(R.id.option_menu_settings); optionSort = testMenu.findItem(R.id.option_menu_sort); mOptionLauncher = testMenu.findItem(R.id.option_menu_launcher); + mOptionShowHiddenFiles = testMenu.findItem(R.id.option_menu_show_hidden_files); // Menu actions on root title row. subOptionGrid = testMenu.findItem(R.id.sub_menu_grid); @@ -265,6 +267,7 @@ public final class MenuManagerTest { optionDebug.assertDisabledAndInvisible(); optionSort.assertEnabledAndVisible(); mOptionLauncher.assertDisabledAndInvisible(); + mOptionShowHiddenFiles.assertEnabledAndVisible(); assertTrue(testSearchManager.showMenuCalled()); } |