Merge "Enforce DevicePolicyManager.setUserControlDisabledPackages in AppStandbyController" into tm-dev am: e9fd0fc709
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22137702 Change-Id: I6e94a2f0517d2f183eb9b85f31cd626061e35afa Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -218,6 +218,8 @@ public interface AppStandbyInternal {
|
||||
|
||||
void setActiveAdminApps(Set<String> adminPkgs, int userId);
|
||||
|
||||
void setAdminProtectedPackages(Set<String> packageNames, int userId);
|
||||
|
||||
/**
|
||||
* @return {@code true} if the given package is an active device admin app.
|
||||
*/
|
||||
|
||||
@@ -262,6 +262,10 @@ public class AppStandbyController
|
||||
@GuardedBy("mActiveAdminApps")
|
||||
private final SparseArray<Set<String>> mActiveAdminApps = new SparseArray<>();
|
||||
|
||||
/** List of admin protected packages. Can contain {@link android.os.UserHandle#USER_ALL}. */
|
||||
@GuardedBy("mAdminProtectedPackages")
|
||||
private final SparseArray<Set<String>> mAdminProtectedPackages = new SparseArray<>();
|
||||
|
||||
/**
|
||||
* Set of system apps that are headless (don't have any "front door" activities, enabled or
|
||||
* disabled). Presence in this map indicates that the app is a headless system app.
|
||||
@@ -1323,6 +1327,9 @@ public class AppStandbyController
|
||||
synchronized (mActiveAdminApps) {
|
||||
mActiveAdminApps.remove(userId);
|
||||
}
|
||||
synchronized (mAdminProtectedPackages) {
|
||||
mAdminProtectedPackages.remove(userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1412,6 +1419,10 @@ public class AppStandbyController
|
||||
return STANDBY_BUCKET_EXEMPTED;
|
||||
}
|
||||
|
||||
if (isAdminProtectedPackages(packageName, userId)) {
|
||||
return STANDBY_BUCKET_EXEMPTED;
|
||||
}
|
||||
|
||||
if (isActiveNetworkScorer(packageName)) {
|
||||
return STANDBY_BUCKET_EXEMPTED;
|
||||
}
|
||||
@@ -1828,6 +1839,17 @@ public class AppStandbyController
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isAdminProtectedPackages(String packageName, int userId) {
|
||||
synchronized (mAdminProtectedPackages) {
|
||||
if (mAdminProtectedPackages.contains(UserHandle.USER_ALL)
|
||||
&& mAdminProtectedPackages.get(UserHandle.USER_ALL).contains(packageName)) {
|
||||
return true;
|
||||
}
|
||||
return mAdminProtectedPackages.contains(userId)
|
||||
&& mAdminProtectedPackages.get(userId).contains(packageName);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addActiveDeviceAdmin(String adminPkg, int userId) {
|
||||
synchronized (mActiveAdminApps) {
|
||||
@@ -1851,6 +1873,17 @@ public class AppStandbyController
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAdminProtectedPackages(Set<String> packageNames, int userId) {
|
||||
synchronized (mAdminProtectedPackages) {
|
||||
if (packageNames == null || packageNames.isEmpty()) {
|
||||
mAdminProtectedPackages.remove(userId);
|
||||
} else {
|
||||
mAdminProtectedPackages.put(userId, packageNames);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdminDataAvailable() {
|
||||
mAdminDataAvailableLatch.countDown();
|
||||
@@ -1873,6 +1906,13 @@ public class AppStandbyController
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
Set<String> getAdminProtectedPackagesForTest(int userId) {
|
||||
synchronized (mAdminProtectedPackages) {
|
||||
return mAdminProtectedPackages.get(userId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if the supplied package is the device provisioning app. Otherwise,
|
||||
* returns {@code false}.
|
||||
|
||||
@@ -14625,7 +14625,8 @@ public class DevicePolicyManager {
|
||||
/**
|
||||
* Called by a device owner or a profile owner to disable user control over apps. User will not
|
||||
* be able to clear app data or force-stop packages. When called by a device owner, applies to
|
||||
* all users on the device.
|
||||
* all users on the device. Packages with user control disabled are exempted from
|
||||
* App Standby Buckets.
|
||||
*
|
||||
* @param admin which {@link DeviceAdminReceiver} this request is associated with
|
||||
* @param packages The package names for the apps.
|
||||
|
||||
@@ -202,6 +202,16 @@ public abstract class UsageStatsManagerInternal {
|
||||
*/
|
||||
public abstract void setActiveAdminApps(Set<String> adminApps, int userId);
|
||||
|
||||
/**
|
||||
* Called by DevicePolicyManagerService to inform about the protected packages for a user.
|
||||
* User control will be disabled for protected packages.
|
||||
*
|
||||
* @param packageNames the set of protected packages for {@code userId}.
|
||||
* @param userId the userId to which the protected packages belong.
|
||||
*/
|
||||
public abstract void setAdminProtectedPackages(@Nullable Set<String> packageNames,
|
||||
@UserIdInt int userId);
|
||||
|
||||
/**
|
||||
* Called by DevicePolicyManagerService during boot to inform that admin data is loaded and
|
||||
* pushed to UsageStatsService.
|
||||
|
||||
@@ -3202,6 +3202,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
|
||||
mInjector.binderWithCleanCallingIdentity(() ->
|
||||
mInjector.getPackageManagerInternal().setOwnerProtectedPackages(
|
||||
targetUserId, protectedPackages));
|
||||
mUsageStatsManagerInternal.setAdminProtectedPackages(new ArraySet(protectedPackages),
|
||||
targetUserId);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -158,6 +158,9 @@ public class AppStandbyControllerTests {
|
||||
private static final String ADMIN_PKG2 = "com.android.admin2";
|
||||
private static final String ADMIN_PKG3 = "com.android.admin3";
|
||||
|
||||
private static final String ADMIN_PROTECTED_PKG = "com.android.admin.protected";
|
||||
private static final String ADMIN_PROTECTED_PKG2 = "com.android.admin.protected2";
|
||||
|
||||
private static final long MINUTE_MS = 60 * 1000;
|
||||
private static final long HOUR_MS = 60 * MINUTE_MS;
|
||||
private static final long DAY_MS = 24 * HOUR_MS;
|
||||
@@ -1749,6 +1752,19 @@ public class AppStandbyControllerTests {
|
||||
assertIsNotActiveAdmin(ADMIN_PKG2, USER_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetAdminProtectedPackages() {
|
||||
assertAdminProtectedPackagesForTest(USER_ID, (String[]) null);
|
||||
assertAdminProtectedPackagesForTest(USER_ID2, (String[]) null);
|
||||
|
||||
setAdminProtectedPackages(USER_ID, ADMIN_PROTECTED_PKG, ADMIN_PROTECTED_PKG2);
|
||||
assertAdminProtectedPackagesForTest(USER_ID, ADMIN_PROTECTED_PKG, ADMIN_PROTECTED_PKG2);
|
||||
assertAdminProtectedPackagesForTest(USER_ID2, (String[]) null);
|
||||
|
||||
setAdminProtectedPackages(USER_ID, (String[]) null);
|
||||
assertAdminProtectedPackagesForTest(USER_ID, (String[]) null);
|
||||
}
|
||||
|
||||
@Test
|
||||
@FlakyTest(bugId = 185169504)
|
||||
public void testUserInteraction_CrossProfile() throws Exception {
|
||||
@@ -2143,6 +2159,28 @@ public class AppStandbyControllerTests {
|
||||
mController.setActiveAdminApps(new ArraySet<>(Arrays.asList(admins)), userId);
|
||||
}
|
||||
|
||||
private void setAdminProtectedPackages(int userId, String... packageNames) {
|
||||
Set<String> adminProtectedPackages = packageNames != null ? new ArraySet<>(
|
||||
Arrays.asList(packageNames)) : null;
|
||||
mController.setAdminProtectedPackages(adminProtectedPackages, userId);
|
||||
}
|
||||
|
||||
private void assertAdminProtectedPackagesForTest(int userId, String... packageNames) {
|
||||
final Set<String> actualAdminProtectedPackages =
|
||||
mController.getAdminProtectedPackagesForTest(userId);
|
||||
if (packageNames == null) {
|
||||
if (actualAdminProtectedPackages != null && !actualAdminProtectedPackages.isEmpty()) {
|
||||
fail("Admin protected packages should be null; " + getAdminAppsStr(userId,
|
||||
actualAdminProtectedPackages));
|
||||
}
|
||||
return;
|
||||
}
|
||||
assertEquals(packageNames.length, actualAdminProtectedPackages.size());
|
||||
for (String adminProtectedPackage : packageNames) {
|
||||
assertTrue(actualAdminProtectedPackages.contains(adminProtectedPackage));
|
||||
}
|
||||
}
|
||||
|
||||
private void setAndAssertBucket(String pkg, int user, int bucket, int reason) throws Exception {
|
||||
rearmLatch(pkg);
|
||||
mController.setAppStandbyBucket(pkg, user, bucket, reason);
|
||||
|
||||
@@ -3082,6 +3082,11 @@ public class UsageStatsService extends SystemService implements
|
||||
mAppStandby.setActiveAdminApps(packageNames, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAdminProtectedPackages(Set<String> packageNames, int userId) {
|
||||
mAppStandby.setAdminProtectedPackages(packageNames, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdminDataAvailable() {
|
||||
mAppStandby.onAdminDataAvailable();
|
||||
|
||||
Reference in New Issue
Block a user