Home | History | Annotate | Download | only in shadows
      1 package com.xtremelabs.robolectric.shadows;
      2 
      3 import android.view.animation.Animation;
      4 import android.view.animation.Interpolator;
      5 import android.view.animation.ShadowAnimationBridge;
      6 import android.view.animation.Transformation;
      7 import com.xtremelabs.robolectric.internal.Implementation;
      8 import com.xtremelabs.robolectric.internal.Implements;
      9 import com.xtremelabs.robolectric.internal.RealObject;
     10 
     11 /**
     12  * Shadow implementation of {@code Animation} that provides support for invoking listener callbacks.
     13  */
     14 @SuppressWarnings({"UnusedDeclaration"})
     15 @Implements(Animation.class)
     16 public class ShadowAnimation {
     17 
     18     private Animation.AnimationListener listener;
     19     private Interpolator interpolator;
     20     private boolean startFlag = false;
     21     private long durationMillis = 0;
     22     private int repeatCount;
     23     private int repeatMode;
     24     private long startOffset;
     25     private int loadedFromResourceId = -1;
     26     private boolean fillAfter;
     27 
     28     @RealObject
     29     private Animation realAnimation;
     30 
     31     @Implementation
     32     public void setAnimationListener(Animation.AnimationListener l) {
     33         listener = l;
     34     }
     35 
     36     @Implementation
     37     public void start() {
     38         startFlag = true;
     39         if (listener != null) {
     40             listener.onAnimationStart(realAnimation);
     41         }
     42     }
     43 
     44     @Implementation
     45     public void cancel() {
     46         startFlag = false;
     47         if (listener != null) {
     48             listener.onAnimationEnd(realAnimation);
     49         }
     50     }
     51 
     52     @Implementation
     53     public boolean hasStarted() {
     54         return startFlag;
     55     }
     56 
     57     @Implementation
     58     public void setDuration(long durationMillis) {
     59         this.durationMillis = durationMillis;
     60     }
     61 
     62     @Implementation
     63     public long getDuration() {
     64         return durationMillis;
     65     }
     66 
     67     @Implementation
     68     public void setInterpolator(Interpolator interpolator) {
     69         this.interpolator = interpolator;
     70     }
     71 
     72     @Implementation
     73     public Interpolator getInterpolator() {
     74         return interpolator;
     75     }
     76 
     77     @Implementation
     78     public void setRepeatCount(int repeatCount) {
     79         this.repeatCount = repeatCount;
     80     }
     81 
     82     @Implementation
     83     public int getRepeatCount() {
     84         return repeatCount;
     85     }
     86 
     87     @Implementation
     88     public void setRepeatMode(int repeatMode) {
     89         this.repeatMode = repeatMode;
     90     }
     91 
     92     @Implementation
     93     public int getRepeatMode() {
     94         return repeatMode;
     95     }
     96 
     97     @Implementation
     98     public void setStartOffset(long startOffset) {
     99         this.startOffset = startOffset;
    100     }
    101 
    102     @Implementation
    103     public long getStartOffset() {
    104         return startOffset;
    105     }
    106 
    107     @Implementation
    108     public void setFillAfter(boolean fillAfter) {
    109         this.fillAfter = fillAfter;
    110     }
    111 
    112     @Implementation
    113     public boolean getFillAfter() {
    114         return fillAfter;
    115     }
    116 
    117     /**
    118      * Non-Android accessor.  Returns most recently set animation listener.
    119      *
    120      * @return
    121      */
    122     public Animation.AnimationListener getAnimationListener() {
    123         return listener;
    124     }
    125 
    126     /**
    127      * Non-Android accessor.  Use to simulate repeat loops of animation.
    128      */
    129     public void invokeRepeat() {
    130         if (listener != null) {
    131             listener.onAnimationRepeat(realAnimation);
    132         }
    133     }
    134 
    135     /**
    136      * Non-Android accessor.  Use to simulate end of animation.
    137      */
    138     public void invokeEnd() {
    139         if (listener != null) {
    140             listener.onAnimationEnd(realAnimation);
    141         }
    142         new ShadowAnimationBridge(realAnimation).applyTransformation(1.0f, new Transformation());
    143     }
    144 
    145     public void setLoadedFromResourceId(int loadedFromResourceId) {
    146         this.loadedFromResourceId = loadedFromResourceId;
    147     }
    148 
    149     public int getLoadedFromResourceId() {
    150         if (loadedFromResourceId == -1) {
    151             throw new IllegalStateException("not loaded from a resource");
    152         }
    153         return loadedFromResourceId;
    154     }
    155 
    156 }
    157