summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author George Mount <mount@google.com> 2023-02-17 11:39:19 -0800
committer Cherrypicker Worker <android-build-cherrypicker-worker@google.com> 2023-03-21 16:58:39 +0000
commitc720d0af3063595c18e51af3eb11dbc7ae14a8fe (patch)
treef6dabe9fe451d38cf9883537600e5a12d95af764
parentfd41f0f638bcca0a47de57562fe48c5f4601fec8 (diff)
Don't notify updates while initializing AnimatorSet
Fixes: 269785397 When an AnimatorSet runs, it should not call onAnimationUpdate() during initialization. Test: new test (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:90eabef83b63d42f73233a9c025850999f0d8175) Merged-In: Ic53d346b17c06a8d9ae9af8c28681dd84cc630fc Change-Id: Ic53d346b17c06a8d9ae9af8c28681dd84cc630fc
-rw-r--r--core/java/android/animation/ValueAnimator.java6
-rw-r--r--core/tests/coretests/src/android/animation/AnimatorSetCallsTest.java60
2 files changed, 59 insertions, 7 deletions
diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java
index 46d9847c2a94..719f596949bb 100644
--- a/core/java/android/animation/ValueAnimator.java
+++ b/core/java/android/animation/ValueAnimator.java
@@ -1470,7 +1470,7 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio
iteration = Math.min(iteration, mRepeatCount);
lastIteration = Math.min(lastIteration, mRepeatCount);
- if (iteration != lastIteration) {
+ if (notify && iteration != lastIteration) {
notifyListeners(AnimatorCaller.ON_REPEAT, false);
}
}
@@ -1669,7 +1669,9 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio
for (int i = 0; i < numValues; ++i) {
mValues[i].calculateValue(fraction);
}
- callOnList(mUpdateListeners, AnimatorCaller.ON_UPDATE, this, false);
+ if (mSeekFraction >= 0 || mStartListenersCalled) {
+ callOnList(mUpdateListeners, AnimatorCaller.ON_UPDATE, this, false);
+ }
}
@Override
diff --git a/core/tests/coretests/src/android/animation/AnimatorSetCallsTest.java b/core/tests/coretests/src/android/animation/AnimatorSetCallsTest.java
index fda08ff1e677..22da0aa4597e 100644
--- a/core/tests/coretests/src/android/animation/AnimatorSetCallsTest.java
+++ b/core/tests/coretests/src/android/animation/AnimatorSetCallsTest.java
@@ -30,6 +30,8 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
+import java.util.ArrayList;
+
@MediumTest
public class AnimatorSetCallsTest {
@Rule
@@ -38,6 +40,7 @@ public class AnimatorSetCallsTest {
private AnimatorSetActivity mActivity;
private AnimatorSet mSet1;
+ private ObjectAnimator mAnimator;
private CountListener mListener1;
private CountListener mListener2;
private CountListener mListener3;
@@ -58,13 +61,13 @@ public class AnimatorSetCallsTest {
set2.addListener(mListener2);
set2.addPauseListener(mListener2);
- ObjectAnimator anim = ObjectAnimator.ofFloat(square, "translationX", 0f, 100f);
+ mAnimator = ObjectAnimator.ofFloat(square, "translationX", 0f, 100f);
mListener3 = new CountListener();
- anim.addListener(mListener3);
- anim.addPauseListener(mListener3);
- anim.setDuration(1);
+ mAnimator.addListener(mListener3);
+ mAnimator.addPauseListener(mListener3);
+ mAnimator.setDuration(1);
- set2.play(anim);
+ set2.play(mAnimator);
mSet1.play(set2);
});
}
@@ -157,6 +160,53 @@ public class AnimatorSetCallsTest {
);
}
+ @Test
+ public void updateOnlyWhileChangingValues() {
+ ArrayList<Float> updateValues = new ArrayList<>();
+ mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ updateValues.add((Float) animation.getAnimatedValue());
+ }
+ });
+
+ mSet1.setCurrentPlayTime(0);
+
+ assertEquals(1, updateValues.size());
+ assertEquals(0f, updateValues.get(0), 0f);
+ }
+ @Test
+ public void updateOnlyWhileRunning() {
+ ArrayList<Float> updateValues = new ArrayList<>();
+ mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ updateValues.add((Float) animation.getAnimatedValue());
+ }
+ });
+
+ mRule.getScenario().onActivity((a) -> {
+ mSet1.start();
+ });
+
+ waitForOnUiThread(() -> mListener1.endForward > 0);
+
+ // the duration is only 1ms, so there should only be two values, 0 and 100.
+ assertEquals(0f, updateValues.get(0), 0f);
+ assertEquals(100f, updateValues.get(updateValues.size() - 1), 0f);
+
+ // now check all the values in the middle, which can never go from 100->0.
+ boolean isAtEnd = false;
+ for (int i = 1; i < updateValues.size() - 1; i++) {
+ float actual = updateValues.get(i);
+ if (actual == 100f) {
+ isAtEnd = true;
+ }
+ float expected = isAtEnd ? 100f : 0f;
+ assertEquals(expected, actual, 0f);
+ }
+ }
+
private void waitForOnUiThread(PollingCheck.PollingCheckCondition condition) {
final boolean[] value = new boolean[1];
PollingCheck.waitFor(() -> {