Home | History | Annotate | Download | only in cts
      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 android.animation.Animator;
     19 import android.animation.ArgbEvaluator;
     20 import android.animation.ObjectAnimator;
     21 import android.animation.PropertyValuesHolder;
     22 import android.animation.ValueAnimator;
     23 import android.test.ActivityInstrumentationTestCase2;
     24 import android.util.Property;
     25 import android.view.View;
     26 import android.view.animation.AccelerateInterpolator;
     27 
     28 public class PropertyValuesHolderTest extends
     29         ActivityInstrumentationTestCase2<AnimationActivity> {
     30     private AnimationActivity mActivity;
     31     private Animator mAnimator;
     32     private long mDuration = 1000;
     33     private float mStartY;
     34     private float mEndY;
     35     private Object mObject;
     36     private String mProperty;
     37 
     38     public PropertyValuesHolderTest() {
     39         super(AnimationActivity.class);
     40     }
     41 
     42     public void setUp() throws Exception {
     43          super.setUp();
     44          setActivityInitialTouchMode(false);
     45          mActivity = getActivity();
     46          mAnimator = mActivity.createAnimatorWithDuration(mDuration);
     47          mProperty = "y";
     48          mStartY = mActivity.mStartY;
     49          mEndY = mActivity.mStartY + mActivity.mDeltaY;
     50          mObject = mActivity.view.newBall;
     51     }
     52 
     53     public void testGetPropertyName() {
     54         float[] values = {mStartY, mEndY};
     55         PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat(mProperty, values);
     56         assertEquals(mProperty, pVHolder.getPropertyName());
     57     }
     58 
     59     public void testSetPropertyName() {
     60         float[] values = {mStartY, mEndY};
     61         PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat("", values);
     62         pVHolder.setPropertyName(mProperty);
     63         assertEquals(mProperty, pVHolder.getPropertyName());
     64     }
     65 
     66     public void testClone() {
     67         float[] values = {mStartY, mEndY};
     68         PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat(mProperty, values);
     69         PropertyValuesHolder cloneHolder = pVHolder.clone();
     70         assertEquals(pVHolder.getPropertyName(), cloneHolder.getPropertyName());
     71     }
     72 
     73     public void testSetValues() throws Throwable {
     74         float[] dummyValues = {100, 150};
     75         float[] values = {mStartY, mEndY};
     76         PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat(mProperty, dummyValues);
     77         pVHolder.setFloatValues(values);
     78 
     79         ObjectAnimator objAnimator = ObjectAnimator.ofPropertyValuesHolder(mObject,pVHolder);
     80         assertTrue(objAnimator != null);
     81         setAnimatorProperties(objAnimator);
     82 
     83         startAnimation(objAnimator);
     84         assertTrue(objAnimator != null);
     85         float[] yArray = getYPosition();
     86         assertResults(yArray, mStartY, mEndY);
     87     }
     88 
     89     public void testOffloat() throws Throwable {
     90         float[] values = {mStartY, mEndY};
     91         PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat(mProperty, values);
     92         assertNotNull(pVHolder);
     93         ObjectAnimator objAnimator = ObjectAnimator.ofPropertyValuesHolder(mObject,pVHolder);
     94         assertTrue(objAnimator != null);
     95 
     96         setAnimatorProperties(objAnimator);
     97         startAnimation(objAnimator);
     98         assertTrue(objAnimator != null);
     99         float[] yArray = getYPosition();
    100         assertResults(yArray, mStartY, mEndY);
    101     }
    102 
    103     public void testOfFloat_Property() throws Throwable {
    104         float[] values = {mStartY, mEndY};
    105         ShapeHolderYProperty property=new ShapeHolderYProperty(ShapeHolder.class.getClass(),"y");
    106         property.setObject(mObject);
    107         PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat(property, values);
    108         assertNotNull(pVHolder);
    109         ObjectAnimator objAnimator = ObjectAnimator.ofPropertyValuesHolder(mObject,pVHolder);
    110         assertTrue(objAnimator != null);
    111 
    112         setAnimatorProperties(objAnimator);
    113         startAnimation(objAnimator);
    114         assertTrue(objAnimator != null);
    115         float[] yArray = getYPosition();
    116         assertResults(yArray, mStartY, mEndY);
    117     }
    118 
    119     public void testOfInt() throws Throwable {
    120         int start = 0;
    121         int end = 10;
    122         int[] values = {start, end};
    123         PropertyValuesHolder pVHolder = PropertyValuesHolder.ofInt(mProperty, values);
    124         assertNotNull(pVHolder);
    125         final ObjectAnimator objAnimator = ObjectAnimator.ofPropertyValuesHolder(mObject,pVHolder);
    126         assertTrue(objAnimator != null);
    127         setAnimatorProperties(objAnimator);
    128         this.runTestOnUiThread(new Runnable(){
    129             public void run() {
    130                 objAnimator.start();
    131             }
    132         });
    133         Thread.sleep(1000);
    134         assertTrue(objAnimator.isRunning());
    135         Integer animatedValue = (Integer) objAnimator.getAnimatedValue();
    136         assertTrue(animatedValue >= start);
    137         assertTrue(animatedValue <= end);
    138     }
    139 
    140     public void testOfInt_Property() throws Throwable{
    141         Object object = mActivity.view;
    142         String property = "backgroundColor";
    143         int startColor = mActivity.view.RED;
    144         int endColor = mActivity.view.BLUE;
    145         int values[] = {startColor, endColor};
    146 
    147         ViewColorProperty colorProperty=new ViewColorProperty(Integer.class.getClass(),property);
    148         colorProperty.setObject(object);
    149         PropertyValuesHolder pVHolder = PropertyValuesHolder.ofInt(colorProperty, values);
    150         assertNotNull(pVHolder);
    151 
    152         ObjectAnimator colorAnimator = ObjectAnimator.ofPropertyValuesHolder(object,pVHolder);
    153         colorAnimator.setDuration(1000);
    154         colorAnimator.setEvaluator(new ArgbEvaluator());
    155         colorAnimator.setRepeatCount(ValueAnimator.INFINITE);
    156         colorAnimator.setRepeatMode(ValueAnimator.REVERSE);
    157 
    158         ObjectAnimator objectAnimator = (ObjectAnimator) mActivity.createAnimatorWithDuration(
    159             mDuration);
    160         startAnimation(objectAnimator, colorAnimator);
    161         Thread.sleep(1000);
    162         Integer i = (Integer) colorAnimator.getAnimatedValue();
    163         //We are going from less negative value to a more negative value
    164         assertTrue(i.intValue() <= startColor);
    165         assertTrue(endColor <= i.intValue());
    166     }
    167 
    168     public void testSetProperty() throws Throwable {
    169         float[] values = {mStartY, mEndY};
    170         ShapeHolderYProperty property=new ShapeHolderYProperty(ShapeHolder.class.getClass(),"y");
    171         property.setObject(mObject);
    172         PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat("", values);
    173         pVHolder.setProperty(property);
    174         ObjectAnimator objAnimator = ObjectAnimator.ofPropertyValuesHolder(mObject,pVHolder);
    175         setAnimatorProperties(objAnimator);
    176         startAnimation(objAnimator);
    177         assertTrue(objAnimator != null);
    178         float[] yArray = getYPosition();
    179         assertResults(yArray, mStartY, mEndY);
    180     }
    181 
    182     class ShapeHolderYProperty extends Property {
    183         private ShapeHolder shapeHolder ;
    184         private Class type = Float.class.getClass();
    185         private String name = "y";
    186         @SuppressWarnings("unchecked")
    187         public ShapeHolderYProperty(Class type, String name) throws Exception {
    188             super(Float.class, name );
    189             if(!( type.equals(this.type) || ( name.equals(this.name))) ){
    190                 throw new Exception("Type or name provided does not match with " +
    191                         this.type.getName() + " or " + this.name);
    192             }
    193         }
    194 
    195         public void setObject(Object object){
    196             shapeHolder = (ShapeHolder) object;
    197         }
    198 
    199         @Override
    200         public Object get(Object object) {
    201             return shapeHolder;
    202         }
    203 
    204         @Override
    205         public String getName() {
    206             return "y";
    207         }
    208 
    209         @Override
    210         public Class getType() {
    211             return super.getType();
    212         }
    213 
    214         @Override
    215         public boolean isReadOnly() {
    216             return false;
    217         }
    218 
    219         @Override
    220         public void set(Object object, Object value) {
    221             shapeHolder.setY((Float)value);
    222         }
    223 
    224     }
    225 
    226     class ViewColorProperty extends Property {
    227         private View view ;
    228         private Class type = Integer.class.getClass();
    229         private String name = "backgroundColor";
    230         @SuppressWarnings("unchecked")
    231         public ViewColorProperty(Class type, String name) throws Exception {
    232             super(Integer.class, name );
    233             if(!( type.equals(this.type) || ( name.equals(this.name))) ){
    234                 throw new Exception("Type or name provided does not match with " +
    235                         this.type.getName() + " or " + this.name);
    236             }
    237         }
    238 
    239         public void setObject(Object object){
    240             view = (View) object;
    241         }
    242 
    243         @Override
    244         public Object get(Object object) {
    245             return view;
    246         }
    247 
    248         @Override
    249         public String getName() {
    250             return name;
    251         }
    252 
    253         @Override
    254         public Class getType() {
    255             return super.getType();
    256         }
    257 
    258         @Override
    259         public boolean isReadOnly() {
    260             return false;
    261         }
    262 
    263         @Override
    264         public void set(Object object, Object value) {
    265             view.setBackgroundColor((Integer)value);
    266         }
    267     }
    268 
    269     private void setAnimatorProperties(ObjectAnimator objAnimator) {
    270         objAnimator.setDuration(mDuration);
    271         objAnimator.setRepeatCount(ValueAnimator.INFINITE);
    272         objAnimator.setInterpolator(new AccelerateInterpolator());
    273         objAnimator.setRepeatMode(ValueAnimator.REVERSE);
    274     }
    275 
    276     public float[] getYPosition() throws Throwable{
    277         float[] yArray = new float[3];
    278         for(int i = 0; i < 3; i++) {
    279             float y = mActivity.view.newBall.getY();
    280             yArray[i] = y;
    281             Thread.sleep(300);
    282         }
    283         return yArray;
    284     }
    285 
    286     public void assertResults(float[] yArray,float startY, float endY) {
    287         for(int i = 0; i < 3; i++){
    288             float y = yArray[i];
    289             assertTrue(y >= startY);
    290             assertTrue(y <= endY);
    291             if(i < 2) {
    292                 float yNext = yArray[i+1];
    293                 assertTrue(y != yNext);
    294             }
    295         }
    296     }
    297 
    298     private void startAnimation(final Animator animator) throws Throwable {
    299         this.runTestOnUiThread(new Runnable() {
    300             public void run() {
    301                 mActivity.startAnimation(animator);
    302             }
    303         });
    304     }
    305 
    306     private void startAnimation(final ObjectAnimator mObjectAnimator,
    307             final ObjectAnimator colorAnimator) throws Throwable {
    308         Thread mAnimationRunnable = new Thread() {
    309             public void run() {
    310                 mActivity.startAnimation(mObjectAnimator, colorAnimator);
    311             }
    312         };
    313         this.runTestOnUiThread(mAnimationRunnable);
    314     }
    315 }
    316 
    317