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