| Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java
|
| index dcf20b80496c2c3e9fbb682c36fdafd8d236df9d..337a3a997a905b558711614896dae30c57f4c9ae 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java
|
| @@ -4,13 +4,18 @@
|
|
|
| package org.chromium.chrome.browser.ntp;
|
|
|
| +import android.annotation.TargetApi;
|
| +import android.app.AlarmManager;
|
| import android.app.NotificationManager;
|
| import android.app.PendingIntent;
|
| +import android.content.BroadcastReceiver;
|
| import android.content.Context;
|
| import android.content.Intent;
|
| import android.graphics.Bitmap;
|
| import android.net.Uri;
|
| +import android.os.Build;
|
| import android.provider.Browser;
|
| +import android.service.notification.StatusBarNotification;
|
| import android.support.v4.app.NotificationCompat;
|
|
|
| import org.chromium.base.ContextUtils;
|
| @@ -27,10 +32,21 @@ import org.chromium.chrome.browser.document.ChromeLauncherActivity;
|
| */
|
| public class ContentSuggestionsNotificationHelper {
|
| private static final String NOTIFICATION_TAG = "ContentSuggestionsNotification";
|
| - private static final int NOTIFICATION_ID = 0;
|
| + private static final String NOTIFICATION_ID_EXTRA = "notification_id";
|
|
|
| private ContentSuggestionsNotificationHelper() {} // Prevent instantiation
|
|
|
| + /**
|
| + * Removes the notification after a timeout period.
|
| + */
|
| + public static final class TimeoutReceiver extends BroadcastReceiver {
|
| + public void onReceive(Context context, Intent intent) {
|
| + int id = intent.getIntExtra(NOTIFICATION_ID_EXTRA, -1);
|
| + if (id < 0) return;
|
| + hideNotification(id);
|
| + }
|
| + }
|
| +
|
| @CalledByNative
|
| private static void openUrl(String url) {
|
| Context context = ContextUtils.getApplicationContext();
|
| @@ -45,11 +61,26 @@ public class ContentSuggestionsNotificationHelper {
|
| context.startActivity(intent);
|
| }
|
|
|
| + @TargetApi(Build.VERSION_CODES.M)
|
| @CalledByNative
|
| - private static void showNotification(String url, String title, String text, Bitmap image) {
|
| + private static void showNotification(
|
| + String url, String title, String text, Bitmap image, long timeoutAtMillis) {
|
| + // Post notification.
|
| Context context = ContextUtils.getApplicationContext();
|
| NotificationManager manager =
|
| (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
| +
|
| + // Find an available notification ID.
|
| + int nextId = 0;
|
| + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
| + for (StatusBarNotification activeNotification : manager.getActiveNotifications()) {
|
| + if (activeNotification.getTag() != NOTIFICATION_TAG) continue;
|
| + if (activeNotification.getId() >= nextId) {
|
| + nextId = activeNotification.getId() + 1;
|
| + }
|
| + }
|
| + }
|
| +
|
| Intent intent = new Intent()
|
| .setAction(Intent.ACTION_VIEW)
|
| .setData(Uri.parse(url))
|
| @@ -65,14 +96,42 @@ public class ContentSuggestionsNotificationHelper {
|
| .setGroup(NOTIFICATION_TAG)
|
| .setLargeIcon(image)
|
| .setSmallIcon(R.drawable.ic_chrome);
|
| - manager.notify(NOTIFICATION_TAG, NOTIFICATION_ID, builder.build());
|
| + manager.notify(NOTIFICATION_TAG, nextId, builder.build());
|
| +
|
| + // Set timeout.
|
| + if (timeoutAtMillis != Long.MAX_VALUE) {
|
| + AlarmManager alarmManager =
|
| + (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
| + Intent timeoutIntent = new Intent(context, TimeoutReceiver.class)
|
| + .setData(Uri.parse(url))
|
| + .putExtra(NOTIFICATION_ID_EXTRA, nextId);
|
| + alarmManager.set(AlarmManager.RTC, timeoutAtMillis,
|
| + PendingIntent.getBroadcast(
|
| + context, 0, timeoutIntent, PendingIntent.FLAG_UPDATE_CURRENT));
|
| + }
|
| + }
|
| +
|
| + private static void hideNotification(int id) {
|
| + Context context = ContextUtils.getApplicationContext();
|
| + NotificationManager manager =
|
| + (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
| + manager.cancel(NOTIFICATION_TAG, id);
|
| }
|
|
|
| + @TargetApi(Build.VERSION_CODES.M)
|
| @CalledByNative
|
| - private static void hideNotification() {
|
| + private static void hideAllNotifications() {
|
| Context context = ContextUtils.getApplicationContext();
|
| NotificationManager manager =
|
| (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
| - manager.cancel(NOTIFICATION_TAG, NOTIFICATION_ID);
|
| + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
| + for (StatusBarNotification activeNotification : manager.getActiveNotifications()) {
|
| + if (activeNotification.getTag() == NOTIFICATION_TAG) {
|
| + manager.cancel(NOTIFICATION_TAG, activeNotification.getId());
|
| + }
|
| + }
|
| + } else {
|
| + manager.cancel(NOTIFICATION_TAG, 0);
|
| + }
|
| }
|
| }
|
|
|