diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 7e784ae6e2ea2..901f14f346055 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -798,12 +798,9 @@ final class TaskDisplayArea extends DisplayArea { int layer = 0; // Place root home tasks to the bottom. layer = adjustRootTaskLayer(t, mTmpHomeChildren, layer); - adjustRootTaskLayer(t, mTmpNormalChildren, layer); - - // Always on top tasks layer should higher than split divider layer so set it as start. - t.setLayer(mSplitScreenDividerAnchor, SPLIT_DIVIDER_LAYER); - layer = SPLIT_DIVIDER_LAYER + 1; + layer = adjustRootTaskLayer(t, mTmpNormalChildren, layer); adjustRootTaskLayer(t, mTmpAlwaysOnTopChildren, layer); + t.setLayer(mSplitScreenDividerAnchor, SPLIT_DIVIDER_LAYER); } /** @@ -818,19 +815,33 @@ final class TaskDisplayArea extends DisplayArea { ArrayList children, int startLayer) { mTmpNeedsZBoostIndexes.clear(); final int childCount = children.size(); + boolean hasAdjacentTask = false; for (int i = 0; i < childCount; i++) { final WindowContainer child = children.get(i); final TaskDisplayArea childTda = child.asTaskDisplayArea(); - - boolean childNeedsZBoost = childTda != null + final boolean childNeedsZBoost = childTda != null ? childTda.childrenNeedZBoost() : child.needsZBoost(); - if (!childNeedsZBoost) { - child.assignLayer(t, startLayer++); - } else { + if (childNeedsZBoost) { mTmpNeedsZBoostIndexes.add(i); + continue; } + + final Task childTask = child.asTask(); + final boolean inAdjacentTask = childTask != null + && child.inMultiWindowMode() + && childTask.getRootTask().getAdjacentTaskFragment() != null; + + if (inAdjacentTask || child.inSplitScreenWindowingMode()) { + hasAdjacentTask = true; + } else if (hasAdjacentTask && startLayer < SPLIT_DIVIDER_LAYER) { + // Task on top of adjacent tasks should be higher than split divider layer so + // set it as start. + startLayer = SPLIT_DIVIDER_LAYER + 1; + } + + child.assignLayer(t, startLayer++); } final int zBoostSize = mTmpNeedsZBoostIndexes.size(); diff --git a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java index 6c3a1f6790205..dfbdedee37c46 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java @@ -23,7 +23,6 @@ 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.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; @@ -469,24 +468,42 @@ public class ZOrderingTests extends WindowTestsBase { @Test public void testDockedDividerPosition() { - final WindowState pinnedStackWindow = createWindow(null, WINDOWING_MODE_PINNED, - ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION, mDisplayContent, - "pinnedStackWindow"); - final WindowState splitScreenWindow = createWindow(null, - WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION, - mDisplayContent, "splitScreenWindow"); - final WindowState splitScreenSecondaryWindow = createWindow(null, - WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, - TYPE_BASE_APPLICATION, mDisplayContent, "splitScreenSecondaryWindow"); - final WindowState assistantStackWindow = createWindow(null, - WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, TYPE_BASE_APPLICATION, - mDisplayContent, "assistantStackWindow"); + final Task pinnedTask = + createTask(mDisplayContent, WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD); + final WindowState pinnedWindow = + createAppWindow(pinnedTask, ACTIVITY_TYPE_STANDARD, "pinnedWindow"); + + final Task belowTask = + createTask(mDisplayContent, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); + final WindowState belowTaskWindow = + createAppWindow(belowTask, ACTIVITY_TYPE_STANDARD, "belowTaskWindow"); + + final Task splitScreenTask1 = + createTask(mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD); + final WindowState splitWindow1 = + createAppWindow(splitScreenTask1, ACTIVITY_TYPE_STANDARD, "splitWindow1"); + final Task splitScreenTask2 = + createTask(mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD); + final WindowState splitWindow2 = + createAppWindow(splitScreenTask2, ACTIVITY_TYPE_STANDARD, "splitWindow2"); + splitScreenTask1.setAdjacentTaskFragment(splitScreenTask2); + splitScreenTask2.setAdjacentTaskFragment(splitScreenTask1); + + final Task aboveTask = + createTask(mDisplayContent, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); + final WindowState aboveTaskWindow = + createAppWindow(aboveTask, ACTIVITY_TYPE_STANDARD, "aboveTaskWindow"); mDisplayContent.assignChildLayers(mTransaction); - assertWindowHigher(mDockedDividerWindow, splitScreenWindow); - assertWindowHigher(mDockedDividerWindow, splitScreenSecondaryWindow); - assertWindowHigher(pinnedStackWindow, mDockedDividerWindow); + assertWindowHigher(splitWindow1, belowTaskWindow); + assertWindowHigher(splitWindow1, belowTaskWindow); + assertWindowHigher(splitWindow2, belowTaskWindow); + assertWindowHigher(splitWindow2, belowTaskWindow); + assertWindowHigher(mDockedDividerWindow, splitWindow1); + assertWindowHigher(mDockedDividerWindow, splitWindow2); + assertWindowHigher(aboveTaskWindow, mDockedDividerWindow); + assertWindowHigher(pinnedWindow, aboveTaskWindow); } @Test