Loading services/core/java/com/android/server/wm/Task.java +2 −2 Original line number Diff line number Diff line Loading @@ -1724,8 +1724,8 @@ class Task extends TaskFragment { /** Returns {@code true} if this task is currently in split-screen. */ boolean inSplitScreen() { return getWindowingMode() == WINDOWING_MODE_MULTI_WINDOW && getRootTask() != null && getRootTask().getAdjacentTaskFragment() != null; && getCreatedByOrganizerTask() != null && getCreatedByOrganizerTask().getAdjacentTaskFragment() != null; } private boolean supportsSplitScreenWindowingModeInner(@Nullable TaskDisplayArea tda) { Loading services/core/java/com/android/server/wm/TaskDisplayArea.java +21 −4 Original line number Diff line number Diff line Loading @@ -963,7 +963,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } else if (candidateTask != null) { final int position = onTop ? POSITION_TOP : POSITION_BOTTOM; final Task launchRootTask = getLaunchRootTask(resolvedWindowingMode, activityType, options, sourceTask, launchFlags); options, sourceTask, launchFlags, candidateTask); if (launchRootTask != null) { if (candidateTask.getParent() == null) { launchRootTask.addChild(candidateTask, position); Loading Loading @@ -1117,6 +1117,13 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { @Nullable Task getLaunchRootTask(int windowingMode, int activityType, @Nullable ActivityOptions options, @Nullable Task sourceTask, int launchFlags) { return getLaunchRootTask(windowingMode, activityType, options, sourceTask, launchFlags, null /* candidateTask */); } @Nullable Task getLaunchRootTask(int windowingMode, int activityType, @Nullable ActivityOptions options, @Nullable Task sourceTask, int launchFlags, @Nullable Task candidateTask) { // Try to use the launch root task in options if available. if (options != null) { final Task launchRootTask = Task.fromWindowContainerToken(options.getLaunchRootTask()); Loading Loading @@ -1157,9 +1164,19 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } // For a better split UX, If a task is launching from a created-by-organizer task, it should // be launched into the same created-by-organizer task as well. if (sourceTask != null) { return sourceTask.getCreatedByOrganizerTask(); // be launched into the same created-by-organizer task as well. Unless, the candidate task // is already positioned in the split. Task preferredRootInSplit = sourceTask != null && sourceTask.inSplitScreen() ? sourceTask.getCreatedByOrganizerTask() : null; if (preferredRootInSplit != null) { if (candidateTask != null) { final Task candidateRoot = candidateTask.getCreatedByOrganizerTask(); if (candidateRoot != null && candidateRoot != preferredRootInSplit && preferredRootInSplit == candidateRoot.getAdjacentTaskFragment()) { preferredRootInSplit = candidateRoot; } } return preferredRootInSplit; } return null; Loading services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java +31 −0 Original line number Diff line number Diff line Loading @@ -741,4 +741,35 @@ public class TaskDisplayAreaTests extends WindowTestsBase { assertEquals(isAssistantOnTop ? topPosition : topPosition - 4, getTaskIndexOf(taskDisplayArea, assistRootTask)); } /** * This test verifies proper launch root based on source and candidate task for split screen. * If a task is launching from a created-by-organizer task, it should be launched into the * same created-by-organizer task as well. Unless, the candidate task is already positioned in * the split. */ @Test public void getLaunchRootTaskInSplit() { final Task rootTask = createTask( mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD); rootTask.mCreatedByOrganizer = true; final Task adjacentRootTask = createTask( mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD); adjacentRootTask.mCreatedByOrganizer = true; final Task candidateTask = createTaskInRootTask(rootTask, 0 /* userId*/); final TaskDisplayArea taskDisplayArea = rootTask.getDisplayArea(); adjacentRootTask.setAdjacentTaskFragment(rootTask, false /* moveTogether */); // Verify the launch root with candidate task Task actualRootTask = taskDisplayArea.getLaunchRootTask(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, null /* options */, adjacentRootTask /* sourceTask */, 0 /* launchFlags */, candidateTask); assertSame(rootTask, actualRootTask.getRootTask()); // Verify the launch root task without candidate task actualRootTask = taskDisplayArea.getLaunchRootTask(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, null /* options */, adjacentRootTask /* sourceTask */, 0 /* launchFlags */); assertSame(adjacentRootTask, actualRootTask.getRootTask()); } } Loading
services/core/java/com/android/server/wm/Task.java +2 −2 Original line number Diff line number Diff line Loading @@ -1724,8 +1724,8 @@ class Task extends TaskFragment { /** Returns {@code true} if this task is currently in split-screen. */ boolean inSplitScreen() { return getWindowingMode() == WINDOWING_MODE_MULTI_WINDOW && getRootTask() != null && getRootTask().getAdjacentTaskFragment() != null; && getCreatedByOrganizerTask() != null && getCreatedByOrganizerTask().getAdjacentTaskFragment() != null; } private boolean supportsSplitScreenWindowingModeInner(@Nullable TaskDisplayArea tda) { Loading
services/core/java/com/android/server/wm/TaskDisplayArea.java +21 −4 Original line number Diff line number Diff line Loading @@ -963,7 +963,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } else if (candidateTask != null) { final int position = onTop ? POSITION_TOP : POSITION_BOTTOM; final Task launchRootTask = getLaunchRootTask(resolvedWindowingMode, activityType, options, sourceTask, launchFlags); options, sourceTask, launchFlags, candidateTask); if (launchRootTask != null) { if (candidateTask.getParent() == null) { launchRootTask.addChild(candidateTask, position); Loading Loading @@ -1117,6 +1117,13 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { @Nullable Task getLaunchRootTask(int windowingMode, int activityType, @Nullable ActivityOptions options, @Nullable Task sourceTask, int launchFlags) { return getLaunchRootTask(windowingMode, activityType, options, sourceTask, launchFlags, null /* candidateTask */); } @Nullable Task getLaunchRootTask(int windowingMode, int activityType, @Nullable ActivityOptions options, @Nullable Task sourceTask, int launchFlags, @Nullable Task candidateTask) { // Try to use the launch root task in options if available. if (options != null) { final Task launchRootTask = Task.fromWindowContainerToken(options.getLaunchRootTask()); Loading Loading @@ -1157,9 +1164,19 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } // For a better split UX, If a task is launching from a created-by-organizer task, it should // be launched into the same created-by-organizer task as well. if (sourceTask != null) { return sourceTask.getCreatedByOrganizerTask(); // be launched into the same created-by-organizer task as well. Unless, the candidate task // is already positioned in the split. Task preferredRootInSplit = sourceTask != null && sourceTask.inSplitScreen() ? sourceTask.getCreatedByOrganizerTask() : null; if (preferredRootInSplit != null) { if (candidateTask != null) { final Task candidateRoot = candidateTask.getCreatedByOrganizerTask(); if (candidateRoot != null && candidateRoot != preferredRootInSplit && preferredRootInSplit == candidateRoot.getAdjacentTaskFragment()) { preferredRootInSplit = candidateRoot; } } return preferredRootInSplit; } return null; Loading
services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java +31 −0 Original line number Diff line number Diff line Loading @@ -741,4 +741,35 @@ public class TaskDisplayAreaTests extends WindowTestsBase { assertEquals(isAssistantOnTop ? topPosition : topPosition - 4, getTaskIndexOf(taskDisplayArea, assistRootTask)); } /** * This test verifies proper launch root based on source and candidate task for split screen. * If a task is launching from a created-by-organizer task, it should be launched into the * same created-by-organizer task as well. Unless, the candidate task is already positioned in * the split. */ @Test public void getLaunchRootTaskInSplit() { final Task rootTask = createTask( mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD); rootTask.mCreatedByOrganizer = true; final Task adjacentRootTask = createTask( mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD); adjacentRootTask.mCreatedByOrganizer = true; final Task candidateTask = createTaskInRootTask(rootTask, 0 /* userId*/); final TaskDisplayArea taskDisplayArea = rootTask.getDisplayArea(); adjacentRootTask.setAdjacentTaskFragment(rootTask, false /* moveTogether */); // Verify the launch root with candidate task Task actualRootTask = taskDisplayArea.getLaunchRootTask(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, null /* options */, adjacentRootTask /* sourceTask */, 0 /* launchFlags */, candidateTask); assertSame(rootTask, actualRootTask.getRootTask()); // Verify the launch root task without candidate task actualRootTask = taskDisplayArea.getLaunchRootTask(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, null /* options */, adjacentRootTask /* sourceTask */, 0 /* launchFlags */); assertSame(adjacentRootTask, actualRootTask.getRootTask()); } }