Loading core/java/android/app/admin/DeviceAdminInfo.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -189,10 +189,13 @@ public final class DeviceAdminInfo implements Parcelable { @FlaggedApi(FLAG_HEADLESS_DEVICE_OWNER_SINGLE_USER_ENABLED) @FlaggedApi(FLAG_HEADLESS_DEVICE_OWNER_SINGLE_USER_ENABLED) public static final int HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER = 2; public static final int HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER = 2; /** * @hide */ @IntDef({HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED, HEADLESS_DEVICE_OWNER_MODE_AFFILIATED, @IntDef({HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED, HEADLESS_DEVICE_OWNER_MODE_AFFILIATED, HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER}) HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER}) @Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE) private @interface HeadlessDeviceOwnerMode {} public @interface HeadlessDeviceOwnerMode {} /** @hide */ /** @hide */ public static class PolicyInfo { public static class PolicyInfo { Loading core/java/android/app/admin/DevicePolicyManager.java +23 −0 Original line number Original line Diff line number Diff line Loading @@ -53,6 +53,7 @@ import static android.Manifest.permission.QUERY_ADMIN_POLICY; import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY; import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY; import static android.Manifest.permission.SET_TIME; import static android.Manifest.permission.SET_TIME; import static android.Manifest.permission.SET_TIME_ZONE; import static android.Manifest.permission.SET_TIME_ZONE; import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED; import static android.app.admin.flags.Flags.FLAG_DEVICE_THEFT_API_ENABLED; import static android.app.admin.flags.Flags.FLAG_DEVICE_THEFT_API_ENABLED; import static android.app.admin.flags.Flags.FLAG_ESIM_MANAGEMENT_ENABLED; import static android.app.admin.flags.Flags.FLAG_ESIM_MANAGEMENT_ENABLED; import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED; import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED; Loading Loading @@ -93,6 +94,7 @@ import android.app.Activity; import android.app.IServiceConnection; import android.app.IServiceConnection; import android.app.KeyguardManager; import android.app.KeyguardManager; import android.app.admin.SecurityLog.SecurityEvent; import android.app.admin.SecurityLog.SecurityEvent; import android.app.admin.flags.Flags; import android.app.compat.CompatChanges; import android.app.compat.CompatChanges; import android.compat.annotation.ChangeId; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.compat.annotation.EnabledSince; Loading Loading @@ -17526,4 +17528,25 @@ public class DevicePolicyManager { } } return -1; return -1; } } /** * @return The headless device owner mode for the current set DO, returns * {@link DeviceAdminInfo#HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED} if no DO is set. * * @hide */ @DeviceAdminInfo.HeadlessDeviceOwnerMode public int getHeadlessDeviceOwnerMode() { if (!Flags.headlessDeviceOwnerProvisioningFixEnabled()) { return HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED; } if (mService != null) { try { return mService.getHeadlessDeviceOwnerMode(mContext.getPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } return HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED; } } } No newline at end of file core/java/android/app/admin/IDevicePolicyManager.aidl +2 −0 Original line number Original line Diff line number Diff line Loading @@ -625,4 +625,6 @@ interface IDevicePolicyManager { void setMaxPolicyStorageLimit(String packageName, int storageLimit); void setMaxPolicyStorageLimit(String packageName, int storageLimit); int getMaxPolicyStorageLimit(String packageName); int getMaxPolicyStorageLimit(String packageName); int getHeadlessDeviceOwnerMode(String callerPackageName); } } core/java/android/app/admin/flags/flags.aconfig +10 −0 Original line number Original line Diff line number Diff line Loading @@ -163,3 +163,13 @@ flag { description: "Enable UX changes for esim management" description: "Enable UX changes for esim management" bug: "295301164" bug: "295301164" } } flag { name: "headless_device_owner_provisioning_fix_enabled" namespace: "enterprise" description: "Fix provisioning for single-user headless DO" bug: "289515470" metadata { purpose: PURPOSE_BUGFIX } } services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +25 −3 Original line number Original line Diff line number Diff line Loading @@ -16877,6 +16877,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private int checkDeviceOwnerProvisioningPreCondition(@UserIdInt int callingUserId) { private int checkDeviceOwnerProvisioningPreCondition(@UserIdInt int callingUserId) { synchronized (getLockObject()) { synchronized (getLockObject()) { final int deviceOwnerUserId = mInjector.userManagerIsHeadlessSystemUserMode() final int deviceOwnerUserId = mInjector.userManagerIsHeadlessSystemUserMode() && (!Flags.headlessDeviceOwnerProvisioningFixEnabled() || getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_AFFILIATED) ? UserHandle.USER_SYSTEM ? UserHandle.USER_SYSTEM : callingUserId; : callingUserId; Slogf.i(LOG_TAG, "Calling user %d, device owner will be set on user %d", Slogf.i(LOG_TAG, "Calling user %d, device owner will be set on user %d", Loading Loading @@ -21549,10 +21551,21 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { setTimeAndTimezone(provisioningParams.getTimeZone(), provisioningParams.getLocalTime()); setTimeAndTimezone(provisioningParams.getTimeZone(), provisioningParams.getLocalTime()); setLocale(provisioningParams.getLocale()); setLocale(provisioningParams.getLocale()); boolean isSingleUserMode; if (Flags.headlessDeviceOwnerProvisioningFixEnabled()) { DeviceAdminInfo adminInfo = findAdmin( deviceAdmin, caller.getUserId(), /* throwForMissingPermission= */ false); isSingleUserMode = (adminInfo != null && adminInfo.getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER); } else { isSingleUserMode = (getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER); } int deviceOwnerUserId = Flags.headlessDeviceOwnerSingleUserEnabled() int deviceOwnerUserId = Flags.headlessDeviceOwnerSingleUserEnabled() && getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER && isSingleUserMode ? mUserManagerInternal.getMainUserId() ? mUserManagerInternal.getMainUserId() : UserHandle.USER_SYSTEM; : UserHandle.USER_SYSTEM; if (!removeNonRequiredAppsForManagedDevice( if (!removeNonRequiredAppsForManagedDevice( deviceOwnerUserId, deviceOwnerUserId, Loading Loading @@ -24256,4 +24269,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return mDevicePolicyEngine.getMaxPolicyStorageLimit(); return mDevicePolicyEngine.getMaxPolicyStorageLimit(); } } @Override public int getHeadlessDeviceOwnerMode(String callerPackageName) { final CallerIdentity caller = getCallerIdentity(callerPackageName); enforcePermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, caller.getPackageName(), caller.getUserId()); return Binder.withCleanCallingIdentity(() -> getHeadlessDeviceOwnerMode()); } } } Loading
core/java/android/app/admin/DeviceAdminInfo.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -189,10 +189,13 @@ public final class DeviceAdminInfo implements Parcelable { @FlaggedApi(FLAG_HEADLESS_DEVICE_OWNER_SINGLE_USER_ENABLED) @FlaggedApi(FLAG_HEADLESS_DEVICE_OWNER_SINGLE_USER_ENABLED) public static final int HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER = 2; public static final int HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER = 2; /** * @hide */ @IntDef({HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED, HEADLESS_DEVICE_OWNER_MODE_AFFILIATED, @IntDef({HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED, HEADLESS_DEVICE_OWNER_MODE_AFFILIATED, HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER}) HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER}) @Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE) private @interface HeadlessDeviceOwnerMode {} public @interface HeadlessDeviceOwnerMode {} /** @hide */ /** @hide */ public static class PolicyInfo { public static class PolicyInfo { Loading
core/java/android/app/admin/DevicePolicyManager.java +23 −0 Original line number Original line Diff line number Diff line Loading @@ -53,6 +53,7 @@ import static android.Manifest.permission.QUERY_ADMIN_POLICY; import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY; import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY; import static android.Manifest.permission.SET_TIME; import static android.Manifest.permission.SET_TIME; import static android.Manifest.permission.SET_TIME_ZONE; import static android.Manifest.permission.SET_TIME_ZONE; import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED; import static android.app.admin.flags.Flags.FLAG_DEVICE_THEFT_API_ENABLED; import static android.app.admin.flags.Flags.FLAG_DEVICE_THEFT_API_ENABLED; import static android.app.admin.flags.Flags.FLAG_ESIM_MANAGEMENT_ENABLED; import static android.app.admin.flags.Flags.FLAG_ESIM_MANAGEMENT_ENABLED; import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED; import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED; Loading Loading @@ -93,6 +94,7 @@ import android.app.Activity; import android.app.IServiceConnection; import android.app.IServiceConnection; import android.app.KeyguardManager; import android.app.KeyguardManager; import android.app.admin.SecurityLog.SecurityEvent; import android.app.admin.SecurityLog.SecurityEvent; import android.app.admin.flags.Flags; import android.app.compat.CompatChanges; import android.app.compat.CompatChanges; import android.compat.annotation.ChangeId; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.compat.annotation.EnabledSince; Loading Loading @@ -17526,4 +17528,25 @@ public class DevicePolicyManager { } } return -1; return -1; } } /** * @return The headless device owner mode for the current set DO, returns * {@link DeviceAdminInfo#HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED} if no DO is set. * * @hide */ @DeviceAdminInfo.HeadlessDeviceOwnerMode public int getHeadlessDeviceOwnerMode() { if (!Flags.headlessDeviceOwnerProvisioningFixEnabled()) { return HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED; } if (mService != null) { try { return mService.getHeadlessDeviceOwnerMode(mContext.getPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } return HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED; } } } No newline at end of file
core/java/android/app/admin/IDevicePolicyManager.aidl +2 −0 Original line number Original line Diff line number Diff line Loading @@ -625,4 +625,6 @@ interface IDevicePolicyManager { void setMaxPolicyStorageLimit(String packageName, int storageLimit); void setMaxPolicyStorageLimit(String packageName, int storageLimit); int getMaxPolicyStorageLimit(String packageName); int getMaxPolicyStorageLimit(String packageName); int getHeadlessDeviceOwnerMode(String callerPackageName); } }
core/java/android/app/admin/flags/flags.aconfig +10 −0 Original line number Original line Diff line number Diff line Loading @@ -163,3 +163,13 @@ flag { description: "Enable UX changes for esim management" description: "Enable UX changes for esim management" bug: "295301164" bug: "295301164" } } flag { name: "headless_device_owner_provisioning_fix_enabled" namespace: "enterprise" description: "Fix provisioning for single-user headless DO" bug: "289515470" metadata { purpose: PURPOSE_BUGFIX } }
services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +25 −3 Original line number Original line Diff line number Diff line Loading @@ -16877,6 +16877,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private int checkDeviceOwnerProvisioningPreCondition(@UserIdInt int callingUserId) { private int checkDeviceOwnerProvisioningPreCondition(@UserIdInt int callingUserId) { synchronized (getLockObject()) { synchronized (getLockObject()) { final int deviceOwnerUserId = mInjector.userManagerIsHeadlessSystemUserMode() final int deviceOwnerUserId = mInjector.userManagerIsHeadlessSystemUserMode() && (!Flags.headlessDeviceOwnerProvisioningFixEnabled() || getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_AFFILIATED) ? UserHandle.USER_SYSTEM ? UserHandle.USER_SYSTEM : callingUserId; : callingUserId; Slogf.i(LOG_TAG, "Calling user %d, device owner will be set on user %d", Slogf.i(LOG_TAG, "Calling user %d, device owner will be set on user %d", Loading Loading @@ -21549,10 +21551,21 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { setTimeAndTimezone(provisioningParams.getTimeZone(), provisioningParams.getLocalTime()); setTimeAndTimezone(provisioningParams.getTimeZone(), provisioningParams.getLocalTime()); setLocale(provisioningParams.getLocale()); setLocale(provisioningParams.getLocale()); boolean isSingleUserMode; if (Flags.headlessDeviceOwnerProvisioningFixEnabled()) { DeviceAdminInfo adminInfo = findAdmin( deviceAdmin, caller.getUserId(), /* throwForMissingPermission= */ false); isSingleUserMode = (adminInfo != null && adminInfo.getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER); } else { isSingleUserMode = (getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER); } int deviceOwnerUserId = Flags.headlessDeviceOwnerSingleUserEnabled() int deviceOwnerUserId = Flags.headlessDeviceOwnerSingleUserEnabled() && getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER && isSingleUserMode ? mUserManagerInternal.getMainUserId() ? mUserManagerInternal.getMainUserId() : UserHandle.USER_SYSTEM; : UserHandle.USER_SYSTEM; if (!removeNonRequiredAppsForManagedDevice( if (!removeNonRequiredAppsForManagedDevice( deviceOwnerUserId, deviceOwnerUserId, Loading Loading @@ -24256,4 +24269,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return mDevicePolicyEngine.getMaxPolicyStorageLimit(); return mDevicePolicyEngine.getMaxPolicyStorageLimit(); } } @Override public int getHeadlessDeviceOwnerMode(String callerPackageName) { final CallerIdentity caller = getCallerIdentity(callerPackageName); enforcePermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, caller.getPackageName(), caller.getUserId()); return Binder.withCleanCallingIdentity(() -> getHeadlessDeviceOwnerMode()); } } }