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

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

Issue 942103003: Handle notification preferences intent from gear icon. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments. Created 5 years, 10 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/notifications/NotificationUIManager.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java
index 261023eb674897a202f09bb5ac535be03d9179e2..e8c554e473e8f5806b59ae6ad55f661f6434823a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java
@@ -12,7 +12,9 @@
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color;
+import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
+import android.text.TextUtils;
import android.util.Log;
import org.chromium.base.CalledByNative;
@@ -20,6 +22,8 @@
import org.chromium.chrome.browser.preferences.Preferences;
import org.chromium.chrome.browser.preferences.PreferencesLauncher;
import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
+import org.chromium.chrome.browser.preferences.website.WebsitePreferences;
+import org.chromium.chrome.browser.preferences.website.WebsiteSettingsCategoryFilter;
import org.chromium.chrome.browser.widget.RoundedIconGenerator;
/**
@@ -121,6 +125,59 @@ public static boolean dispatchNotificationEvent(Intent intent) {
return false;
}
+ /**
+ * Launches the notifications preferences screen. If the received intent indicates it came
+ * from the gear button on a flipped notification, this launches the site specific preferences
+ * screen.
+ *
+ * @param context The context that received the intent.
+ * @param incomingIntent The received intent.
+ */
+ public static void launchNotificationPreferences(Context context, Intent incomingIntent) {
+ // Use the application context because it lives longer. When using he given context, it
+ // may be stopped before the preferences intent is handled.
+ Context applicationContext = context.getApplicationContext();
+
+ // If the user touched the settings cog on a flipped notification there will be a
+ // notification tag extra. From the tag we can read the origin of the notification, and use
+ // that to open the settings screen for that specific origin.
+ String notificationTag =
+ incomingIntent.getStringExtra(NotificationConstants.EXTRA_NOTIFICATION_TAG);
+ boolean launchSingleWebsitePreferences = notificationTag != null;
+
+ String fragmentName = launchSingleWebsitePreferences
+ ? SingleWebsitePreferences.class.getName()
+ : WebsitePreferences.class.getName();
+ Intent preferencesIntent =
+ PreferencesLauncher.createIntentForSettingsPage(applicationContext, fragmentName);
+
+ Bundle fragmentArguments;
+ if (launchSingleWebsitePreferences) {
+ // All preferences for a specific origin.
+ String[] tagParts =
+ notificationTag.split(NotificationConstants.NOTIFICATION_TAG_SEPARATOR);
+ assert tagParts.length >= 2;
+ String origin = tagParts[0];
+ fragmentArguments = SingleWebsitePreferences.createFragmentArgsForSite(origin);
+ } else {
+ // Notification preferences for all origins.
+ fragmentArguments = new Bundle();
+ fragmentArguments.putString(WebsitePreferences.EXTRA_CATEGORY,
+ WebsiteSettingsCategoryFilter.FILTER_PUSH_NOTIFICATIONS);
+ fragmentArguments.putString(WebsitePreferences.EXTRA_TITLE,
+ applicationContext.getResources().getString(
+ R.string.push_notifications_permission_title));
+ }
+ preferencesIntent.putExtra(Preferences.EXTRA_SHOW_FRAGMENT_ARGUMENTS, fragmentArguments);
+
+ // When coming from the gear on a flipped notification, we need to ensure that no existing
+ // preference tasks are being re-used in order for it to appear on top.
+ if (launchSingleWebsitePreferences)
+ preferencesIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+
+ applicationContext.startActivity(preferencesIntent);
+ }
+
private PendingIntent getPendingIntent(String action, String notificationId, int platformId,
byte[] notificationData) {
Intent intent = new Intent(action);
@@ -133,9 +190,19 @@ private PendingIntent getPendingIntent(String action, String notificationId, int
PendingIntent.FLAG_UPDATE_CURRENT);
}
+ private static String makePlatformTag(String tag, int platformId, String origin) {
+ // The given tag may contain the separator character, so add it last to make reading the
+ // preceding origin token reliable. If no tag was specified (it is the default empty
+ // string), make the platform tag unique by appending the platform id.
+ String platformTag = origin + NotificationConstants.NOTIFICATION_TAG_SEPARATOR + tag;
+ if (TextUtils.isEmpty(tag)) platformTag += platformId;
+ return platformTag;
+ }
+
/**
* Displays a notification with the given |notificationId|, |title|, |body| and |icon|.
*
+ * @param tag A string identifier for this notification.
* @param notificationId Unique id provided by the Chrome Notification system.
* @param title Title to be displayed in the notification.
* @param body Message to be displayed in the notification. Will be trimmed to one line of
@@ -147,8 +214,8 @@ private PendingIntent getPendingIntent(String action, String notificationId, int
* @return The id using which the notification can be identified.
*/
@CalledByNative
- private int displayNotification(String notificationId, String title, String body, Bitmap icon,
- String origin, byte[] notificationData) {
+ private int displayNotification(String tag, String notificationId, String title, String body,
+ Bitmap icon, String origin, byte[] notificationData) {
if (icon == null || icon.getWidth() == 0) {
icon = getIconGenerator().generateIconForUrl(origin, true);
}
@@ -181,7 +248,8 @@ private int displayNotification(String notificationId, String title, String body
pendingSettingsIntent)
.setSubText(origin);
- mNotificationManager.notify(mLastNotificationId, notificationBuilder.build());
+ String platformTag = makePlatformTag(tag, mLastNotificationId, origin);
+ mNotificationManager.notify(platformTag, mLastNotificationId, notificationBuilder.build());
return mLastNotificationId++;
}
@@ -213,11 +281,12 @@ private RoundedIconGenerator getIconGenerator() {
}
/**
- * Closes the notification identified by |platformId|.
+ * Closes the notification identified by |tag|, |platformId|, and |origin|.
*/
@CalledByNative
- private void closeNotification(int platformId) {
- mNotificationManager.cancel(platformId);
+ private void closeNotification(String tag, int platformId, String origin) {
+ String platformTag = makePlatformTag(tag, platformId, origin);
+ mNotificationManager.cancel(platformTag, platformId);
}
private boolean onNotificationClicked(String notificationId, int platformId,

Powered by Google App Engine
This is Rietveld 408576698