diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 0d1bc05df67b4..7c7c7ef382c16 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -2687,7 +2687,7 @@ public class AppOpsManager { AppOpsManager.MODE_ALLOWED, // READ_ICC_SMS AppOpsManager.MODE_ALLOWED, // WRITE_ICC_SMS AppOpsManager.MODE_DEFAULT, // WRITE_SETTINGS - getSystemAlertWindowDefault(), // SYSTEM_ALERT_WINDOW + AppOpsManager.MODE_DEFAULT, // SYSTEM_ALERT_WINDOW /*Overridden in opToDefaultMode()*/ AppOpsManager.MODE_ALLOWED, // ACCESS_NOTIFICATIONS AppOpsManager.MODE_ALLOWED, // CAMERA AppOpsManager.MODE_ALLOWED, // RECORD_AUDIO @@ -3011,6 +3011,8 @@ public class AppOpsManager { private static final String DEBUG_LOGGING_OPS_PROP = "appops.logging_ops"; private static final String DEBUG_LOGGING_TAG = "AppOpsManager"; + private static volatile Integer sOpSystemAlertWindowDefaultMode; + /** * Retrieve the op switch that controls the given operation. * @hide @@ -3109,6 +3111,9 @@ public class AppOpsManager { * @hide */ public static @Mode int opToDefaultMode(int op) { + if (op == OP_SYSTEM_ALERT_WINDOW) { + return getSystemAlertWindowDefault(); + } return sOpDefaultMode[op]; } @@ -10113,6 +10118,11 @@ public class AppOpsManager { } private static int getSystemAlertWindowDefault() { + // This is indeed racy but we aren't expecting the result to change so it's not worth + // the synchronization. + if (sOpSystemAlertWindowDefaultMode != null) { + return sOpSystemAlertWindowDefaultMode; + } final Context context = ActivityThread.currentApplication(); if (context == null) { return AppOpsManager.MODE_DEFAULT; @@ -10123,10 +10133,11 @@ public class AppOpsManager { // TVs are constantly plugged in and has less concern for memory/power if (ActivityManager.isLowRamDeviceStatic() && !pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK, 0)) { - return AppOpsManager.MODE_IGNORED; + sOpSystemAlertWindowDefaultMode = AppOpsManager.MODE_IGNORED; + } else { + sOpSystemAlertWindowDefaultMode = AppOpsManager.MODE_DEFAULT; } - - return AppOpsManager.MODE_DEFAULT; + return sOpSystemAlertWindowDefaultMode; } /**