diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java index c02fcabfcf623..b0460142c30e8 100644 --- a/core/java/android/app/admin/DevicePolicyManagerInternal.java +++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java @@ -231,7 +231,13 @@ public abstract class DevicePolicyManagerInternal { * Returns the profile owner component for the given user, or {@code null} if there is not one. */ @Nullable - public abstract ComponentName getProfileOwnerAsUser(int userHandle); + public abstract ComponentName getProfileOwnerAsUser(@UserIdInt int userId); + + /** + * Returns the user id of the device owner, or {@link UserHandle#USER_NULL} if there is not one. + */ + @UserIdInt + public abstract int getDeviceOwnerUserId(); /** * Returns whether the given package is a device owner or a profile owner in the calling user. diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index ccbf73ca9ab0f..225c998d4c50f 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -4760,13 +4760,31 @@ public class UserManagerService extends IUserManager.Stub { final boolean hasParent = user.profileGroupId != user.id && user.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID; if (verbose) { - pw.printf("%d: id=%d, name=%s, flags=%s%s%s%s%s%s%s\n", i, user.id, user.name, + final DevicePolicyManagerInternal dpm = getDevicePolicyManagerInternal(); + String deviceOwner = ""; + String profileOwner = ""; + if (dpm != null) { + final long ident = Binder.clearCallingIdentity(); + try { + if (dpm.getDeviceOwnerUserId() == user.id) { + deviceOwner = " (device-owner)"; + } + if (dpm.getProfileOwnerAsUser(user.id) != null) { + profileOwner = " (profile-owner)"; + } + } finally { + Binder.restoreCallingIdentity(ident); + } + } + pw.printf("%d: id=%d, name=%s, flags=%s%s%s%s%s%s%s%s%s\n", i, user.id, + user.name, UserInfo.flagsToString(user.flags), hasParent ? " (parentId=" + user.profileGroupId + ")" : "", running ? " (running)" : "", user.partial ? " (partial)" : "", user.preCreated ? " (pre-created)" : "", user.convertedFromPreCreated ? " (converted)" : "", + deviceOwner, profileOwner, current ? " (current)" : ""); } else { // NOTE: the standard "list users" command is used by integration tests and @@ -4860,6 +4878,21 @@ public class UserManagerService extends IUserManager.Stub { if (userInfo.convertedFromPreCreated) { pw.print(" "); } + final DevicePolicyManagerInternal dpm = getDevicePolicyManagerInternal(); + if (dpm != null) { + final long ident = Binder.clearCallingIdentity(); + try { + if (dpm.getDeviceOwnerUserId() == userId) { + pw.print(" "); + } + if (dpm.getProfileOwnerAsUser(userId) != null) { + pw.print(" "); + } + } finally { + Binder.restoreCallingIdentity(ident); + } + } + pw.println(); pw.print(" Type: "); pw.println(userInfo.userType); pw.print(" Flags: "); pw.print(userInfo.flags); pw.print(" ("); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index d35d806741e65..c73f4932bf506 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -11780,8 +11780,13 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } @Override - public ComponentName getProfileOwnerAsUser(int userHandle) { - return DevicePolicyManagerService.this.getProfileOwnerAsUser(userHandle); + public ComponentName getProfileOwnerAsUser(@UserIdInt int userId) { + return DevicePolicyManagerService.this.getProfileOwnerAsUser(userId); + } + + @Override + public int getDeviceOwnerUserId() { + return DevicePolicyManagerService.this.getDeviceOwnerUserId(); } @Override