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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java

Issue 1421973005: Follow Material spec for icons when adding web apps to home screen. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Dan's comments Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
index 3df4198f801d93f73568c09760bfeb5318d5dc37..3b40421073e9000005f930192303160ef7ee7e03 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
@@ -26,8 +26,6 @@ import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Base64;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.ApplicationStatus;
@@ -77,11 +75,14 @@ public class ShortcutHelper {
// There is no public string defining this intent so if Home changes the value, we
// have to update this string.
private static final String INSTALL_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";
- private static final int INSET_DIMENSION_FOR_TOUCHICON = 1;
- private static final int TOUCHICON_BORDER_RADII_DP = 4;
- private static final int GENERATED_ICON_SIZE_DP = 40;
- private static final int GENERATED_ICON_ROUNDED_CORNERS_DP = 2;
- private static final int GENERATED_ICON_FONT_SIZE_DP = 16;
+
+ // These sizes are from the Material spec for icons:
+ // https://www.google.com/design/spec/style/icons.html#icons-product-icons
+ private static final float MAX_INNER_SIZE_RATIO = 1.25f;
+ private static final float ICON_PADDING_RATIO = 2.0f / 44.0f;
+ private static final float ICON_CORNER_RADIUS_RATIO = 1.0f / 16.0f;
+ private static final float GENERATED_ICON_PADDING_RATIO = 1.0f / 12.0f;
+ private static final float GENERATED_ICON_FONT_SIZE_RATIO = 1.0f / 3.0f;
/** Broadcasts Intents out Android for adding the shortcut. */
public static class Delegate {
@@ -113,10 +114,10 @@ public class ShortcutHelper {
}
/**
- * Called when we have to fire an Intent to add a shortcut to the homescreen.
+ * Called when we have to fire an Intent to add a shortcut to the home screen.
* If the webpage indicated that it was capable of functioning as a webapp, it is added as a
* shortcut to a webapp Activity rather than as a general bookmark. User is sent to the
- * homescreen as soon as the shortcut is created.
+ * home screen as soon as the shortcut is created.
*/
@SuppressWarnings("unused")
@CalledByNative
@@ -146,7 +147,7 @@ public class ShortcutHelper {
shortcutIntent = createShortcutIntent(url);
}
- // Always attach a source (one of add to homescreen menu item, app banner, or unknown) to
+ // Always attach a source (one of add to home screen menu item, app banner, or unknown) to
// the intent. This allows us to distinguish where a shortcut was added from in metrics.
shortcutIntent.putExtra(EXTRA_SOURCE, source);
shortcutIntent.setPackage(context.getPackageName());
@@ -211,7 +212,7 @@ public class ShortcutHelper {
}
/**
- * Shortcut intent for icon on homescreen.
+ * Shortcut intent for icon on home screen.
* @param url Url of the shortcut.
* @return Intent for onclick action of the shortcut.
*/
@@ -222,9 +223,9 @@ public class ShortcutHelper {
}
/**
- * Utility method to check if a shortcut can be added to the homescreen.
+ * Utility method to check if a shortcut can be added to the home screen.
* @param context Context used to get the package manager.
- * @return if a shortcut can be added to the homescreen under the current profile.
+ * @return if a shortcut can be added to the home screen under the current profile.
*/
public static boolean isAddToHomeIntentSupported(Context context) {
PackageManager pm = context.getPackageManager();
@@ -235,68 +236,114 @@ public class ShortcutHelper {
}
/**
- * Returns whether the given icon matches the size requirements to be used on the homescreen.
+ * Returns whether the given icon matches the size requirements to be used on the home screen.
* @param context Context used to create the intent.
- * @param icon Image representing the shortcut.
- * @return whether the given icon matches the size requirements to be used on the homescreen.
+ * @param width Icon width, in pixels.
+ * @param height Icon height, in pixels.
+ * @return whether the given icon matches the size requirements to be used on the home screen.
*/
@CalledByNative
- public static boolean isIconLargeEnoughForLauncher(Context context, Bitmap icon) {
+ public static boolean isIconLargeEnoughForLauncher(Context context, int width, int height) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
final int minimalSize = am.getLauncherLargeIconSize() / 2;
- return icon.getWidth() >= minimalSize && icon.getHeight() >= minimalSize;
+ return width >= minimalSize && height >= minimalSize;
}
/**
- * Returns the given icon after applying same changes to match the launcher design
- * requirements.
+ * Adapts a website's icon (e.g. favicon or touch icon) to the Material design style guidelines
+ * for home screen icons. This involves adding some padding and rounding the corners.
+ *
* @param context Context used to create the intent.
- * @param icon Image representing the shortcut.
+ * @param webIcon The website's favicon or touch icon.
* @return Bitmap Either the touch-icon or the newly created favicon.
*/
@CalledByNative
- public static Bitmap modifyIconForLauncher(Context context, Bitmap icon) {
- assert isIconLargeEnoughForLauncher(context, icon);
+ public static Bitmap createHomeScreenIconFromWebIcon(Context context, Bitmap webIcon) {
+ // getLauncherLargeIconSize() is just a guess at the launcher icon size, and is often
+ // wrong -- the launcher can show icons at any size it pleases. Instead of resizing the
+ // icon to the supposed launcher size and then having the launcher resize the icon again,
+ // just leave the icon at its original size and let the launcher do a single rescaling.
+ // Unless the icon is much too big; then scale it down here too.
+ ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+ int maxInnerSize = Math.round(am.getLauncherLargeIconSize() * MAX_INNER_SIZE_RATIO);
+ int innerSize = Math.min(maxInnerSize, Math.max(webIcon.getWidth(), webIcon.getHeight()));
+ int padding = Math.round(ICON_PADDING_RATIO * innerSize);
+ int outerSize = innerSize + 2 * padding;
Bitmap bitmap = null;
- ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- final int iconSize = am.getLauncherLargeIconSize();
try {
- bitmap = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- drawTouchIconToCanvas(context, icon, canvas);
- canvas.setBitmap(null);
+ bitmap = Bitmap.createBitmap(outerSize, outerSize, Bitmap.Config.ARGB_8888);
} catch (OutOfMemoryError e) {
- Log.w(TAG, "OutOfMemoryError while trying to draw bitmap on canvas.");
+ Log.w(TAG, "OutOfMemoryError while creating bitmap for home screen icon.");
+ return webIcon;
}
+
+ // Draw the web icon with padding around it.
+ Canvas canvas = new Canvas(bitmap);
+ Rect innerBounds = new Rect(padding, padding, outerSize - padding, outerSize - padding);
+ Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ paint.setFilterBitmap(true);
+ canvas.drawBitmap(webIcon, null, innerBounds, paint);
+
+ // Round the corners.
+ int cornerRadius = Math.round(ICON_CORNER_RADIUS_RATIO * outerSize);
+ Path path = new Path();
+ path.setFillType(Path.FillType.INVERSE_WINDING);
+ RectF innerBoundsF = new RectF(innerBounds);
+ path.addRoundRect(innerBoundsF, cornerRadius, cornerRadius, Path.Direction.CW);
+ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
+ canvas.drawPath(path, paint);
+
return bitmap;
}
/**
- * Generates an icon to be used on the launcher.
+ * Generates a generic icon to be used in the launcher. This is just a rounded rectangle with
+ * a letter in the middle taken from the website's domain name.
+ *
* @param context Context used to create the intent.
* @param url URL of the shortcut.
- * @param rValue Red component of the dominant icon color.
- * @param gValue Green component of the dominant icon color.
- * @param bValue Blue component of the dominant icon color.
+ * @param red Red component of the dominant icon color.
+ * @param green Green component of the dominant icon color.
+ * @param blue Blue component of the dominant icon color.
* @return Bitmap Either the touch-icon or the newly created favicon.
*/
@CalledByNative
- public static Bitmap generateLauncherIcon(Context context, String url, int rValue,
- int gValue, int bValue) {
- Bitmap bitmap = null;
+ public static Bitmap generateHomeScreenIcon(Context context, String url, int red, int green,
+ int blue) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- final int iconSize = am.getLauncherLargeIconSize();
+ final int outerSize = am.getLauncherLargeIconSize();
final int iconDensity = am.getLauncherLargeIconDensity();
+
+ Bitmap bitmap = null;
try {
- bitmap = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- drawWidgetBackgroundToCanvas(context, canvas, iconDensity, url,
- Color.rgb(rValue, gValue, bValue));
- canvas.setBitmap(null);
+ bitmap = Bitmap.createBitmap(outerSize, outerSize, Bitmap.Config.ARGB_8888);
} catch (OutOfMemoryError e) {
Log.w(TAG, "OutOfMemoryError while trying to draw bitmap on canvas.");
+ return null;
}
+
+ Canvas canvas = new Canvas(bitmap);
+
+ // Draw the drop shadow.
+ int padding = (int) (GENERATED_ICON_PADDING_RATIO * outerSize);
+ Rect outerBounds = new Rect(0, 0, outerSize, outerSize);
+ Bitmap bookmarkWidgetBg =
+ getBitmapFromResourceId(context, R.mipmap.bookmark_widget_bg, iconDensity);
+ Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
+ canvas.drawBitmap(bookmarkWidgetBg, null, outerBounds, paint);
+
+ // Draw the rounded rectangle and letter.
+ int innerSize = outerSize - 2 * padding;
+ int cornerRadius = Math.round(ICON_CORNER_RADIUS_RATIO * outerSize);
+ int fontSize = Math.round(GENERATED_ICON_FONT_SIZE_RATIO * outerSize);
+ int color = Color.rgb(red, green, blue);
+ RoundedIconGenerator generator = new RoundedIconGenerator(
+ innerSize, innerSize, cornerRadius, color, fontSize);
+ Bitmap icon = generator.generateIconForUrl(url);
+ if (icon == null) return null; // Bookmark URL does not have a domain.
+ canvas.drawBitmap(icon, padding, padding, null);
+
return bitmap;
}
@@ -384,7 +431,7 @@ public class ShortcutHelper {
* icon and the ideal and minimum sizes of the splash screen image in that order.
*/
@CalledByNative
- private static int[] getHomescreenIconAndSplashImageSizes(Context context) {
+ private static int[] getHomeScreenIconAndSplashImageSizes(Context context) {
// This ordering must be kept up to date with the C++ ShortcutHelper.
return new int[] {
getIdealHomescreenIconSizeInDp(context),
@@ -411,58 +458,4 @@ public class ShortcutHelper {
assert false : "The drawable was not a bitmap drawable as expected";
return null;
}
-
- /**
- * Use touch-icon or higher-resolution favicon and round the corners.
- * @param context Context used to get resources.
- * @param touchIcon Touch icon bitmap.
- * @param canvas Canvas that holds the touch icon.
- */
- private static void drawTouchIconToCanvas(Context context, Bitmap touchIcon, Canvas canvas) {
- Rect iconBounds = new Rect(0, 0, canvas.getWidth(), canvas.getHeight());
- Rect src = new Rect(0, 0, touchIcon.getWidth(), touchIcon.getHeight());
- Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- paint.setFilterBitmap(true);
- canvas.drawBitmap(touchIcon, src, iconBounds, paint);
- // Convert dp to px.
- int borderRadii = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
- TOUCHICON_BORDER_RADII_DP, context.getResources().getDisplayMetrics());
- Path path = new Path();
- path.setFillType(Path.FillType.INVERSE_WINDING);
- RectF rect = new RectF(iconBounds);
- rect.inset(INSET_DIMENSION_FOR_TOUCHICON, INSET_DIMENSION_FOR_TOUCHICON);
- path.addRoundRect(rect, borderRadii, borderRadii, Path.Direction.CW);
- paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
- canvas.drawPath(path, paint);
- }
-
- /**
- * Draw document icon to canvas.
- * @param context Context used to get bitmap resources.
- * @param canvas Canvas that holds the document icon.
- * @param iconDensity Density information to get bitmap resources.
- * @param url URL of the shortcut.
- * @param color Color for the document icon's folding and the bottom strip.
- */
- private static void drawWidgetBackgroundToCanvas(
- Context context, Canvas canvas, int iconDensity, String url, int color) {
- Rect iconBounds = new Rect(0, 0, canvas.getWidth(), canvas.getHeight());
- Bitmap bookmarkWidgetBg =
- getBitmapFromResourceId(context, R.mipmap.bookmark_widget_bg, iconDensity);
-
- Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
- canvas.drawBitmap(bookmarkWidgetBg, null, iconBounds, paint);
-
- float density = (float) iconDensity / DisplayMetrics.DENSITY_MEDIUM;
- int iconSize = (int) (GENERATED_ICON_SIZE_DP * density);
- int iconRoundedEdge = (int) (GENERATED_ICON_ROUNDED_CORNERS_DP * density);
- int iconFontSize = (int) (GENERATED_ICON_FONT_SIZE_DP * density);
-
- RoundedIconGenerator generator = new RoundedIconGenerator(
- iconSize, iconSize, iconRoundedEdge, color, iconFontSize);
- Bitmap icon = generator.generateIconForUrl(url);
- if (icon == null) return; // Bookmark URL does not have a domain.
- canvas.drawBitmap(icon, iconBounds.exactCenterX() - icon.getWidth() / 2.0f,
- iconBounds.exactCenterY() - icon.getHeight() / 2.0f, null);
- }
}
« no previous file with comments | « chrome/android/java/res/mipmap-xhdpi/bookmark_widget_bg_highlights.png ('k') | chrome/browser/android/shortcut_helper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698