Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 11408826 authored by Robert Carr's avatar Robert Carr
Browse files

Ensure docked divider is below always-on-top stacks.

We need interleave it with the AppWindowToken hierarchy even
though it only has a WindowToken.

Fixes: 70318142
Fixes: 70675228
Fixes: 70178829
Test: Manual. ZOrderingTests.
Change-Id: I7b898f2157de85433416579efae5e01a9dcbf46c
parent d92e7eb2
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_BOOT_PROGRESS;
import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
import static android.view.WindowManager.LayoutParams.TYPE_DRAWN_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
@@ -3567,6 +3568,18 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
                    && imeContainer.getSurfaceControl() != null;
            for (int j = 0; j < mChildren.size(); ++j) {
                final WindowToken wt = mChildren.get(j);

                // The divider is unique in that it does not have an AppWindowToken but needs to be
                // interleaved with them. In particular it must be above any split-screen stacks
                // but below any always-on-top stacks.
                if (wt.windowType == TYPE_DOCK_DIVIDER) {
                    final TaskStack dockedStack = getSplitScreenPrimaryStack();
                    if (dockedStack != null) {
                        wt.assignRelativeLayer(t, dockedStack.getSurfaceControl(),
                                Integer.MAX_VALUE);
                        continue;
                    }
                }
                wt.assignLayer(t, j);
                wt.assignChildLayers(t);

+27 −0
Original line number Diff line number Diff line
@@ -21,10 +21,12 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
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_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL;
@@ -367,4 +369,29 @@ public class ZOrderingTests extends WindowTestsBase {
        assertWindowLayerGreaterThan(mTransaction, anyWindow, mediaOverlayChild);
        assertWindowLayerGreaterThan(mTransaction, mediaOverlayChild, child);
    }

    @Test
    public void testDockedDividerPosition() throws Exception {
        final WindowState pinnedStackWindow = createWindowOnStack(null, WINDOWING_MODE_PINNED,
                ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION, mDisplayContent,
                "pinnedStackWindow");
        final WindowState splitScreenWindow = createWindowOnStack(null,
                WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION,
                mDisplayContent, "splitScreenWindow");
        final WindowState splitScreenSecondaryWindow = createWindowOnStack(null,
                WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD,
                TYPE_BASE_APPLICATION, mDisplayContent, "splitScreenSecondaryWindow");
        final WindowState assistantStackWindow = createWindowOnStack(null, WINDOWING_MODE_FULLSCREEN,
                ACTIVITY_TYPE_ASSISTANT, TYPE_BASE_APPLICATION,
                mDisplayContent, "assistantStackWindow");
        final WindowState dockedDividerWindow = createWindow(null, TYPE_DOCK_DIVIDER,
                mDisplayContent, "dockedDivider");

        mDisplayContent.assignChildLayers(mTransaction);

        assertWindowLayerGreaterThan(mTransaction, dockedDividerWindow, splitScreenWindow);
        assertWindowLayerGreaterThan(mTransaction, dockedDividerWindow, splitScreenSecondaryWindow);
        assertWindowLayerGreaterThan(mTransaction, assistantStackWindow, dockedDividerWindow);
        assertWindowLayerGreaterThan(mTransaction, pinnedStackWindow, dockedDividerWindow);
    }
}