From 906af488b3dceb5b995e7c8a7a58bf84aaf1c28a Mon Sep 17 00:00:00 2001 From: Ricky Wai Date: Mon, 3 Jun 2019 17:25:28 +0100 Subject: [PATCH] Do not allow app to start background activity after stop app switches triggered Bug: 133450759 Bug: 132333960 Test: atest CtsActivityManagerBackgroundActivityTestCases Change-Id: Ifec482d94437cb9e26fa30a1aa66d212c463cd99 --- .../android/server/wm/ActivityTaskManagerService.java | 11 +++++++++++ .../android/server/wm/WindowProcessController.java | 10 ++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 765c9d0a58647..7284e0f70b54e 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -508,6 +508,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { */ private boolean mDidAppSwitch; + /** + * Last stop app switches time, apps finished before this time cannot start background activity + * even if they are in grace period. + */ + private long mLastStopAppSwitchesTime; + IActivityController mController = null; boolean mControllerIsAMonkey = false; @@ -4731,6 +4737,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "stopAppSwitches"); synchronized (mGlobalLock) { mAppSwitchesAllowedTime = SystemClock.uptimeMillis() + APP_SWITCH_DELAY_TIME; + mLastStopAppSwitchesTime = SystemClock.uptimeMillis(); mDidAppSwitch = false; getActivityStartController().schedulePendingActivityLaunches(APP_SWITCH_DELAY_TIME); } @@ -4747,6 +4754,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } + long getLastStopAppSwitchesTime() { + return mLastStopAppSwitchesTime; + } + void onStartActivitySetDidAppSwitch() { if (mDidAppSwitch) { // This is the second allowed switch since we stopped switches, so now just generally diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 2ad25cf123e20..bc5e32823547a 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -402,11 +402,17 @@ public class WindowProcessController extends ConfigurationContainer mAtm.getLastStopAppSwitchesTime() + || mLastActivityFinishTime > mAtm.getLastStopAppSwitchesTime()) { + return true; + } } // allow if the proc is instrumenting with background activity starts privs if (mInstrumentingWithBackgroundActivityStartPrivileges) {