Use PlatformConfig to gate behavior
This change moves away from AppOps and explicit targetSdk
checks in favor of PlatformConfig.
Test: atest AppsFilterTest
Test: adb shell device_config put package_manager_service package_query_filtering_enabled true && atest AppEnumerationTests
Fixes: 139348423
Bug: 136675067
Change-Id: If0af198c86210c05c2e10b71f7ae6dc0b7a3ea9a
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 895eba6..c561013 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -38,6 +38,8 @@
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 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 <queries>} 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 fa4e085..40c2cbe 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1707,6 +1707,7 @@
manifest. -->
<string-array name="config_forceQueryablePackages" translatable="false">
<item>com.android.settings</item>
+ <item>com.android.providers.settings</item>
<!-- Add packages here -->
</string-array>
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index 4431d86..7eb7438 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.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.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 @@
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<String> forceQueryableByDeviceSet = new HashSet<>();
Collections.addAll(forceQueryableByDeviceSet, forceQueryableWhitelist);
this.mForceQueryableByDevice = Collections.unmodifiableSet(forceQueryableByDeviceSet);
@@ -114,27 +113,83 @@
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 @@
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 @@
*/
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 @@
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 @@
&& 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 @@
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 @@
}
}
}
-
- 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 af20346..6081220 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.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 @@
private final Singleton<DisplayManager> mDisplayManagerProducer;
private final Singleton<StorageManager> mStorageManagerProducer;
private final Singleton<AppOpsManager> mAppOpsManagerProducer;
+ private final Singleton<AppsFilter> mAppsFilterProducer;
+ private final Singleton<PlatformCompat> mPlatformCompatProducer;
Injector(Context context, Object lock, Installer installer,
Object installLock, PackageAbiHelper abiHelper,
@@ -839,7 +842,9 @@
Producer<DeviceStorageMonitorInternal> deviceStorageMonitorProducer,
Producer<DisplayManager> displayManagerProducer,
Producer<StorageManager> storageManagerProducer,
- Producer<AppOpsManager> appOpsManagerProducer) {
+ Producer<AppOpsManager> appOpsManagerProducer,
+ Producer<AppsFilter> appsFilterProducer,
+ Producer<PlatformCompat> platformCompatProducer) {
mContext = context;
mLock = lock;
mInstaller = installer;
@@ -858,6 +863,8 @@
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 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 @@
* @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 @@
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 @@
mProtectedPackages = new ProtectedPackages(mContext);
mApexManager = ApexManager.create(mContext);
- mAppsFilter = AppsFilter.create(mContext);
+ mAppsFilter = mInjector.getAppsFilter();
// CHECKSTYLE:OFF IndentationCheck
synchronized (mInstallLock) {
@@ -2725,14 +2742,10 @@
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<PackageSetting> 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);
}
@@ -20459,6 +20472,8 @@
.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 75e5847..819091c 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 @@
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 @@
IPermissionManager mPermissionManagerMock;
@Mock
- AppsFilter.ConfigProvider mConfigProviderMock;
-
- @Mock
- AppOpsManager mAppOpsManager;
+ AppsFilter.FeatureConfig mFeatureConfigMock;
private Map<String, PackageParser.Package> mExisting = new ArrayMap<>();
@@ -108,16 +105,23 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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();
@@ -241,55 +244,11 @@
}
@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 @@
@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 @@
@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 @@
@Test
public void testNoTargetPackage_filters() {
final AppsFilter appsFilter =
- new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager,
+ new AppsFilter(mFeatureConfigMock, mPermissionManagerMock,
new String[]{}, false);
PackageSetting target = new PackageSettingBuilder()