| 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
|
|
|