OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/status/network_menu_button.h" | 5 #include "chrome/browser/chromeos/status/network_menu_button.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 // static | 28 // static |
29 const int NetworkMenuButton::kThrobDuration = 1000; | 29 const int NetworkMenuButton::kThrobDuration = 1000; |
30 | 30 |
31 NetworkMenuButton::NetworkMenuButton(StatusAreaHost* host) | 31 NetworkMenuButton::NetworkMenuButton(StatusAreaHost* host) |
32 : StatusAreaButton(this), | 32 : StatusAreaButton(this), |
33 NetworkMenu(), | 33 NetworkMenu(), |
34 host_(host), | 34 host_(host), |
35 ALLOW_THIS_IN_INITIALIZER_LIST(animation_connecting_(this)) { | 35 ALLOW_THIS_IN_INITIALIZER_LIST(animation_connecting_(this)) { |
36 animation_connecting_.SetThrobDuration(kThrobDuration); | 36 animation_connecting_.SetThrobDuration(kThrobDuration); |
37 animation_connecting_.SetTweenType(Tween::EASE_IN_OUT); | 37 animation_connecting_.SetTweenType(Tween::EASE_IN_OUT); |
38 OnNetworkManagerChanged(CrosLibrary::Get()->GetNetworkLibrary()); | 38 NetworkChanged(CrosLibrary::Get()->GetNetworkLibrary()); |
39 CrosLibrary::Get()->GetNetworkLibrary()->AddNetworkManagerObserver(this); | 39 CrosLibrary::Get()->GetNetworkLibrary()->AddObserver(this); |
40 CrosLibrary::Get()->GetNetworkLibrary()->AddCellularDataPlanObserver(this); | |
41 } | 40 } |
42 | 41 |
43 NetworkMenuButton::~NetworkMenuButton() { | 42 NetworkMenuButton::~NetworkMenuButton() { |
44 NetworkLibrary* netlib = CrosLibrary::Get()->GetNetworkLibrary(); | 43 CrosLibrary::Get()->GetNetworkLibrary()->RemoveObserver(this); |
45 netlib->RemoveNetworkManagerObserver(this); | |
46 netlib->RemoveObserverForAllNetworks(this); | |
47 netlib->RemoveCellularDataPlanObserver(this); | |
48 } | 44 } |
49 | 45 |
50 //////////////////////////////////////////////////////////////////////////////// | 46 //////////////////////////////////////////////////////////////////////////////// |
51 // NetworkMenuButton, AnimationDelegate implementation: | 47 // NetworkMenuButton, AnimationDelegate implementation: |
52 | 48 |
53 void NetworkMenuButton::AnimationProgressed(const Animation* animation) { | 49 void NetworkMenuButton::AnimationProgressed(const Animation* animation) { |
54 if (animation == &animation_connecting_) { | 50 if (animation == &animation_connecting_) { |
55 // Draw animation of bars icon fading in and out. | 51 // Draw animation of bars icon fading in and out. |
56 // We are fading between 0 bars and a third of the opacity of 4 bars. | 52 // We are fading between 0 bars and a third of the opacity of 4 bars. |
57 // Use the current value of the animation to calculate the alpha value | 53 // Use the current value of the animation to calculate the alpha value |
(...skipping 12 matching lines...) Expand all Loading... |
70 | 66 |
71 //////////////////////////////////////////////////////////////////////////////// | 67 //////////////////////////////////////////////////////////////////////////////// |
72 // NetworkMenuButton, StatusAreaButton implementation: | 68 // NetworkMenuButton, StatusAreaButton implementation: |
73 | 69 |
74 void NetworkMenuButton::DrawIcon(gfx::Canvas* canvas) { | 70 void NetworkMenuButton::DrawIcon(gfx::Canvas* canvas) { |
75 canvas->DrawBitmapInt(IconForDisplay(icon(), badge()), | 71 canvas->DrawBitmapInt(IconForDisplay(icon(), badge()), |
76 horizontal_padding(), 0); | 72 horizontal_padding(), 0); |
77 } | 73 } |
78 | 74 |
79 //////////////////////////////////////////////////////////////////////////////// | 75 //////////////////////////////////////////////////////////////////////////////// |
80 // NetworkMenuButton, NetworkLibrary::NetworkManagerObserver implementation: | 76 // NetworkMenuButton, NetworkLibrary::Observer implementation: |
81 | 77 |
82 void NetworkMenuButton::OnNetworkManagerChanged(NetworkLibrary* cros) { | 78 void NetworkMenuButton::NetworkChanged(NetworkLibrary* cros) { |
83 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 79 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
84 if (CrosLibrary::Get()->EnsureLoaded()) { | 80 if (CrosLibrary::Get()->EnsureLoaded()) { |
85 // Add an observer for the active network, if any | |
86 const Network* network = cros->active_network(); | |
87 if (active_network_.empty() || network == NULL || | |
88 active_network_ != network->service_path()) { | |
89 if (!active_network_.empty()) { | |
90 cros->RemoveNetworkObserver(active_network_, this); | |
91 } | |
92 if (network != NULL) { | |
93 cros->AddNetworkObserver(network->service_path(), this); | |
94 } | |
95 } | |
96 if (network) | |
97 active_network_ = network->service_path(); | |
98 else | |
99 active_network_ = ""; | |
100 | |
101 if (cros->wifi_connecting() || cros->cellular_connecting()) { | 81 if (cros->wifi_connecting() || cros->cellular_connecting()) { |
102 // Start the connecting animation if not running. | 82 // Start the connecting animation if not running. |
103 if (!animation_connecting_.is_animating()) { | 83 if (!animation_connecting_.is_animating()) { |
104 animation_connecting_.Reset(); | 84 animation_connecting_.Reset(); |
105 animation_connecting_.StartThrobbing(std::numeric_limits<int>::max()); | 85 animation_connecting_.StartThrobbing(std::numeric_limits<int>::max()); |
106 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0)); | 86 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0)); |
107 } | 87 } |
108 std::string network_name = cros->wifi_connecting() ? | 88 std::string network_name = cros->wifi_connecting() ? |
109 cros->wifi_network()->name() : cros->cellular_network()->name(); | 89 cros->wifi_network()->name() : cros->cellular_network()->name(); |
110 bool configuring = cros->wifi_connecting() ? | 90 bool configuring = cros->wifi_connecting() ? |
111 cros->wifi_network()->configuring() : | 91 cros->wifi_network()->configuring() : |
112 cros->cellular_network()->configuring(); | 92 cros->cellular_network()->configuring(); |
113 SetTooltipText( | 93 SetTooltipText( |
114 l10n_util::GetStringF(configuring ? | 94 l10n_util::GetStringF(configuring ? |
115 IDS_STATUSBAR_NETWORK_CONFIGURING_TOOLTIP : | 95 IDS_STATUSBAR_NETWORK_CONFIGURING_TOOLTIP : |
116 IDS_STATUSBAR_NETWORK_CONNECTING_TOOLTIP, | 96 IDS_STATUSBAR_NETWORK_CONNECTING_TOOLTIP, |
117 UTF8ToWide(network_name))); | 97 UTF8ToWide(network_name))); |
118 } else { | 98 } else { |
119 // Stop connecting animation since we are not connecting. | 99 // Stop connecting animation since we are not connecting. |
120 animation_connecting_.Stop(); | 100 animation_connecting_.Stop(); |
121 if (!cros->Connected()) { | 101 |
| 102 // Always show the higher priority connection first. Ethernet then wifi. |
| 103 if (cros->ethernet_connected()) { |
| 104 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WIRED)); |
| 105 SetTooltipText( |
| 106 l10n_util::GetStringF( |
| 107 IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP, |
| 108 l10n_util::GetString(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET))); |
| 109 } else if (cros->wifi_connected()) { |
| 110 SetIcon(IconForNetworkStrength( |
| 111 cros->wifi_network()->strength(), false)); |
| 112 SetTooltipText(l10n_util::GetStringF( |
| 113 IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP, |
| 114 UTF8ToWide(cros->wifi_network()->name()))); |
| 115 } else if (cros->cellular_connected()) { |
| 116 const CellularNetwork* cellular = cros->cellular_network(); |
| 117 if (cellular->data_left() == CellularNetwork::DATA_NONE) { |
| 118 // If no data, then we show 0 bars. |
| 119 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0)); |
| 120 } else { |
| 121 SetIcon(IconForNetworkStrength(cellular)); |
| 122 } |
| 123 SetTooltipText(l10n_util::GetStringF( |
| 124 IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP, |
| 125 UTF8ToWide(cellular->name()))); |
| 126 } else { |
122 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0)); | 127 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0)); |
123 SetTooltipText(l10n_util::GetString( | 128 SetTooltipText(l10n_util::GetString( |
124 IDS_STATUSBAR_NETWORK_NO_NETWORK_TOOLTIP)); | 129 IDS_STATUSBAR_NETWORK_NO_NETWORK_TOOLTIP)); |
125 } else { | |
126 SetNetworkIcon(network); | |
127 } | 130 } |
128 } | 131 } |
129 SetNetworkBadge(cros, network); | 132 |
| 133 // Figure out whether or not to show a badge. |
| 134 int id = -1; |
| 135 if (cros->Connecting()) { |
| 136 if (cros->cellular_connecting()) { |
| 137 id = IDR_STATUSBAR_NETWORK_3G; |
| 138 } |
| 139 } else if (cros->Connected()) { |
| 140 if (!cros->ethernet_connected() && !cros->wifi_connected() && |
| 141 cros->cellular_connected()) { |
| 142 switch (cros->cellular_network()->data_left()) { |
| 143 case CellularNetwork::DATA_NONE: |
| 144 case CellularNetwork::DATA_VERY_LOW: |
| 145 id = IDR_STATUSBAR_NETWORK_3G_ERROR; |
| 146 break; |
| 147 case CellularNetwork::DATA_LOW: |
| 148 id = IDR_STATUSBAR_NETWORK_3G_WARN; |
| 149 break; |
| 150 case CellularNetwork::DATA_NORMAL: |
| 151 id = IDR_STATUSBAR_NETWORK_3G; |
| 152 break; |
| 153 } |
| 154 } |
| 155 } else { |
| 156 id = IDR_STATUSBAR_NETWORK_DISCONNECTED; |
| 157 } |
| 158 if (id != -1) { |
| 159 SetBadge(*rb.GetBitmapNamed(id)); |
| 160 } else { |
| 161 SetBadge(SkBitmap()); |
| 162 } |
130 } else { | 163 } else { |
131 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0)); | 164 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0)); |
132 SetBadge(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_WARNING)); | 165 SetBadge(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_WARNING)); |
133 SetTooltipText(l10n_util::GetString( | |
134 IDS_STATUSBAR_NETWORK_NO_NETWORK_TOOLTIP)); | |
135 } | |
136 | |
137 SchedulePaint(); | |
138 UpdateMenu(); | |
139 } | |
140 | |
141 //////////////////////////////////////////////////////////////////////////////// | |
142 // NetworkMenuButton, NetworkLibrary::NetworkObserver implementation: | |
143 void NetworkMenuButton::OnNetworkChanged(NetworkLibrary* cros, | |
144 const Network* network) { | |
145 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
146 if (CrosLibrary::Get()->EnsureLoaded()) { | |
147 // Always show the active network connection, if any. | |
148 SetNetworkIcon(network); | |
149 SetNetworkBadge(cros, network); | |
150 } else { | |
151 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0)); | |
152 SetBadge(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_WARNING)); | |
153 SetTooltipText(l10n_util::GetString( | 166 SetTooltipText(l10n_util::GetString( |
154 IDS_STATUSBAR_NETWORK_NO_NETWORK_TOOLTIP)); | 167 IDS_STATUSBAR_NETWORK_NO_NETWORK_TOOLTIP)); |
155 } | 168 } |
156 | 169 |
157 SchedulePaint(); | 170 SchedulePaint(); |
158 UpdateMenu(); | 171 UpdateMenu(); |
159 } | 172 } |
160 | 173 |
161 void NetworkMenuButton::OnCellularDataPlanChanged(NetworkLibrary* cros) { | 174 void NetworkMenuButton::CellularDataPlanChanged(NetworkLibrary* cros) { |
162 // Call OnNetworkManagerChanged which will update the icon. | 175 // Call NetworkChanged which will update the icon. |
163 OnNetworkManagerChanged(cros); | 176 NetworkChanged(cros); |
164 } | 177 } |
165 | 178 |
166 //////////////////////////////////////////////////////////////////////////////// | 179 //////////////////////////////////////////////////////////////////////////////// |
167 // NetworkMenuButton, NetworkMenu implementation: | 180 // NetworkMenuButton, NetworkMenu implementation: |
168 | 181 |
169 bool NetworkMenuButton::IsBrowserMode() const { | 182 bool NetworkMenuButton::IsBrowserMode() const { |
170 return host_->IsBrowserMode(); | 183 return host_->IsBrowserMode(); |
171 } | 184 } |
172 | 185 |
173 gfx::NativeWindow NetworkMenuButton::GetNativeWindow() const { | 186 gfx::NativeWindow NetworkMenuButton::GetNativeWindow() const { |
174 return host_->GetNativeWindow(); | 187 return host_->GetNativeWindow(); |
175 } | 188 } |
176 | 189 |
177 void NetworkMenuButton::OpenButtonOptions() const { | 190 void NetworkMenuButton::OpenButtonOptions() const { |
178 host_->OpenButtonOptions(this); | 191 host_->OpenButtonOptions(this); |
179 } | 192 } |
180 | 193 |
181 bool NetworkMenuButton::ShouldOpenButtonOptions() const { | 194 bool NetworkMenuButton::ShouldOpenButtonOptions() const { |
182 return host_->ShouldOpenButtonOptions(this); | 195 return host_->ShouldOpenButtonOptions(this); |
183 } | 196 } |
184 | 197 |
185 //////////////////////////////////////////////////////////////////////////////// | |
186 // NetworkMenuButton, private methods | |
187 | |
188 void NetworkMenuButton::SetNetworkIcon(const Network* network) { | |
189 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
190 if (network && network->is_active()) { | |
191 if (network->type() == TYPE_ETHERNET) { | |
192 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WIRED)); | |
193 SetTooltipText( | |
194 l10n_util::GetStringF( | |
195 IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP, | |
196 l10n_util::GetString(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET))); | |
197 } else if (network->type() == TYPE_WIFI) { | |
198 const WifiNetwork* wifi = static_cast<const WifiNetwork*>(network); | |
199 SetIcon(IconForNetworkStrength(wifi->strength(), false)); | |
200 SetTooltipText(l10n_util::GetStringF( | |
201 IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP, | |
202 UTF8ToWide(wifi->name()))); | |
203 } else if (network->type() == TYPE_CELLULAR) { | |
204 const CellularNetwork* cellular = | |
205 static_cast<const CellularNetwork*>(network); | |
206 if (cellular->data_left() == CellularNetwork::DATA_NONE) { | |
207 // If no data, then we show 0 bars. | |
208 SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0)); | |
209 } else { | |
210 SetIcon(IconForNetworkStrength(cellular)); | |
211 } | |
212 SetTooltipText(l10n_util::GetStringF( | |
213 IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP, | |
214 UTF8ToWide(cellular->name()))); | |
215 } | |
216 } | |
217 } | |
218 | |
219 void NetworkMenuButton::SetNetworkBadge(NetworkLibrary* cros, | |
220 const Network* network) { | |
221 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
222 // Figure out whether or not to show a badge. | |
223 if (network && network->type() == TYPE_CELLULAR && | |
224 (network->is_active() || network->connecting())) { | |
225 const CellularNetwork* cellular | |
226 = static_cast<const CellularNetwork*>(network); | |
227 SetBadge(BadgeForNetworkTechnology(cellular)); | |
228 } else if (!cros->Connected() && !cros->Connecting()) { | |
229 SetBadge(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED)); | |
230 } else { | |
231 SetBadge(SkBitmap()); | |
232 } | |
233 } | |
234 | |
235 } // namespace chromeos | 198 } // namespace chromeos |
OLD | NEW |