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 com.android.cts.animation.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.test.TouchUtils; 32 import android.view.View; 33 import android.view.ViewGroup; 34 import android.view.animation.AccelerateInterpolator; 35 import android.widget.Button; 36 import android.widget.LinearLayout; 37 38 public class LayoutAnimationTest extends 39 ActivityInstrumentationTestCase2<LayoutAnimationActivity> { 40 private LayoutAnimationActivity mActivity; 41 private MyLayoutTransition mLayoutTransition; 42 private LinearLayout mView; 43 private Button mButton; 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() { 69 setDefaultTransition(); 70 assertFalse(mLayoutTransition.isRunning()); 71 TouchUtils.clickView(this, mButton); 72 assertTrue(mLayoutTransition.isRunning()); 73 } 74 testIsChangingLayout()75 public void testIsChangingLayout() { 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 TouchUtils.clickView(this, mButton); 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 TouchUtils.clickView(this, mButton); 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 180 class MyTransitionListener implements LayoutTransition.TransitionListener { 181 ViewGroup mContainer; 182 View mView; 183 int mTransitionType; 184 boolean mTransition = false; endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType)185 public void endTransition(LayoutTransition transition, 186 ViewGroup container, View view, int transitionType) { 187 this.mContainer = container; 188 this.mView = view; 189 this.mTransitionType = transitionType; 190 mTransition = false; 191 } 192 startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType)193 public void startTransition(LayoutTransition transition, 194 ViewGroup container, View view, int transitionType) { 195 this.mContainer = container; 196 this.mView = view; 197 this.mTransitionType = transitionType; 198 mTransition = true; 199 } 200 } 201 202 class MyLayoutTransition extends LayoutTransition { 203 boolean mAddChild = false; 204 boolean mHideChild = false; 205 boolean mRemoveChild = false; 206 boolean mShowChild = false; 207 boolean mSetAnimator = false; 208 boolean mRemoveListener = false; 209 boolean isChangingLayout = false; 210 211 @Override addChild(ViewGroup parent, View child)212 public void addChild(ViewGroup parent, View child) { 213 super.addChild(parent, child); 214 mAddChild = true; 215 } 216 217 @Override hideChild(ViewGroup parent, View child)218 public void hideChild(ViewGroup parent, View child) { 219 super.hideChild(parent, child); 220 mHideChild = true; 221 } 222 223 @Override isChangingLayout()224 public boolean isChangingLayout() { 225 return super.isChangingLayout(); 226 } 227 228 @Override isRunning()229 public boolean isRunning() { 230 isChangingLayout = true; 231 return super.isRunning(); 232 } 233 234 @Override removeChild(ViewGroup parent, View child)235 public void removeChild(ViewGroup parent, View child) { 236 super.removeChild(parent, child); 237 mRemoveChild = true; 238 } 239 240 @Override removeTransitionListener(TransitionListener listener)241 public void removeTransitionListener(TransitionListener listener) { 242 super.removeTransitionListener(listener); 243 mRemoveListener = true; 244 } 245 246 @Override setAnimator(int transitionType, Animator animator)247 public void setAnimator(int transitionType, Animator animator) { 248 super.setAnimator(transitionType, animator); 249 mSetAnimator = true; 250 } 251 252 @Override showChild(ViewGroup parent, View child)253 public void showChild(ViewGroup parent, View child) { 254 super.showChild(parent, child); 255 mShowChild = true; 256 } 257 } 258 } 259 260