Loading core/java/android/window/BackEvent.java +3 −0 Original line number Original line Diff line number Diff line Loading @@ -74,6 +74,9 @@ public final class BackEvent { * and animation should seek to its end state. Exact end value may vary depending on * and animation should seek to its end state. Exact end value may vary depending on * screen size. * screen size. * </ol> * </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 * 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. * edge and smooth clamped to 1 when the distance exceeds a system-wide threshold. */ */ Loading core/java/android/window/BackProgressAnimator.java +23 −0 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -126,6 +128,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; Loading core/java/android/window/WindowOnBackInvokedDispatcher.java +6 −5 Original line number Original line Diff line number Diff line Loading @@ -266,12 +266,13 @@ 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(); } } }); }); }); } } @Override @Override Loading libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossActivityAnimation.java +4 −5 Original line number Original line Diff line number Diff line Loading @@ -171,6 +171,7 @@ class CrossActivityAnimation { mInitialTouchPos.set(0, 0); mInitialTouchPos.set(0, 0); mEnteringWindowShow = false; mEnteringWindowShow = false; mEnteringMargin = 0; mEnteringMargin = 0; mEnteringAnimator = null; if (mFinishCallback != null) { if (mFinishCallback != null) { try { try { Loading Loading @@ -276,7 +277,7 @@ class CrossActivityAnimation { } } // End the fade in animation. // End the fade in animation. if (mEnteringAnimator.isRunning()) { if (mEnteringAnimator != null && mEnteringAnimator.isRunning()) { mEnteringAnimator.cancel(); mEnteringAnimator.cancel(); } } Loading Loading @@ -329,12 +330,10 @@ class CrossActivityAnimation { @Override @Override public void onBackCancelled() { public void onBackCancelled() { // End the fade in animation. // End the fade in animation. if (mEnteringAnimator.isRunning()) { if (mEnteringAnimator != null && mEnteringAnimator.isRunning()) { mEnteringAnimator.cancel(); mEnteringAnimator.cancel(); } } // TODO (b259608500): Let BackProgressAnimator could play cancel animation. mProgressAnimator.onBackCancelled(CrossActivityAnimation.this::finishAnimation); mProgressAnimator.reset(); finishAnimation(); } } @Override @Override Loading libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java +1 −2 Original line number Original line Diff line number Diff line Loading @@ -329,8 +329,7 @@ class CrossTaskBackAnimation { @Override @Override public void onBackCancelled() { public void onBackCancelled() { mProgressAnimator.reset(); mProgressAnimator.onBackCancelled(CrossTaskBackAnimation.this::finishAnimation); finishAnimation(); } } @Override @Override Loading Loading
core/java/android/window/BackEvent.java +3 −0 Original line number Original line Diff line number Diff line Loading @@ -74,6 +74,9 @@ public final class BackEvent { * and animation should seek to its end state. Exact end value may vary depending on * and animation should seek to its end state. Exact end value may vary depending on * screen size. * screen size. * </ol> * </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 * 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. * edge and smooth clamped to 1 when the distance exceeds a system-wide threshold. */ */ Loading
core/java/android/window/BackProgressAnimator.java +23 −0 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -126,6 +128,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; Loading
core/java/android/window/WindowOnBackInvokedDispatcher.java +6 −5 Original line number Original line Diff line number Diff line Loading @@ -266,12 +266,13 @@ 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(); } } }); }); }); } } @Override @Override Loading
libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossActivityAnimation.java +4 −5 Original line number Original line Diff line number Diff line Loading @@ -171,6 +171,7 @@ class CrossActivityAnimation { mInitialTouchPos.set(0, 0); mInitialTouchPos.set(0, 0); mEnteringWindowShow = false; mEnteringWindowShow = false; mEnteringMargin = 0; mEnteringMargin = 0; mEnteringAnimator = null; if (mFinishCallback != null) { if (mFinishCallback != null) { try { try { Loading Loading @@ -276,7 +277,7 @@ class CrossActivityAnimation { } } // End the fade in animation. // End the fade in animation. if (mEnteringAnimator.isRunning()) { if (mEnteringAnimator != null && mEnteringAnimator.isRunning()) { mEnteringAnimator.cancel(); mEnteringAnimator.cancel(); } } Loading Loading @@ -329,12 +330,10 @@ class CrossActivityAnimation { @Override @Override public void onBackCancelled() { public void onBackCancelled() { // End the fade in animation. // End the fade in animation. if (mEnteringAnimator.isRunning()) { if (mEnteringAnimator != null && mEnteringAnimator.isRunning()) { mEnteringAnimator.cancel(); mEnteringAnimator.cancel(); } } // TODO (b259608500): Let BackProgressAnimator could play cancel animation. mProgressAnimator.onBackCancelled(CrossActivityAnimation.this::finishAnimation); mProgressAnimator.reset(); finishAnimation(); } } @Override @Override Loading
libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java +1 −2 Original line number Original line Diff line number Diff line Loading @@ -329,8 +329,7 @@ class CrossTaskBackAnimation { @Override @Override public void onBackCancelled() { public void onBackCancelled() { mProgressAnimator.reset(); mProgressAnimator.onBackCancelled(CrossTaskBackAnimation.this::finishAnimation); finishAnimation(); } } @Override @Override Loading