Make sure the correct AnimatorListeners gets called
This CL fixes the bug where when there're AnimatorSet inside of
AnimatorSet, incorrect AnimatorListeners get notified of the
Animator's lifecycle events.
Bug: 22940651
Bug: 22954352
Change-Id: I2bf66413d54dcfc75dc7fa779e723443763a30a5
diff --git a/core/java/android/animation/AnimatorSet.java b/core/java/android/animation/AnimatorSet.java
index 5480193..6db5b9b 100644
--- a/core/java/android/animation/AnimatorSet.java
+++ b/core/java/android/animation/AnimatorSet.java
@@ -702,7 +702,7 @@
}
- private class AnimatorSetListener implements AnimatorListener {
+ private static class AnimatorSetListener implements AnimatorListener {
private AnimatorSet mAnimatorSet;
@@ -712,7 +712,7 @@
public void onAnimationCancel(Animator animation) {
- if (!mTerminated) {
+ if (!mAnimatorSet.mTerminated) {
// Listeners are already notified of the AnimatorSet canceling in cancel().
// The logic below only kicks in when animations end normally
if (mAnimatorSet.mPlayingSet.size() == 0) {
@@ -734,7 +734,7 @@
Node animNode = mAnimatorSet.mNodeMap.get(animation);
animNode.mEnded = true;
- if (!mTerminated) {
+ if (!mAnimatorSet.mTerminated) {
List<Node> children = animNode.mChildNodes;
// Start children animations, if any.
int childrenSize = children == null ? 0 : children.size();
@@ -747,9 +747,9 @@
// end(); the logic below only kicks in when animations end normally
boolean allDone = true;
// Traverse the tree and find if there's any unfinished node
- int size = mNodes.size();
+ int size = mAnimatorSet.mNodes.size();
for (int i = 0; i < size; i++) {
- if (!mNodes.get(i).mEnded) {
+ if (!mAnimatorSet.mNodes.get(i).mEnded) {
allDone = false;
break;
}
@@ -757,9 +757,9 @@
if (allDone) {
// If this was the last child animation to end, then notify listeners that this
// AnimatorSet has ended
- if (mListeners != null) {
+ if (mAnimatorSet.mListeners != null) {
ArrayList<AnimatorListener> tmpListeners =
- (ArrayList<AnimatorListener>) mListeners.clone();
+ (ArrayList<AnimatorListener>) mAnimatorSet.mListeners.clone();
int numListeners = tmpListeners.size();
for (int i = 0; i < numListeners; ++i) {
tmpListeners.get(i).onAnimationEnd(mAnimatorSet);