summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt25
3 files changed, 24 insertions, 21 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
index b1e4d6758545..39da55c8dd54 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
@@ -328,15 +328,6 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
}
/**
- * Animates the PiP to the closest snap target.
- */
- void animateToClosestSnapTarget() {
- final Rect newBounds = new Rect();
- mSnapAlgorithm.snapRectToClosestEdge(mBounds, mMovementBounds, newBounds);
- animateToBounds(newBounds, mSpringConfig);
- }
-
- /**
* Animates PIP to the provided bounds, using physics animations and the given spring
* configuration
*/
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index f5c83c1fffd7..3bdedc14ad2a 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -885,7 +885,6 @@ public class PipTouchHandler {
final PointF vel = touchState.getVelocity();
final float velocity = PointF.length(vel.x, vel.y);
- final boolean isFling = velocity > mFlingAnimationUtils.getMinVelocityPxPerSecond();
if (touchState.isDragging()) {
Runnable endAction = null;
@@ -900,13 +899,9 @@ public class PipTouchHandler {
endAction = mMenuController::hideMenu;
}
- if (isFling) {
- mMotionHelper.flingToSnapTarget(vel.x, vel.y,
- PipTouchHandler.this::updateDismissFraction /* updateAction */,
- endAction /* endAction */);
- } else {
- mMotionHelper.animateToClosestSnapTarget();
- }
+ mMotionHelper.flingToSnapTarget(vel.x, vel.y,
+ PipTouchHandler.this::updateDismissFraction /* updateAction */,
+ endAction /* endAction */);
} else if (mTouchState.isDoubleTap()) {
// Expand to fullscreen if this is a double tap
// the PiP should be frozen until the transition ends
diff --git a/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt b/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt
index db08d64acc10..5df5f405b169 100644
--- a/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/animation/PhysicsAnimator.kt
@@ -311,10 +311,25 @@ class PhysicsAnimator<T> private constructor (val target: T) {
val springConfigCopy = springConfig.copy()
val toAtLeast = if (startVelocity < 0) flingConfig.min else flingConfig.max
- // If the fling needs to reach min/max, calculate the velocity required to do so and use
- // that if the provided start velocity is not sufficient.
- if (flingMustReachMinOrMax &&
- toAtLeast != -Float.MAX_VALUE && toAtLeast != Float.MAX_VALUE) {
+ if (flingMustReachMinOrMax && isValidValue(toAtLeast)) {
+ val currentValue = property.getValue(target)
+ val flingTravelDistance =
+ startVelocity / (flingConfig.friction * FLING_FRICTION_SCALAR_MULTIPLIER)
+ val projectedFlingEndValue = currentValue + flingTravelDistance
+ val midpoint = (flingConfig.min + flingConfig.max) / 2
+
+ // If fling velocity is too low to push the target past the midpoint between min and
+ // max, then spring back towards the nearest edge, starting with the current velocity.
+ if ((startVelocity < 0 && projectedFlingEndValue > midpoint) ||
+ (startVelocity > 0 && projectedFlingEndValue < midpoint)) {
+ val toPosition =
+ if (projectedFlingEndValue < midpoint) flingConfig.min else flingConfig.max
+ if (isValidValue(toPosition)) {
+ return spring(property, toPosition, startVelocity, springConfig)
+ }
+ }
+
+ // Projected fling end value is past the midpoint, so fling forward.
val distanceToDestination = toAtLeast - property.getValue(target)
// The minimum velocity required for the fling to end up at the given destination,
@@ -345,6 +360,8 @@ class PhysicsAnimator<T> private constructor (val target: T) {
return this
}
+ private fun isValidValue(value: Float) = value < Float.MAX_VALUE && value > -Float.MAX_VALUE
+
/**
* Adds a listener that will be called whenever any property on the animated object is updated.
* This will be called on every animation frame, with the current value of the animated object