diff --git a/core/api/current.txt b/core/api/current.txt index 0e64a9d14fae53aea70dc59f1324231704e3c00a..925f332db9609b674a10f2d478c2f31ea63d4c29 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -7104,6 +7104,7 @@ package android.app.admin { method public boolean isUniqueDeviceAttestationSupported(); method public boolean isUsbDataSignalingEnabled(); method public boolean isUsingUnifiedPassword(@NonNull android.content.ComponentName); + method @NonNull public java.util.List<android.os.UserHandle> listForegroundAffiliatedUsers(); method public void lockNow(); method public void lockNow(int); method public int logoutUser(@NonNull android.content.ComponentName); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 28242b08ca6544dc11f2227ea426fbd038e29835..305c22446e9038774429a0cd0f439ddc6e00589b 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -13357,6 +13357,7 @@ public class DevicePolicyManager { } } } + /** * Returns true if the caller is running on a device where the admin can grant * permissions related to device sensors. @@ -13459,4 +13460,22 @@ public class DevicePolicyManager { } return false; } + + /** + * Gets the list of {@link #isAffiliatedUser() affiliated} users running on foreground. + * + * @return list of {@link #isAffiliatedUser() affiliated} users running on foreground. + * + * @throws SecurityException if the calling application is not a device owner + */ + @NonNull + public List<UserHandle> listForegroundAffiliatedUsers() { + if (mService == null) return Collections.emptyList(); + + try { + return mService.listForegroundAffiliatedUsers(); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 94388cfd41b9c9fb2753a6bc474a3e3fa286e9f5..91a9f3cff5827c54c3e5ec6a5b43c13ccf12c734 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -507,4 +507,6 @@ interface IDevicePolicyManager { boolean isUsbDataSignalingEnabled(String callerPackage); boolean isUsbDataSignalingEnabledForUser(int userId); boolean canUsbDataSignalingBeDisabled(); + + List<UserHandle> listForegroundAffiliatedUsers(); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 604d1d6c010b0f87958c3fe48e4ecd3de02140b5..5de5686cb965f5d0b70c6aee19f67f09ce284216 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -6450,7 +6450,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private void forceWipeUser(int userId, String wipeReasonForUser, boolean wipeSilently) { boolean success = false; try { - if (getCurrentForegroundUser() == userId) { + if (getCurrentForegroundUserId() == userId) { mInjector.getIActivityManager().switchUser(UserHandle.USER_SYSTEM); } @@ -7910,7 +7910,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Slog.i(LOG_TAG, "Device owner set: " + admin + " on user " + userId); if (mInjector.userManagerIsHeadlessSystemUserMode()) { - int currentForegroundUser = getCurrentForegroundUser(); + int currentForegroundUser = getCurrentForegroundUserId(); Slog.i(LOG_TAG, "setDeviceOwner(): setting " + admin + " as profile owner on user " + currentForegroundUser); // Sets profile owner on current foreground user since @@ -9041,7 +9041,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return UserHandle.isSameApp(caller.getUid(), Process.SHELL_UID); } - private @UserIdInt int getCurrentForegroundUser() { + private @UserIdInt int getCurrentForegroundUserId() { try { return mInjector.getIActivityManager().getCurrentUser().id; } catch (RemoteException e) { @@ -9050,6 +9050,25 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return UserHandle.USER_NULL; } + @Override + public List<UserHandle> listForegroundAffiliatedUsers() { + checkIsDeviceOwner(getCallerIdentity()); + + int userId = mInjector.binderWithCleanCallingIdentity(() -> getCurrentForegroundUserId()); + + boolean isAffiliated; + synchronized (getLockObject()) { + isAffiliated = isUserAffiliatedWithDeviceLocked(userId); + } + + if (!isAffiliated) return Collections.emptyList(); + + List<UserHandle> users = new ArrayList<>(1); + users.add(UserHandle.of(userId)); + + return users; + } + protected int getProfileParentId(int userHandle) { return mInjector.binderWithCleanCallingIdentity(() -> { UserInfo parentUser = mUserManager.getProfileParent(userHandle); @@ -12861,7 +12880,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return CODE_NONSYSTEM_USER_EXISTS; } - int currentForegroundUser = getCurrentForegroundUser(); + int currentForegroundUser = getCurrentForegroundUserId(); if (callingUserId != currentForegroundUser && mInjector.userManagerIsHeadlessSystemUserMode() && currentForegroundUser == UserHandle.USER_SYSTEM) { @@ -12957,6 +12976,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return CODE_OK; } + private void checkIsDeviceOwner(CallerIdentity caller) { + Preconditions.checkCallAuthorization(isDeviceOwner(caller), caller.getUid() + + " is not device owner"); + } + private ComponentName getOwnerComponent(String packageName, int userId) { if (isDeviceOwnerPackage(packageName, userId)) { return mOwners.getDeviceOwnerComponent(); @@ -15447,7 +15471,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private boolean isLockTaskFeatureEnabled(int lockTaskFeature) throws RemoteException { //TODO(b/175285301): Explicitly get the user's identity to check. int lockTaskFeatures = - getUserData(getCurrentForegroundUser()).mLockTaskFeatures; + getUserData(getCurrentForegroundUserId()).mLockTaskFeatures; return (lockTaskFeatures & lockTaskFeature) == lockTaskFeature; }