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
NetworkDropdownButton(bool browser_mode,gfx::NativeWindow parent_window)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
~NetworkDropdownButton()43 NetworkDropdownButton::~NetworkDropdownButton() {
44 CrosLibrary::Get()->GetNetworkLibrary()->RemoveNetworkManagerObserver(this);
45 }
46
47 ////////////////////////////////////////////////////////////////////////////////
48 // NetworkMenuButton, ui::AnimationDelegate implementation:
49
AnimationProgressed(const ui::Animation * animation)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
Refresh()61 void NetworkDropdownButton::Refresh() {
62 OnNetworkManagerChanged(CrosLibrary::Get()->GetNetworkLibrary());
63 }
64
65 ////////////////////////////////////////////////////////////////////////////////
66 // NetworkDropdownButton, NetworkLibrary::NetworkManagerObserver implementation:
67
OnNetworkManagerChanged(NetworkLibrary * cros)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