diff options
| -rw-r--r-- | services/core/java/com/android/server/am/ActiveServices.java | 36 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/flags.aconfig | 7 |
2 files changed, 40 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index b8f6b3f3a988..33ca15a14a6d 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -372,6 +372,15 @@ public final class ActiveServices { @Overridable public static final long FGS_BOOT_COMPLETED_RESTRICTIONS = 296558535L; + /** + * Disables foreground service background starts in System Alert Window for all types + * unless it already has a System Overlay Window. + */ + @ChangeId + @EnabledSince(targetSdkVersion = VERSION_CODES.VANILLA_ICE_CREAM) + @Overridable + public static final long FGS_SAW_RESTRICTIONS = 319471980L; + final ActivityManagerService mAm; // Maximum number of services that we allow to start in the background @@ -8525,10 +8534,31 @@ public final class ActiveServices { } } + // The flag being enabled isn't enough to deny background start: we need to also check + // if there is a system alert UI present. if (ret == REASON_DENIED) { - if (mAm.mAtmInternal.hasSystemAlertWindowPermission(callingUid, callingPid, - callingPackage)) { - ret = REASON_SYSTEM_ALERT_WINDOW_PERMISSION; + // Flag check: are we disabling SAW FGS background starts? + final boolean shouldDisableSaw = Flags.fgsDisableSaw() + && CompatChanges.isChangeEnabled(FGS_BOOT_COMPLETED_RESTRICTIONS, callingUid); + if (shouldDisableSaw) { + final ProcessRecord processRecord = mAm + .getProcessRecordLocked(targetService.processName, + targetService.appInfo.uid); + if (processRecord != null) { + if (processRecord.mState.hasOverlayUi()) { + if (mAm.mAtmInternal.hasSystemAlertWindowPermission(callingUid, callingPid, + callingPackage)) { + ret = REASON_SYSTEM_ALERT_WINDOW_PERMISSION; + } + } + } else { + Slog.e(TAG, "Could not find process record for SAW check"); + } + } else { + if (mAm.mAtmInternal.hasSystemAlertWindowPermission(callingUid, callingPid, + callingPackage)) { + ret = REASON_SYSTEM_ALERT_WINDOW_PERMISSION; + } } } diff --git a/services/core/java/com/android/server/am/flags.aconfig b/services/core/java/com/android/server/am/flags.aconfig index 16dbe18f1555..e955b00566b8 100644 --- a/services/core/java/com/android/server/am/flags.aconfig +++ b/services/core/java/com/android/server/am/flags.aconfig @@ -23,6 +23,13 @@ flag { } flag { + name: "fgs_disable_saw" + namespace: "backstage_power" + description: "Disable System Alert Window FGS start" + bug: "296558535" +} + +flag { name: "bfgs_managed_network_access" namespace: "backstage_power" description: "Restrict network access for certain applications in BFGS process state" |