diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java index e8ebf6312cdd0..f36cf1ca2befb 100644 --- a/core/java/android/os/UserHandle.java +++ b/core/java/android/os/UserHandle.java @@ -131,6 +131,19 @@ public final class UserHandle implements Parcelable { } } + /** + * Whether a UID belongs to a system core component or not. + * @hide + */ + public static boolean isCore(int uid) { + if (uid >= 0) { + final int appId = getAppId(uid); + return appId < Process.FIRST_APPLICATION_UID; + } else { + return false; + } + } + /** * Returns the user for a given uid. * @param uid A uid for an application running in a particular user. diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c4a968e4d86c2..a89015b7ac997 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -7846,6 +7846,14 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public boolean isAppForeground(int uid) throws RemoteException { + int callerUid = Binder.getCallingUid(); + if (UserHandle.isCore(callerUid) || callerUid == uid) { + return isAppForegroundInternal(uid); + } + return false; + } + + private boolean isAppForegroundInternal(int uid) { synchronized (this) { UidRecord uidRec = mActiveUids.get(uid); if (uidRec == null || uidRec.idle) {