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