diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl index 7437e037fa3ea..087568defb270 100644 --- a/core/java/android/os/IUserManager.aidl +++ b/core/java/android/os/IUserManager.aidl @@ -113,7 +113,7 @@ interface IUserManager { boolean hasBadge(int userId); boolean isUserUnlocked(int userId); boolean isUserRunning(int userId); - boolean isUserForeground(); + boolean isUserForeground(int userId); boolean isUserNameSet(int userId); boolean hasRestrictedProfiles(); boolean requestQuietModeEnabled(String callingPackage, boolean enableQuietMode, int userId, in IntentSender target, int flags); diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 682754e66904a..5069e03191197 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -2316,13 +2316,14 @@ public class UserManager { } /** - * Checks if the calling user is running on foreground. + * Checks if the context user is running in the foreground. * - * @return whether the calling user is running on foreground. + * @return whether the context user is running in the foreground. */ + @UserHandleAware public boolean isUserForeground() { try { - return mService.isUserForeground(); + return mService.isUserForeground(mUserId); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index c75dd27a383a3..4fc9b0bcc7f9e 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1526,11 +1526,18 @@ public class UserManagerService extends IUserManager.Stub { } @Override - public boolean isUserForeground() { - int callingUserId = Binder.getCallingUserHandle().getIdentifier(); + public boolean isUserForeground(@UserIdInt int userId) { + final int callingUserId = UserHandle.getCallingUserId(); + if (callingUserId != userId + && !hasManageUsersOrPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)) { + throw new SecurityException("Caller from user " + callingUserId + " needs MANAGE_USERS " + + "or INTERACT_ACROSS_USERS permission to check if another user (" + userId + + ") is running in the foreground"); + } + int currentUser = Binder.withCleanCallingIdentity(() -> ActivityManager.getCurrentUser()); // TODO(b/179163496): should return true for profile users of the current user as well - return currentUser == callingUserId; + return currentUser == userId; } @Override