Index: chrome/android/java/src/org/chromium/chrome/browser/banners/RatingView.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/banners/RatingView.java b/chrome/android/java/src/org/chromium/chrome/browser/banners/RatingView.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0fd296944b167cbfb6e317e4538cf9c54c3453b1 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/banners/RatingView.java |
@@ -0,0 +1,94 @@ |
+// 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.isSystemLayoutDirectionRtl(); |
+ mDrawingRect = new Rect(); |
+ |
+ // Cache the Bitmaps. |
+ Resources res = getResources(); |
+ Bitmap starHalf = BitmapFactory.decodeResource(res, R.drawable.btn_star_mini_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_mini_full); |
+ mStarEmpty = BitmapFactory.decodeResource(res, R.drawable.btn_star_mini_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; |
+ } |
+ } |
+} |