Index: chrome/browser/chromeos/system/ash_system_tray_delegate.cc |
diff --git a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc |
index 1ed1c08a2ab9bf934e6c0d3cfde8c8a7cc8a6913..66c5f38f3dad9a5cf69b12e613b591bc3d53e60c 100644 |
--- a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc |
+++ b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc |
@@ -14,6 +14,7 @@ |
#include "ash/system/bluetooth/bluetooth_observer.h" |
#include "ash/system/brightness/brightness_observer.h" |
#include "ash/system/chromeos/network/network_observer.h" |
+#include "ash/system/chromeos/network/network_tray_delegate.h" |
#include "ash/system/date/clock_observer.h" |
#include "ash/system/drive/drive_observer.h" |
#include "ash/system/ime/ime_observer.h" |
@@ -186,6 +187,14 @@ void BluetoothDeviceConnectError( |
// TODO(sad): Do something? |
} |
+ash::NetworkObserver::NetworkType NetworkTypeForCellular( |
+ const CellularNetwork* cellular) { |
+ if (cellular->network_technology() == NETWORK_TECHNOLOGY_LTE || |
+ cellular->network_technology() == NETWORK_TECHNOLOGY_LTE_ADVANCED) |
+ return ash::NetworkObserver::NETWORK_CELLULAR_LTE; |
+ return ash::NetworkObserver::NETWORK_CELLULAR; |
+} |
+ |
class SystemTrayDelegate : public ash::SystemTrayDelegate, |
public AudioHandler::VolumeObserver, |
public PowerManagerClient::Observer, |
@@ -219,6 +228,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
screen_locked_(false), |
data_promo_notification_(new DataPromoNotification()), |
cellular_activating_(false), |
+ cellular_out_of_credits_(false), |
volume_control_delegate_(new VolumeController()) { |
// Register notifications on construction so that events such as |
// PROFILE_CREATED do not get missed if they happen before Initialize(). |
@@ -747,18 +757,10 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
virtual void ConnectToNetwork(const std::string& network_id) OVERRIDE { |
NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); |
Network* network = crosnet->FindNetworkByPath(network_id); |
- if (!CommandLine::ForCurrentProcess()->HasSwitch( |
- ash::switches::kAshDisableNewNetworkStatusArea)) { |
- // If the new network handlers are enabled, this should always trigger |
- // displaying the network settings UI. |
- if (network) |
- network_menu_->ShowTabbedNetworkSettings(network); |
- else |
- ShowNetworkSettings(); |
- } else { |
- if (network) |
- network_menu_->ConnectToNetwork(network); |
- } |
+ if (network) |
+ network_menu_->ConnectToNetwork(network); // Shows settings if connected |
+ else |
+ ShowNetworkSettings(); |
} |
virtual void RequestNetworkScan() OVERRIDE { |
@@ -1020,14 +1022,6 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
} |
} |
- void RefreshNetworkDeviceObserver(NetworkLibrary* crosnet) { |
- const NetworkDevice* cellular = crosnet->FindCellularDevice(); |
- std::string new_cellular_device_path = cellular ? |
- cellular->device_path() : std::string(); |
- if (cellular_device_path_ != new_cellular_device_path) |
- cellular_device_path_ = new_cellular_device_path; |
- } |
- |
void AddNetworkToList(std::vector<ash::NetworkIconInfo>* list, |
std::set<const Network*>* added, |
const Network* network) { |
@@ -1147,10 +1141,9 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
// Overridden from NetworkLibrary::NetworkManagerObserver. |
virtual void OnNetworkManagerChanged(NetworkLibrary* crosnet) OVERRIDE { |
RefreshNetworkObserver(crosnet); |
- RefreshNetworkDeviceObserver(crosnet); |
data_promo_notification_->ShowOptionalMobileDataPromoNotification( |
crosnet, GetPrimarySystemTray(), this); |
- UpdateCellularActivation(); |
+ UpdateCellular(); |
NotifyRefreshNetwork(); |
} |
@@ -1356,7 +1349,19 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
} |
// Overridden from ash::NetworkTrayDelegate |
- virtual void NotificationLinkClicked(size_t index) OVERRIDE { |
+ virtual void NotificationLinkClicked( |
+ ash::NetworkObserver::MessageType message_type, |
+ size_t link_index) OVERRIDE { |
+ if (message_type == ash::NetworkObserver::ERROR_OUT_OF_CREDITS) { |
+ const CellularNetwork* cellular = |
+ CrosLibrary::Get()->GetNetworkLibrary()->cellular_network(); |
+ if (cellular) |
+ ConnectToNetwork(cellular->service_path()); |
+ ash::Shell::GetInstance()->system_tray_notifier()-> |
+ NotifyClearNetworkMessage(message_type); |
+ } |
+ if (message_type != ash::NetworkObserver::MESSAGE_DATA_PROMO) |
+ return; |
// If we have deal info URL defined that means that there're |
// 2 links in bubble. Let the user close it manually then thus giving |
// ability to navigate to second link. |
@@ -1367,7 +1372,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
data_promo_notification_->CloseNotification(); |
std::string deal_url_to_open; |
- if (index == 0) { |
+ if (link_index == 0) { |
if (!deal_topup_url.empty()) { |
deal_url_to_open = deal_topup_url; |
} else { |
@@ -1378,7 +1383,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
network_menu_->ShowTabbedNetworkSettings(cellular); |
return; |
} |
- } else if (index == 1) { |
+ } else if (link_index == 1) { |
deal_url_to_open = deal_info_url; |
} |
@@ -1408,7 +1413,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
UpdateEnterpriseDomain(); |
} |
- void UpdateCellularActivation() { |
+ void UpdateCellular() { |
const CellularNetworkVector& cellular_networks = |
CrosLibrary::Get()->GetNetworkLibrary()->cellular_networks(); |
if (cellular_networks.empty()) |
@@ -1420,15 +1425,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
cellular_activating_ = true; |
} else if (cellular->activated() && cellular_activating_) { |
cellular_activating_ = false; |
- |
- // Detect which icon to show, 3G or LTE. |
- ash::NetworkObserver::NetworkType type = |
- (cellular->network_technology() == NETWORK_TECHNOLOGY_LTE || |
- cellular->network_technology() == NETWORK_TECHNOLOGY_LTE_ADVANCED) |
- ? ash::NetworkObserver::NETWORK_CELLULAR_LTE |
- : ash::NetworkObserver::NETWORK_CELLULAR; |
- |
- // Show the notification. |
+ ash::NetworkObserver::NetworkType type = NetworkTypeForCellular(cellular); |
ash::Shell::GetInstance()->system_tray_notifier()-> |
NotifySetNetworkMessage( |
NULL, |
@@ -1441,6 +1438,27 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
UTF8ToUTF16((cellular->name()))), |
std::vector<string16>()); |
} |
+ if (!CommandLine::ForCurrentProcess()->HasSwitch( |
+ ash::switches::kAshDisableNewNetworkStatusArea)) { |
+ return; |
+ } |
+ // Trigger "Out of credits" notification (for NetworkLibrary impl) |
+ if (cellular->out_of_credits() && !cellular_out_of_credits_) { |
+ cellular_out_of_credits_ = true; |
+ ash::NetworkObserver::NetworkType type = NetworkTypeForCellular(cellular); |
+ std::vector<string16> links; |
+ links.push_back( |
+ l10n_util::GetStringFUTF16(IDS_NETWORK_OUT_OF_CREDITS_LINK, |
+ UTF8ToUTF16(cellular->name()))); |
+ ash::Shell::GetInstance()->system_tray_notifier()-> |
+ NotifySetNetworkMessage( |
+ this, ash::NetworkObserver::ERROR_OUT_OF_CREDITS, type, |
+ l10n_util::GetStringUTF16(IDS_NETWORK_OUT_OF_CREDITS_TITLE), |
+ l10n_util::GetStringUTF16(IDS_NETWORK_OUT_OF_CREDITS_BODY), |
+ links); |
+ } else if (!cellular->out_of_credits() && cellular_out_of_credits_) { |
+ cellular_out_of_credits_ = false; |
+ } |
} |
scoped_ptr<base::WeakPtrFactory<SystemTrayDelegate> > ui_weak_ptr_factory_; |
@@ -1451,7 +1469,6 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
content::NotificationRegistrar registrar_; |
PrefChangeRegistrar local_state_registrar_; |
scoped_ptr<PrefChangeRegistrar> user_pref_registrar_; |
- std::string cellular_device_path_; |
std::string active_network_path_; |
PowerSupplyStatus power_supply_status_; |
base::HourClockType clock_type_; |
@@ -1465,6 +1482,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, |
scoped_ptr<DataPromoNotification> data_promo_notification_; |
bool cellular_activating_; |
+ bool cellular_out_of_credits_; |
scoped_ptr<ash::VolumeControlDelegate> volume_control_delegate_; |