1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package android.transition.cts; 17 18 import static org.junit.Assert.assertEquals; 19 import static org.junit.Assert.assertNotNull; 20 import static org.junit.Assert.assertTrue; 21 import static org.mockito.Matchers.any; 22 import static org.mockito.Mockito.never; 23 import static org.mockito.Mockito.reset; 24 import static org.mockito.Mockito.times; 25 import static org.mockito.Mockito.verify; 26 27 import android.graphics.Rect; 28 import android.os.SystemClock; 29 import android.support.test.filters.MediumTest; 30 import android.support.test.runner.AndroidJUnit4; 31 import android.transition.Scene; 32 import android.transition.Transition; 33 import android.transition.TransitionManager; 34 import android.view.View; 35 import android.view.ViewTreeObserver; 36 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 import org.mockito.ArgumentCaptor; 40 41 import java.util.concurrent.CountDownLatch; 42 import java.util.concurrent.TimeUnit; 43 44 @MediumTest 45 @RunWith(AndroidJUnit4.class) 46 public class TransitionManagerTest extends BaseTransitionTest { 47 @Test 48 public void testBeginDelayedTransition() throws Throwable { 49 mActivityRule.runOnUiThread(() -> { 50 TransitionManager.beginDelayedTransition(mSceneRoot, mTransition); 51 View view = mActivity.getLayoutInflater().inflate(R.layout.scene1, mSceneRoot, 52 false); 53 mSceneRoot.addView(view); 54 }); 55 56 waitForStart(); 57 waitForEnd(800); 58 verify(mListener, never()).onTransitionResume(any()); 59 verify(mListener, never()).onTransitionPause(any()); 60 verify(mListener, never()).onTransitionCancel(any()); 61 ArgumentCaptor<Transition> transitionArgumentCaptor = 62 ArgumentCaptor.forClass(Transition.class); 63 verify(mListener, times(1)).onTransitionStart(transitionArgumentCaptor.capture()); 64 assertEquals(TestTransition.class, transitionArgumentCaptor.getValue().getClass()); 65 assertTrue(mTransition != transitionArgumentCaptor.getValue()); 66 mActivityRule.runOnUiThread(() -> { 67 assertNotNull(mActivity.findViewById(R.id.redSquare)); 68 assertNotNull(mActivity.findViewById(R.id.greenSquare)); 69 }); 70 } 71 72 @Test 73 public void testDefaultBeginDelayedTransition() throws Throwable { 74 enterScene(R.layout.scene1); 75 final CountDownLatch startLatch = new CountDownLatch(1); 76 mSceneRoot.getViewTreeObserver().addOnPreDrawListener( 77 new ViewTreeObserver.OnPreDrawListener() { 78 @Override 79 public boolean onPreDraw() { 80 mSceneRoot.getViewTreeObserver().removeOnPreDrawListener(this); 81 startLatch.countDown(); 82 return true; 83 } 84 }); 85 mActivityRule.runOnUiThread(() -> TransitionManager.beginDelayedTransition(mSceneRoot)); 86 enterScene(R.layout.scene6); 87 assertTrue(startLatch.await(500, TimeUnit.MILLISECONDS)); 88 ensureRedSquareIsMoving(); 89 endTransition(); 90 } 91 92 private void ensureRedSquareIsMoving() throws InterruptedException { 93 final View view = mActivity.findViewById(R.id.redSquare); 94 assertNotNull(view); 95 // We should see a ChangeBounds on redSquare 96 final Rect position = new Rect(view.getLeft(), view.getTop(), view.getRight(), 97 view.getBottom()); 98 final CountDownLatch latch = new CountDownLatch(1); 99 view.postOnAnimationDelayed(() -> { 100 Rect next = new Rect(view.getLeft(), view.getTop(), view.getRight(), 101 view.getBottom()); 102 assertTrue(!next.equals(position)); 103 latch.countDown(); 104 }, 20); 105 assertTrue(latch.await(500, TimeUnit.MILLISECONDS)); 106 } 107 108 @Test 109 public void testGo() throws Throwable { 110 startTransition(R.layout.scene1); 111 waitForStart(); 112 waitForEnd(800); 113 114 verify(mListener, never()).onTransitionResume(any()); 115 verify(mListener, never()).onTransitionPause(any()); 116 verify(mListener, never()).onTransitionCancel(any()); 117 ArgumentCaptor<Transition> transitionArgumentCaptor = 118 ArgumentCaptor.forClass(Transition.class); 119 verify(mListener, times(1)).onTransitionStart(transitionArgumentCaptor.capture()); 120 assertEquals(TestTransition.class, transitionArgumentCaptor.getValue().getClass()); 121 assertTrue(mTransition != transitionArgumentCaptor.getValue()); 122 mActivityRule.runOnUiThread(() -> { 123 assertNotNull(mActivity.findViewById(R.id.redSquare)); 124 assertNotNull(mActivity.findViewById(R.id.greenSquare)); 125 }); 126 } 127 128 @Test 129 public void testDefaultGo() throws Throwable { 130 enterScene(R.layout.scene1); 131 final CountDownLatch startLatch = new CountDownLatch(1); 132 mSceneRoot.getViewTreeObserver().addOnPreDrawListener( 133 new ViewTreeObserver.OnPreDrawListener() { 134 @Override 135 public boolean onPreDraw() { 136 mSceneRoot.getViewTreeObserver().removeOnPreDrawListener(this); 137 startLatch.countDown(); 138 return true; 139 } 140 }); 141 final Scene scene6 = loadScene(R.layout.scene6); 142 mActivityRule.runOnUiThread(() -> TransitionManager.go(scene6)); 143 assertTrue(startLatch.await(500, TimeUnit.MILLISECONDS)); 144 ensureRedSquareIsMoving(); 145 endTransition(); 146 } 147 148 @Test 149 public void testSetTransition1() throws Throwable { 150 final TransitionManager transitionManager = new TransitionManager(); 151 152 mActivityRule.runOnUiThread(() -> { 153 Scene scene = Scene.getSceneForLayout(mSceneRoot, R.layout.scene1, mActivity); 154 transitionManager.setTransition(scene, mTransition); 155 transitionManager.transitionTo(scene); 156 }); 157 158 waitForStart(); 159 waitForEnd(800); 160 verify(mListener, never()).onTransitionResume(any()); 161 verify(mListener, never()).onTransitionPause(any()); 162 verify(mListener, never()).onTransitionCancel(any()); 163 ArgumentCaptor<Transition> transitionArgumentCaptor = 164 ArgumentCaptor.forClass(Transition.class); 165 verify(mListener, times(1)).onTransitionStart(transitionArgumentCaptor.capture()); 166 assertEquals(TestTransition.class, transitionArgumentCaptor.getValue().getClass()); 167 assertTrue(mTransition != transitionArgumentCaptor.getValue()); 168 mActivityRule.runOnUiThread(() -> { 169 reset(mListener); 170 assertNotNull(mActivity.findViewById(R.id.redSquare)); 171 assertNotNull(mActivity.findViewById(R.id.greenSquare)); 172 Scene scene = Scene.getSceneForLayout(mSceneRoot, R.layout.scene2, mActivity); 173 transitionManager.transitionTo(scene); 174 }); 175 SystemClock.sleep(50); 176 verify(mListener, never()).onTransitionStart(any()); 177 endTransition(); 178 } 179 180 @Test 181 public void testSetTransition2() throws Throwable { 182 final TransitionManager transitionManager = new TransitionManager(); 183 final Scene[] scenes = new Scene[3]; 184 185 mActivityRule.runOnUiThread(() -> { 186 scenes[0] = Scene.getSceneForLayout(mSceneRoot, R.layout.scene1, mActivity); 187 scenes[1] = Scene.getSceneForLayout(mSceneRoot, R.layout.scene2, mActivity); 188 scenes[2] = Scene.getSceneForLayout(mSceneRoot, R.layout.scene3, mActivity); 189 transitionManager.setTransition(scenes[0], scenes[1], mTransition); 190 transitionManager.transitionTo(scenes[0]); 191 }); 192 SystemClock.sleep(100); 193 verify(mListener, never()).onTransitionStart(any()); 194 195 mActivityRule.runOnUiThread(() -> transitionManager.transitionTo(scenes[1])); 196 197 waitForStart(); 198 waitForEnd(800); 199 verify(mListener, never()).onTransitionResume(any()); 200 verify(mListener, never()).onTransitionPause(any()); 201 verify(mListener, never()).onTransitionCancel(any()); 202 ArgumentCaptor<Transition> transitionArgumentCaptor = 203 ArgumentCaptor.forClass(Transition.class); 204 verify(mListener, times(1)).onTransitionStart(transitionArgumentCaptor.capture()); 205 assertEquals(TestTransition.class, transitionArgumentCaptor.getValue().getClass()); 206 assertTrue(mTransition != transitionArgumentCaptor.getValue()); 207 mActivityRule.runOnUiThread(() -> { 208 reset(mListener); 209 transitionManager.transitionTo(scenes[2]); 210 }); 211 SystemClock.sleep(50); 212 verify(mListener, never()).onTransitionStart(any()); 213 endTransition(); 214 } 215 216 @Test 217 public void testEndTransitions() throws Throwable { 218 mTransition.setDuration(400); 219 220 startTransition(R.layout.scene1); 221 waitForStart(); 222 endTransition(); 223 waitForEnd(400); 224 } 225 226 @Test 227 public void testEndTransitionsBeforeStarted() throws Throwable { 228 mTransition.setDuration(400); 229 230 mActivityRule.runOnUiThread(() -> { 231 Scene scene = Scene.getSceneForLayout(mSceneRoot, R.layout.scene1, mActivity); 232 TransitionManager.go(scene, mTransition); 233 TransitionManager.endTransitions(mSceneRoot); 234 }); 235 SystemClock.sleep(100); 236 verify(mListener, never()).onTransitionStart(any()); 237 SystemClock.sleep(10); 238 verify(mListener, never()).onTransitionEnd(any()); 239 } 240 } 241 242