Fix default mode for system alert window on low-RAM device.

Bug: 219771773
Fixes: 219771773
Test: atest com.google.android.memory.gts.RestrictedFeatureTest#testSystemAlertWindowRestriction
Change-Id: I688dc11154383966f83cfdfcd1163a713bb03e61
This commit is contained in:
Rajeev Kumar
2022-02-15 11:21:49 -08:00
parent 38e0ef45e2
commit 8152335ad4

View File

@@ -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;
}
/**