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