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
This commit is contained in:
@@ -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)) {
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user