ShadowRatingBar.java revision 99fafb79bf98b7aa1946bbda1f0a225cefa2d35d
1package com.xtremelabs.robolectric.shadows;
2
3import android.widget.RatingBar;
4import android.widget.RatingBar.OnRatingBarChangeListener;
5
6import com.xtremelabs.robolectric.internal.Implementation;
7import com.xtremelabs.robolectric.internal.Implements;
8import com.xtremelabs.robolectric.internal.RealObject;
9
10@Implements(RatingBar.class)
11public 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