diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 895eba6cdec2b..c561013e67687 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -38,6 +38,8 @@ import android.app.PackageDeleteObserver; import android.app.PackageInstallObserver; import android.app.admin.DevicePolicyManager; import android.app.usage.StorageStatsManager; +import android.compat.annotation.ChangeId; +import android.compat.annotation.EnabledAfter; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -3369,6 +3371,17 @@ public abstract class PackageManager { */ public static final int VERSION_CODE_HIGHEST = -1; + /** + * Apps targeting Android R and above will need to declare the packages and intents they intend + * to use to get details about other apps on a device. Such declarations must be made via the + * {@code } tag in the manifest. + * + * @hide + */ + @ChangeId + @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q) + public static final long FILTER_APPLICATION_QUERY = 135549675L; + /** {@hide} */ public int getUserId() { return UserHandle.myUserId(); diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index fa4e085201267..40c2cbedc73d7 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1707,6 +1707,7 @@ manifest. --> com.android.settings + com.android.providers.settings diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 4431d869af707..7eb74381f7ae6 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -16,10 +16,10 @@ package com.android.server.pm; +import static android.provider.DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE; + import android.Manifest; import android.annotation.Nullable; -import android.app.AppOpsManager; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.PackageParser; @@ -28,11 +28,14 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.permission.IPermissionManager; +import android.provider.DeviceConfig; import android.util.ArraySet; import android.util.Slog; import android.util.SparseArray; import com.android.internal.R; +import com.android.server.FgThread; +import com.android.server.compat.PlatformCompat; import java.io.PrintWriter; import java.util.Collections; @@ -41,7 +44,6 @@ import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; /** * The entity responsible for filtering visibility between apps based on declarations in their @@ -98,14 +100,11 @@ class AppsFilter { private final IPermissionManager mPermissionManager; - private final AppOpsManager mAppOpsManager; - private final ConfigProvider mConfigProvider; + private final FeatureConfig mFeatureConfig; - AppsFilter(ConfigProvider configProvider, IPermissionManager permissionManager, - AppOpsManager appOpsManager, String[] forceQueryableWhitelist, - boolean systemAppsQueryable) { - mConfigProvider = configProvider; - mAppOpsManager = appOpsManager; + AppsFilter(FeatureConfig featureConfig, IPermissionManager permissionManager, + String[] forceQueryableWhitelist, boolean systemAppsQueryable) { + mFeatureConfig = featureConfig; final HashSet forceQueryableByDeviceSet = new HashSet<>(); Collections.addAll(forceQueryableByDeviceSet, forceQueryableWhitelist); this.mForceQueryableByDevice = Collections.unmodifiableSet(forceQueryableByDeviceSet); @@ -114,27 +113,83 @@ class AppsFilter { mSystemAppsQueryable = systemAppsQueryable; } - public static AppsFilter create(Context context) { - // tracks whether the feature is enabled where -1 is unknown, 0 is false and 1 is true; - final AtomicInteger featureEnabled = new AtomicInteger(-1); + public interface FeatureConfig { + /** Called when the system is ready and components can be queried. */ + void onSystemReady(); + /** @return true if we should filter apps at all. */ + boolean isGloballyEnabled(); + + /** @return true if the feature is enabled for the given package. */ + boolean packageIsEnabled(PackageParser.Package pkg); + } + + private static class FeatureConfigImpl implements FeatureConfig { + private static final String FILTERING_ENABLED_NAME = "package_query_filtering_enabled"; + + // STOPSHIP(patb): set this to true if we plan to launch this in R + private static final boolean DEFAULT_ENABLED_STATE = false; + private final PackageManagerService.Injector mInjector; + private volatile boolean mFeatureEnabled = DEFAULT_ENABLED_STATE; + + private FeatureConfigImpl(PackageManagerService.Injector injector) { + mInjector = injector; + } + + @Override + public void onSystemReady() { + mFeatureEnabled = DeviceConfig.getBoolean( + NAMESPACE_PACKAGE_MANAGER_SERVICE, FILTERING_ENABLED_NAME, + DEFAULT_ENABLED_STATE); + DeviceConfig.addOnPropertiesChangedListener( + NAMESPACE_PACKAGE_MANAGER_SERVICE, FgThread.getExecutor(), + properties -> { + synchronized (FeatureConfigImpl.this) { + mFeatureEnabled = properties.getBoolean( + FILTERING_ENABLED_NAME, DEFAULT_ENABLED_STATE); + } + }); + } + + @Override + public boolean isGloballyEnabled() { + return mFeatureEnabled; + } + + @Override + public boolean packageIsEnabled(PackageParser.Package pkg) { + final PlatformCompat compatibility = mInjector.getCompatibility(); + if (compatibility == null) { + Slog.wtf(TAG, "PlatformCompat is null"); + return mFeatureEnabled; + } + return compatibility.isChangeEnabled( + PackageManager.FILTER_APPLICATION_QUERY, pkg.applicationInfo); + } + } + + + public static AppsFilter create(PackageManagerService.Injector injector) { final boolean forceSystemAppsQueryable = - context.getResources().getBoolean(R.bool.config_forceSystemPackagesQueryable); + injector.getContext().getResources() + .getBoolean(R.bool.config_forceSystemPackagesQueryable); + final FeatureConfig featureConfig = new FeatureConfigImpl(injector); final String[] forcedQueryablePackageNames; if (forceSystemAppsQueryable) { // all system apps already queryable, no need to read and parse individual exceptions forcedQueryablePackageNames = new String[]{}; } else { forcedQueryablePackageNames = - context.getResources().getStringArray(R.array.config_forceQueryablePackages); + injector.getContext().getResources() + .getStringArray(R.array.config_forceQueryablePackages); for (int i = 0; i < forcedQueryablePackageNames.length; i++) { forcedQueryablePackageNames[i] = forcedQueryablePackageNames[i].intern(); } } IPermissionManager permissionmgr = (IPermissionManager) ServiceManager.getService("permissionmgr"); - return new AppsFilter(() -> false, permissionmgr, - context.getSystemService(AppOpsManager.class), forcedQueryablePackageNames, + + return new AppsFilter(featureConfig, permissionmgr, forcedQueryablePackageNames, forceSystemAppsQueryable); } @@ -186,6 +241,10 @@ class AppsFilter { currentUser.get(targetPackage.pkg.packageName).add(initiatingPackage.pkg.packageName); } + public void onSystemReady() { + mFeatureConfig.onSystemReady(); + } + /** * Adds a package that should be considered when filtering visibility between apps. * @@ -267,11 +326,11 @@ class AppsFilter { */ public boolean shouldFilterApplication(int callingUid, @Nullable SettingBase callingSetting, PackageSetting targetPkgSetting, int userId) { - if (callingUid < Process.FIRST_APPLICATION_UID) { + final boolean featureEnabled = mFeatureConfig.isGloballyEnabled(); + if (!featureEnabled && !DEBUG_RUN_WHEN_DISABLED) { return false; } - final boolean featureEnabled = mConfigProvider.isEnabled(); - if (!featureEnabled && !DEBUG_RUN_WHEN_DISABLED) { + if (callingUid < Process.FIRST_APPLICATION_UID) { return false; } if (callingSetting == null) { @@ -312,31 +371,21 @@ class AppsFilter { return true; } } - if (!featureEnabled) { return false; } - final int mode = mAppOpsManager - .checkOpNoThrow(AppOpsManager.OP_QUERY_ALL_PACKAGES, callingUid, - callingPkgSetting.pkg.packageName); - switch (mode) { - case AppOpsManager.MODE_DEFAULT: - if (DEBUG_LOGGING) { - Slog.d(TAG, "filtered interaction: " + callingPkgSetting.name + " -> " - + targetPkgSetting.name + (DEBUG_ALLOW_ALL ? " ALLOWED" : "")); - } - return !DEBUG_ALLOW_ALL; - case AppOpsManager.MODE_ALLOWED: - // explicitly allowed to see all packages, don't filter - return false; - case AppOpsManager.MODE_ERRORED: - // deny / error: let's log so developer can audit usages - Slog.i(TAG, callingPkgSetting.pkg.packageName - + " blocked from accessing " + targetPkgSetting.pkg.packageName); - case AppOpsManager.MODE_IGNORED: - // fall through - default: - return true; + if (mFeatureConfig.packageIsEnabled(callingPkgSetting.pkg)) { + if (DEBUG_LOGGING) { + Slog.d(TAG, "interaction: " + callingPkgSetting.name + " -> " + + targetPkgSetting.name + (DEBUG_ALLOW_ALL ? " ALLOWED" : "BLOCKED")); + } + return !DEBUG_ALLOW_ALL; + } else { + if (DEBUG_LOGGING) { + Slog.d(TAG, "interaction: " + callingPkgSetting.name + " -> " + + targetPkgSetting.name + " DISABLED"); + } + return false; } } @@ -377,6 +426,13 @@ class AppsFilter { && mImplicitlyQueryable.get(userId).get(callingName).contains(targetName)) { return false; } + if (callingPkgSetting.pkg.instrumentation.size() > 0) { + for (int i = 0, max = callingPkgSetting.pkg.instrumentation.size(); i < max; i++) { + if (callingPkgSetting.pkg.instrumentation.get(i).info.targetPackage == targetName) { + return false; + } + } + } try { if (mPermissionManager.checkPermission( Manifest.permission.QUERY_ALL_PACKAGES, callingName, userId) @@ -400,7 +456,6 @@ class AppsFilter { pw.println(); pw.println("Queries:"); dumpState.onTitlePrinted(); - pw.println(" enabled: " + mConfigProvider.isEnabled()); pw.println(" system apps queryable: " + mSystemAppsQueryable); dumpPackageSet(pw, filteringPackageName, mForceQueryableByDevice, "System whitelist", " "); dumpPackageSet(pw, filteringPackageName, mForceQueryable, "forceQueryable", " "); @@ -442,9 +497,4 @@ class AppsFilter { } } } - - public interface ConfigProvider { - boolean isEnabled(); - } - } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 4f0e4c8160c18..15a3a725d69df 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -300,6 +300,7 @@ import com.android.server.ServiceThread; import com.android.server.SystemConfig; import com.android.server.SystemServerInitThreadPool; import com.android.server.Watchdog; +import com.android.server.compat.PlatformCompat; import com.android.server.net.NetworkPolicyManagerInternal; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.Settings.DatabaseVersion; @@ -824,6 +825,8 @@ public class PackageManagerService extends IPackageManager.Stub private final Singleton mDisplayManagerProducer; private final Singleton mStorageManagerProducer; private final Singleton mAppOpsManagerProducer; + private final Singleton mAppsFilterProducer; + private final Singleton mPlatformCompatProducer; Injector(Context context, Object lock, Installer installer, Object installLock, PackageAbiHelper abiHelper, @@ -839,7 +842,9 @@ public class PackageManagerService extends IPackageManager.Stub Producer deviceStorageMonitorProducer, Producer displayManagerProducer, Producer storageManagerProducer, - Producer appOpsManagerProducer) { + Producer appOpsManagerProducer, + Producer appsFilterProducer, + Producer platformCompatProducer) { mContext = context; mLock = lock; mInstaller = installer; @@ -858,6 +863,8 @@ public class PackageManagerService extends IPackageManager.Stub mDisplayManagerProducer = new Singleton<>(displayManagerProducer); mStorageManagerProducer = new Singleton<>(storageManagerProducer); mAppOpsManagerProducer = new Singleton<>(appOpsManagerProducer); + mAppsFilterProducer = new Singleton<>(appsFilterProducer); + mPlatformCompatProducer = new Singleton<>(platformCompatProducer); } /** @@ -943,6 +950,14 @@ public class PackageManagerService extends IPackageManager.Stub public AppOpsManager getAppOpsManager() { return mAppOpsManagerProducer.get(this, mPackageManager); } + + public AppsFilter getAppsFilter() { + return mAppsFilterProducer.get(this, mPackageManager); + } + + public PlatformCompat getCompatibility() { + return mPlatformCompatProducer.get(this, mPackageManager); + } } private final AppsFilter mAppsFilter; @@ -2273,9 +2288,9 @@ public class PackageManagerService extends IPackageManager.Stub * @param packageVolume The storage volume of the package. * @param packageIsExternal true if the package is currently installed on * external/removable/unprotected storage. - * @return {@link StorageEnum#TYPE_UNKNOWN} if the package is not stored externally or the - * corresponding {@link StorageEnum} storage type value if it is. - * corresponding {@link StorageEnum} storage type value if it is. + * @return {@link StorageEnums#UNKNOWN} if the package is not stored externally or the + * corresponding {@link StorageEnums} storage type value if it is. + * corresponding {@link StorageEnums} storage type value if it is. */ private static int getPackageExternalStorageType(VolumeInfo packageVolume, boolean packageIsExternal) { @@ -2432,7 +2447,9 @@ public class PackageManagerService extends IPackageManager.Stub new Injector.LocalServicesProducer<>(DeviceStorageMonitorInternal.class), new Injector.SystemServiceProducer<>(DisplayManager.class), new Injector.SystemServiceProducer<>(StorageManager.class), - new Injector.SystemServiceProducer<>(AppOpsManager.class)); + new Injector.SystemServiceProducer<>(AppOpsManager.class), + (i, pm) -> AppsFilter.create(i), + (i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat")); PackageManagerService m = new PackageManagerService(injector, factoryTest, onlyCore); t.traceEnd(); // "create package manager" @@ -2617,7 +2634,7 @@ public class PackageManagerService extends IPackageManager.Stub mProtectedPackages = new ProtectedPackages(mContext); mApexManager = ApexManager.create(mContext); - mAppsFilter = AppsFilter.create(mContext); + mAppsFilter = mInjector.getAppsFilter(); // CHECKSTYLE:OFF IndentationCheck synchronized (mInstallLock) { @@ -2725,14 +2742,10 @@ public class PackageManagerService extends IPackageManager.Stub mIsPreNMR1Upgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.N_MR1; mIsPreQUpgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.Q; - int preUpgradeSdkVersion = ver.sdkVersion; - // save off the names of pre-existing system packages prior to scanning; we don't // want to automatically grant runtime permissions for new system apps if (mPromoteSystemApps) { - Iterator pkgSettingIter = mSettings.mPackages.values().iterator(); - while (pkgSettingIter.hasNext()) { - PackageSetting ps = pkgSettingIter.next(); + for (PackageSetting ps : mSettings.mPackages.values()) { if (isSystemApp(ps)) { mExistingSystemPackages.add(ps.name); } @@ -20445,6 +20458,8 @@ public class PackageManagerService extends IPackageManager.Stub .getUriFor(Secure.INSTANT_APPS_ENABLED), false, co, UserHandle.USER_ALL); co.onChange(true); + mAppsFilter.onSystemReady(); + // Disable any carrier apps. We do this very early in boot to prevent the apps from being // disabled after already being started. CarrierAppUtils.disableCarrierAppsUntilPrivileged(mContext.getOpPackageName(), this, diff --git a/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java b/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java index 75e5847abe90f..819091c378b83 100644 --- a/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java @@ -19,12 +19,12 @@ package com.android.server.pm; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.AppOpsManager; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; @@ -54,10 +54,7 @@ public class AppsFilterTest { IPermissionManager mPermissionManagerMock; @Mock - AppsFilter.ConfigProvider mConfigProviderMock; - - @Mock - AppOpsManager mAppOpsManager; + AppsFilter.FeatureConfig mFeatureConfigMock; private Map mExisting = new ArrayMap<>(); @@ -108,16 +105,23 @@ public class AppsFilterTest { when(mPermissionManagerMock .checkPermission(anyString(), anyString(), anyInt())) .thenReturn(PackageManager.PERMISSION_DENIED); - when(mConfigProviderMock.isEnabled()).thenReturn(true); - when(mAppOpsManager.checkOpNoThrow(eq(AppOpsManager.OP_QUERY_ALL_PACKAGES), eq( - DUMMY_CALLING_UID), anyString())).thenReturn(AppOpsManager.MODE_DEFAULT); + when(mFeatureConfigMock.isGloballyEnabled()).thenReturn(true); + when(mFeatureConfigMock.packageIsEnabled(any(PackageParser.Package.class))) + .thenReturn(true); + } + + @Test + public void testSystemReadyPropogates() throws Exception { + final AppsFilter appsFilter = + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); + appsFilter.onSystemReady(); + verify(mFeatureConfigMock).onSystemReady(); } @Test public void testQueriesAction_FilterMatches() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, - new String[]{}, false); + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package", new IntentFilter("TEST_ACTION"))).build(); @@ -130,8 +134,7 @@ public class AppsFilterTest { @Test public void testQueriesAction_NoMatchingAction_Filters() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, - new String[]{}, false); + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -144,7 +147,7 @@ public class AppsFilterTest { @Test public void testQueriesAction_NoMatchingActionFilterLowSdk_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -158,7 +161,7 @@ public class AppsFilterTest { @Test public void testNoQueries_Filters() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -171,7 +174,7 @@ public class AppsFilterTest { @Test public void testForceQueryable_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = @@ -186,7 +189,7 @@ public class AppsFilterTest { @Test public void testForceQueryableByDevice_SystemCaller_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{"com.some.package"}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")) @@ -201,7 +204,7 @@ public class AppsFilterTest { @Test public void testForceQueryableByDevice_NonSystemCaller_Filters() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{"com.some.package"}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -215,7 +218,7 @@ public class AppsFilterTest { @Test public void testSystemQueryable_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, true /* system force queryable */); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")) @@ -230,7 +233,7 @@ public class AppsFilterTest { @Test public void testQueriesPackage_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -240,56 +243,12 @@ public class AppsFilterTest { assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } - @Test - public void testNoQueries_AppOpModeDeny_Filters() { - when(mAppOpsManager.checkOpNoThrow(eq(AppOpsManager.OP_QUERY_ALL_PACKAGES), eq( - DUMMY_CALLING_UID), anyString())).thenReturn(AppOpsManager.MODE_ERRORED); - final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, - new String[]{}, false); - - PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); - PackageSetting calling = simulateAddPackage(appsFilter, - pkg("com.some.other.package")).build(); - - assertTrue(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); - } - - @Test - public void testNoQueries_AppOpModeAllow_DoesntFilter() { - when(mAppOpsManager.checkOpNoThrow(eq(AppOpsManager.OP_QUERY_ALL_PACKAGES), eq( - DUMMY_CALLING_UID), anyString())).thenReturn(AppOpsManager.MODE_ALLOWED); - final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, - new String[]{}, false); - - PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); - PackageSetting calling = simulateAddPackage(appsFilter, - pkg("com.some.other.package")).build(); - - assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); - } - - @Test - public void testNoQueries_AppOpModeIgnore_Filters() { - when(mAppOpsManager.checkOpNoThrow(eq(AppOpsManager.OP_QUERY_ALL_PACKAGES), eq( - DUMMY_CALLING_UID), anyString())).thenReturn(AppOpsManager.MODE_IGNORED); - final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, - new String[]{}, false); - - PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); - PackageSetting calling = simulateAddPackage(appsFilter, - pkg("com.some.other.package")).build(); - - assertTrue(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); - } - @Test public void testNoQueries_FeatureOff_DoesntFilter() { - when(mConfigProviderMock.isEnabled()).thenReturn(false); + when(mFeatureConfigMock.packageIsEnabled(any(PackageParser.Package.class))) + .thenReturn(false); final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -302,7 +261,7 @@ public class AppsFilterTest { @Test public void testSystemUid_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -315,7 +274,7 @@ public class AppsFilterTest { @Test public void testNonSystemUid_NoCallingSetting_Filters() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -326,7 +285,7 @@ public class AppsFilterTest { @Test public void testNoTargetPackage_filters() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = new PackageSettingBuilder()