Merge "Use PlatformConfig to gate behavior"
This commit is contained in:
committed by
Android (Google) Code Review
commit
cf2efde135
@@ -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 <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();
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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<String> 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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<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 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
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 @@ 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<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);
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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<String, PackageParser.Package> 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()
|
||||
|
||||
Reference in New Issue
Block a user