| /* |
| * 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 com.android.cts.view.R; |
| |
| |
| 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.ViewGroup.LayoutParams; |
| import android.view.animation.Animation; |
| import android.view.animation.AnimationUtils; |
| import android.view.animation.GridLayoutAnimationController; |
| import android.view.animation.Transformation; |
| import android.view.animation.GridLayoutAnimationController.AnimationParameters; |
| import android.widget.AbsListView; |
| import android.widget.GridView; |
| |
| public class GridLayoutAnimationControllerTest |
| extends ActivityInstrumentationTestCase2<GridLayoutAnimCtsActivity> { |
| |
| private GridLayoutAnimCtsActivity mActivity; |
| private Animation mDefaultAnimation; |
| private GridLayoutAnimationController mController; |
| /** The GridView will be 3*3 */ |
| private GridView mGridView; |
| /** Default delay of GridLayoutAnimationController */ |
| private static final float DEFAULT_DELAY = 0.5f; |
| /** Default max duration of running */ |
| private static final long DEFAULT_MAX_DURATION = 5000; |
| private static final float DELTA = 0.1f; |
| private static final int INDEX_OF_CHILD1 = 0; |
| private static final int INDEX_OF_CHILD2 = 1; |
| private static final int INDEX_OF_CHILD3 = 2; |
| private static final int INDEX_OF_CHILD4 = 3; |
| private static final int INDEX_OF_CHILD5 = 4; |
| private static final int INDEX_OF_CHILD6 = 5; |
| private static final int INDEX_OF_CHILD7 = 6; |
| private static final int INDEX_OF_CHILD8 = 7; |
| private static final int INDEX_OF_CHILD9 = 8; |
| |
| public GridLayoutAnimationControllerTest() { |
| super("com.android.cts.view", GridLayoutAnimCtsActivity.class); |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| mActivity = getActivity(); |
| mDefaultAnimation = AnimationUtils.loadAnimation(mActivity, |
| R.anim.layout_anim_controller_animation); |
| mController = new GridLayoutAnimationController(mDefaultAnimation, DEFAULT_DELAY, |
| DEFAULT_DELAY); |
| mGridView = mActivity.getGridView(); |
| } |
| |
| public void testConstructor() { |
| XmlResourceParser parser = mActivity.getResources().getAnimation( |
| R.anim.accelerate_decelerate_alpha); |
| AttributeSet attrs = Xml.asAttributeSet(parser); |
| new GridLayoutAnimationController(mActivity, attrs); |
| GridLayoutAnimationController controller = |
| new GridLayoutAnimationController(mDefaultAnimation); |
| // Default rowDelay and columnDelay is 0.5f |
| assertEquals(DEFAULT_DELAY, controller.getRowDelay()); |
| assertEquals(DEFAULT_DELAY, controller.getColumnDelay()); |
| new GridLayoutAnimationController(mDefaultAnimation, 0.5f, 0.5f); |
| } |
| |
| public void testAccessDelay() throws InterruptedException { |
| float delay = 1.5f; |
| long maxDuration = 13000; |
| mController.setRowDelay(delay); |
| assertEquals(delay, mController.getRowDelay()); |
| AnimationTestUtils.assertRunController(getInstrumentation(), mGridView, mController, |
| maxDuration); |
| |
| Animation childAnimation1 = mGridView.getChildAt(INDEX_OF_CHILD1).getAnimation(); |
| Animation childAnimation4 = mGridView.getChildAt(INDEX_OF_CHILD4).getAnimation(); |
| Animation childAnimation7 = mGridView.getChildAt(INDEX_OF_CHILD7).getAnimation(); |
| assertChildrenDelay(childAnimation1, childAnimation4, childAnimation7); |
| |
| mController.setColumnDelay(delay); |
| assertEquals(delay, mController.getColumnDelay()); |
| AnimationTestUtils.assertRunController(getInstrumentation(), mGridView, mController, |
| maxDuration); |
| |
| childAnimation1 = mGridView.getChildAt(INDEX_OF_CHILD1).getAnimation(); |
| Animation childAnimation2 = mGridView.getChildAt(INDEX_OF_CHILD2).getAnimation(); |
| Animation childAnimation3 = mGridView.getChildAt(INDEX_OF_CHILD3).getAnimation(); |
| assertChildrenDelay(childAnimation1, childAnimation2, childAnimation3); |
| } |
| |
| /** |
| * This method is used to assert child animation's attrs to check setDelay() works. |
| * The set delay is 1.5f. |
| * @param child1 |
| * @param child2 |
| * @param child3 |
| * @param delay |
| */ |
| private void assertChildrenDelay(Animation child1, Animation child2, Animation child3) { |
| long startTime = child1.getStartTime(); |
| long offsetTime1 = child1.getStartOffset(); |
| long offsetTime2 = child2.getStartOffset(); |
| long offsetTime3 = child3.getStartOffset(); |
| assertEquals(0, offsetTime1); |
| assertEquals(1500, offsetTime2); |
| assertEquals(3000, offsetTime3); |
| |
| Transformation transformation1 = new Transformation(); |
| Transformation transformation2 = new Transformation(); |
| Transformation transformation3 = new Transformation(); |
| |
| // child1 has started animation, child2 and child3 haven't started |
| child1.getTransformation(startTime + 500, transformation1); |
| child2.getTransformation(startTime + 500, transformation2); |
| child3.getTransformation(startTime + 500, transformation3); |
| assertIsRunningAnimation(transformation1.getAlpha()); |
| assertEquals(0.0f, transformation2.getAlpha(), DELTA); |
| assertEquals(0.0f, transformation3.getAlpha(), DELTA); |
| |
| // child1 has finished, child2 and child3 haven't started |
| child1.getTransformation(startTime + 1200, transformation1); |
| child2.getTransformation(startTime + 1200, transformation2); |
| child3.getTransformation(startTime + 1200, transformation3); |
| assertEquals(1.0f, transformation1.getAlpha(), DELTA); |
| assertEquals(0.0f, transformation2.getAlpha(), DELTA); |
| assertEquals(0.0f, transformation3.getAlpha(), DELTA); |
| |
| // child1 has finished, child2 has started animation, child3 hasn't started. |
| child1.getTransformation(startTime + 2000, transformation1); |
| child2.getTransformation(startTime + 2000, transformation2); |
| child3.getTransformation(startTime + 2000, transformation3); |
| assertEquals(1.0f, transformation1.getAlpha(), DELTA); |
| assertIsRunningAnimation(transformation2.getAlpha()); |
| assertEquals(0.0f, transformation3.getAlpha(), DELTA); |
| |
| // child1 and child2 have finished, child3 hasn't started |
| child1.getTransformation(startTime + 2700, transformation1); |
| child2.getTransformation(startTime + 2700, transformation2); |
| child3.getTransformation(startTime + 2700, transformation3); |
| assertEquals(1.0f, transformation1.getAlpha(), DELTA); |
| assertEquals(1.0f, transformation2.getAlpha(), DELTA); |
| assertEquals(0.0f, transformation3.getAlpha(), DELTA); |
| |
| // child1 and child2 have finished, child3 has started animation |
| child1.getTransformation(startTime + 3500, transformation1); |
| child2.getTransformation(startTime + 3500, transformation2); |
| child3.getTransformation(startTime + 3500, transformation3); |
| assertIsRunningAnimation(transformation3.getAlpha()); |
| } |
| |
| private void assertIsRunningAnimation(float alpha) { |
| assertTrue(alpha > 0.0f); |
| assertTrue(alpha < 1.0f); |
| } |
| |
| public void testAccessDirection() throws InterruptedException { |
| mController.setDirection(GridLayoutAnimationController.DIRECTION_BOTTOM_TO_TOP); |
| assertEquals(GridLayoutAnimationController.DIRECTION_BOTTOM_TO_TOP, |
| mController.getDirection()); |
| AnimationTestUtils.assertRunController(getInstrumentation(), mGridView, mController, |
| DEFAULT_MAX_DURATION); |
| |
| Animation childAnimation1 = mGridView.getChildAt(INDEX_OF_CHILD1).getAnimation(); |
| Animation childAnimation4 = mGridView.getChildAt(INDEX_OF_CHILD4).getAnimation(); |
| Animation childAnimation7 = mGridView.getChildAt(INDEX_OF_CHILD7).getAnimation(); |
| |
| // Test bottom_to_top direction |
| long startTime = childAnimation7.getStartTime(); |
| assertEquals(1000, childAnimation1.getStartOffset()); |
| assertEquals(500, childAnimation4.getStartOffset()); |
| assertEquals(0, childAnimation7.getStartOffset()); |
| |
| Transformation transformation1 = new Transformation(); |
| Transformation transformation2 = new Transformation(); |
| Transformation transformation3 = new Transformation(); |
| |
| // childAnimation7 has started animation, childAnimation4 and childAnimation1 haven't |
| // started |
| childAnimation1.getTransformation(startTime + 500, transformation1); |
| childAnimation4.getTransformation(startTime + 500, transformation2); |
| childAnimation7.getTransformation(startTime + 500, transformation3); |
| assertEquals(0.0f, transformation1.getAlpha(), DELTA); |
| assertEquals(0.0f, transformation2.getAlpha(), DELTA); |
| assertIsRunningAnimation(transformation3.getAlpha()); |
| |
| // childAnimation4 has started animation, childAnimation7 has finished and childAnimation1 |
| // hasn't started |
| childAnimation1.getTransformation(startTime + 1000, transformation1); |
| childAnimation4.getTransformation(startTime + 1000, transformation2); |
| childAnimation7.getTransformation(startTime + 1000, transformation3); |
| assertEquals(0.0f, transformation1.getAlpha(), DELTA); |
| assertIsRunningAnimation(transformation2.getAlpha()); |
| assertEquals(1.0f, transformation3.getAlpha(), DELTA); |
| |
| // childAnimation1 has started animation, childAnimation4, childAnimation7 have finished |
| childAnimation1.getTransformation(startTime + 1500, transformation1); |
| childAnimation4.getTransformation(startTime + 1500, transformation2); |
| childAnimation7.getTransformation(startTime + 1500, transformation3); |
| assertIsRunningAnimation(transformation1.getAlpha()); |
| assertEquals(1.0f, transformation2.getAlpha(), DELTA); |
| assertEquals(1.0f, transformation3.getAlpha(), DELTA); |
| |
| // Test top_to_bottom direction |
| mController.setDirection(GridLayoutAnimationController.DIRECTION_TOP_TO_BOTTOM); |
| assertEquals(GridLayoutAnimationController.DIRECTION_TOP_TO_BOTTOM, |
| mController.getDirection()); |
| AnimationTestUtils.assertRunController(getInstrumentation(), mGridView, mController, |
| DEFAULT_MAX_DURATION); |
| |
| transformation1 = new Transformation(); |
| transformation2 = new Transformation(); |
| transformation3 = new Transformation(); |
| childAnimation1 = mGridView.getChildAt(INDEX_OF_CHILD1).getAnimation(); |
| childAnimation4 = mGridView.getChildAt(INDEX_OF_CHILD4).getAnimation(); |
| childAnimation7 = mGridView.getChildAt(INDEX_OF_CHILD7).getAnimation(); |
| startTime = childAnimation1.getStartTime(); |
| assertEquals(0, childAnimation1.getStartOffset()); |
| assertEquals(500, childAnimation4.getStartOffset()); |
| assertEquals(1000, childAnimation7.getStartOffset()); |
| |
| // childAnimation1 has started animation, childAnimation4 and childAnimation7 haven't |
| // started |
| childAnimation1.getTransformation(startTime + 500, transformation1); |
| childAnimation4.getTransformation(startTime + 500, transformation2); |
| childAnimation7.getTransformation(startTime + 500, transformation3); |
| assertIsRunningAnimation(transformation1.getAlpha()); |
| assertEquals(0.0f, transformation2.getAlpha(), DELTA); |
| assertEquals(0.0f, transformation3.getAlpha(), DELTA); |
| |
| // childAnimation4 has started animation, childAnimation1 has finished and childAnimation7 |
| // hasn't started |
| childAnimation1.getTransformation(startTime + 1000, transformation1); |
| childAnimation4.getTransformation(startTime + 1000, transformation2); |
| childAnimation7.getTransformation(startTime + 1000, transformation3); |
| assertEquals(1.0f, transformation1.getAlpha(), DELTA); |
| assertIsRunningAnimation(transformation2.getAlpha()); |
| assertEquals(0.0f, transformation3.getAlpha(), DELTA); |
| |
| // childAnimation7 has started animation, childAnimation1 and childAnimation4 has finished |
| childAnimation1.getTransformation(startTime + 1500, transformation1); |
| childAnimation4.getTransformation(startTime + 1500, transformation2); |
| childAnimation7.getTransformation(startTime + 1500, transformation3); |
| assertEquals(1.0f, transformation1.getAlpha(), DELTA); |
| assertEquals(1.0f, transformation2.getAlpha(), DELTA); |
| assertIsRunningAnimation(transformation3.getAlpha()); |
| } |
| |
| public void testGetDelayForView() throws Throwable { |
| Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.decelerate_alpha); |
| animation.setFillAfter(true); |
| MyGridLayoutAnimationController controller = new MyGridLayoutAnimationController(animation); |
| |
| // child1's animationParams |
| final AbsListView.LayoutParams layoutParams1 = setAnimationParameters(0); |
| // child2's animationParams |
| final AbsListView.LayoutParams layoutParams2 = setAnimationParameters(1); |
| // child3's animationParams |
| final AbsListView.LayoutParams layoutParams3 = setAnimationParameters(2); |
| // child4's animationParams |
| final AbsListView.LayoutParams layoutParams4 = setAnimationParameters(3); |
| // child5's animationParams |
| final AbsListView.LayoutParams layoutParams5 = setAnimationParameters(4); |
| // child6's animationParams |
| final AbsListView.LayoutParams layoutParams6 = setAnimationParameters(5); |
| // child7's animationParams |
| final AbsListView.LayoutParams layoutParams7 = setAnimationParameters(6); |
| // child8's animationParams |
| final AbsListView.LayoutParams layoutParams8 = setAnimationParameters(7); |
| // child9's animationParams |
| final AbsListView.LayoutParams layoutParams9 = setAnimationParameters(8); |
| |
| final View child1 = mGridView.getChildAt(INDEX_OF_CHILD1); |
| final View child2 = mGridView.getChildAt(INDEX_OF_CHILD2); |
| final View child3 = mGridView.getChildAt(INDEX_OF_CHILD3); |
| final View child4 = mGridView.getChildAt(INDEX_OF_CHILD4); |
| final View child5 = mGridView.getChildAt(INDEX_OF_CHILD5); |
| final View child6 = mGridView.getChildAt(INDEX_OF_CHILD6); |
| final View child7 = mGridView.getChildAt(INDEX_OF_CHILD7); |
| final View child8 = mGridView.getChildAt(INDEX_OF_CHILD8); |
| final View child9 = mGridView.getChildAt(INDEX_OF_CHILD9); |
| runTestOnUiThread(new Runnable() { |
| public void run() { |
| child1.setLayoutParams(layoutParams1); |
| child2.setLayoutParams(layoutParams2); |
| child3.setLayoutParams(layoutParams3); |
| child4.setLayoutParams(layoutParams4); |
| child5.setLayoutParams(layoutParams5); |
| child6.setLayoutParams(layoutParams6); |
| child7.setLayoutParams(layoutParams7); |
| child8.setLayoutParams(layoutParams8); |
| child9.setLayoutParams(layoutParams9); |
| } |
| }); |
| |
| AnimationTestUtils.assertRunController(getInstrumentation(), mGridView, controller, |
| DEFAULT_MAX_DURATION); |
| |
| assertEquals(0, controller.getDelayForView(child1)); |
| assertEquals(1000, controller.getDelayForView(child2)); |
| assertEquals(2000, controller.getDelayForView(child3)); |
| assertEquals(1000, controller.getDelayForView(child4)); |
| assertEquals(2000, controller.getDelayForView(child5)); |
| assertEquals(3000, controller.getDelayForView(child6)); |
| assertEquals(2000, controller.getDelayForView(child7)); |
| assertEquals(3000, controller.getDelayForView(child8)); |
| assertEquals(4000, controller.getDelayForView(child9)); |
| } |
| |
| private AbsListView.LayoutParams setAnimationParameters(int index) { |
| AnimationParameters animationParams = new AnimationParameters(); |
| animationParams.index = index; |
| animationParams.count = 9; |
| final AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams( |
| LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); |
| layoutParams.layoutAnimationParameters = animationParams; |
| return layoutParams; |
| } |
| |
| public void testAccessDirectionPriority() throws InterruptedException { |
| // Before setting DirectionPriority, childAnimation7 will be later than childAnimation2, |
| // and childAnimation8 will be later than childAnimation3 |
| AnimationTestUtils.assertRunController(getInstrumentation(), mGridView, mController, |
| DEFAULT_MAX_DURATION); |
| Animation childAnimation1 = mGridView.getChildAt(INDEX_OF_CHILD1).getAnimation(); |
| Animation childAnimation2 = mGridView.getChildAt(INDEX_OF_CHILD2).getAnimation(); |
| Animation childAnimation3 = mGridView.getChildAt(INDEX_OF_CHILD3).getAnimation(); |
| Animation childAnimation7 = mGridView.getChildAt(INDEX_OF_CHILD7).getAnimation(); |
| Animation childAnimation8 = mGridView.getChildAt(INDEX_OF_CHILD8).getAnimation(); |
| |
| long startTime = childAnimation1.getStartTime(); |
| assertEquals(500, childAnimation2.getStartOffset()); |
| assertEquals(1000, childAnimation3.getStartOffset()); |
| assertEquals(1000, childAnimation7.getStartOffset()); |
| assertEquals(1500, childAnimation8.getStartOffset()); |
| |
| |
| Transformation transformation1 = new Transformation(); |
| Transformation transformation2 = new Transformation(); |
| |
| childAnimation2.getTransformation(startTime + 700, transformation1); |
| childAnimation7.getTransformation(startTime + 700, transformation2); |
| assertIsRunningAnimation(transformation1.getAlpha()); |
| assertEquals(0.0f, transformation2.getAlpha(), DELTA); |
| |
| childAnimation3.getTransformation(startTime + 1200, transformation1); |
| childAnimation8.getTransformation(startTime + 1200, transformation2); |
| assertIsRunningAnimation(transformation1.getAlpha()); |
| assertEquals(0.0f, transformation2.getAlpha(), DELTA); |
| |
| // After setting DirectionPriority to PRIORITY_COLUMN, childAnimation7 will be earlier |
| // than childAnimation2, and childAnimation8 will be earlier than childAnimation3 |
| mController.setDirectionPriority(GridLayoutAnimationController.PRIORITY_COLUMN); |
| assertEquals(GridLayoutAnimationController.PRIORITY_COLUMN, |
| mController.getDirectionPriority()); |
| AnimationTestUtils.assertRunController(getInstrumentation(), mGridView, mController, |
| DEFAULT_MAX_DURATION); |
| childAnimation1 = mGridView.getChildAt(INDEX_OF_CHILD1).getAnimation(); |
| childAnimation2 = mGridView.getChildAt(INDEX_OF_CHILD2).getAnimation(); |
| childAnimation3 = mGridView.getChildAt(INDEX_OF_CHILD3).getAnimation(); |
| childAnimation7 = mGridView.getChildAt(INDEX_OF_CHILD7).getAnimation(); |
| childAnimation8 = mGridView.getChildAt(INDEX_OF_CHILD8).getAnimation(); |
| |
| startTime = childAnimation1.getStartTime(); |
| assertEquals(1500, childAnimation2.getStartOffset()); |
| assertEquals(3000, childAnimation3.getStartOffset()); |
| assertEquals(1000, childAnimation7.getStartOffset()); |
| assertEquals(2500, childAnimation8.getStartOffset()); |
| |
| transformation1 = new Transformation(); |
| transformation2 = new Transformation(); |
| |
| childAnimation2.getTransformation(startTime + 1200, transformation1); |
| childAnimation7.getTransformation(startTime + 1200, transformation2); |
| assertEquals(0.0f, transformation1.getAlpha(), DELTA); |
| assertIsRunningAnimation(transformation2.getAlpha()); |
| |
| childAnimation3.getTransformation(startTime + 2700, transformation1); |
| childAnimation8.getTransformation(startTime + 2700, transformation2); |
| assertEquals(0.0f, transformation1.getAlpha(), DELTA); |
| assertIsRunningAnimation(transformation2.getAlpha()); |
| } |
| |
| public void testWillOverlap() { |
| GridLayoutAnimationController controller = new GridLayoutAnimationController( |
| mDefaultAnimation); |
| |
| controller.setColumnDelay(0.5f); |
| controller.setRowDelay(0.5f); |
| assertTrue(controller.willOverlap()); |
| |
| controller.setColumnDelay(0.5f); |
| controller.setRowDelay(1.0f); |
| assertTrue(controller.willOverlap()); |
| |
| controller.setColumnDelay(1.0f); |
| controller.setRowDelay(0.5f); |
| assertTrue(controller.willOverlap()); |
| |
| controller.setColumnDelay(1.0f); |
| controller.setRowDelay(1.0f); |
| assertFalse(controller.willOverlap()); |
| } |
| |
| private class MyGridLayoutAnimationController extends GridLayoutAnimationController { |
| public MyGridLayoutAnimationController(Animation animation) { |
| super(animation); |
| } |
| |
| protected long getDelayForView(View view) { |
| return super.getDelayForView(view); |
| } |
| } |
| } |