summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Zemiao Zhu <zemiao@google.com> 2020-04-22 23:59:18 -0700
committer Zemiao Zhu <zemiao@google.com> 2020-04-28 16:03:39 -0700
commitbc616ee4f3005a1e66d09e2a11114d2d171e736a (patch)
tree0f8e947fe163f47d60b7b933cc452e09032f6e5f
parent23e1ab5fa18dca4369c5b65a9051e3cdd6c415da (diff)
Add menu item for show hidden files.
Bug: 138309749 Test: atest DocumentsUIGoogleTests Change-Id: I5c7c0d9e0853c0462fb2ce78285cde8536517dcc
-rw-r--r--res/menu/activity.xml5
-rw-r--r--res/values/strings.xml4
-rw-r--r--src/com/android/documentsui/BaseActivity.java27
-rw-r--r--src/com/android/documentsui/DirectoryLoader.java6
-rw-r--r--src/com/android/documentsui/MenuManager.java8
-rw-r--r--src/com/android/documentsui/MetricConsts.java6
-rw-r--r--src/com/android/documentsui/MultiRootDocumentsLoader.java9
-rw-r--r--src/com/android/documentsui/base/State.java1
-rw-r--r--tests/common/com/android/documentsui/testing/TestMenu.java1
-rw-r--r--tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java16
-rw-r--r--tests/unit/com/android/documentsui/RecentsLoaderTests.java16
-rw-r--r--tests/unit/com/android/documentsui/files/MenuManagerTest.java3
-rw-r--r--tests/unit/com/android/documentsui/picker/MenuManagerTest.java3
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());
}