package com.appboy.ui.widget; import android.content.Context; import android.util.AttributeSet; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import com.appboy.Constants; import com.appboy.support.AppboyLogger; import com.appboy.ui.R; import java.util.ArrayList; import java.util.List; public class StarRatingView extends LinearLayout { private static final String TAG = String.format("%s.%s", Constants.APPBOY_LOG_TAG_PREFIX, StarRatingView.class.getName()); private static final int MAX_NUMBER_OF_STARS = 5; private List<ImageView> mStarRating; private float mRating = 0.0f; public StarRatingView(Context context, AttributeSet attrs) { super(context, attrs); setOrientation(HORIZONTAL); // Initialize the star views and layout parameters so they can be changed to match the rating of this specific card later. mStarRating = new ArrayList<ImageView>(MAX_NUMBER_OF_STARS); for (int i = 0; i < MAX_NUMBER_OF_STARS; i++) { ImageView star = new ImageView(context); star.setTag(0); ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); addView(star, layoutParams); mStarRating.add(star); } setRating(mRating); } public float getRating() { return mRating; } public boolean setRating(float rating) { if (rating < 0 || rating > MAX_NUMBER_OF_STARS) { AppboyLogger.e(TAG, String.format("Unable to set rating to %f. Rating must be between 0 and %d", rating, MAX_NUMBER_OF_STARS)); return false; } mRating = rating; int ratingRoundedDown = (int) Math.floor(mRating); int ratingRoundedUp = (int) Math.ceil(mRating); for (int starIndex = 0; starIndex < ratingRoundedDown; starIndex++) { ImageView star = mStarRating.get(starIndex); star.setTag(R.drawable.com_appboy_rating_full_star); star.setImageResource(R.drawable.com_appboy_rating_full_star); } for (int starIndex = ratingRoundedUp; starIndex < mStarRating.size(); starIndex++) { ImageView star = mStarRating.get(starIndex); star.setTag(R.drawable.com_appboy_rating_empty_star); star.setImageResource(R.drawable.com_appboy_rating_empty_star); } // Processing the remainder. A remainder between [0.25, 0.75) will be displayed as a half star. // Otherwise, it be rounded up/down to the nearest whole star. float remainder = rating - ratingRoundedDown; if (remainder > 0.0f) { ImageView star = mStarRating.get(ratingRoundedDown); if (remainder < 0.25f) { star.setTag(R.drawable.com_appboy_rating_empty_star); star.setImageResource(R.drawable.com_appboy_rating_empty_star); } else if (remainder < 0.75f) { star.setTag(R.drawable.com_appboy_rating_half_star); star.setImageResource(R.drawable.com_appboy_rating_half_star); } else { star.setTag(R.drawable.com_appboy_rating_full_star); star.setImageResource(R.drawable.com_appboy_rating_full_star); } } return true; } List<ImageView> getImageViewList() { return mStarRating; } }