Index: chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java |
index 21f25a8566e2eb443b20a747e47fd65c9c418c88..1c164af831e8b0681edd3d2faf58921a08ae017a 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java |
@@ -11,6 +11,7 @@ import android.content.Context; |
import android.content.Intent; |
import android.content.res.Resources; |
import android.graphics.Bitmap; |
+import android.graphics.drawable.Icon; |
import android.net.Uri; |
import android.os.Build; |
import android.os.Bundle; |
@@ -519,6 +520,9 @@ public class NotificationPlatformBridge { |
makePendingIntent(NotificationConstants.ACTION_CLOSE_NOTIFICATION, notificationId, |
origin, profileId, incognito, tag, webApkPackage, -1 /* actionIndex */); |
+ String originForDisplay = |
+ UrlFormatter.formatUrlForSecurityDisplay(origin, false /* showScheme */); |
+ |
NotificationBuilderBase notificationBuilder = |
createNotificationBuilder() |
.setTitle(title) |
@@ -532,8 +536,12 @@ public class NotificationPlatformBridge { |
.setTicker(createTickerText(title, body)) |
.setTimestamp(timestamp) |
.setRenotify(renotify) |
- .setOrigin(UrlFormatter.formatUrlForSecurityDisplay( |
- origin, false /* showScheme */)); |
+ .setOrigin(originForDisplay); |
+ |
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { |
+ // Public versions of notifications are only supported on Android L+. |
+ notificationBuilder.setPublicVersion(createPublicNotification(badge, originForDisplay)); |
+ } |
for (int actionIndex = 0; actionIndex < actionTitles.length; actionIndex++) { |
notificationBuilder.addAction(actionIcons[actionIndex], actionTitles[actionIndex], |
@@ -575,6 +583,35 @@ public class NotificationPlatformBridge { |
} |
} |
+ private Notification createPublicNotification(Bitmap badge, String originForDisplay) { |
Peter Beverloo
2016/09/09 12:53:31
What do you think about moving this to Notificatio
awdf
2016/09/09 15:55:26
I agree it makes sense to move this method (& icon
Peter Beverloo
2016/09/09 15:58:23
Calling it from the subclass' build() methods make
|
+ // Use Android's Notification.Builder because we want the default small icon behaviour. |
+ Notification.Builder builder = |
+ new Notification.Builder(mAppContext) |
+ .setContentText(mAppContext.getString(R.string.notification_hidden_text)) |
+ .setSmallIcon(R.drawable.ic_chrome); |
+ |
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { |
+ // Set origin as title on L & M, because they look odd without one. |
+ builder.setContentTitle(originForDisplay); |
+ } else { |
+ // On N(+?) 'subtext' displays at the top of the notification and this looks better. |
+ builder.setSubText(originForDisplay); |
+ } |
+ |
+ // Use the badge if provided and SDK supports it, else use a generated icon. |
+ if (badge != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
awdf
2016/09/09 09:51:01
I don't really like all these version checks, woul
Peter Beverloo
2016/09/09 12:53:31
I don't mind the version checks too much, the inte
|
+ // The Icon class was added in Android M. |
+ Bitmap publicIcon = badge.copy(badge.getConfig(), true); |
+ NotificationBuilderBase.applyWhiteOverlayToBitmap(publicIcon); |
+ builder.setSmallIcon(Icon.createWithBitmap(publicIcon)); |
+ } else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { |
+ // Only set the large icon for L & M because on N(+?) it would add an extra icon on |
+ // the right hand side, which looks odd without a notification title. |
+ builder.setLargeIcon(generateLargeIconForUrl(originForDisplay)); |
+ } |
+ return builder.build(); |
+ } |
+ |
private NotificationBuilderBase createNotificationBuilder() { |
if (useCustomLayouts()) { |
return new CustomNotificationBuilder(mAppContext); |
@@ -618,26 +655,26 @@ public class NotificationPlatformBridge { |
@VisibleForTesting |
public Bitmap ensureNormalizedIcon(Bitmap icon, String origin) { |
if (icon == null || icon.getWidth() == 0) { |
- if (mIconGenerator == null) { |
- int cornerRadiusPx = Math.min(mLargeIconWidthPx, mLargeIconHeightPx) / 2; |
- mIconGenerator = |
- new RoundedIconGenerator(mLargeIconWidthPx, mLargeIconHeightPx, |
- cornerRadiusPx, |
- NOTIFICATION_ICON_BG_COLOR, |
- NOTIFICATION_TEXT_SIZE_DP * mDensity); |
- } |
- |
- return mIconGenerator.generateIconForUrl(origin, true); |
+ return generateLargeIconForUrl(origin); |
} |
- |
if (icon.getWidth() > mLargeIconWidthPx || icon.getHeight() > mLargeIconHeightPx) { |
return icon.createScaledBitmap(icon, mLargeIconWidthPx, mLargeIconHeightPx, |
false /* not filtered */); |
} |
- |
return icon; |
} |
+ private Bitmap generateLargeIconForUrl(String origin) { |
+ if (mIconGenerator == null) { |
+ int cornerRadiusPx = Math.min(mLargeIconWidthPx, mLargeIconHeightPx) / 2; |
+ mIconGenerator = |
+ new RoundedIconGenerator(mLargeIconWidthPx, mLargeIconHeightPx, cornerRadiusPx, |
+ NOTIFICATION_ICON_BG_COLOR, NOTIFICATION_TEXT_SIZE_DP * mDensity); |
+ } |
+ |
+ return mIconGenerator.generateIconForUrl(origin, true); |
+ } |
+ |
/** |
* Determines whether to use standard notification layouts, using NotificationCompat.Builder, |
* or custom layouts using Chrome's own templates. |