From 27d5a1f5a1108d69a665b0f7ad6772592c35bba6 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 10 Aug 2020 13:17:22 +0800 Subject: [PATCH] Avoid adjusting top focused root task while clear task Top focused root task was updated while clear task for reuse, which isn't necessary. This was happening after 046523c merged. Also avoid resuming the top activity in next focused root task to prevent additional top-resumed-activity state changes. Bug: 160613519 Bug: 163003067 Test: asit/perf/junit/jank_systemui_test Change-Id: I8ddbfc3b0a62ddb29833d324e42812ed0dc096db (cherry picked from commit 2caec7ba30b63785d5d5ee5d1341bd11f373aa12) --- .../com/android/server/wm/ActivityRecord.java | 4 +++- .../android/server/wm/ActivityStarter.java | 2 -- .../core/java/com/android/server/wm/Task.java | 19 +++++++++++++++---- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index e9ceee3debee6..f74684070d0b5 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2543,7 +2543,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final ActivityStack stack = getRootTask(); final boolean mayAdjustTop = (isState(RESUMED) || stack.mResumedActivity == null) - && stack.isFocusedStackOnDisplay(); + && stack.isFocusedStackOnDisplay() + // Do not adjust focus task because the task will be reused to launch new activity. + && !task.isClearingToReuseTask(); final boolean shouldAdjustGlobalFocus = mayAdjustTop // It must be checked before {@link #makeFinishingLocked} is called, because a stack // is not visible if it only contains finishing activities. diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index b3786212ea720..b869eb56f536a 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2009,8 +2009,6 @@ class ActivityStarter { // of history or if it is finished immediately), thus disassociating the task. Also note // that mReuseTask is reset as a result of {@link Task#performClearTaskLocked} // launching another activity. - // TODO(b/36119896): We shouldn't trigger activity launches in this path since we are - // already launching one. targetTask.performClearTaskLocked(); targetTask.setIntent(mStartActivity); mAddingToTask = true; diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 6785127d59535..4e923dac5c17f 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1528,14 +1528,25 @@ class Task extends WindowContainer { */ void performClearTaskLocked() { mReuseTask = true; - performClearTask("clear-task-all"); - mReuseTask = false; + mStackSupervisor.beginDeferResume(); + try { + performClearTask("clear-task-all"); + } finally { + mStackSupervisor.endDeferResume(); + mReuseTask = false; + } } ActivityRecord performClearTaskForReuseLocked(ActivityRecord newR, int launchFlags) { mReuseTask = true; - final ActivityRecord result = performClearTaskLocked(newR, launchFlags); - mReuseTask = false; + mStackSupervisor.beginDeferResume(); + final ActivityRecord result; + try { + result = performClearTaskLocked(newR, launchFlags); + } finally { + mStackSupervisor.endDeferResume(); + mReuseTask = false; + } return result; }