Add DPM API to block apps from using metered data.
Bug: 63700027
Test: cts-tradefed run singleCommand cts-dev -m CtsDevicePolicyManagerTestCases -t \
com.android.cts.devicepolicy.MixedDeviceOwnerTest#testSetMeteredDataDisabled
Test: cts-tradefed run singleCommand cts-dev -m CtsDevicePolicyManagerTestCases -t \
com.android.cts.devicepolicy.MixedProfileOwnerTest#testSetMeteredDataDisabled
Test: atest com.android.server.devicepolicy.DevicePolicyManagerTest#testSetGetMeteredDataDisabled
Change-Id: I147399d316f375c68b415dc6ede837c53cd1aad0
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index d26a3c7..26da436 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -126,6 +126,7 @@
permission.MANAGE_DEVICE_ADMINS, permission.MANAGE_PROFILE_AND_DEVICE_OWNERS,
permission.MANAGE_USERS, permission.INTERACT_ACROSS_USERS_FULL);
public static final String NOT_DEVICE_OWNER_MSG = "does not own the device";
+ public static final String NOT_PROFILE_OWNER_MSG = "does not own the profile";
public static final String ONGOING_CALL_MSG = "ongoing call on the device";
// TODO replace all instances of this with explicit {@link #mServiceContext}.
@@ -301,10 +302,10 @@
// Verify
verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
- MockUtils.checkAdminApps(admin1.getPackageName()),
+ MockUtils.checkApps(admin1.getPackageName()),
eq(UserHandle.USER_SYSTEM));
verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
- MockUtils.checkAdminApps(admin2.getPackageName(),
+ MockUtils.checkApps(admin2.getPackageName(),
adminAnotherPackage.getPackageName()),
eq(DpmMockContext.CALLER_USER_HANDLE));
verify(getServices().usageStatsManagerInternal).onAdminDataAvailable();
@@ -705,7 +706,7 @@
assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
- MockUtils.checkAdminApps(admin2.getPackageName()),
+ MockUtils.checkApps(admin2.getPackageName()),
eq(DpmMockContext.CALLER_USER_HANDLE));
// Again broadcast from saveSettingsLocked().
@@ -1360,6 +1361,7 @@
eq(packageName),
anyInt(),
eq(userId));
+ doReturn(true).when(getServices().ipackageManager).isPackageAvailable(packageName, userId);
// Setup application UID with the PackageManager
doReturn(uid).when(getServices().packageManager).getPackageUidAsUser(
eq(packageName),
@@ -2101,6 +2103,53 @@
}
}
+ public void testSetGetMeteredDataDisabled() throws Exception {
+ setAsProfileOwner(admin1);
+
+ final ArrayList<String> emptyList = new ArrayList<>();
+ assertEquals(emptyList, dpm.getMeteredDataDisabled(admin1));
+
+ // Setup
+ final ArrayList<String> pkgsToRestrict = new ArrayList<>();
+ final String package1 = "com.example.one";
+ final String package2 = "com.example.two";
+ pkgsToRestrict.add(package1);
+ pkgsToRestrict.add(package2);
+ setupPackageInPackageManager(package1, DpmMockContext.CALLER_USER_HANDLE, 123, 0);
+ setupPackageInPackageManager(package2, DpmMockContext.CALLER_USER_HANDLE, 456, 0);
+ List<String> excludedPkgs = dpm.setMeteredDataDisabled(admin1, pkgsToRestrict);
+
+ // Verify
+ assertEquals(emptyList, excludedPkgs);
+ assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabled(admin1));
+ verify(getServices().networkPolicyManagerInternal).setMeteredRestrictedPackages(
+ MockUtils.checkApps(pkgsToRestrict.toArray(new String[0])),
+ eq(DpmMockContext.CALLER_USER_HANDLE));
+
+ // Setup
+ pkgsToRestrict.remove(package1);
+ excludedPkgs = dpm.setMeteredDataDisabled(admin1, pkgsToRestrict);
+
+ // Verify
+ assertEquals(emptyList, excludedPkgs);
+ assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabled(admin1));
+ verify(getServices().networkPolicyManagerInternal).setMeteredRestrictedPackages(
+ MockUtils.checkApps(pkgsToRestrict.toArray(new String[0])),
+ eq(DpmMockContext.CALLER_USER_HANDLE));
+ }
+
+ public void testSetGetMeteredDataDisabled_deviceAdmin() {
+ mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
+ dpm.setActiveAdmin(admin1, true);
+ assertTrue(dpm.isAdminActive(admin1));
+ mContext.callerPermissions.remove(permission.MANAGE_DEVICE_ADMINS);
+
+ assertExpectException(SecurityException.class, /* messageRegex= */ NOT_PROFILE_OWNER_MSG,
+ () -> dpm.setMeteredDataDisabled(admin1, new ArrayList<>()));
+ assertExpectException(SecurityException.class, /* messageRegex= */ NOT_PROFILE_OWNER_MSG,
+ () -> dpm.getMeteredDataDisabled(admin1));
+ }
+
public void testCreateAdminSupportIntent() throws Exception {
// Setup device owner.
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java b/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java
index dec962e..92ea766 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java
@@ -119,25 +119,25 @@
return MockitoHamcrest.argThat(m);
}
- public static Set<String> checkAdminApps(String... adminApps) {
+ public static Set<String> checkApps(String... adminApps) {
final Matcher<Set<String>> m = new BaseMatcher<Set<String>>() {
@Override
public boolean matches(Object item) {
if (item == null) return false;
- final Set<String> actualAdminApps = (Set<String>) item;
- if (adminApps.length != actualAdminApps.size()) {
+ final Set<String> actualApps = (Set<String>) item;
+ if (adminApps.length != actualApps.size()) {
return false;
}
- final Set<String> copyOfAdmins = new ArraySet<>(actualAdminApps);
+ final Set<String> copyOfApps = new ArraySet<>(actualApps);
for (String adminApp : adminApps) {
- copyOfAdmins.remove(adminApp);
+ copyOfApps.remove(adminApp);
}
- return copyOfAdmins.isEmpty();
+ return copyOfApps.isEmpty();
}
@Override
public void describeTo(Description description) {
- description.appendText("Admin apps=" + Arrays.toString(adminApps));
+ description.appendText("Apps=" + Arrays.toString(adminApps));
}
};
return MockitoHamcrest.argThat(m);