From 3b27e59e1ea3b9928d2ddd0d37c0a13d83ae834b Mon Sep 17 00:00:00 2001 From: John Reck Date: Thu, 21 Aug 2014 12:37:48 -0700 Subject: [PATCH] Fix supporting modifying listeners in callbacks Bug: 17179442 Change-Id: I2d64f86395c0b1befb5c10b9c696330db1c96821 --- core/java/android/view/RenderNodeAnimator.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) 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(); }