diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 1b352c7285545..d2fd8ff3890e7 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -5663,8 +5663,8 @@ public final class ActiveServices { } if (ret == REASON_DENIED) { - if (mAm.checkPermission(SYSTEM_ALERT_WINDOW, callingPid, - callingUid) == PERMISSION_GRANTED) { + if (mAm.mAtmInternal.hasSystemAlertWindowPermission(callingUid, callingPid, + callingPackage)) { ret = REASON_SYSTEM_ALERT_WINDOW_PERMISSION; } } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 060323c34b40e..12c67bb9b7be1 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -607,4 +607,10 @@ public abstract class ActivityTaskManagerInternal { */ void commit() throws RemoteException; } + + /** + * A utility method to check AppOps and PackageManager for SYSTEM_ALERT_WINDOW permission. + */ + public abstract boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, + String callingPackage); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 09f5c937928c2..46913eb42e3a2 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -933,7 +933,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return getUserManager().hasUserRestriction(restriction, userId); } - boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, String callingPackage) { + boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, + String callingPackage) { final int mode = getAppOpsManager().noteOpNoThrow(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, callingUid, callingPackage, /* featureId */ null, ""); if (mode == AppOpsManager.MODE_DEFAULT) { @@ -6370,6 +6371,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return new PackageConfigurationUpdaterImpl(Binder.getCallingPid()); } } + + @Override + public boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, + String callingPackage) { + return ActivityTaskManagerService.this.hasSystemAlertWindowPermission(callingUid, + callingPid, callingPackage); + } } final class PackageConfigurationUpdaterImpl implements