Merge "DO NOT MERGE Let BackProgressAnimator could play cancel animation" into tm-qpr-dev

This commit is contained in:
Arthur Hung
2023-02-02 11:49:13 +00:00
committed by Android (Google) Code Review
3 changed files with 44 additions and 6 deletions

View File

@@ -99,7 +99,21 @@ public class BackEvent implements Parcelable {
} }
/** /**
* Returns a value between 0 and 1 on how far along the back gesture is. * Returns a value between 0 and 1 on how far along the back gesture is. This value is
* driven by the horizontal location of the touch point, and should be used as the fraction to
* seek the predictive back animation with. Specifically,
* <ol>
* <li>The progress is 0 when the touch is at the starting edge of the screen (left or right),
* and animation should seek to its start state.
* <li>The progress is approximately 1 when the touch is at the opposite side of the screen,
* and animation should seek to its end state. Exact end value may vary depending on
* screen size.
* </ol>
* <li> After the gesture finishes in cancel state, this method keeps getting invoked until the
* progress value animates back to 0.
* </ol>
* In-between locations are linearly interpolated based on horizontal distance from the starting
* edge and smooth clamped to 1 when the distance exceeds a system-wide threshold.
*/ */
public float getProgress() { public float getProgress() {
return mProgress; return mProgress;

View File

@@ -16,8 +16,10 @@
package android.window; package android.window;
import android.annotation.NonNull;
import android.util.FloatProperty; import android.util.FloatProperty;
import com.android.internal.dynamicanimation.animation.DynamicAnimation;
import com.android.internal.dynamicanimation.animation.SpringAnimation; import com.android.internal.dynamicanimation.animation.SpringAnimation;
import com.android.internal.dynamicanimation.animation.SpringForce; import com.android.internal.dynamicanimation.animation.SpringForce;
@@ -123,6 +125,27 @@ public class BackProgressAnimator {
mProgress = 0; mProgress = 0;
} }
/**
* Animate the back progress animation from current progress to start position.
* This should be called when back is cancelled.
*
* @param finishCallback the callback to be invoked when the progress is reach to 0.
*/
public void onBackCancelled(@NonNull Runnable finishCallback) {
final DynamicAnimation.OnAnimationEndListener listener =
new DynamicAnimation.OnAnimationEndListener() {
@Override
public void onAnimationEnd(DynamicAnimation animation, boolean canceled, float value,
float velocity) {
mSpring.removeEndListener(this);
finishCallback.run();
reset();
}
};
mSpring.addEndListener(listener);
mSpring.animateToFinalPosition(0);
}
private void updateProgressValue(float progress) { private void updateProgressValue(float progress) {
if (mLastBackEvent == null || mCallback == null || !mStarted) { if (mLastBackEvent == null || mCallback == null || !mStarted) {
return; return;

View File

@@ -255,11 +255,12 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
@Override @Override
public void onBackCancelled() { public void onBackCancelled() {
Handler.getMain().post(() -> { Handler.getMain().post(() -> {
mProgressAnimator.reset(); mProgressAnimator.onBackCancelled(() -> {
final OnBackAnimationCallback callback = getBackAnimationCallback(); final OnBackAnimationCallback callback = getBackAnimationCallback();
if (callback != null) { if (callback != null) {
callback.onBackCancelled(); callback.onBackCancelled();
} }
});
}); });
} }