| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_icon.h" | 5 #include "chrome/browser/chromeos/status/network_menu_icon.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 const int kNumArcsImages = 5; | 42 const int kNumArcsImages = 5; |
| 43 gfx::ImageSkia* kArcsImagesAnimatingDark[kNumArcsImages - 1]; | 43 gfx::ImageSkia* kArcsImagesAnimatingDark[kNumArcsImages - 1]; |
| 44 gfx::ImageSkia* kArcsImagesAnimatingLight[kNumArcsImages - 1]; | 44 gfx::ImageSkia* kArcsImagesAnimatingLight[kNumArcsImages - 1]; |
| 45 | 45 |
| 46 // Badge offsets. The right and bottom offsets are computed based on the size | 46 // Badge offsets. The right and bottom offsets are computed based on the size |
| 47 // of the network icon and the badge in order to accomodate multiple icon | 47 // of the network icon and the badge in order to accomodate multiple icon |
| 48 // resolutions (ie. standard and high DPI). | 48 // resolutions (ie. standard and high DPI). |
| 49 const int kBadgeLeftX = 0; | 49 const int kBadgeLeftX = 0; |
| 50 const int kBadgeTopY = 0; | 50 const int kBadgeTopY = 0; |
| 51 | 51 |
| 52 // ID for VPN badge. | |
| 53 const int kVpnBadgeId = IDR_STATUSBAR_VPN_BADGE; | |
| 54 | |
| 55 int StrengthIndex(int strength, int count) { | 52 int StrengthIndex(int strength, int count) { |
| 56 if (strength == 0) { | 53 if (strength == 0) { |
| 57 return 0; | 54 return 0; |
| 58 } else { | 55 } else { |
| 59 // Return an index in the range [1, count]. | 56 // Return an index in the range [1, count]. |
| 60 const float findex = (static_cast<float>(strength) / 100.0f) * | 57 const float findex = (static_cast<float>(strength) / 100.0f) * |
| 61 nextafter(static_cast<float>(count), 0); | 58 nextafter(static_cast<float>(count), 0); |
| 62 int index = 1 + static_cast<int>(findex); | 59 int index = 1 + static_cast<int>(findex); |
| 63 index = max(min(index, count), 1); | 60 index = max(min(index, count), 1); |
| 64 return index; | 61 return index; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 SkBitmap empty; | 169 SkBitmap empty; |
| 173 empty.setConfig(SkBitmap::kARGB_8888_Config, key.first, key.second); | 170 empty.setConfig(SkBitmap::kARGB_8888_Config, key.first, key.second); |
| 174 empty.allocPixels(); | 171 empty.allocPixels(); |
| 175 empty.eraseARGB(0, 0, 0, 0); | 172 empty.eraseARGB(0, 0, 0, 0); |
| 176 (*empty_bitmaps_)[key] = empty; | 173 (*empty_bitmaps_)[key] = empty; |
| 177 return empty; | 174 return empty; |
| 178 } | 175 } |
| 179 | 176 |
| 180 class EmptyImageSource: public gfx::ImageSkiaSource { | 177 class EmptyImageSource: public gfx::ImageSkiaSource { |
| 181 public: | 178 public: |
| 182 EmptyImageSource(const gfx::Size& size) | 179 explicit EmptyImageSource(const gfx::Size& size) |
| 183 : size_(size) { | 180 : size_(size) { |
| 184 } | 181 } |
| 185 | 182 |
| 186 virtual gfx::ImageSkiaRep GetImageForScale( | 183 virtual gfx::ImageSkiaRep GetImageForScale( |
| 187 ui::ScaleFactor scale_factor) OVERRIDE { | 184 ui::ScaleFactor scale_factor) OVERRIDE { |
| 188 gfx::Size pixel_size = size_.Scale(ui::GetScaleFactorScale(scale_factor)); | 185 gfx::Size pixel_size = size_.Scale(ui::GetScaleFactorScale(scale_factor)); |
| 189 SkBitmap empty_bitmap = GetEmptyBitmap(pixel_size); | 186 SkBitmap empty_bitmap = GetEmptyBitmap(pixel_size); |
| 190 return gfx::ImageSkiaRep(empty_bitmap, scale_factor); | 187 return gfx::ImageSkiaRep(empty_bitmap, scale_factor); |
| 191 } | 188 } |
| 192 private: | 189 private: |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 private: | 236 private: |
| 240 const gfx::ImageSkia icon_; | 237 const gfx::ImageSkia icon_; |
| 241 const gfx::ImageSkia *top_left_badge_; | 238 const gfx::ImageSkia *top_left_badge_; |
| 242 const gfx::ImageSkia *top_right_badge_; | 239 const gfx::ImageSkia *top_right_badge_; |
| 243 const gfx::ImageSkia *bottom_left_badge_; | 240 const gfx::ImageSkia *bottom_left_badge_; |
| 244 const gfx::ImageSkia *bottom_right_badge_; | 241 const gfx::ImageSkia *bottom_right_badge_; |
| 245 | 242 |
| 246 DISALLOW_COPY_AND_ASSIGN(NetworkIconImageSource); | 243 DISALLOW_COPY_AND_ASSIGN(NetworkIconImageSource); |
| 247 }; | 244 }; |
| 248 | 245 |
| 249 gfx::ImageSkia CreateVpnImage() { | |
| 250 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | |
| 251 const gfx::ImageSkia* ethernet_icon = rb.GetImageSkiaNamed(IDR_STATUSBAR_VPN); | |
| 252 const gfx::ImageSkia* vpn_badge = rb.GetImageSkiaNamed(kVpnBadgeId); | |
| 253 return NetworkMenuIcon::GenerateImageFromComponents( | |
| 254 *ethernet_icon, NULL, NULL, vpn_badge, NULL); | |
| 255 } | |
| 256 | |
| 257 gfx::ImageSkia GetEmptyImage(const gfx::Size& size) { | 246 gfx::ImageSkia GetEmptyImage(const gfx::Size& size) { |
| 258 return gfx::ImageSkia(new EmptyImageSource(size), size); | 247 return gfx::ImageSkia(new EmptyImageSource(size), size); |
| 259 } | 248 } |
| 260 | 249 |
| 261 } // namespace | 250 } // namespace |
| 262 | 251 |
| 263 //////////////////////////////////////////////////////////////////////////////// | 252 //////////////////////////////////////////////////////////////////////////////// |
| 264 // NetworkIcon | 253 // NetworkIcon |
| 265 | 254 |
| 266 // Sets up and generates an ImageSkia for a Network icon. | 255 // Sets up and generates an ImageSkia for a Network icon. |
| 267 class NetworkIcon { | 256 class NetworkIcon { |
| 268 public: | 257 public: |
| 269 // Default constructor is used by the status bar icon (NetworkMenuIcon). | 258 // Default constructor is used by the status bar icon (NetworkMenuIcon). |
| 270 explicit NetworkIcon(NetworkMenuIcon::ResourceColorTheme color); | 259 explicit NetworkIcon(NetworkMenuIcon::ResourceColorTheme color); |
| 271 | 260 |
| 272 // Service path constructor for cached network service icons. | 261 // Service path constructor for cached network service icons. |
| 273 NetworkIcon(const std::string& service_path, | 262 NetworkIcon(const std::string& service_path, |
| 274 NetworkMenuIcon::ResourceColorTheme color); | 263 NetworkMenuIcon::ResourceColorTheme color); |
| 275 | 264 |
| 276 ~NetworkIcon(); | 265 ~NetworkIcon(); |
| 277 | 266 |
| 278 // Resets the icon state. | 267 // Resets the icon state. |
| 279 void ClearIconAndBadges(); | 268 void ClearIconAndBadges(); |
| 280 | 269 |
| 281 // Resets the saved state to force an update. | 270 // Resets the saved state to force an update. |
| 282 void SetDirty(); | 271 void SetDirty(); |
| 283 | 272 |
| 273 // Updates |vpn_connected_|, returns true if it changed. |
| 274 bool SetOrClearVpnConnected(const Network* network); |
| 275 |
| 284 // Determines whether or not the associated network might be dirty and if so | 276 // Determines whether or not the associated network might be dirty and if so |
| 285 // updates and generates the icon. Does nothing if network no longer exists. | 277 // updates and generates the icon. Does nothing if network no longer exists. |
| 286 void Update(); | 278 void Update(); |
| 287 | 279 |
| 288 // Sets up the base icon image. | 280 // Sets up the base icon image. |
| 289 void SetIcon(const Network* network); | 281 void SetIcon(const Network* network); |
| 290 | 282 |
| 291 // Sets up the various badges: | 283 // Sets up the various badges: |
| 292 // top_left: cellular roaming | 284 // top_left: cellular roaming |
| 293 // top_right: libcros warning | 285 // top_right: libcros warning |
| 294 // bottom_left: VPN | 286 // bottom_left: VPN |
| 295 // bottom_right: disconnected / secure / technology / warning | 287 // bottom_right: disconnected / secure / technology / warning |
| 296 void SetBadges(const Network* network); | 288 void SetBadges(const Network* network); |
| 297 | 289 |
| 298 // Clears any previous state then sets the base icon and badges. | 290 // Clears any previous state then sets the base icon and badges. |
| 299 void UpdateIcon(const Network* network); | 291 void UpdateIcon(const Network* network); |
| 300 | 292 |
| 301 // Generates the image. Call after setting the icon and badges. | 293 // Generates the image. Call after setting the icon and badges. |
| 302 void GenerateImage(); | 294 void GenerateImage(); |
| 303 | 295 |
| 304 const gfx::ImageSkia GetImage() const { return image_; } | 296 const gfx::ImageSkia GetImage() const { return image_; } |
| 305 | 297 |
| 298 bool ShouldShowInTray() const; |
| 299 |
| 300 void set_type(ConnectionType type) { type_ = type; } |
| 301 void set_state(ConnectionState state) { state_ = state; } |
| 306 void set_icon(const gfx::ImageSkia& icon) { icon_ = icon; } | 302 void set_icon(const gfx::ImageSkia& icon) { icon_ = icon; } |
| 307 void set_top_left_badge(const gfx::ImageSkia* badge) { | 303 void set_top_left_badge(const gfx::ImageSkia* badge) { |
| 308 top_left_badge_ = badge; | 304 top_left_badge_ = badge; |
| 309 } | 305 } |
| 310 void set_top_right_badge(const gfx::ImageSkia* badge) { | 306 void set_top_right_badge(const gfx::ImageSkia* badge) { |
| 311 top_right_badge_ = badge; | 307 top_right_badge_ = badge; |
| 312 } | 308 } |
| 313 void set_bottom_left_badge(const gfx::ImageSkia* badge) { | 309 void set_bottom_left_badge(const gfx::ImageSkia* badge) { |
| 314 bottom_left_badge_ = badge; | 310 bottom_left_badge_ = badge; |
| 315 } | 311 } |
| 316 void set_bottom_right_badge(const gfx::ImageSkia* badge) { | 312 void set_bottom_right_badge(const gfx::ImageSkia* badge) { |
| 317 bottom_right_badge_ = badge; | 313 bottom_right_badge_ = badge; |
| 318 } | 314 } |
| 319 | 315 |
| 320 private: | 316 private: |
| 321 // Updates strength_index_ for wifi or cellular networks. | 317 // Updates strength_index_ for wifi or cellular networks. |
| 322 // Returns true if |strength_index_| changed. | 318 // Returns true if |strength_index_| changed. |
| 323 bool UpdateWirelessStrengthIndex(const Network* network); | 319 bool UpdateWirelessStrengthIndex(const Network* network); |
| 324 | 320 |
| 325 // Updates the local state for cellular networks. | 321 // Updates the local state for cellular networks. |
| 326 bool UpdateCellularState(const Network* network); | 322 bool UpdateCellularState(const Network* network); |
| 327 | 323 |
| 328 std::string service_path_; | 324 std::string service_path_; |
| 325 ConnectionType type_; |
| 329 ConnectionState state_; | 326 ConnectionState state_; |
| 330 NetworkMenuIcon::ResourceColorTheme resource_color_theme_; | 327 NetworkMenuIcon::ResourceColorTheme resource_color_theme_; |
| 331 int strength_index_; | 328 int strength_index_; |
| 332 gfx::ImageSkia image_; | 329 gfx::ImageSkia image_; |
| 333 gfx::ImageSkia icon_; | 330 gfx::ImageSkia icon_; |
| 334 const gfx::ImageSkia* top_left_badge_; | 331 const gfx::ImageSkia* top_left_badge_; |
| 335 const gfx::ImageSkia* top_right_badge_; | 332 const gfx::ImageSkia* top_right_badge_; |
| 336 const gfx::ImageSkia* bottom_left_badge_; | 333 const gfx::ImageSkia* bottom_left_badge_; |
| 337 const gfx::ImageSkia* bottom_right_badge_; | 334 const gfx::ImageSkia* bottom_right_badge_; |
| 338 bool is_status_bar_; | 335 bool is_status_bar_; |
| 339 const Network* connected_network_; // weak pointer; used for VPN icons. | 336 const Network* connected_network_; // weak pointer; used for VPN icons. |
| 337 bool vpn_connected_; |
| 340 NetworkRoamingState roaming_state_; | 338 NetworkRoamingState roaming_state_; |
| 341 | 339 |
| 342 DISALLOW_COPY_AND_ASSIGN(NetworkIcon); | 340 DISALLOW_COPY_AND_ASSIGN(NetworkIcon); |
| 343 }; | 341 }; |
| 344 | 342 |
| 345 //////////////////////////////////////////////////////////////////////////////// | 343 //////////////////////////////////////////////////////////////////////////////// |
| 346 // NetworkIcon | 344 // NetworkIcon |
| 347 | 345 |
| 348 NetworkIcon::NetworkIcon(NetworkMenuIcon::ResourceColorTheme color) | 346 NetworkIcon::NetworkIcon(NetworkMenuIcon::ResourceColorTheme color) |
| 349 : state_(STATE_UNKNOWN), | 347 : type_(TYPE_UNKNOWN), |
| 348 state_(STATE_UNKNOWN), |
| 350 resource_color_theme_(color), | 349 resource_color_theme_(color), |
| 351 strength_index_(-1), | 350 strength_index_(-1), |
| 352 top_left_badge_(NULL), | 351 top_left_badge_(NULL), |
| 353 top_right_badge_(NULL), | 352 top_right_badge_(NULL), |
| 354 bottom_left_badge_(NULL), | 353 bottom_left_badge_(NULL), |
| 355 bottom_right_badge_(NULL), | 354 bottom_right_badge_(NULL), |
| 356 is_status_bar_(true), | 355 is_status_bar_(true), |
| 357 connected_network_(NULL), | 356 connected_network_(NULL), |
| 357 vpn_connected_(false), |
| 358 roaming_state_(ROAMING_STATE_UNKNOWN) { | 358 roaming_state_(ROAMING_STATE_UNKNOWN) { |
| 359 } | 359 } |
| 360 | 360 |
| 361 NetworkIcon::NetworkIcon(const std::string& service_path, | 361 NetworkIcon::NetworkIcon(const std::string& service_path, |
| 362 NetworkMenuIcon::ResourceColorTheme color) | 362 NetworkMenuIcon::ResourceColorTheme color) |
| 363 : service_path_(service_path), | 363 : service_path_(service_path), |
| 364 type_(TYPE_UNKNOWN), |
| 364 state_(STATE_UNKNOWN), | 365 state_(STATE_UNKNOWN), |
| 365 resource_color_theme_(color), | 366 resource_color_theme_(color), |
| 366 strength_index_(-1), | 367 strength_index_(-1), |
| 367 top_left_badge_(NULL), | 368 top_left_badge_(NULL), |
| 368 top_right_badge_(NULL), | 369 top_right_badge_(NULL), |
| 369 bottom_left_badge_(NULL), | 370 bottom_left_badge_(NULL), |
| 370 bottom_right_badge_(NULL), | 371 bottom_right_badge_(NULL), |
| 371 is_status_bar_(false), | 372 is_status_bar_(false), |
| 372 connected_network_(NULL), | 373 connected_network_(NULL), |
| 374 vpn_connected_(false), |
| 373 roaming_state_(ROAMING_STATE_UNKNOWN) { | 375 roaming_state_(ROAMING_STATE_UNKNOWN) { |
| 374 } | 376 } |
| 375 | 377 |
| 376 NetworkIcon::~NetworkIcon() { | 378 NetworkIcon::~NetworkIcon() { |
| 377 } | 379 } |
| 378 | 380 |
| 379 void NetworkIcon::ClearIconAndBadges() { | 381 void NetworkIcon::ClearIconAndBadges() { |
| 380 icon_ = gfx::ImageSkia(); | 382 icon_ = gfx::ImageSkia(); |
| 381 top_left_badge_ = NULL; | 383 top_left_badge_ = NULL; |
| 382 top_right_badge_ = NULL; | 384 top_right_badge_ = NULL; |
| 383 bottom_left_badge_ = NULL; | 385 bottom_left_badge_ = NULL; |
| 384 bottom_right_badge_ = NULL; | 386 bottom_right_badge_ = NULL; |
| 385 } | 387 } |
| 386 | 388 |
| 387 void NetworkIcon::SetDirty() { | 389 void NetworkIcon::SetDirty() { |
| 388 state_ = STATE_UNKNOWN; | 390 state_ = STATE_UNKNOWN; |
| 389 strength_index_ = -1; | 391 strength_index_ = -1; |
| 390 } | 392 } |
| 391 | 393 |
| 394 bool NetworkIcon::SetOrClearVpnConnected(const Network* network) { |
| 395 if (network->type() == TYPE_VPN) |
| 396 return false; // Never show the VPN badge for a VPN network. |
| 397 chromeos::NetworkLibrary* cros = |
| 398 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| 399 bool vpn_connected = (network->connected() && |
| 400 cros->virtual_network() && |
| 401 cros->virtual_network()->connected()); |
| 402 if (vpn_connected_ != vpn_connected) { |
| 403 vpn_connected_ = vpn_connected; |
| 404 return true; |
| 405 } |
| 406 return false; |
| 407 } |
| 408 |
| 392 void NetworkIcon::Update() { | 409 void NetworkIcon::Update() { |
| 393 chromeos::NetworkLibrary* cros = | 410 chromeos::NetworkLibrary* cros = |
| 394 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); | 411 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| 395 // First look for a visible network. | 412 // First look for a visible network. |
| 396 const Network* network = cros->FindNetworkByPath(service_path_); | 413 const Network* network = cros->FindNetworkByPath(service_path_); |
| 397 if (!network) { | 414 if (!network) { |
| 398 // If not a visible network, check for a remembered network. | 415 // If not a visible network, check for a remembered network. |
| 399 network = cros->FindRememberedNetworkByPath(service_path_); | 416 network = cros->FindRememberedNetworkByPath(service_path_); |
| 400 if (!network) { | 417 if (!network) { |
| 401 LOG(WARNING) << "Unable to find network:" << service_path_; | 418 LOG(WARNING) << "Unable to find network:" << service_path_; |
| 402 return; | 419 return; |
| 403 } | 420 } |
| 404 } | 421 } |
| 405 | 422 |
| 406 // Determine whether or not we need to update the icon. | 423 // Determine whether or not we need to update the icon. |
| 407 bool dirty = image_.empty(); | 424 bool dirty = image_.empty(); |
| 408 | 425 |
| 409 // If the network state has changed, the icon needs updating. | 426 // If the network state has changed, the icon needs updating. |
| 410 if (state_ != network->state()) { | 427 if (state_ != network->state()) { |
| 411 state_ = network->state(); | 428 state_ = network->state(); |
| 412 dirty = true; | 429 dirty = true; |
| 413 } | 430 } |
| 414 | 431 |
| 415 ConnectionType type = network->type(); | 432 type_ = network->type(); |
| 416 if (type == TYPE_WIFI || type == TYPE_WIMAX || type == TYPE_CELLULAR) { | 433 |
| 434 if (type_ == TYPE_WIFI || type_ == TYPE_WIMAX || type_ == TYPE_CELLULAR) { |
| 417 if (UpdateWirelessStrengthIndex(network)) | 435 if (UpdateWirelessStrengthIndex(network)) |
| 418 dirty = true; | 436 dirty = true; |
| 419 } | 437 } |
| 420 | 438 |
| 421 if (type == TYPE_CELLULAR) { | 439 if (type_ == TYPE_CELLULAR) { |
| 422 if (UpdateCellularState(network)) | 440 if (UpdateCellularState(network)) |
| 423 dirty = true; | 441 dirty = true; |
| 424 } | 442 } |
| 425 | 443 |
| 426 if (type == TYPE_VPN) { | 444 if (type_ == TYPE_VPN) { |
| 445 // For VPN, check to see if the connected network has changed. |
| 427 if (cros->connected_network() != connected_network_) { | 446 if (cros->connected_network() != connected_network_) { |
| 428 connected_network_ = cros->connected_network(); | 447 connected_network_ = cros->connected_network(); |
| 429 dirty = true; | 448 dirty = true; |
| 430 } | 449 } |
| 450 } else { |
| 451 // For non-VPN, check to see if the VPN connection state has changed. |
| 452 if (SetOrClearVpnConnected(network)) |
| 453 dirty = true; |
| 431 } | 454 } |
| 432 | 455 |
| 433 if (dirty) { | 456 if (dirty) { |
| 434 // Set the icon and badges based on the network. | 457 // Set the icon and badges based on the network. |
| 435 UpdateIcon(network); | 458 UpdateIcon(network); |
| 436 // Generate the image from the icon. | 459 // Generate the image from the icon. |
| 437 GenerateImage(); | 460 GenerateImage(); |
| 438 } | 461 } |
| 439 } | 462 } |
| 440 | 463 |
| 441 void NetworkIcon::SetIcon(const Network* network) { | 464 void NetworkIcon::SetIcon(const Network* network) { |
| 442 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 465 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 443 | 466 |
| 444 switch (network->type()) { | 467 set_type(network->type()); |
| 468 set_state(network->state()); |
| 469 |
| 470 switch (type_) { |
| 445 case TYPE_ETHERNET: { | 471 case TYPE_ETHERNET: { |
| 446 icon_ = *rb.GetImageSkiaNamed(IDR_STATUSBAR_WIRED); | 472 icon_ = *rb.GetImageSkiaNamed(IDR_STATUSBAR_WIRED); |
| 447 break; | 473 break; |
| 448 } | 474 } |
| 449 case TYPE_WIFI: { | 475 case TYPE_WIFI: { |
| 450 const WifiNetwork* wifi = static_cast<const WifiNetwork*>(network); | 476 const WifiNetwork* wifi = static_cast<const WifiNetwork*>(network); |
| 451 if (strength_index_ == -1) | 477 if (strength_index_ == -1) |
| 452 strength_index_ = WifiStrengthIndex(wifi); | 478 strength_index_ = WifiStrengthIndex(wifi); |
| 453 icon_ = NetworkMenuIcon::GetImage( | 479 icon_ = NetworkMenuIcon::GetImage( |
| 454 NetworkMenuIcon::ARCS, strength_index_, resource_color_theme_); | 480 NetworkMenuIcon::ARCS, strength_index_, resource_color_theme_); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 469 strength_index_ = CellularStrengthIndex(cellular); | 495 strength_index_ = CellularStrengthIndex(cellular); |
| 470 icon_ = NetworkMenuIcon::GetImage( | 496 icon_ = NetworkMenuIcon::GetImage( |
| 471 NetworkMenuIcon::BARS, strength_index_, resource_color_theme_); | 497 NetworkMenuIcon::BARS, strength_index_, resource_color_theme_); |
| 472 break; | 498 break; |
| 473 } | 499 } |
| 474 case TYPE_VPN: { | 500 case TYPE_VPN: { |
| 475 icon_ = *rb.GetImageSkiaNamed(IDR_STATUSBAR_VPN); | 501 icon_ = *rb.GetImageSkiaNamed(IDR_STATUSBAR_VPN); |
| 476 break; | 502 break; |
| 477 } | 503 } |
| 478 default: { | 504 default: { |
| 479 LOG(WARNING) << "Request for icon for unsupported type: " | 505 LOG(WARNING) << "Request for icon for unsupported type: " << type_; |
| 480 << network->type(); | |
| 481 icon_ = *rb.GetImageSkiaNamed(IDR_STATUSBAR_WIRED); | 506 icon_ = *rb.GetImageSkiaNamed(IDR_STATUSBAR_WIRED); |
| 482 break; | 507 break; |
| 483 } | 508 } |
| 484 } | 509 } |
| 485 } | 510 } |
| 486 | 511 |
| 487 void NetworkIcon::SetBadges(const Network* network) { | 512 void NetworkIcon::SetBadges(const Network* network) { |
| 488 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 513 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 489 chromeos::NetworkLibrary* cros = | 514 chromeos::NetworkLibrary* cros = |
| 490 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); | 515 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 } | 548 } |
| 524 if (!cellular->connecting()) { | 549 if (!cellular->connecting()) { |
| 525 top_left_badge_ = BadgeForNetworkTechnology(cellular, | 550 top_left_badge_ = BadgeForNetworkTechnology(cellular, |
| 526 resource_color_theme_); | 551 resource_color_theme_); |
| 527 } | 552 } |
| 528 break; | 553 break; |
| 529 } | 554 } |
| 530 default: | 555 default: |
| 531 break; | 556 break; |
| 532 } | 557 } |
| 533 // Display the VPN badge too. | 558 if (vpn_connected_) |
| 534 if (resource_color_theme_ == NetworkMenuIcon::COLOR_DARK && | 559 bottom_left_badge_ = rb.GetImageSkiaNamed(IDR_STATUSBAR_VPN_BADGE); |
| 535 cros->virtual_network() && | |
| 536 (cros->virtual_network()->connected() || | |
| 537 cros->virtual_network()->connecting())) { | |
| 538 bottom_left_badge_ = rb.GetImageSkiaNamed(kVpnBadgeId); | |
| 539 } | |
| 540 } | 560 } |
| 541 | 561 |
| 542 void NetworkIcon::UpdateIcon(const Network* network) { | 562 void NetworkIcon::UpdateIcon(const Network* network) { |
| 543 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | |
| 544 chromeos::NetworkLibrary* cros = | |
| 545 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); | |
| 546 | |
| 547 ClearIconAndBadges(); | 563 ClearIconAndBadges(); |
| 548 | 564 SetIcon(network); |
| 549 if (network->type() != TYPE_VPN) { | 565 SetBadges(network); |
| 550 SetIcon(network); | |
| 551 SetBadges(network); | |
| 552 return; | |
| 553 } | |
| 554 | |
| 555 // VPN should never be the primiary active network. This is used for | |
| 556 // the icon next to a connected or disconnected VPN. | |
| 557 const Network* connected_network = cros->connected_network(); | |
| 558 if (connected_network && connected_network->type() != TYPE_VPN) { | |
| 559 // Set the icon and badges for the connected network. | |
| 560 SetIcon(connected_network); | |
| 561 SetBadges(connected_network); | |
| 562 } else { | |
| 563 // Use the ethernet icon for VPN when not connected. | |
| 564 icon_ = *rb.GetImageSkiaNamed(IDR_STATUSBAR_WIRED); | |
| 565 // We can be connected to a VPN, even when there is no connected | |
| 566 // underlying network. In that case, for the status bar, show the | |
| 567 // disconnected badge. | |
| 568 if (is_status_bar_) { | |
| 569 bottom_right_badge_ = | |
| 570 rb.GetImageSkiaNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED); | |
| 571 } | |
| 572 } | |
| 573 // Overlay the VPN badge. | |
| 574 bottom_left_badge_ = rb.GetImageSkiaNamed(kVpnBadgeId); | |
| 575 } | 566 } |
| 576 | 567 |
| 577 void NetworkIcon::GenerateImage() { | 568 void NetworkIcon::GenerateImage() { |
| 578 if (icon_.empty()) | 569 if (icon_.empty()) |
| 579 return; | 570 return; |
| 580 | 571 |
| 581 image_ = NetworkMenuIcon::GenerateImageFromComponents(icon_, top_left_badge_, | 572 image_ = NetworkMenuIcon::GenerateImageFromComponents(icon_, top_left_badge_, |
| 582 top_right_badge_, bottom_left_badge_, bottom_right_badge_); | 573 top_right_badge_, bottom_left_badge_, bottom_right_badge_); |
| 583 } | 574 } |
| 584 | 575 |
| 576 bool NetworkIcon::ShouldShowInTray() const { |
| 577 if (type_ == TYPE_UNKNOWN || type_ == TYPE_VPN) |
| 578 return false; |
| 579 if (type_ != TYPE_ETHERNET) |
| 580 return true; |
| 581 if (!Network::IsConnectedState(state_)) |
| 582 return true; |
| 583 NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); |
| 584 if (crosnet->virtual_network() && crosnet->virtual_network()->connecting()) |
| 585 return true; |
| 586 return false; |
| 587 } |
| 588 |
| 585 bool NetworkIcon::UpdateWirelessStrengthIndex(const Network* network) { | 589 bool NetworkIcon::UpdateWirelessStrengthIndex(const Network* network) { |
| 586 bool dirty = false; | 590 bool dirty = false; |
| 587 ConnectionType type = network->type(); | 591 ConnectionType type = network->type(); |
| 588 int index = 0; | 592 int index = 0; |
| 589 if (type == TYPE_WIFI) { | 593 if (type == TYPE_WIFI) { |
| 590 index = WifiStrengthIndex(static_cast<const WifiNetwork*>(network)); | 594 index = WifiStrengthIndex(static_cast<const WifiNetwork*>(network)); |
| 591 } else if (type == TYPE_WIMAX) { | 595 } else if (type == TYPE_WIMAX) { |
| 592 index = WimaxStrengthIndex(static_cast<const WimaxNetwork*>(network)); | 596 index = WimaxStrengthIndex(static_cast<const WimaxNetwork*>(network)); |
| 593 } else if (type == TYPE_CELLULAR) { | 597 } else if (type == TYPE_CELLULAR) { |
| 594 index = CellularStrengthIndex(static_cast<const CellularNetwork*>(network)); | 598 index = CellularStrengthIndex(static_cast<const CellularNetwork*>(network)); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 // Public methods: | 646 // Public methods: |
| 643 | 647 |
| 644 void NetworkMenuIcon::SetResourceColorTheme(ResourceColorTheme color) { | 648 void NetworkMenuIcon::SetResourceColorTheme(ResourceColorTheme color) { |
| 645 if (color == resource_color_theme_) | 649 if (color == resource_color_theme_) |
| 646 return; | 650 return; |
| 647 | 651 |
| 648 resource_color_theme_ = color; | 652 resource_color_theme_ = color; |
| 649 icon_.reset(new NetworkIcon(resource_color_theme_)); | 653 icon_.reset(new NetworkIcon(resource_color_theme_)); |
| 650 } | 654 } |
| 651 | 655 |
| 656 bool NetworkMenuIcon::ShouldShowIconInTray() { |
| 657 if (!icon_.get()) |
| 658 return false; |
| 659 return icon_->ShouldShowInTray(); |
| 660 } |
| 661 |
| 652 const gfx::ImageSkia NetworkMenuIcon::GetIconAndText(string16* text) { | 662 const gfx::ImageSkia NetworkMenuIcon::GetIconAndText(string16* text) { |
| 653 SetIconAndText(); | 663 SetIconAndText(); |
| 654 if (text) | 664 if (text) |
| 655 *text = text_; | 665 *text = text_; |
| 656 icon_->GenerateImage(); | 666 icon_->GenerateImage(); |
| 657 return icon_->GetImage(); | 667 return icon_->GetImage(); |
| 658 } | 668 } |
| 659 | 669 |
| 660 void NetworkMenuIcon::AnimationProgressed(const ui::Animation* animation) { | 670 void NetworkMenuIcon::AnimationProgressed(const ui::Animation* animation) { |
| 661 if (animation == &animation_connecting_ && delegate_) { | 671 if (animation == &animation_connecting_ && delegate_) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 690 } | 700 } |
| 691 return animation_connecting_.GetCurrentValue(); | 701 return animation_connecting_.GetCurrentValue(); |
| 692 } | 702 } |
| 693 | 703 |
| 694 // TODO(stevenjb): move below SetIconAndText. | 704 // TODO(stevenjb): move below SetIconAndText. |
| 695 void NetworkMenuIcon::SetConnectingIconAndText() { | 705 void NetworkMenuIcon::SetConnectingIconAndText() { |
| 696 int image_count; | 706 int image_count; |
| 697 ImageType image_type; | 707 ImageType image_type; |
| 698 gfx::ImageSkia** images; | 708 gfx::ImageSkia** images; |
| 699 | 709 |
| 710 icon_->set_type(connecting_network_->type()); |
| 711 icon_->set_state(connecting_network_->state()); |
| 712 |
| 700 if (connecting_network_->type() == TYPE_WIFI) { | 713 if (connecting_network_->type() == TYPE_WIFI) { |
| 701 image_count = kNumArcsImages - 1; | 714 image_count = kNumArcsImages - 1; |
| 702 image_type = ARCS; | 715 image_type = ARCS; |
| 703 images = resource_color_theme_ == COLOR_DARK ? kArcsImagesAnimatingDark : | 716 images = resource_color_theme_ == COLOR_DARK ? kArcsImagesAnimatingDark : |
| 704 kArcsImagesAnimatingLight; | 717 kArcsImagesAnimatingLight; |
| 705 } else { | 718 } else { |
| 706 image_count = kNumBarsImages - 1; | 719 image_count = kNumBarsImages - 1; |
| 707 image_type = BARS; | 720 image_type = BARS; |
| 708 images = resource_color_theme_ == COLOR_DARK ? kBarsImagesAnimatingDark : | 721 images = resource_color_theme_ == COLOR_DARK ? kBarsImagesAnimatingDark : |
| 709 kBarsImagesAnimatingLight; | 722 kBarsImagesAnimatingLight; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 } | 778 } |
| 766 | 779 |
| 767 void NetworkMenuIcon::SetActiveNetworkIconAndText(const Network* network) { | 780 void NetworkMenuIcon::SetActiveNetworkIconAndText(const Network* network) { |
| 768 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); | 781 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); |
| 769 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 782 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 770 bool animating = false; | 783 bool animating = false; |
| 771 last_network_type_ = network->type(); | 784 last_network_type_ = network->type(); |
| 772 | 785 |
| 773 // Set icon and badges. Call SetDirty() since network may have changed. | 786 // Set icon and badges. Call SetDirty() since network may have changed. |
| 774 icon_->SetDirty(); | 787 icon_->SetDirty(); |
| 788 icon_->SetOrClearVpnConnected(network); |
| 775 icon_->UpdateIcon(network); | 789 icon_->UpdateIcon(network); |
| 776 // Overlay the VPN badge if connecting to a VPN. | 790 // Overlay the VPN badge if connecting to a VPN. |
| 777 if (network->type() != TYPE_VPN && cros->virtual_network()) { | 791 if (network->type() != TYPE_VPN && |
| 778 if (cros->virtual_network()->connecting()) { | 792 cros->virtual_network() && cros->virtual_network()->connecting()) { |
| 779 const gfx::ImageSkia* vpn_badge = rb.GetImageSkiaNamed(kVpnBadgeId); | 793 const gfx::ImageSkia* vpn_badge = |
| 780 const double animation = GetAnimation(); | 794 rb.GetImageSkiaNamed(IDR_STATUSBAR_VPN_BADGE); |
| 781 animating = true; | 795 const double animation = GetAnimation(); |
| 782 // Even though this is the only place we use vpn_connecting_badge_, | 796 animating = true; |
| 783 // it is important that this is a member variable since we set a | 797 // Even though this is the only place we use vpn_connecting_badge_, |
| 784 // pointer to it and access that pointer in icon_->GenerateImage(). | 798 // it is important that this is a member variable since we set a |
| 785 vpn_connecting_badge_ = gfx::ImageSkiaOperations::CreateBlendedImage( | 799 // pointer to it and access that pointer in icon_->GenerateImage(). |
| 786 GetEmptyImage(vpn_badge->size()), *vpn_badge, animation); | 800 vpn_connecting_badge_ = gfx::ImageSkiaOperations::CreateBlendedImage( |
| 787 icon_->set_bottom_left_badge(&vpn_connecting_badge_); | 801 GetEmptyImage(vpn_badge->size()), *vpn_badge, animation); |
| 788 } | 802 icon_->set_bottom_left_badge(&vpn_connecting_badge_); |
| 789 } | 803 } |
| 790 if (!animating) | 804 if (!animating) |
| 791 animation_connecting_.Stop(); | 805 animation_connecting_.Stop(); |
| 792 | 806 |
| 793 // Set the text to display. | 807 // Set the text to display. |
| 794 if (network->type() == TYPE_ETHERNET) { | 808 if (network->type() == TYPE_ETHERNET) { |
| 795 if (mode_ == MENU_MODE) { | 809 if (mode_ == MENU_MODE) { |
| 796 text_ = l10n_util::GetStringFUTF16( | 810 text_ = l10n_util::GetStringFUTF16( |
| 797 IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP, | 811 IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP, |
| 798 l10n_util::GetStringUTF16( | 812 l10n_util::GetStringUTF16( |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 888 icon = new NetworkIcon(network->service_path(), color); | 902 icon = new NetworkIcon(network->service_path(), color); |
| 889 icon_map->insert(std::make_pair(network->service_path(), icon)); | 903 icon_map->insert(std::make_pair(network->service_path(), icon)); |
| 890 } else { | 904 } else { |
| 891 icon = iter->second; | 905 icon = iter->second; |
| 892 } | 906 } |
| 893 // Update and return the icon's image. | 907 // Update and return the icon's image. |
| 894 icon->Update(); | 908 icon->Update(); |
| 895 return icon->GetImage(); | 909 return icon->GetImage(); |
| 896 } | 910 } |
| 897 | 911 |
| 898 // Returns an icon for a disconnected VPN. | |
| 899 const gfx::ImageSkia NetworkMenuIcon::GetVpnImage() { | |
| 900 static const gfx::ImageSkia *vpn_image = new gfx::ImageSkia(CreateVpnImage()); | |
| 901 return *vpn_image; | |
| 902 } | |
| 903 | |
| 904 const gfx::ImageSkia NetworkMenuIcon::GetImage(ImageType type, | 912 const gfx::ImageSkia NetworkMenuIcon::GetImage(ImageType type, |
| 905 int index, | 913 int index, |
| 906 ResourceColorTheme color) { | 914 ResourceColorTheme color) { |
| 907 int width, height = 0; | 915 int width, height = 0; |
| 908 gfx::ImageSkia* images = NULL; | 916 gfx::ImageSkia* images = NULL; |
| 909 if (type == NetworkMenuIcon::ARCS) { | 917 if (type == NetworkMenuIcon::ARCS) { |
| 910 if (index >= kNumArcsImages) | 918 if (index >= kNumArcsImages) |
| 911 return gfx::ImageSkia(); | 919 return gfx::ImageSkia(); |
| 912 images = ResourceBundle::GetSharedInstance().GetImageSkiaNamed( | 920 images = ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
| 913 color == NetworkMenuIcon::COLOR_DARK ? | 921 color == NetworkMenuIcon::COLOR_DARK ? |
| (...skipping 23 matching lines...) Expand all Loading... |
| 937 const gfx::ImageSkia NetworkMenuIcon::GetConnectedImage(ImageType type, | 945 const gfx::ImageSkia NetworkMenuIcon::GetConnectedImage(ImageType type, |
| 938 ResourceColorTheme color) { | 946 ResourceColorTheme color) { |
| 939 return GetImage(type, NumImages(type) - 1, color); | 947 return GetImage(type, NumImages(type) - 1, color); |
| 940 } | 948 } |
| 941 | 949 |
| 942 int NetworkMenuIcon::NumImages(ImageType type) { | 950 int NetworkMenuIcon::NumImages(ImageType type) { |
| 943 return (type == ARCS) ? kNumArcsImages : kNumBarsImages; | 951 return (type == ARCS) ? kNumArcsImages : kNumBarsImages; |
| 944 } | 952 } |
| 945 | 953 |
| 946 } // chromeos | 954 } // chromeos |
| OLD | NEW |