Fix some issues with haptic

- Don't have double haptic on quick scrub
- Correctly check interpolated progress to determine final state,
  so that it always aligns with the haptic (i.e. passing the haptic
  means letting go will go to the new state)

Bug: 109709720
Change-Id: I702bb76a4c15f932f923e81a14cc49f6a9126cb8
This commit is contained in:
Tony Wickham
2018-06-11 16:05:31 -07:00
parent 367a53ec13
commit 29aef52be3
4 changed files with 14 additions and 6 deletions

View File

@@ -241,16 +241,16 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity>
if (blockedFling) {
fling = false;
}
float progress = mCurrentAnimation.getProgressFraction();
float interpolatedProgress = mCurrentAnimation.getInterpolator().getInterpolation(progress);
if (fling) {
logAction = Touch.FLING;
boolean goingUp = velocity < 0;
goingToEnd = goingUp == mCurrentAnimationIsGoingUp;
} else {
logAction = Touch.SWIPE;
goingToEnd = mCurrentAnimation.getProgressFraction() > SUCCESS_TRANSITION_PROGRESS;
goingToEnd = interpolatedProgress > SUCCESS_TRANSITION_PROGRESS;
}
float progress = mCurrentAnimation.getProgressFraction();
long animationDuration = SwipeDetector.calculateDuration(
velocity, goingToEnd ? (1 - progress) : progress);
if (blockedFling && !goingToEnd) {

View File

@@ -575,7 +575,7 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> {
final boolean passed = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW;
if (passed != mPassedOverviewThreshold) {
mPassedOverviewThreshold = passed;
if (mRecentsView != null) {
if (mInteractionType == INTERACTION_NORMAL && mRecentsView != null) {
mRecentsView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
}

View File

@@ -15,6 +15,8 @@
*/
package com.android.launcher3.anim;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorListenerAdapter;
@@ -72,7 +74,7 @@ public abstract class AnimatorPlaybackController implements ValueAnimator.Animat
mOnCancelRunnable = onCancelRunnable;
mAnimationPlayer = ValueAnimator.ofFloat(0, 1);
mAnimationPlayer.setInterpolator(Interpolators.LINEAR);
mAnimationPlayer.setInterpolator(LINEAR);
mAnimationPlayer.addListener(new OnAnimationEndDispatcher());
mAnimationPlayer.addUpdateListener(this);
@@ -107,6 +109,10 @@ public abstract class AnimatorPlaybackController implements ValueAnimator.Animat
return mDuration;
}
public TimeInterpolator getInterpolator() {
return mAnim.getInterpolator() != null ? mAnim.getInterpolator() : LINEAR;
}
/**
* Starts playing the animation forward from current position.
*/

View File

@@ -354,6 +354,8 @@ public abstract class AbstractStateChangeTouchController
final LauncherState targetState;
final float progress = mCurrentAnimation.getProgressFraction();
final float interpolatedProgress = mCurrentAnimation.getInterpolator()
.getInterpolation(progress);
if (fling) {
targetState =
Float.compare(Math.signum(velocity), Math.signum(mProgressMultiplier)) == 0
@@ -362,7 +364,7 @@ public abstract class AbstractStateChangeTouchController
} else {
float successProgress = mToState == ALL_APPS
? MIN_PROGRESS_TO_ALL_APPS : SUCCESS_TRANSITION_PROGRESS;
targetState = (progress > successProgress) ? mToState : mFromState;
targetState = (interpolatedProgress > successProgress) ? mToState : mFromState;
}
final float endProgress;