| 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 ed299336897ca1d862100d376a09133bc6367664..73de4adfc3ee1801f25364483acc13ac80657540 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 | 
| @@ -30,8 +30,9 @@ | 
| import org.chromium.chrome.browser.notifications.NotificationConstants; | 
| import org.chromium.chrome.browser.notifications.NotificationUmaTracker; | 
| import org.chromium.chrome.browser.ntp.snippets.ContentSuggestionsNotificationAction; | 
| +import org.chromium.chrome.browser.ntp.snippets.ContentSuggestionsNotificationAction.ContentSuggestionsNotificationActionEnum; | 
| +import org.chromium.chrome.browser.ntp.snippets.ContentSuggestionsNotificationOptOut.ContentSuggestionsNotificationOptOutEnum; | 
| import org.chromium.chrome.browser.preferences.ContentSuggestionsPreferences; | 
| -import org.chromium.chrome.browser.preferences.PreferencesLauncher; | 
|  | 
| import java.util.Collection; | 
| import java.util.Collections; | 
| @@ -74,6 +75,24 @@ | 
| private ContentSuggestionsNotificationHelper() {} // Prevent instantiation | 
|  | 
| /** | 
| +     * Records the reason why Content Suggestions notifications have been opted out. | 
| +     * @see ContentSuggestionsNotificationOptOutEnum; | 
| +     */ | 
| +    public static void recordNotificationOptOut( | 
| +            @ContentSuggestionsNotificationOptOutEnum int reason) { | 
| +        nativeRecordNotificationOptOut(reason); | 
| +    } | 
| + | 
| +    /** | 
| +     * Records an action performed on a Content Suggestions notification. | 
| +     * @see ContentSuggestionsNotificationActionEnum; | 
| +     */ | 
| +    public static void recordNotificationAction( | 
| +            @ContentSuggestionsNotificationActionEnum int action) { | 
| +        nativeRecordNotificationAction(action); | 
| +    } | 
| + | 
| +    /** | 
| * Opens the content suggestion when notification is tapped. | 
| */ | 
| public static final class OpenUrlReceiver extends BroadcastReceiver { | 
| @@ -82,7 +101,7 @@ public void onReceive(Context context, Intent intent) { | 
| int category = intent.getIntExtra(NOTIFICATION_CATEGORY_EXTRA, -1); | 
| String idWithinCategory = intent.getStringExtra(NOTIFICATION_ID_WITHIN_CATEGORY_EXTRA); | 
| openUrl(intent.getData()); | 
| -            recordCachedActionMetric(ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_TAP); | 
| +            recordCachedActionMetric(ContentSuggestionsNotificationAction.TAP); | 
| removeActiveNotification(category, idWithinCategory); | 
| } | 
| } | 
| @@ -95,8 +114,7 @@ public void onReceive(Context context, Intent intent) { | 
| public void onReceive(Context context, Intent intent) { | 
| int category = intent.getIntExtra(NOTIFICATION_CATEGORY_EXTRA, -1); | 
| String idWithinCategory = intent.getStringExtra(NOTIFICATION_ID_WITHIN_CATEGORY_EXTRA); | 
| -            recordCachedActionMetric( | 
| -                    ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_DISMISSAL); | 
| +            recordCachedActionMetric(ContentSuggestionsNotificationAction.DISMISSAL); | 
| removeActiveNotification(category, idWithinCategory); | 
| } | 
| } | 
| @@ -113,8 +131,8 @@ public void onReceive(Context context, Intent intent) { | 
| return; // tapped or swiped | 
| } | 
|  | 
| -            hideNotification(category, idWithinCategory, | 
| -                    ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_DEADLINE); | 
| +            hideNotification( | 
| +                    category, idWithinCategory, ContentSuggestionsNotificationAction.HIDE_DEADLINE); | 
| } | 
| } | 
|  | 
| @@ -173,8 +191,8 @@ private static boolean showNotification(int category, String idWithinCategory, S | 
| .setSmallIcon(R.drawable.ic_chrome); | 
| if (ChromeFeatureList.isEnabled(ChromeFeatureList.CONTENT_SUGGESTIONS_SETTINGS)) { | 
| PendingIntent settingsIntent = PendingIntent.getActivity(context, 0, | 
| -                    PreferencesLauncher.createIntentForSettingsPage( | 
| -                            context, ContentSuggestionsPreferences.class.getName()), | 
| +                    ContentSuggestionsPreferences.createLaunchIntent( | 
| +                            context, ContentSuggestionsPreferences.LAUNCH_SOURCE_NOTIFICATION), | 
| 0); | 
| builder.addAction(R.drawable.settings_cog, context.getString(R.string.preferences), | 
| settingsIntent); | 
| @@ -349,22 +367,21 @@ private static int nextNotificationId() { | 
| } | 
|  | 
| private static String cachedMetricNameForAction( | 
| -            @ContentSuggestionsNotificationAction.ContentSuggestionsNotificationActionEnum | 
| -            int action) { | 
| +            @ContentSuggestionsNotificationActionEnum int action) { | 
| switch (action) { | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_TAP: | 
| +            case ContentSuggestionsNotificationAction.TAP: | 
| return PREF_CACHED_ACTION_TAP; | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_DISMISSAL: | 
| +            case ContentSuggestionsNotificationAction.DISMISSAL: | 
| return PREF_CACHED_ACTION_DISMISSAL; | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_DEADLINE: | 
| +            case ContentSuggestionsNotificationAction.HIDE_DEADLINE: | 
| return PREF_CACHED_ACTION_HIDE_DEADLINE; | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_EXPIRY: | 
| +            case ContentSuggestionsNotificationAction.HIDE_EXPIRY: | 
| return PREF_CACHED_ACTION_HIDE_EXPIRY; | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_FRONTMOST: | 
| +            case ContentSuggestionsNotificationAction.HIDE_FRONTMOST: | 
| return PREF_CACHED_ACTION_HIDE_FRONTMOST; | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_DISABLED: | 
| +            case ContentSuggestionsNotificationAction.HIDE_DISABLED: | 
| return PREF_CACHED_ACTION_HIDE_DISABLED; | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_SHUTDOWN: | 
| +            case ContentSuggestionsNotificationAction.HIDE_SHUTDOWN: | 
| return PREF_CACHED_ACTION_HIDE_SHUTDOWN; | 
| } | 
| return ""; | 
| @@ -383,8 +400,7 @@ private static String cachedMetricNameForAction( | 
| * @param action The action to update the pref for. | 
| */ | 
| private static void recordCachedActionMetric( | 
| -            @ContentSuggestionsNotificationAction.ContentSuggestionsNotificationActionEnum | 
| -            int action) { | 
| +            @ContentSuggestionsNotificationActionEnum int action) { | 
| String prefName = cachedMetricNameForAction(action); | 
| assert !prefName.isEmpty(); | 
|  | 
| @@ -393,17 +409,17 @@ private static void recordCachedActionMetric( | 
|  | 
| int consecutiveIgnored = prefs.getInt(PREF_CACHED_CONSECUTIVE_IGNORED, 0); | 
| switch (action) { | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_TAP: | 
| +            case ContentSuggestionsNotificationAction.TAP: | 
| consecutiveIgnored = 0; | 
| break; | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_DISMISSAL: | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_DEADLINE: | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_EXPIRY: | 
| +            case ContentSuggestionsNotificationAction.DISMISSAL: | 
| +            case ContentSuggestionsNotificationAction.HIDE_DEADLINE: | 
| +            case ContentSuggestionsNotificationAction.HIDE_EXPIRY: | 
| ++consecutiveIgnored; | 
| break; | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_FRONTMOST: | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_DISABLED: | 
| -            case ContentSuggestionsNotificationAction.CONTENT_SUGGESTIONS_HIDE_SHUTDOWN: | 
| +            case ContentSuggestionsNotificationAction.HIDE_FRONTMOST: | 
| +            case ContentSuggestionsNotificationAction.HIDE_DISABLED: | 
| +            case ContentSuggestionsNotificationAction.HIDE_SHUTDOWN: | 
| break; // no change | 
| } | 
|  | 
| @@ -457,4 +473,8 @@ private static void flushCachedMetrics() { | 
| private static native void nativeReceiveFlushedMetrics(int tapCount, int dismissalCount, | 
| int hideDeadlineCount, int hideExpiryCount, int hideFrontmostCount, | 
| int hideDisabledCount, int hideShutdownCount, int consecutiveIgnored); | 
| +    private static native void nativeRecordNotificationOptOut( | 
| +            @ContentSuggestionsNotificationOptOutEnum int reason); | 
| +    private static native void nativeRecordNotificationAction( | 
| +            @ContentSuggestionsNotificationActionEnum int action); | 
| } | 
|  |