diff options
| author | 2023-01-11 18:41:28 +0800 | |
|---|---|---|
| committer | 2023-01-12 11:36:49 +0800 | |
| commit | 630d25c619dc69414926e308bb0d7f2311a69196 (patch) | |
| tree | 6b9b88cd1e481a0e261430fde731c6f9298b6efd | |
| parent | 103ab3935b315e906fc768f90767308c0df44a42 (diff) | |
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
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java | 34 |
1 files 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 a9d3c9f154cd..abb357c5b653 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 { |