1be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu/*
2be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu* Copyright (C) 2015 The Android Open Source Project
3be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu*
4be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu* Licensed under the Apache License, Version 2.0 (the "License");
5be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu* you may not use this file except in compliance with the License.
6be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu* You may obtain a copy of the License at
7be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu*
8be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu*      http://www.apache.org/licenses/LICENSE-2.0
9be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu*
10be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu* Unless required by applicable law or agreed to in writing, software
11be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu* distributed under the License is distributed on an "AS IS" BASIS,
12be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu* See the License for the specific language governing permissions and
14be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu* limitations under the License.
15be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu*/
16be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liupackage android.animation;
17be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
182822a426ab48f073088e185a94c9d8ee41d7b383Doris Liuimport android.os.Handler;
192822a426ab48f073088e185a94c9d8ee41d7b383Doris Liuimport android.os.Looper;
202822a426ab48f073088e185a94c9d8ee41d7b383Doris Liuimport android.os.Message;
21be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liuimport android.os.SystemClock;
22be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liuimport android.test.ActivityInstrumentationTestCase2;
23be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liuimport android.test.suitebuilder.annotation.SmallTest;
242822a426ab48f073088e185a94c9d8ee41d7b383Doris Liuimport android.view.Choreographer;
252822a426ab48f073088e185a94c9d8ee41d7b383Doris Liuimport android.view.animation.LinearInterpolator;
262822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
272822a426ab48f073088e185a94c9d8ee41d7b383Doris Liuimport java.util.ArrayList;
28be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
29435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liuimport static android.test.MoreAsserts.assertNotEqual;
30435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu
31be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liupublic class ValueAnimatorTests extends ActivityInstrumentationTestCase2<BasicAnimatorActivity> {
322822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    private static final long WAIT_TIME_OUT = 5000;
33be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    private ValueAnimator a1;
34be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    private ValueAnimator a2;
35be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
36be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    // Tolerance of error in calculations related to duration, frame time, etc. due to frame delay.
37be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    private final static long TOLERANCE = 100; // ms
38be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    private final static long POLL_INTERVAL = 100; // ms
39be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
40435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu    private final static float A1_START_VALUE = 0f;
41435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu    private final static float A1_END_VALUE = 1f;
42435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu    private final static int A2_START_VALUE = 100;
43435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu    private final static int A2_END_VALUE = 200;
44435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu
452822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    private final static long DEFAULT_FRAME_INTERVAL = 5; //ms
462822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    private final static long COMMIT_DELAY = 3; //ms
472822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
48be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    public ValueAnimatorTests() {
49be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        super(BasicAnimatorActivity.class);
50be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
51be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
52be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    @Override
53be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    public void setUp() throws Exception {
54be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        super.setUp();
55435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        a1 = ValueAnimator.ofFloat(A1_START_VALUE, A1_END_VALUE).setDuration(300);
56435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        a2 = ValueAnimator.ofInt(A2_START_VALUE, A2_END_VALUE).setDuration(500);
57be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
58be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
59be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    @Override
60be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    public void tearDown() throws Exception {
61be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a1 = null;
62be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a2 = null;
632822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        super.tearDown();
64be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
65be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
66be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    @SmallTest
67be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    public void testStartDelay() throws Throwable {
68be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final ValueAnimator a = ValueAnimator.ofFloat(5f, 20f);
69be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertEquals(a.getStartDelay(), 0);
70be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final long delay = 200;
71be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a.setStartDelay(delay);
72be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertEquals(a.getStartDelay(), delay);
73be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
74be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final MyUpdateListener listener = new MyUpdateListener();
75be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a.addUpdateListener(listener);
76be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final long[] startTime = new long[1];
77be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
78be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
79be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
80be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
81be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                // Test the time between isRunning() and isStarted()
82be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a.isStarted());
83be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a.isRunning());
84be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a.start();
85be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                startTime[0] = SystemClock.uptimeMillis();
86be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a.isStarted());
87be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a.isRunning());
88be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
89be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
90be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
91be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(a.getTotalDuration());
92be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
93be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
94be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
95be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(listener.wasRunning);
96be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(listener.firstRunningFrameTime - startTime[0] >= delay);
97be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
98be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
99be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
100be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(a.getTotalDuration());
101be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
102be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
103be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
104be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a.isStarted());
105be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
106be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
107be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
108be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
109be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    @SmallTest
110be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    public void testListenerCallbacks() throws Throwable {
111be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final MyListener l1 = new MyListener();
112be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final MyListener l2 = new MyListener();
113be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a1.addListener(l1);
114be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a2.addListener(l2);
115be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a2.setStartDelay(400);
116be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
117be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l1.startCalled);
118be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l1.cancelCalled);
119be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l1.endCalled);
120be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l2.startCalled);
121be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l2.cancelCalled);
122be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l2.endCalled);
123be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
124be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
125be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
126be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
127be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a1.start();
128be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a2.start();
129be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
130be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
131be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
132be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        long wait = 0;
133be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(POLL_INTERVAL);
134be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        wait += POLL_INTERVAL;
135be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
136be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
137be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
138be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
139be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(l1.cancelCalled);
140be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a1.cancel();
141be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(l1.cancelCalled);
142be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(l1.endCalled);
143be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
144be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
145be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
146be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        while (wait < a2.getStartDelay()) {
147be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            runTestOnUiThread(new Runnable() {
148be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                @Override
149be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                public void run() {
150be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                    // Make sure a2's start listener isn't called during start delay.
151be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                    assertTrue(l1.startCalled);
152be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                    assertFalse(l2.startCalled);
153be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                }
154be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            });
155be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            Thread.sleep(POLL_INTERVAL);
156be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            wait += POLL_INTERVAL;
157be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        }
158be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
159be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        long delay = Math.max(a1.getTotalDuration(), a2.getTotalDuration()) + TOLERANCE;
160be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(delay);
161be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
162be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
163be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
164be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
165be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                // a1 is canceled.
166be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(l1.startCalled);
167be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(l1.cancelCalled);
168be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(l1.endCalled);
169be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
170be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                // a2 is supposed to finish normally
171be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(l2.startCalled);
172be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(l2.cancelCalled);
173be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(l2.endCalled);
174be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
175be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
176be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
177be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
178be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    @SmallTest
179be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    public void testIsStarted() throws Throwable {
180be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(a1.isStarted());
181be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(a2.isStarted());
182be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(a1.isRunning());
183be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(a2.isRunning());
184be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final long startDelay = 150;
185be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a1.setStartDelay(startDelay);
186be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final long[] startTime = new long[1];
187be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
188be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
189be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
190be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
191be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a1.start();
192be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a2.start();
193be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                startTime[0] = SystemClock.uptimeMillis();
194be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isStarted());
195be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a2.isStarted());
196be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
197be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
198be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        long delayMs = 0;
199be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        while (delayMs < startDelay) {
200be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            Thread.sleep(POLL_INTERVAL);
201be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            delayMs += POLL_INTERVAL;
202be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            runTestOnUiThread(new Runnable() {
203be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                @Override
204be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                public void run() {
205be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                    if (SystemClock.uptimeMillis() - startTime[0] < startDelay) {
206be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                        assertFalse(a1.isRunning());
207be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                    }
208be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                }
209be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            });
210be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        }
211be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
212be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(startDelay);
213be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
214be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
215be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
216be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isRunning());
217be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a2.isRunning());
218be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
219be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
220be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
221be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        long delay = Math.max(a1.getTotalDuration(), a2.getTotalDuration()) * 2;
222be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(delay);
223be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
224be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
225be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
226be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a1.isStarted());
227be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a1.isRunning());
228be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a2.isStarted());
229be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a2.isRunning());
230be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
231be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
232be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
233be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
234be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    @SmallTest
235be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    public void testPause() throws Throwable {
236be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
237be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
238be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
239be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a1.isPaused());
240be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a2.isPaused());
241be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
242be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a1.start();
243be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a2.start();
244be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
245be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a1.isPaused());
246be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a2.isPaused());
247be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isStarted());
248be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a2.isStarted());
249be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
250be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
251be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
252be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(POLL_INTERVAL);
253be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
254be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
255be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
256be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isRunning());
257be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a2.isRunning());
258be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a1.pause();
259be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isPaused());
260be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a2.isPaused());
261be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isRunning());
262be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
263be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
264be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
265be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(a2.getTotalDuration());
266be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
267be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
268be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
269be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                // By this time, a2 should have finished, and a1 is still paused
270be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a2.isStarted());
271be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a2.isRunning());
272be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isStarted());
273be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isRunning());
274be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isPaused());
275be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
276be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a1.resume();
277be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
278be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
279be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
280be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(POLL_INTERVAL);
281be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
282be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
283be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
284be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isRunning());
285be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(a1.isStarted());
286be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a1.isPaused());
287be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
288be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
289be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
290be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(a1.getTotalDuration());
291be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
292be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
293be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
294be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                // a1 should finish by now.
295be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a1.isRunning());
296be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a1.isStarted());
297be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertFalse(a1.isPaused());
298be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
299be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
300be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
301be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
302be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
303be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    @SmallTest
304be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    public void testPauseListener() throws Throwable {
305be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        MyPauseListener l1 = new MyPauseListener();
306be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        MyPauseListener l2 = new MyPauseListener();
307be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a1.addPauseListener(l1);
308be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a2.addPauseListener(l2);
309be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
310be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l1.pauseCalled);
311be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l1.resumeCalled);
312be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l2.pauseCalled);
313be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l2.resumeCalled);
314be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
315be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
316be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
317be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
318be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a1.start();
319be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a2.start();
320be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
321be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
322be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
323be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(a1.getTotalDuration() / 2);
324be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a1.pause();
325be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
326be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(a2.getTotalDuration());
327be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
328be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        // Only a1's pause listener should be called.
329be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertTrue(l1.pauseCalled);
330be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l1.resumeCalled);
331a06b3f19d498e2c387e7a976f94d3cd5f1d77c35George Mount        runTestOnUiThread(new Runnable() {
332a06b3f19d498e2c387e7a976f94d3cd5f1d77c35George Mount            @Override
333a06b3f19d498e2c387e7a976f94d3cd5f1d77c35George Mount            public void run() {
334a06b3f19d498e2c387e7a976f94d3cd5f1d77c35George Mount                a1.resume();
335a06b3f19d498e2c387e7a976f94d3cd5f1d77c35George Mount            }
336a06b3f19d498e2c387e7a976f94d3cd5f1d77c35George Mount        });
337be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
338be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(a1.getTotalDuration());
339be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
340be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertTrue(l1.pauseCalled);
341be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertTrue(l1.resumeCalled);
342be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l2.pauseCalled);
343be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertFalse(l2.resumeCalled);
344be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
345be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
346be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    @SmallTest
347be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    public void testResume() throws Throwable {
348be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final MyUpdateListener l1 = new MyUpdateListener();
349be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final long totalDuration = a1.getTotalDuration();
350be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a1.addUpdateListener(l1);
351be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        // Set a longer duration on a1 for this test
352be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        a1.setDuration(1000);
353be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertTrue(l1.firstRunningFrameTime < 0);
354be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertTrue(l1.lastUpdateTime < 0);
355be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
356be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        final long[] lastUpdate = new long[1];
357be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
358be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
359be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
360be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
361be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a1.start();
362be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
363be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
364be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
365be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(totalDuration / 2);
366be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
367be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
368be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
369be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
370be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(l1.firstRunningFrameTime > 0);
371be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertTrue(l1.lastUpdateTime > l1.firstRunningFrameTime);
372be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                lastUpdate[0] = l1.lastUpdateTime;
373be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a1.pause();
374be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
375be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
376be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
377be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        Thread.sleep(totalDuration);
378be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
379be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        runTestOnUiThread(new Runnable() {
380be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            @Override
381be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            public void run() {
382be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                // There should be no update after pause()
383be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                assertEquals(lastUpdate[0], l1.lastUpdateTime);
384be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                a1.resume();
385be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
386be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        });
387be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
388be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        do {
389be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            Thread.sleep(POLL_INTERVAL);
390be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            runTestOnUiThread(new Runnable() {
391be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                @Override
392be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                public void run() {
393be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                    assertTrue(l1.lastUpdateTime > lastUpdate[0]);
394be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                    lastUpdate[0] = l1.lastUpdateTime;
395be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                }
396be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            });
397be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        } while (!a1.isStarted());
398be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
399be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        // Time between pause and resume: totalDuration
400be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        long entireSpan = totalDuration * 2;
401be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        long frameDelta = l1.lastUpdateTime - l1.firstRunningFrameTime;
402be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        assertTrue(Math.abs(entireSpan - frameDelta) < TOLERANCE);
403be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
404be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
405435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu    @SmallTest
406169cc4c824886f8c0417e64954c310413a71151fDoris Liu    public void testEnd() throws Throwable {
407169cc4c824886f8c0417e64954c310413a71151fDoris Liu        final MyListener l1 = new MyListener();
408169cc4c824886f8c0417e64954c310413a71151fDoris Liu        final MyListener l2 = new MyListener();
409169cc4c824886f8c0417e64954c310413a71151fDoris Liu        a1.addListener(l1);
410169cc4c824886f8c0417e64954c310413a71151fDoris Liu        a2.addListener(l2);
411169cc4c824886f8c0417e64954c310413a71151fDoris Liu        a1.addListener(new MyListener() {
412169cc4c824886f8c0417e64954c310413a71151fDoris Liu            @Override
413169cc4c824886f8c0417e64954c310413a71151fDoris Liu            public void onAnimationEnd(Animator anim) {
414169cc4c824886f8c0417e64954c310413a71151fDoris Liu                anim.cancel();
415169cc4c824886f8c0417e64954c310413a71151fDoris Liu            }
416169cc4c824886f8c0417e64954c310413a71151fDoris Liu        });
417169cc4c824886f8c0417e64954c310413a71151fDoris Liu        a2.addListener(new MyListener() {
418169cc4c824886f8c0417e64954c310413a71151fDoris Liu            @Override
419169cc4c824886f8c0417e64954c310413a71151fDoris Liu            public void onAnimationCancel(Animator anim) {
420169cc4c824886f8c0417e64954c310413a71151fDoris Liu                anim.end();
421169cc4c824886f8c0417e64954c310413a71151fDoris Liu            }
422169cc4c824886f8c0417e64954c310413a71151fDoris Liu        });
423169cc4c824886f8c0417e64954c310413a71151fDoris Liu
424169cc4c824886f8c0417e64954c310413a71151fDoris Liu        runTestOnUiThread(new Runnable() {
425169cc4c824886f8c0417e64954c310413a71151fDoris Liu            @Override
426169cc4c824886f8c0417e64954c310413a71151fDoris Liu            public void run() {
427169cc4c824886f8c0417e64954c310413a71151fDoris Liu                assertFalse(l1.cancelCalled);
428169cc4c824886f8c0417e64954c310413a71151fDoris Liu                assertFalse(l1.endCalled);
429169cc4c824886f8c0417e64954c310413a71151fDoris Liu                assertFalse(l2.cancelCalled);
430169cc4c824886f8c0417e64954c310413a71151fDoris Liu                assertFalse(l2.endCalled);
431169cc4c824886f8c0417e64954c310413a71151fDoris Liu                a1.start();
432169cc4c824886f8c0417e64954c310413a71151fDoris Liu                a2.start();
433169cc4c824886f8c0417e64954c310413a71151fDoris Liu            }
434169cc4c824886f8c0417e64954c310413a71151fDoris Liu        });
435169cc4c824886f8c0417e64954c310413a71151fDoris Liu        Thread.sleep(POLL_INTERVAL);
436169cc4c824886f8c0417e64954c310413a71151fDoris Liu        runTestOnUiThread(new Runnable() {
437169cc4c824886f8c0417e64954c310413a71151fDoris Liu            @Override
438169cc4c824886f8c0417e64954c310413a71151fDoris Liu            public void run() {
439169cc4c824886f8c0417e64954c310413a71151fDoris Liu                a1.end();
440169cc4c824886f8c0417e64954c310413a71151fDoris Liu                a2.cancel();
441169cc4c824886f8c0417e64954c310413a71151fDoris Liu            }
442169cc4c824886f8c0417e64954c310413a71151fDoris Liu        });
443169cc4c824886f8c0417e64954c310413a71151fDoris Liu        Thread.sleep(POLL_INTERVAL);
444169cc4c824886f8c0417e64954c310413a71151fDoris Liu        runTestOnUiThread(new Runnable() {
445169cc4c824886f8c0417e64954c310413a71151fDoris Liu            @Override
446169cc4c824886f8c0417e64954c310413a71151fDoris Liu            public void run() {
447169cc4c824886f8c0417e64954c310413a71151fDoris Liu                // Calling cancel from onAnimationEnd will be ignored.
448169cc4c824886f8c0417e64954c310413a71151fDoris Liu                assertFalse(l1.cancelCalled);
449169cc4c824886f8c0417e64954c310413a71151fDoris Liu                assertTrue(l1.endCalled);
450169cc4c824886f8c0417e64954c310413a71151fDoris Liu                assertTrue(l2.cancelCalled);
451169cc4c824886f8c0417e64954c310413a71151fDoris Liu                assertTrue(l2.endCalled);
452169cc4c824886f8c0417e64954c310413a71151fDoris Liu
453169cc4c824886f8c0417e64954c310413a71151fDoris Liu                float value1 = (Float) a1.getAnimatedValue();
454169cc4c824886f8c0417e64954c310413a71151fDoris Liu                int value2 = (Integer) a2.getAnimatedValue();
455169cc4c824886f8c0417e64954c310413a71151fDoris Liu                assertEquals(A1_END_VALUE, value1);
456169cc4c824886f8c0417e64954c310413a71151fDoris Liu                assertEquals(A2_END_VALUE, value2);
457169cc4c824886f8c0417e64954c310413a71151fDoris Liu            }
458169cc4c824886f8c0417e64954c310413a71151fDoris Liu        });
459169cc4c824886f8c0417e64954c310413a71151fDoris Liu
460169cc4c824886f8c0417e64954c310413a71151fDoris Liu    }
461169cc4c824886f8c0417e64954c310413a71151fDoris Liu
462169cc4c824886f8c0417e64954c310413a71151fDoris Liu    @SmallTest
463435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu    public void testEndValue() throws Throwable {
464435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        final MyListener l1 = new MyListener();
465435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        a1.addListener(l1);
466435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu
467435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        final MyListener l2 = new MyListener();
468435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        a2.addListener(l2);
469435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu
470435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        runTestOnUiThread(new Runnable() {
471435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu            @Override
472435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu            public void run() {
473435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                a1.start();
474435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                a2.start();
475435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu            }
476435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        });
477435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu
478435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        Thread.sleep(POLL_INTERVAL);
479435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        runTestOnUiThread(new Runnable() {
480435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu            @Override
481435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu            public void run() {
482435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                // Animation has started but not finished, check animated values against end values
483435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                assertFalse(l1.endCalled);
484435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                assertFalse(l2.endCalled);
485435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                assertNotEqual(A1_END_VALUE, a1.getAnimatedValue());
486435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                assertNotEqual(A1_END_VALUE, a2.getAnimatedValue());
487435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu
488435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                // Force a2 to end.
489435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                a2.end();
490435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu            }
491435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        });
492435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu
493435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        Thread.sleep(a1.getTotalDuration());
494435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu
495435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        runTestOnUiThread(new Runnable() {
496435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu            @Override
497435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu            public void run() {
498435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                assertFalse(l1.cancelCalled);
499435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                assertTrue(l1.endCalled);
500435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                assertFalse(l2.cancelCalled);
501435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                assertTrue(l2.endCalled);
502435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu
503435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                // By now a1 should have finished normally and a2 has skipped to the end, check
504435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                // their end values.
505435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                assertEquals(A1_END_VALUE, ((Float) (a1.getAnimatedValue())).floatValue());
506435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu                assertEquals(A2_END_VALUE, ((Integer) (a2.getAnimatedValue())).intValue());
507435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu            }
508435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu        });
509435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu    }
510435d2f72b3d8815c6aa12f2de659c4b624fd9345Doris Liu
5112822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    @SmallTest
5122822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    public void testUpdateListener() throws InterruptedException {
5132822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
5142822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final MyFrameCallbackProvider provider = new MyFrameCallbackProvider();
5152822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        long sleep = 0;
5162822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        while (provider.mHandler == null) {
5172822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            Thread.sleep(POLL_INTERVAL);
5182822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            sleep += POLL_INTERVAL;
5192822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            if (sleep > WAIT_TIME_OUT) {
5202822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                break;
5212822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
5222822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        }
5232822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // Either the looper has started, or timed out
5242822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertNotNull(provider.mHandler);
5252822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
5262822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final MyListener listener = new MyListener();
5272822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final MyUpdateListener l1 = new MyUpdateListener() {
5282822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
5292822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void onAnimationUpdate(ValueAnimator animation) {
5302822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                long currentTime = SystemClock.uptimeMillis();
5312822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                long frameDelay = provider.getFrameDelay();
5322822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                if (lastUpdateTime > 0) {
5332822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                    // Error tolerance here is one frame.
5342822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                    assertTrue((currentTime - lastUpdateTime) < frameDelay * 2);
5352822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                } else {
5362822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                    // First frame:
5372822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                    assertTrue(listener.startCalled);
5382822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                    assertTrue(listener.startTime > 0);
5392822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                    assertTrue(currentTime - listener.startTime < frameDelay * 2);
5402822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                }
5412822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                super.onAnimationUpdate(animation);
5422822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
5432822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        };
5442822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a1.addUpdateListener(l1);
5452822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a1.addListener(listener);
5462822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a1.setStartDelay(100);
5472822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
5482822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        provider.mHandler.post(new Runnable() {
5492822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
5502822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
5512822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                AnimationHandler.getInstance().setProvider(provider);
5522822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a1.start();
5532822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
5542822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
5552822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        Thread.sleep(POLL_INTERVAL);
5562822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertTrue(a1.isStarted());
5572822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        Thread.sleep(a1.getTotalDuration() + TOLERANCE);
5582822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // Finished by now.
5592822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertFalse(a1.isStarted());
5602822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertTrue(listener.endTime > 0);
5612822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
5622822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // Check the time difference between last frame and end time.
5632822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertTrue(listener.endTime >= l1.lastUpdateTime);
5642822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertTrue(listener.endTime - l1.lastUpdateTime < 2 * provider.getFrameDelay());
5652822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    }
5662822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
5672822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
5682822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    @SmallTest
5692822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    public void testConcurrentModification() throws Throwable {
5702822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // Attempt to modify list of animations as the list is being iterated
5712822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final ValueAnimator a0 = ValueAnimator.ofInt(100, 200).setDuration(500);
5722822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final ValueAnimator a3 = ValueAnimator.ofFloat(0, 1).setDuration(500);
5732822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final ValueAnimator a4 = ValueAnimator.ofInt(200, 300).setDuration(500);
5742822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final MyListener listener = new MyListener() {
5752822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
5762822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void onAnimationEnd(Animator anim) {
5772822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                super.onAnimationEnd(anim);
5782822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                // AnimationHandler should be iterating the list at the moment, end/cancel all
5792822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                // the other animations. No ConcurrentModificationException should happen.
5802822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a0.cancel();
5812822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a1.end();
5822822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a3.end();
5832822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a4.cancel();
5842822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
5852822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        };
5862822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a2.addListener(listener);
5872822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
5882822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        runTestOnUiThread(new Runnable() {
5892822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
5902822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
5912822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a0.start();
5922822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a1.start();
5932822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a2.start();
5942822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a3.start();
5952822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a4.start();
5962822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
5972822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
5982822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        runTestOnUiThread(new Runnable() {
5992822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
6002822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
6012822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a0.isStarted());
6022822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a1.isStarted());
6032822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a2.isStarted());
6042822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a3.isStarted());
6052822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a4.isStarted());
6062822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
6072822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
6082822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        Thread.sleep(POLL_INTERVAL);
6092822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        runTestOnUiThread(new Runnable() {
6102822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
6112822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
6122822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                // End the animator that should be in the middle of the list.
6132822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a2.end();
6142822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
6152822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
6162822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        Thread.sleep(POLL_INTERVAL);
6172822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertTrue(listener.endCalled);
6182822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertFalse(a0.isStarted());
6192822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertFalse(a1.isStarted());
6202822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertFalse(a2.isStarted());
6212822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertFalse(a3.isStarted());
6222822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        assertFalse(a4.isStarted());
6232822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    }
6242822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
6252822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    @SmallTest
62668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu    public void testSeek() throws Throwable {
6272822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final MyListener l1 = new MyListener();
6282822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final MyListener l2 = new MyListener();
6292822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final MyUpdateListener updateListener1 = new MyUpdateListener();
6302822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final MyUpdateListener updateListener2 = new MyUpdateListener();
6312822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final float a1StartFraction = 0.2f;
6322822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final float a2StartFraction = 0.3f;
6332822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
6342822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // Extend duration so we have plenty of latitude to manipulate the animations when they
6352822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // are running.
6362822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a1.setDuration(1000);
6372822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a2.setDuration(1000);
6382822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a1.addListener(l1);
6392822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a2.addListener(l2);
6402822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a1.addUpdateListener(updateListener1);
6412822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a2.addUpdateListener(updateListener2);
6422822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        TimeInterpolator interpolator = new LinearInterpolator();
6432822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a1.setInterpolator(interpolator);
6442822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        a2.setInterpolator(interpolator);
6452822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
6462822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        runTestOnUiThread(new Runnable() {
6472822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
6482822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
6492822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a1.isStarted());
6502822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a1.isRunning());
6512822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a2.isStarted());
6522822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a2.isRunning());
6532822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
6542822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                // Test isRunning() and isStarted() before and after seek
6552822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a1.setCurrentFraction(a1StartFraction);
6562822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a2.setCurrentFraction(a2StartFraction);
6572822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
6582822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a1.isStarted());
6592822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a1.isRunning());
6602822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a2.isStarted());
6612822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a2.isRunning());
6622822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
6632822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
6642822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        Thread.sleep(POLL_INTERVAL);
6652822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
6662822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // Start animation and seek during the animation.
6672822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        runTestOnUiThread(new Runnable() {
6682822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
6692822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
6702822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a1.isStarted());
6712822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a1.isRunning());
6722822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a2.isStarted());
6732822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a2.isRunning());
6742822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertEquals(a1StartFraction, a1.getAnimatedFraction());
6752822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertEquals(a2StartFraction, a2.getAnimatedFraction());
6762822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
6772822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a1.start();
6782822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a2.start();
6792822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
6802822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
6812822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
6822822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        Thread.sleep(POLL_INTERVAL);
6832822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final float halfwayFraction = 0.5f;
6842822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        runTestOnUiThread(new Runnable() {
6852822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
6862822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
6872822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(l1.startCalled);
6882822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(l2.startCalled);
6892822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(l1.endCalled);
6902822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(l2.endCalled);
6912822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
6922822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                // Check whether the animations start from the seeking fraction
6932822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(updateListener1.startFraction >= a1StartFraction);
6942822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(updateListener2.startFraction >= a2StartFraction);
6952822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
6962822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a1.isStarted());
6972822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a1.isRunning());
6982822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a2.isStarted());
6992822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a2.isRunning());
7002822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
7012822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a1.setCurrentFraction(halfwayFraction);
7022822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a2.setCurrentFraction(halfwayFraction);
7032822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
7042822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
7052822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
7062822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        Thread.sleep(POLL_INTERVAL);
7072822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
7082822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // Check that seeking during running doesn't change animation's internal state
7092822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        runTestOnUiThread(new Runnable() {
7102822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
7112822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
7122822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(l1.startCalled);
7132822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(l2.startCalled);
7142822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(l1.endCalled);
7152822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(l2.endCalled);
7162822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
7172822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a1.isStarted());
7182822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a1.isRunning());
7192822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a2.isStarted());
7202822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(a2.isRunning());
7212822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
7222822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
7232822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
7242822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // Wait until the animators finish successfully.
7252822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        long wait = Math.max(a1.getTotalDuration(), a2.getTotalDuration());
7262822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        Thread.sleep(wait);
7272822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
7282822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        runTestOnUiThread(new Runnable() {
7292822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
7302822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
7312822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                // Verify that the animators have finished.
7322822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(l1.endCalled);
7332822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(l2.endCalled);
7342822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
7352822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a1.isStarted());
7362822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a2.isStarted());
7372822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a1.isRunning());
7382822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertFalse(a2.isRunning());
7392822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
7402822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
7412822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
7422822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // Re-start animator a1 after it ends normally, and check that seek value from last run
7432822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        // does not affect the new run.
7442822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        updateListener1.reset();
7452822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        runTestOnUiThread(new Runnable() {
7462822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
7472822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
7482822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a1.start();
7492822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
7502822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
7512822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
7522822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        Thread.sleep(POLL_INTERVAL);
7532822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        runTestOnUiThread(new Runnable() {
7542822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            @Override
7552822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
7562822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(updateListener1.wasRunning);
7572822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(updateListener1.startFraction >= 0);
7582822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                assertTrue(updateListener1.startFraction < halfwayFraction);
7592822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                a1.end();
7602822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
7612822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        });
7622822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
7632822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    }
7642822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
76568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu    @SmallTest
76668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu    public void testSeekWhileRunning() throws Throwable {
76768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        // Seek one animator to the beginning and the other one to the end when they are running.
76868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        final MyListener l1 = new MyListener();
76968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        final MyListener l2 = new MyListener();
77068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a1.addListener(l1);
77168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a2.addListener(l2);
77268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        runTestOnUiThread(new Runnable() {
77368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            @Override
77468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            public void run() {
77568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l1.startCalled);
77668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l2.startCalled);
77768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(0f, a1.getAnimatedFraction());
77868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(0f, a2.getAnimatedFraction());
77968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a1.start();
78068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a2.start();
78168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            }
78268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        });
78368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        Thread.sleep(POLL_INTERVAL);
78468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        runTestOnUiThread(new Runnable() {
78568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            @Override
78668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            public void run() {
78768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l1.endCalled);
78868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l2.endCalled);
78968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(a1.isRunning());
79068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(a2.isRunning());
79168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                // During the run, seek one to the beginning, the other to the end
79268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a1.setCurrentFraction(0f);
79368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a2.setCurrentFraction(1f);
79468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            }
79568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        });
79668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        Thread.sleep(POLL_INTERVAL);
79768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        runTestOnUiThread(new Runnable() {
79868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            @Override
79968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            public void run() {
80068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                // Check that a2 has finished due to the seeking, but a1 hasn't finished.
80168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l1.endCalled);
80268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l2.endCalled);
80368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(1f, a2.getAnimatedFraction());
80468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            }
80568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        });
80668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
80768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        Thread.sleep(a1.getTotalDuration());
80868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        runTestOnUiThread(new Runnable() {
80968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            @Override
81068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            public void run() {
81168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                // By now a1 should finish also.
81268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l1.endCalled);
81368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(1f, a1.getAnimatedFraction());
81468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            }
81568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        });
81668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu    }
81768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
81868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu    @SmallTest
81981963e3d560596916023173e31ed38f8f6e9001fDoris Liu    public void testEndBeforeStart() throws Throwable {
82081963e3d560596916023173e31ed38f8f6e9001fDoris Liu        // This test calls two animators that are not yet started. One animator has completed a
82181963e3d560596916023173e31ed38f8f6e9001fDoris Liu        // previous run but hasn't started since then, the other one has never run. When end() is
82281963e3d560596916023173e31ed38f8f6e9001fDoris Liu        // called on these two animators, we expected their animation listeners to receive both
82381963e3d560596916023173e31ed38f8f6e9001fDoris Liu        // onAnimationStarted(Animator) and onAnimationEnded(Animator) callbacks, in that sequence.
82481963e3d560596916023173e31ed38f8f6e9001fDoris Liu
82581963e3d560596916023173e31ed38f8f6e9001fDoris Liu        a1.setStartDelay(20);
82681963e3d560596916023173e31ed38f8f6e9001fDoris Liu
82781963e3d560596916023173e31ed38f8f6e9001fDoris Liu        // First start a1's first run.
82881963e3d560596916023173e31ed38f8f6e9001fDoris Liu        final MyListener normalEndingListener = new MyListener();
82981963e3d560596916023173e31ed38f8f6e9001fDoris Liu        a1.addListener(normalEndingListener);
83081963e3d560596916023173e31ed38f8f6e9001fDoris Liu        runTestOnUiThread(new Runnable() {
83181963e3d560596916023173e31ed38f8f6e9001fDoris Liu            @Override
83281963e3d560596916023173e31ed38f8f6e9001fDoris Liu            public void run() {
83381963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(a1.isStarted());
83481963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(normalEndingListener.startCalled);
83581963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(normalEndingListener.endCalled);
83681963e3d560596916023173e31ed38f8f6e9001fDoris Liu                // Start normally
83781963e3d560596916023173e31ed38f8f6e9001fDoris Liu                a1.start();
83881963e3d560596916023173e31ed38f8f6e9001fDoris Liu            }
83981963e3d560596916023173e31ed38f8f6e9001fDoris Liu        });
84081963e3d560596916023173e31ed38f8f6e9001fDoris Liu
84181963e3d560596916023173e31ed38f8f6e9001fDoris Liu        Thread.sleep(a1.getTotalDuration() + POLL_INTERVAL);
84281963e3d560596916023173e31ed38f8f6e9001fDoris Liu
84381963e3d560596916023173e31ed38f8f6e9001fDoris Liu        // a1 should have finished by now.
84481963e3d560596916023173e31ed38f8f6e9001fDoris Liu        runTestOnUiThread(new Runnable() {
84581963e3d560596916023173e31ed38f8f6e9001fDoris Liu            @Override
84681963e3d560596916023173e31ed38f8f6e9001fDoris Liu            public void run() {
84781963e3d560596916023173e31ed38f8f6e9001fDoris Liu                // Call end() on both a1 and a2 without calling start()
84881963e3d560596916023173e31ed38f8f6e9001fDoris Liu                final MyListener l1 = new MyListener();
84981963e3d560596916023173e31ed38f8f6e9001fDoris Liu                a1.addListener(l1);
85081963e3d560596916023173e31ed38f8f6e9001fDoris Liu                final MyListener l2 = new MyListener();
85181963e3d560596916023173e31ed38f8f6e9001fDoris Liu                a2.addListener(l2);
85281963e3d560596916023173e31ed38f8f6e9001fDoris Liu
85381963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(a1.isStarted());
85481963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(l1.startCalled);
85581963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(l1.endCalled);
85681963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(a2.isStarted());
85781963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(l2.startCalled);
85881963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(l1.endCalled);
85981963e3d560596916023173e31ed38f8f6e9001fDoris Liu
86081963e3d560596916023173e31ed38f8f6e9001fDoris Liu                a1.end();
86181963e3d560596916023173e31ed38f8f6e9001fDoris Liu                a2.end();
86281963e3d560596916023173e31ed38f8f6e9001fDoris Liu
86381963e3d560596916023173e31ed38f8f6e9001fDoris Liu                // Check that both animators' listeners have received the animation callbacks.
86481963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertTrue(l1.startCalled);
86581963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertTrue(l1.endCalled);
86681963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(a1.isStarted());
86781963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertTrue(l1.endTime >= l1.startTime);
86881963e3d560596916023173e31ed38f8f6e9001fDoris Liu
86981963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertTrue(l2.startCalled);
87081963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertTrue(l2.endCalled);
87181963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertFalse(a2.isStarted());
87281963e3d560596916023173e31ed38f8f6e9001fDoris Liu                assertTrue(l2.endTime >= l1.startTime);
87381963e3d560596916023173e31ed38f8f6e9001fDoris Liu            }
87481963e3d560596916023173e31ed38f8f6e9001fDoris Liu        });
87581963e3d560596916023173e31ed38f8f6e9001fDoris Liu    }
87681963e3d560596916023173e31ed38f8f6e9001fDoris Liu
87781963e3d560596916023173e31ed38f8f6e9001fDoris Liu    @SmallTest
87868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu    public void testZeroDuration() throws Throwable {
87968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        // Run two animators with zero duration, with one running forward and the other one
88068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        // backward. Check that the animations start and finish with the correct end fractions.
88168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a1.setDuration(0);
88268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a2.setDuration(0);
88368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
88468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        // Set a fraction on an animation with 0-duration
88568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        final ValueAnimator a3 = ValueAnimator.ofInt(0, 100);
88668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a3.setDuration(0);
88768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a3.setCurrentFraction(1.0f);
88868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        assertEquals(1.0f, a3.getAnimatedFraction());
88968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
89068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        final MyListener l1 = new MyListener();
89168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        final MyListener l2 = new MyListener();
89268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        final MyListener l3 = new MyListener();
89368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a1.addListener(l1);
89468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a2.addListener(l2);
89568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a3.addListener(l3);
89668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        runTestOnUiThread(new Runnable() {
89768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            @Override
89868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            public void run() {
89968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l1.startCalled);
90068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l2.startCalled);
90168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l3.startCalled);
90268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l1.endCalled);
90368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l2.endCalled);
90468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l3.endCalled);
90568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a1.start();
90668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a2.reverse();
90768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a3.start();
90840428c8dc2ca9425bf0b0bf6eedb90bb487433efDoris Liu                // Check that the animators' values are immediately set to end value in the case of
90940428c8dc2ca9425bf0b0bf6eedb90bb487433efDoris Liu                // 0-duration.
91040428c8dc2ca9425bf0b0bf6eedb90bb487433efDoris Liu                assertEquals(A1_END_VALUE, a1.getAnimatedValue());
91140428c8dc2ca9425bf0b0bf6eedb90bb487433efDoris Liu                assertEquals(A2_START_VALUE, a2.getAnimatedValue());
91268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            }
91368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        });
91468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        Thread.sleep(POLL_INTERVAL);
91568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        runTestOnUiThread(new Runnable() {
91668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            @Override
91768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            public void run() {
91868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                // Check that the animators have started and finished with the right values.
91968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l1.startCalled);
92068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l2.startCalled);
92168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l3.startCalled);
92268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l1.endCalled);
92368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l2.endCalled);
92468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l3.endCalled);
92568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(1.0f, a1.getAnimatedFraction());
92668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(0f, a2.getAnimatedFraction());
92768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(1f, a3.getAnimatedFraction());
92868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(A1_END_VALUE, a1.getAnimatedValue());
92968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(A2_START_VALUE, a2.getAnimatedValue());
93068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(100, a3.getAnimatedValue());
93168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            }
93268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        });
93368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu    }
93468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
93568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu    @SmallTest
936a0942e212154655c16849a9c6218f54694b4203aDoris Liu    public void testZeroScale() throws Throwable {
937a0942e212154655c16849a9c6218f54694b4203aDoris Liu        // Test whether animations would end properly when the scale is forced to be zero
938a0942e212154655c16849a9c6218f54694b4203aDoris Liu        float scale = ValueAnimator.getDurationScale();
939a0942e212154655c16849a9c6218f54694b4203aDoris Liu        ValueAnimator.setDurationScale(0f);
940a0942e212154655c16849a9c6218f54694b4203aDoris Liu
941a0942e212154655c16849a9c6218f54694b4203aDoris Liu        // Run two animators, one of which has a start delay, after setting the duration scale to 0
942a0942e212154655c16849a9c6218f54694b4203aDoris Liu        a1.setStartDelay(200);
943a0942e212154655c16849a9c6218f54694b4203aDoris Liu        final MyListener l1 =  new MyListener();
944a0942e212154655c16849a9c6218f54694b4203aDoris Liu        final MyListener l2 = new MyListener();
945a0942e212154655c16849a9c6218f54694b4203aDoris Liu        a1.addListener(l1);
946a0942e212154655c16849a9c6218f54694b4203aDoris Liu        a2.addListener(l2);
947a0942e212154655c16849a9c6218f54694b4203aDoris Liu
948a0942e212154655c16849a9c6218f54694b4203aDoris Liu        runTestOnUiThread(new Runnable() {
949a0942e212154655c16849a9c6218f54694b4203aDoris Liu            @Override
950a0942e212154655c16849a9c6218f54694b4203aDoris Liu            public void run() {
951a0942e212154655c16849a9c6218f54694b4203aDoris Liu                assertFalse(l1.startCalled);
952a0942e212154655c16849a9c6218f54694b4203aDoris Liu                assertFalse(l2.startCalled);
953a0942e212154655c16849a9c6218f54694b4203aDoris Liu                assertFalse(l1.endCalled);
954a0942e212154655c16849a9c6218f54694b4203aDoris Liu                assertFalse(l2.endCalled);
955a0942e212154655c16849a9c6218f54694b4203aDoris Liu
956a0942e212154655c16849a9c6218f54694b4203aDoris Liu                a1.start();
957a0942e212154655c16849a9c6218f54694b4203aDoris Liu                a2.start();
95840428c8dc2ca9425bf0b0bf6eedb90bb487433efDoris Liu
95940428c8dc2ca9425bf0b0bf6eedb90bb487433efDoris Liu                // In the case of 0 duration scale applied to a non-0 duration, check that the
96040428c8dc2ca9425bf0b0bf6eedb90bb487433efDoris Liu                // value is immediately set to the start value.
96140428c8dc2ca9425bf0b0bf6eedb90bb487433efDoris Liu                assertEquals(A2_START_VALUE, a2.getAnimatedValue());
962a0942e212154655c16849a9c6218f54694b4203aDoris Liu            }
963a0942e212154655c16849a9c6218f54694b4203aDoris Liu        });
964a0942e212154655c16849a9c6218f54694b4203aDoris Liu        Thread.sleep(POLL_INTERVAL);
965a0942e212154655c16849a9c6218f54694b4203aDoris Liu
966a0942e212154655c16849a9c6218f54694b4203aDoris Liu        runTestOnUiThread(new Runnable() {
967a0942e212154655c16849a9c6218f54694b4203aDoris Liu            @Override
968a0942e212154655c16849a9c6218f54694b4203aDoris Liu            public void run() {
969a0942e212154655c16849a9c6218f54694b4203aDoris Liu                assertTrue(l1.startCalled);
970a0942e212154655c16849a9c6218f54694b4203aDoris Liu                assertTrue(l2.startCalled);
971a0942e212154655c16849a9c6218f54694b4203aDoris Liu                assertTrue(l1.endCalled);
972a0942e212154655c16849a9c6218f54694b4203aDoris Liu                assertTrue(l2.endCalled);
97340428c8dc2ca9425bf0b0bf6eedb90bb487433efDoris Liu                assertEquals(A1_END_VALUE, a1.getAnimatedValue());
97440428c8dc2ca9425bf0b0bf6eedb90bb487433efDoris Liu                assertEquals(A2_END_VALUE, a2.getAnimatedValue());
975a0942e212154655c16849a9c6218f54694b4203aDoris Liu            }
976a0942e212154655c16849a9c6218f54694b4203aDoris Liu        });
977a0942e212154655c16849a9c6218f54694b4203aDoris Liu
978a0942e212154655c16849a9c6218f54694b4203aDoris Liu        // Restore duration scale
979a0942e212154655c16849a9c6218f54694b4203aDoris Liu        ValueAnimator.setDurationScale(scale);
980a0942e212154655c16849a9c6218f54694b4203aDoris Liu    }
981a0942e212154655c16849a9c6218f54694b4203aDoris Liu
982a0942e212154655c16849a9c6218f54694b4203aDoris Liu    @SmallTest
98368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu    public void testReverse() throws Throwable {
98468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        // Prolong animators duration so that we can do multiple checks during their run
98568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        final ValueAnimator a3 = ValueAnimator.ofInt(0, 100);
98668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a1.setDuration(400);
98768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a2.setDuration(600);
98868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a3.setDuration(400);
98968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        final MyListener l1 = new MyListener();
99068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        final MyListener l2 = new MyListener();
99168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        final MyListener l3 = new MyListener();
99268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a1.addListener(l1);
99368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a2.addListener(l2);
99468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        a3.addListener(l3);
99568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
99668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        // Reverse three animators, seek one to the beginning and another to the end, and force
99768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        // to end the third one during reversing.
99868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        runTestOnUiThread(new Runnable() {
99968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            @Override
100068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            public void run() {
100168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l1.startCalled);
100268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l2.startCalled);
100368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l3.startCalled);
100468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l1.endCalled);
100568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l2.endCalled);
100668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l3.endCalled);
100768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a1.reverse();
100868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a2.reverse();
100968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a3.reverse();
101068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            }
101168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        });
101268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        Thread.sleep(POLL_INTERVAL);
101368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        runTestOnUiThread(new Runnable() {
101468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            @Override
101568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            public void run() {
101668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l1.startCalled);
101768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l2.startCalled);
101868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l3.startCalled);
101968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
102068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a1.setCurrentFraction(0f);
102168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a2.setCurrentFraction(1f);
102268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                a3.end();
102368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
102468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                // Check that the fraction has been set, and the getter returns the correct values.
102568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(1f, a1.getAnimatedFraction());
102668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(0f, a2.getAnimatedFraction());
102768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            }
102868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        });
102968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        Thread.sleep(POLL_INTERVAL);
103068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
103168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        // By now, a2 should have finished due to the seeking. It wouldn't have finished otherwise.
103268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        runTestOnUiThread(new Runnable() {
103368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            @Override
103468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            public void run() {
103568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                // Check that both animations have started, and a2 has finished.
103668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertFalse(l1.endCalled);
103768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l2.endCalled);
103868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l3.endCalled);
103968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            }
104068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        });
104168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        Thread.sleep(a1.getTotalDuration());
104268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
104368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        runTestOnUiThread(new Runnable() {
104468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            @Override
104568dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            public void run() {
104668dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                // Verify that a1 has finished as well.
104768dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertTrue(l1.endCalled);
104868dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(0f, a1.getAnimatedFraction());
104968dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(0f, a2.getAnimatedFraction());
105068dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu                assertEquals(0f, a3.getAnimatedFraction());
105168dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu            }
105268dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu        });
105368dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu    }
105468dcb30c2797e1b5546e37590dc43d9e6e0f1f42Doris Liu
1055be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    class MyUpdateListener implements ValueAnimator.AnimatorUpdateListener {
1056be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        boolean wasRunning = false;
1057be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        long firstRunningFrameTime = -1;
1058be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        long lastUpdateTime = -1;
10592822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        float startFraction = 0;
1060be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
1061be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        @Override
1062be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        public void onAnimationUpdate(ValueAnimator animation) {
1063be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            lastUpdateTime = SystemClock.uptimeMillis();
1064be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            if (animation.isRunning() && !wasRunning) {
1065be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                // Delay has passed
1066be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                firstRunningFrameTime = lastUpdateTime;
10672822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                startFraction = animation.getAnimatedFraction();
1068be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu                wasRunning = animation.isRunning();
1069be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            }
1070be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        }
10712822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
10722822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        void reset() {
10732822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            wasRunning = false;
10742822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            firstRunningFrameTime = -1;
10752822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            lastUpdateTime = -1;
10762822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            startFraction = 0;
10772822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        }
1078be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
1079be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
1080be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    class MyListener implements Animator.AnimatorListener {
1081be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        boolean startCalled = false;
1082be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        boolean cancelCalled = false;
1083be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        boolean endCalled = false;
10842822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        long startTime = -1;
10852822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        long endTime = -1;
1086be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
1087be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        @Override
1088be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        public void onAnimationStart(Animator animation) {
1089be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            startCalled = true;
10902822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            startTime = SystemClock.uptimeMillis();
1091be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        }
1092be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
1093be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        @Override
1094be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        public void onAnimationEnd(Animator animation) {
1095be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            endCalled = true;
10962822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            endTime = SystemClock.uptimeMillis();
1097be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        }
1098be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
1099be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        @Override
1100be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        public void onAnimationCancel(Animator animation) {
1101be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            cancelCalled = true;
1102be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        }
1103be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
1104be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        @Override
1105be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        public void onAnimationRepeat(Animator animation) {
1106be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
1107be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        }
1108be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
1109be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
1110be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    class MyPauseListener implements Animator.AnimatorPauseListener {
1111be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        boolean pauseCalled = false;
1112be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        boolean resumeCalled = false;
1113be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
1114be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        @Override
1115be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        public void onAnimationPause(Animator animation) {
1116be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            pauseCalled = true;
1117be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        }
1118be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu
1119be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        @Override
1120be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        public void onAnimationResume(Animator animation) {
1121be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu            resumeCalled = true;
1122be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu        }
1123be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu    }
11242822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
11252822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    class MyFrameCallbackProvider implements AnimationHandler.AnimationFrameCallbackProvider {
11262822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
11272822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        Handler mHandler = null;
11282822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        private final static int MSG_FRAME = 0;
11292822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        private long mFrameDelay = DEFAULT_FRAME_INTERVAL;
11302822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        private ArrayList<Choreographer.FrameCallback> mFrameCallbacks = new ArrayList<>();
11312822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
11322822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        final LooperThread mThread = new LooperThread();
11332822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
11342822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        public MyFrameCallbackProvider() {
11352822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            mThread.start();
11362822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        }
11372822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
11382822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        @Override
11392822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        public void postFrameCallback(Choreographer.FrameCallback callback) {
11402822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            mHandler.sendEmptyMessageDelayed(MSG_FRAME, mFrameDelay);
11412822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            if (!mFrameCallbacks.contains(callback)) {
11422822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                mFrameCallbacks.add(callback);
11432822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
11442822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        }
11452822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
11462822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        @Override
11472822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        public void postCommitCallback(Runnable runnable) {
11482822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            // Run the runnable after a commit delay
11492822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            mHandler.postDelayed(runnable, COMMIT_DELAY);
11502822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        }
11512822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
11522822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        @Override
11532822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        public long getFrameTime() {
11542822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            return SystemClock.uptimeMillis();
11552822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        }
11562822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
11572822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        @Override
11582822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        public long getFrameDelay() {
11592822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            return mFrameDelay;
11602822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        }
11612822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
11622822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        @Override
11632822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        public void setFrameDelay(long delay) {
11642822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            mFrameDelay = delay;
11652822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            if (mFrameCallbacks.size() != 0) {
11662822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                mHandler.removeMessages(MSG_FRAME);
11672822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                mHandler.sendEmptyMessageDelayed(MSG_FRAME, mFrameDelay);
11682822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
11692822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        }
11702822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu
11712822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        class LooperThread extends Thread {
11722822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            public void run() {
11732822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                Looper.prepare();
11742822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                mHandler = new Handler() {
11752822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                    public void handleMessage(Message msg) {
11762822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                        // Handle message here.
11772822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                        switch (msg.what) {
11782822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                            case MSG_FRAME:
11792822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                                for (int i = 0; i < mFrameCallbacks.size(); i++) {
11802822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                                    mFrameCallbacks.get(i).doFrame(SystemClock.uptimeMillis());
11812822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                                }
11822822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                                break;
11832822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                            default:
11842822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                                break;
11852822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                        }
11862822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                    }
11872822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                };
11882822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu                Looper.loop();
11892822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu            }
11902822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu        }
11912822a426ab48f073088e185a94c9d8ee41d7b383Doris Liu    }
1192be5a8ac55d8f3cfcfb549d379334cf9a4320b0d9Doris Liu}
1193