17dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase/* 27dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Copyright (C) 2011 The Android Open Source Project 37dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * 47dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 57dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * you may not use this file except in compliance with the License. 67dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * You may obtain a copy of the License at 77dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * 87dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 97dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * 107dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Unless required by applicable law or agreed to in writing, software 117dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 127dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * See the License for the specific language governing permissions and 147dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * limitations under the License. 157dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 167dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haasepackage android.animation; 177dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 187dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haaseimport android.os.Handler; 197dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haaseimport android.test.ActivityInstrumentationTestCase2; 207dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haaseimport android.test.UiThreadTest; 217dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haaseimport android.test.suitebuilder.annotation.MediumTest; 227dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haaseimport android.test.suitebuilder.annotation.SmallTest; 237dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 24b8f574a165bf6ec5b316734b367ac274ded4809bChet Haaseimport java.util.concurrent.TimeUnit; 25b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 267dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase/** 277dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Tests for the various lifecycle events of Animators. This abstract class is subclassed by 287dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * concrete implementations that provide the actual Animator objects being tested. All of the 297dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * testing mechanisms are in this class; the subclasses are only responsible for providing 307dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * the mAnimator object. 317dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * 327dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * This test is more complicated than a typical synchronous test because much of the functionality 337dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * must happen on the UI thread. Some tests do this by using the UiThreadTest annotation to 347dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * automatically run the whole test on that thread. Other tests must run on the UI thread and also 357dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * wait for some later event to occur before ending. These tests use a combination of an 367dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * AbstractFuture mechanism and a delayed action to release that Future later. 377dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 387dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haasepublic abstract class EventsTest 397dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase extends ActivityInstrumentationTestCase2<BasicAnimatorActivity> { 407dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 418b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected static final int ANIM_DURATION = 400; 428b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected static final int ANIM_DELAY = 100; 438b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected static final int ANIM_MID_DURATION = ANIM_DURATION / 2; 448b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected static final int ANIM_MID_DELAY = ANIM_DELAY / 2; 458b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected static final int FUTURE_RELEASE_DELAY = 50; 467dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 47b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase private boolean mStarted; // tracks whether we've received the onAnimationStart() callback 488b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected boolean mRunning; // tracks whether we've started the animator 497dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase private boolean mCanceled; // trackes whether we've canceled the animator 508b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected Animator.AnimatorListener mFutureListener; // mechanism for delaying the end of the test 518b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected FutureWaiter mFuture; // Mechanism for waiting for the UI test to complete 527dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase private Animator.AnimatorListener mListener; // Listener that handles/tests the events 537dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 547dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase protected Animator mAnimator; // The animator used in the tests. Must be set in subclass 557dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase // setup() method prior to calling the superclass setup() 567dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 577dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase /** 58b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Cancels the given animator. Used to delay cancellation until some later time (after the 597dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * animator has started playing). 607dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 618b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected static class Canceler implements Runnable { 627dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase Animator mAnim; 63b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase FutureWaiter mFuture; 64b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public Canceler(Animator anim, FutureWaiter future) { 65b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnim = anim; 66b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture = future; 67b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 68b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 69b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 70b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 71b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnim.cancel(); 72b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 73b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 74b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 75b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 76b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }; 77b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 78b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 798b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase * Timeout length, based on when the animation should reasonably be complete. 808b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase */ 818b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected long getTimeout() { 828b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase return ANIM_DURATION + ANIM_DELAY + FUTURE_RELEASE_DELAY; 838b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase } 848b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase 858b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase /** 86b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Ends the given animator. Used to delay ending until some later time (after the 87b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * animator has started playing). 88b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 89b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase static class Ender implements Runnable { 90b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase Animator mAnim; 91b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase FutureWaiter mFuture; 92b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public Ender(Animator anim, FutureWaiter future) { 937dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnim = anim; 94b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture = future; 957dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 967dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @Override 977dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void run() { 98b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 99b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnim.end(); 100b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 101b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 102b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 1037dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 1047dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase }; 1057dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 1067dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase /** 1077dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Releases the given Future object when the listener's end() event is called. Specifically, 1087dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * it releases it after some further delay, to give the test time to do other things right 1097dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * after an animation ends. 1107dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 1118b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase protected static class FutureReleaseListener extends AnimatorListenerAdapter { 1127dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase FutureWaiter mFuture; 1137dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 1147dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public FutureReleaseListener(FutureWaiter future) { 1157dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFuture = future; 1167dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 117b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 118b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 119b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Variant constructor that auto-releases the FutureWaiter after the specified timeout. 120b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * @param future 121b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * @param timeout 122b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 123b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public FutureReleaseListener(FutureWaiter future, long timeout) { 124b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture = future; 125b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase Handler handler = new Handler(); 126b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase handler.postDelayed(new Runnable() { 127b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 128b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 129b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.release(); 130b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 131b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }, timeout); 132b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 133b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 1347dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @Override 1357dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void onAnimationEnd(Animator animation) { 1367dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase Handler handler = new Handler(); 1377dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase handler.postDelayed(new Runnable() { 1387dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @Override 1397dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void run() { 1407dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFuture.release(); 1417dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 142b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }, FUTURE_RELEASE_DELAY); 1437dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 1447dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase }; 1457dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 1467dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public EventsTest() { 1477dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase super(BasicAnimatorActivity.class); 1487dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 1497dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 1507dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase /** 1517dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Sets up the fields used by each test. Subclasses must override this method to create 1527dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * the protected mAnimator object used in all tests. Overrides must create that animator 1537dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * and then call super.setup(), where further properties are set on that animator. 1547dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * @throws Exception 1557dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 1567dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @Override 1577dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void setUp() throws Exception { 1587dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase super.setUp(); 1597dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 1607dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase // mListener is the main testing mechanism of this file. The asserts of each test 1617dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase // are embedded in the listener callbacks that it implements. 1627dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mListener = new AnimatorListenerAdapter() { 1637dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @Override 164b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void onAnimationStart(Animator animation) { 165b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase // This should only be called on an animation that has not yet been started 166b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase assertFalse(mStarted); 167b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase assertTrue(mRunning); 168b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mStarted = true; 169b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 170b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 171b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 1727dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void onAnimationCancel(Animator animation) { 1737dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase // This should only be called on an animation that has been started and not 1747dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase // yet canceled or ended 1757dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase assertFalse(mCanceled); 17617cf42cb85c22b50ecfa8d21efc992f99d20fc45Chet Haase assertTrue(mRunning || mStarted); 1777dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mCanceled = true; 1787dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 1797dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 1807dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @Override 1817dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void onAnimationEnd(Animator animation) { 1827dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase // This should only be called on an animation that has been started and not 1837dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase // yet ended 18417cf42cb85c22b50ecfa8d21efc992f99d20fc45Chet Haase assertTrue(mRunning || mStarted); 1857dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mRunning = false; 186b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mStarted = false; 1877dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase super.onAnimationEnd(animation); 1887dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 1897dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase }; 1907dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 1917dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.addListener(mListener); 1927dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.setDuration(ANIM_DURATION); 1937dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 1947dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFuture = new FutureWaiter(); 1957dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 1967dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mRunning = false; 1977dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mCanceled = false; 198b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mStarted = false; 1997dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 2007dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 2017dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase /** 2027dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Verify that calling cancel on an unstarted animator does nothing. 2037dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 2047dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @UiThreadTest 2057dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @SmallTest 2067dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void testCancel() throws Exception { 2077dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.cancel(); 2087dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 2097dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 2107dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase /** 21117cf42cb85c22b50ecfa8d21efc992f99d20fc45Chet Haase * Verify that calling end on an unstarted animator starts/ends an animator. 212b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 213b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @UiThreadTest 214b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @SmallTest 215b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void testEnd() throws Exception { 21617cf42cb85c22b50ecfa8d21efc992f99d20fc45Chet Haase mRunning = true; // end() implicitly starts an unstarted animator 217b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.end(); 218b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 219b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 220b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 2217dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Verify that calling cancel on a started animator does the right thing. 2227dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 2237dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @UiThreadTest 2247dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @SmallTest 2257dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void testStartCancel() throws Exception { 226b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFutureListener = new FutureReleaseListener(mFuture); 227b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase getActivity().runOnUiThread(new Runnable() { 228b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 229b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 230b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 231b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mRunning = true; 232b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.start(); 233b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.cancel(); 234b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.release(); 235b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 236b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 237b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 238b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 239b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }); 2408b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 2417dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 2427dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 2437dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase /** 244b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Verify that calling end on a started animator does the right thing. 2457dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 2467dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @UiThreadTest 2477dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @SmallTest 248b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void testStartEnd() throws Exception { 249b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFutureListener = new FutureReleaseListener(mFuture); 250b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase getActivity().runOnUiThread(new Runnable() { 251b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 252b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 253b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 254b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mRunning = true; 255b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.start(); 256b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.end(); 257b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.release(); 258b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 259b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 260b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 261b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 262b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }); 2638b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 264b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 265b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 266b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 267b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Same as testStartCancel, but with a startDelayed animator 268b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 269b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @SmallTest 2707dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void testStartDelayedCancel() throws Exception { 271b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFutureListener = new FutureReleaseListener(mFuture); 2727dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.setStartDelay(ANIM_DELAY); 273b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase getActivity().runOnUiThread(new Runnable() { 274b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 275b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 276b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 277b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mRunning = true; 278b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.start(); 279b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.cancel(); 280b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.release(); 281b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 282b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 283b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 284b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 285b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }); 2868b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 287b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 288b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 289b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 290b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Same as testStartEnd, but with a startDelayed animator 291b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 292b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @SmallTest 293b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void testStartDelayedEnd() throws Exception { 294b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFutureListener = new FutureReleaseListener(mFuture); 295b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.setStartDelay(ANIM_DELAY); 296b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase getActivity().runOnUiThread(new Runnable() { 297b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 298b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 299b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 300b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mRunning = true; 301b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.start(); 302b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.end(); 303b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.release(); 304b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 305b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 306b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 307b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 308b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }); 3098b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 3107dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 3117dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 3127dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase /** 3137dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Verify that canceling an animator that is playing does the right thing. 3147dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 3157dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @MediumTest 3167dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void testPlayingCancel() throws Exception { 3177dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFutureListener = new FutureReleaseListener(mFuture); 3187dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase getActivity().runOnUiThread(new Runnable() { 3197dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @Override 3207dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void run() { 3217dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase try { 3227dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase Handler handler = new Handler(); 3237dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.addListener(mFutureListener); 3247dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mRunning = true; 3257dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.start(); 326b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase handler.postDelayed(new Canceler(mAnimator, mFuture), ANIM_MID_DURATION); 327b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 328b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 329b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 330b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 331b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }); 3328b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 333b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 334b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 335b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 336b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Verify that ending an animator that is playing does the right thing. 337b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 338b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @MediumTest 339b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void testPlayingEnd() throws Exception { 340b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFutureListener = new FutureReleaseListener(mFuture); 341b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase getActivity().runOnUiThread(new Runnable() { 342b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 343b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 344b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 345b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase Handler handler = new Handler(); 346b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.addListener(mFutureListener); 347b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mRunning = true; 348b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.start(); 349b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase handler.postDelayed(new Ender(mAnimator, mFuture), ANIM_MID_DURATION); 3507dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } catch (junit.framework.AssertionFailedError e) { 3517dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFuture.setException(new RuntimeException(e)); 3527dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 3537dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 3547dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase }); 3558b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 3567dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 3577dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 3587dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase /** 3597dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Same as testPlayingCancel, but with a startDelayed animator 3607dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 3617dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @MediumTest 3627dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void testPlayingDelayedCancel() throws Exception { 3637dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.setStartDelay(ANIM_DELAY); 3647dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFutureListener = new FutureReleaseListener(mFuture); 3657dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase getActivity().runOnUiThread(new Runnable() { 3667dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @Override 3677dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void run() { 3687dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase try { 3697dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase Handler handler = new Handler(); 3707dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.addListener(mFutureListener); 3717dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mRunning = true; 3727dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.start(); 373b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase handler.postDelayed(new Canceler(mAnimator, mFuture), ANIM_MID_DURATION); 374b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 375b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 376b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 377b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 378b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }); 3798b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 380b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 381b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 382b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 383b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Same as testPlayingEnd, but with a startDelayed animator 384b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 385b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @MediumTest 386b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void testPlayingDelayedEnd() throws Exception { 387b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.setStartDelay(ANIM_DELAY); 388b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFutureListener = new FutureReleaseListener(mFuture); 389b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase getActivity().runOnUiThread(new Runnable() { 390b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 391b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 392b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 393b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase Handler handler = new Handler(); 394b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.addListener(mFutureListener); 395b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mRunning = true; 396b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.start(); 397b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase handler.postDelayed(new Ender(mAnimator, mFuture), ANIM_MID_DURATION); 398b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 399b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 400b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 401b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 402b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }); 4038b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 404b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 405b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 406b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 407b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Same as testPlayingDelayedCancel, but cancel during the startDelay period 408b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 409b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @MediumTest 410b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void testPlayingDelayedCancelMidDelay() throws Exception { 411b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.setStartDelay(ANIM_DELAY); 412b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase getActivity().runOnUiThread(new Runnable() { 413b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 414b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 415b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 416b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase // Set the listener to automatically timeout after an uncanceled animation 417b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase // would have finished. This tests to make sure that we're not calling 418b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase // the listeners with cancel/end callbacks since they won't be called 419b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase // with the start event. 4208b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFutureListener = new FutureReleaseListener(mFuture, getTimeout()); 421b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase Handler handler = new Handler(); 422b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mRunning = true; 423b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.start(); 424b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase handler.postDelayed(new Canceler(mAnimator, mFuture), ANIM_MID_DELAY); 4257dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } catch (junit.framework.AssertionFailedError e) { 4267dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFuture.setException(new RuntimeException(e)); 4277dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 4287dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 4297dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase }); 4308b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout() + 100, TimeUnit.MILLISECONDS); 431b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 432b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 433b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 434b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Same as testPlayingDelayedEnd, but end during the startDelay period 435b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 436b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @MediumTest 437b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void testPlayingDelayedEndMidDelay() throws Exception { 438b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.setStartDelay(ANIM_DELAY); 439b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase getActivity().runOnUiThread(new Runnable() { 440b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 441b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 442b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 443b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase // Set the listener to automatically timeout after an uncanceled animation 444b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase // would have finished. This tests to make sure that we're not calling 445b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase // the listeners with cancel/end callbacks since they won't be called 446b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase // with the start event. 4478b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFutureListener = new FutureReleaseListener(mFuture, getTimeout()); 448b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase Handler handler = new Handler(); 449b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mRunning = true; 450b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.start(); 451b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase handler.postDelayed(new Ender(mAnimator, mFuture), ANIM_MID_DELAY); 452b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 453b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 454b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 455b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 456b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }); 4578b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout() + 100, TimeUnit.MILLISECONDS); 4587dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 4597dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 4607dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase /** 4617dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Verifies that canceling a started animation after it has already been canceled 4627dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * does nothing. 4637dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 4647dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @MediumTest 4657dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void testStartDoubleCancel() throws Exception { 4667dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFutureListener = new FutureReleaseListener(mFuture); 4677dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase getActivity().runOnUiThread(new Runnable() { 4687dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @Override 4697dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void run() { 4707dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase try { 4717dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mRunning = true; 4727dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.start(); 4737dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.cancel(); 4747dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.cancel(); 4757dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFuture.release(); 4767dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } catch (junit.framework.AssertionFailedError e) { 4777dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFuture.setException(new RuntimeException(e)); 4787dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 4797dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 4807dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase }); 4818b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 482b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 483b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase 484b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 485b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Verifies that ending a started animation after it has already been ended 486b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * does nothing. 487b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 488b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @MediumTest 489b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void testStartDoubleEnd() throws Exception { 490b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFutureListener = new FutureReleaseListener(mFuture); 491b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase getActivity().runOnUiThread(new Runnable() { 492b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 493b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 494b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 495b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mRunning = true; 496b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.start(); 497b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.end(); 49817cf42cb85c22b50ecfa8d21efc992f99d20fc45Chet Haase mRunning = true; // end() implicitly starts an unstarted animator 499b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.end(); 500b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.release(); 501b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 502b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 503b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 504b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 505b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }); 5068b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 5077dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 5087dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 5097dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase /** 5107dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase * Same as testStartDoubleCancel, but with a startDelayed animator 5117dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase */ 5127dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @MediumTest 5137dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void testStartDelayedDoubleCancel() throws Exception { 5147dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.setStartDelay(ANIM_DELAY); 5157dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFutureListener = new FutureReleaseListener(mFuture); 5167dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase getActivity().runOnUiThread(new Runnable() { 5177dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase @Override 5187dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase public void run() { 5197dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase try { 5207dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mRunning = true; 5217dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.start(); 5227dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.cancel(); 5237dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mAnimator.cancel(); 5247dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFuture.release(); 5257dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } catch (junit.framework.AssertionFailedError e) { 5267dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase mFuture.setException(new RuntimeException(e)); 5277dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 5287dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase } 5297dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase }); 5308b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 531b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 5327dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 533b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase /** 534b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase * Same as testStartDoubleEnd, but with a startDelayed animator 535b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase */ 536b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @MediumTest 537b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void testStartDelayedDoubleEnd() throws Exception { 538b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.setStartDelay(ANIM_DELAY); 539b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFutureListener = new FutureReleaseListener(mFuture); 540b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase getActivity().runOnUiThread(new Runnable() { 541b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase @Override 542b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase public void run() { 543b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase try { 544b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mRunning = true; 545b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.start(); 546b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.end(); 54717cf42cb85c22b50ecfa8d21efc992f99d20fc45Chet Haase mRunning = true; // end() implicitly starts an unstarted animator 548b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mAnimator.end(); 549b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.release(); 550b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } catch (junit.framework.AssertionFailedError e) { 551b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase mFuture.setException(new RuntimeException(e)); 552b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 553b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 554b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase }); 5558b699792b677bd4dd8442b32641ac09d48fdd79cChet Haase mFuture.get(getTimeout(), TimeUnit.MILLISECONDS); 556b8f574a165bf6ec5b316734b367ac274ded4809bChet Haase } 5577dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase 5587dfacdb1c820f955cb3cd6032ff5fbc2dd7d9df5Chet Haase} 559