From 3d569572163a289a9372643eed129260ea071046 Mon Sep 17 00:00:00 2001 From: Gaurav Bhola Date: Fri, 21 Apr 2023 16:04:58 -0700 Subject: [PATCH] Always create root task for ACTIVITY_TYPE_RECENTS - When alwaysCreateRootTask() returns false lets say for recents activity, it leads to double nesting of root tasks on top of recents. - This double nesting works fine for phones where recents is full-screen but it leads to inconsistent state for the cases where the recents activity itself needs to be in a multi window mode i.e. inside a launch root task. Fix: 277088827 Test: atest TaskDisplayAreaTests Change-Id: I3a097028b58b451a33932eb039ae9fb970d734df --- .../com/android/server/wm/DisplayContent.java | 2 +- .../server/wm/TaskDisplayAreaTests.java | 29 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index ef38e8962599f..8bca1067de8c5 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -6045,7 +6045,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp static boolean alwaysCreateRootTask(int windowingMode, int activityType) { // Always create a root task for fullscreen, freeform, and multi windowing // modes so that we can manage visual ordering and return types correctly. - return activityType == ACTIVITY_TYPE_STANDARD + return (activityType == ACTIVITY_TYPE_STANDARD || activityType == ACTIVITY_TYPE_RECENTS) && (windowingMode == WINDOWING_MODE_FULLSCREEN || windowingMode == WINDOWING_MODE_FREEFORM || windowingMode == WINDOWING_MODE_PINNED diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java index d43805ab95541..c53addcf220ca 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java @@ -63,6 +63,8 @@ import com.android.server.wm.LaunchParamsController.LaunchParams; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.List; + /** * Tests for the {@link TaskDisplayArea} container. * @@ -349,23 +351,24 @@ public class TaskDisplayAreaTests extends WindowTestsBase { @Test public void testReuseTaskAsRootTask() { final Task candidateTask = createTask(mDisplayContent); - final int type = ACTIVITY_TYPE_STANDARD; - assertGetOrCreateRootTask(WINDOWING_MODE_FULLSCREEN, type, candidateTask, - true /* reuseCandidate */); - assertGetOrCreateRootTask(WINDOWING_MODE_UNDEFINED, type, candidateTask, - true /* reuseCandidate */); - assertGetOrCreateRootTask(WINDOWING_MODE_FREEFORM, type, candidateTask, - true /* reuseCandidate */); - assertGetOrCreateRootTask(WINDOWING_MODE_MULTI_WINDOW, type, candidateTask, - true /* reuseCandidate */); - assertGetOrCreateRootTask(WINDOWING_MODE_PINNED, type, candidateTask, - true /* reuseCandidate */); + List activityTypesWithReusableRootTask = List.of(ACTIVITY_TYPE_STANDARD, + ACTIVITY_TYPE_RECENTS); + for (Integer type : activityTypesWithReusableRootTask) { + assertGetOrCreateRootTask(WINDOWING_MODE_FULLSCREEN, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateRootTask(WINDOWING_MODE_UNDEFINED, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateRootTask(WINDOWING_MODE_FREEFORM, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateRootTask(WINDOWING_MODE_MULTI_WINDOW, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateRootTask(WINDOWING_MODE_PINNED, type, candidateTask, + true /* reuseCandidate */); + } final int windowingMode = WINDOWING_MODE_FULLSCREEN; assertGetOrCreateRootTask(windowingMode, ACTIVITY_TYPE_HOME, candidateTask, false /* reuseCandidate */); - assertGetOrCreateRootTask(windowingMode, ACTIVITY_TYPE_RECENTS, candidateTask, - false /* reuseCandidate */); assertGetOrCreateRootTask(windowingMode, ACTIVITY_TYPE_ASSISTANT, candidateTask, false /* reuseCandidate */); assertGetOrCreateRootTask(windowingMode, ACTIVITY_TYPE_DREAM, candidateTask,