1c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki/*
2c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Copyright (C) 2016 The Android Open Source Project
3c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
4c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * you may not use this file except in compliance with the License.
6c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * You may obtain a copy of the License at
7c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
8c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
10c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Unless required by applicable law or agreed to in writing, software
11c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * See the License for the specific language governing permissions and
14c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * limitations under the License.
15c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */
16c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
17c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipackage android.support.transition;
18c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
19c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.CoreMatchers.is;
20c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.CoreMatchers.notNullValue;
21c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.MatcherAssert.assertThat;
22c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.Matchers.sameInstance;
23c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
24c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.support.test.InstrumentationRegistry;
25c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.support.test.annotation.UiThreadTest;
26c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.support.transition.test.R;
2724797374d6c3370ab857f254e8e58248c41c3dd9Aurimas Liutikasimport android.test.suitebuilder.annotation.MediumTest;
28c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.ViewGroup;
29c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
30c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport org.junit.Before;
31c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport org.junit.Test;
32c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
33c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport java.util.concurrent.CountDownLatch;
34c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport java.util.concurrent.TimeUnit;
35c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
3624797374d6c3370ab857f254e8e58248c41c3dd9Aurimas Liutikas@MediumTest
37c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipublic class TransitionManagerTest extends BaseTest {
38c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
39c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    private Scene[] mScenes = new Scene[2];
40c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
41c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Before
42c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void prepareScenes() {
43c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        TransitionActivity activity = rule.getActivity();
44c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        ViewGroup root = activity.getRoot();
45c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mScenes[0] = Scene.getSceneForLayout(root, R.layout.scene0, activity);
46c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mScenes[1] = Scene.getSceneForLayout(root, R.layout.scene1, activity);
47c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
48c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
49c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Test
50c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void testSetup() {
51c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat(mScenes[0], is(notNullValue()));
52c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat(mScenes[1], is(notNullValue()));
53c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
54c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
55c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Test
56c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @UiThreadTest
57c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void testGo_enterAction() {
58c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        CheckCalledRunnable runnable = new CheckCalledRunnable();
59c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mScenes[0].setEnterAction(runnable);
60c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat(runnable.wasCalled(), is(false));
61c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        TransitionManager.go(mScenes[0]);
62c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat(runnable.wasCalled(), is(true));
63c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
64c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
65c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Test
66c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void testGo_exitAction() {
6741a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        final CheckCalledRunnable enter = new CheckCalledRunnable();
6841a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        final CheckCalledRunnable exit = new CheckCalledRunnable();
6941a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        mScenes[0].setEnterAction(enter);
7041a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        mScenes[0].setExitAction(exit);
7141a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
7241a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            @Override
7341a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            public void run() {
7441a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                assertThat(enter.wasCalled(), is(false));
7541a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                assertThat(exit.wasCalled(), is(false));
7641a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                TransitionManager.go(mScenes[0]);
7741a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                assertThat(enter.wasCalled(), is(true));
7841a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                assertThat(exit.wasCalled(), is(false));
7941a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            }
8041a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        });
8141a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        // Let the main thread catch up with the scene change
8241a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
8341a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            @Override
8441a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            public void run() {
8541a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                TransitionManager.go(mScenes[1]);
8641a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                assertThat(exit.wasCalled(), is(true));
8741a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            }
8841a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        });
89c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
90c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
91c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Test
92c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void testGo_transitionListenerStart() {
93c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        final SyncTransitionListener listener
94c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                = new SyncTransitionListener(SyncTransitionListener.EVENT_START);
95c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
96c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            @Override
97c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            public void run() {
98c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                Transition transition = new AutoTransition();
99c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                transition.setDuration(0);
100c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                assertThat(transition.addListener(listener), is(sameInstance(transition)));
101c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                TransitionManager.go(mScenes[0], transition);
102c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
103c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        });
104c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat("Timed out waiting for the TransitionListener",
105c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                listener.await(), is(true));
106c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
107c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
108c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Test
109c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void testGo_transitionListenerEnd() {
110c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        final SyncTransitionListener listener
111c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                = new SyncTransitionListener(SyncTransitionListener.EVENT_END);
112c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
113c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            @Override
114c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            public void run() {
115c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                Transition transition = new AutoTransition();
116c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                transition.setDuration(0);
117c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                assertThat(transition.addListener(listener), is(sameInstance(transition)));
118c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                TransitionManager.go(mScenes[0], transition);
119c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
120c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        });
121c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat("Timed out waiting for the TransitionListener",
122c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                listener.await(), is(true));
123c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
124c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
125c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
126c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * This {@link Transition.TransitionListener} synchronously waits for the specified callback.
127c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
128c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    private static class SyncTransitionListener implements Transition.TransitionListener {
129c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
130c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        static final int EVENT_START = 1;
131c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        static final int EVENT_END = 2;
132c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        static final int EVENT_CANCEL = 3;
133c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        static final int EVENT_PAUSE = 4;
134c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        static final int EVENT_RESUME = 5;
135c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
136c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        private final int mTargetEvent;
137c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        private final CountDownLatch mLatch = new CountDownLatch(1);
138c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
139c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        SyncTransitionListener(int event) {
140c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            mTargetEvent = event;
141c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
142c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
143c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        boolean await() {
144c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            try {
145c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                return mLatch.await(3000, TimeUnit.MILLISECONDS);
146c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            } catch (InterruptedException e) {
147c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                return false;
148c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
149c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
150c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
151c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        @Override
152c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        public void onTransitionStart(Transition transition) {
153c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            if (mTargetEvent == EVENT_START) {
154c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                mLatch.countDown();
155c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
156c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
157c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
158c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        @Override
159c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        public void onTransitionEnd(Transition transition) {
160c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            if (mTargetEvent == EVENT_END) {
161c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                mLatch.countDown();
162c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
163c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
164c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
165c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        @Override
166c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        public void onTransitionCancel(Transition transition) {
167c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            if (mTargetEvent == EVENT_CANCEL) {
168c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                mLatch.countDown();
169c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
170c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
171c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
172c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        @Override
173c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        public void onTransitionPause(Transition transition) {
174c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            if (mTargetEvent == EVENT_PAUSE) {
175c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                mLatch.countDown();
176c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
177c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
178c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
179c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        @Override
180c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        public void onTransitionResume(Transition transition) {
181c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            if (mTargetEvent == EVENT_RESUME) {
182c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                mLatch.countDown();
183c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
184c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
185c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
186c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
187c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki}
188