blob: f249c51f3d36428aac9d9cb67213f3f3f8be91fc [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.banners;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import org.chromium.chrome.R;
import org.chromium.ui.base.LocalizationUtils;
/**
* Displays a set of stars representing a rating for an app.
*/
public class RatingView extends View {
private static final int MAX_INCREMENT = 10;
// Bitmaps used to draw the ratings.
private final Bitmap mStarFull;
private final Bitmap mStarHalf;
private final Bitmap mStarEmpty;
/** Stores whether or not the layout is left-to-right. */
private final boolean mIsLayoutLTR;
/** Variables used for drawing. */
private final Rect mDrawingRect;
/** Each increment represents 0.5 stars. */
private int mIncrements;
public RatingView(Context context, AttributeSet params) {
super(context, params);
mIsLayoutLTR = !LocalizationUtils.isLayoutRtl();
mDrawingRect = new Rect();
// Cache the Bitmaps.
Resources res = getResources();
Bitmap starHalf = BitmapFactory.decodeResource(res, R.drawable.btn_star_half);
if (!mIsLayoutLTR) {
// RTL mode requires flipping the Bitmap.
int width = starHalf.getWidth();
int height = starHalf.getHeight();
Matrix m = new Matrix();
m.preScale(-1, 1);
starHalf = Bitmap.createBitmap(starHalf, 0, 0, width, height, m, false);
}
mStarHalf = starHalf;
mStarFull = BitmapFactory.decodeResource(res, R.drawable.btn_star_full);
mStarEmpty = BitmapFactory.decodeResource(res, R.drawable.btn_star_empty);
}
/**
* Initializes the RatingView.
* @param rating How many stars to display.
*/
void initialize(float rating) {
// Ratings are rounded to the nearest 0.5 increment, like in the Play Store.
mIncrements = Math.round(rating * 2);
}
@Override
public void onDraw(Canvas canvas) {
int starSize = canvas.getHeight();
// Start off on the left for LTR mode, on the right for RTL.
mDrawingRect.top = 0;
mDrawingRect.bottom = starSize;
mDrawingRect.left = mIsLayoutLTR ? 0 : (canvas.getWidth() - starSize);
mDrawingRect.right = mDrawingRect.left + starSize;
// Draw all the stars.
for (int i = 0; i < MAX_INCREMENT; i += 2) {
Bitmap toShow = mStarEmpty;
if (i < mIncrements) {
boolean isFullStar = (mIncrements - i) >= 2;
toShow = isFullStar ? mStarFull : mStarHalf;
}
canvas.drawBitmap(toShow, null, mDrawingRect, null);
// Scooch over to show the next star.
mDrawingRect.left += (mIsLayoutLTR ? 1 : -1) * starSize;
mDrawingRect.right = mDrawingRect.left + starSize;
}
}
}