Home | History | Annotate | Download | only in shadows
      1 package com.xtremelabs.robolectric.shadows;
      2 
      3 import android.widget.RatingBar;
      4 import android.widget.RatingBar.OnRatingBarChangeListener;
      5 
      6 import com.xtremelabs.robolectric.internal.Implementation;
      7 import com.xtremelabs.robolectric.internal.Implements;
      8 import com.xtremelabs.robolectric.internal.RealObject;
      9 
     10 @Implements(RatingBar.class)
     11 public class ShadowRatingBar extends ShadowAbsSeekBar {
     12 
     13     @RealObject
     14     private RatingBar realRatingBar;
     15     private int mNumStars = 5;
     16     private OnRatingBarChangeListener listener;
     17 
     18     @Override public void applyAttributes() {
     19         super.applyAttributes();
     20 
     21         setIsIndicator(attributeSet.getAttributeBooleanValue("android", "isIndicator", false));
     22         final int numStars = attributeSet.getAttributeIntValue("android", "numStars", mNumStars);
     23         final float rating = attributeSet.getAttributeFloatValue("android", "rating", -1);
     24         final float stepSize = attributeSet.getAttributeFloatValue("android", "stepSize", -1);
     25 
     26         if (numStars > 0 && numStars != mNumStars) {
     27             setNumStars(numStars);
     28         }
     29 
     30         if (stepSize >= 0) {
     31             setStepSize(stepSize);
     32         } else {
     33             setStepSize(0.5f);
     34         }
     35 
     36         if (rating >= 0) {
     37             setRating(rating);
     38         }
     39     }
     40 
     41     @Implementation
     42     public void setNumStars(final int numStars) {
     43         if (numStars <= 0) {
     44             return;
     45         }
     46 
     47         mNumStars = numStars;
     48     }
     49 
     50     @Implementation
     51     public int getNumStars() {
     52         return mNumStars;
     53     }
     54 
     55     @Implementation
     56     public void setRating(float rating) {
     57         setProgress(Math.round(rating * getProgressPerStar()));
     58     }
     59 
     60     @Implementation
     61     public float getRating() {
     62         return getProgress() / getProgressPerStar();
     63     }
     64 
     65     @Implementation
     66     public void setIsIndicator(boolean isIndicator) {
     67         mIsUserSeekable = !isIndicator;
     68         setFocusable(!isIndicator);
     69     }
     70 
     71     @Implementation
     72     public boolean isIndicator() {
     73         return !mIsUserSeekable;
     74     }
     75 
     76     @Implementation
     77     public void setStepSize(float stepSize) {
     78         if (stepSize <= 0) {
     79             return;
     80         }
     81 
     82         final float newMax = mNumStars / stepSize;
     83         final int newProgress = (int) (newMax / getMax() * getProgress());
     84         setMax((int) newMax);
     85         setProgress(newProgress);
     86     }
     87 
     88     @Implementation
     89     public float getStepSize() {
     90         return (float) getNumStars() / getMax();
     91     }
     92 
     93     private float getProgressPerStar() {
     94         if (mNumStars > 0) {
     95             return 1f * getMax() / mNumStars;
     96         } else {
     97             return 1;
     98         }
     99     }
    100 
    101     @Implementation
    102     @Override
    103     public void setProgress(int progress) {
    104         super.setProgress(progress);
    105         if (listener != null)
    106             listener.onRatingChanged(realRatingBar, getRating(), true);
    107     }
    108 
    109     @Implementation
    110     public void setOnRatingBarChangeListener(OnRatingBarChangeListener listener) {
    111         this.listener = listener;
    112     }
    113 
    114     @Implementation
    115     public OnRatingBarChangeListener getOnRatingBarChangeListener() {
    116         return listener;
    117     }
    118 }
    119