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

Commit 630d25c6 authored by Tony Huang's avatar Tony Huang
Browse files

Fix screenshot surface null during animation

The screenshot surface might be set as null during animation if
previous animation still running and end during current animation
finished.

Fix this by only keep one animatior and cancel previous one before
new one start.

Fix: 263550337
Test: manual
Test: pass existing test
Change-Id: I95eb1b03790d84bdab7e58c25a7b0a1d074adfb8
parent 103ab393
Loading
Loading
Loading
Loading
+25 −9
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ public class SplitDecorManager extends WindowlessWindowManager {
    private final Rect mResizingBounds = new Rect();
    private final Rect mTempRect = new Rect();
    private ValueAnimator mFadeAnimator;
    private ValueAnimator mScreenshotAnimator;

    private int mIconSize;
    private int mOffsetX;
@@ -135,9 +136,18 @@ public class SplitDecorManager extends WindowlessWindowManager {

    /** Releases the surfaces for split decor. */
    public void release(SurfaceControl.Transaction t) {
        if (mFadeAnimator != null && mFadeAnimator.isRunning()) {
        if (mFadeAnimator != null) {
            if (mFadeAnimator.isRunning()) {
                mFadeAnimator.cancel();
            }
            mFadeAnimator = null;
        }
        if (mScreenshotAnimator != null) {
            if (mScreenshotAnimator.isRunning()) {
                mScreenshotAnimator.cancel();
            }
            mScreenshotAnimator = null;
        }
        if (mViewHost != null) {
            mViewHost.release();
            mViewHost = null;
@@ -238,16 +248,20 @@ public class SplitDecorManager extends WindowlessWindowManager {
    /** Stops showing resizing hint. */
    public void onResized(SurfaceControl.Transaction t, Runnable animFinishedCallback) {
        if (mScreenshot != null) {
            if (mScreenshotAnimator != null && mScreenshotAnimator.isRunning()) {
                mScreenshotAnimator.cancel();
            }

            t.setPosition(mScreenshot, mOffsetX, mOffsetY);

            final SurfaceControl.Transaction animT = new SurfaceControl.Transaction();
            final ValueAnimator va = ValueAnimator.ofFloat(1, 0);
            va.addUpdateListener(valueAnimator -> {
            mScreenshotAnimator = ValueAnimator.ofFloat(1, 0);
            mScreenshotAnimator.addUpdateListener(valueAnimator -> {
                final float progress = (float) valueAnimator.getAnimatedValue();
                animT.setAlpha(mScreenshot, progress);
                animT.apply();
            });
            va.addListener(new AnimatorListenerAdapter() {
            mScreenshotAnimator.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationStart(Animator animation) {
                    mRunningAnimationCount++;
@@ -266,7 +280,7 @@ public class SplitDecorManager extends WindowlessWindowManager {
                    }
                }
            });
            va.start();
            mScreenshotAnimator.start();
        }

        if (mResizingIconView == null) {
@@ -292,9 +306,6 @@ public class SplitDecorManager extends WindowlessWindowManager {
                });
                return;
            }

            // If fade-in animation is running, cancel it and re-run fade-out one.
            mFadeAnimator.cancel();
        }
        if (mShown) {
            fadeOutDecor(animFinishedCallback);
@@ -332,6 +343,11 @@ public class SplitDecorManager extends WindowlessWindowManager {
     * directly. */
    public void fadeOutDecor(Runnable finishedCallback) {
        if (mShown) {
            // If previous animation is running, just cancel it.
            if (mFadeAnimator != null && mFadeAnimator.isRunning()) {
                mFadeAnimator.cancel();
            }

            startFadeAnimation(false /* show */, true, finishedCallback);
            mShown = false;
        } else {