diff options
author | ygorshenin@google.com <ygorshenin@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-28 10:23:12 +0000 |
---|---|---|
committer | ygorshenin@google.com <ygorshenin@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-28 10:23:12 +0000 |
commit | 2bb1e26bcdb71d6e451ad9ea7da2826cdb77f8ef (patch) | |
tree | 486c89f3abf873739bee17c80cbea0ae5d65babd /ash | |
parent | 1363f8e4d35fd80f494a8ca4aa8cb44bd382014a (diff) | |
download | chromium_src-2bb1e26bcdb71d6e451ad9ea7da2826cdb77f8ef.zip chromium_src-2bb1e26bcdb71d6e451ad9ea7da2826cdb77f8ef.tar.gz chromium_src-2bb1e26bcdb71d6e451ad9ea7da2826cdb77f8ef.tar.bz2 |
Added a special badge to wifi-networks behind a captive portal.
BUG=240237
TEST=manual tests on Lumpy
R=oshima@chromium.org, stevenjb@chromium.org
Review URL: https://codereview.chromium.org/175053003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@254079 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
15 files changed, 114 insertions, 5 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp index fe1b0e0..f1024b1 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp @@ -309,6 +309,7 @@ 'system/chromeos/network/network_icon_animation.h', 'system/chromeos/network/network_icon_animation_observer.h', 'system/chromeos/network/network_observer.h', + 'system/chromeos/network/network_portal_detector_observer.h', 'system/chromeos/network/network_state_list_detailed_view.cc', 'system/chromeos/network/network_state_list_detailed_view.h', 'system/chromeos/network/network_state_notifier.cc', diff --git a/ash/resources/ash_resources.grd b/ash/resources/ash_resources.grd index 3d4b39c..6fd4254 100644 --- a/ash/resources/ash_resources.grd +++ b/ash/resources/ash_resources.grd @@ -209,6 +209,8 @@ <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_NETWORK_LTE_LIGHT" file="cros/network/statusbar_network_lte_light.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_NETWORK_LTE_ADVANCED_DARK" file="cros/network/statusbar_network_lte_advanced_dark.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_NETWORK_LTE_ADVANCED_LIGHT" file="cros/network/statusbar_network_lte_advanced_light.png" /> + <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_NETWORK_PORTAL_DARK" file="cros/network/statusbar_network_active_portal_dark.png" /> + <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_NETWORK_PORTAL_LIGHT" file="cros/network/statusbar_network_active_portal_light.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_NETWORK_ROAMING_DARK" file="cros/network/statusbar_network_roaming_dark.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_NETWORK_ROAMING_LIGHT" file="cros/network/statusbar_network_roaming_light.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_NETWORK_SECURE_DARK" file="cros/network/statusbar_network_secure_dark.png" /> diff --git a/ash/resources/default_100_percent/cros/network/statusbar_network_active_portal_dark.png b/ash/resources/default_100_percent/cros/network/statusbar_network_active_portal_dark.png Binary files differnew file mode 100644 index 0000000..58c678f --- /dev/null +++ b/ash/resources/default_100_percent/cros/network/statusbar_network_active_portal_dark.png diff --git a/ash/resources/default_100_percent/cros/network/statusbar_network_active_portal_light.png b/ash/resources/default_100_percent/cros/network/statusbar_network_active_portal_light.png Binary files differnew file mode 100644 index 0000000..231a010 --- /dev/null +++ b/ash/resources/default_100_percent/cros/network/statusbar_network_active_portal_light.png diff --git a/ash/resources/default_200_percent/cros/network/statusbar_network_active_portal_dark.png b/ash/resources/default_200_percent/cros/network/statusbar_network_active_portal_dark.png Binary files differnew file mode 100644 index 0000000..2fed1dc --- /dev/null +++ b/ash/resources/default_200_percent/cros/network/statusbar_network_active_portal_dark.png diff --git a/ash/resources/default_200_percent/cros/network/statusbar_network_active_portal_light.png b/ash/resources/default_200_percent/cros/network/statusbar_network_active_portal_light.png Binary files differnew file mode 100644 index 0000000..c7c4c5a --- /dev/null +++ b/ash/resources/default_200_percent/cros/network/statusbar_network_active_portal_light.png diff --git a/ash/system/chromeos/network/network_icon.cc b/ash/system/chromeos/network/network_icon.cc index 995d8e5..d2580ef 100644 --- a/ash/system/chromeos/network/network_icon.cc +++ b/ash/system/chromeos/network/network_icon.cc @@ -7,6 +7,7 @@ #include "ash/shell.h" #include "ash/system/chromeos/network/network_icon_animation.h" #include "ash/system/chromeos/network/network_icon_animation_observer.h" +#include "ash/system/tray/system_tray_delegate.h" #include "base/strings/utf_string_conversions.h" #include "chromeos/network/device_state.h" #include "chromeos/network/network_connection_handler.h" @@ -70,6 +71,9 @@ class NetworkIconImpl { // Updates the local state for cellular networks. Returns true if changed. bool UpdateCellularState(const chromeos::NetworkState* network); + // Updates the portal state for wireless networks. Returns true if changed. + bool UpdatePortalState(const chromeos::NetworkState* network); + // Updates the VPN badge. Returns true if changed. bool UpdateVPNBadge(); @@ -97,6 +101,9 @@ class NetworkIconImpl { // Cached roaming state of the network when the icon was last generated. std::string roaming_state_; + // Cached portal state of the network when the icon was last generated. + bool behind_captive_portal_; + // Generated icon image. gfx::ImageSkia image_; @@ -526,7 +533,8 @@ NetworkIconImpl::NetworkIconImpl(IconType icon_type) : icon_type_(icon_type), strength_index_(-1), technology_badge_(NULL), - vpn_badge_(NULL) { + vpn_badge_(NULL), + behind_captive_portal_(false) { // Default image image_ = GetDisconnectedImage(shill::kTypeWifi, icon_type); } @@ -542,8 +550,11 @@ void NetworkIconImpl::Update(const NetworkState* network) { dirty = true; } - if (network->Matches(NetworkTypePattern::Wireless())) + dirty |= UpdatePortalState(network); + + if (network->Matches(NetworkTypePattern::Wireless())) { dirty |= UpdateWirelessStrengthIndex(network); + } if (network->Matches(NetworkTypePattern::Cellular())) dirty |= UpdateCellularState(network); @@ -584,6 +595,20 @@ bool NetworkIconImpl::UpdateCellularState(const NetworkState* network) { return dirty; } +bool NetworkIconImpl::UpdatePortalState(const NetworkState* network) { + bool behind_captive_portal = false; + if (network) { + SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate(); + behind_captive_portal = + delegate->IsNetworkBehindCaptivePortal(network->path()); + } + + if (behind_captive_portal == behind_captive_portal_) + return false; + behind_captive_portal_ = behind_captive_portal; + return true; +} + bool NetworkIconImpl::UpdateVPNBadge() { const NetworkState* vpn = NetworkHandler::Get()->network_state_handler()-> ConnectedNetworkByType(NetworkTypePattern::VPN()); @@ -633,6 +658,14 @@ void NetworkIconImpl::GetBadges(const NetworkState* network, Badges* badges) { badges->top_left = technology_badge_; badges->bottom_left = vpn_badge_; } + + if (behind_captive_portal_) { + gfx::ImageSkia* badge = rb.GetImageSkiaNamed( + IconTypeIsDark(icon_type_) ? + IDR_AURA_UBER_TRAY_NETWORK_PORTAL_DARK : + IDR_AURA_UBER_TRAY_NETWORK_PORTAL_LIGHT); + badges->bottom_right = badge; + } } void NetworkIconImpl::GenerateImage(const NetworkState* network) { diff --git a/ash/system/chromeos/network/network_portal_detector_observer.h b/ash/system/chromeos/network/network_portal_detector_observer.h new file mode 100644 index 0000000..e80a53c --- /dev/null +++ b/ash/system/chromeos/network/network_portal_detector_observer.h @@ -0,0 +1,22 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_CHROMEOS_NETWORK_NETWORK_PORTAL_DETECTOR_OBSERVER_H +#define ASH_SYSTEM_CHROMEOS_NETWORK_NETWORK_PORTAL_DETECTOR_OBSERVER_H + +#include <string> + +namespace ash { + +class NetworkPortalDetectorObserver { + public: + virtual ~NetworkPortalDetectorObserver() {} + + // Called when captive portal is detected for a |network|. + virtual void OnCaptivePortalDetected(const std::string& service_path) = 0; +}; + +} // namespace ash + +#endif // ASH_SYSTEM_CHROMEOS_NETWORK_NETWORK_PORTAL_DETECTOR_OBSERVER_H diff --git a/ash/system/chromeos/network/tray_network.cc b/ash/system/chromeos/network/tray_network.cc index 6ce3f2a..d8e745b 100644 --- a/ash/system/chromeos/network/tray_network.cc +++ b/ash/system/chromeos/network/tray_network.cc @@ -265,11 +265,15 @@ TrayNetwork::TrayNetwork(SystemTray* system_tray) detailed_(NULL), request_wifi_view_(false) { network_state_observer_.reset(new TrayNetworkStateObserver(this)); - Shell::GetInstance()->system_tray_notifier()->AddNetworkObserver(this); + SystemTrayNotifier* notifier = Shell::GetInstance()->system_tray_notifier(); + notifier->AddNetworkObserver(this); + notifier->AddNetworkPortalDetectorObserver(this); } TrayNetwork::~TrayNetwork() { - Shell::GetInstance()->system_tray_notifier()->RemoveNetworkObserver(this); + SystemTrayNotifier* notifier = Shell::GetInstance()->system_tray_notifier(); + notifier->RemoveNetworkObserver(this); + notifier->RemoveNetworkPortalDetectorObserver(this); } views::View* TrayNetwork::CreateTrayView(user::LoginStatus status) { @@ -347,6 +351,11 @@ void TrayNetwork::RequestToggleWifi() { chromeos::network_handler::ErrorCallback()); } +void TrayNetwork::OnCaptivePortalDetected( + const std::string& /* service_path */) { + NetworkStateChanged(false); +} + void TrayNetwork::NetworkStateChanged(bool list_changed) { if (tray_) tray_->UpdateNetworkStateHandlerIcon(); diff --git a/ash/system/chromeos/network/tray_network.h b/ash/system/chromeos/network/tray_network.h index 240c5c1..1b0b7e6 100644 --- a/ash/system/chromeos/network/tray_network.h +++ b/ash/system/chromeos/network/tray_network.h @@ -9,6 +9,7 @@ #include "ash/system/chromeos/network/network_icon.h" #include "ash/system/chromeos/network/network_observer.h" +#include "ash/system/chromeos/network/network_portal_detector_observer.h" #include "ash/system/chromeos/network/tray_network_state_observer.h" #include "ash/system/tray/system_tray_item.h" #include "base/memory/scoped_ptr.h" @@ -29,6 +30,7 @@ class NetworkTrayView; class TrayNetwork : public SystemTrayItem, public NetworkObserver, + public NetworkPortalDetectorObserver, public TrayNetworkStateObserver::Delegate { public: explicit TrayNetwork(SystemTray* system_tray); @@ -50,6 +52,10 @@ class TrayNetwork : public SystemTrayItem, // NetworkObserver virtual void RequestToggleWifi() OVERRIDE; + // NetworkPortalDetectorObserver + virtual void OnCaptivePortalDetected( + const std::string& service_path) OVERRIDE; + // TrayNetworkStateObserver::Delegate virtual void NetworkStateChanged(bool list_changed) OVERRIDE; virtual void NetworkServiceChanged( diff --git a/ash/system/tray/default_system_tray_delegate.cc b/ash/system/tray/default_system_tray_delegate.cc index 5fd910d..1eaf39e 100644 --- a/ash/system/tray/default_system_tray_delegate.cc +++ b/ash/system/tray/default_system_tray_delegate.cc @@ -284,4 +284,9 @@ int DefaultSystemTrayDelegate::GetSystemTrayMenuWidth() { void DefaultSystemTrayDelegate::ActiveUserWasChanged() { } +bool DefaultSystemTrayDelegate::IsNetworkBehindCaptivePortal( + const std::string& /* service_path */) const { + return false; +} + } // namespace ash diff --git a/ash/system/tray/default_system_tray_delegate.h b/ash/system/tray/default_system_tray_delegate.h index 5d711a7..fd34130 100644 --- a/ash/system/tray/default_system_tray_delegate.h +++ b/ash/system/tray/default_system_tray_delegate.h @@ -90,6 +90,8 @@ class ASH_EXPORT DefaultSystemTrayDelegate : public SystemTrayDelegate { base::TimeDelta* session_length_limit) OVERRIDE; virtual int GetSystemTrayMenuWidth() OVERRIDE; virtual void ActiveUserWasChanged() OVERRIDE; + virtual bool IsNetworkBehindCaptivePortal( + const std::string& service_path) const OVERRIDE; private: bool bluetooth_enabled_; diff --git a/ash/system/tray/system_tray_delegate.h b/ash/system/tray/system_tray_delegate.h index 07b1e34..e6c8fc1 100644 --- a/ash/system/tray/system_tray_delegate.h +++ b/ash/system/tray/system_tray_delegate.h @@ -323,8 +323,11 @@ class ASH_EXPORT SystemTrayDelegate { // to be switched to the new user. // Note: This will happen after SessionStateObserver::ActiveUserChanged fires. virtual void ActiveUserWasChanged() = 0; -}; + // Returns true when |network| is behind captive portal. + virtual bool IsNetworkBehindCaptivePortal( + const std::string& service_path) const = 0; +}; } // namespace ash #endif // ASH_SYSTEM_TRAY_SYSTEM_TRAY_DELEGATE_H_ diff --git a/ash/system/tray/system_tray_notifier.cc b/ash/system/tray/system_tray_notifier.cc index 2691c3b..9dd4269 100644 --- a/ash/system/tray/system_tray_notifier.cc +++ b/ash/system/tray/system_tray_notifier.cc @@ -139,6 +139,16 @@ void SystemTrayNotifier::RemoveNetworkObserver(NetworkObserver* observer) { network_observers_.RemoveObserver(observer); } +void SystemTrayNotifier::AddNetworkPortalDetectorObserver( + NetworkPortalDetectorObserver* observer) { + network_portal_detector_observers_.AddObserver(observer); +} + +void SystemTrayNotifier::RemoveNetworkPortalDetectorObserver( + NetworkPortalDetectorObserver* observer) { + network_portal_detector_observers_.RemoveObserver(observer); +} + void SystemTrayNotifier::AddEnterpriseDomainObserver( EnterpriseDomainObserver* observer) { enterprise_domain_observers_.AddObserver(observer); @@ -332,6 +342,13 @@ void SystemTrayNotifier::NotifyRequestToggleWifi() { RequestToggleWifi()); } +void SystemTrayNotifier::NotifyOnCaptivePortalDetected( + const std::string& service_path) { + FOR_EACH_OBSERVER(NetworkPortalDetectorObserver, + network_portal_detector_observers_, + OnCaptivePortalDetected(service_path)); +} + void SystemTrayNotifier::NotifyEnterpriseDomainChanged() { FOR_EACH_OBSERVER(EnterpriseDomainObserver, enterprise_domain_observers_, OnEnterpriseDomainChanged()); diff --git a/ash/system/tray/system_tray_notifier.h b/ash/system/tray/system_tray_notifier.h index 5c63163..67ed640 100644 --- a/ash/system/tray/system_tray_notifier.h +++ b/ash/system/tray/system_tray_notifier.h @@ -28,6 +28,7 @@ #if defined(OS_CHROMEOS) #include "ash/system/chromeos/enterprise/enterprise_domain_observer.h" #include "ash/system/chromeos/network/network_observer.h" +#include "ash/system/chromeos/network/network_portal_detector_observer.h" #include "ash/system/chromeos/screen_security/screen_capture_observer.h" #include "ash/system/chromeos/screen_security/screen_share_observer.h" #endif @@ -86,6 +87,11 @@ class ASH_EXPORT SystemTrayNotifier { void AddNetworkObserver(NetworkObserver* observer); void RemoveNetworkObserver(NetworkObserver* observer); + void AddNetworkPortalDetectorObserver( + NetworkPortalDetectorObserver* observer); + void RemoveNetworkPortalDetectorObserver( + NetworkPortalDetectorObserver* observer); + void AddEnterpriseDomainObserver(EnterpriseDomainObserver* observer); void RemoveEnterpriseDomainObserver(EnterpriseDomainObserver* observer); @@ -125,6 +131,7 @@ class ASH_EXPORT SystemTrayNotifier { void NotifyUserAddedToSession(); #if defined(OS_CHROMEOS) void NotifyRequestToggleWifi(); + void NotifyOnCaptivePortalDetected(const std::string& service_path); void NotifyEnterpriseDomainChanged(); void NotifyScreenCaptureStart(const base::Closure& stop_callback, const base::string16& sharing_app_name); @@ -154,6 +161,8 @@ class ASH_EXPORT SystemTrayNotifier { ObserverList<UserObserver> user_observers_; #if defined(OS_CHROMEOS) ObserverList<NetworkObserver> network_observers_; + ObserverList<NetworkPortalDetectorObserver> + network_portal_detector_observers_; ObserverList<EnterpriseDomainObserver> enterprise_domain_observers_; ObserverList<ScreenCaptureObserver> screen_capture_observers_; ObserverList<ScreenShareObserver> screen_share_observers_; |