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.