From 5ae76b1c72bc900a63bd58b44b133288fa18019e Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Fri, 2 Oct 2020 15:25:55 -0700 Subject: [PATCH] Fix some places that inadvertently removed split root tasks LaunchParamsController shouldn't change windowing-mode for non root tasks. Non-root tasks either inherit their windowing mode from the root or are being controlled in a transient state. Also, don't remove stacks that are created-by-organizer, it's up to the organizer to remove those. Bug: 168770671 Test: atest AssistantStackTests#testTranslucentAssistantActivityStackVisibility on device with freeform display Change-Id: Ibf1e504f04b7aa10dfe2f6976102bcf4836524f1 --- .../server/wm/LaunchParamsController.java | 6 ++--- .../android/server/wm/TaskDisplayArea.java | 7 +++--- .../wm/LaunchParamsControllerTests.java | 24 +++++++++++++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/LaunchParamsController.java b/services/core/java/com/android/server/wm/LaunchParamsController.java index 56e1187d51da2..a0074a2d760c3 100644 --- a/services/core/java/com/android/server/wm/LaunchParamsController.java +++ b/services/core/java/com/android/server/wm/LaunchParamsController.java @@ -144,11 +144,11 @@ class LaunchParamsController { mTmpParams.mPreferredTaskDisplayArea, true /* onTop */); } - if (mTmpParams.hasWindowingMode() - && mTmpParams.mWindowingMode != task.getRootTask().getWindowingMode()) { + if (mTmpParams.hasWindowingMode() && task.isRootTask() + && mTmpParams.mWindowingMode != task.getWindowingMode()) { final int activityType = activity != null ? activity.getActivityType() : task.getActivityType(); - task.getRootTask().setWindowingMode(task.getDisplayArea().validateWindowingMode( + task.setWindowingMode(task.getDisplayArea().validateWindowingMode( mTmpParams.mWindowingMode, activity, task, activityType)); } diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 696e1cafae95b..ce99102fddb33 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -1305,10 +1305,9 @@ final class TaskDisplayArea extends DisplayArea { final int windowingMode = windowingModes[j]; for (int i = getStackCount() - 1; i >= 0; --i) { final Task stack = getStackAt(i); - if (!stack.isActivityTypeStandardOrUndefined()) { - continue; - } - if (stack.getWindowingMode() != windowingMode) { + if (stack.mCreatedByOrganizer + || !stack.isActivityTypeStandardOrUndefined() + || stack.getWindowingMode() != windowingMode) { continue; } stacks.add(stack); diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java index 820eca4a49a89..bc7516f6514f7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; +import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; import static android.view.Display.INVALID_DISPLAY; import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; @@ -318,6 +319,29 @@ public class LaunchParamsControllerTests extends WindowTestsBase { assertEquals(windowingMode, afterWindowMode); } + /** + * Ensures that {@link LaunchParamsModifier} doesn't alter non-root tasks' windowingMode. + */ + @Test + public void testLayoutNonRootTaskWindowingModeChange() { + final LaunchParams params = new LaunchParams(); + final int windowingMode = WINDOWING_MODE_FREEFORM; + params.mWindowingMode = windowingMode; + final InstrumentedPositioner positioner = new InstrumentedPositioner(RESULT_DONE, params); + final Task task = new TaskBuilder(mAtm.mStackSupervisor).setCreateParentTask(true).build(); + task.getRootTask().setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); + + mController.registerModifier(positioner); + + final int beforeWindowMode = task.getWindowingMode(); + assertNotEquals(windowingMode, beforeWindowMode); + + mController.layoutTask(task, null /* windowLayout */); + + final int afterWindowMode = task.getWindowingMode(); + assertEquals(afterWindowMode, beforeWindowMode); + } + /** * Ensures that {@link LaunchParamsModifier} requests specifying bounds during * layout are honored if window is in freeform.