OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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.h" | 5 #include "chrome/browser/chromeos/status/network_menu.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 }; | 73 }; |
74 // static | 74 // static |
75 const int NetworkMenu::kBarsImagesVLowData[kNumBarsImages] = { | 75 const int NetworkMenu::kBarsImagesVLowData[kNumBarsImages] = { |
76 IDR_STATUSBAR_NETWORK_BARS1_RED, | 76 IDR_STATUSBAR_NETWORK_BARS1_RED, |
77 IDR_STATUSBAR_NETWORK_BARS2_RED, | 77 IDR_STATUSBAR_NETWORK_BARS2_RED, |
78 IDR_STATUSBAR_NETWORK_BARS3_RED, | 78 IDR_STATUSBAR_NETWORK_BARS3_RED, |
79 IDR_STATUSBAR_NETWORK_BARS4_RED, | 79 IDR_STATUSBAR_NETWORK_BARS4_RED, |
80 }; | 80 }; |
81 */ | 81 */ |
82 | 82 |
| 83 // static |
| 84 const int NetworkMenu::kNumAnimatingImages = 10; |
| 85 |
| 86 // static |
| 87 SkBitmap NetworkMenu::kAnimatingImages[kNumAnimatingImages]; |
| 88 |
| 89 // static |
| 90 SkBitmap NetworkMenu::kAnimatingImagesBlack[kNumAnimatingImages]; |
| 91 |
83 NetworkMenu::NetworkMenu() | 92 NetworkMenu::NetworkMenu() |
84 : min_width_(-1) { | 93 : min_width_(-1) { |
85 use_settings_ui_ = !CommandLine::ForCurrentProcess()->HasSwitch( | 94 use_settings_ui_ = !CommandLine::ForCurrentProcess()->HasSwitch( |
86 switches::kDisableTabbedOptions); | 95 switches::kDisableTabbedOptions); |
87 network_menu_.reset(NetworkMenuUI::CreateMenu2(this)); | 96 network_menu_.reset(NetworkMenuUI::CreateMenu2(this)); |
88 } | 97 } |
89 | 98 |
90 NetworkMenu::~NetworkMenu() { | 99 NetworkMenu::~NetworkMenu() { |
91 } | 100 } |
92 | 101 |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 } | 357 } |
349 | 358 |
350 void NetworkMenu::UpdateMenu() { | 359 void NetworkMenu::UpdateMenu() { |
351 refreshing_menu_ = true; | 360 refreshing_menu_ = true; |
352 InitMenuItems(); | 361 InitMenuItems(); |
353 network_menu_->Rebuild(); | 362 network_menu_->Rebuild(); |
354 refreshing_menu_ = false; | 363 refreshing_menu_ = false; |
355 } | 364 } |
356 | 365 |
357 // static | 366 // static |
358 SkBitmap NetworkMenu::IconForNetworkStrength(const WifiNetwork* wifi, | 367 const SkBitmap* NetworkMenu::IconForNetworkStrength(const WifiNetwork* wifi, |
359 bool black) { | 368 bool black) { |
360 DCHECK(wifi); | 369 DCHECK(wifi); |
361 if (wifi->strength() == 0) { | 370 if (wifi->strength() == 0) { |
362 return *ResourceBundle::GetSharedInstance().GetBitmapNamed( | 371 return ResourceBundle::GetSharedInstance().GetBitmapNamed( |
363 black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : | 372 black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : |
364 IDR_STATUSBAR_NETWORK_BARS0); | 373 IDR_STATUSBAR_NETWORK_BARS0); |
365 } | 374 } |
366 int index = static_cast<int>(wifi->strength() / 100.0 * | 375 int index = static_cast<int>(wifi->strength() / 100.0 * |
367 nextafter(static_cast<float>(kNumBarsImages), 0)); | 376 nextafter(static_cast<float>(kNumBarsImages), 0)); |
368 index = std::max(std::min(index, kNumBarsImages - 1), 0); | 377 index = std::max(std::min(index, kNumBarsImages - 1), 0); |
369 const int* images = black ? kBarsImagesBlack : kBarsImages; | 378 const int* images = black ? kBarsImagesBlack : kBarsImages; |
370 return *ResourceBundle::GetSharedInstance().GetBitmapNamed(images[index]); | 379 return ResourceBundle::GetSharedInstance().GetBitmapNamed(images[index]); |
371 } | 380 } |
372 | 381 |
373 // static | 382 // static |
374 SkBitmap NetworkMenu::IconForNetworkStrength(const CellularNetwork* cellular, | 383 const SkBitmap* NetworkMenu::IconForNetworkStrength( |
375 bool black) { | 384 const CellularNetwork* cellular, bool black) { |
376 DCHECK(cellular); | 385 DCHECK(cellular); |
377 // If no data, then we show 0 bars. | 386 // If no data, then we show 0 bars. |
378 if (cellular->strength() == 0 || | 387 if (cellular->strength() == 0 || |
379 cellular->data_left() == CellularNetwork::DATA_NONE) { | 388 cellular->data_left() == CellularNetwork::DATA_NONE) { |
380 return *ResourceBundle::GetSharedInstance().GetBitmapNamed( | 389 return ResourceBundle::GetSharedInstance().GetBitmapNamed( |
381 black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : | 390 black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : |
382 IDR_STATUSBAR_NETWORK_BARS0); | 391 IDR_STATUSBAR_NETWORK_BARS0); |
383 } | 392 } |
384 int index = static_cast<int>(cellular->strength() / 100.0 * | 393 int index = static_cast<int>(cellular->strength() / 100.0 * |
385 nextafter(static_cast<float>(kNumBarsImages), 0)); | 394 nextafter(static_cast<float>(kNumBarsImages), 0)); |
386 index = std::max(std::min(index, kNumBarsImages - 1), 0); | 395 index = std::max(std::min(index, kNumBarsImages - 1), 0); |
387 const int* images = black ? kBarsImagesBlack : kBarsImages; | 396 const int* images = black ? kBarsImagesBlack : kBarsImages; |
388 return *ResourceBundle::GetSharedInstance().GetBitmapNamed(images[index]); | 397 return ResourceBundle::GetSharedInstance().GetBitmapNamed(images[index]); |
389 } | 398 } |
390 | 399 |
391 // static | 400 // static |
392 SkBitmap NetworkMenu::IconForNetworkConnecting(double animation_value, | 401 const SkBitmap* NetworkMenu::IconForNetworkConnecting(double animation_value, |
393 bool black) { | 402 bool black) { |
394 // Draw animation of bars icon fading in and out. | 403 // Draw animation of bars icon fading in and out. |
395 // We are fading between 0 bars and a third of the opacity of 4 bars. | 404 // We are fading between 0 bars and a third of the opacity of 4 bars. |
396 // Use the current value of the animation to calculate the alpha value | 405 // Use the current value of the animation to calculate the alpha value |
397 // of how transparent the icon is. | 406 // of how transparent the icon is. |
398 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 407 |
399 return SkBitmapOperations::CreateBlendedBitmap( | 408 int index = static_cast<int>(animation_value * |
400 *rb.GetBitmapNamed(black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : | 409 nextafter(static_cast<float>(kNumAnimatingImages), 0)); |
401 IDR_STATUSBAR_NETWORK_BARS0), | 410 index = std::max(std::min(index, kNumAnimatingImages - 1), 0); |
402 *rb.GetBitmapNamed(black ? IDR_STATUSBAR_NETWORK_BARS4_BLACK : | 411 |
403 IDR_STATUSBAR_NETWORK_BARS4), | 412 SkBitmap* images = black ? kAnimatingImagesBlack : kAnimatingImages; |
404 animation_value / 3); | 413 // Lazily cache images. |
| 414 if (images[index].empty()) { |
| 415 // Divide index (0-9) by 9 (assume kNumAnimatingImages==10) to get (0.0-1.0) |
| 416 // Then we take a third of that for the alpha value. |
| 417 double alpha = (static_cast<double>(index) / (kNumAnimatingImages - 1)) / 3; |
| 418 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 419 images[index] = SkBitmapOperations::CreateBlendedBitmap( |
| 420 *rb.GetBitmapNamed(black ? IDR_STATUSBAR_NETWORK_BARS0_BLACK : |
| 421 IDR_STATUSBAR_NETWORK_BARS0), |
| 422 *rb.GetBitmapNamed(black ? IDR_STATUSBAR_NETWORK_BARS4_BLACK : |
| 423 IDR_STATUSBAR_NETWORK_BARS4), |
| 424 alpha); |
| 425 } |
| 426 return &images[index]; |
405 } | 427 } |
406 | 428 |
407 // static | 429 // static |
408 SkBitmap NetworkMenu::BadgeForNetworkTechnology( | 430 const SkBitmap* NetworkMenu::BadgeForNetworkTechnology( |
409 const CellularNetwork* cellular) { | 431 const CellularNetwork* cellular) { |
410 if (!cellular) | 432 if (!cellular) |
411 return SkBitmap(); | 433 return NULL; |
412 | 434 |
413 int id = -1; | 435 int id = -1; |
414 switch (cellular->network_technology()) { | 436 switch (cellular->network_technology()) { |
415 case NETWORK_TECHNOLOGY_EVDO: | 437 case NETWORK_TECHNOLOGY_EVDO: |
416 switch (cellular->data_left()) { | 438 switch (cellular->data_left()) { |
417 case CellularNetwork::DATA_NONE: | 439 case CellularNetwork::DATA_NONE: |
418 id = IDR_STATUSBAR_NETWORK_3G_ERROR; | 440 id = IDR_STATUSBAR_NETWORK_3G_ERROR; |
419 break; | 441 break; |
420 case CellularNetwork::DATA_VERY_LOW: | 442 case CellularNetwork::DATA_VERY_LOW: |
421 case CellularNetwork::DATA_LOW: | 443 case CellularNetwork::DATA_LOW: |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 case NETWORK_TECHNOLOGY_LTE: | 486 case NETWORK_TECHNOLOGY_LTE: |
465 id = IDR_STATUSBAR_NETWORK_LTE; | 487 id = IDR_STATUSBAR_NETWORK_LTE; |
466 break; | 488 break; |
467 case NETWORK_TECHNOLOGY_LTE_ADVANCED: | 489 case NETWORK_TECHNOLOGY_LTE_ADVANCED: |
468 id = IDR_STATUSBAR_NETWORK_LTE_ADVANCED; | 490 id = IDR_STATUSBAR_NETWORK_LTE_ADVANCED; |
469 break; | 491 break; |
470 case NETWORK_TECHNOLOGY_UNKNOWN: | 492 case NETWORK_TECHNOLOGY_UNKNOWN: |
471 break; | 493 break; |
472 } | 494 } |
473 if (id == -1) | 495 if (id == -1) |
474 return SkBitmap(); | 496 return NULL; |
475 else | 497 else |
476 return *ResourceBundle::GetSharedInstance().GetBitmapNamed(id); | 498 return ResourceBundle::GetSharedInstance().GetBitmapNamed(id); |
477 } | 499 } |
478 | 500 |
479 // static | 501 // static |
480 SkBitmap NetworkMenu::IconForDisplay(SkBitmap icon, SkBitmap badge) { | 502 SkBitmap NetworkMenu::IconForDisplay(const SkBitmap* icon, |
| 503 const SkBitmap* badge) { |
| 504 DCHECK(icon); |
| 505 if (badge == NULL) |
| 506 return *icon; |
| 507 |
481 // Draw badge at (14,14). | 508 // Draw badge at (14,14). |
482 static const int kBadgeX = 14; | 509 static const int kBadgeX = 14; |
483 static const int kBadgeY = 14; | 510 static const int kBadgeY = 14; |
484 | 511 |
485 gfx::CanvasSkia canvas(icon.width(), icon.height(), false); | 512 gfx::CanvasSkia canvas(icon->width(), icon->height(), false); |
486 canvas.DrawBitmapInt(icon, 0, 0); | 513 canvas.DrawBitmapInt(*icon, 0, 0); |
487 if (!badge.empty()) | 514 canvas.DrawBitmapInt(*badge, kBadgeX, kBadgeY); |
488 canvas.DrawBitmapInt(badge, kBadgeX, kBadgeY); | |
489 return canvas.ExtractBitmap(); | 515 return canvas.ExtractBitmap(); |
490 } | 516 } |
491 | 517 |
492 //////////////////////////////////////////////////////////////////////////////// | 518 //////////////////////////////////////////////////////////////////////////////// |
493 // NetworkMenu, views::ViewMenuDelegate implementation: | 519 // NetworkMenu, views::ViewMenuDelegate implementation: |
494 | 520 |
495 void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) { | 521 void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) { |
496 refreshing_menu_ = true; | 522 refreshing_menu_ = true; |
497 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); | 523 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); |
498 cros->RequestWifiScan(); | 524 cros->RequestWifiScan(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 bool ethernet_connecting = cros->ethernet_connecting(); | 565 bool ethernet_connecting = cros->ethernet_connecting(); |
540 | 566 |
541 if (ethernet_connecting) { | 567 if (ethernet_connecting) { |
542 label = l10n_util::GetStringFUTF16( | 568 label = l10n_util::GetStringFUTF16( |
543 IDS_STATUSBAR_NETWORK_DEVICE_STATUS, | 569 IDS_STATUSBAR_NETWORK_DEVICE_STATUS, |
544 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET), | 570 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET), |
545 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING)); | 571 l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING)); |
546 } else { | 572 } else { |
547 label = l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET); | 573 label = l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET); |
548 } | 574 } |
549 SkBitmap icon = *rb.GetBitmapNamed(IDR_STATUSBAR_WIRED_BLACK); | 575 const SkBitmap* icon = rb.GetBitmapNamed(IDR_STATUSBAR_WIRED_BLACK); |
550 SkBitmap badge = ethernet_connecting || ethernet_connected ? | 576 const SkBitmap* badge = ethernet_connecting || ethernet_connected ? |
551 SkBitmap() : *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED); | 577 NULL : rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED); |
552 int flag = FLAG_ETHERNET; | 578 int flag = FLAG_ETHERNET; |
553 if (ethernet_connecting || ethernet_connected) | 579 if (ethernet_connecting || ethernet_connected) |
554 flag |= FLAG_ASSOCIATED; | 580 flag |= FLAG_ASSOCIATED; |
555 menu_items_.push_back( | 581 menu_items_.push_back( |
556 MenuItem(ui::MenuModel::TYPE_COMMAND, label, | 582 MenuItem(ui::MenuModel::TYPE_COMMAND, label, |
557 IconForDisplay(icon, badge), std::string(), flag)); | 583 IconForDisplay(icon, badge), std::string(), flag)); |
558 } | 584 } |
559 | 585 |
560 // Wifi Networks | 586 // Wifi Networks |
561 bool wifi_available = cros->wifi_available(); | 587 bool wifi_available = cros->wifi_available(); |
(...skipping 15 matching lines...) Expand all Loading... |
577 } | 603 } |
578 | 604 |
579 // First add a separator if necessary. | 605 // First add a separator if necessary. |
580 if (!separator_added) { | 606 if (!separator_added) { |
581 separator_added = true; | 607 separator_added = true; |
582 if (!menu_items_.empty()) { // Don't add if first menu item. | 608 if (!menu_items_.empty()) { // Don't add if first menu item. |
583 menu_items_.push_back(MenuItem()); // Separator | 609 menu_items_.push_back(MenuItem()); // Separator |
584 } | 610 } |
585 } | 611 } |
586 | 612 |
587 SkBitmap icon = IconForNetworkStrength(wifi_networks[i], true); | 613 const SkBitmap* icon = IconForNetworkStrength(wifi_networks[i], true); |
588 SkBitmap badge = wifi_networks[i]->encrypted() ? | 614 const SkBitmap* badge = wifi_networks[i]->encrypted() ? |
589 *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_SECURE) : SkBitmap(); | 615 rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_SECURE) : NULL; |
590 int flag = FLAG_WIFI; | 616 int flag = FLAG_WIFI; |
591 if (!wifi_networks[i]->connectable()) | 617 if (!wifi_networks[i]->connectable()) |
592 flag |= FLAG_DISABLED; | 618 flag |= FLAG_DISABLED; |
593 if (active_wifi | 619 if (active_wifi |
594 && wifi_networks[i]->service_path() == active_wifi->service_path()) | 620 && wifi_networks[i]->service_path() == active_wifi->service_path()) |
595 flag |= FLAG_ASSOCIATED; | 621 flag |= FLAG_ASSOCIATED; |
596 menu_items_.push_back( | 622 menu_items_.push_back( |
597 MenuItem(ui::MenuModel::TYPE_COMMAND, label, | 623 MenuItem(ui::MenuModel::TYPE_COMMAND, label, |
598 IconForDisplay(icon, badge), | 624 IconForDisplay(icon, badge), |
599 wifi_networks[i]->service_path(), flag)); | 625 wifi_networks[i]->service_path(), flag)); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 } | 663 } |
638 | 664 |
639 // First add a separator if necessary. | 665 // First add a separator if necessary. |
640 if (!separator_added) { | 666 if (!separator_added) { |
641 separator_added = true; | 667 separator_added = true; |
642 if (!menu_items_.empty()) { // Don't add if first menu item. | 668 if (!menu_items_.empty()) { // Don't add if first menu item. |
643 menu_items_.push_back(MenuItem()); // Separator | 669 menu_items_.push_back(MenuItem()); // Separator |
644 } | 670 } |
645 } | 671 } |
646 | 672 |
647 SkBitmap icon = IconForNetworkStrength(cell_networks[i], true); | 673 const SkBitmap* icon = IconForNetworkStrength(cell_networks[i], true); |
648 SkBitmap badge = BadgeForNetworkTechnology(cell_networks[i]); | 674 const SkBitmap* badge = BadgeForNetworkTechnology(cell_networks[i]); |
649 int flag = FLAG_CELLULAR; | 675 int flag = FLAG_CELLULAR; |
650 if (!cell_networks[i]->connectable()) | 676 if (!cell_networks[i]->connectable()) |
651 flag |= FLAG_DISABLED; | 677 flag |= FLAG_DISABLED; |
652 bool isActive = active_cellular && | 678 bool isActive = active_cellular && |
653 cell_networks[i]->service_path() == active_cellular->service_path() && | 679 cell_networks[i]->service_path() == active_cellular->service_path() && |
654 (cell_networks[i]->connecting() || cell_networks[i]->connected()); | 680 (cell_networks[i]->connecting() || cell_networks[i]->connected()); |
655 if (isActive) | 681 if (isActive) |
656 flag |= FLAG_ASSOCIATED; | 682 flag |= FLAG_ASSOCIATED; |
657 menu_items_.push_back( | 683 menu_items_.push_back( |
658 MenuItem(ui::MenuModel::TYPE_COMMAND, label, | 684 MenuItem(ui::MenuModel::TYPE_COMMAND, label, |
(...skipping 26 matching lines...) Expand all Loading... |
685 menu_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND, label, | 711 menu_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND, label, |
686 SkBitmap(), std::string(), FLAG_DISABLED)); | 712 SkBitmap(), std::string(), FLAG_DISABLED)); |
687 } | 713 } |
688 | 714 |
689 // Add network. | 715 // Add network. |
690 if (wifi_available && wifi_enabled) { | 716 if (wifi_available && wifi_enabled) { |
691 menu_items_.push_back(MenuItem()); // Separator | 717 menu_items_.push_back(MenuItem()); // Separator |
692 menu_items_.push_back(MenuItem( | 718 menu_items_.push_back(MenuItem( |
693 ui::MenuModel::TYPE_COMMAND, | 719 ui::MenuModel::TYPE_COMMAND, |
694 l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_OTHER_NETWORKS), | 720 l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_OTHER_NETWORKS), |
695 IconForDisplay(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0_BLACK), | 721 *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0_BLACK), |
696 SkBitmap()), | |
697 std::string(), FLAG_OTHER_NETWORK)); | 722 std::string(), FLAG_OTHER_NETWORK)); |
698 } | 723 } |
699 | 724 |
700 // Enable / disable wireless. | 725 // Enable / disable wireless. |
701 if (wifi_available || cellular_available) { | 726 if (wifi_available || cellular_available) { |
702 menu_items_.push_back(MenuItem()); // Separator | 727 menu_items_.push_back(MenuItem()); // Separator |
703 | 728 |
704 if (wifi_available) { | 729 if (wifi_available) { |
705 // Add 'Scanning...' | 730 // Add 'Scanning...' |
706 if (cros->wifi_scanning()) { | 731 if (cros->wifi_scanning()) { |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 chrome::kInternetOptionsSubPage, | 822 chrome::kInternetOptionsSubPage, |
798 chromeos::TYPE_WIFI); | 823 chromeos::TYPE_WIFI); |
799 browser->ShowOptionsTab(page); | 824 browser->ShowOptionsTab(page); |
800 } | 825 } |
801 } else { | 826 } else { |
802 ShowNetworkConfigView(new NetworkConfigView()); | 827 ShowNetworkConfigView(new NetworkConfigView()); |
803 } | 828 } |
804 } | 829 } |
805 | 830 |
806 } // namespace chromeos | 831 } // namespace chromeos |
OLD | NEW |