1 /* 2 * Copyright (C) 2008 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 17 package android.view.animation.cts; 18 19 import java.util.List; 20 21 import android.app.Activity; 22 import android.content.Context; 23 import android.content.res.XmlResourceParser; 24 import android.test.ActivityInstrumentationTestCase2; 25 import android.util.AttributeSet; 26 import android.util.Xml; 27 import android.view.View; 28 import android.view.animation.AccelerateInterpolator; 29 import android.view.animation.AlphaAnimation; 30 import android.view.animation.Animation; 31 import android.view.animation.AnimationSet; 32 import android.view.animation.ScaleAnimation; 33 import android.view.animation.Transformation; 34 import android.view.animation.TranslateAnimation; 35 36 import android.view.cts.R; 37 38 39 public class AnimationSetTest 40 extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> { 41 42 private static final float DELTA = 0.001f; 43 private static final long SHORT_CHILD_DURATION = 400; 44 private static final long MEDIUM_CHILD_DURATION = 800; 45 private static final long LONG_CHILD_DURATION = 1200; 46 /** 47 * initial size for initialize(int width, int height, int parentWidth, int parentHeight) 48 */ 49 private static final int INITIAL_SIZE = 100; 50 private static final long ANIMATIONSET_DURATION = 1000; 51 private Activity mActivity; 52 53 public AnimationSetTest() { 54 super("android.view.cts", AnimationTestCtsActivity.class); 55 } 56 57 @Override 58 protected void setUp() throws Exception { 59 super.setUp(); 60 mActivity = getActivity(); 61 } 62 63 public void testConstructor() { 64 new AnimationSet(true); 65 66 final XmlResourceParser parser = mActivity.getResources().getAnimation( 67 R.anim.anim_set); 68 final AttributeSet attr = Xml.asAttributeSet(parser); 69 assertNotNull(attr); 70 // Test with real AttributeSet 71 new AnimationSet(mActivity, attr); 72 } 73 74 public void testInitialize() { 75 final AnimationSet animationSet = createAnimationSet(); 76 animationSet.setDuration(ANIMATIONSET_DURATION); 77 // Before initialize, the durations are original. 78 List<Animation> children = animationSet.getAnimations(); 79 assertEquals(SHORT_CHILD_DURATION, children.get(0).getDuration()); 80 assertEquals(MEDIUM_CHILD_DURATION, children.get(1).getDuration()); 81 assertEquals(LONG_CHILD_DURATION, children.get(2).getDuration()); 82 83 // After initialize, AnimationSet override the child values. 84 assertFalse(animationSet.isInitialized()); 85 animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 86 assertTrue(animationSet.isInitialized()); 87 children = animationSet.getAnimations(); 88 assertEquals(ANIMATIONSET_DURATION, children.get(0).getDuration()); 89 assertEquals(ANIMATIONSET_DURATION, children.get(1).getDuration()); 90 assertEquals(ANIMATIONSET_DURATION, children.get(2).getDuration()); 91 } 92 93 private AnimationSet createAnimationSet() { 94 AnimationSet animationSet = new AnimationSet(true); 95 96 Animation animation1 = new AlphaAnimation(0.0f, 1.0f); 97 animation1.setDuration(SHORT_CHILD_DURATION); 98 animationSet.addAnimation(animation1); 99 100 Animation animation2 = new ScaleAnimation(1.0f, 2.0f, 1.0f, 3.0f); 101 animation2.setDuration(MEDIUM_CHILD_DURATION); 102 animationSet.addAnimation(animation2); 103 104 Animation animation3 = new TranslateAnimation(0.0f, 50.0f, 0.0f, 5.0f); 105 animation3.setDuration(LONG_CHILD_DURATION); 106 animationSet.addAnimation(animation3); 107 108 return animationSet; 109 } 110 111 public void testSetFillAfter() { 112 final AnimationSet animationSet = createAnimationSet(); 113 assertFalse(animationSet.getFillAfter()); 114 115 List<Animation> children = animationSet.getAnimations(); 116 children.get(0).setFillAfter(true); 117 children.get(1).setFillAfter(false); 118 119 animationSet.setFillAfter(true); 120 animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 121 assertTrue(animationSet.getFillAfter()); 122 children = animationSet.getAnimations(); 123 for (int i = 0; i < children.size(); i++) { 124 assertTrue(children.get(i).getFillAfter()); 125 } 126 } 127 128 public void testSetFillBefore() { 129 final AnimationSet animationSet = createAnimationSet(); 130 assertTrue(animationSet.getFillBefore()); 131 132 List<Animation> children = animationSet.getAnimations(); 133 children.get(0).setFillBefore(true); 134 children.get(1).setFillBefore(false); 135 136 animationSet.setFillBefore(false); 137 animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 138 assertFalse(animationSet.getFillBefore()); 139 children = animationSet.getAnimations(); 140 for (int i = 0; i < children.size(); i++) { 141 assertFalse(children.get(i).getFillBefore()); 142 } 143 } 144 145 public void testAccessDuration() { 146 final AnimationSet animationSet = createAnimationSet(); 147 assertEquals(LONG_CHILD_DURATION, animationSet.getDuration()); 148 149 assertTrue(animationSet.getDuration() > ANIMATIONSET_DURATION); 150 animationSet.setDuration(ANIMATIONSET_DURATION); 151 animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 152 assertEquals(ANIMATIONSET_DURATION, animationSet.getDuration()); 153 final List<Animation> children = animationSet.getAnimations(); 154 for (int i = 0; i < children.size(); i++) { 155 assertEquals(ANIMATIONSET_DURATION, children.get(i).getDuration()); 156 } 157 } 158 159 public void testRestrictDuration() { 160 final AnimationSet animationSet = new AnimationSet(false); 161 Animation child = null; 162 final long[] originChildDuration = { 1000, 1000, 500 }; 163 final long[] originChildStartOffset = { 2000, 1000, 0 }; 164 final int[] originChildRepeatCount = { 0, 0, 4 }; 165 final long[] originChildDurationHint = new long[3]; 166 for (int i = 0; i < 3; i++) { 167 child = new AlphaAnimation(0.0f, 1.0f); 168 child.setDuration(originChildDuration[i]); 169 child.setStartOffset(originChildStartOffset[i]); 170 child.setRepeatCount(originChildRepeatCount[i]); 171 originChildDurationHint[i] = child.computeDurationHint(); 172 animationSet.addAnimation(child); 173 } 174 final long restrictDuration = 1500; 175 animationSet.restrictDuration(restrictDuration); 176 final List<Animation> children = animationSet.getAnimations(); 177 178 assertTrue(originChildStartOffset[0] > restrictDuration); 179 assertEquals(0, children.get(0).getDuration()); 180 assertEquals(restrictDuration, children.get(0).getStartOffset()); 181 182 assertTrue(originChildStartOffset[1] < restrictDuration); 183 assertTrue(originChildDurationHint[1] > restrictDuration); 184 assertTrue(children.get(1).computeDurationHint() <= restrictDuration); 185 186 assertTrue(originChildDurationHint[2] > restrictDuration); 187 assertTrue(children.get(2).computeDurationHint() <= restrictDuration); 188 assertTrue(originChildRepeatCount[2] > children.get(2).getRepeatCount()); 189 } 190 191 public void testComputeDurationHint() { 192 final AnimationSet animationSet = createAnimationSet(); 193 final List<Animation> children = animationSet.getAnimations(); 194 long expectedDuration = 0; 195 for (int i = 0; i < children.size(); i++) { 196 expectedDuration = Math.max(expectedDuration, children.get(i).computeDurationHint()); 197 } 198 assertEquals(expectedDuration, animationSet.computeDurationHint()); 199 } 200 201 public void testScaleCurrentDuration() { 202 final AnimationSet animationSet = createAnimationSet(); 203 List<Animation> children = animationSet.getAnimations(); 204 final long[] originDurations = new long[children.size()]; 205 for (int i = 0; i < children.size(); i++) { 206 originDurations[i] = children.get(i).getDuration(); 207 } 208 209 final float scaleFactor = 2.0f; 210 animationSet.scaleCurrentDuration(scaleFactor); 211 children = animationSet.getAnimations(); 212 for (int i = 0; i < children.size(); i++) { 213 assertEquals((long) (originDurations[i] * scaleFactor), children.get(i).getDuration()); 214 } 215 } 216 217 public void testAccessRepeatMode() { 218 final AnimationSet animationSet = createAnimationSet(); 219 animationSet.setRepeatMode(Animation.RESTART); 220 animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 221 assertEquals(Animation.RESTART, animationSet.getRepeatMode()); 222 List<Animation> children = animationSet.getAnimations(); 223 for (int i = 0; i < children.size(); i++) { 224 assertEquals(Animation.RESTART, children.get(i).getRepeatMode()); 225 } 226 227 animationSet.setRepeatMode(Animation.REVERSE); 228 animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 229 assertEquals(Animation.REVERSE, animationSet.getRepeatMode()); 230 children = animationSet.getAnimations(); 231 for (int i = 0; i < children.size(); i++) { 232 assertEquals(Animation.REVERSE, children.get(i).getRepeatMode()); 233 } 234 } 235 236 public void testAccessStartOffset() { 237 final AnimationSet animationSet = createAnimationSet(); 238 assertEquals(0, animationSet.getStartOffset()); 239 List<Animation> children = animationSet.getAnimations(); 240 final long[] originStartOffset = new long[children.size()]; 241 for (int i = 0; i < children.size(); i++) { 242 originStartOffset[i] = children.get(i).getStartOffset(); 243 } 244 245 animationSet.setStartOffset(100); 246 animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 247 assertEquals(100, animationSet.getStartOffset()); 248 children = animationSet.getAnimations(); 249 for (int i = 0; i < children.size(); i++) { 250 assertEquals(originStartOffset[i] + animationSet.getStartOffset(), 251 children.get(i).getStartOffset()); 252 } 253 254 assertTrue(animationSet.isInitialized()); 255 animationSet.reset(); 256 assertFalse(animationSet.isInitialized()); 257 children = animationSet.getAnimations(); 258 for (int i = 0; i < children.size(); i++) { 259 assertEquals(originStartOffset[i], children.get(i).getStartOffset()); 260 } 261 } 262 263 public void testAccessStartTime() { 264 final AnimationSet animationSet = createAnimationSet(); 265 final long[] originChildStartTime = {1000, 2000, 3000}; 266 List<Animation> children = animationSet.getAnimations(); 267 for (int i = 0; i < children.size(); i++) { 268 children.get(i).setStartTime(originChildStartTime[i]); 269 } 270 271 // Get earliest start time of children animations 272 assertEquals(1000, animationSet.getStartTime()); 273 274 final long startTime = 200; 275 animationSet.setStartTime(startTime); 276 assertEquals(startTime, animationSet.getStartTime()); 277 278 children = animationSet.getAnimations(); 279 for (int i = 0; i < children.size(); i++) { 280 assertEquals(startTime, children.get(i).getStartTime()); 281 } 282 } 283 284 public void testGetTransformation() { 285 final View animWindowParent = mActivity.findViewById(R.id.anim_window_parent); 286 final View animWindow = mActivity.findViewById(R.id.anim_window); 287 final AnimationSet animationSet = createAnimationSet(); 288 animationSet.setDuration(2000); 289 animationSet.initialize(animWindow.getWidth(), animWindow.getHeight(), 290 animWindowParent.getWidth(), animWindowParent.getHeight()); 291 292 AnimationTestUtils.assertRunAnimation(getInstrumentation(), animWindow, animationSet); 293 final long startTime = animationSet.getStartTime(); 294 295 assertGetTransformation(animationSet, startTime, true); 296 assertGetTransformation(animationSet, startTime + 100, true); 297 assertGetTransformation(animationSet, startTime + animationSet.getDuration(), false); 298 } 299 300 private void assertGetTransformation(final AnimationSet animationSet, 301 final long currentTime, final boolean result) { 302 final Transformation transformation = new Transformation(); 303 final Transformation expectedTransformation = new Transformation(); 304 final Transformation tempTransformation = new Transformation(); 305 306 assertEquals(result, animationSet.getTransformation(currentTime, transformation)); 307 final List<Animation> children = animationSet.getAnimations(); 308 for (int i = children.size() - 1; i >= 0; i--) { 309 tempTransformation.clear(); 310 children.get(i).getTransformation(currentTime, tempTransformation); 311 expectedTransformation.compose(tempTransformation); 312 } 313 assertTransformationEquals(expectedTransformation, transformation); 314 } 315 316 private void assertTransformationEquals(final Transformation expected, 317 final Transformation actual) { 318 assertEquals(expected.getAlpha(), actual.getAlpha(), DELTA); 319 final float[] expectedValues = new float[9]; 320 final float[] actualValues = new float[9]; 321 expected.getMatrix().getValues(expectedValues); 322 actual.getMatrix().getValues(actualValues); 323 for (int i = 0; i < expectedValues.length; i++) { 324 assertEquals(expectedValues[i], actualValues[i], DELTA); 325 } 326 } 327 328 public void testAccessAnimations() { 329 final AnimationSet animationSet = new AnimationSet(true); 330 final Animation animation1 = new AlphaAnimation(0.0f, 1.0f); 331 animationSet.addAnimation(animation1); 332 final Animation animation2 = new AlphaAnimation(0.5f, 1.0f); 333 animationSet.addAnimation(animation2); 334 final Animation animation3 = new AlphaAnimation(1.0f, 0.5f); 335 animationSet.addAnimation(animation3); 336 337 final List<Animation> children = animationSet.getAnimations(); 338 assertEquals(3, children.size()); 339 assertSame(animation1, children.get(0)); 340 assertSame(animation2, children.get(1)); 341 assertSame(animation3, children.get(2)); 342 } 343 344 public void testWillChangeTransformationMatrix() { 345 final AnimationSet animationSet = new AnimationSet(true); 346 assertFalse(animationSet.willChangeTransformationMatrix()); 347 348 // Add first animation, this is an alpha animation and will not change 349 // the transformation matrix. 350 animationSet.addAnimation(new AlphaAnimation(0.0f, 1.0f)); 351 assertFalse(animationSet.willChangeTransformationMatrix()); 352 assertFalse(animationSet.willChangeBounds()); 353 354 // Add second animation, this is an scale animation and will change 355 // the transformation matrix. 356 animationSet.addAnimation(new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f)); 357 assertTrue(animationSet.willChangeTransformationMatrix()); 358 assertTrue(animationSet.willChangeBounds()); 359 } 360 361 public void testClone() throws CloneNotSupportedException { 362 final MyAnimationSet animationSet = new MyAnimationSet(false); 363 final Animation alpha = new AlphaAnimation(0.0f, 1.0f); 364 alpha.setInterpolator(new AccelerateInterpolator()); 365 alpha.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 366 final Animation scale = new ScaleAnimation(1.0f, 2.0f, 1.0f, 3.0f); 367 scale.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 368 animationSet.addAnimation(alpha); 369 animationSet.addAnimation(scale); 370 final long startTime = 0; 371 animationSet.setStartTime(startTime); 372 animationSet.setDuration(ANIMATIONSET_DURATION); 373 animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 374 375 final AnimationSet clone = animationSet.clone(); 376 clone.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE); 377 final List<Animation> children = animationSet.getAnimations(); 378 final List<Animation> cloneChildren = clone.getAnimations(); 379 assertEquals(children.size(), cloneChildren.size()); 380 final Transformation expectedTransformation = new Transformation(); 381 final Transformation transformation = new Transformation(); 382 for (int i = 0; i < children.size(); i++) { 383 children.get(i).getTransformation(startTime, expectedTransformation); 384 cloneChildren.get(i).getTransformation(startTime, transformation); 385 assertTransformationEquals(expectedTransformation, transformation); 386 387 children.get(i).getTransformation(startTime + ANIMATIONSET_DURATION / 2, 388 expectedTransformation); 389 cloneChildren.get(i).getTransformation(startTime + ANIMATIONSET_DURATION /2, 390 transformation); 391 assertTransformationEquals(expectedTransformation, transformation); 392 393 children.get(i).getTransformation(startTime + ANIMATIONSET_DURATION, 394 expectedTransformation); 395 cloneChildren.get(i).getTransformation(startTime + ANIMATIONSET_DURATION, 396 transformation); 397 assertTransformationEquals(expectedTransformation, transformation); 398 } 399 } 400 401 private static class MyAnimationSet extends AnimationSet { 402 403 public MyAnimationSet(boolean shareInterpolator) { 404 super(shareInterpolator); 405 } 406 407 @Override 408 protected AnimationSet clone() throws CloneNotSupportedException { 409 return super.clone(); 410 } 411 } 412 } 413