summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authorygorshenin@google.com <ygorshenin@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-28 10:23:12 +0000
committerygorshenin@google.com <ygorshenin@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-28 10:23:12 +0000
commit2bb1e26bcdb71d6e451ad9ea7da2826cdb77f8ef (patch)
tree486c89f3abf873739bee17c80cbea0ae5d65babd /ash
parent1363f8e4d35fd80f494a8ca4aa8cb44bd382014a (diff)
downloadchromium_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')
-rw-r--r--ash/ash.gyp1
-rw-r--r--ash/resources/ash_resources.grd2
-rw-r--r--ash/resources/default_100_percent/cros/network/statusbar_network_active_portal_dark.pngbin0 -> 213 bytes
-rw-r--r--ash/resources/default_100_percent/cros/network/statusbar_network_active_portal_light.pngbin0 -> 224 bytes
-rw-r--r--ash/resources/default_200_percent/cros/network/statusbar_network_active_portal_dark.pngbin0 -> 306 bytes
-rw-r--r--ash/resources/default_200_percent/cros/network/statusbar_network_active_portal_light.pngbin0 -> 306 bytes
-rw-r--r--ash/system/chromeos/network/network_icon.cc37
-rw-r--r--ash/system/chromeos/network/network_portal_detector_observer.h22
-rw-r--r--ash/system/chromeos/network/tray_network.cc13
-rw-r--r--ash/system/chromeos/network/tray_network.h6
-rw-r--r--ash/system/tray/default_system_tray_delegate.cc5
-rw-r--r--ash/system/tray/default_system_tray_delegate.h2
-rw-r--r--ash/system/tray/system_tray_delegate.h5
-rw-r--r--ash/system/tray/system_tray_notifier.cc17
-rw-r--r--ash/system/tray/system_tray_notifier.h9
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
new file mode 100644
index 0000000..58c678f
--- /dev/null
+++ b/ash/resources/default_100_percent/cros/network/statusbar_network_active_portal_dark.png
Binary files differ
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
new file mode 100644
index 0000000..231a010
--- /dev/null
+++ b/ash/resources/default_100_percent/cros/network/statusbar_network_active_portal_light.png
Binary files differ
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
new file mode 100644
index 0000000..2fed1dc
--- /dev/null
+++ b/ash/resources/default_200_percent/cros/network/statusbar_network_active_portal_dark.png
Binary files differ
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
new file mode 100644
index 0000000..c7c4c5a
--- /dev/null
+++ b/ash/resources/default_200_percent/cros/network/statusbar_network_active_portal_light.png
Binary files differ
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_;