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

Commit 71a9f211 authored by Josh Tsuji's avatar Josh Tsuji Committed by Automerger Merge Worker
Browse files

Merge "Fix PIP snapping to incorrect location." into rvc-dev am: 6ad0b48b am: 738167d4

Change-Id: Ie8d55831069a056d589f9d4a9c82425be2b9f1e2
parents 7e51acd5 738167d4
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -352,15 +352,6 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
        startBoundsAnimator(xEndValue /* toX */, estimatedFlingYEndValue /* toY */);
    }

    /**
     * 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
+3 −8
Original line number Diff line number Diff line
@@ -884,7 +884,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;
@@ -899,13 +898,9 @@ public class PipTouchHandler {
                    endAction = mMenuController::hideMenu;
                }

                if (isFling) {
                mMotionHelper.flingToSnapTarget(vel.x, vel.y,
                        PipTouchHandler.this::updateDismissFraction /* updateAction */,
                        endAction /* endAction */);
                } else {
                    mMotionHelper.animateToClosestSnapTarget();
                }
            } else if (mTouchState.isDoubleTap()) {
                // Expand to fullscreen if this is a double tap
                // the PiP should be frozen until the transition ends
+21 −4
Original line number Diff line number Diff line
@@ -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