Merge "Enforce DevicePolicyManager.setUserControlDisabledPackages in AppStandbyController" into tm-dev am: e9fd0fc709 am: 082f5a1417

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22137702

Change-Id: Ifbfaf8d9f0b89ad420e33b07fd52d13f9f17de18
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Pavel Grafov
2023-03-31 10:48:45 +00:00
committed by Automerger Merge Worker
7 changed files with 99 additions and 1 deletions

View File

@@ -225,6 +225,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.
*/

View File

@@ -264,6 +264,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.
@@ -1335,6 +1339,9 @@ public class AppStandbyController
synchronized (mActiveAdminApps) {
mActiveAdminApps.remove(userId);
}
synchronized (mAdminProtectedPackages) {
mAdminProtectedPackages.remove(userId);
}
}
}
@@ -1424,6 +1431,10 @@ public class AppStandbyController
return STANDBY_BUCKET_EXEMPTED;
}
if (isAdminProtectedPackages(packageName, userId)) {
return STANDBY_BUCKET_EXEMPTED;
}
if (isActiveNetworkScorer(packageName)) {
return STANDBY_BUCKET_EXEMPTED;
}
@@ -1871,6 +1882,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) {
@@ -1894,6 +1916,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();
@@ -1916,6 +1949,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}.

View File

@@ -14635,7 +14635,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.

View File

@@ -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.

View File

@@ -3202,6 +3202,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
mInjector.binderWithCleanCallingIdentity(() ->
mInjector.getPackageManagerInternal().setOwnerProtectedPackages(
targetUserId, protectedPackages));
mUsageStatsManagerInternal.setAdminProtectedPackages(new ArraySet(protectedPackages),
targetUserId);
}
@Override

View File

@@ -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;
@@ -1750,6 +1753,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 {
@@ -2144,6 +2160,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);

View File

@@ -3086,6 +3086,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();