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