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
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index a9708ce..6bebcf4 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -4295,8 +4295,12 @@
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 @@
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