summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hongwei Wang <hwwang@google.com> 2024-07-25 13:37:43 -0700
committer Hongwei Wang <hwwang@google.com> 2024-07-25 15:05:41 -0700
commit62c7f1e66eb684be9a1fcb1879cb17403c13c68c (patch)
treef06fc7e16b1592c194acc3c19b9a1aa9242a946b
parentba088a6344aacc5b0ea44fd6ebf79a6bd839f9ab (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.java11
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java11
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)