diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java index c7bf8ecfe949c..94f0e24f88c96 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimator.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java @@ -85,6 +85,8 @@ class SurfaceAnimator { private boolean mAnimationStartDelayed; + private boolean mAnimationFinished; + /** * @param animatable The object to animate. * @param staticAnimationFinishedCallback Callback to invoke when an animation has finished @@ -134,6 +136,7 @@ class SurfaceAnimator { || anim.shouldDeferAnimationFinish(resetAndInvokeFinish))) { resetAndInvokeFinish.run(); } + mAnimationFinished = true; } }; } @@ -289,6 +292,9 @@ class SurfaceAnimator { Slog.w(TAG, "Unable to transfer animation, surface or parent is null"); cancelAnimation(); return; + } else if (from.mAnimationFinished) { + Slog.w(TAG, "Unable to transfer animation, because " + from + " animation is finished"); + return; } endDelayingAnimationStart(); final Transaction t = mAnimatable.getPendingTransaction(); @@ -367,6 +373,7 @@ class SurfaceAnimator { SurfaceControl leash = mLeash; mLeash = null; final boolean scheduleAnim = removeLeash(t, mAnimatable, leash, destroyLeash); + mAnimationFinished = false; if (scheduleAnim) { mService.scheduleAnimationLocked(); }