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

Commit 313d7e00 authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Fix window movement animations.

Surface insets/parent calculation wasn't used when calculating
the positions for movement animations.

Test: go/wm-smoke
Test: Go to Wifi setting, click on a WIFI with pw, open/close IME
to observe window movement animation.
Bug: 64674361

Change-Id: Iffd98d8f946c2fc2dcb5adb176bb890d8a3fc374
parent 349f7886
Loading
Loading
Loading
Loading
+15 −11
Original line number Diff line number Diff line
@@ -4295,8 +4295,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP

    private void startMoveAnimation(Transaction t, int left, int top) {
        if (DEBUG_ANIM) Slog.v(TAG, "Setting move animation on " + this);
        final Point oldPosition = new Point();
        final Point newPosition = new Point();
        transformFrameToSurfacePosition(mLastFrame.left, mLastFrame.top, oldPosition);
        transformFrameToSurfacePosition(left, top, newPosition);
        final AnimationAdapter adapter = new LocalAnimationAdapter(
                new MoveAnimationSpec(mLastFrame.left, mLastFrame.top, left, top),
                new MoveAnimationSpec(oldPosition.x, oldPosition.y, newPosition.x, newPosition.y),
                mService.mSurfaceAnimationRunner);
        startAnimation(t, adapter);
    }
@@ -4435,23 +4439,23 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
            return;
        }

        int left = mFrame.left;
        int top = mFrame.top;
        transformFrameToSurfacePosition(mFrame.left, mFrame.top, mSurfacePosition);
        if (!mSurfaceAnimator.hasLeash()) {
            t.setPosition(mSurfaceControl, mSurfacePosition.x, mSurfacePosition.y);
        }
    }

    private void transformFrameToSurfacePosition(int left, int top, Point outPoint) {
        outPoint.set(left, top);
        if (isChildWindow()) {
            // TODO: This probably falls apart at some point and we should
            // actually compute relative coordinates.
            final WindowState parent = getParentWindow();
            left -= parent.mFrame.left;
            top -= parent.mFrame.top;
            outPoint.offset(-parent.mFrame.left, -parent.mFrame.top);
        }

        // Expand for surface insets. See WindowState.expandForSurfaceInsets.
        left -= mAttrs.surfaceInsets.left;
        top -= mAttrs.surfaceInsets.top;
        mSurfacePosition.set(left, top);
        if (!mSurfaceAnimator.hasLeash()) {
            t.setPosition(mSurfaceControl, mSurfacePosition.x, mSurfacePosition.y);
        }
        outPoint.offset(-mAttrs.surfaceInsets.left, -mAttrs.surfaceInsets.top);
    }

    @Override