Loading core/java/android/animation/AnimatorSet.java +12 −0 Original line number Diff line number Diff line Loading @@ -1381,6 +1381,18 @@ public final class AnimatorSet extends Animator implements AnimationHandler.Anim } int toId = findLatestEventIdForTime(playTime); handleAnimationEvents(-1, toId, playTime); if (mSeekState.isActive()) { // Pump a frame to the on-going animators for (int i = 0; i < mPlayingSet.size(); i++) { Node node = mPlayingSet.get(i); if (!node.mEnded) { pulseFrame(node, getPlayTimeForNodeIncludingDelay(playTime, node)); } } } // Remove all the finished anims for (int i = mPlayingSet.size() - 1; i >= 0; i--) { if (mPlayingSet.get(i).mEnded) { mPlayingSet.remove(i); Loading core/tests/coretests/src/android/animation/AnimatorSetCallsTest.java +39 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,8 @@ import org.junit.Test; import java.util.ArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; @MediumTest public class AnimatorSetCallsTest { Loading Loading @@ -447,6 +449,43 @@ public class AnimatorSetCallsTest { mActivity.runOnUiThread(() -> {}); } @Test public void startAfterSeek() throws Throwable { ArrayList<Float> values = new ArrayList<>(); AtomicReference<CountDownLatch> drawLatch = new AtomicReference<>(new CountDownLatch(1)); mActivity.runOnUiThread(() -> { mAnimator.setDuration(300); mAnimator.setInterpolator(null); View view = (View) mAnimator.getTarget(); view.getViewTreeObserver().addOnDrawListener(() -> { values.add(view.getTranslationX()); drawLatch.get().countDown(); }); mSet1.setCurrentPlayTime(150); }); assertTrue(drawLatch.get().await(1, TimeUnit.SECONDS)); drawLatch.set(new CountDownLatch(1)); mActivity.runOnUiThread(() -> { assertEquals(1, values.size()); assertEquals(50f, values.get(0), 0.01f); mSet1.start(); }); assertTrue(drawLatch.get().await(1, TimeUnit.SECONDS)); mActivity.runOnUiThread(() -> { assertTrue(values.size() >= 2); float lastValue = values.get(0); for (int i = 1; i < values.size(); i++) { assertTrue(values.get(i) >= lastValue); lastValue = values.get(i); } }); } private void waitForOnUiThread(PollingCheck.PollingCheckCondition condition) { final boolean[] value = new boolean[1]; PollingCheck.waitFor(() -> { Loading Loading
core/java/android/animation/AnimatorSet.java +12 −0 Original line number Diff line number Diff line Loading @@ -1381,6 +1381,18 @@ public final class AnimatorSet extends Animator implements AnimationHandler.Anim } int toId = findLatestEventIdForTime(playTime); handleAnimationEvents(-1, toId, playTime); if (mSeekState.isActive()) { // Pump a frame to the on-going animators for (int i = 0; i < mPlayingSet.size(); i++) { Node node = mPlayingSet.get(i); if (!node.mEnded) { pulseFrame(node, getPlayTimeForNodeIncludingDelay(playTime, node)); } } } // Remove all the finished anims for (int i = mPlayingSet.size() - 1; i >= 0; i--) { if (mPlayingSet.get(i).mEnded) { mPlayingSet.remove(i); Loading
core/tests/coretests/src/android/animation/AnimatorSetCallsTest.java +39 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,8 @@ import org.junit.Test; import java.util.ArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; @MediumTest public class AnimatorSetCallsTest { Loading Loading @@ -447,6 +449,43 @@ public class AnimatorSetCallsTest { mActivity.runOnUiThread(() -> {}); } @Test public void startAfterSeek() throws Throwable { ArrayList<Float> values = new ArrayList<>(); AtomicReference<CountDownLatch> drawLatch = new AtomicReference<>(new CountDownLatch(1)); mActivity.runOnUiThread(() -> { mAnimator.setDuration(300); mAnimator.setInterpolator(null); View view = (View) mAnimator.getTarget(); view.getViewTreeObserver().addOnDrawListener(() -> { values.add(view.getTranslationX()); drawLatch.get().countDown(); }); mSet1.setCurrentPlayTime(150); }); assertTrue(drawLatch.get().await(1, TimeUnit.SECONDS)); drawLatch.set(new CountDownLatch(1)); mActivity.runOnUiThread(() -> { assertEquals(1, values.size()); assertEquals(50f, values.get(0), 0.01f); mSet1.start(); }); assertTrue(drawLatch.get().await(1, TimeUnit.SECONDS)); mActivity.runOnUiThread(() -> { assertTrue(values.size() >= 2); float lastValue = values.get(0); for (int i = 1; i < values.size(); i++) { assertTrue(values.get(i) >= lastValue); lastValue = values.get(i); } }); } private void waitForOnUiThread(PollingCheck.PollingCheckCondition condition) { final boolean[] value = new boolean[1]; PollingCheck.waitFor(() -> { Loading