From 6c5d725867d4a83521a5069d50b6256636ee4a1a Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 30 Mar 2020 15:42:01 +0800 Subject: [PATCH] Use display windowing mode if undefined A undefined windowing mode prevented from reusing the candidate task while cold start an activity into split-screen from Recents. Use windowing mode from its parent for always-create-stack check if undefined. Bug: 152408408 Test: atest TaskDisplayAreaTests Test: cold start to enter split-screen Change-Id: Ie0f5b69c9d09ad517b749827dbf2a5e7297b1075 --- .../android/server/wm/TaskDisplayArea.java | 6 +- .../server/wm/TaskDisplayAreaTests.java | 57 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 13e4d8b038b1b..726528cce9388 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -755,7 +755,11 @@ final class TaskDisplayArea extends DisplayArea { */ ActivityStack getOrCreateStack(int windowingMode, int activityType, boolean onTop, Intent intent, Task candidateTask) { - if (!alwaysCreateStack(windowingMode, activityType)) { + // Need to pass in a determined windowing mode to see if a new stack should be created, + // so use its parent's windowing mode if it is undefined. + if (!alwaysCreateStack( + windowingMode != WINDOWING_MODE_UNDEFINED ? windowingMode : getWindowingMode(), + activityType)) { ActivityStack stack = getStack(windowingMode, activityType); if (stack != null) { return stack; 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 19824bf73c1cf..9625ffdac0525 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java @@ -16,8 +16,18 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; +import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; +import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; +import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; +import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; @@ -27,6 +37,9 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; import android.platform.test.annotations.Presubmit; @@ -134,4 +147,48 @@ public class TaskDisplayAreaTests extends WindowTestsBase { assertEquals("The testing DisplayContent should be moved to top with task", mWm.mRoot.getChildCount() - 1, indexOfDisplayWithPinnedStack); } + + @Test + public void testReuseTaskAsStack() { + final Task candidateTask = createTaskStackOnDisplay(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD, mDisplayContent); + final Task newStack = createTaskStackOnDisplay(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_STANDARD, mDisplayContent); + doReturn(newStack).when(mDisplayContent.mTaskContainers).createStack(anyInt(), + anyInt(), anyBoolean(), any(), any(), anyBoolean()); + + final int type = ACTIVITY_TYPE_STANDARD; + assertGetOrCreateStack(WINDOWING_MODE_FULLSCREEN, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_UNDEFINED, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_FREEFORM, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_MULTI_WINDOW, type, candidateTask, + true /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, type, candidateTask, + false /* reuseCandidate */); + assertGetOrCreateStack(WINDOWING_MODE_PINNED, type, candidateTask, + false /* reuseCandidate */); + + final int windowingMode = WINDOWING_MODE_FULLSCREEN; + assertGetOrCreateStack(windowingMode, ACTIVITY_TYPE_HOME, candidateTask, + false /* reuseCandidate */); + assertGetOrCreateStack(windowingMode, ACTIVITY_TYPE_RECENTS, candidateTask, + false /* reuseCandidate */); + assertGetOrCreateStack(windowingMode, ACTIVITY_TYPE_ASSISTANT, candidateTask, + false /* reuseCandidate */); + assertGetOrCreateStack(windowingMode, ACTIVITY_TYPE_DREAM, candidateTask, + false /* reuseCandidate */); + } + + private void assertGetOrCreateStack(int windowingMode, int activityType, Task candidateTask, + boolean reuseCandidate) { + final TaskDisplayArea taskDisplayArea = (TaskDisplayArea) candidateTask.getParent(); + final ActivityStack stack = taskDisplayArea.getOrCreateStack(windowingMode, activityType, + false /* onTop */, null /* intent */, candidateTask /* candidateTask */); + assertEquals(reuseCandidate, stack == candidateTask); + } }