Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/BookmarkUtils.java

Issue 1288903002: Refactor ShortcutHelper and merge in BookmarkUtils (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Readd missing files Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.chrome.browser;
6
7 import android.app.ActivityManager;
8 import android.content.Context;
9 import android.content.Intent;
10 import android.content.pm.PackageManager;
11 import android.content.pm.ResolveInfo;
12 import android.graphics.Bitmap;
13 import android.graphics.Canvas;
14 import android.graphics.Color;
15 import android.graphics.Paint;
16 import android.graphics.Path;
17 import android.graphics.PorterDuff;
18 import android.graphics.PorterDuffXfermode;
19 import android.graphics.Rect;
20 import android.graphics.RectF;
21 import android.graphics.drawable.BitmapDrawable;
22 import android.graphics.drawable.Drawable;
23 import android.net.Uri;
24 import android.util.DisplayMetrics;
25 import android.util.Log;
26 import android.util.TypedValue;
27
28 import org.chromium.base.ApiCompatibilityUtils;
29 import org.chromium.chrome.R;
30 import org.chromium.chrome.browser.widget.RoundedIconGenerator;
31
32 import java.util.List;
33
34 /**
35 * Util class for bookmarks.
36 */
37 public class BookmarkUtils {
38 // There is no public string defining this intent so if Home changes the val ue, we
39 // have to update this string.
40 private static final String INSTALL_SHORTCUT = "com.android.launcher.action. INSTALL_SHORTCUT";
41 private static final int DEFAULT_RGB_VALUE = 145;
42 private static final String TAG = "BookmarkUtils";
43 public static final String REUSE_URL_MATCHING_TAB_ELSE_NEW_TAB =
44 "REUSE_URL_MATCHING_TAB_ELSE_NEW_TAB";
45 private static final int INSET_DIMENSION_FOR_TOUCHICON = 1;
46 private static final int TOUCHICON_BORDER_RADII_DP = 4;
47 private static final int GENERATED_ICON_SIZE_DP = 40;
48 private static final int GENERATED_ICON_ROUNDED_CORNERS_DP = 2;
49 private static final int GENERATED_ICON_FONT_SIZE_DP = 16;
50
51 /**
52 * Creates an intent that will add a shortcut to the home screen.
53 * @param shortcutIntent Intent to fire when the shortcut is activated.
54 * @param title Title of the bookmark.
55 * @param icon Image that represents the bookmark.
56 * @param url URL of the bookmark.
57 * @return Intent for the shortcut.
58 */
59 public static Intent createAddToHomeIntent(
60 Intent shortcutIntent, String title, Bitmap icon, String url) {
61 Intent i = new Intent(INSTALL_SHORTCUT);
62 i.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
63 i.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
64 i.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon);
65 return i;
66 }
67
68 /**
69 * Creates an intent that will add a shortcut to the home screen.
70 * @param url Url of the bookmark.
71 * @param title Title of the bookmark.
72 * @param icon Image that represents the bookmark.
73 * @return Intent for the shortcut.
74 */
75 public static Intent createAddToHomeIntent(String url, String title, Bitmap icon) {
76 Intent shortcutIntent = createShortcutIntent(url);
77 return createAddToHomeIntent(shortcutIntent, title, icon, url);
78 }
79
80 /**
81 * Shortcut intent for icon on homescreen.
82 * @param url Url of the bookmark.
83 * @return Intent for onclick action of the shortcut.
84 */
85 public static Intent createShortcutIntent(String url) {
86 Intent shortcutIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
87 shortcutIntent.putExtra(REUSE_URL_MATCHING_TAB_ELSE_NEW_TAB, true);
88 return shortcutIntent;
89 }
90
91 /**
92 * Utility method to check if a shortcut can be added to the homescreen.
93 * @param context Context used to get the package manager.
94 * @return if a shortcut can be added to the homescreen under the current pr ofile.
95 */
96 public static boolean isAddToHomeIntentSupported(Context context) {
97 PackageManager pm = context.getPackageManager();
98 Intent i = new Intent(INSTALL_SHORTCUT);
99 List<ResolveInfo> receivers = pm.queryBroadcastReceivers(
100 i, PackageManager.GET_INTENT_FILTERS);
101 return !receivers.isEmpty();
102 }
103
104 /**
105 * Creates an icon to be associated with this bookmark. If available, the to uch icon
106 * will be used, else we draw our own.
107 * @param context Context used to create the intent.
108 * @param icon Image representing the bookmark.
109 * @param url URL of the bookmark.
110 * @param rValue Red component of the dominant icon color.
111 * @param gValue Green component of the dominant icon color.
112 * @param bValue Blue component of the dominant icon color.
113 * @return Bitmap Either the touch-icon or the newly created favicon.
114 */
115 public static Bitmap createLauncherIcon(Context context, Bitmap icon, String url, int rValue,
116 int gValue, int bValue) {
117 Bitmap bitmap = null;
118 ActivityManager am = (ActivityManager) context.getSystemService(Context. ACTIVITY_SERVICE);
119 final int iconSize = am.getLauncherLargeIconSize();
120 final int iconDensity = am.getLauncherLargeIconDensity();
121 try {
122 bitmap = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_ 8888);
123 Canvas canvas = new Canvas(bitmap);
124 if (icon == null) {
125 icon = getBitmapFromResourceId(context, R.drawable.globe_favicon , iconDensity);
126 rValue = gValue = bValue = DEFAULT_RGB_VALUE;
127 }
128 final int smallestSide = iconSize;
129 if (icon.getWidth() >= smallestSide / 2 && icon.getHeight() >= small estSide / 2) {
130 drawTouchIconToCanvas(context, icon, canvas);
131 } else {
132 drawWidgetBackgroundToCanvas(context, canvas, iconDensity, url,
133 Color.rgb(rValue, gValue, bValue));
134 }
135 canvas.setBitmap(null);
136 } catch (OutOfMemoryError e) {
137 Log.w(TAG, "OutOfMemoryError while trying to draw bitmap on canvas." );
138 }
139 return bitmap;
140 }
141
142 private static Bitmap getBitmapFromResourceId(Context context, int id, int d ensity) {
143 Drawable drawable = ApiCompatibilityUtils.getDrawableForDensity(
144 context.getResources(), id, density);
145
146 if (drawable instanceof BitmapDrawable) {
147 BitmapDrawable bd = (BitmapDrawable) drawable;
148 return bd.getBitmap();
149 }
150 assert false : "The drawable was not a bitmap drawable as expected";
151 return null;
152 }
153
154 /**
155 * Use touch-icon or higher-resolution favicon and round the corners.
156 * @param context Context used to get resources.
157 * @param touchIcon Touch icon bitmap.
158 * @param canvas Canvas that holds the touch icon.
159 */
160 private static void drawTouchIconToCanvas(Context context, Bitmap touchIcon, Canvas canvas) {
161 Rect iconBounds = new Rect(0, 0, canvas.getWidth(), canvas.getHeight());
162 Rect src = new Rect(0, 0, touchIcon.getWidth(), touchIcon.getHeight());
163 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
164 paint.setFilterBitmap(true);
165 canvas.drawBitmap(touchIcon, src, iconBounds, paint);
166 // Convert dp to px.
167 int borderRadii = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNI T_DIP,
168 TOUCHICON_BORDER_RADII_DP, context.getResources().getDisplayMetr ics());
169 Path path = new Path();
170 path.setFillType(Path.FillType.INVERSE_WINDING);
171 RectF rect = new RectF(iconBounds);
172 rect.inset(INSET_DIMENSION_FOR_TOUCHICON, INSET_DIMENSION_FOR_TOUCHICON) ;
173 path.addRoundRect(rect, borderRadii, borderRadii, Path.Direction.CW);
174 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
175 canvas.drawPath(path, paint);
176 }
177
178 /**
179 * Draw document icon to canvas.
180 * @param context Context used to get bitmap resources.
181 * @param canvas Canvas that holds the document icon.
182 * @param iconDensity Density information to get bitmap resources.
183 * @param url URL of the bookmark.
184 * @param color Color for the document icon's folding and the bottom s trip.
185 */
186 private static void drawWidgetBackgroundToCanvas(
187 Context context, Canvas canvas, int iconDensity, String url, int col or) {
188 Rect iconBounds = new Rect(0, 0, canvas.getWidth(), canvas.getHeight());
189 Bitmap bookmarkWidgetBg =
190 getBitmapFromResourceId(context, R.mipmap.bookmark_widget_bg, ic onDensity);
191
192 Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
193 canvas.drawBitmap(bookmarkWidgetBg, null, iconBounds, paint);
194
195 float density = (float) iconDensity / DisplayMetrics.DENSITY_MEDIUM;
196 int iconSize = (int) (GENERATED_ICON_SIZE_DP * density);
197 int iconRoundedEdge = (int) (GENERATED_ICON_ROUNDED_CORNERS_DP * density );
198 int iconFontSize = (int) (GENERATED_ICON_FONT_SIZE_DP * density);
199
200 RoundedIconGenerator generator = new RoundedIconGenerator(
201 iconSize, iconSize, iconRoundedEdge, color, iconFontSize);
202 Bitmap icon = generator.generateIconForUrl(url);
203 if (icon == null) return; // Bookmark URL does not have a domain.
204 canvas.drawBitmap(icon, iconBounds.exactCenterX() - icon.getWidth() / 2. 0f,
205 iconBounds.exactCenterY() - icon.getHeight() / 2.0f, null);
206 }
207 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698