root/chrome/android/java/src/org/chromium/chrome/browser/banners/RatingView.java

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. initialize
  2. onDraw

// 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;
        }
    }
}

/* [<][>][^][v][top][bottom][index][help] */