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

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

Picture in picture Z ordering fixes.

We fix two seperate issues here related to animation of the pip menu
activity within the stack. The first is that it may trigger an unexpected
call to assignChildLayers on aboveAppWindowContainers. assignChildLayers
was not overriden as it was assumed DisplayContent was the only caller.
This was causing the default implementation from WindowContainer to be called
and the docked divider to be assigned the wrong layer. We fix
this by adding an override that forwards to the correct implementation.

The second issue is we need to be more careful when placing the animation layer
above the highest animating stack. The pinned stack may be animating due to the
menu activity.

Bug: 69553456
Change-Id: I1a2205925a2f7e4d20a9dbb23b8aedd511d411cc
parent 29f1cdd5
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -1618,7 +1618,15 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree

    @Override
    public SurfaceControl getAnimationLeashParent() {
        // All normal app transitions take place in an animation layer which is below the pinned
        // stack but may be above the parent stacks of the given animating apps.
        // For transitions in the pinned stack (menu activity) we just let them occur as a child
        // of the pinned stack.
        if (!inPinnedWindowingMode()) {
            return getAppAnimationLayer();
        } else {
            return getStack().getSurfaceControl();
        }
    }

    boolean applyAnimationLocked(WindowManager.LayoutParams lp, int transit, boolean enter,
@@ -1758,10 +1766,18 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree

    @Override
    public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {

        // The leash is parented to the animation layer. We need to preserve the z-order by using
        // the prefix order index, but we boost if necessary.
        int layer = getPrefixOrderIndex();
        int layer = 0;
        if (!inPinnedWindowingMode()) {
            layer = getPrefixOrderIndex();
        } else {
            // Pinned stacks have animations take place within themselves rather than an animation
            // layer so we need to preserve the order relative to the stack (e.g. the order of our
            // task/parent).
            layer = getParent().getPrefixOrderIndex();
        }

        if (mNeedsZBoost) {
            layer += Z_BOOST_BASE;
        }
+6 −1
Original line number Diff line number Diff line
@@ -3577,7 +3577,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
                    if (s.inSplitScreenWindowingMode() && mSplitScreenDividerAnchor != null) {
                        t.setLayer(mSplitScreenDividerAnchor, layer++);
                    }
                    if (s.isSelfOrChildAnimating()) {
                    if (s.isAppAnimating() && state != ALWAYS_ON_TOP_STATE) {
                        // Ensure the animation layer ends up above the
                        // highest animating stack and no higher.
                        layerForAnimationLayer = layer++;
@@ -3626,6 +3626,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
            super(name, service);
        }

        @Override
        void assignChildLayers(SurfaceControl.Transaction t) {
            assignChildLayers(t, null /* imeContainer */);
        }

        void assignChildLayers(SurfaceControl.Transaction t, WindowContainer imeContainer) {
            boolean needAssignIme = imeContainer != null
                    && imeContainer.getSurfaceControl() != null;