diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 3c445ae4b6675..643aa71524cfb 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -5623,8 +5623,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 e858fe1034b1b..77cc0aeb4f270 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -606,4 +606,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 52d110c95e36a..5f877d01c022b 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -932,7 +932,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) { @@ -6369,6 +6370,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