From cbc6bcfb217ebb295866de1ff1034f809d6b0f2b Mon Sep 17 00:00:00 2001 From: Chenxia Liu Date: Fri, 10 May 2013 21:29:09 -0700 Subject: [PATCH] Bug 833625 - Part 2: Android notifications for data reporting. r=rnewman --- mobile/android/base/BrowserApp.java | 6 ++ .../base/DataReportingNotification.java | 100 ++++++++++++++++++ mobile/android/base/GeckoApp.java | 1 + mobile/android/base/GeckoPreferences.java | 4 +- mobile/android/base/Makefile.in | 4 + .../base/locales/en-US/android_strings.dtd | 5 + .../firefox_settings_alert.png | Bin 0 -> 1568 bytes .../firefox_settings_alert.png | Bin 0 -> 1389 bytes .../firefox_settings_alert.png | Bin 0 -> 1849 bytes mobile/android/base/strings.xml.in | 5 + 10 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 mobile/android/base/DataReportingNotification.java create mode 100644 mobile/android/base/resources/drawable-hdpi-v11/firefox_settings_alert.png create mode 100644 mobile/android/base/resources/drawable-mdpi-v11/firefox_settings_alert.png create mode 100644 mobile/android/base/resources/drawable-xhdpi-v11/firefox_settings_alert.png diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index bc6512d4b75c..ec15caad7a9c 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -840,6 +840,12 @@ abstract public class BrowserApp extends GeckoApp menu.findItem(R.id.settings).setEnabled(true); } }); + + // Display notification for Mozilla data reporting, if data should be collected. + if (AppConstants.MOZ_DATA_REPORTING) { + DataReportingNotification.checkAndNotifyPolicy(BrowserApp.mAppContext); + } + } else if (event.equals("Telemetry:Gather")) { Telemetry.HistogramAdd("PLACES_PAGES_COUNT", BrowserDB.getCount(getContentResolver(), "history")); Telemetry.HistogramAdd("PLACES_BOOKMARKS_COUNT", BrowserDB.getCount(getContentResolver(), "bookmarks")); diff --git a/mobile/android/base/DataReportingNotification.java b/mobile/android/base/DataReportingNotification.java new file mode 100644 index 000000000000..03274f32e53a --- /dev/null +++ b/mobile/android/base/DataReportingNotification.java @@ -0,0 +1,100 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko; + +import org.mozilla.gecko.GeckoPreferences; +import org.mozilla.gecko.GeckoPreferenceFragment; +import org.mozilla.gecko.util.ThreadUtils; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Build; +import android.os.Bundle; +import android.preference.PreferenceActivity; +import android.support.v4.app.NotificationCompat; +import android.support.v4.app.NotificationCompat.Builder; +import android.util.Log; + +public class DataReportingNotification { + + private static final String LOGTAG = "DataReportNotification"; + + public static final String ALERT_NAME_DATAREPORTING_NOTIFICATION = "datareporting-notification"; + + private static final String DEFAULT_PREFS_BRANCH = AppConstants.ANDROID_PACKAGE_NAME + "_preferences"; + private static final String PREFS_POLICY_NOTIFIED_TIME = "datareporting.policy.dataSubmissionPolicyNotifiedTime"; + private static final String PREFS_POLICY_VERSION = "datareporting.policy.dataSubmissionPolicyVersion"; + private static final int DATA_REPORTING_VERSION = 1; + + public static void checkAndNotifyPolicy(Context context) { + SharedPreferences dataPrefs = context.getSharedPreferences(DEFAULT_PREFS_BRANCH, 0); + + // Notify if user has not been notified or if policy version has changed. + if ((!dataPrefs.contains(PREFS_POLICY_NOTIFIED_TIME)) || + (DATA_REPORTING_VERSION != dataPrefs.getInt(PREFS_POLICY_VERSION, -1))) { + + // Launch Data Choices fragment when notification is clicked. + Intent prefIntent = new Intent(context, GeckoPreferences.class); + + // Build launch intent based on Android version. + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + prefIntent.putExtra("resource", "preferences_datareporting"); + } else { + prefIntent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, GeckoPreferenceFragment.class.getName()); + + Bundle fragmentArgs = new Bundle(); + fragmentArgs.putString("resource", "preferences_datareporting"); + prefIntent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, fragmentArgs); + } + + PendingIntent contentIntent = PendingIntent.getActivity(context, 0, prefIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + // Create and send notification. + String notificationTitle = context.getResources().getString(R.string.datareporting_notification_title); + String notificationSummary; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + notificationSummary = context.getResources().getString(R.string.datareporting_notification_action); + } else { + // Display partial version of Big Style notification for supporting devices. + notificationSummary = context.getResources().getString(R.string.datareporting_notification_summary_short); + } + String notificationAction = context.getResources().getString(R.string.datareporting_notification_action); + String notificationBigSummary = context.getResources().getString(R.string.datareporting_notification_summary); + + Notification notification = new NotificationCompat.Builder(context) + .setContentTitle(notificationTitle) + .setContentText(notificationSummary) + .setSmallIcon(R.drawable.ic_status_logo) + .setAutoCancel(true) + .setContentIntent(contentIntent) + .setStyle(new NotificationCompat.BigTextStyle() + .bigText(notificationBigSummary)) + .addAction(R.drawable.ic_menu_settings, notificationAction, contentIntent) + .build(); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + int notificationID = ALERT_NAME_DATAREPORTING_NOTIFICATION.hashCode(); + notificationManager.notify(notificationID, notification); + + // Record version and notification time. + SharedPreferences.Editor editor = dataPrefs.edit(); + long now = System.currentTimeMillis(); + editor.putLong(PREFS_POLICY_NOTIFIED_TIME, now); + editor.putInt(PREFS_POLICY_VERSION, DATA_REPORTING_VERSION); + + // If healthreport is enabled, set default preference value. + if (AppConstants.MOZ_SERVICES_HEALTHREPORT) { + editor.putBoolean(GeckoPreferences.PREFS_HEALTHREPORT_UPLOAD_ENABLED, true); + } + + editor.commit(); + } + } +} diff --git a/mobile/android/base/GeckoApp.java b/mobile/android/base/GeckoApp.java index 717db909d31d..077aab336663 100644 --- a/mobile/android/base/GeckoApp.java +++ b/mobile/android/base/GeckoApp.java @@ -5,6 +5,7 @@ package org.mozilla.gecko; +import org.mozilla.gecko.DataReportingNotification; import org.mozilla.gecko.background.announcements.AnnouncementsBroadcastService; import org.mozilla.gecko.db.BrowserDB; import org.mozilla.gecko.gfx.BitmapUtils; diff --git a/mobile/android/base/GeckoPreferences.java b/mobile/android/base/GeckoPreferences.java index 04461b328d5d..f05e6ec4796d 100644 --- a/mobile/android/base/GeckoPreferences.java +++ b/mobile/android/base/GeckoPreferences.java @@ -51,18 +51,18 @@ public class GeckoPreferences { private static final String LOGTAG = "GeckoPreferences"; + private static final String NON_PREF_PREFIX = "android.not_a_preference."; public static final String INTENT_EXTRA_RESOURCES = "resource"; + public static String PREFS_HEALTHREPORT_UPLOAD_ENABLED = NON_PREF_PREFIX + "healthreport.uploadEnabled"; private static boolean sIsCharEncodingEnabled = false; private boolean mInitialized = false; - private static final String NON_PREF_PREFIX = "android.not_a_preference."; // These match keys in resources/xml/preferences.xml.in. private static String PREFS_ANNOUNCEMENTS_ENABLED = NON_PREF_PREFIX + "privacy.announcements.enabled"; private static String PREFS_DATA_REPORTING_PREFERENCES = NON_PREF_PREFIX + "datareporting.preferences"; private static String PREFS_TELEMETRY_ENABLED = "datareporting.telemetry.enabled"; private static String PREFS_CRASHREPORTER_ENABLED = "datareporting.crashreporter.submitEnabled"; - private static String PREFS_HEALTHREPORT_UPLOAD_ENABLED = NON_PREF_PREFIX + "healthreport.uploadEnabled"; private static String PREFS_MENU_CHAR_ENCODING = "browser.menu.showCharacterEncoding"; private static String PREFS_MP_ENABLED = "privacy.masterpassword.enabled"; private static String PREFS_UPDATER_AUTODOWNLOAD = "app.update.autodownload"; diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index 6393a36392ed..70470e7bfa62 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -77,6 +77,7 @@ FENNEC_JAVA_FILES = \ db/BrowserDB.java \ db/LocalBrowserDB.java \ db/DBUtils.java \ + DataReportingNotification.java \ Distribution.java \ Divider.java \ DoorHanger.java \ @@ -853,6 +854,7 @@ RES_DRAWABLE_MDPI_V11 = \ res/drawable-mdpi-v11/alert_addon.png \ res/drawable-mdpi-v11/alert_app.png \ res/drawable-mdpi-v11/alert_download.png \ + res/drawable-mdpi-v11/firefox_settings_alert.png \ res/drawable-mdpi-v11/ic_menu_addons.png \ res/drawable-mdpi-v11/ic_menu_apps.png \ res/drawable-mdpi-v11/ic_menu_back.png \ @@ -878,6 +880,7 @@ RES_DRAWABLE_HDPI_V11 = \ res/drawable-hdpi-v11/alert_addon.png \ res/drawable-hdpi-v11/alert_app.png \ res/drawable-hdpi-v11/alert_download.png \ + res/drawable-hdpi-v11/firefox_settings_alert.png \ res/drawable-hdpi-v11/ic_menu_addons.png \ res/drawable-hdpi-v11/ic_menu_apps.png \ res/drawable-hdpi-v11/ic_menu_back.png \ @@ -903,6 +906,7 @@ RES_DRAWABLE_XHDPI_V11 = \ res/drawable-xhdpi-v11/alert_addon.png \ res/drawable-xhdpi-v11/alert_app.png \ res/drawable-xhdpi-v11/alert_download.png \ + res/drawable-xhdpi-v11/firefox_settings_alert.png \ res/drawable-xhdpi-v11/ic_menu_addons.png \ res/drawable-xhdpi-v11/ic_menu_apps.png \ res/drawable-xhdpi-v11/ic_menu_back.png \ diff --git a/mobile/android/base/locales/en-US/android_strings.dtd b/mobile/android/base/locales/en-US/android_strings.dtd index 1ea85f40041a..37df3837c91f 100644 --- a/mobile/android/base/locales/en-US/android_strings.dtd +++ b/mobile/android/base/locales/en-US/android_strings.dtd @@ -132,6 +132,11 @@ size. --> + + + + +