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

Commit d08f8ac4 authored by Jon Miranda's avatar Jon Miranda
Browse files

Ensures that the swipe up to home animation is ended prior to view recycling.

Bug: 154163960
Change-Id: I70b2c6290a2a17be8b80ba0209528173d6627332
parent 674e38fd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -472,6 +472,7 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
            FloatingIconView fiv = (FloatingIconView) floatingView;
            anim.addAnimatorListener(fiv);
            fiv.setOnTargetChangeListener(anim::onTargetPositionChanged);
            fiv.setFastFinishRunnable(anim::end);
        }

        AnimatorPlaybackController homeAnim = homeAnimationFactory.createActivityAnimationToHome();
+15 −1
Original line number Diff line number Diff line
@@ -207,9 +207,23 @@ public class RectFSpringAnim {
                mRectScaleAnim.skipToEnd();
            }
        }
        mRectXAnimEnded = true;
        mRectYAnimEnded = true;
        mRectScaleAnimEnded = true;
        maybeOnEnd();
    }

    private boolean isEnded() {
        return mRectXAnimEnded && mRectYAnimEnded && mRectScaleAnimEnded;
    }

    private void onUpdate() {
        if (isEnded()) {
            // Prevent further updates from being called. This can happen between callbacks for
            // ending the x/y/scale animations.
            return;
        }

        if (!mOnUpdateListeners.isEmpty()) {
            float currentWidth = Utilities.mapRange(mCurrentScaleProgress, mStartRect.width(),
                    mTargetRect.width());
@@ -229,7 +243,7 @@ public class RectFSpringAnim {
    }

    private void maybeOnEnd() {
        if (mAnimsStarted && mRectXAnimEnded && mRectYAnimEnded && mRectScaleAnimEnded) {
        if (mAnimsStarted && isEnded()) {
            mAnimsStarted = false;
            for (Animator.AnimatorListener animatorListener : mAnimatorListeners) {
                animatorListener.onAnimationEnd(null);
+14 −1
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ import static com.android.launcher3.LauncherAnimUtils.DRAWABLE_ALPHA;
import static com.android.launcher3.Utilities.getBadge;
import static com.android.launcher3.Utilities.getFullDrawable;
import static com.android.launcher3.config.FeatureFlags.ADAPTIVE_ICON_WINDOW_ANIM;
import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;

import android.animation.Animator;
@@ -100,6 +99,7 @@ public class FloatingIconView extends FrameLayout implements

    private AnimatorSet mFadeAnimatorSet;
    private ListenerView mListenerView;
    private Runnable mFastFinishRunnable;

    public FloatingIconView(Context context) {
        this(context, null);
@@ -443,9 +443,21 @@ public class FloatingIconView extends FrameLayout implements
        }
    }

    /**
     * Sets a runnable that is called after a call to {@link #fastFinish()}.
     */
    public void setFastFinishRunnable(Runnable runnable) {
        mFastFinishRunnable = runnable;
    }

    public void fastFinish() {
        if (mFastFinishRunnable != null) {
            mFastFinishRunnable.run();
            mFastFinishRunnable = null;
        }
        if (mLoadIconSignal != null) {
            mLoadIconSignal.cancel();
            mLoadIconSignal = null;
        }
        if (mEndRunnable != null) {
            mEndRunnable.run();
@@ -655,6 +667,7 @@ public class FloatingIconView extends FrameLayout implements
        sTmpObjArray[0] = null;
        mIconLoadResult = null;
        mClipIconView.recycle();
        mFastFinishRunnable = null;
    }

    private static class IconLoadResult {