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