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

Unified Diff: chrome/browser/chromeos/status/data_promo_notification.cc

Issue 1022333002: Initial CL for Data Saver (Flywheel) prompt when cellular network detected (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add command line flags to histograms.xml Created 5 years, 8 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/browser/chromeos/status/data_promo_notification.cc
diff --git a/chrome/browser/chromeos/status/data_promo_notification.cc b/chrome/browser/chromeos/status/data_promo_notification.cc
index 821e95a6cfd00fbc83c03066ad036853057e7571..dd36d0db859be4bfb80622e9eca92b5827ff6e47 100644
--- a/chrome/browser/chromeos/status/data_promo_notification.cc
+++ b/chrome/browser/chromeos/status/data_promo_notification.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/chromeos/status/data_promo_notification.h"
#include "ash/system/system_notifier.h"
+#include "base/command_line.h"
#include "base/prefs/pref_registry_simple.h"
#include "base/prefs/pref_service.h"
#include "base/strings/utf_string_conversions.h"
@@ -17,14 +18,17 @@
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
#include "chrome/browser/ui/singleton_tabs.h"
+#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/generated_resources.h"
+#include "chromeos/chromeos_switches.h"
#include "chromeos/login/login_state.h"
#include "chromeos/network/device_state.h"
#include "chromeos/network/network_connection_handler.h"
#include "chromeos/network/network_event_log.h"
#include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h"
+#include "extensions/browser/extension_registry.h"
#include "grit/ui_chromeos_resources.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
#include "ui/base/l10n/l10n_util.h"
@@ -41,8 +45,13 @@ namespace chromeos {
namespace {
const char kDataPromoNotificationId[] = "chrome://settings/internet/data_promo";
+const char kDataSaverNotificationId[] = "chrome://settings/internet/data_saver";
+const char kDataSaverExtensionUrl[] =
+ "https://chrome.google.com/webstore/detail/"
+ "pfmgfdlgomnbgkofeojodiodmgpgmkac";
const int kNotificationCountPrefDefault = -1;
+const int kTimesToShowDataSaverPrompt = 2;
bool GetBooleanPref(const char* pref_name) {
Profile* profile = ProfileManager::GetPrimaryUserProfile();
@@ -85,6 +94,41 @@ void SetCarrierDealPromoShown(int value) {
SetIntegerLocalPref(prefs::kCarrierDealPromoShown, value);
}
+// Returns number of times the Data Saver prompt has been displayed.
+int GetDataSaverPromptsShown() {
+ return ProfileManager::GetActiveUserProfile()->GetPrefs()->GetInteger(
+ prefs::kDataSaverPromptsShown);
+}
+
+// Updates number of times the Data Saver prompt has been displayed.
+void SetDataSaverPromptsShown(int times_shown) {
+ ProfileManager::GetActiveUserProfile()->GetPrefs()->SetInteger(
+ prefs::kDataSaverPromptsShown, times_shown);
+}
+
+// Is command line switch set for Data Saver prompt?
+bool DataSaverSwitchEnabled() {
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ chromeos::switches::kDisableDataSaverPrompt))
+ return false;
+
+ return base::CommandLine::ForCurrentProcess()->HasSwitch(
+ chromeos::switches::kEnableDataSaverPrompt);
+}
+
+// Is command line switch set for Data Saver demo mode, where we show the prompt
+// after any change in network properties?
+bool DataSaverSwitchDemoMode() {
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ chromeos::switches::kDisableDataSaverPrompt))
+ return false;
+
+ const std::string value =
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ chromeos::switches::kEnableDataSaverPrompt);
+ return value == chromeos::switches::kDataSaverPromptDemoMode;
+}
+
const chromeos::MobileConfig::Carrier* GetCarrier(
const NetworkState* cellular) {
const DeviceState* device = NetworkHandler::Get()->network_state_handler()->
@@ -123,13 +167,13 @@ const chromeos::MobileConfig::CarrierDeal* GetCarrierDeal(
void NotificationClicked(const std::string& service_path,
const std::string& info_url) {
- if (info_url.empty())
+ if (!info_url.empty()) {
+ chrome::ScopedTabbedBrowserDisplayer displayer(
+ ProfileManager::GetPrimaryUserProfile(), chrome::HOST_DESKTOP_TYPE_ASH);
+ chrome::ShowSingletonTab(displayer.browser(), GURL(info_url));
+ } else {
ui::NetworkConnect::Get()->ShowNetworkSettingsForPath(service_path);
-
- chrome::ScopedTabbedBrowserDisplayer displayer(
- ProfileManager::GetPrimaryUserProfile(),
- chrome::HOST_DESKTOP_TYPE_ASH);
- chrome::ShowSingletonTab(displayer.browser(), GURL(info_url));
+ }
}
} // namespace
@@ -138,7 +182,7 @@ void NotificationClicked(const std::string& service_path,
// DataPromoNotification
DataPromoNotification::DataPromoNotification()
- : check_for_promo_(true),
+ : notifications_shown_(false),
weak_ptr_factory_(this) {
NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE);
}
@@ -157,7 +201,8 @@ void DataPromoNotification::RegisterPrefs(PrefRegistrySimple* registry) {
void DataPromoNotification::NetworkPropertiesUpdated(
const NetworkState* network) {
- if (!network || network->type() != shill::kTypeCellular)
+ if (!network ||
+ (network->type() != shill::kTypeCellular && !DataSaverSwitchDemoMode()))
return;
ShowOptionalMobileDataPromoNotification();
}
@@ -169,20 +214,28 @@ void DataPromoNotification::DefaultNetworkChanged(const NetworkState* network) {
}
void DataPromoNotification::ShowOptionalMobileDataPromoNotification() {
- // Display a one-time notification for authenticated users on first use
- // of Mobile Data connection or if there is a carrier deal defined
- // show that even if user has already seen generic promo.
- if (!check_for_promo_ || !LoginState::Get()->IsUserAuthenticated())
+ // Do not show notifications to unauthenticated users, or when requesting a
+ // network connection, or if there's no default_network.
+ if (!LoginState::Get()->IsUserAuthenticated())
return;
const NetworkState* default_network =
NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
- if (!default_network || default_network->type() != shill::kTypeCellular)
+ if (!default_network)
return;
- // When requesting a network connection, do not show the notification.
if (NetworkHandler::Get()->network_connection_handler()->
HasPendingConnectRequest())
return;
+ if (!DataSaverSwitchDemoMode() &&
+ (notifications_shown_ || default_network->type() != shill::kTypeCellular))
+ return;
+
+ notifications_shown_ = true;
+ bool data_saver_prompt_shown = ShowDataSaverNotification();
+
+ // Display a one-time notification on first use of Mobile Data connection, or
+ // if there is a carrier deal defined show that even if user has already seen
+ // generic promo. Show deal regardless of |data_saver_prompt_shown|.
int carrier_deal_promo_pref = kNotificationCountPrefDefault;
const MobileConfig::CarrierDeal* deal = NULL;
const MobileConfig::Carrier* carrier = GetCarrier(default_network);
@@ -201,8 +254,7 @@ void DataPromoNotification::ShowOptionalMobileDataPromoNotification() {
info_url = deal->info_url();
if (info_url.empty() && carrier)
info_url = carrier->top_up_url();
- } else if (!ShouldShow3gPromoNotification()) {
- check_for_promo_ = false;
+ } else if (data_saver_prompt_shown || !ShouldShow3gPromoNotification()) {
return;
}
@@ -220,10 +272,51 @@ void DataPromoNotification::ShowOptionalMobileDataPromoNotification() {
ui::NetworkStateNotifier::kNotifierNetwork,
base::Bind(&NotificationClicked, default_network->path(), info_url)));
- check_for_promo_ = false;
SetShow3gPromoNotification(false);
if (carrier_deal_promo_pref != kNotificationCountPrefDefault)
SetCarrierDealPromoShown(carrier_deal_promo_pref + 1);
}
+bool DataPromoNotification::ShowDataSaverNotification() {
+ if (!DataSaverSwitchEnabled())
+ return false;
+
+ if (message_center::MessageCenter::Get()->FindVisibleNotificationById(
+ kDataSaverNotificationId)) // already showing.
+ return true;
+
+ int times_shown = GetDataSaverPromptsShown();
+ if (!DataSaverSwitchDemoMode() && times_shown >= kTimesToShowDataSaverPrompt)
+ return false;
+
+ if (extensions::ExtensionRegistry::Get(ProfileManager::GetActiveUserProfile())
+ ->GetExtensionById(extension_misc::kDataSaverExtensionId,
+ extensions::ExtensionRegistry::EVERYTHING)) {
+ // If extension is installed, disable future prompts.
+ SetDataSaverPromptsShown(kTimesToShowDataSaverPrompt);
+ return false;
+ }
+
+ base::string16 title = l10n_util::GetStringUTF16(IDS_3G_DATASAVER_TITLE);
+ base::string16 message = l10n_util::GetStringUTF16(IDS_3G_DATASAVER_MESSAGE);
+ const gfx::Image& icon =
+ ui::ResourceBundle::GetSharedInstance().GetImageNamed(
+ IDR_AURA_UBER_TRAY_NOTIFICATION_DATASAVER);
+
+ message_center::MessageCenter::Get()->AddNotification(
+ message_center::Notification::CreateSystemNotification(
+ kDataSaverNotificationId, title, message, icon,
+ ui::NetworkStateNotifier::kNotifierNetwork,
+ base::Bind(&NotificationClicked, "", kDataSaverExtensionUrl)));
+
+ if (DataSaverSwitchDemoMode()) {
+ SetDataSaverPromptsShown(0); // demo mode resets times shown counts.
+ SetShow3gPromoNotification(true);
+ } else {
+ SetDataSaverPromptsShown(times_shown + 1);
+ }
+
+ return true;
+}
+
} // namespace chromeos
« no previous file with comments | « chrome/browser/chromeos/status/data_promo_notification.h ('k') | chrome/common/extensions/extension_constants.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698