From 141bac2a08f7cf4ead23d5915043bb3bc7914789 Mon Sep 17 00:00:00 2001 From: Tony Huang Date: Thu, 18 Nov 2021 11:55:34 +0800 Subject: [PATCH] Fix pip surface under divider Make sure always on top tasks layer is above split divider layer. Fix: 194359996 Test: manual Test: pass exising tests Test: atest ZOrderingTests Change-Id: I211a3e1a92f86b0c802d2a9a259026ee2fad0383 --- .../view/WindowManagerPolicyConstants.java | 3 ++ .../android/server/wm/TaskDisplayArea.java | 4 +++ .../com/android/server/wm/ZOrderingTests.java | 35 +++++++++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/WindowManagerPolicyConstants.java b/core/java/android/view/WindowManagerPolicyConstants.java index e634d601c1f13..94f633314b4ef 100644 --- a/core/java/android/view/WindowManagerPolicyConstants.java +++ b/core/java/android/view/WindowManagerPolicyConstants.java @@ -236,6 +236,9 @@ public interface WindowManagerPolicyConstants { */ int LAYER_OFFSET_THUMBNAIL = WINDOW_LAYER_MULTIPLIER - 1; + // TODO(b/207185041): Remove this divider workaround after we full remove leagacy split and + // make app pair split only have single root then we can just attach the + // divider to the single root task in shell. int SPLIT_DIVIDER_LAYER = TYPE_LAYER_MULTIPLIER * 3; int WATERMARK_LAYER = TYPE_LAYER_MULTIPLIER * 100; int STRICT_MODE_LAYER = TYPE_LAYER_MULTIPLIER * 101; diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 1e367dc78198f..ec3554a4f0f68 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -867,6 +867,10 @@ final class TaskDisplayArea extends DisplayArea { // Place root home tasks to the bottom. layer = adjustRootTaskLayer(t, mTmpHomeChildren, layer); layer = adjustRootTaskLayer(t, mTmpNormalChildren, layer); + // TODO(b/207185041): Remove this divider workaround after we full remove leagacy split and + // make app pair split only have single root then we can just attach the + // divider to the single root task in shell. + layer = Math.max(layer, SPLIT_DIVIDER_LAYER + 1); adjustRootTaskLayer(t, mTmpAlwaysOnTopChildren, layer); t.setLayer(mSplitScreenDividerAnchor, SPLIT_DIVIDER_LAYER); } 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 b3ba217955ea4..2d3e5c002c2dc 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java @@ -501,8 +501,6 @@ public class ZOrderingTests extends WindowTestsBase { mDisplayContent.assignChildLayers(mTransaction); assertWindowHigher(splitWindow1, belowTaskWindow); - assertWindowHigher(splitWindow1, belowTaskWindow); - assertWindowHigher(splitWindow2, belowTaskWindow); assertWindowHigher(splitWindow2, belowTaskWindow); assertWindowHigher(mDockedDividerWindow, splitWindow1); assertWindowHigher(mDockedDividerWindow, splitWindow2); @@ -510,6 +508,39 @@ public class ZOrderingTests extends WindowTestsBase { assertWindowHigher(pinnedWindow, aboveTaskWindow); } + + @Test + public void testDockedDividerPosition_noAboveTask() { + 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); + + mDisplayContent.assignChildLayers(mTransaction); + + assertWindowHigher(splitWindow1, belowTaskWindow); + assertWindowHigher(splitWindow2, belowTaskWindow); + assertWindowHigher(mDockedDividerWindow, splitWindow1); + assertWindowHigher(mDockedDividerWindow, splitWindow2); + assertWindowHigher(pinnedWindow, mDockedDividerWindow); + } + @Test public void testAttachNavBarWhenEnteringRecents_expectNavBarHigherThanIme() { // create RecentsAnimationController