blob: 0b3bf4928febc951129231aac9f1090cfb6d276a [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.view.animation.cts;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.test.ActivityInstrumentationTestCase2;
import android.util.AttributeSet;
import android.util.Xml;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.ScaleAnimation;
import android.view.animation.Transformation;
import android.view.animation.TranslateAnimation;
import com.android.cts.view.R;
public class AnimationSetTest
extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
private static final float DELTA = 0.001f;
private static final long SHORT_CHILD_DURATION = 400;
private static final long MEDIUM_CHILD_DURATION = 800;
private static final long LONG_CHILD_DURATION = 1200;
/**
* initial size for initialize(int width, int height, int parentWidth, int parentHeight)
*/
private static final int INITIAL_SIZE = 100;
private static final long ANIMATIONSET_DURATION = 1000;
private Activity mActivity;
public AnimationSetTest() {
super("com.android.cts.view", AnimationTestCtsActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mActivity = getActivity();
}
public void testConstructor() {
new AnimationSet(true);
final XmlResourceParser parser = mActivity.getResources().getAnimation(
R.anim.anim_set);
final AttributeSet attr = Xml.asAttributeSet(parser);
assertNotNull(attr);
// Test with real AttributeSet
new AnimationSet(mActivity, attr);
}
public void testInitialize() {
final AnimationSet animationSet = createAnimationSet();
animationSet.setDuration(ANIMATIONSET_DURATION);
// Before initialize, the durations are original.
List<Animation> children = animationSet.getAnimations();
assertEquals(SHORT_CHILD_DURATION, children.get(0).getDuration());
assertEquals(MEDIUM_CHILD_DURATION, children.get(1).getDuration());
assertEquals(LONG_CHILD_DURATION, children.get(2).getDuration());
// After initialize, AnimationSet override the child values.
assertFalse(animationSet.isInitialized());
animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
assertTrue(animationSet.isInitialized());
children = animationSet.getAnimations();
assertEquals(ANIMATIONSET_DURATION, children.get(0).getDuration());
assertEquals(ANIMATIONSET_DURATION, children.get(1).getDuration());
assertEquals(ANIMATIONSET_DURATION, children.get(2).getDuration());
}
private AnimationSet createAnimationSet() {
AnimationSet animationSet = new AnimationSet(true);
Animation animation1 = new AlphaAnimation(0.0f, 1.0f);
animation1.setDuration(SHORT_CHILD_DURATION);
animationSet.addAnimation(animation1);
Animation animation2 = new ScaleAnimation(1.0f, 2.0f, 1.0f, 3.0f);
animation2.setDuration(MEDIUM_CHILD_DURATION);
animationSet.addAnimation(animation2);
Animation animation3 = new TranslateAnimation(0.0f, 50.0f, 0.0f, 5.0f);
animation3.setDuration(LONG_CHILD_DURATION);
animationSet.addAnimation(animation3);
return animationSet;
}
public void testSetFillAfter() {
final AnimationSet animationSet = createAnimationSet();
assertFalse(animationSet.getFillAfter());
List<Animation> children = animationSet.getAnimations();
children.get(0).setFillAfter(true);
children.get(1).setFillAfter(false);
animationSet.setFillAfter(true);
animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
assertTrue(animationSet.getFillAfter());
children = animationSet.getAnimations();
for (int i = 0; i < children.size(); i++) {
assertTrue(children.get(i).getFillAfter());
}
}
public void testSetFillBefore() {
final AnimationSet animationSet = createAnimationSet();
assertTrue(animationSet.getFillBefore());
List<Animation> children = animationSet.getAnimations();
children.get(0).setFillBefore(true);
children.get(1).setFillBefore(false);
animationSet.setFillBefore(false);
animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
assertFalse(animationSet.getFillBefore());
children = animationSet.getAnimations();
for (int i = 0; i < children.size(); i++) {
assertFalse(children.get(i).getFillBefore());
}
}
public void testAccessDuration() {
final AnimationSet animationSet = createAnimationSet();
assertEquals(LONG_CHILD_DURATION, animationSet.getDuration());
assertTrue(animationSet.getDuration() > ANIMATIONSET_DURATION);
animationSet.setDuration(ANIMATIONSET_DURATION);
animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
assertEquals(ANIMATIONSET_DURATION, animationSet.getDuration());
final List<Animation> children = animationSet.getAnimations();
for (int i = 0; i < children.size(); i++) {
assertEquals(ANIMATIONSET_DURATION, children.get(i).getDuration());
}
}
public void testRestrictDuration() {
final AnimationSet animationSet = new AnimationSet(false);
Animation child = null;
final long[] originChildDuration = { 1000, 1000, 500 };
final long[] originChildStartOffset = { 2000, 1000, 0 };
final int[] originChildRepeatCount = { 0, 0, 4 };
final long[] originChildDurationHint = new long[3];
for (int i = 0; i < 3; i++) {
child = new AlphaAnimation(0.0f, 1.0f);
child.setDuration(originChildDuration[i]);
child.setStartOffset(originChildStartOffset[i]);
child.setRepeatCount(originChildRepeatCount[i]);
originChildDurationHint[i] = child.computeDurationHint();
animationSet.addAnimation(child);
}
final long restrictDuration = 1500;
animationSet.restrictDuration(restrictDuration);
final List<Animation> children = animationSet.getAnimations();
assertTrue(originChildStartOffset[0] > restrictDuration);
assertEquals(0, children.get(0).getDuration());
assertEquals(restrictDuration, children.get(0).getStartOffset());
assertTrue(originChildStartOffset[1] < restrictDuration);
assertTrue(originChildDurationHint[1] > restrictDuration);
assertTrue(children.get(1).computeDurationHint() <= restrictDuration);
assertTrue(originChildDurationHint[2] > restrictDuration);
assertTrue(children.get(2).computeDurationHint() <= restrictDuration);
assertTrue(originChildRepeatCount[2] > children.get(2).getRepeatCount());
}
public void testComputeDurationHint() {
final AnimationSet animationSet = createAnimationSet();
final List<Animation> children = animationSet.getAnimations();
long expectedDuration = 0;
for (int i = 0; i < children.size(); i++) {
expectedDuration = Math.max(expectedDuration, children.get(i).computeDurationHint());
}
assertEquals(expectedDuration, animationSet.computeDurationHint());
}
public void testScaleCurrentDuration() {
final AnimationSet animationSet = createAnimationSet();
List<Animation> children = animationSet.getAnimations();
final long[] originDurations = new long[children.size()];
for (int i = 0; i < children.size(); i++) {
originDurations[i] = children.get(i).getDuration();
}
final float scaleFactor = 2.0f;
animationSet.scaleCurrentDuration(scaleFactor);
children = animationSet.getAnimations();
for (int i = 0; i < children.size(); i++) {
assertEquals((long) (originDurations[i] * scaleFactor), children.get(i).getDuration());
}
}
public void testAccessRepeatMode() {
final AnimationSet animationSet = createAnimationSet();
animationSet.setRepeatMode(Animation.RESTART);
animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
assertEquals(Animation.RESTART, animationSet.getRepeatMode());
List<Animation> children = animationSet.getAnimations();
for (int i = 0; i < children.size(); i++) {
assertEquals(Animation.RESTART, children.get(i).getRepeatMode());
}
animationSet.setRepeatMode(Animation.REVERSE);
animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
assertEquals(Animation.REVERSE, animationSet.getRepeatMode());
children = animationSet.getAnimations();
for (int i = 0; i < children.size(); i++) {
assertEquals(Animation.REVERSE, children.get(i).getRepeatMode());
}
}
public void testAccessStartOffset() {
final AnimationSet animationSet = createAnimationSet();
assertEquals(0, animationSet.getStartOffset());
List<Animation> children = animationSet.getAnimations();
final long[] originStartOffset = new long[children.size()];
for (int i = 0; i < children.size(); i++) {
originStartOffset[i] = children.get(i).getStartOffset();
}
animationSet.setStartOffset(100);
animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
assertEquals(100, animationSet.getStartOffset());
children = animationSet.getAnimations();
for (int i = 0; i < children.size(); i++) {
assertEquals(originStartOffset[i] + animationSet.getStartOffset(),
children.get(i).getStartOffset());
}
assertTrue(animationSet.isInitialized());
animationSet.reset();
assertFalse(animationSet.isInitialized());
children = animationSet.getAnimations();
for (int i = 0; i < children.size(); i++) {
assertEquals(originStartOffset[i], children.get(i).getStartOffset());
}
}
public void testAccessStartTime() {
final AnimationSet animationSet = createAnimationSet();
final long[] originChildStartTime = {1000, 2000, 3000};
List<Animation> children = animationSet.getAnimations();
for (int i = 0; i < children.size(); i++) {
children.get(i).setStartTime(originChildStartTime[i]);
}
// Get earliest start time of children animations
assertEquals(1000, animationSet.getStartTime());
final long startTime = 200;
animationSet.setStartTime(startTime);
assertEquals(startTime, animationSet.getStartTime());
children = animationSet.getAnimations();
for (int i = 0; i < children.size(); i++) {
assertEquals(startTime, children.get(i).getStartTime());
}
}
public void testGetTransformation() {
final View animWindowParent = mActivity.findViewById(R.id.anim_window_parent);
final View animWindow = mActivity.findViewById(R.id.anim_window);
final AnimationSet animationSet = createAnimationSet();
animationSet.setDuration(2000);
animationSet.initialize(animWindow.getWidth(), animWindow.getHeight(),
animWindowParent.getWidth(), animWindowParent.getHeight());
AnimationTestUtils.assertRunAnimation(getInstrumentation(), animWindow, animationSet);
final long startTime = animationSet.getStartTime();
assertGetTransformation(animationSet, startTime, true);
assertGetTransformation(animationSet, startTime + 100, true);
assertGetTransformation(animationSet, startTime + animationSet.getDuration(), false);
}
private void assertGetTransformation(final AnimationSet animationSet,
final long currentTime, final boolean result) {
final Transformation transformation = new Transformation();
final Transformation expectedTransformation = new Transformation();
final Transformation tempTransformation = new Transformation();
assertEquals(result, animationSet.getTransformation(currentTime, transformation));
final List<Animation> children = animationSet.getAnimations();
for (int i = children.size() - 1; i >= 0; i--) {
tempTransformation.clear();
children.get(i).getTransformation(currentTime, tempTransformation);
expectedTransformation.compose(tempTransformation);
}
assertTransformationEquals(expectedTransformation, transformation);
}
private void assertTransformationEquals(final Transformation expected,
final Transformation actual) {
assertEquals(expected.getAlpha(), actual.getAlpha(), DELTA);
final float[] expectedValues = new float[9];
final float[] actualValues = new float[9];
expected.getMatrix().getValues(expectedValues);
actual.getMatrix().getValues(actualValues);
for (int i = 0; i < expectedValues.length; i++) {
assertEquals(expectedValues[i], actualValues[i], DELTA);
}
}
public void testAccessAnimations() {
final AnimationSet animationSet = new AnimationSet(true);
final Animation animation1 = new AlphaAnimation(0.0f, 1.0f);
animationSet.addAnimation(animation1);
final Animation animation2 = new AlphaAnimation(0.5f, 1.0f);
animationSet.addAnimation(animation2);
final Animation animation3 = new AlphaAnimation(1.0f, 0.5f);
animationSet.addAnimation(animation3);
final List<Animation> children = animationSet.getAnimations();
assertEquals(3, children.size());
assertSame(animation1, children.get(0));
assertSame(animation2, children.get(1));
assertSame(animation3, children.get(2));
}
public void testWillChangeTransformationMatrix() {
final AnimationSet animationSet = new AnimationSet(true);
assertFalse(animationSet.willChangeTransformationMatrix());
// Add first animation, this is an alpha animation and will not change
// the transformation matrix.
animationSet.addAnimation(new AlphaAnimation(0.0f, 1.0f));
assertFalse(animationSet.willChangeTransformationMatrix());
assertFalse(animationSet.willChangeBounds());
// Add second animation, this is an scale animation and will change
// the transformation matrix.
animationSet.addAnimation(new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f));
assertTrue(animationSet.willChangeTransformationMatrix());
assertTrue(animationSet.willChangeBounds());
}
public void testClone() throws CloneNotSupportedException {
final MyAnimationSet animationSet = new MyAnimationSet(false);
final Animation alpha = new AlphaAnimation(0.0f, 1.0f);
alpha.setInterpolator(new AccelerateInterpolator());
alpha.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
final Animation scale = new ScaleAnimation(1.0f, 2.0f, 1.0f, 3.0f);
scale.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
animationSet.addAnimation(alpha);
animationSet.addAnimation(scale);
final long startTime = 0;
animationSet.setStartTime(startTime);
animationSet.setDuration(ANIMATIONSET_DURATION);
animationSet.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
final AnimationSet clone = animationSet.clone();
clone.initialize(INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE, INITIAL_SIZE);
final List<Animation> children = animationSet.getAnimations();
final List<Animation> cloneChildren = clone.getAnimations();
assertEquals(children.size(), cloneChildren.size());
final Transformation expectedTransformation = new Transformation();
final Transformation transformation = new Transformation();
for (int i = 0; i < children.size(); i++) {
children.get(i).getTransformation(startTime, expectedTransformation);
cloneChildren.get(i).getTransformation(startTime, transformation);
assertTransformationEquals(expectedTransformation, transformation);
children.get(i).getTransformation(startTime + ANIMATIONSET_DURATION / 2,
expectedTransformation);
cloneChildren.get(i).getTransformation(startTime + ANIMATIONSET_DURATION /2,
transformation);
assertTransformationEquals(expectedTransformation, transformation);
children.get(i).getTransformation(startTime + ANIMATIONSET_DURATION,
expectedTransformation);
cloneChildren.get(i).getTransformation(startTime + ANIMATIONSET_DURATION,
transformation);
assertTransformationEquals(expectedTransformation, transformation);
}
}
private static class MyAnimationSet extends AnimationSet {
public MyAnimationSet(boolean shareInterpolator) {
super(shareInterpolator);
}
@Override
protected AnimationSet clone() throws CloneNotSupportedException {
return super.clone();
}
}
}