Merge "Change PiP stash to be based on velocity rather than position."

This commit is contained in:
Ben Lin
2020-11-11 02:28:34 +00:00
committed by Android (Google) Code Review
2 changed files with 16 additions and 16 deletions

View File

@@ -368,12 +368,11 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
}
/**
* Stash PiP to the closest edge.
* Stash PiP to the closest edge. We set velocityY to 0 to limit pure horizontal motion.
*/
void stashToEdge(
float velocityX, float velocityY, @Nullable Runnable postBoundsUpdateCallback) {
void stashToEdge(float velocityX, @Nullable Runnable postBoundsUpdateCallback) {
mPipBoundsState.setStashed(velocityX < 0 ? STASH_TYPE_LEFT : STASH_TYPE_RIGHT);
movetoTarget(velocityX, velocityY, postBoundsUpdateCallback, true /* isStash */);
movetoTarget(velocityX, 0 /* velocityY */, postBoundsUpdateCallback, true /* isStash */);
}
private void movetoTarget(

View File

@@ -64,11 +64,7 @@ import java.util.function.Consumer;
public class PipTouchHandler {
private static final String TAG = "PipTouchHandler";
/** Duration of the dismiss scrim fading in/out. */
private static final int DISMISS_TRANSITION_DURATION_MS = 200;
/* The multiplier to apply scale the target size by when applying the magnetic field radius */
private static final float MAGNETIC_FIELD_RADIUS_MULTIPLIER = 1.25f;
private static final float STASH_MINIMUM_VELOCITY_X = 3000.f;
// Allow PIP to resize to a slightly bigger state upon touch
private final boolean mEnableResize;
@@ -710,6 +706,7 @@ public class PipTouchHandler {
private final Point mStartPosition = new Point();
private final PointF mDelta = new PointF();
private boolean mShouldHideMenuAfterFling;
private float mDownSavedFraction = -1f;
@Override
public void onDown(PipTouchState touchState) {
@@ -722,6 +719,7 @@ public class PipTouchHandler {
mStartPosition.set(bounds.left, bounds.top);
mMovementWithinDismiss = touchState.getDownTouchPosition().y >= mMovementBounds.bottom;
mMotionHelper.setSpringingToTouch(false);
mDownSavedFraction = mPipBoundsHandler.getSnapFraction(mPipBoundsState.getBounds());
// If the menu is still visible then just poke the menu
// so that it will timeout after the user stops touching it
@@ -790,13 +788,15 @@ public class PipTouchHandler {
// Reset the touch state on up before the fling settles
mTouchState.reset();
final Rect animatingBounds = getPossiblyAnimatingBounds();
// If User releases the PIP window while it's out of the display bounds, put
// PIP into stashed mode.
if (mEnableStash
&& (animatingBounds.right > mPipBoundsState.getDisplayBounds().right
|| animatingBounds.left < mPipBoundsState.getDisplayBounds().left)) {
mMotionHelper.stashToEdge(vel.x, vel.y, this::stashEndAction /* endAction */);
// If user flings the PIP window above the minimum velocity, stash PIP.
// Only allow stashing to the edge if the user starts dragging the PIP from that
// edge.
if (mEnableStash && !mPipBoundsState.isStashed()
&& ((vel.x > STASH_MINIMUM_VELOCITY_X
&& mDownSavedFraction > 1f && mDownSavedFraction < 2f)
|| (vel.x < -STASH_MINIMUM_VELOCITY_X
&& mDownSavedFraction > 3f && mDownSavedFraction < 4f))) {
mMotionHelper.stashToEdge(vel.x, this::stashEndAction /* endAction */);
} else {
mMotionHelper.flingToSnapTarget(vel.x, vel.y,
this::flingEndAction /* endAction */);
@@ -834,6 +834,7 @@ public class PipTouchHandler {
mTouchState.scheduleDoubleTapTimeoutCallback();
}
}
mDownSavedFraction = -1f;
return true;
}