Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 29721a13 authored by Adrian Roos's avatar Adrian Roos
Browse files

Insets Animations: Always dispatch onEnd when cancelled

Previously, we only dispatched onEnd if onStart was already dispatched. However,
some animations might get cancelled after onPrepare but before onStart. In that
case, it is rather tricky for apps to actually cancel the animation.

Now we always dispatch onEnd if onPrepare has been dispatched already.

Fixes: 177983907
Test: atest WindowInsetsAnimationControllerTests
Change-Id: I3fa142110bd5593679f87561c138ed3318034fca
parent 90b85f3e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1265,7 +1265,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
                    }
                    stateChanged |= getSourceConsumer(types.valueAt(j)).notifyAnimationFinished();
                }
                if (invokeCallback && runningAnimation.startDispatched) {
                if (invokeCallback) {
                    dispatchAnimationEnd(runningAnimation.runner.getAnimation());
                }
                break;
+4 −0
Original line number Diff line number Diff line
@@ -110,6 +110,10 @@ public class ViewRootInsetsControllerHost implements InsetsController.Host {
    @Override
    public void dispatchWindowInsetsAnimationEnd(@NonNull WindowInsetsAnimation animation) {
        if (DEBUG) Log.d(TAG, "windowInsetsAnimation ended");
        if (mViewRoot.mView == null) {
            // The view has already detached from window.
            return;
        }
        mViewRoot.mView.dispatchWindowInsetsAnimationEnd(animation);
    }

+7 −0
Original line number Diff line number Diff line
@@ -360,6 +360,13 @@ public final class WindowInsetsAnimation {
         * finished, and then revert to the starting state of the animation in the first
         * {@link #onProgress} callback by using post-layout view properties like {@link View#setX}
         * and related methods.
         *
         * <p>Note that the animation might be cancelled before {@link #onStart} is dispatched. On
         * {@link android.os.Build.VERSION_CODES#S S} and later, {@link #onEnd} is immediately
         * dispatched without an {@link #onStart} in that case.
         * On {@link android.os.Build.VERSION_CODES#R R}, no callbacks are dispatched after
         * {@code #onPrepare} for such an animation.
         *
         * <p>
         * Note: If the animation is application controlled by using
         * {@link WindowInsetsController#controlWindowInsetsAnimation}, the end state of the