Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d0888be authored by Daniel Nishi's avatar Daniel Nishi
Browse files

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
parent ed8b39fe
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -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)) {
+35 −8
Original line number Diff line number Diff line
@@ -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();
    }
}