diff options
author | 2020-03-06 17:02:11 +0000 | |
---|---|---|
committer | 2020-03-10 09:55:34 +0000 | |
commit | 1e088e1926321ac93877a2afed9d89a205d95011 (patch) | |
tree | bc3b5bfe7906ea515d97334a4c7be66e47d15f86 | |
parent | 34810bc0cf5a8a927c80571d226bf1feed6ba911 (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
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; } } |