From 5d0888be751fa5c14b63ea437f9c2f2a929e6c05 Mon Sep 17 00:00:00 2001 From: Daniel Nishi Date: Mon, 22 May 2017 16:33:32 -0700 Subject: [PATCH] Fix an override filter bug. The override filter for storage to ensure that we filter by UUID and user id was designed as an override filter. This worked as long as there never was any other filters which could be used out of Storage Settings. It turns out the instant apps filter applies here. As a result, I've moved these filters into being "composite filters" which are composed with the primary filter instead of overriding the primary filter. Fixes: 35245772 Test: Settings Robotests... but as for the composing part it is b/34768986 Change-Id: I6f5acb909568ab02e81187c09fdda9533d635781 --- .../applications/ManageApplications.java | 18 ++++---- .../applications/ManageApplicationsTest.java | 43 +++++++++++++++---- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java index be3bdfa1f4e..76129b7d187 100644 --- a/src/com/android/settings/applications/ManageApplications.java +++ b/src/com/android/settings/applications/ManageApplications.java @@ -418,14 +418,14 @@ public class ManageApplications extends InstrumentedPreferenceFragment 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 @@ public class ManageApplications extends InstrumentedPreferenceFragment 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 class ManageApplications extends InstrumentedPreferenceFragment } } - public void setOverrideFilter(AppFilter overrideFilter) { - mOverrideFilter = overrideFilter; + public void setCompositeFilter(AppFilter compositeFilter) { + mCompositeFilter = compositeFilter; rebuild(true); } @@ -988,8 +988,8 @@ public class ManageApplications extends InstrumentedPreferenceFragment 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 92e556eaee0..d2077015509 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 static org.mockito.Mockito.mock; 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 @@ public class ManageApplicationsTest { } @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 @@ public class ManageApplicationsTest { } @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 @@ public class ManageApplicationsTest { } @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(); + } }