Home | History | Annotate | Download | only in cts
      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