summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java77
-rw-r--r--core/java/android/app/admin/IDevicePolicyManager.aidl3
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java9
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java32
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/Owners.java60
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java67
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java63
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);
}
}