1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)package org.chromium.chrome.browser.banners;
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.content.Context;
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.content.res.Resources;
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.graphics.Bitmap;
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.graphics.BitmapFactory;
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.graphics.Canvas;
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.graphics.Matrix;
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.graphics.Rect;
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.util.AttributeSet;
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.view.View;
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.chrome.R;
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.ui.base.LocalizationUtils;
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/**
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Displays a set of stars representing a rating for an app.
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public class RatingView extends View {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    private static final int MAX_INCREMENT = 10;
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Bitmaps used to draw the ratings.
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    private final Bitmap mStarFull;
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    private final Bitmap mStarHalf;
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    private final Bitmap mStarEmpty;
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    /** Stores whether or not the layout is left-to-right. */
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    private final boolean mIsLayoutLTR;
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    /** Variables used for drawing. */
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    private final Rect mDrawingRect;
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    /** Each increment represents 0.5 stars. */
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    private int mIncrements;
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    public RatingView(Context context, AttributeSet params) {
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        super(context, params);
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mIsLayoutLTR = !LocalizationUtils.isLayoutRtl();
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mDrawingRect = new Rect();
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // Cache the Bitmaps.
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        Resources res = getResources();
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        Bitmap starHalf = BitmapFactory.decodeResource(res, R.drawable.btn_star_half);
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if (!mIsLayoutLTR) {
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            // RTL mode requires flipping the Bitmap.
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            int width = starHalf.getWidth();
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            int height = starHalf.getHeight();
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            Matrix m = new Matrix();
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            m.preScale(-1, 1);
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            starHalf = Bitmap.createBitmap(starHalf, 0, 0, width, height, m, false);
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mStarHalf = starHalf;
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mStarFull = BitmapFactory.decodeResource(res, R.drawable.btn_star_full);
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mStarEmpty = BitmapFactory.decodeResource(res, R.drawable.btn_star_empty);
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    /**
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * Initializes the RatingView.
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * @param rating How many stars to display.
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     */
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    void initialize(float rating) {
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // Ratings are rounded to the nearest 0.5 increment, like in the Play Store.
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mIncrements = Math.round(rating * 2);
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    @Override
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    public void onDraw(Canvas canvas) {
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        int starSize = canvas.getHeight();
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // Start off on the left for LTR mode, on the right for RTL.
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mDrawingRect.top = 0;
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mDrawingRect.bottom = starSize;
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mDrawingRect.left = mIsLayoutLTR ? 0 : (canvas.getWidth() - starSize);
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        mDrawingRect.right = mDrawingRect.left + starSize;
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // Draw all the stars.
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        for (int i = 0; i < MAX_INCREMENT; i += 2) {
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            Bitmap toShow = mStarEmpty;
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            if (i < mIncrements) {
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                boolean isFullStar = (mIncrements - i) >= 2;
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                toShow = isFullStar ? mStarFull : mStarHalf;
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            }
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            canvas.drawBitmap(toShow, null, mDrawingRect, null);
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            // Scooch over to show the next star.
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            mDrawingRect.left += (mIsLayoutLTR ? 1 : -1) * starSize;
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            mDrawingRect.right = mDrawingRect.left + starSize;
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
95