diff options
7 files changed, 310 insertions, 1 deletions
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 59e5144113c9..b7b3ec16d24f 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -2746,6 +2746,32 @@ public class DevicePolicyManager { @Retention(RetentionPolicy.SOURCE) public @interface PersonalAppsSuspensionReason {} + /** + * The default device owner type for a managed device. + * + * @hide + */ + public static final int DEVICE_OWNER_TYPE_DEFAULT = 0; + + /** + * The device owner type for a financed device. + * + * @hide + */ + public static final int DEVICE_OWNER_TYPE_FINANCED = 1; + + /** + * Different device owner types for a managed device. + * + * @hide + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = { "DEVICE_OWNER_TYPE_" }, value = { + DEVICE_OWNER_TYPE_DEFAULT, + DEVICE_OWNER_TYPE_FINANCED + }) + public @interface DeviceOwnerType {} + /** @hide */ @TestApi public static final int OPERATION_LOCK_NOW = 1; @@ -13460,6 +13486,57 @@ public class DevicePolicyManager { } /** + * Sets the device owner type for a managed device (e.g. financed device). + * + * @param admin The {@link DeviceAdminReceiver} that is the device owner. + * @param deviceOwnerType The device owner type is set to. Use + * {@link #DEVICE_OWNER_TYPE_DEFAULT} for the default device owner type. Use + * {@link #DEVICE_OWNER_TYPE_FINANCED} for the financed device owner type. + * + * @throws IllegalStateException When admin is not the device owner, or there is no device + * owner, or attempting to set the device owner type again for the same admin. + * @throws SecurityException If the caller does not have the permission + * {@link permission#MANAGE_PROFILE_AND_DEVICE_OWNERS}. + * + * @hide + */ + public void setDeviceOwnerType(@NonNull ComponentName admin, + @DeviceOwnerType int deviceOwnerType) { + throwIfParentInstance("setDeviceOwnerType"); + if (mService != null) { + try { + mService.setDeviceOwnerType(admin, deviceOwnerType); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + } + + /** + * Returns the device owner type for the admin used in + * {@link #setDeviceOwnerType(ComponentName, int)}. {@link #DEVICE_OWNER_TYPE_DEFAULT} + * would be returned when the device owner type is not set for the device owner admin. + * + * @param admin The {@link DeviceAdminReceiver} that is the device owner. + * + * @throws IllegalStateException When admin is not the device owner or there is no device owner. + * + * @hide + */ + @DeviceOwnerType + public int getDeviceOwnerType(@NonNull ComponentName admin) { + throwIfParentInstance("getDeviceOwnerType"); + if (mService != null) { + try { + return mService.getDeviceOwnerType(admin); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + return DEVICE_OWNER_TYPE_DEFAULT; + } + + /** * Called by device owner or profile owner of an organization-owned managed profile to * enable or disable USB data signaling for the device. When disabled, USB data connections * (except from charging functions) are prohibited. diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 8a87b16b760b..ac1592d2d2a1 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -503,6 +503,9 @@ interface IDevicePolicyManager { UserHandle createAndProvisionManagedProfile(in ManagedProfileProvisioningParams provisioningParams, in String callerPackage); void provisionFullyManagedDevice(in FullyManagedDeviceProvisioningParams provisioningParams, in String callerPackage); + void setDeviceOwnerType(in ComponentName admin, in int deviceOwnerType); + int getDeviceOwnerType(in ComponentName admin); + void resetDefaultCrossProfileIntentFilters(int userId); boolean canAdminGrantSensorsPermissionsForUser(int userId); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java index b52347f509f8..ef7afc8d1894 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java @@ -129,6 +129,15 @@ abstract class BaseIDevicePolicyManager extends IDevicePolicyManager.Stub { FullyManagedDeviceProvisioningParams provisioningParams, String callerPackage) { } + @Override + public void setDeviceOwnerType(@NonNull ComponentName admin, int deviceOwnerType) { + } + + @Override + public int getDeviceOwnerType(@NonNull ComponentName admin) { + return 0; + } + public void resetDefaultCrossProfileIntentFilters(@UserIdInt int userId) {} public boolean canAdminGrantSensorsPermissionsForUser(int userId) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 1cf4ce163640..0c9304566e84 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -156,6 +156,7 @@ import android.app.admin.DeviceAdminReceiver; import android.app.admin.DevicePolicyCache; import android.app.admin.DevicePolicyEventLogger; import android.app.admin.DevicePolicyManager; +import android.app.admin.DevicePolicyManager.DeviceOwnerType; import android.app.admin.DevicePolicyManager.DevicePolicyOperation; import android.app.admin.DevicePolicyManager.OperationSafetyReason; import android.app.admin.DevicePolicyManager.PasswordComplexity; @@ -16721,6 +16722,37 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } @Override + public void setDeviceOwnerType(@NonNull ComponentName admin, + @DeviceOwnerType int deviceOwnerType) { + Preconditions.checkCallAuthorization(hasCallingOrSelfPermission( + permission.MANAGE_PROFILE_AND_DEVICE_OWNERS)); + verifyDeviceOwnerTypePreconditions(admin); + + final String packageName = admin.getPackageName(); + Preconditions.checkState(!mOwners.isDeviceOwnerTypeSetForDeviceOwner(packageName), + "The device owner type has already been set for " + packageName); + + synchronized (getLockObject()) { + mOwners.setDeviceOwnerType(packageName, deviceOwnerType); + } + } + + @Override + @DeviceOwnerType + public int getDeviceOwnerType(@NonNull ComponentName admin) { + verifyDeviceOwnerTypePreconditions(admin); + synchronized (getLockObject()) { + return mOwners.getDeviceOwnerType(admin.getPackageName()); + } + } + + private void verifyDeviceOwnerTypePreconditions(@NonNull ComponentName admin) { + Preconditions.checkState(mOwners.hasDeviceOwner(), "there is no device owner"); + Preconditions.checkState(mOwners.getDeviceOwnerComponent().equals(admin), + "admin is not the device owner"); + } + + @Override public void setUsbDataSignalingEnabled(String packageName, boolean enabled) { Objects.requireNonNull(packageName, "Admin package name must be provided"); final CallerIdentity caller = getCallerIdentity(packageName); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java index 1e70d59a5fd5..7fdd6eeef642 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java @@ -16,10 +16,13 @@ package com.android.server.devicepolicy; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_DEFAULT; + import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManagerInternal; import android.app.AppOpsManagerInternal; +import android.app.admin.DevicePolicyManager.DeviceOwnerType; import android.app.admin.SystemUpdateInfo; import android.app.admin.SystemUpdatePolicy; import android.content.ComponentName; @@ -93,6 +96,7 @@ class Owners { private static final String TAG_PROFILE_OWNER = "profile-owner"; // 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 ATTR_NAME = "name"; private static final String ATTR_PACKAGE = "package"; @@ -109,6 +113,7 @@ class Owners { // New attribute for profile owner of organization-owned device. private static final String ATTR_PROFILE_OWNER_OF_ORG_OWNED_DEVICE = "isPoOrganizationOwnedDevice"; + private static final String ATTR_DEVICE_OWNER_TYPE_VALUE = "value"; private final UserManager mUserManager; private final UserManagerInternal mUserManagerInternal; @@ -121,6 +126,9 @@ class Owners { // Internal state for the device owner package. private OwnerInfo mDeviceOwner; + // Device owner type for a managed device. + private final ArrayMap<String, Integer> mDeviceOwnerTypes = new ArrayMap<>(); + private int mDeviceOwnerUserId = UserHandle.USER_NULL; // Internal state for the profile owner packages. @@ -334,6 +342,7 @@ class Owners { void clearDeviceOwner() { synchronized (mLock) { + mDeviceOwnerTypes.remove(mDeviceOwner.packageName); mDeviceOwner = null; mDeviceOwnerUserId = UserHandle.USER_NULL; @@ -384,12 +393,16 @@ class Owners { void transferDeviceOwnership(ComponentName target) { synchronized (mLock) { + Integer previousDeviceOwnerType = mDeviceOwnerTypes.remove(mDeviceOwner.packageName); // We don't set a name because it's not used anyway. // See DevicePolicyManagerService#getDeviceOwnerName mDeviceOwner = new OwnerInfo(null, target, mDeviceOwner.userRestrictionsMigrated, mDeviceOwner.remoteBugreportUri, mDeviceOwner.remoteBugreportHash, /* isOrganizationOwnedDevice =*/ mDeviceOwner.isOrganizationOwnedDevice); + if (previousDeviceOwnerType != null) { + mDeviceOwnerTypes.put(mDeviceOwner.packageName, previousDeviceOwnerType); + } pushToPackageManagerLocked(); pushToActivityTaskManagerLocked(); pushToActivityManagerLocked(); @@ -596,6 +609,37 @@ class Owners { } } + void setDeviceOwnerType(String packageName, @DeviceOwnerType int deviceOwnerType) { + synchronized (mLock) { + if (!hasDeviceOwner()) { + Slog.e(TAG, "Attempting to set a device owner type when there is no device owner"); + return; + } else if (isDeviceOwnerTypeSetForDeviceOwner(packageName)) { + Slog.e(TAG, "Device owner type for " + packageName + " has already been set"); + return; + } + + mDeviceOwnerTypes.put(packageName, deviceOwnerType); + writeDeviceOwner(); + } + } + + @DeviceOwnerType + int getDeviceOwnerType(String packageName) { + synchronized (mLock) { + if (isDeviceOwnerTypeSetForDeviceOwner(packageName)) { + return mDeviceOwnerTypes.get(packageName); + } + return DEVICE_OWNER_TYPE_DEFAULT; + } + } + + boolean isDeviceOwnerTypeSetForDeviceOwner(String packageName) { + synchronized (mLock) { + return !mDeviceOwnerTypes.isEmpty() && mDeviceOwnerTypes.containsKey(packageName); + } + } + private boolean readLegacyOwnerFileLocked(File file) { if (!file.exists()) { // Already migrated or the device has no owners. @@ -880,6 +924,16 @@ class Owners { out.startTag(null, TAG_DEVICE_OWNER_CONTEXT); out.attributeInt(null, ATTR_USERID, mDeviceOwnerUserId); out.endTag(null, TAG_DEVICE_OWNER_CONTEXT); + + } + + if (!mDeviceOwnerTypes.isEmpty()) { + for (ArrayMap.Entry<String, Integer> entry : mDeviceOwnerTypes.entrySet()) { + out.startTag(null, TAG_DEVICE_OWNER_TYPE); + out.attribute(null, ATTR_PACKAGE, entry.getKey()); + out.attributeInt(null, ATTR_DEVICE_OWNER_TYPE_VALUE, entry.getValue()); + out.endTag(null, TAG_DEVICE_OWNER_TYPE); + } } if (mSystemUpdatePolicy != null) { @@ -942,6 +996,12 @@ class Owners { } } break; + case TAG_DEVICE_OWNER_TYPE: + String packageName = parser.getAttributeValue(null, ATTR_PACKAGE); + int deviceOwnerType = parser.getAttributeInt(null, ATTR_DEVICE_OWNER_TYPE_VALUE, + DEVICE_OWNER_TYPE_DEFAULT); + mDeviceOwnerTypes.put(packageName, deviceOwnerType); + 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 6add8d18aa3e..c3900e629c25 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -20,6 +20,8 @@ import static android.app.Notification.EXTRA_TITLE; import static android.app.admin.DevicePolicyManager.ACTION_CHECK_POLICY_COMPLIANCE; import static android.app.admin.DevicePolicyManager.DELEGATION_APP_RESTRICTIONS; import static android.app.admin.DevicePolicyManager.DELEGATION_CERT_INSTALL; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_DEFAULT; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; import static android.app.admin.DevicePolicyManager.ID_TYPE_BASE_INFO; import static android.app.admin.DevicePolicyManager.ID_TYPE_IMEI; import static android.app.admin.DevicePolicyManager.ID_TYPE_MEID; @@ -7028,6 +7030,71 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test + public void testSetDeviceOwnerType_throwsExceptionWhenCallerNotAuthorized() { + assertThrows(SecurityException.class, + () -> dpm.setDeviceOwnerType(admin1, DEVICE_OWNER_TYPE_DEFAULT)); + } + + @Test + public void testSetDeviceOwnerType_throwsExceptionWhenThereIsNoDeviceOwner() { + mContext.binder.clearCallingIdentity(); + assertThrows(IllegalStateException.class, + () -> dpm.setDeviceOwnerType(admin1, DEVICE_OWNER_TYPE_DEFAULT)); + } + + @Test + public void testSetDeviceOwnerType_throwsExceptionWhenNotAsDeviceOwnerAdmin() throws Exception { + setDeviceOwner(); + + assertThrows(IllegalStateException.class, + () -> dpm.setDeviceOwnerType(admin2, DEVICE_OWNER_TYPE_FINANCED)); + } + + @Test + public void testSetDeviceOwnerType_asDeviceOwner_toFinancedDevice() throws Exception { + setDeviceOwner(); + + dpm.setDeviceOwnerType(admin1, DEVICE_OWNER_TYPE_FINANCED); + + int returnedDeviceOwnerType = dpm.getDeviceOwnerType(admin1); + assertThat(dpms.mOwners.hasDeviceOwner()).isTrue(); + assertThat(returnedDeviceOwnerType).isEqualTo(DEVICE_OWNER_TYPE_FINANCED); + + initializeDpms(); + + returnedDeviceOwnerType = dpm.getDeviceOwnerType(admin1); + assertThat(dpms.mOwners.hasDeviceOwner()).isTrue(); + assertThat(returnedDeviceOwnerType).isEqualTo(DEVICE_OWNER_TYPE_FINANCED); + } + + @Test + public void testSetDeviceOwnerType_asDeviceOwner_throwsExceptionWhenSetDeviceOwnerTypeAgain() + throws Exception { + setDeviceOwner(); + + dpm.setDeviceOwnerType(admin1, DEVICE_OWNER_TYPE_FINANCED); + + int returnedDeviceOwnerType = dpm.getDeviceOwnerType(admin1); + assertThat(dpms.mOwners.hasDeviceOwner()).isTrue(); + assertThat(returnedDeviceOwnerType).isEqualTo(DEVICE_OWNER_TYPE_FINANCED); + + assertThrows(IllegalStateException.class, + () -> dpm.setDeviceOwnerType(admin1, DEVICE_OWNER_TYPE_DEFAULT)); + } + + @Test + public void testGetDeviceOwnerType_throwsExceptionWhenThereIsNoDeviceOwner() { + assertThrows(IllegalStateException.class, () -> dpm.getDeviceOwnerType(admin1)); + } + + @Test + public void testGetDeviceOwnerType_throwsExceptionWhenNotAsDeviceOwnerAdmin() throws Exception { + setDeviceOwner(); + + assertThrows(IllegalStateException.class, () -> dpm.getDeviceOwnerType(admin2)); + } + + @Test public void testSetUsbDataSignalingEnabled_noDeviceOwnerOrPoOfOrgOwnedDevice() { assertThrows(SecurityException.class, () -> dpm.setUsbDataSignalingEnabled(true)); 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 bfe183cc608b..39ca925d0115 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java @@ -16,6 +16,9 @@ package com.android.server.devicepolicy; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_DEFAULT; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; + import static com.google.common.truth.Truth.assertThat; import android.content.ComponentName; @@ -35,7 +38,6 @@ import org.junit.runner.RunWith; * <p>Run this test with: * * {@code atest FrameworksServicesTests:com.android.server.devicepolicy.OwnersTest} - * */ @SmallTest @RunWith(AndroidJUnit4.class) @@ -67,6 +69,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.hasDeviceOwner()).isFalse(); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getSystemUpdatePolicy()).isNull(); assertThat(owners.getProfileOwnerKeys()).isEmpty(); @@ -75,6 +79,12 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse(); assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse(); assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse(); + + owners.setDeviceOwnerType(owners.getDeviceOwnerPackageName(), + DEVICE_OWNER_TYPE_FINANCED); + // There is no device owner, so the default owner type should be returned. + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); } // Then re-read and check. @@ -84,6 +94,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.hasDeviceOwner()).isFalse(); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getSystemUpdatePolicy()).isNull(); assertThat(owners.getProfileOwnerKeys()).isEmpty(); @@ -122,6 +134,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerName()).isEqualTo(null); assertThat(owners.getDeviceOwnerPackageName()).isEqualTo("com.google.android.testdpc"); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getSystemUpdatePolicy()).isNull(); assertThat(owners.getProfileOwnerKeys()).isEmpty(); @@ -142,6 +156,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerName()).isEqualTo(null); assertThat(owners.getDeviceOwnerPackageName()).isEqualTo("com.google.android.testdpc"); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getSystemUpdatePolicy()).isNull(); assertThat(owners.getProfileOwnerKeys()).isEmpty(); @@ -180,6 +196,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.hasDeviceOwner()).isFalse(); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); assertThat(owners.getSystemUpdatePolicy()).isNull(); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getProfileOwnerKeys()).hasSize(2); assertThat(owners.getProfileOwnerComponent(10)) @@ -208,6 +226,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.hasDeviceOwner()).isFalse(); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); assertThat(owners.getSystemUpdatePolicy()).isNull(); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getProfileOwnerKeys()).hasSize(2); assertThat(owners.getProfileOwnerComponent(10)) @@ -260,6 +280,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerName()).isEqualTo(null); assertThat(owners.getDeviceOwnerPackageName()).isEqualTo("com.google.android.testdpc"); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getSystemUpdatePolicy()).isNotNull(); assertThat(owners.getSystemUpdatePolicy().getPolicyType()).isEqualTo(5); @@ -292,6 +314,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerName()).isEqualTo(null); assertThat(owners.getDeviceOwnerPackageName()).isEqualTo("com.google.android.testdpc"); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getSystemUpdatePolicy()).isNotNull(); assertThat(owners.getSystemUpdatePolicy().getPolicyType()).isEqualTo(5); @@ -315,12 +339,21 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse(); owners.setDeviceOwnerUserRestrictionsMigrated(); + + owners.setDeviceOwnerType(owners.getDeviceOwnerPackageName(), + DEVICE_OWNER_TYPE_FINANCED); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_FINANCED); } { final OwnersTestable owners = new OwnersTestable(getServices()); owners.load(); + assertThat(owners.hasDeviceOwner()).isTrue(); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_FINANCED); + assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse(); assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isTrue(); assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isTrue(); @@ -328,12 +361,22 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse(); owners.setProfileOwnerUserRestrictionsMigrated(11); + + owners.setDeviceOwnerType(owners.getDeviceOwnerPackageName(), + DEVICE_OWNER_TYPE_DEFAULT); + // The previous device owner type should persist. + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_FINANCED); } { final OwnersTestable owners = new OwnersTestable(getServices()); owners.load(); + assertThat(owners.hasDeviceOwner()).isTrue(); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_FINANCED); + assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse(); assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isTrue(); assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse(); @@ -369,6 +412,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.hasDeviceOwner()).isFalse(); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getSystemUpdatePolicy()).isNull(); @@ -388,6 +433,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.hasDeviceOwner()).isFalse(); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getSystemUpdatePolicy()).isNull(); @@ -425,6 +472,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.hasDeviceOwner()).isFalse(); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getProfileOwnerKeys()).isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNotNull(); @@ -444,6 +493,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.hasDeviceOwner()).isFalse(); assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getProfileOwnerKeys()).isEmpty(); assertThat(owners.getSystemUpdatePolicy()).isNotNull(); @@ -472,9 +523,16 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getLegacyConfigFile().exists()).isFalse(); assertThat(owners.getDeviceOwnerFile().exists()).isTrue(); + assertThat(owners.getDeviceOwnerType(owners.getDeviceOwnerPackageName())).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); assertThat(owners.getProfileOwnerFile(10).exists()).isTrue(); assertThat(owners.getProfileOwnerFile(11).exists()).isTrue(); + String previousDeviceOwnerPackageName = owners.getDeviceOwnerPackageName(); + owners.setDeviceOwnerType(previousDeviceOwnerPackageName, DEVICE_OWNER_TYPE_FINANCED); + assertThat(owners.getDeviceOwnerType(previousDeviceOwnerPackageName)).isEqualTo( + DEVICE_OWNER_TYPE_FINANCED); + // Then clear all information and save. owners.clearDeviceOwner(); owners.clearSystemUpdatePolicy(); @@ -491,5 +549,8 @@ public class OwnersTest extends DpmTestBase { assertThat(owners.getDeviceOwnerFile().exists()).isFalse(); assertThat(owners.getProfileOwnerFile(10).exists()).isFalse(); assertThat(owners.getProfileOwnerFile(11).exists()).isFalse(); + + assertThat(owners.getDeviceOwnerType(previousDeviceOwnerPackageName)).isEqualTo( + DEVICE_OWNER_TYPE_DEFAULT); } } |