102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liupackage android.animation; 202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liuimport com.android.frameworks.coretests.R; 402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liuimport android.test.ActivityInstrumentationTestCase2; 62bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liuimport android.test.UiThreadTest; 702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liuimport android.test.suitebuilder.annotation.SmallTest; 802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liuimport android.view.View; 902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 1002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liuimport java.util.ArrayList; 1102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 1202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liupublic class AnimatorSetActivityTest extends ActivityInstrumentationTestCase2<AnimatorSetActivity> { 1302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 147a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu private static final long POLL_INTERVAL = 100; // ms 1502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu private AnimatorSetActivity mActivity; 1602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu private ObjectAnimator a1,a2,a3; 1702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu private ValueAnimator a4,a5; 1802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 1902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu public AnimatorSetActivityTest() { 2002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu super(AnimatorSetActivity.class); 2102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu } 2202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 232bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu static class MyListener implements Animator.AnimatorListener { 242bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu boolean startIsCalled = false; 252bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu boolean endIsCalled = false; 262bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu boolean cancelIsCalled = false; 272bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 282bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 292bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void onAnimationStart(Animator animation) { 302bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu startIsCalled = true; 312bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 322bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 332bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 342bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void onAnimationEnd(Animator animation) { 352bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu endIsCalled = true; 362bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 372bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 382bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 392bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void onAnimationCancel(Animator animation) { 402bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu cancelIsCalled = true; 412bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 422bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 432bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 442bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void onAnimationRepeat(Animator animation) { 452bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 462bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 472bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 482bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 4902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu @Override 5002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu public void setUp() throws Exception { 5102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu super.setUp(); 5202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu mActivity = getActivity(); 5302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 5402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu View square1 = mActivity.findViewById(R.id.square1); 5502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu View square2 = mActivity.findViewById(R.id.square2); 5602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu View square3 = mActivity.findViewById(R.id.square3); 5702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a1 = ObjectAnimator.ofFloat(square1, View.TRANSLATION_X, 0f, 500f, 0f).setDuration(250); 5802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a2 = ObjectAnimator.ofFloat(square2, View.ALPHA, 1f, 0f).setDuration(350); 5902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a3 = ObjectAnimator.ofFloat(square3, View.ROTATION, 0, 90).setDuration(450); 6002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a4 = ValueAnimator.ofInt(100, 200).setDuration(450); 6102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a5 = ValueAnimator.ofFloat(10f, 5f).setDuration(850); 6202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu } 6302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 6402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu @Override 6502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu public void tearDown() throws Exception { 6602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu mActivity = null; 6702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a1 = null; 6802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a2 = null; 6902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a3 = null; 7002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a4 = null; 7102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a5 = null; 7202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu super.tearDown(); 7302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu } 7402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 7502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu @SmallTest 7602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu public void testGetChildAnimations() { 7702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu AnimatorSet s1 = new AnimatorSet(); 7802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s1.playTogether(a1, a2, a3); 7902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu ArrayList<Animator> children = s1.getChildAnimations(); 8002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(3, children.size()); 8102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(children.contains(a1)); 8202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(children.contains(a2)); 8302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(children.contains(a3)); 8402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 8502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu AnimatorSet s2 = new AnimatorSet(); 8602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s2.playSequentially(a1, a2, a3); 8702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu children = s2.getChildAnimations(); 8802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(3, children.size()); 8902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(children.contains(a1)); 9002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(children.contains(a2)); 9102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(children.contains(a3)); 9202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 9302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu AnimatorSet s3 = new AnimatorSet(); 9402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s3.play(a1).before(a2).after(s1).with(s2).after(a3); 9502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu ArrayList<Animator> s3Children = s3.getChildAnimations(); 9602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertNotNull(s3Children); 9702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(5, s3Children.size()); 9802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(s3Children.contains(a1)); 9902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(s3Children.contains(a2)); 10002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(s3Children.contains(a3)); 10102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(s3Children.contains(s1)); 10202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(s3Children.contains(s2)); 10302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 10402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu AnimatorSet s4 = new AnimatorSet(); 10502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s4.playSequentially(s3Children); 10602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu ArrayList<Animator> s4Children = s4.getChildAnimations(); 10702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertNotNull(s4Children); 10802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(s3Children.size(), s4Children.size()); 10902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu for (int i = 0; i < s3Children.size(); i++) { 11002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu Animator child = s3Children.get(i); 11102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertTrue(s4Children.contains(child)); 11202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu } 11302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu } 11402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 11502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu @SmallTest 11602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu public void testTotalDuration() { 1172bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu ArrayList<Animator> list = getAnimatorList(); 11802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 11902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu // Run animations sequentially and test the total duration against sum of durations. 12002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu AnimatorSet s1 = new AnimatorSet(); 12102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s1.playSequentially(list); 12202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu long totalDuration = 0; 12302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu for (int i = 0; i < list.size(); i++) { 12402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu Animator anim = list.get(i); 12502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu anim.setStartDelay(0); 12602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu totalDuration += list.get(i).getDuration(); 12702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu } 12802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(totalDuration, s1.getTotalDuration()); 12902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 13002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu // Add delay to set, and test total duration 13102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s1.setStartDelay(200); 13202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(totalDuration + 200, s1.getTotalDuration()); 13302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 13402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a1.setStartDelay(100); 13502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(totalDuration + 200 + 100, s1.getTotalDuration()); 13602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 13702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu // Run animations simultaneously, test the total duration against the longest duration 13802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu AnimatorSet s2 = new AnimatorSet(); 13902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s2.playTogether(list); 14002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu long maxDuration = 0; 14102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu for (int i = 0; i < list.size(); i++) { 14202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu long duration = list.get(i).getDuration(); 14302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu list.get(i).setStartDelay(100); 14402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu maxDuration = maxDuration > (duration + 100) ? maxDuration : (duration + 100); 14502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu } 14602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(maxDuration, s2.getTotalDuration()); 14702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 14802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu // Form a cycle in the AnimatorSet and test the total duration 14902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu AnimatorSet s3 = new AnimatorSet(); 15002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s3.play(a1).before(a2).after(a3); 15102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s3.play(a1).after(a2).with(a4); 15202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(AnimatorSet.DURATION_INFINITE, s3.getTotalDuration()); 15302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 15402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu // Put all the animators in a cycle 15502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu AnimatorSet s4 = new AnimatorSet(); 15602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s4.play(a1).after(a2); 15702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s4.play(a2).after(a1); 15802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(AnimatorSet.DURATION_INFINITE, s4.getTotalDuration()); 15902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 16002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu // No cycle in the set, run a2, a1, a3 in sequence, and a2, a4, a5 together 16102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu AnimatorSet s5 = new AnimatorSet(); 16202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s5.play(a1).after(a2).before(a3); 16302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu s5.play(a2).with(a4).with(a5); 16402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu long duration = a1.getDuration() + a1.getStartDelay() + a2.getDuration() + a2 16502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu .getStartDelay() + a3.getDuration() + a3.getStartDelay(); 16602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu long a4Duration = a4.getDuration() + a4.getStartDelay(); 16702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu long a5Duration = a5.getDuration() + a5.getStartDelay(); 16802f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu duration = Math.max(duration, a4Duration); 16902f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu duration = Math.max(duration, a5Duration); 17002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(duration, s5.getTotalDuration()); 17102f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 17202f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu // Change one animator to repeat infinitely and test the total time 17302f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu a3.setRepeatCount(ValueAnimator.INFINITE); 17402f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu assertEquals(AnimatorSet.DURATION_INFINITE, s5.getTotalDuration()); 17502f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 17602f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu } 17702f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu 1782bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @SmallTest 1792bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void testGetDuration() { 1802bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu AnimatorSet s = new AnimatorSet(); 1812bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(s.getDuration() < 0); 1822bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.play(a1).before(a2).before(a3).after(a4).after(a5); 1832bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(s.getDuration() < 0); 1842bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 1852bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu long duration = 200; 1862bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.setDuration(duration); 1872bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertEquals(duration, s.getDuration()); 1882bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 1892bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 1902bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 1912bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @SmallTest 1922bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @UiThreadTest 1932bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void testSetDuration() { 1942bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu AnimatorSet s = getSequentialSet(); 1952bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(s.getDuration() < 0); 1962bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 1972bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu long duration = 300; 1982bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.setDuration(duration); 1992bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertEquals(duration, s.getDuration()); 2002bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2012bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.start(); 2022bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertEquals(duration, s.getDuration()); 2032bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertEquals(duration, a1.getDuration()); 2042bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertEquals(duration, a2.getDuration()); 2052bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertEquals(duration, a3.getDuration()); 2062bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertEquals(duration, a4.getDuration()); 2072bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertEquals(duration, a5.getDuration()); 2082bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 2092bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2102bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @SmallTest 2112bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void testAddListener() throws InterruptedException { 2122bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu // Verify that the listener is added to the list of listeners in the AnimatorSet 2132bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu // and that newly added listener gets callback for lifecycle events of the animator 2142bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final AnimatorSet s = new AnimatorSet(); 2152bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.play(a1).before(a2).before(a3).after(a4).after(a5); 2162bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final MyListener listener = new MyListener(); 2172bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu if (s.getListeners() != null) { 2182bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(s.getListeners().contains(listener)); 2192bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 2202bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.addListener(listener); 2212bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(s.getListeners().contains(listener)); 2222bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2232bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(listener.startIsCalled); 2242bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(listener.endIsCalled); 2252bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2262bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu try { 2272bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 2282bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 2292bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 2302bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.start(); 2312bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listener.startIsCalled); 2322bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(listener.endIsCalled); 2332bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 2342bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 2352bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } catch (Throwable throwable) { 2362bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu throwable.printStackTrace(); 2372bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 2382bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2392bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu Thread.sleep(s.getTotalDuration() + 200); 2402bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listener.startIsCalled); 2412bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listener.endIsCalled); 2422bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 2432bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2442bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @SmallTest 2452bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void testRemoveListener() throws Throwable { 2462bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final AnimatorSet s = new AnimatorSet(); 2472bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.playTogether(a1, a2, a3, a4); 2482bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu MyListener listener = new MyListener(); 2492bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.addListener(listener); 2502bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 2512bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 2522bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 2532bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.start(); 2542bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 2552bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 2562bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2572bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu Thread.sleep(s.getTotalDuration() + 100); 2582bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listener.startIsCalled); 2592bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listener.endIsCalled); 2602bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2612bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.removeListener(listener); 2622bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu if (s.getListeners() != null) { 2632bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(s.getListeners().contains(listener)); 2642bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 2652bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu listener.startIsCalled = false; 2662bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu listener.endIsCalled = false; 2672bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2682bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 2692bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 2702bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 2712bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.start(); 2722bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 2732bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 2742bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu Thread.sleep(s.getTotalDuration() + 100); 2752bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(listener.startIsCalled); 2762bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(listener.endIsCalled); 2772bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 2782bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2792bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @SmallTest 2802bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void testEnd() throws Throwable { 2812bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu // End animator set 2822bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final AnimatorSet s = new AnimatorSet(); 2832bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.play(a1).before(a2).after(a3).with(a4); 2842bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final MyListener listener = new MyListener(); 2852bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.addListener(listener); 2862bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(listener.endIsCalled); 2872bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 2882bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 2892bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 2902bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.start(); 2912bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(s.isStarted()); 2922bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listener.startIsCalled); 2932bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(listener.endIsCalled); 2942bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 2952bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 2962bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2972bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu Thread.sleep(a2.getTotalDuration()); 2982bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 2992bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 3002bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 3012bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 3022bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.end(); 3032bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listener.startIsCalled); 3042bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listener.endIsCalled); 3052bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(s.isRunning()); 3062bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(s.isStarted()); 3072bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3082bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(a1.isStarted()); 3092bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(a2.isStarted()); 3102bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(a3.isStarted()); 3112bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(a4.isStarted()); 3122bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3132bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 3142bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3152bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3162bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3172bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @SmallTest 3182bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void testStart() throws Throwable { 3192bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final AnimatorSet s = new AnimatorSet(); 3202bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu ArrayList<Animator> animators = getAnimatorList(); 3212bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3222bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.playSequentially(animators); 3232bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final MyListener l = new MyListener(); 3242bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.addListener(l); 3252bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3262bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu ArrayList<MyListener> listeners = new ArrayList<>(animators.size()); 3272bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu for (int i = 0; i < animators.size(); i++) { 3282bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu MyListener listener = new MyListener(); 3292bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu listeners.add(listener); 3302bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu animators.get(i).addListener(listener); 3312bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3322bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3332bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu // Check the state before calling start() 3342bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(l.startIsCalled); 3352bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(l.endIsCalled); 3362bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu for (int i = 0; i < listeners.size(); i++) { 3372bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(l.startIsCalled); 3382bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(l.endIsCalled); 3392bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3402bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3412bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 3422bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 3432bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 3442bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.start(); 3452bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(l.startIsCalled); 3462bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3472bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 3482bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3492bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu long timeout = s.getTotalDuration() * 2; 3502bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu long wait = 0; 3512bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3522bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu while (wait < timeout) { 3532bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu if (l.endIsCalled) { 3542bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu break; 3552bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3562bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu Thread.sleep(200); 3572bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu wait += 200; 3582bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3592bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3602bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu // Now the set should finished 3612bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(l.startIsCalled); 3622bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(l.endIsCalled); 3632bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu for (int i = 0; i < listeners.size(); i++) { 3642bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listeners.get(i).startIsCalled); 3652bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listeners.get(i).endIsCalled); 3662bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3672bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3682bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3692bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @SmallTest 3702bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void testCancel() throws Throwable { 3712bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu // Check whether cancel would trigger onAnimationCanceled and cancel all the unfinished 3722bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu // animations 3732bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final AnimatorSet s = new AnimatorSet(); 3742bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final ArrayList<Animator> animators = getAnimatorList(); 3752bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3762bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.playTogether(animators); 3772bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final MyListener l = new MyListener(); 3782bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.addListener(l); 3792bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3802bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final ArrayList<MyListener> listeners = new ArrayList<>(5); 3812bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu for (int i = 0; i < animators.size(); i++) { 3822bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu MyListener listener = new MyListener(); 3832bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu listeners.add(listener); 3842bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu animators.get(i).addListener(listener); 3852bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3862bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3872bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu // Check the state before calling start() 3882bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(l.startIsCalled); 3892bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(l.cancelIsCalled); 3902bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(l.endIsCalled); 3912bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu for (int i = 0; i < listeners.size(); i++) { 3922bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(l.startIsCalled); 3932bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(l.cancelIsCalled); 3942bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(l.endIsCalled); 3952bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 3962bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 3972bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 3982bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 3992bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 4002bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.start(); 4012bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4022bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 4032bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 4042bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu Thread.sleep(a1.getTotalDuration()); 4052bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 4062bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 4072bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 4082bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(s.isStarted()); 4092bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu ArrayList<Integer> runningAnimIds = new ArrayList<Integer>(); 4102bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu for (int i = 0; i < animators.size(); i++) { 4112bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu if (animators.get(i).isStarted()) { 4122bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runningAnimIds.add(i); 4132bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4142bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4152bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.cancel(); 4162bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(l.startIsCalled); 4172bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(l.cancelIsCalled); 4182bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(l.endIsCalled); 4192bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 4202bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu for (int i = 0; i < listeners.size(); i++) { 4212bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listeners.get(i).startIsCalled); 4222bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu if (runningAnimIds.contains(i)) { 4232bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listeners.get(i).cancelIsCalled); 4242bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4252bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(listeners.get(i).endIsCalled); 4262bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4272bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4282bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 4292bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 4302bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4312bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 4322bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @SmallTest 4332bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void testIsRunning() throws Throwable { 4342bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final AnimatorSet s = new AnimatorSet(); 4352bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final long startDelay = 500; 4362bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.play(a1).before(a2).after(a3).with(a4); 4372bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.play(a3).after(a5); 4382bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.setStartDelay(startDelay); 4392bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu MyListener listener = new MyListener(); 4402bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.addListener(listener); 4412bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 4422bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 4432bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 4442bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu s.start(); 4452bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4462bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 4472bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 4482bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu while (!listener.endIsCalled) { 4492bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu boolean passedStartDelay = a1.isStarted() || a2.isStarted() || a3.isStarted() || 4502bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu a4.isStarted() || a5.isStarted(); 4512bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertEquals(passedStartDelay, s.isRunning()); 4522bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu Thread.sleep(50); 4532bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4542bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(s.isRunning()); 4552bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4562bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 4572bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @SmallTest 4582bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void testPauseAndResume() throws Throwable { 4592bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu final AnimatorSet set = getSequentialSet(); 4602bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 4612bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 4622bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 4632bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu // Calling pause before start should have no effect, per documentation 4642bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu set.pause(); 4652bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu set.start(); 4662bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(set.isPaused()); 4672bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4682bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 4692bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 4702bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu while (!a2.isStarted()) { 4712bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu Thread.sleep(50); 4722bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4732bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu runTestOnUiThread(new Runnable() { 4742bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu @Override 4752bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu public void run() { 4762bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(set.isPaused()); 4772bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu set.pause(); 4782bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertTrue(set.isPaused()); 4792bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu set.resume(); 4802bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu assertFalse(set.isPaused()); 4812bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4822bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu }); 4832bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 4842bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 4857a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu @SmallTest 4867a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu public void testClone() throws Throwable { 4877a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // Set up an AnimatorSet and two clones, add one listener to each. When the clones animate, 4887a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // listeners of both the clone and the animator being cloned should receive animation 4897a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // lifecycle events. 4907a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu final AnimatorSet s1 = getSequentialSet(); 4917a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 4927a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // Record animators that called their listeners for the corresponding event. 4937a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu final ArrayList<Animator> startedAnimators = new ArrayList<>(); 4947a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu final ArrayList<Animator> canceledAnimators = new ArrayList<>(); 4957a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu final ArrayList<Animator> endedAnimators = new ArrayList<>(); 4967a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 4977a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu final MyListener l1 = new MyListener() { 4987a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu @Override 4997a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu public void onAnimationStart(Animator anim) { 5007a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu super.onAnimationStart(anim); 5017a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu startedAnimators.add(anim); 5027a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 5037a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5047a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu @Override 5057a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu public void onAnimationCancel(Animator anim) { 5067a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu super.onAnimationCancel(anim); 5077a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu canceledAnimators.add(anim); 5087a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 5097a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5107a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu @Override 5117a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu public void onAnimationEnd(Animator anim) { 5127a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu super.onAnimationEnd(anim); 5137a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu endedAnimators.add(anim); 5147a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 5157a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5167a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu }; 5177a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu s1.addListener(l1); 5187a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5197a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // Start the animation, and make the first clone during its run and the second clone once 5207a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // it ends. 5217a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu runTestOnUiThread(new Runnable() { 5227a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu @Override 5237a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu public void run() { 5247a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l1.startIsCalled); 5257a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l1.endIsCalled); 5267a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5277a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu s1.start(); 5287a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 5297a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu }); 5307a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5317a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // Make the first clone, during the animation's run. 5327a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(s1.isStarted()); 5337a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu final AnimatorSet s2 = s1.clone(); 5347a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu final MyListener l2 = new MyListener(); 5357a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu s2.addListener(l2); 5367a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5377a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu Thread.sleep(POLL_INTERVAL); 5387a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu runTestOnUiThread(new Runnable() { 5397a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu @Override 5407a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu public void run() { 5417a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu s1.end(); 5427a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 5437a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu }); 5447a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5457a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu Thread.sleep(POLL_INTERVAL); 5467a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu runTestOnUiThread(new Runnable() { 5477a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu @Override 5487a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu public void run() { 5497a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(l1.startIsCalled); 5507a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(l1.endIsCalled); 5517a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 5527a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu }); 5537a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu Thread.sleep(POLL_INTERVAL); 5547a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5557a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // Make the second clone now. 5567a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu final AnimatorSet s3 = s1.clone(); 5577a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu final MyListener l3 = new MyListener(); 5587a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu s3.addListener(l3); 5597a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5607a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu runTestOnUiThread(new Runnable() { 5617a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu @Override 5627a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu public void run() { 5637a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // Checking the fields before animations start. 5647a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l2.startIsCalled); 5657a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l2.cancelIsCalled); 5667a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l2.endIsCalled); 5677a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l3.startIsCalled); 5687a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l3.cancelIsCalled); 5697a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l3.endIsCalled); 5707a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5717a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu s2.start(); 5727a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu s3.start(); 5737a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 5747a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu }); 5757a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5767a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu Thread.sleep(POLL_INTERVAL); 5777a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu runTestOnUiThread(new Runnable() { 5787a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu @Override 5797a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu public void run() { 5807a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // Make sure the listeners receive the callbacks 5817a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // At this time only onAnimationStart() should be called. 5827a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(l2.startIsCalled); 5837a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(l3.startIsCalled); 5847a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l2.endIsCalled); 5857a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l3.endIsCalled); 5867a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l2.cancelIsCalled); 5877a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l3.cancelIsCalled); 5887a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 5897a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu s2.end(); 5907a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu s3.cancel(); 5917a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 5927a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu }); 5937a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu Thread.sleep(POLL_INTERVAL); 5947a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu runTestOnUiThread(new Runnable() { 5957a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu @Override 5967a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu public void run() { 5977a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // Check that the new listeners for the new animations gets called for the events. 5987a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(l2.startIsCalled); 5997a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertFalse(l2.cancelIsCalled); 6007a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(l2.endIsCalled); 6017a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(l3.startIsCalled); 6027a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(l3.cancelIsCalled); 6037a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(l3.endIsCalled); 6047a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 6057a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // Check that the listener on the animation that was being clone receive the 6067a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu // animation lifecycle events for the clones. 6077a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(onlyContains(startedAnimators, s1, s2, s3)); 6087a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(onlyContains(canceledAnimators, s3)); 6097a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu assertTrue(onlyContains(endedAnimators, s1, s2, s3)); 6107a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 6117a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu }); 6127a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 6137a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 6147a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 6157a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu /** 6167a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu * Check that the animator list contains exactly the given animators and nothing else. 6177a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu */ 6187a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu private boolean onlyContains(ArrayList<Animator> animators, AnimatorSet... sets) { 6197a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu if (sets.length != animators.size()) { 6207a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu return false; 6217a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 6227a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 6237a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu for (int i = 0; i < sets.length; i++) { 6247a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu AnimatorSet set = sets[i]; 6257a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu if (!animators.contains(set)) { 6267a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu return false; 6277a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 6287a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 6297a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu return true; 6307a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 6317a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu } 6327a1534c139d7e4e98994fa12934be2bee9364c5fDoris Liu 6332bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu // Create an AnimatorSet with all the animators running sequentially 6342bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu private AnimatorSet getSequentialSet() { 6352bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu AnimatorSet set = new AnimatorSet(); 6362bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu set.playSequentially(a1, a2, a3, a4, a5); 6372bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu return set; 6382bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 6392bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 6402bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu private ArrayList<Animator> getAnimatorList() { 6412bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu ArrayList<Animator> list = new ArrayList<>(); 6422bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu list.add(a1); 6432bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu list.add(a2); 6442bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu list.add(a3); 6452bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu list.add(a4); 6462bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu list.add(a5); 6472bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu return list; 6482bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu } 6492bdc0b0517f8d10634616f3f3a4bcafa1e825283Doris Liu 65002f90c57f62f25750d36d73e088f9026d98f27e4Doris Liu} 651