From 5e28cb5f1fd58d92fdbfe0bf46157bbabc811b0a Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Tue, 26 Oct 2021 16:18:09 +0800 Subject: [PATCH] Fix divider bar shown on top of tasks above split pair Since we allow launching fullscreen task on the top of split screen pair now. There's a case when the task above split pair is translucent, which should occlude divider bar while split pair is visible. Updates layering rule in TaskDisplayArea to make sure tasks above split pair also having higher layer than divider bar. Fix: 201571272 Bug: 202740040 Test: atest ZorderingTests Test: trigger split screen and launch quicksearch, observed divider bar will be occluded by quicksearch task. Change-Id: Iaab59851a65f12556c1b1e894914ae197b8d8401 --- .../android/server/wm/TaskDisplayArea.java | 31 ++++++++---- .../com/android/server/wm/ZOrderingTests.java | 49 +++++++++++++------ 2 files changed, 54 insertions(+), 26 deletions(-) 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