1 /* 2 * Copyright (C) 2012 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.animation.cts; 17 18 import java.util.Iterator; 19 import java.util.LinkedList; 20 import java.util.List; 21 22 import android.animation.cts.R; 23 24 import android.animation.Animator; 25 import android.animation.LayoutTransition; 26 import android.animation.LayoutTransition.TransitionListener; 27 import android.animation.ObjectAnimator; 28 import android.animation.PropertyValuesHolder; 29 import android.animation.TimeInterpolator; 30 import android.test.ActivityInstrumentationTestCase2; 31 import android.view.View; 32 import android.view.ViewGroup; 33 import android.view.animation.AccelerateInterpolator; 34 import android.widget.Button; 35 import android.widget.LinearLayout; 36 37 public class LayoutAnimationTest extends 38 ActivityInstrumentationTestCase2<LayoutAnimationActivity> { 39 private LayoutAnimationActivity mActivity; 40 private MyLayoutTransition mLayoutTransition; 41 private LinearLayout mView; 42 private Button mButton; 43 LayoutAnimationTest()44 public LayoutAnimationTest() { 45 super(LayoutAnimationActivity.class); 46 } 47 setUp()48 public void setUp() throws Exception { 49 super.setUp(); 50 setActivityInitialTouchMode(true); 51 mActivity = getActivity(); 52 mView = (LinearLayout) mActivity.findViewById(R.id.container); 53 mButton = (Button)mActivity.findViewById(R.id.button1); 54 mLayoutTransition = new MyLayoutTransition(); 55 } 56 testAddTransitionListener()57 public void testAddTransitionListener() throws Throwable { 58 MyTransitionListener listener = new MyTransitionListener(); 59 assertNull(mLayoutTransition.getTransitionListeners()); 60 mLayoutTransition.addTransitionListener(listener); 61 62 List<TransitionListener> layoutTransitionList = mLayoutTransition.getTransitionListeners(); 63 TransitionListener actualListener = layoutTransitionList.get(0); 64 assertEquals(1, layoutTransitionList.size()); 65 assertEquals(listener, actualListener); 66 } 67 testIsRunning()68 public void testIsRunning() throws Throwable { 69 setDefaultTransition(); 70 assertFalse(mLayoutTransition.isRunning()); 71 clickButton(); 72 assertTrue(mLayoutTransition.isRunning()); 73 } 74 testIsChangingLayout()75 public void testIsChangingLayout() throws Throwable { 76 long duration = 2000l; 77 mView.setLayoutTransition(mLayoutTransition); 78 mLayoutTransition.setDuration(duration); 79 mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_APPEARING, 80 new AccelerateInterpolator()); 81 82 assertFalse(mLayoutTransition.isChangingLayout()); 83 clickButton(); 84 assertTrue(mLayoutTransition.isChangingLayout()); 85 } 86 testSetDuration()87 public void testSetDuration() { 88 long duration = 1000l; 89 mLayoutTransition.setDuration(duration); 90 91 assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.APPEARING)); 92 assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.CHANGE_APPEARING)); 93 assertEquals(duration, 94 mLayoutTransition.getDuration(LayoutTransition.CHANGE_DISAPPEARING)); 95 assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.DISAPPEARING)); 96 } 97 testSetDurationForTransitionType()98 public void testSetDurationForTransitionType() { 99 long duration = 1000l; 100 mLayoutTransition.setDuration(LayoutTransition.APPEARING, duration); 101 assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.APPEARING)); 102 } 103 testSetInterpolator()104 public void testSetInterpolator() { 105 TimeInterpolator interpolator = new AccelerateInterpolator(); 106 mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, interpolator); 107 assertEquals(interpolator, mLayoutTransition.getInterpolator( 108 LayoutTransition.APPEARING)); 109 } 110 testSetAnimator()111 public void testSetAnimator() { 112 float startAlpha = 0.0f; 113 float endAlpha = 0.5f; 114 PropertyValuesHolder pvhAlpha = PropertyValuesHolder.ofFloat("alpha", startAlpha, 115 endAlpha); 116 ObjectAnimator appearingAnimator = (ObjectAnimator) ObjectAnimator.ofPropertyValuesHolder( 117 (Object)null, pvhAlpha); 118 appearingAnimator.setInterpolator(new AccelerateInterpolator()); 119 mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearingAnimator); 120 assertEquals(appearingAnimator, mLayoutTransition.getAnimator(LayoutTransition.APPEARING)); 121 } 122 testAnimationWithAnimator()123 public void testAnimationWithAnimator() throws Throwable { 124 MyTransitionListener listener = new MyTransitionListener(); 125 mLayoutTransition.addTransitionListener(listener); 126 mLayoutTransition.setAnimateParentHierarchy(false); 127 long duration = 2000; 128 mView.setLayoutTransition(mLayoutTransition); 129 mLayoutTransition.setDuration(duration); 130 float startAlpha = 0.0f; 131 float endAlpha = 0.5f; 132 PropertyValuesHolder pvhAlpha = PropertyValuesHolder.ofFloat("alpha", startAlpha, 133 endAlpha); 134 ObjectAnimator appearingAnimator = (ObjectAnimator) ObjectAnimator.ofPropertyValuesHolder( 135 (Object)null, pvhAlpha); 136 appearingAnimator.setInterpolator(new AccelerateInterpolator()); 137 138 mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearingAnimator); 139 140 List<Float> alphaList = new LinkedList<Float>(); 141 clickButton(); 142 while(listener.mTransition) { 143 float alpha = mActivity.getLastButton().getAlpha(); 144 alphaList.add(alpha); 145 Thread.sleep(200); 146 } 147 Iterator<Float> iterator = alphaList.iterator(); 148 float lastValue = 0.0f; 149 while(iterator.hasNext()){ 150 float alphaValue = iterator.next(); 151 assertTrue(alphaValue >= lastValue); 152 assertTrue(alphaValue >= startAlpha); 153 assertTrue(alphaValue <= endAlpha); 154 lastValue = alphaValue; 155 } 156 } 157 testStartDelay()158 public void testStartDelay() { 159 long delay = 100l; 160 int transitionType = LayoutTransition.APPEARING; 161 mLayoutTransition.setStartDelay(transitionType, delay); 162 assertEquals(delay, mLayoutTransition.getStartDelay(transitionType)); 163 } 164 testSetStagger()165 public void testSetStagger() { 166 long duration = 100; 167 int transitionType = LayoutTransition.CHANGE_APPEARING; 168 mLayoutTransition.setStagger(transitionType, duration); 169 assertEquals(duration, mLayoutTransition.getStagger(transitionType)); 170 } 171 setDefaultTransition()172 private void setDefaultTransition() { 173 long duration = 1000; 174 mView.setLayoutTransition(mLayoutTransition); 175 mLayoutTransition.setDuration(duration); 176 mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, 177 new AccelerateInterpolator()); 178 } 179 clickButton()180 private void clickButton() throws Throwable { 181 runTestOnUiThread(new Runnable() { 182 public void run() { 183 mButton.callOnClick(); 184 } 185 }); 186 getInstrumentation().waitForIdleSync(); 187 } 188 189 class MyTransitionListener implements LayoutTransition.TransitionListener { 190 ViewGroup mContainer; 191 View mView; 192 int mTransitionType; 193 boolean mTransition = false; endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType)194 public void endTransition(LayoutTransition transition, 195 ViewGroup container, View view, int transitionType) { 196 this.mContainer = container; 197 this.mView = view; 198 this.mTransitionType = transitionType; 199 mTransition = false; 200 } 201 startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType)202 public void startTransition(LayoutTransition transition, 203 ViewGroup container, View view, int transitionType) { 204 this.mContainer = container; 205 this.mView = view; 206 this.mTransitionType = transitionType; 207 mTransition = true; 208 } 209 } 210 211 class MyLayoutTransition extends LayoutTransition { 212 boolean mAddChild = false; 213 boolean mHideChild = false; 214 boolean mRemoveChild = false; 215 boolean mShowChild = false; 216 boolean mSetAnimator = false; 217 boolean mRemoveListener = false; 218 boolean isChangingLayout = false; 219 220 @Override addChild(ViewGroup parent, View child)221 public void addChild(ViewGroup parent, View child) { 222 super.addChild(parent, child); 223 mAddChild = true; 224 } 225 226 @Override hideChild(ViewGroup parent, View child)227 public void hideChild(ViewGroup parent, View child) { 228 super.hideChild(parent, child); 229 mHideChild = true; 230 } 231 232 @Override isChangingLayout()233 public boolean isChangingLayout() { 234 return super.isChangingLayout(); 235 } 236 237 @Override isRunning()238 public boolean isRunning() { 239 isChangingLayout = true; 240 return super.isRunning(); 241 } 242 243 @Override removeChild(ViewGroup parent, View child)244 public void removeChild(ViewGroup parent, View child) { 245 super.removeChild(parent, child); 246 mRemoveChild = true; 247 } 248 249 @Override removeTransitionListener(TransitionListener listener)250 public void removeTransitionListener(TransitionListener listener) { 251 super.removeTransitionListener(listener); 252 mRemoveListener = true; 253 } 254 255 @Override setAnimator(int transitionType, Animator animator)256 public void setAnimator(int transitionType, Animator animator) { 257 super.setAnimator(transitionType, animator); 258 mSetAnimator = true; 259 } 260 261 @Override showChild(ViewGroup parent, View child)262 public void showChild(ViewGroup parent, View child) { 263 super.showChild(parent, child); 264 mShowChild = true; 265 } 266 } 267 } 268 269