From 630d25c619dc69414926e308bb0d7f2311a69196 Mon Sep 17 00:00:00 2001 From: Tony Huang Date: Wed, 11 Jan 2023 18:41:28 +0800 Subject: [PATCH] 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 --- .../shell/common/split/SplitDecorManager.java | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java index a9d3c9f154cde..abb357c5b653e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java @@ -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,8 +136,17 @@ public class SplitDecorManager extends WindowlessWindowManager { /** Releases the surfaces for split decor. */ public void release(SurfaceControl.Transaction t) { - if (mFadeAnimator != null && mFadeAnimator.isRunning()) { - mFadeAnimator.cancel(); + 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(); @@ -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 {