diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 76a6c0eecd3e6..92996241a3a66 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -382,10 +382,10 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP int deviceOwnerUserId, String deviceOwner, SparseArray profileOwners); /** - * Called by DevicePolicyManagerService to set the package names protected by the device - * owner. + * Called by Owners to set the package names protected by the device owner. */ - public abstract void setDeviceOwnerProtectedPackages(List packageNames); + public abstract void setDeviceOwnerProtectedPackages( + String deviceOwnerPackageName, List packageNames); /** * Returns {@code true} if a given package can't be wiped. Otherwise, returns {@code false}. diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 01c89b5da715f..4faa18e9662c3 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -26514,8 +26514,10 @@ public class PackageManagerService extends IPackageManager.Stub } @Override - public void setDeviceOwnerProtectedPackages(List packageNames) { - mProtectedPackages.setDeviceOwnerProtectedPackages(packageNames); + public void setDeviceOwnerProtectedPackages( + String deviceOwnerPackageName, List packageNames) { + mProtectedPackages.setDeviceOwnerProtectedPackages( + deviceOwnerPackageName, packageNames); } @Override diff --git a/services/core/java/com/android/server/pm/ProtectedPackages.java b/services/core/java/com/android/server/pm/ProtectedPackages.java index 4da3cc3be514a..bf46129730231 100644 --- a/services/core/java/com/android/server/pm/ProtectedPackages.java +++ b/services/core/java/com/android/server/pm/ProtectedPackages.java @@ -20,14 +20,15 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.content.Context; import android.os.UserHandle; +import android.util.ArrayMap; +import android.util.ArraySet; import android.util.SparseArray; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; -import com.android.internal.util.ArrayUtils; -import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * Manages package names that need special protection. @@ -55,7 +56,7 @@ public class ProtectedPackages { @Nullable @GuardedBy("this") - private List mDeviceOwnerProtectedPackages; + private final ArrayMap> mDeviceOwnerProtectedPackages = new ArrayMap<>(); private final Context mContext; @@ -78,8 +79,14 @@ public class ProtectedPackages { : profileOwnerPackages.clone(); } - public synchronized void setDeviceOwnerProtectedPackages(List packageNames) { - mDeviceOwnerProtectedPackages = new ArrayList(packageNames); + /** Sets the protected packages for the device owner. */ + public synchronized void setDeviceOwnerProtectedPackages( + String deviceOwnerPackageName, List packageNames) { + if (packageNames.isEmpty()) { + mDeviceOwnerProtectedPackages.remove(deviceOwnerPackageName); + } else { + mDeviceOwnerProtectedPackages.put(deviceOwnerPackageName, new ArraySet<>(packageNames)); + } } private synchronized boolean hasDeviceOwnerOrProfileOwner(int userId, String packageName) { @@ -118,7 +125,17 @@ public class ProtectedPackages { */ private synchronized boolean isProtectedPackage(String packageName) { return packageName != null && (packageName.equals(mDeviceProvisioningPackage) - || ArrayUtils.contains(mDeviceOwnerProtectedPackages, packageName)); + || isDeviceOwnerProtectedPackage(packageName)); + } + + /** Returns {@code true} if the given package is a protected package set by any device owner. */ + private synchronized boolean isDeviceOwnerProtectedPackage(String packageName) { + for (Set protectedPackages : mDeviceOwnerProtectedPackages.values()) { + if (protectedPackages.contains(packageName)) { + return true; + } + } + return false; } /** diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 3d9fdae80b94d..5b2841ba7496d 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -1754,11 +1754,38 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (userHandle == UserHandle.USER_SYSTEM) { mStateCache.setDeviceProvisioned(policy.mUserSetupComplete); } + + migrateDeviceOwnerProtectedPackagesToOwners(userHandle, policy); } return policy; } } + /** + * Only used by {@link #getUserData(int)} to migrate existing device owner protected + * packages that were stored in {@link DevicePolicyData#mUserControlDisabledPackages} to + * {@link Owners} because the device owner protected packages are now stored on a per device + * owner basis instead of on a per user basis. + * + * Any calls to {@link #setUserControlDisabledPackages(ComponentName, List)} would now store + * the device owner protected packages in {@link Owners} instead of {@link DevicePolicyData}. + * @param userHandle The device owner user + * @param policy The policy data of the device owner user + */ + private void migrateDeviceOwnerProtectedPackagesToOwners( + int userHandle, DevicePolicyData policy) { + ComponentName deviceOwnerComponent = getOwnerComponent(userHandle); + if (isDeviceOwner(deviceOwnerComponent, userHandle) + && !policy.mUserControlDisabledPackages.isEmpty()) { + mOwners.setDeviceOwnerProtectedPackages( + deviceOwnerComponent.getPackageName(), + policy.mUserControlDisabledPackages); + + policy.mUserControlDisabledPackages = new ArrayList<>(); + saveSettingsLocked(userHandle); + } + } + /** * Creates and loads the policy data from xml for data that is shared between * various profiles of a user. In contrast to {@link #getUserData(int)} @@ -2863,7 +2890,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { updateMaximumTimeToLockLocked(userHandle); updateLockTaskPackagesLocked(policy.mLockTaskPackages, userHandle); updateLockTaskFeaturesLocked(policy.mLockTaskFeatures, userHandle); - updateUserControlDisabledPackagesLocked(policy.mUserControlDisabledPackages); if (policy.mStatusBarDisabled) { setStatusBarDisabledInternal(policy.mStatusBarDisabled, userHandle); } @@ -2907,10 +2933,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } - private void updateUserControlDisabledPackagesLocked(List packages) { - mInjector.getPackageManagerInternal().setDeviceOwnerProtectedPackages(packages); - } - private void updateLockTaskFeaturesLocked(int flags, int userId) { long ident = mInjector.binderClearCallingIdentity(); try { @@ -8759,7 +8781,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { updateLockTaskPackagesLocked(policy.mLockTaskPackages, userId); policy.mLockTaskFeatures = DevicePolicyManager.LOCK_TASK_FEATURE_NONE; policy.mUserControlDisabledPackages.clear(); - updateUserControlDisabledPackagesLocked(policy.mUserControlDisabledPackages); saveSettingsLocked(userId); try { @@ -16199,14 +16220,14 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public void setUserControlDisabledPackages(ComponentName who, List packages) { Objects.requireNonNull(who, "ComponentName is null"); - Preconditions.checkNotNull(packages, "packages is null"); + Objects.requireNonNull(packages, "packages is null"); final CallerIdentity caller = getCallerIdentity(who); Preconditions.checkCallAuthorization(isDeviceOwner(caller)); checkCanExecuteOrThrowUnsafe( DevicePolicyManager.OPERATION_SET_USER_CONTROL_DISABLED_PACKAGES); synchronized (getLockObject()) { - setUserControlDisabledPackagesLocked(caller.getUserId(), packages); + mOwners.setDeviceOwnerProtectedPackages(who.getPackageName(), packages); DevicePolicyEventLogger .createEvent(DevicePolicyEnums.SET_USER_CONTROL_DISABLED_PACKAGES) .setAdmin(who) @@ -16215,15 +16236,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } - private void setUserControlDisabledPackagesLocked(int userHandle, List packages) { - final DevicePolicyData policy = getUserData(userHandle); - policy.mUserControlDisabledPackages = packages; - - // Store the settings persistently. - saveSettingsLocked(userHandle); - updateUserControlDisabledPackagesLocked(packages); - } - @Override public List getUserControlDisabledPackages(ComponentName who) { Objects.requireNonNull(who, "ComponentName is null"); @@ -16232,9 +16244,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Preconditions.checkCallAuthorization(isDeviceOwner(caller)); synchronized (getLockObject()) { - final List packages = - getUserData(caller.getUserId()).mUserControlDisabledPackages; - return packages == null ? Collections.EMPTY_LIST : packages; + return mOwners.getDeviceOwnerProtectedPackages(who.getPackageName()); } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java index 7fdd6eeef6428..fd09e3f9cfd07 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java @@ -62,6 +62,7 @@ import java.io.IOException; import java.io.InputStream; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; @@ -97,10 +98,13 @@ class Owners { // Holds "context" for device-owner, this must not be show up before device-owner. private static final String TAG_DEVICE_OWNER_CONTEXT = "device-owner-context"; private static final String TAG_DEVICE_OWNER_TYPE = "device-owner-type"; + private static final String TAG_DEVICE_OWNER_PROTECTED_PACKAGES = + "device-owner-protected-packages"; private static final String ATTR_NAME = "name"; private static final String ATTR_PACKAGE = "package"; private static final String ATTR_COMPONENT_NAME = "component"; + private static final String ATTR_SIZE = "size"; private static final String ATTR_REMOTE_BUGREPORT_URI = "remoteBugreportUri"; private static final String ATTR_REMOTE_BUGREPORT_HASH = "remoteBugreportHash"; private static final String ATTR_USERID = "userId"; @@ -129,6 +133,8 @@ class Owners { // Device owner type for a managed device. private final ArrayMap mDeviceOwnerTypes = new ArrayMap<>(); + private final ArrayMap> mDeviceOwnerProtectedPackages = new ArrayMap<>(); + private int mDeviceOwnerUserId = UserHandle.USER_NULL; // Internal state for the profile owner packages. @@ -216,6 +222,12 @@ class Owners { pushToActivityTaskManagerLocked(); pushToActivityManagerLocked(); pushToAppOpsLocked(); + + for (ArrayMap.Entry> entry : + mDeviceOwnerProtectedPackages.entrySet()) { + mPackageManagerInternal.setDeviceOwnerProtectedPackages( + entry.getKey(), entry.getValue()); + } } } @@ -343,6 +355,12 @@ class Owners { void clearDeviceOwner() { synchronized (mLock) { mDeviceOwnerTypes.remove(mDeviceOwner.packageName); + List protectedPackages = + mDeviceOwnerProtectedPackages.remove(mDeviceOwner.packageName); + if (protectedPackages != null) { + mPackageManagerInternal.setDeviceOwnerProtectedPackages( + mDeviceOwner.packageName, new ArrayList<>()); + } mDeviceOwner = null; mDeviceOwnerUserId = UserHandle.USER_NULL; @@ -394,6 +412,12 @@ class Owners { void transferDeviceOwnership(ComponentName target) { synchronized (mLock) { Integer previousDeviceOwnerType = mDeviceOwnerTypes.remove(mDeviceOwner.packageName); + List previousProtectedPackages = + mDeviceOwnerProtectedPackages.remove(mDeviceOwner.packageName); + if (previousProtectedPackages != null) { + mPackageManagerInternal.setDeviceOwnerProtectedPackages( + mDeviceOwner.packageName, new ArrayList<>()); + } // We don't set a name because it's not used anyway. // See DevicePolicyManagerService#getDeviceOwnerName mDeviceOwner = new OwnerInfo(null, target, @@ -403,6 +427,10 @@ class Owners { if (previousDeviceOwnerType != null) { mDeviceOwnerTypes.put(mDeviceOwner.packageName, previousDeviceOwnerType); } + if (previousProtectedPackages != null) { + mDeviceOwnerProtectedPackages.put( + mDeviceOwner.packageName, previousProtectedPackages); + } pushToPackageManagerLocked(); pushToActivityTaskManagerLocked(); pushToActivityManagerLocked(); @@ -583,7 +611,7 @@ class Owners { } } - /** Sets the user restrictions migrated flag, and also writes to the file. */ + /** Sets the user restrictions migrated flag, and also writes to the file. */ void setProfileOwnerUserRestrictionsMigrated(int userId) { synchronized (mLock) { OwnerInfo profileOwner = mProfileOwners.get(userId); @@ -594,8 +622,10 @@ class Owners { } } - /** Sets the indicator that the profile owner manages an organization-owned device, - * then write to file. */ + /** + * Sets the indicator that the profile owner manages an organization-owned device, + * then write to file. + */ void markProfileOwnerOfOrganizationOwnedDevice(int userId) { synchronized (mLock) { OwnerInfo profileOwner = mProfileOwners.get(userId); @@ -640,6 +670,33 @@ class Owners { } } + void setDeviceOwnerProtectedPackages(String packageName, List protectedPackages) { + synchronized (mLock) { + if (!hasDeviceOwner()) { + Slog.e(TAG, + "Attempting to set device owner protected packages when there is no " + + "device owner"); + return; + } else if (!mDeviceOwner.packageName.equals(packageName)) { + Slog.e(TAG, "Attempting to set device owner protected packages when the provided " + + "package name " + packageName + + " does not match the device owner package name"); + return; + } + + mDeviceOwnerProtectedPackages.put(packageName, protectedPackages); + mPackageManagerInternal.setDeviceOwnerProtectedPackages(packageName, protectedPackages); + writeDeviceOwner(); + } + } + + List getDeviceOwnerProtectedPackages(String packageName) { + synchronized (mLock) { + return mDeviceOwnerProtectedPackages.containsKey(packageName) + ? mDeviceOwnerProtectedPackages.get(packageName) : Collections.emptyList(); + } + } + private boolean readLegacyOwnerFileLocked(File file) { if (!file.exists()) { // Already migrated or the device has no owners. @@ -649,8 +706,8 @@ class Owners { InputStream input = new AtomicFile(file).openRead(); TypedXmlPullParser parser = Xml.resolvePullParser(input); int type; - while ((type=parser.next()) != TypedXmlPullParser.END_DOCUMENT) { - if (type!=TypedXmlPullParser.START_TAG) { + while ((type = parser.next()) != TypedXmlPullParser.END_DOCUMENT) { + if (type != TypedXmlPullParser.START_TAG) { continue; } @@ -700,7 +757,7 @@ class Owners { } } input.close(); - } catch (XmlPullParserException|IOException e) { + } catch (XmlPullParserException | IOException e) { Slog.e(TAG, "Error parsing device-owner file", e); } return true; @@ -936,6 +993,21 @@ class Owners { } } + if (!mDeviceOwnerProtectedPackages.isEmpty()) { + for (ArrayMap.Entry> entry : + mDeviceOwnerProtectedPackages.entrySet()) { + List protectedPackages = entry.getValue(); + + out.startTag(null, TAG_DEVICE_OWNER_PROTECTED_PACKAGES); + out.attribute(null, ATTR_PACKAGE, entry.getKey()); + out.attributeInt(null, ATTR_SIZE, protectedPackages.size()); + for (int i = 0, size = protectedPackages.size(); i < size; i++) { + out.attribute(null, ATTR_NAME + i, protectedPackages.get(i)); + } + out.endTag(null, TAG_DEVICE_OWNER_PROTECTED_PACKAGES); + } + } + if (mSystemUpdatePolicy != null) { out.startTag(null, TAG_SYSTEM_UPDATE_POLICY); mSystemUpdatePolicy.saveToXml(out); @@ -1002,6 +1074,15 @@ class Owners { DEVICE_OWNER_TYPE_DEFAULT); mDeviceOwnerTypes.put(packageName, deviceOwnerType); break; + case TAG_DEVICE_OWNER_PROTECTED_PACKAGES: + packageName = parser.getAttributeValue(null, ATTR_PACKAGE); + int protectedPackagesSize = parser.getAttributeInt(null, ATTR_SIZE, 0); + List protectedPackages = new ArrayList<>(); + for (int i = 0; i < protectedPackagesSize; i++) { + protectedPackages.add(parser.getAttributeValue(null, ATTR_NAME + i)); + } + mDeviceOwnerProtectedPackages.put(packageName, protectedPackages); + break; default: Slog.e(TAG, "Unexpected tag: " + tag); return false; 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 227094315d8e5..bfdf5af259f6c 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -6542,29 +6542,26 @@ public class DevicePolicyManagerTest extends DpmTestBase { final List testPackages = new ArrayList<>(); testPackages.add("package_1"); testPackages.add("package_2"); - - mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS); + mServiceContext.permissions.add(permission.MANAGE_DEVICE_ADMINS); setDeviceOwner(); dpm.setUserControlDisabledPackages(admin1, testPackages); - verify(getServices().packageManagerInternal).setDeviceOwnerProtectedPackages(testPackages); - + verify(getServices().packageManagerInternal) + .setDeviceOwnerProtectedPackages(admin1.getPackageName(), testPackages); assertThat(dpm.getUserControlDisabledPackages(admin1)).isEqualTo(testPackages); } @Test - public void testSetUserControlDisabledPackages_failingAsPO() throws Exception { + public void testSetUserControlDisabledPackages_failingAsPO() { final List testPackages = new ArrayList<>(); testPackages.add("package_1"); testPackages.add("package_2"); - - mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS); + mServiceContext.permissions.add(permission.MANAGE_DEVICE_ADMINS); setAsProfileOwner(admin1); assertExpectException(SecurityException.class, /* messageRegex= */ null, () -> dpm.setUserControlDisabledPackages(admin1, testPackages)); - assertExpectException(SecurityException.class, /* messageRegex= */ null, () -> dpm.getUserControlDisabledPackages(admin1)); } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java index 39ca925d01156..02a8ae8fbecd9 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java @@ -21,6 +21,8 @@ import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.verify; + import android.content.ComponentName; import android.os.UserHandle; import android.test.suitebuilder.annotation.SmallTest; @@ -29,9 +31,14 @@ import androidx.test.runner.AndroidJUnit4; import com.android.server.devicepolicy.DevicePolicyManagerServiceTestable.OwnersTestable; +import com.google.android.collect.Lists; + import org.junit.Test; import org.junit.runner.RunWith; +import java.util.ArrayList; +import java.util.List; + /** * Tests for the DeviceOwner object that saves & loads device and policy owner information. * @@ -43,6 +50,9 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class OwnersTest extends DpmTestBase { + private static final List DEVICE_OWNER_PROTECTED_PACKAGES = + Lists.newArrayList("package_1", "package_2"); + @Test public void testUpgrade01() throws Exception { getServices().addUsers(10, 11, 20, 21); @@ -71,6 +81,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNull(); assertThat(owners.getProfileOwnerKeys()).isEmpty(); @@ -96,6 +108,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNull(); assertThat(owners.getProfileOwnerKeys()).isEmpty(); @@ -136,6 +150,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNull(); assertThat(owners.getProfileOwnerKeys()).isEmpty(); @@ -158,6 +174,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNull(); assertThat(owners.getProfileOwnerKeys()).isEmpty(); @@ -198,6 +216,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getSystemUpdatePolicy()).isNull(); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getProfileOwnerKeys()).hasSize(2); assertThat(owners.getProfileOwnerComponent(10)) @@ -228,6 +248,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getSystemUpdatePolicy()).isNull(); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getProfileOwnerKeys()).hasSize(2); assertThat(owners.getProfileOwnerComponent(10)) @@ -282,6 +304,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNotNull(); assertThat(owners.getSystemUpdatePolicy().getPolicyType()).isEqualTo(5); @@ -316,6 +340,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNotNull(); assertThat(owners.getSystemUpdatePolicy().getPolicyType()).isEqualTo(5); @@ -344,6 +370,14 @@ public class OwnersTest extends DpmTestBase { DEVICE_OWNER_TYPE_FINANCED); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_FINANCED); + + owners.setDeviceOwnerProtectedPackages( + owners.getDeviceOwnerPackageName(), DEVICE_OWNER_PROTECTED_PACKAGES); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEqualTo(DEVICE_OWNER_PROTECTED_PACKAGES); + verify(getServices().packageManagerInternal) + .setDeviceOwnerProtectedPackages( + owners.getDeviceOwnerPackageName(), DEVICE_OWNER_PROTECTED_PACKAGES); } { @@ -353,6 +387,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.hasDeviceOwner()).isTrue(); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_FINANCED); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEqualTo(DEVICE_OWNER_PROTECTED_PACKAGES); assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse(); assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isTrue(); @@ -367,6 +403,14 @@ public class OwnersTest extends DpmTestBase { // The previous device owner type should persist. assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_FINANCED); + + owners.setDeviceOwnerProtectedPackages( + owners.getDeviceOwnerPackageName(), new ArrayList<>()); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); + verify(getServices().packageManagerInternal) + .setDeviceOwnerProtectedPackages( + owners.getDeviceOwnerPackageName(), new ArrayList<>()); } { @@ -376,6 +420,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.hasDeviceOwner()).isTrue(); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_FINANCED); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse(); assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isTrue(); @@ -414,6 +460,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNull(); @@ -435,6 +483,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNull(); @@ -474,6 +524,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getProfileOwnerKeys()).isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNotNull(); @@ -495,6 +547,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getProfileOwnerKeys()).isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNotNull(); @@ -525,6 +579,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerFile().exists()).isTrue(); assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(owners.getDeviceOwnerPackageName())) + .isEmpty(); assertThat(owners.getProfileOwnerFile(10).exists()).isTrue(); assertThat(owners.getProfileOwnerFile(11).exists()).isTrue(); @@ -532,6 +588,13 @@ public class OwnersTest extends DpmTestBase { owners.setDeviceOwnerType(previousDeviceOwnerPackageName, DEVICE_OWNER_TYPE_FINANCED); assertThat(owners.getDeviceOwnerType(previousDeviceOwnerPackageName)).isEqualTo( DEVICE_OWNER_TYPE_FINANCED); + owners.setDeviceOwnerProtectedPackages( + previousDeviceOwnerPackageName, DEVICE_OWNER_PROTECTED_PACKAGES); + assertThat(owners.getDeviceOwnerProtectedPackages(previousDeviceOwnerPackageName)) + .isEqualTo(DEVICE_OWNER_PROTECTED_PACKAGES); + verify(getServices().packageManagerInternal) + .setDeviceOwnerProtectedPackages( + owners.getDeviceOwnerPackageName(), DEVICE_OWNER_PROTECTED_PACKAGES); // Then clear all information and save. owners.clearDeviceOwner(); @@ -552,5 +615,10 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerType(previousDeviceOwnerPackageName)).isEqualTo( DEVICE_OWNER_TYPE_DEFAULT); + assertThat(owners.getDeviceOwnerProtectedPackages(previousDeviceOwnerPackageName)) + .isEmpty(); + verify(getServices().packageManagerInternal) + .setDeviceOwnerProtectedPackages( + previousDeviceOwnerPackageName, new ArrayList<>()); } }