From 77239f8b35130c0b9505b75643f2edd135bc86c4 Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Fri, 10 Jan 2025 16:12:25 +0800 Subject: Don't use the user's fraction to decide the visibility of a leash The caller might pass any fraction to WindowInsetsAnimationController#setInsetsAndAlpha. The fraction should not control visibility of the leash. This CL flags mCancelling when an insets animation is being cancelled instead of setting mPendingFraction to 1f, and stops using mPendingFraction to decide the leash visibility if the animation is ANIMATION_TYPE_USER. Bug: 376232646 Flag: EXEMPT bugfix Test: Manual, i.e. verified that IME does not jump hide anymore when swiping down and up again on all-apps. Change-Id: I297758f665460bd6db8ff1da8267e9b9a862b328 --- .../java/android/view/InsetsAnimationControlImpl.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java index 4fead2ad5246..6decd6d3a603 100644 --- a/core/java/android/view/InsetsAnimationControlImpl.java +++ b/core/java/android/view/InsetsAnimationControlImpl.java @@ -112,6 +112,7 @@ public class InsetsAnimationControlImpl implements InternalInsetsAnimationContro private Insets mPendingInsets; private float mPendingFraction; private boolean mFinished; + private boolean mCancelling; private boolean mCancelled; private boolean mShownOnFinish; private float mCurrentAlpha = 1.0f; @@ -371,7 +372,7 @@ public class InsetsAnimationControlImpl implements InternalInsetsAnimationContro mPendingInsets = mLayoutInsetsDuringAnimation == LAYOUT_INSETS_DURING_ANIMATION_SHOWN ? mShownInsets : mHiddenInsets; mPendingAlpha = 1f; - mPendingFraction = 1f; + mCancelling = true; applyChangeInsets(null); mCancelled = true; mListener.onCancelled(mReadyDispatched ? this : null); @@ -488,15 +489,15 @@ public class InsetsAnimationControlImpl implements InternalInsetsAnimationContro return; } - final boolean visible = mPendingFraction == 0 - // The first frame of ANIMATION_TYPE_SHOW should be invisible since it is - // animated from the hidden state. - ? mAnimationType != ANIMATION_TYPE_SHOW - : mPendingFraction < 1f || (mFinished - ? mShownOnFinish - // If the animation is cancelled, mFinished and mShownOnFinish are not set. + final boolean visible = mFinished + ? mShownOnFinish + : (mCancelling + // If the animation is being cancelled, mShownOnFinish is not valid. // Here uses mLayoutInsetsDuringAnimation to decide if it should be visible. - : mLayoutInsetsDuringAnimation == LAYOUT_INSETS_DURING_ANIMATION_SHOWN); + ? mLayoutInsetsDuringAnimation == LAYOUT_INSETS_DURING_ANIMATION_SHOWN + // The first frame of ANIMATION_TYPE_SHOW should be invisible since it is + // animated from the hidden state. + : (mAnimationType != ANIMATION_TYPE_SHOW || mPendingFraction != 0)); // TODO: Implement behavior when inset spans over multiple types for (int i = controls.size() - 1; i >= 0; i--) { -- cgit v1.2.3-59-g8ed1b