Home | History | Annotate | Download | only in status
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chromeos/status/network_dropdown_button.h"
      6 
      7 #include "base/utf_string_conversions.h"
      8 #include "chrome/browser/chromeos/cros/cros_library.h"
      9 #include "chrome/browser/chromeos/options/network_config_view.h"
     10 #include "chrome/browser/chromeos/status/status_area_host.h"
     11 #include "grit/generated_resources.h"
     12 #include "grit/theme_resources.h"
     13 #include "ui/base/l10n/l10n_util.h"
     14 #include "ui/base/resource/resource_bundle.h"
     15 #include "ui/gfx/canvas_skia.h"
     16 #include "views/window/window.h"
     17 
     18 namespace chromeos {
     19 
     20 ////////////////////////////////////////////////////////////////////////////////
     21 // NetworkDropdownButton
     22 
     23 // static
     24 const int NetworkDropdownButton::kThrobDuration = 750;
     25 
     26 NetworkDropdownButton::NetworkDropdownButton(bool browser_mode,
     27                                              gfx::NativeWindow parent_window)
     28     : DropDownButton(NULL,
     29                      UTF16ToWide(l10n_util::GetStringUTF16(
     30                          IDS_STATUSBAR_NO_NETWORKS_MESSAGE)),
     31                      this,
     32                      true),
     33       browser_mode_(browser_mode),
     34       ALLOW_THIS_IN_INITIALIZER_LIST(animation_connecting_(this)),
     35       parent_window_(parent_window) {
     36   animation_connecting_.SetThrobDuration(kThrobDuration);
     37   animation_connecting_.SetTweenType(ui::Tween::LINEAR);
     38   CrosLibrary::Get()->GetNetworkLibrary()->AddNetworkManagerObserver(this);
     39   // The initial state will be updated on Refresh.
     40   // See network_selection_view.cc.
     41 }
     42 
     43 NetworkDropdownButton::~NetworkDropdownButton() {
     44   CrosLibrary::Get()->GetNetworkLibrary()->RemoveNetworkManagerObserver(this);
     45 }
     46 
     47 ////////////////////////////////////////////////////////////////////////////////
     48 // NetworkMenuButton, ui::AnimationDelegate implementation:
     49 
     50 void NetworkDropdownButton::AnimationProgressed(
     51     const ui::Animation* animation) {
     52   if (animation == &animation_connecting_) {
     53     SetIcon(*IconForNetworkConnecting(animation_connecting_.GetCurrentValue(),
     54                                       true));
     55     SchedulePaint();
     56   } else {
     57     MenuButton::AnimationProgressed(animation);
     58   }
     59 }
     60 
     61 void NetworkDropdownButton::Refresh() {
     62   OnNetworkManagerChanged(CrosLibrary::Get()->GetNetworkLibrary());
     63 }
     64 
     65 ////////////////////////////////////////////////////////////////////////////////
     66 // NetworkDropdownButton, NetworkLibrary::NetworkManagerObserver implementation:
     67 
     68 void NetworkDropdownButton::OnNetworkManagerChanged(NetworkLibrary* cros) {
     69   // Show network that we will actually use. It could be another network than
     70   // user selected. For example user selected WiFi network but we have Ethernet
     71   // connection and Chrome OS device will actually use Ethernet.
     72 
     73   // This gets called on initialization, so any changes should be reflected
     74   // in CrosMock::SetNetworkLibraryStatusAreaExpectations().
     75 
     76   ResourceBundle& rb = ResourceBundle::GetSharedInstance();
     77   if (CrosLibrary::Get()->EnsureLoaded()) {
     78     // Always show the active network, if any
     79     const Network* active_network = cros->active_network();
     80     if (active_network != NULL) {
     81       animation_connecting_.Stop();
     82       if (active_network->type() == TYPE_ETHERNET) {
     83         SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WIRED));
     84         SetText(UTF16ToWide(
     85             l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET)));
     86       } else if (active_network->type() == TYPE_WIFI) {
     87         const WifiNetwork* wifi =
     88             static_cast<const WifiNetwork*>(active_network);
     89         SetIcon(*IconForNetworkStrength(wifi, true));
     90         SetText(UTF8ToWide(wifi->name()));
     91       } else if (active_network->type() == TYPE_CELLULAR) {
     92         const CellularNetwork* cellular =
     93             static_cast<const CellularNetwork*>(active_network);
     94         SetIcon(*IconForNetworkStrength(cellular, true));
     95         SetText(UTF8ToWide(cellular->name()));
     96       } else {
     97         NOTREACHED();
     98       }
     99     } else if (cros->wifi_connecting() || cros->cellular_connecting()) {
    100       if (!animation_connecting_.is_animating()) {
    101         animation_connecting_.Reset();
    102         animation_connecting_.StartThrobbing(-1);
    103         SetIcon(*IconForNetworkConnecting(0, true));
    104       }
    105       if (cros->wifi_connecting())
    106         SetText(UTF8ToWide(cros->wifi_network()->name()));
    107       else if (cros->cellular_connecting())
    108         SetText(UTF8ToWide(cros->cellular_network()->name()));
    109     }
    110 
    111     if (!cros->Connected() && !cros->Connecting()) {
    112       animation_connecting_.Stop();
    113       SetIcon(SkBitmap());
    114       SetText(UTF16ToWide(
    115           l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_NONE)));
    116     }
    117   } else {
    118     animation_connecting_.Stop();
    119     SetIcon(SkBitmap());
    120     SetText(UTF16ToWide(
    121         l10n_util::GetStringUTF16(IDS_STATUSBAR_NO_NETWORKS_MESSAGE)));
    122   }
    123 
    124   SchedulePaint();
    125   UpdateMenu();
    126 }
    127 
    128 }  // namespace chromeos
    129