Merge "Hide apps during search across profile" into rvc-dev
diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java
index 1711928..3bf2227 100644
--- a/src/com/android/documentsui/BaseActivity.java
+++ b/src/com/android/documentsui/BaseActivity.java
@@ -90,6 +90,7 @@
 
     protected SearchViewManager mSearchManager;
     protected AppsRowManager mAppsRowManager;
+    protected UserIdManager mUserIdManager;
     protected State mState;
 
     @Injected
@@ -199,6 +200,9 @@
             @Override
             public void onSearchViewChanged(boolean opened) {
                 mNavigator.update();
+                // We also need to update AppsRowManager because we may want to show/hide the
+                // appsRow in cross-profile search according to the searching conditions.
+                mAppsRowManager.updateView(BaseActivity.this);
             }
 
             @Override
@@ -248,6 +252,7 @@
                         cmdInterceptor);
 
         ViewGroup chipGroup = findViewById(R.id.search_chip_group);
+        mUserIdManager = DocumentsApplication.getUserIdManager(this);
         mSearchManager = new SearchViewManager(searchListener, queryInterceptor,
                 chipGroup, icicle);
         // initialize the chip sets by accept mime types
diff --git a/src/com/android/documentsui/dirlist/AppsRowManager.java b/src/com/android/documentsui/dirlist/AppsRowManager.java
index 7b7dbc8..4af7ccf 100644
--- a/src/com/android/documentsui/dirlist/AppsRowManager.java
+++ b/src/com/android/documentsui/dirlist/AppsRowManager.java
@@ -26,6 +26,7 @@
 import com.android.documentsui.ActionHandler;
 import com.android.documentsui.BaseActivity;
 import com.android.documentsui.R;
+import com.android.documentsui.UserIdManager;
 import com.android.documentsui.base.State;
 import com.android.documentsui.base.UserId;
 import com.android.documentsui.dirlist.AppsRowItemData.AppData;
@@ -47,11 +48,14 @@
     private final ActionHandler mActionHandler;
     private final List<AppsRowItemData> mDataList;
     private final boolean mMaybeShowBadge;
+    private final UserIdManager mUserIdManager;
 
-    public AppsRowManager(ActionHandler handler, boolean maybeShowBadge) {
+    public AppsRowManager(ActionHandler handler, boolean maybeShowBadge,
+            UserIdManager userIdManager) {
         mDataList = new ArrayList<>();
         mActionHandler = handler;
         mMaybeShowBadge = maybeShowBadge;
+        mUserIdManager = userIdManager;
     }
 
     public List<AppsRowItemData> updateList(List<Item> itemList) {
@@ -80,17 +84,22 @@
         return mDataList;
     }
 
-    private boolean shouldShow(State state) {
+    private boolean shouldShow(State state, boolean isTextSearching) {
         boolean isHiddenAction = state.action == State.ACTION_CREATE
                 || state.action == State.ACTION_OPEN_TREE
                 || state.action == State.ACTION_PICK_COPY_DESTINATION;
-        return state.stack.isRecents() && !isHiddenAction && mDataList.size() > 0;
+        boolean isTextSearchingAcrossProfile = mUserIdManager.getUserIds().size() > 1
+                && state.supportsCrossProfile()
+                && isTextSearching;
+
+        return state.stack.isRecents() && !isHiddenAction && mDataList.size() > 0
+                && !isTextSearchingAcrossProfile;
     }
 
     public void updateView(BaseActivity activity) {
         final View appsRowLayout = activity.findViewById(R.id.apps_row);
 
-        if (!shouldShow(activity.getDisplayState())) {
+        if (!shouldShow(activity.getDisplayState(), activity.isTextSearching())) {
             appsRowLayout.setVisibility(View.GONE);
             return;
         }
diff --git a/src/com/android/documentsui/files/FilesActivity.java b/src/com/android/documentsui/files/FilesActivity.java
index 0837483..f1a58eb 100644
--- a/src/com/android/documentsui/files/FilesActivity.java
+++ b/src/com/android/documentsui/files/FilesActivity.java
@@ -155,7 +155,8 @@
                 mInjector.selectionMgr,
                 mProfileTabsAddonsStub);
 
-        mAppsRowManager = new AppsRowManager(mInjector.actions, mState.supportsCrossProfile());
+        mAppsRowManager = new AppsRowManager(mInjector.actions, mState.supportsCrossProfile(),
+                mUserIdManager);
         mInjector.appsRowManager = mAppsRowManager;
 
         mActivityInputHandler =
diff --git a/src/com/android/documentsui/picker/PickActivity.java b/src/com/android/documentsui/picker/PickActivity.java
index 775ea1e..fd8285d 100644
--- a/src/com/android/documentsui/picker/PickActivity.java
+++ b/src/com/android/documentsui/picker/PickActivity.java
@@ -138,13 +138,14 @@
                 ProviderExecutor::forAuthority,
                 mInjector,
                 LastAccessedStorage.create(),
-                DocumentsApplication.getUserIdManager(this));
+                mUserIdManager);
 
         mInjector.searchManager = mSearchManager;
 
         Intent intent = getIntent();
 
-        mAppsRowManager = new AppsRowManager(mInjector.actions, mState.supportsCrossProfile());
+        mAppsRowManager = new AppsRowManager(mInjector.actions, mState.supportsCrossProfile(),
+                mUserIdManager);
         mInjector.appsRowManager = mAppsRowManager;
 
         mSharedInputHandler =
diff --git a/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java b/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java
index d5a7f5c..893a4fa 100644
--- a/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java
+++ b/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.documentsui.dirlist;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -33,6 +35,7 @@
 import com.android.documentsui.ActionHandler;
 import com.android.documentsui.BaseActivity;
 import com.android.documentsui.R;
+import com.android.documentsui.TestUserIdManager;
 import com.android.documentsui.base.State;
 import com.android.documentsui.base.UserId;
 import com.android.documentsui.sidebar.AppItem;
@@ -42,6 +45,8 @@
 import com.android.documentsui.testing.TestProvidersAccess;
 import com.android.documentsui.testing.TestResolveInfo;
 
+import com.google.common.collect.Lists;
+
 import org.junit.Before;
 import org.junit.Test;
 
@@ -55,6 +60,7 @@
     private ActionHandler mActionHandler;
     private boolean mMaybeShowBadge;
     private BaseActivity mActivity;
+    private TestUserIdManager mTestUserIdManager;
     private State mState;
 
     private View mAppsRow;
@@ -63,8 +69,9 @@
     @Before
     public void setUp() {
         mActionHandler = new TestActionHandler();
+        mTestUserIdManager = new TestUserIdManager();
 
-        mAppsRowManager = new AppsRowManager(mActionHandler, mMaybeShowBadge);
+        mAppsRowManager = new AppsRowManager(mActionHandler, mMaybeShowBadge, mTestUserIdManager);
 
         Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
         LayoutInflater layoutInflater = LayoutInflater.from(context);
@@ -78,6 +85,9 @@
         when(mActivity.findViewById(R.id.apps_row)).thenReturn(mAppsRow);
         when(mActivity.findViewById(R.id.apps_group)).thenReturn(mAppsGroup);
         when(mActivity.getSelectedUser()).thenReturn(TestProvidersAccess.USER_ID);
+
+        mTestUserIdManager.userIds =
+                Lists.newArrayList(UserId.DEFAULT_USER, TestProvidersAccess.OtherUser.USER_ID);
     }
 
     @Test
@@ -220,6 +230,48 @@
     }
 
     @Test
