diff --git a/core/java/android/view/RenderNodeAnimator.java b/core/java/android/view/RenderNodeAnimator.java index a56d44839b135..9433237f4516f 100644 --- a/core/java/android/view/RenderNodeAnimator.java +++ b/core/java/android/view/RenderNodeAnimator.java @@ -19,6 +19,7 @@ package android.view; import android.animation.Animator; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; +import android.animation.Animator.AnimatorListener; import android.graphics.Canvas; import android.graphics.CanvasProperty; import android.graphics.Paint; @@ -202,7 +203,7 @@ public class RenderNodeAnimator extends Animator { mViewTarget.mTransformationInfo.mAlpha = mFinalValue; } - final ArrayList listeners = getListeners(); + final ArrayList listeners = cloneListeners(); final int numListeners = listeners == null ? 0 : listeners.size(); for (int i = 0; i < numListeners; i++) { listeners.get(i).onAnimationStart(this); @@ -220,7 +221,7 @@ public class RenderNodeAnimator extends Animator { getHelper().removeDelayedAnimation(this); nEnd(mNativePtr.get()); - final ArrayList listeners = getListeners(); + final ArrayList listeners = cloneListeners(); final int numListeners = listeners == null ? 0 : listeners.size(); for (int i = 0; i < numListeners; i++) { listeners.get(i).onAnimationCancel(this); @@ -329,13 +330,22 @@ public class RenderNodeAnimator extends Animator { protected void onFinished() { mFinished = true; - final ArrayList listeners = getListeners(); + final ArrayList listeners = cloneListeners(); final int numListeners = listeners == null ? 0 : listeners.size(); for (int i = 0; i < numListeners; i++) { listeners.get(i).onAnimationEnd(this); } } + @SuppressWarnings("unchecked") + private ArrayList cloneListeners() { + ArrayList listeners = getListeners(); + if (listeners != null) { + listeners = (ArrayList) listeners.clone(); + } + return listeners; + } + long getNativeAnimator() { return mNativePtr.get(); }