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; 234ad129858d830ad78de60665fc32d8785e57d541Yuichi Arakiimport static org.mockito.Matchers.any; 244ad129858d830ad78de60665fc32d8785e57d541Yuichi Arakiimport static org.mockito.Mockito.mock; 254ad129858d830ad78de60665fc32d8785e57d541Yuichi Arakiimport static org.mockito.Mockito.never; 264ad129858d830ad78de60665fc32d8785e57d541Yuichi Arakiimport static org.mockito.Mockito.timeout; 274ad129858d830ad78de60665fc32d8785e57d541Yuichi Arakiimport static org.mockito.Mockito.verify; 28c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 29c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.support.test.annotation.UiThreadTest; 30754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.MediumTest; 31c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.support.transition.test.R; 32c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.ViewGroup; 33c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 34c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport org.junit.Before; 35c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport org.junit.Test; 36c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 3724797374d6c3370ab857f254e8e58248c41c3dd9Aurimas Liutikas@MediumTest 38c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipublic class TransitionManagerTest extends BaseTest { 39c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 40c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki private Scene[] mScenes = new Scene[2]; 41c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 42c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Before 43c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void prepareScenes() { 44c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionActivity activity = rule.getActivity(); 45c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki ViewGroup root = activity.getRoot(); 46da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki mScenes[0] = Scene.getSceneForLayout(root, R.layout.support_scene0, activity); 47da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki mScenes[1] = Scene.getSceneForLayout(root, R.layout.support_scene1, activity); 48c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 49c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 50c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 51c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void testSetup() { 52c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(mScenes[0], is(notNullValue())); 53c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(mScenes[1], is(notNullValue())); 54c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 55c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 56c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 57c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @UiThreadTest 58c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void testGo_enterAction() { 59c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki CheckCalledRunnable runnable = new CheckCalledRunnable(); 60c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki mScenes[0].setEnterAction(runnable); 61c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(runnable.wasCalled(), is(false)); 62c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionManager.go(mScenes[0]); 63c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(runnable.wasCalled(), is(true)); 64c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 65c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 66c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 6742e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas public void testGo_exitAction() throws Throwable { 6841a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki final CheckCalledRunnable enter = new CheckCalledRunnable(); 6941a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki final CheckCalledRunnable exit = new CheckCalledRunnable(); 7041a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki mScenes[0].setEnterAction(enter); 7141a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki mScenes[0].setExitAction(exit); 7242e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas rule.runOnUiThread(new Runnable() { 7341a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki @Override 7441a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki public void run() { 7541a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki assertThat(enter.wasCalled(), is(false)); 7641a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki assertThat(exit.wasCalled(), is(false)); 7741a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki TransitionManager.go(mScenes[0]); 7841a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki assertThat(enter.wasCalled(), is(true)); 7941a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki assertThat(exit.wasCalled(), is(false)); 8041a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki } 8141a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki }); 8241a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki // Let the main thread catch up with the scene change 8342e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas rule.runOnUiThread(new Runnable() { 8441a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki @Override 8541a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki public void run() { 8641a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki TransitionManager.go(mScenes[1]); 8741a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki assertThat(exit.wasCalled(), is(true)); 8841a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki } 8941a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki }); 90c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 91c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 92c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 9342e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas public void testGo_transitionListenerStart() throws Throwable { 9442e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas final SyncTransitionListener listener = 9542e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas new SyncTransitionListener(SyncTransitionListener.EVENT_START); 9642e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas rule.runOnUiThread(new Runnable() { 97c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 98c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void run() { 99c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki Transition transition = new AutoTransition(); 100c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki transition.setDuration(0); 101c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.addListener(listener), is(sameInstance(transition))); 102c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionManager.go(mScenes[0], transition); 103c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 104c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki }); 105c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat("Timed out waiting for the TransitionListener", 106c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki listener.await(), is(true)); 107c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 108c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 109c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Test 11042e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas public void testGo_transitionListenerEnd() throws Throwable { 11142e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas final SyncTransitionListener listener = 11242e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas new SyncTransitionListener(SyncTransitionListener.EVENT_END); 11342e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas rule.runOnUiThread(new Runnable() { 114c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki @Override 115c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki public void run() { 116c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki Transition transition = new AutoTransition(); 117c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki transition.setDuration(0); 118c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat(transition.addListener(listener), is(sameInstance(transition))); 119c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki TransitionManager.go(mScenes[0], transition); 120c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 121c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki }); 122c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki assertThat("Timed out waiting for the TransitionListener", 123c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki listener.await(), is(true)); 124c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki } 125c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki 126da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki @Test 127da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki public void testGo_nullParameter() throws Throwable { 128da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki final ViewGroup root = rule.getActivity().getRoot(); 129da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki rule.runOnUiThread(new Runnable() { 130da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki @Override 131da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki public void run() { 132da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki TransitionManager.go(mScenes[0], null); 133da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki assertThat(Scene.getCurrentScene(root), is(mScenes[0])); 134da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki TransitionManager.go(mScenes[1], null); 135da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki assertThat(Scene.getCurrentScene(root), is(mScenes[1])); 136da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki } 137da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki }); 138da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki } 139da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki 1404ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki @Test 1414ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki public void testEndTransitions() throws Throwable { 1424ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki final ViewGroup root = rule.getActivity().getRoot(); 1434ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki final Transition transition = new AutoTransition(); 1444ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki // This transition is very long, but will be forced to end as soon as it starts 1454ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki transition.setDuration(30000); 1464ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki final Transition.TransitionListener listener = mock(Transition.TransitionListener.class); 1474ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki transition.addListener(listener); 1484ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki rule.runOnUiThread(new Runnable() { 1494ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki @Override 1504ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki public void run() { 1514ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki TransitionManager.go(mScenes[0], transition); 1524ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki } 1534ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki }); 1544ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki verify(listener, timeout(3000)).onTransitionStart(any(Transition.class)); 1554ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki rule.runOnUiThread(new Runnable() { 1564ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki @Override 1574ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki public void run() { 1584ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki TransitionManager.endTransitions(root); 1594ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki } 1604ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki }); 1614ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki verify(listener, timeout(3000)).onTransitionEnd(any(Transition.class)); 1624ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki } 1634ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki 1644ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki @Test 1654ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki public void testEndTransitionsBeforeStarted() throws Throwable { 1664ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki final ViewGroup root = rule.getActivity().getRoot(); 1674ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki final Transition transition = new AutoTransition(); 1684ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki transition.setDuration(0); 1694ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki final Transition.TransitionListener listener = mock(Transition.TransitionListener.class); 1704ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki transition.addListener(listener); 1714ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki rule.runOnUiThread(new Runnable() { 1724ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki @Override 1734ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki public void run() { 1744ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki TransitionManager.go(mScenes[0], transition); 1754ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki // This terminates the transition before it starts 1764ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki TransitionManager.endTransitions(root); 1774ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki } 1784ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki }); 1794ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki verify(listener, never()).onTransitionStart(any(Transition.class)); 1804ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki verify(listener, never()).onTransitionEnd(any(Transition.class)); 1814ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki } 1824ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki 183c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki} 184