| 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 858953a3ee68d37ab85d500a642c726902eaa290..b0b3e5664329bff53aefe2c26e3c1550281b6bb5 100644
|
| --- a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
|
| +++ b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
|
| @@ -5,6 +5,7 @@
|
| #include "chrome/browser/chromeos/system/ash_system_tray_delegate.h"
|
|
|
| #include "ash/shell.h"
|
| +#include "ash/shell_window_ids.h"
|
| #include "ash/system/audio/audio_controller.h"
|
| #include "ash/system/brightness/brightness_controller.h"
|
| #include "ash/system/network/network_controller.h"
|
| @@ -14,13 +15,17 @@
|
| #include "ash/system/tray/system_tray_delegate.h"
|
| #include "ash/system/user/update_controller.h"
|
| #include "base/logging.h"
|
| +#include "base/utf_string_conversions.h"
|
| #include "chrome/browser/chromeos/audio/audio_handler.h"
|
| #include "chrome/browser/chromeos/cros/cros_library.h"
|
| #include "chrome/browser/chromeos/cros/network_library.h"
|
| #include "chrome/browser/chromeos/dbus/dbus_thread_manager.h"
|
| #include "chrome/browser/chromeos/dbus/power_manager_client.h"
|
| +#include "chrome/browser/chromeos/login/base_login_display_host.h"
|
| +#include "chrome/browser/chromeos/login/login_display_host.h"
|
| #include "chrome/browser/chromeos/login/user.h"
|
| #include "chrome/browser/chromeos/login/user_manager.h"
|
| +#include "chrome/browser/chromeos/status/network_menu.h"
|
| #include "chrome/browser/chromeos/status/network_menu_icon.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| #include "chrome/browser/profiles/profile_manager.h"
|
| @@ -31,15 +36,27 @@
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "content/public/browser/notification_observer.h"
|
| #include "content/public/browser/notification_service.h"
|
| +#include "grit/generated_resources.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
|
|
| namespace chromeos {
|
|
|
| namespace {
|
|
|
| +ash::NetworkIconInfo CreateNetworkIconInfo(const Network* network,
|
| + NetworkMenuIcon* network_icon) {
|
| + ash::NetworkIconInfo info;
|
| + info.name = UTF8ToUTF16(network->name());
|
| + info.image = network_icon->GetBitmap(network, NetworkMenuIcon::SIZE_SMALL);
|
| + info.unique_id = network->unique_id();
|
| + return info;
|
| +}
|
| +
|
| class SystemTrayDelegate : public ash::SystemTrayDelegate,
|
| public AudioHandler::VolumeObserver,
|
| public PowerManagerClient::Observer,
|
| public NetworkMenuIcon::Delegate,
|
| + public NetworkMenu::Delegate,
|
| public NetworkLibrary::NetworkManagerObserver,
|
| public NetworkLibrary::NetworkObserver,
|
| public NetworkLibrary::CellularDataPlanObserver,
|
| @@ -48,7 +65,10 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
|
| explicit SystemTrayDelegate(ash::SystemTray* tray)
|
| : tray_(tray),
|
| network_icon_(ALLOW_THIS_IN_INITIALIZER_LIST(
|
| - new NetworkMenuIcon(this, NetworkMenuIcon::MENU_MODE))) {
|
| + new NetworkMenuIcon(this, NetworkMenuIcon::MENU_MODE))),
|
| + network_icon_large_(ALLOW_THIS_IN_INITIALIZER_LIST(
|
| + new NetworkMenuIcon(this, NetworkMenuIcon::MENU_MODE))),
|
| + network_menu_(ALLOW_THIS_IN_INITIALIZER_LIST(new NetworkMenu(this))) {
|
| AudioHandler::GetInstance()->AddVolumeObserver(this);
|
| DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this);
|
| DBusThreadManager::Get()->GetPowerManagerClient()->RequestStatusUpdate(
|
| @@ -67,6 +87,8 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
|
| content::NotificationService::AllSources());
|
|
|
| InitializePrefChangeRegistrar();
|
| +
|
| + network_icon_large_->SetResourceSize(NetworkMenuIcon::SIZE_LARGE);
|
| }
|
|
|
| virtual ~SystemTrayDelegate() {
|
| @@ -116,15 +138,19 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
|
| }
|
|
|
| virtual void ShowSettings() OVERRIDE {
|
| - BrowserList::GetLastActive()->OpenOptionsDialog();
|
| + GetAppropriateBrowser()->OpenOptionsDialog();
|
| }
|
|
|
| virtual void ShowDateSettings() OVERRIDE {
|
| - BrowserList::GetLastActive()->OpenAdvancedOptionsDialog();
|
| + GetAppropriateBrowser()->OpenAdvancedOptionsDialog();
|
| + }
|
| +
|
| + virtual void ShowNetworkSettings() OVERRIDE {
|
| + GetAppropriateBrowser()->OpenInternetOptionsDialog();
|
| }
|
|
|
| virtual void ShowHelp() OVERRIDE {
|
| - BrowserList::GetLastActive()->ShowHelpTab();
|
| + GetAppropriateBrowser()->ShowHelpTab();
|
| }
|
|
|
| virtual bool IsAudioMuted() const OVERRIDE {
|
| @@ -156,13 +182,89 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
|
| NotifyScreenLockRequested();
|
| }
|
|
|
| - virtual ash::NetworkIconInfo GetMostRelevantNetworkIcon() OVERRIDE {
|
| + virtual ash::NetworkIconInfo GetMostRelevantNetworkIcon(bool large) OVERRIDE {
|
| ash::NetworkIconInfo info;
|
| - info.image = network_icon_->GetIconAndText(&info.description);
|
| + info.image = !large ? network_icon_->GetIconAndText(&info.description) :
|
| + network_icon_large_->GetIconAndText(&info.description);
|
| return info;
|
| }
|
|
|
| + virtual void GetAvailableNetworks(
|
| + std::vector<ash::NetworkIconInfo>* list) OVERRIDE {
|
| + NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary();
|
| +
|
| + // Ethernet.
|
| + if (crosnet->ethernet_available() && crosnet->ethernet_enabled()) {
|
| + const EthernetNetwork* ethernet_network = crosnet->ethernet_network();
|
| + if (ethernet_network) {
|
| + ash::NetworkIconInfo info;
|
| + info.image = network_icon_->GetBitmap(ethernet_network,
|
| + NetworkMenuIcon::SIZE_SMALL);
|
| + if (!ethernet_network->name().empty())
|
| + info.name = UTF8ToUTF16(ethernet_network->name());
|
| + else
|
| + info.name =
|
| + l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET);
|
| + info.unique_id = ethernet_network->unique_id();
|
| + list->push_back(info);
|
| + }
|
| + }
|
| +
|
| + // Wifi.
|
| + if (crosnet->wifi_available() && crosnet->wifi_enabled()) {
|
| + const WifiNetworkVector& wifi = crosnet->wifi_networks();
|
| + for (size_t i = 0; i < wifi.size(); ++i)
|
| + list->push_back(CreateNetworkIconInfo(wifi[i], network_icon_.get()));
|
| + }
|
| +
|
| + // Cellular.
|
| + if (crosnet->cellular_available() && crosnet->cellular_enabled()) {
|
| + // TODO(sad): There are different cases for cellular networks, e.g.
|
| + // de-activated networks, active networks that support data plan info,
|
| + // networks with top-up URLs etc. All of these need to be handled
|
| + // properly.
|
| + const CellularNetworkVector& cell = crosnet->cellular_networks();
|
| + for (size_t i = 0; i < cell.size(); ++i)
|
| + list->push_back(CreateNetworkIconInfo(cell[i], network_icon_.get()));
|
| + }
|
| +
|
| + // VPN (only if logged in).
|
| + if (GetUserLoginStatus() == ash::user::LOGGED_IN_NONE)
|
| + return;
|
| + if (crosnet->connected_network() || crosnet->virtual_network_connected()) {
|
| + const VirtualNetworkVector& vpns = crosnet->virtual_networks();
|
| + for (size_t i = 0; i < vpns.size(); ++i)
|
| + list->push_back(CreateNetworkIconInfo(vpns[i], network_icon_.get()));
|
| + }
|
| + }
|
| +
|
| + virtual void ConnectToNetwork(const std::string& network_id) OVERRIDE {
|
| + NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary();
|
| + Network* network = crosnet->FindNetworkByUniqueId(network_id);
|
| + if (network)
|
| + network_menu_->ConnectToNetwork(network);
|
| + }
|
| +
|
| + virtual void ToggleAirplaneMode() OVERRIDE {
|
| + NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary();
|
| + crosnet->EnableOfflineMode(!crosnet->offline_mode());
|
| + }
|
| +
|
| + virtual void ChangeProxySettings() OVERRIDE {
|
| + CHECK(GetUserLoginStatus() == ash::user::LOGGED_IN_NONE);
|
| + BaseLoginDisplayHost::default_host()->OpenProxySettings();
|
| + }
|
| +
|
| private:
|
| + // Returns the last active browser. If there is no such browser, creates a new
|
| + // browser window with an empty tab and returns it.
|
| + Browser* GetAppropriateBrowser() {
|
| + Browser* browser = BrowserList::GetLastActive();
|
| + if (!browser)
|
| + browser = Browser::NewEmptyWindow(ProfileManager::GetDefaultProfile());
|
| + return browser;
|
| + }
|
| +
|
| void InitializePrefChangeRegistrar() {
|
| Profile* profile = ProfileManager::GetDefaultProfile();
|
| pref_registrar_.reset(new PrefChangeRegistrar);
|
| @@ -230,11 +332,30 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
|
| // TODO(sad): Override more from PowerManagerClient::Observer here (e.g.
|
| // PowerButtonStateChanged etc.).
|
|
|
| - // Overridden from StatusMenuIcon::Delegate.
|
| + // Overridden from NetworkMenuIcon::Delegate.
|
| virtual void NetworkMenuIconChanged() OVERRIDE {
|
| NotifyRefreshNetwork();
|
| }
|
|
|
| + // Overridden from NetworkMenu::Delegate.
|
| + virtual views::MenuButton* GetMenuButton() OVERRIDE {
|
| + return NULL;
|
| + }
|
| +
|
| + virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE {
|
| + return ash::Shell::GetInstance()->GetContainer(
|
| + GetUserLoginStatus() == ash::user::LOGGED_IN_NONE ?
|
| + ash::internal::kShellWindowId_LockSystemModalContainer :
|
| + ash::internal::kShellWindowId_SystemModalContainer);
|
| + }
|
| +
|
| + virtual void OpenButtonOptions() OVERRIDE {
|
| + }
|
| +
|
| + virtual bool ShouldOpenButtonOptions() const OVERRIDE {
|
| + return false;
|
| + }
|
| +
|
| // Overridden from NetworkLibrary::NetworkManagerObserver.
|
| virtual void OnNetworkManagerChanged(NetworkLibrary* crosnet) OVERRIDE {
|
| RefreshNetworkObserver(crosnet);
|
| @@ -291,10 +412,13 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
|
|
|
| ash::SystemTray* tray_;
|
| scoped_ptr<NetworkMenuIcon> network_icon_;
|
| + scoped_ptr<NetworkMenuIcon> network_icon_large_;
|
| + scoped_ptr<NetworkMenu> network_menu_;
|
| content::NotificationRegistrar registrar_;
|
| scoped_ptr<PrefChangeRegistrar> pref_registrar_;
|
| std::string cellular_device_path_;
|
| std::string active_network_path_;
|
| + scoped_ptr<LoginHtmlDialog> proxy_settings_dialog_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(SystemTrayDelegate);
|
| };
|
|
|