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:
Daniel Nishi
2017-05-22 16:33:32 -07:00
parent ed8b39fe60
commit 5d0888be75
2 changed files with 44 additions and 17 deletions

View File

@@ -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();
}
}