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 applyAttributes()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 setNumStars(final int numStars)42 public void setNumStars(final int numStars) { 43 if (numStars <= 0) { 44 return; 45 } 46 47 mNumStars = numStars; 48 } 49 50 @Implementation getNumStars()51 public int getNumStars() { 52 return mNumStars; 53 } 54 55 @Implementation setRating(float rating)56 public void setRating(float rating) { 57 setProgress(Math.round(rating * getProgressPerStar())); 58 } 59 60 @Implementation getRating()61 public float getRating() { 62 return getProgress() / getProgressPerStar(); 63 } 64 65 @Implementation setIsIndicator(boolean isIndicator)66 public void setIsIndicator(boolean isIndicator) { 67 mIsUserSeekable = !isIndicator; 68 setFocusable(!isIndicator); 69 } 70 71 @Implementation isIndicator()72 public boolean isIndicator() { 73 return !mIsUserSeekable; 74 } 75 76 @Implementation setStepSize(float stepSize)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 getStepSize()89 public float getStepSize() { 90 return (float) getNumStars() / getMax(); 91 } 92 getProgressPerStar()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 setProgress(int progress)103 public void setProgress(int progress) { 104 super.setProgress(progress); 105 if (listener != null) 106 listener.onRatingChanged(realRatingBar, getRating(), true); 107 } 108 109 @Implementation setOnRatingBarChangeListener(OnRatingBarChangeListener listener)110 public void setOnRatingBarChangeListener(OnRatingBarChangeListener listener) { 111 this.listener = listener; 112 } 113 114 @Implementation getOnRatingBarChangeListener()115 public OnRatingBarChangeListener getOnRatingBarChangeListener() { 116 return listener; 117 } 118 } 119