summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kelvin Kwan <kelvinkwan@google.com> 2020-03-06 17:02:11 +0000
committer Kelvin Kwan <kelvinkwan@google.com> 2020-03-10 09:55:34 +0000
commit1e088e1926321ac93877a2afed9d89a205d95011 (patch)
treebc3b5bfe7906ea515d97334a4c7be66e47d15f86
parent34810bc0cf5a8a927c80571d226bf1feed6ba911 (diff)
Continue showing a tabbed view when filters are selected
If filters are selected and the user does not explicitly perform a text search, we will keep the "search" in the current profile only by ignoring the other user's roots. Bug: 149773664 Test: atest DocumentsUIGoogleTests Test: manual Change-Id: I5b56309fd98cd1b3d3372f2f85d1837f5aa2080a
-rw-r--r--src/com/android/documentsui/AbstractActionHandler.java3
-rw-r--r--src/com/android/documentsui/BaseActivity.java4
-rw-r--r--src/com/android/documentsui/DirectoryLoader.java9
-rw-r--r--src/com/android/documentsui/GlobalSearchLoader.java13
-rw-r--r--src/com/android/documentsui/NavigationViewManager.java2
-rw-r--r--src/com/android/documentsui/ProfileTabs.java2
-rw-r--r--src/com/android/documentsui/queries/SearchViewManager.java2
-rw-r--r--tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java24
-rw-r--r--tests/unit/com/android/documentsui/ProfileTabsTest.java10
9 files changed, 53 insertions, 16 deletions
diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java
index 815b2f60b..2e8a7352f 100644
--- a/src/com/android/documentsui/AbstractActionHandler.java
+++ b/src/com/android/documentsui/AbstractActionHandler.java
@@ -869,7 +869,8 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
mState,
mExecutors,
mInjector.fileTypeLookup,
- mSearchMgr.buildQueryArgs());
+ mSearchMgr.buildQueryArgs(),
+ mState.stack.getRoot().userId);
} else {
if (DEBUG) {
Log.d(TAG, "Creating new loader recents.");
diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java
index 3b09659f9..1711928ff 100644
--- a/src/com/android/documentsui/BaseActivity.java
+++ b/src/com/android/documentsui/BaseActivity.java
@@ -781,8 +781,8 @@ public abstract class BaseActivity
}
@Override
- public boolean isSearching() {
- return mSearchManager.isSearching();
+ public boolean isTextSearching() {
+ return mSearchManager.isTextSearching();
}
@Override
diff --git a/src/com/android/documentsui/DirectoryLoader.java b/src/com/android/documentsui/DirectoryLoader.java
index 87753a831..3bd2c43cc 100644
--- a/src/com/android/documentsui/DirectoryLoader.java
+++ b/src/com/android/documentsui/DirectoryLoader.java
@@ -29,6 +29,7 @@ import android.os.CancellationSignal;
import android.os.FileUtils;
import android.os.OperationCanceledException;
import android.os.RemoteException;
+import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.util.Log;
@@ -128,7 +129,7 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
final List<UserId> userIds = new ArrayList<>();
if (mSearchMode) {
queryArgs.putAll(mQueryArgs);
- if (mState.supportsCrossProfile() && mRoot.supportsCrossProfile()) {
+ if (shouldSearchAcrossProfile()) {
for (UserId userId : DocumentsApplication.getUserIdManager(
getContext()).getUserIds()) {
if (mState.canInteractWith(userId)) {
@@ -208,6 +209,12 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
return result;
}
+ private boolean shouldSearchAcrossProfile() {
+ return mState.supportsCrossProfile()
+ && mRoot.supportsCrossProfile()
+ && mQueryArgs.containsKey(DocumentsContract.QUERY_ARG_DISPLAY_NAME);
+ }
+
@Nullable
private Cursor queryOnUsers(List<UserId> userIds, String authority, Bundle queryArgs)
throws RemoteException {
diff --git a/src/com/android/documentsui/GlobalSearchLoader.java b/src/com/android/documentsui/GlobalSearchLoader.java
index 8d7a06137..4d351a76d 100644
--- a/src/com/android/documentsui/GlobalSearchLoader.java
+++ b/src/com/android/documentsui/GlobalSearchLoader.java
@@ -27,6 +27,7 @@ import androidx.annotation.NonNull;
import com.android.documentsui.base.Lookup;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.State;
+import com.android.documentsui.base.UserId;
import com.android.documentsui.roots.ProvidersAccess;
import com.android.documentsui.roots.RootCursorWrapper;
@@ -40,6 +41,7 @@ import java.util.concurrent.Executor;
*/
public class GlobalSearchLoader extends MultiRootDocumentsLoader {
private final Bundle mQueryArgs;
+ private final UserId mUserId;
/*
* Create the loader to query multiple roots support
@@ -57,9 +59,10 @@ public class GlobalSearchLoader extends MultiRootDocumentsLoader {
*/
GlobalSearchLoader(Context context, ProvidersAccess providers, State state,
Lookup<String, Executor> executors, Lookup<String, String> fileTypeMap,
- @NonNull Bundle queryArgs) {
+ @NonNull Bundle queryArgs, UserId userId) {
super(context, providers, state, executors, fileTypeMap);
mQueryArgs = queryArgs;
+ mUserId = userId;
}
@Override
@@ -69,6 +72,14 @@ public class GlobalSearchLoader extends MultiRootDocumentsLoader {
return true;
}
+ if (mState.supportsCrossProfile() && root.supportsCrossProfile()
+ && !mQueryArgs.containsKey(DocumentsContract.QUERY_ARG_DISPLAY_NAME)
+ && !mUserId.equals(root.userId)) {
+ // Ignore cross-profile roots if it is not a text search. For example, the user may
+ // just filter documents by mime type.
+ return true;
+ }
+
// To prevent duplicate files on search result, ignore storage root because its almost
// files include in media root.
return root.isStorage();
diff --git a/src/com/android/documentsui/NavigationViewManager.java b/src/com/android/documentsui/NavigationViewManager.java
index 29595a6d1..e49f69ab7 100644
--- a/src/com/android/documentsui/NavigationViewManager.java
+++ b/src/com/android/documentsui/NavigationViewManager.java
@@ -234,6 +234,6 @@ public class NavigationViewManager {
@Deprecated // Use CommonAddones#refreshCurrentRootAndDirectory
void refreshCurrentRootAndDirectory(int animation);
boolean isSearchExpanded();
- boolean isSearching();
+ boolean isTextSearching();
}
}
diff --git a/src/com/android/documentsui/ProfileTabs.java b/src/com/android/documentsui/ProfileTabs.java
index 44e66e22a..3919a455f 100644
--- a/src/com/android/documentsui/ProfileTabs.java
+++ b/src/com/android/documentsui/ProfileTabs.java
@@ -138,7 +138,7 @@ public class ProfileTabs implements ProfileTabsAddons {
// 5. the root supports cross profile.
return mState.supportsCrossProfile()
&& mTabs.getTabCount() > 1
- && !mEnv.isSearching()
+ && !mEnv.isTextSearching()
&& mState.stack.size() <= 1
&& mState.stack.getRoot() != null && mState.stack.getRoot().supportsCrossProfile();
}
diff --git a/src/com/android/documentsui/queries/SearchViewManager.java b/src/com/android/documentsui/queries/SearchViewManager.java
index be3238394..c4b91d54f 100644
--- a/src/com/android/documentsui/queries/SearchViewManager.java
+++ b/src/com/android/documentsui/queries/SearchViewManager.java
@@ -600,7 +600,7 @@ public class SearchViewManager implements
return mCurrentSearch != null || mChipViewManager.hasCheckedItems();
}
- private boolean isTextSearching() {
+ public boolean isTextSearching() {
return mCurrentSearch != null;
}
diff --git a/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java b/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java
index aa084e8d1..0732daa30 100644
--- a/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java
+++ b/tests/unit/com/android/documentsui/GlobalSearchLoaderTest.java
@@ -55,6 +55,7 @@ public class GlobalSearchLoaderTest {
private TestEnv mEnv;
private TestActivity mActivity;
private GlobalSearchLoader mLoader;
+ private Bundle mQueryArgs = new Bundle();
@Before
public void setUp() {
@@ -65,10 +66,10 @@ public class GlobalSearchLoaderTest {
mEnv.state.action = State.ACTION_BROWSE;
mEnv.state.acceptMimes = new String[]{"*/*"};
- final Bundle queryArgs = new Bundle();
- queryArgs.putString(DocumentsContract.QUERY_ARG_DISPLAY_NAME, SEARCH_STRING);
+ mQueryArgs.putString(DocumentsContract.QUERY_ARG_DISPLAY_NAME, SEARCH_STRING);
mLoader = new GlobalSearchLoader(mActivity, mEnv.providers, mEnv.state,
- TestImmediateExecutor.createLookup(), new TestFileTypeLookup(), queryArgs);
+ TestImmediateExecutor.createLookup(), new TestFileTypeLookup(), mQueryArgs,
+ TestProvidersAccess.USER_ID);
final DocumentInfo doc = mEnv.model.createFile(SEARCH_STRING + ".jpg", FILE_FLAG);
doc.lastModified = System.currentTimeMillis();
@@ -105,6 +106,23 @@ public class GlobalSearchLoaderTest {
}
@Test
+ public void testCrossProfileRoot_notInTextSearch_beIgnored() {
+ mEnv.state.action = State.ACTION_GET_CONTENT;
+ mQueryArgs.remove(DocumentsContract.QUERY_ARG_DISPLAY_NAME);
+ TestProvidersAccess.DOWNLOADS.userId = TestProvidersAccess.OtherUser.USER_ID;
+ assertThat(mLoader.shouldIgnoreRoot(TestProvidersAccess.DOWNLOADS)).isTrue();
+ TestProvidersAccess.DOWNLOADS.userId = TestProvidersAccess.USER_ID;
+ }
+
+ @Test
+ public void testCrossProfileRoot_inTextSearch_beIncluded() {
+ mEnv.state.action = State.ACTION_GET_CONTENT;
+ TestProvidersAccess.DOWNLOADS.userId = TestProvidersAccess.OtherUser.USER_ID;
+ assertThat(mLoader.shouldIgnoreRoot(TestProvidersAccess.DOWNLOADS)).isFalse();
+ TestProvidersAccess.DOWNLOADS.userId = TestProvidersAccess.USER_ID;
+ }
+
+ @Test
public void testSearchResult_includeDirectory() {
final DocumentInfo doc = mEnv.model.createFolder(SEARCH_STRING);
doc.lastModified = System.currentTimeMillis();
diff --git a/tests/unit/com/android/documentsui/ProfileTabsTest.java b/tests/unit/com/android/documentsui/ProfileTabsTest.java
index 156c7cab1..92aaaae6f 100644
--- a/tests/unit/com/android/documentsui/ProfileTabsTest.java
+++ b/tests/unit/com/android/documentsui/ProfileTabsTest.java
@@ -72,7 +72,7 @@ public class ProfileTabsTest {
mTabLayout = view.findViewById(R.id.tabs);
mTestEnv = new TestEnvironment();
- mTestEnv.isSearching = false;
+ mTestEnv.isTextSearching = false;
mTestUserIdManager = new TestUserIdManager();
mTestCommonAddons = new TestCommonAddons();
@@ -152,7 +152,7 @@ public class ProfileTabsTest {
@Test
public void testUpdateView_twoUsers_isSearching_shouldHide() {
- mTestEnv.isSearching = true;
+ mTestEnv.isTextSearching = true;
initializeWithUsers(systemUser, managedUser);
assertThat(mTabLayout.getVisibility()).isEqualTo(View.GONE);
@@ -242,7 +242,7 @@ public class ProfileTabsTest {
*/
private static class TestEnvironment implements NavigationViewManager.Environment {
- public boolean isSearching = false;
+ public boolean isTextSearching = false;
@Override
public RootInfo getCurrentRoot() {
@@ -265,8 +265,8 @@ public class ProfileTabsTest {
}
@Override
- public boolean isSearching() {
- return isSearching;
+ public boolean isTextSearching() {
+ return isTextSearching;
}
}