Allow all packages participating in any foreground task start
activities from background
Bug: 128772406 (mechanism)
Bug: 123970943 (manifestation)
Test: manual (going through SUW)
Change-Id: Idee58db64357359619b48ebda4afd288a9349fa3
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 3acd4e7..ea1db40 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -997,6 +997,10 @@
if (callerApp.areBackgroundActivityStartsAllowed()) {
return false;
}
+ // don't abort if the caller has an activity in any foreground task
+ if (callerApp.hasActivityInVisibleTask()) {
+ return false;
+ }
}
// don't abort if the callingUid has START_ACTIVITIES_FROM_BACKGROUND permission
if (mService.checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid)
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index dceed28..1b4aa26 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -471,6 +471,20 @@
}
}
+ boolean hasActivityInVisibleTask() {
+ for (int i = mActivities.size() - 1; i >= 0; --i) {
+ TaskRecord task = mActivities.get(i).getTaskRecord();
+ if (task == null) {
+ continue;
+ }
+ ActivityRecord topActivity = task.getTopActivity();
+ if (topActivity != null && topActivity.visible) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Update the top resuming activity in process for pre-Q apps, only the top-most visible
* activities are allowed to be resumed per process.