diff options
| author | 2024-07-25 13:37:43 -0700 | |
|---|---|---|
| committer | 2024-07-25 15:05:41 -0700 | |
| commit | 62c7f1e66eb684be9a1fcb1879cb17403c13c68c (patch) | |
| tree | f06fc7e16b1592c194acc3c19b9a1aa9242a946b | |
| parent | ba088a6344aacc5b0ea44fd6ebf79a6bd839f9ab (diff) | |
Snap to the closest edge when velocity is 0
When user slowly moves the PiP from one edge to the other, there could
be chances that VelocityTrack reports 0 in x-velocity and used to snap
to the right edge, which may not be intuitive to the user if the PiP
window has passed the midpoint.
In this change, we compare the centerX of the PiP window against the
display centerX, and added a boost in velocity towards nearest edge.
Updated also the pip2 counterpart.
Flag: EXEMPT bugfix
Video: http://recall/-/aaaaaabFQoRHlzixHdtY/bnpoNB1sS8Dujtfb5xUKkY
Bug: 323102290
Test: Slowly moves PiP from left to right side, and vice versa
Change-Id: I3b7c4ac14415d75164ba81f8ef471f5cae3f5ed6
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java | 11 | ||||
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java | 11 |
2 files changed, 22 insertions, 0 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java index df3803d54d9d..999ab95ccb1e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java @@ -416,6 +416,17 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, // location now. mSpringingToTouch = false; + // Boost the velocityX if it's zero to forcefully push it towards the nearest edge. + // We don't simply change the xEndValue below since the PhysicsAnimator would rely on the + // same velocityX to find out which edge to snap to. + if (velocityX == 0) { + final int motionCenterX = mPipBoundsState + .getMotionBoundsState().getBoundsInMotion().centerX(); + final int displayCenterX = mPipBoundsState + .getDisplayBounds().centerX(); + velocityX = (motionCenterX < displayCenterX) ? -0.001f : 0.001f; + } + mTemporaryBoundsPhysicsAnimator .spring(FloatProperties.RECT_WIDTH, getBounds().width(), mSpringConfig) .spring(FloatProperties.RECT_HEIGHT, getBounds().height(), mSpringConfig) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java index ea02de9d9704..e1e072a7faad 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java @@ -416,6 +416,17 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, // location now. mSpringingToTouch = false; + // Boost the velocityX if it's zero to forcefully push it towards the nearest edge. + // We don't simply change the xEndValue below since the PhysicsAnimator would rely on the + // same velocityX to find out which edge to snap to. + if (velocityX == 0) { + final int motionCenterX = mPipBoundsState + .getMotionBoundsState().getBoundsInMotion().centerX(); + final int displayCenterX = mPipBoundsState + .getDisplayBounds().centerX(); + velocityX = (motionCenterX < displayCenterX) ? -0.001f : 0.001f; + } + mTemporaryBoundsPhysicsAnimator .spring(FloatProperties.RECT_WIDTH, getBounds().width(), mSpringConfig) .spring(FloatProperties.RECT_HEIGHT, getBounds().height(), mSpringConfig) |