package org.robobinding.widget.ratingbar;
import org.robobinding.property.ValueModel;
import org.robobinding.util.PrimitiveTypeUtils;
import org.robobinding.viewattribute.property.TwoWayMultiTypePropertyViewAttribute;
import org.robobinding.viewattribute.property.TwoWayPropertyViewAttribute;
import org.robobinding.widgetaddon.ratingbar.RatingBarAddOn;
import android.widget.RatingBar;
import android.widget.RatingBar.OnRatingBarChangeListener;
/**
*
* @since 1.0
* @version $Revision: 1.0 $
* @author Robert Taylor
*/
public class RatingAttribute implements TwoWayMultiTypePropertyViewAttribute<RatingBar> {
@Override
public TwoWayPropertyViewAttribute<RatingBar, ?, ?> create(RatingBar view, Class<?> propertyType) {
if (PrimitiveTypeUtils.floatIsAssignableFrom(propertyType)) {
return new FloatRatingAttribute();
} else if (PrimitiveTypeUtils.integerIsAssignableFrom(propertyType)) {
return new IntegerRatingAttribute();
} else
throw new RuntimeException("Could not find a suitable rating attribute class for property type: " + propertyType);
}
static class FloatRatingAttribute implements TwoWayPropertyViewAttribute<RatingBar, RatingBarAddOn, Float> {
@Override
public void updateView(RatingBar view, Float newRating, RatingBarAddOn viewAddOn) {
view.setRating(newRating);
}
@Override
public void observeChangesOnTheView(RatingBarAddOn viewAddOn, final ValueModel<Float> valueModel, RatingBar view) {
viewAddOn.addOnRatingBarChangeListener(new OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
valueModel.setValue(rating);
}
});
}
}
static class IntegerRatingAttribute implements TwoWayPropertyViewAttribute<RatingBar, RatingBarAddOn, Integer> {
@Override
public void updateView(RatingBar view, Integer newRating, RatingBarAddOn viewAddOn) {
view.setRating((float) newRating);
}
@Override
public void observeChangesOnTheView(RatingBarAddOn viewAddOn, final ValueModel<Integer> valueModel, RatingBar view) {
viewAddOn.addOnRatingBarChangeListener(new OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
valueModel.setValue((int) rating);
}
});
}
}
}