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

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

Issue 1441723002: Notification custom layouts: paint the button icon for Material. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Simplify setting a color filter. Created 5 years, 1 month 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
« no previous file with comments | « chrome/android/java/res/layout/web_notification_button.xml ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
index 56f067322507dee04ffe4be02b652bc94b2103c8..8acbcf5a8715c1d82328f75e2aedf1faed684c1a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
@@ -7,7 +7,9 @@
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
+import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.os.Build;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Action;
@@ -19,6 +21,7 @@
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.R;
+import org.chromium.ui.base.LocalizationUtils;
import java.util.ArrayList;
import java.util.Arrays;
@@ -60,7 +63,22 @@
* flexible amount of padding. If the font size is scaled up the applied padding will be scaled
* down towards 0.
*/
- private static final int MAX_SCALABLE_PADDING_DIP = 3;
+ private static final int MAX_SCALABLE_PADDING_DP = 3;
+
+ /**
+ * The amount of padding at the start of the button, either before an icon or before the text.
+ */
+ private static final int BUTTON_PADDING_START_DP = 8;
+
+ /**
+ * The amount of padding between the icon and text of a button. Used only if there is an icon.
+ */
+ private static final int BUTTON_ICON_PADDING_DP = 8;
+
+ /**
+ * Material Grey 600 - to be applied to action button icons in the Material theme.
+ */
+ private static final int BUTTON_ICON_COLOR_MATERIAL = 0xff757575;
private final Context mContext;
@@ -101,21 +119,9 @@ public Notification build() {
view.setViewPadding(R.id.title, 0, scaledPadding, 0, 0);
view.setViewPadding(R.id.body, 0, scaledPadding, 0, scaledPadding);
}
+ addActionButtons(bigView);
- if (!mActions.isEmpty()) {
- bigView.setViewVisibility(R.id.button_divider, View.VISIBLE);
- bigView.setViewVisibility(R.id.buttons, View.VISIBLE);
- for (Action action : mActions) {
- RemoteViews button = new RemoteViews(
- mContext.getPackageName(), R.layout.web_notification_button);
- button.setTextViewCompoundDrawablesRelative(R.id.button, action.getIcon(), 0, 0, 0);
- button.setTextViewText(R.id.button, action.getTitle());
- button.setOnClickPendingIntent(R.id.button, action.getActionIntent());
- bigView.addView(R.id.buttons, button);
- }
- }
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ if (useMaterial()) {
compactView.setViewVisibility(R.id.small_icon_overlay, View.VISIBLE);
bigView.setViewVisibility(R.id.small_icon_overlay, View.VISIBLE);
} else {
@@ -207,6 +213,49 @@ public NotificationBuilder setVibrate(long[] pattern) {
return this;
}
+ /**
+ * If there are actions, shows the button related views, and adds a button for each action.
+ */
+ private void addActionButtons(RemoteViews bigView) {
+ if (mActions.isEmpty()) {
+ return;
+ }
+ bigView.setViewVisibility(R.id.button_divider, View.VISIBLE);
+ bigView.setViewVisibility(R.id.buttons, View.VISIBLE);
+ Resources resources = mContext.getResources();
+ DisplayMetrics metrics = resources.getDisplayMetrics();
+ for (Action action : mActions) {
+ RemoteViews view =
+ new RemoteViews(mContext.getPackageName(), R.layout.web_notification_button);
+
+ if (action.getIcon() != 0) {
+ // TODO(mvanouwerkerk): If the icon can be provided by web developers, limit its
+ // dimensions and decide whether or not to paint it.
+ if (useMaterial()) {
+ view.setInt(R.id.button_icon, "setColorFilter", BUTTON_ICON_COLOR_MATERIAL);
+ }
+ view.setImageViewResource(R.id.button_icon, action.getIcon());
+
+ // Set the padding of the button so the text does not overlap with the icon. Flip
+ // between left and right manually as RemoteViews does not expose a method that sets
+ // padding in a writing-direction independent way.
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeResource(resources, action.getIcon(), options);
+ int buttonPadding =
+ dpToPx(BUTTON_PADDING_START_DP + BUTTON_ICON_PADDING_DP, metrics)
+ + options.outWidth;
+ int buttonPaddingLeft = LocalizationUtils.isLayoutRtl() ? 0 : buttonPadding;
+ int buttonPaddingRight = LocalizationUtils.isLayoutRtl() ? buttonPadding : 0;
+ view.setViewPadding(R.id.button, buttonPaddingLeft, 0, buttonPaddingRight, 0);
+ }
+
+ view.setTextViewText(R.id.button, action.getTitle());
+ view.setOnClickPendingIntent(R.id.button, action.getActionIntent());
+ bigView.addView(R.id.buttons, view);
+ }
+ }
+
@Nullable
private static CharSequence limitLength(@Nullable CharSequence input) {
if (input == null) {
@@ -252,7 +301,21 @@ static int calculateScaledPadding(float fontScale, DisplayMetrics displayMetrics
fontScale = Math.min(fontScale, FONT_SCALE_LARGE);
paddingScale = (FONT_SCALE_LARGE - fontScale) / (FONT_SCALE_LARGE - 1.0f);
}
- return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
- paddingScale * MAX_SCALABLE_PADDING_DIP, displayMetrics));
+ return dpToPx(paddingScale * MAX_SCALABLE_PADDING_DP, displayMetrics);
+ }
+
+ /**
+ * Converts a dp value to a px value.
+ */
+ private static int dpToPx(float value, DisplayMetrics displayMetrics) {
+ return Math.round(
+ TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, displayMetrics));
+ }
+
+ /**
+ * Whether to use the Material look and feel or fall back to Holo.
+ */
+ private static boolean useMaterial() {
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
}
}
« no previous file with comments | « chrome/android/java/res/layout/web_notification_button.xml ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698