Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2016 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 com.android.compatibility.common.util.CtsMockitoUtils.within;
     19 
     20 import static org.junit.Assert.assertEquals;
     21 import static org.junit.Assert.assertNull;
     22 import static org.junit.Assert.assertSame;
     23 import static org.mockito.Matchers.any;
     24 import static org.mockito.Mockito.mock;
     25 import static org.mockito.Mockito.times;
     26 import static org.mockito.Mockito.verify;
     27 
     28 import android.animation.TimeInterpolator;
     29 import android.graphics.Rect;
     30 import android.transition.ArcMotion;
     31 import android.transition.ChangeBounds;
     32 import android.transition.Fade;
     33 import android.transition.PathMotion;
     34 import android.transition.Transition;
     35 import android.transition.TransitionPropagation;
     36 import android.transition.TransitionSet;
     37 import android.transition.TransitionValues;
     38 import android.view.ViewGroup;
     39 import android.view.animation.AccelerateDecelerateInterpolator;
     40 import android.view.animation.AccelerateInterpolator;
     41 import android.view.animation.DecelerateInterpolator;
     42 
     43 import androidx.test.filters.MediumTest;
     44 import androidx.test.runner.AndroidJUnit4;
     45 
     46 import org.junit.Test;
     47 import org.junit.runner.RunWith;
     48 
     49 @MediumTest
     50 @RunWith(AndroidJUnit4.class)
     51 public class TransitionSetTest extends BaseTransitionTest {
     52     @Test
     53     public void testTransitionTogether() throws Throwable {
     54         TransitionSet transitionSet = new TransitionSet();
     55         Fade fade = new Fade();
     56         final Transition.TransitionListener fadeListener =
     57                 mock(Transition.TransitionListener.class);
     58         fade.addListener(fadeListener);
     59         ChangeBounds changeBounds = new ChangeBounds();
     60         final Transition.TransitionListener changeBoundsListener =
     61                 mock(Transition.TransitionListener.class);
     62         changeBounds.addListener(changeBoundsListener);
     63         transitionSet.addTransition(fade);
     64         transitionSet.addTransition(changeBounds);
     65         mTransition = transitionSet;
     66         resetListener();
     67 
     68         assertEquals(TransitionSet.ORDERING_TOGETHER, transitionSet.getOrdering());
     69         enterScene(R.layout.scene1);
     70         startTransition(R.layout.scene3);
     71         mActivityRule.runOnUiThread(() -> {
     72             verify(fadeListener, times(1)).onTransitionStart(any());
     73             verify(changeBoundsListener, times(1)).onTransitionStart(any());
     74         });
     75     }
     76 
     77     @Test
     78     public void testTransitionSequentially() throws Throwable {
     79         TransitionSet transitionSet = new TransitionSet();
     80         Fade fade = new Fade();
     81         fade.setDuration(500);
     82         final Transition.TransitionListener fadeListener =
     83                 mock(Transition.TransitionListener.class);
     84         fade.addListener(fadeListener);
     85         ChangeBounds changeBounds = new ChangeBounds();
     86         final Transition.TransitionListener changeBoundsListener =
     87                 mock(Transition.TransitionListener.class);
     88         changeBounds.addListener(changeBoundsListener);
     89         transitionSet.addTransition(fade);
     90         transitionSet.addTransition(changeBounds);
     91         mTransition = transitionSet;
     92         resetListener();
     93 
     94         assertEquals(TransitionSet.ORDERING_TOGETHER, transitionSet.getOrdering());
     95         transitionSet.setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
     96         assertEquals(TransitionSet.ORDERING_SEQUENTIAL, transitionSet.getOrdering());
     97 
     98         enterScene(R.layout.scene1);
     99         startTransition(R.layout.scene3);
    100         verify(fadeListener, within(500)).onTransitionStart(any());
    101         verify(fadeListener, times(1)).onTransitionStart(any());
    102 
    103         // change bounds shouldn't start until after fade finishes
    104         verify(fadeListener, times(0)).onTransitionEnd(any());
    105         verify(changeBoundsListener, times(0)).onTransitionStart(any());
    106 
    107         // now wait for the fade transition to end
    108         verify(fadeListener, within(1000)).onTransitionEnd(any());
    109 
    110         // The change bounds should start soon after
    111         verify(changeBoundsListener, within(500)).onTransitionStart(any());
    112         verify(changeBoundsListener, times(1)).onTransitionStart(any());
    113     }
    114 
    115     @Test
    116     public void testTransitionCount() throws Throwable {
    117         TransitionSet transitionSet = new TransitionSet();
    118         assertEquals(0, transitionSet.getTransitionCount());
    119 
    120         Fade fade = new Fade();
    121         ChangeBounds changeBounds = new ChangeBounds();
    122         transitionSet.addTransition(fade);
    123         transitionSet.addTransition(changeBounds);
    124 
    125         assertEquals(2, transitionSet.getTransitionCount());
    126         assertSame(fade, transitionSet.getTransitionAt(0));
    127         assertSame(changeBounds, transitionSet.getTransitionAt(1));
    128 
    129         transitionSet.removeTransition(fade);
    130 
    131         assertEquals(1, transitionSet.getTransitionCount());
    132         assertSame(changeBounds, transitionSet.getTransitionAt(0));
    133 
    134         transitionSet.removeTransition(fade); // remove one that isn't there
    135         assertEquals(1, transitionSet.getTransitionCount());
    136         assertSame(changeBounds, transitionSet.getTransitionAt(0));
    137     }
    138 
    139     @Test
    140     public void testSetTransferValuesDuringAdd() throws Throwable {
    141         Fade fade = new Fade();
    142         fade.setDuration(500);
    143         fade.setPropagation(new TestPropagation());
    144         fade.setEpicenterCallback(new Transition.EpicenterCallback() {
    145             @Override
    146             public Rect onGetEpicenter(Transition transition) {
    147                 return null;
    148             }
    149         });
    150         fade.setInterpolator(new AccelerateDecelerateInterpolator());
    151         fade.setPathMotion(new ArcMotion());
    152 
    153         TransitionSet transitionSet = new TransitionSet();
    154         int duration = 100;
    155         TestPropagation propagation = new TestPropagation();
    156         TimeInterpolator interpolator = new DecelerateInterpolator();
    157         PathMotion pathMotion = new ArcMotion();
    158         Transition.EpicenterCallback epicenterCallback = new Transition.EpicenterCallback() {
    159             @Override
    160             public Rect onGetEpicenter(Transition transition) {
    161                 return null;
    162             }
    163         };
    164         transitionSet.setDuration(duration);
    165         transitionSet.setPropagation(propagation);
    166         transitionSet.setInterpolator(interpolator);
    167         transitionSet.setPathMotion(pathMotion);
    168         transitionSet.setEpicenterCallback(epicenterCallback);
    169 
    170         transitionSet.addTransition(fade);
    171         assertEquals(duration, fade.getDuration());
    172         assertSame(propagation, fade.getPropagation());
    173         assertSame(interpolator, fade.getInterpolator());
    174         assertSame(pathMotion, fade.getPathMotion());
    175         assertSame(epicenterCallback, fade.getEpicenterCallback());
    176     }
    177 
    178     @Test
    179     public void testSetTransferNullValuesDuringAdd() throws Throwable {
    180         Fade fade = new Fade();
    181         fade.setDuration(500);
    182         fade.setPropagation(new TestPropagation());
    183         fade.setEpicenterCallback(new Transition.EpicenterCallback() {
    184             @Override
    185             public Rect onGetEpicenter(Transition transition) {
    186                 return null;
    187             }
    188         });
    189         fade.setInterpolator(new AccelerateDecelerateInterpolator());
    190         fade.setPathMotion(new ArcMotion());
    191 
    192         TransitionSet transitionSet = new TransitionSet();
    193         transitionSet.setDuration(0);
    194         transitionSet.setPropagation(null);
    195         transitionSet.setInterpolator(null);
    196         transitionSet.setPathMotion(null);
    197         transitionSet.setEpicenterCallback(null);
    198 
    199         transitionSet.addTransition(fade);
    200         assertEquals(0, fade.getDuration());
    201         assertNull(fade.getPropagation());
    202         assertNull(fade.getInterpolator());
    203         assertSame(transitionSet.getPathMotion(), fade.getPathMotion());
    204         assertNull(fade.getEpicenterCallback());
    205     }
    206 
    207     @Test
    208     public void testSetNoTransferValuesDuringAdd() throws Throwable {
    209         Fade fade = new Fade();
    210         int duration = 100;
    211         TestPropagation propagation = new TestPropagation();
    212         TimeInterpolator interpolator = new DecelerateInterpolator();
    213         PathMotion pathMotion = new ArcMotion();
    214         Transition.EpicenterCallback epicenterCallback = new Transition.EpicenterCallback() {
    215             @Override
    216             public Rect onGetEpicenter(Transition transition) {
    217                 return null;
    218             }
    219         };
    220         fade.setDuration(duration);
    221         fade.setPropagation(propagation);
    222         fade.setInterpolator(interpolator);
    223         fade.setPathMotion(pathMotion);
    224         fade.setEpicenterCallback(epicenterCallback);
    225 
    226         TransitionSet transitionSet = new TransitionSet();
    227 
    228         transitionSet.addTransition(fade);
    229         assertEquals(duration, fade.getDuration());
    230         assertSame(propagation, fade.getPropagation());
    231         assertSame(interpolator, fade.getInterpolator());
    232         assertSame(pathMotion, fade.getPathMotion());
    233         assertSame(epicenterCallback, fade.getEpicenterCallback());
    234     }
    235 
    236     @Test
    237     public void testSetAllowsChildrenToOverrideConfigs() {
    238         TransitionSet transitionSet = new TransitionSet();
    239         transitionSet.setDuration(100);
    240         transitionSet.setInterpolator(new DecelerateInterpolator());
    241 
    242         Fade fade = new Fade();
    243         transitionSet.addTransition(fade); // here set's duration and interpolator are applied
    244 
    245         int overriddenDuration = 200;
    246         TimeInterpolator overriddenInterpolator = new AccelerateInterpolator();
    247         fade.setDuration(overriddenDuration);
    248         fade.setInterpolator(overriddenInterpolator);
    249 
    250         // emulate beginDelayedTransition where we clone the provided transition
    251         transitionSet = (TransitionSet) transitionSet.clone();
    252         fade = (Fade) transitionSet.getTransitionAt(0);
    253 
    254         assertEquals(overriddenDuration, fade.getDuration());
    255         assertEquals(overriddenInterpolator, fade.getInterpolator());
    256     }
    257 
    258     private static class TestPropagation extends TransitionPropagation {
    259         @Override
    260         public long getStartDelay(ViewGroup sceneRoot, Transition transition,
    261                 TransitionValues startValues, TransitionValues endValues) {
    262             return 0;
    263         }
    264 
    265         @Override
    266         public void captureValues(TransitionValues transitionValues) {
    267         }
    268 
    269         @Override
    270         public String[] getPropagationProperties() {
    271             return new String[] { };
    272         }
    273     }
    274 }
    275 
    276