+    public void testUpdateView_crossProfileSearch_hideRow() {
+        mState.action = State.ACTION_GET_CONTENT;
+        when(mActivity.isTextSearching()).thenReturn(true);
+
+        mState.stack.changeRoot(TestProvidersAccess.RECENTS);
+        final List<Item> rootList = new ArrayList<>();
+        rootList.add(new RootItem(TestProvidersAccess.INSPECTOR, mActionHandler, mMaybeShowBadge));
+        rootList.add(new RootItem(TestProvidersAccess.AUDIO, mActionHandler, mMaybeShowBadge));
+        rootList.add(new RootItem(TestProvidersAccess.HAMMY, mActionHandler, mMaybeShowBadge));
+        rootList.add(new RootItem(TestProvidersAccess.IMAGE, mActionHandler, mMaybeShowBadge));
+        rootList.add(new RootItem(TestProvidersAccess.OtherUser.DOWNLOADS, mActionHandler,
+                mMaybeShowBadge));
+        rootList.add(new RootItem(TestProvidersAccess.OtherUser.PICKLES, mActionHandler,
+                mMaybeShowBadge));
+        mAppsRowManager.updateList(rootList);
+        mAppsRowManager.updateView(mActivity);
+
+        assertThat(mAppsRow.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void testUpdateView_notCrossProfileSearch_showRow() {
+        mState.action = State.ACTION_GET_CONTENT;
+        when(mActivity.isTextSearching()).thenReturn(false);
+
+        mState.stack.changeRoot(TestProvidersAccess.RECENTS);
+        final List<Item> rootList = new ArrayList<>();
+        rootList.add(new RootItem(TestProvidersAccess.INSPECTOR, mActionHandler, mMaybeShowBadge));
+        rootList.add(new RootItem(TestProvidersAccess.AUDIO, mActionHandler, mMaybeShowBadge));
+        rootList.add(new RootItem(TestProvidersAccess.HAMMY, mActionHandler, mMaybeShowBadge));
+        rootList.add(new RootItem(TestProvidersAccess.IMAGE, mActionHandler, mMaybeShowBadge));
+        rootList.add(new RootItem(TestProvidersAccess.OtherUser.DOWNLOADS, mActionHandler,
+                mMaybeShowBadge));
+        rootList.add(new RootItem(TestProvidersAccess.OtherUser.PICKLES, mActionHandler,
+                mMaybeShowBadge));
+        mAppsRowManager.updateList(rootList);
+        mAppsRowManager.updateView(mActivity);
+
+        assertThat(mAppsRow.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
     public void testUpdateView_noItemsOnSelectedUser_hideRow() {
         mState.action = State.ACTION_GET_CONTENT;
         mState.stack.changeRoot(TestProvidersAccess.RECENTS);