Index: ash/system/chromeos/network/network_state_notifier.cc |
diff --git a/ash/system/chromeos/network/network_state_notifier.cc b/ash/system/chromeos/network/network_state_notifier.cc |
index ba3d137ec502142fabb438e9f1c1396f0c3a9ff6..022c7c69ea17e1bc0b8bbd16d5ab63ede640e4c3 100644 |
--- a/ash/system/chromeos/network/network_state_notifier.cc |
+++ b/ash/system/chromeos/network/network_state_notifier.cc |
@@ -4,9 +4,11 @@ |
#include "ash/system/chromeos/network/network_state_notifier.h" |
+#include "ash/ash_switches.h" |
#include "ash/shell.h" |
#include "ash/system/chromeos/network/network_observer.h" |
#include "ash/system/tray/system_tray_notifier.h" |
+#include "base/command_line.h" |
#include "base/string16.h" |
#include "base/utf_string_conversions.h" |
#include "chromeos/network/network_event_log.h" |
@@ -16,12 +18,25 @@ |
#include "third_party/cros_system_api/dbus/service_constants.h" |
#include "ui/base/l10n/l10n_util.h" |
+using chromeos::NetworkState; |
+using chromeos::NetworkStateHandler; |
+ |
namespace { |
+ |
const char kLogModule[] = "NetworkStateNotifier"; |
-ash::NetworkObserver::NetworkType GetAshNetworkType(const std::string& type) { |
- if (type == flimflam::kTypeCellular) |
- return ash::NetworkObserver::NETWORK_CELLULAR; |
+const int kMinTimeBetweenOutOfCreditsNotifySeconds = 10 * 60; |
+ |
+ash::NetworkObserver::NetworkType GetAshNetworkType( |
+ const NetworkState* network) { |
+ const std::string& type = network->type(); |
+ if (type == flimflam::kTypeCellular) { |
+ if (network->technology() == flimflam::kNetworkTechnologyLte || |
+ network->technology() == flimflam::kNetworkTechnologyLteAdvanced) |
+ return ash::NetworkObserver::NETWORK_CELLULAR_LTE; |
+ else |
+ return ash::NetworkObserver::NETWORK_CELLULAR; |
+ } |
if (type == flimflam::kTypeEthernet) |
return ash::NetworkObserver::NETWORK_ETHERNET; |
if (type == flimflam::kTypeWifi) |
@@ -87,17 +102,15 @@ string16 GetErrorString(const std::string& error) { |
} // namespace |
-using chromeos::NetworkState; |
-using chromeos::NetworkStateHandler; |
- |
namespace ash { |
namespace internal { |
-NetworkStateNotifier::NetworkStateNotifier() { |
- if (NetworkStateHandler::Get()) { |
- NetworkStateHandler::Get()->AddObserver(this); |
- InitializeNetworks(); |
- } |
+NetworkStateNotifier::NetworkStateNotifier() |
+ : cellular_out_of_credits_(false) { |
+ if (!NetworkStateHandler::Get()) |
+ return; |
+ NetworkStateHandler::Get()->AddObserver(this); |
+ InitializeNetworks(); |
} |
NetworkStateNotifier::~NetworkStateNotifier() { |
@@ -105,6 +118,11 @@ NetworkStateNotifier::~NetworkStateNotifier() { |
NetworkStateHandler::Get()->RemoveObserver(this); |
} |
+void NetworkStateNotifier::DefaultNetworkChanged(const NetworkState* network) { |
+ if (network) |
+ last_default_network_ = network->path(); |
+} |
+ |
void NetworkStateNotifier::NetworkConnectionStateChanged( |
const NetworkState* network) { |
NetworkStateHandler* handler = NetworkStateHandler::Get(); |
@@ -143,11 +161,10 @@ void NetworkStateNotifier::NetworkConnectionStateChanged( |
kLogModule, "ConnectionFailure", network->path()); |
std::vector<string16> no_links; |
- ash::NetworkObserver::NetworkType network_type = |
- GetAshNetworkType(network->type()); |
+ ash::NetworkObserver::NetworkType network_type = GetAshNetworkType(network); |
string16 error = GetErrorString(network->error()); |
ash::Shell::GetInstance()->system_tray_notifier()->NotifySetNetworkMessage( |
- NULL, ash::NetworkObserver::ERROR_CONNECT_FAILED, network_type, |
+ this, ash::NetworkObserver::ERROR_CONNECT_FAILED, network_type, |
l10n_util::GetStringUTF16(IDS_NETWORK_CONNECTION_ERROR_TITLE), |
l10n_util::GetStringFUTF16( |
IDS_NETWORK_CONNECTION_ERROR_MESSAGE_WITH_DETAILS, |
@@ -155,6 +172,58 @@ void NetworkStateNotifier::NetworkConnectionStateChanged( |
no_links); |
} |
+void NetworkStateNotifier::NetworkPropertiesUpdated( |
+ const NetworkState* network) { |
+ DCHECK(network); |
+ if (CommandLine::ForCurrentProcess()->HasSwitch( |
+ ash::switches::kAshDisableNewNetworkStatusArea)) { |
+ return; |
+ } |
+ // Trigger "Out of credits" notification if the cellular network is the most |
+ // recent default network (i.e. we have not switched to another network). |
+ if (network->type() == flimflam::kTypeCellular && |
+ network->path() == last_default_network_) { |
+ cellular_network_ = network->path(); |
+ if (network->cellular_out_of_credits() && |
+ !cellular_out_of_credits_) { |
+ cellular_out_of_credits_ = true; |
+ base::TimeDelta dtime = base::Time::Now() - out_of_credits_notify_time_; |
+ if (dtime.InSeconds() > kMinTimeBetweenOutOfCreditsNotifySeconds) { |
+ out_of_credits_notify_time_ = base::Time::Now(); |
+ ash::NetworkObserver::NetworkType network_type = |
+ GetAshNetworkType(network); |
+ std::vector<string16> links; |
+ links.push_back( |
+ l10n_util::GetStringFUTF16(IDS_NETWORK_OUT_OF_CREDITS_LINK, |
+ UTF8ToUTF16(network->name()))); |
+ ash::Shell::GetInstance()->system_tray_notifier()-> |
+ NotifySetNetworkMessage( |
+ this, ash::NetworkObserver::ERROR_OUT_OF_CREDITS, network_type, |
+ l10n_util::GetStringUTF16(IDS_NETWORK_OUT_OF_CREDITS_TITLE), |
+ l10n_util::GetStringUTF16(IDS_NETWORK_OUT_OF_CREDITS_BODY), |
+ links); |
+ } |
+ } else if (!network->cellular_out_of_credits() && |
+ cellular_out_of_credits_) { |
+ cellular_out_of_credits_ = false; |
+ } |
+ } |
+} |
+ |
+void NetworkStateNotifier::NotificationLinkClicked( |
+ NetworkObserver::MessageType message_type, |
+ size_t link_index) { |
+ if (message_type == ash::NetworkObserver::ERROR_OUT_OF_CREDITS) { |
+ if (!cellular_network_.empty()) { |
+ // This will trigger the activation / portal code. |
+ Shell::GetInstance()->system_tray_delegate()->ConnectToNetwork( |
+ cellular_network_); |
+ } |
+ ash::Shell::GetInstance()->system_tray_notifier()-> |
+ NotifyClearNetworkMessage(message_type); |
+ } |
+} |
+ |
void NetworkStateNotifier::InitializeNetworks() { |
NetworkStateList network_list; |
NetworkStateHandler::Get()->GetNetworkList(&network_list); |
@@ -166,6 +235,10 @@ void NetworkStateNotifier::InitializeNetworks() { |
VLOG(2) << " Network: " << network->path(); |
cached_state_[network->path()] = network->connection_state(); |
} |
+ const NetworkState* default_network = |
+ NetworkStateHandler::Get()->DefaultNetwork(); |
+ if (default_network) |
+ last_default_network_ = default_network->path(); |
} |
} // namespace internal |