Merge "Fix an override filter bug." into oc-dev
am: 5cc0a122d3

Change-Id: I9188da01862ae2af964ac09b84f5b3c6078572cc
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index be3bdfa..76129b7 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -418,14 +418,14 @@
             mFilterAdapter.enableFilter(FILTER_APPS_POWER_WHITELIST_ALL);
         }
 
-        AppFilter overrideFilter = getOverrideFilter(mListType, mStorageType, mVolumeUuid);
-        if (overrideFilter != null) {
-            mApplications.setOverrideFilter(overrideFilter);
+        AppFilter compositeFilter = getCompositeFilter(mListType, mStorageType, mVolumeUuid);
+        if (compositeFilter != null) {
+            mApplications.setCompositeFilter(compositeFilter);
         }
     }
 
     @VisibleForTesting
-    static @Nullable AppFilter getOverrideFilter(int listType, int storageType, String volumeUuid) {
+    static @Nullable AppFilter getCompositeFilter(int listType, int storageType, String volumeUuid) {
         AppFilter filter = new VolumeFilter(volumeUuid);
         if (listType == LIST_TYPE_STORAGE) {
             if (storageType == STORAGE_TYPE_MUSIC) {
@@ -845,7 +845,7 @@
         private int mWhichSize = SIZE_TOTAL;
         CharSequence mCurFilterPrefix;
         private PackageManager mPm;
-        private AppFilter mOverrideFilter;
+        private AppFilter mCompositeFilter;
         private boolean mHasReceivedLoadEntries;
         private boolean mHasReceivedBridgeCallback;
         private FileViewHolderController mExtraViewController;
@@ -909,8 +909,8 @@
             }
         }
 
-        public void setOverrideFilter(AppFilter overrideFilter) {
-            mOverrideFilter = overrideFilter;
+        public void setCompositeFilter(AppFilter compositeFilter) {
+            mCompositeFilter = compositeFilter;
             rebuild(true);
         }
 
@@ -988,8 +988,8 @@
                 mWhichSize = SIZE_INTERNAL;
             }
             filterObj = FILTERS[mFilterMode];
-            if (mOverrideFilter != null) {
-                filterObj = mOverrideFilter;
+            if (mCompositeFilter != null) {
+                filterObj = new CompoundFilter(filterObj, mCompositeFilter);
             }
             if (!mManageApplications.mShowSystem) {
                 if (LIST_TYPES_WITH_INSTANT.contains(mManageApplications.mListType)) {
diff --git a/tests/unit/src/com/android/settings/applications/ManageApplicationsTest.java b/tests/unit/src/com/android/settings/applications/ManageApplicationsTest.java
index 92e556e..d207701 100644
--- a/tests/unit/src/com/android/settings/applications/ManageApplicationsTest.java
+++ b/tests/unit/src/com/android/settings/applications/ManageApplicationsTest.java
@@ -22,16 +22,20 @@
 
 import android.content.pm.ApplicationInfo;
 
+import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppFilter;
 
+import com.android.settingslib.applications.ApplicationsState.CompoundFilter;
+import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
+import java.lang.reflect.Field;
 import org.junit.Test;
 
 public class ManageApplicationsTest {
     @Test
-    public void getOverrideFilter_filtersVolumeForAudio() {
+    public void getCompositeFilter_filtersVolumeForAudio() {
         AppFilter filter =
-                ManageApplications.getOverrideFilter(
+                ManageApplications.getCompositeFilter(
                         ManageApplications.LIST_TYPE_STORAGE,
                         ManageApplications.STORAGE_TYPE_MUSIC,
                         "uuid");
@@ -45,9 +49,9 @@
     }
 
     @Test
-    public void getOverrideFilter_filtersVolumeForVideo() {
+    public void getCompositeFilter_filtersVolumeForVideo() {
         AppFilter filter =
-                ManageApplications.getOverrideFilter(
+                ManageApplications.getCompositeFilter(
                         ManageApplications.LIST_TYPE_MOVIES,
                         ManageApplications.STORAGE_TYPE_DEFAULT,
                         "uuid");
@@ -61,9 +65,9 @@
     }
 
     @Test
-    public void getOverrideFilter_filtersVolumeForGames() {
+    public void getCompositeFilter_filtersVolumeForGames() {
         ApplicationsState.AppFilter filter =
-                ManageApplications.getOverrideFilter(
+                ManageApplications.getCompositeFilter(
                         ManageApplications.LIST_TYPE_GAMES,
                         ManageApplications.STORAGE_TYPE_DEFAULT,
                         "uuid");
@@ -77,12 +81,35 @@
     }
 
     @Test
-    public void getOverrideFilter_isEmptyNormally() {
+    public void getCompositeFilter_isEmptyNormally() {
         ApplicationsState.AppFilter filter =
-                ManageApplications.getOverrideFilter(
+                ManageApplications.getCompositeFilter(
                         ManageApplications.LIST_TYPE_MAIN,
                         ManageApplications.STORAGE_TYPE_DEFAULT,
                         "uuid");
         assertThat(filter).isNull();
     }
+
+    @Test
+    public void getCompositeFilter_worksWithInstantApps() throws Exception {
+        Field field = AppUtils.class.getDeclaredField("sInstantAppDataProvider");
+        field.setAccessible(true);
+        field.set(AppUtils.class, (InstantAppDataProvider) (i -> true));
+
+        AppFilter filter =
+            ManageApplications.getCompositeFilter(
+                ManageApplications.LIST_TYPE_STORAGE,
+                ManageApplications.STORAGE_TYPE_MUSIC,
+                "uuid");
+        AppFilter composedFilter = new CompoundFilter(ApplicationsState.FILTER_INSTANT, filter);
+
+        final ApplicationInfo info = new ApplicationInfo();
+        info.volumeUuid = "uuid";
+        info.category = ApplicationInfo.CATEGORY_AUDIO;
+        info.privateFlags = ApplicationInfo.PRIVATE_FLAG_INSTANT;
+        final ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
+        appEntry.info = info;
+
+        assertThat(composedFilter.filterApp(appEntry)).isTrue();
+    }
 }