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