1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/status/network_dropdown_button.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h"
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h"
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/options/network_config_view.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/status/status_area_host.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/theme_resources.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas_skia.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/window/window.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace chromeos {
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// NetworkDropdownButton
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int NetworkDropdownButton::kThrobDuration = 750;
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenNetworkDropdownButton::NetworkDropdownButton(bool browser_mode,
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                             gfx::NativeWindow parent_window)
284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    : DropDownButton(NULL,
293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                     UTF16ToWide(l10n_util::GetStringUTF16(
303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                         IDS_STATUSBAR_NO_NETWORKS_MESSAGE)),
314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                     this,
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                     true),
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      browser_mode_(browser_mode),
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ALLOW_THIS_IN_INITIALIZER_LIST(animation_connecting_(this)),
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      parent_window_(parent_window) {
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  animation_connecting_.SetThrobDuration(kThrobDuration);
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  animation_connecting_.SetTweenType(ui::Tween::LINEAR);
38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CrosLibrary::Get()->GetNetworkLibrary()->AddNetworkManagerObserver(this);
39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The initial state will be updated on Refresh.
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // See network_selection_view.cc.
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenNetworkDropdownButton::~NetworkDropdownButton() {
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CrosLibrary::Get()->GetNetworkLibrary()->RemoveNetworkManagerObserver(this);
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick////////////////////////////////////////////////////////////////////////////////
483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// NetworkMenuButton, ui::AnimationDelegate implementation:
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenvoid NetworkDropdownButton::AnimationProgressed(
513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    const ui::Animation* animation) {
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (animation == &animation_connecting_) {
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    SetIcon(*IconForNetworkConnecting(animation_connecting_.GetCurrentValue(),
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      true));
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SchedulePaint();
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  } else {
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MenuButton::AnimationProgressed(animation);
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid NetworkDropdownButton::Refresh() {
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  OnNetworkManagerChanged(CrosLibrary::Get()->GetNetworkLibrary());
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// NetworkDropdownButton, NetworkLibrary::NetworkManagerObserver implementation:
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid NetworkDropdownButton::OnNetworkManagerChanged(NetworkLibrary* cros) {
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Show network that we will actually use. It could be another network than
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // user selected. For example user selected WiFi network but we have Ethernet
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // connection and Chrome OS device will actually use Ethernet.
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This gets called on initialization, so any changes should be reflected
74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // in CrosMock::SetNetworkLibraryStatusAreaExpectations().
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (CrosLibrary::Get()->EnsureLoaded()) {
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Always show the active network, if any
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const Network* active_network = cros->active_network();
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (active_network != NULL) {
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      animation_connecting_.Stop();
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (active_network->type() == TYPE_ETHERNET) {
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WIRED));
843f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        SetText(UTF16ToWide(
853f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET)));
8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      } else if (active_network->type() == TYPE_WIFI) {
8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        const WifiNetwork* wifi =
8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            static_cast<const WifiNetwork*>(active_network);
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        SetIcon(*IconForNetworkStrength(wifi, true));
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        SetText(UTF8ToWide(wifi->name()));
9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      } else if (active_network->type() == TYPE_CELLULAR) {
9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        const CellularNetwork* cellular =
9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            static_cast<const CellularNetwork*>(active_network);
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        SetIcon(*IconForNetworkStrength(cellular, true));
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        SetText(UTF8ToWide(cellular->name()));
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      } else {
9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        NOTREACHED();
98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    } else if (cros->wifi_connecting() || cros->cellular_connecting()) {
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      if (!animation_connecting_.is_animating()) {
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        animation_connecting_.Reset();
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        animation_connecting_.StartThrobbing(-1);
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        SetIcon(*IconForNetworkConnecting(0, true));
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      }
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      if (cros->wifi_connecting())
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        SetText(UTF8ToWide(cros->wifi_network()->name()));
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      else if (cros->cellular_connecting())
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        SetText(UTF8ToWide(cros->cellular_network()->name()));
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (!cros->Connected() && !cros->Connecting()) {
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      animation_connecting_.Stop();
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      SetIcon(SkBitmap());
1143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      SetText(UTF16ToWide(
1153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_NONE)));
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    animation_connecting_.Stop();
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    SetIcon(SkBitmap());
1203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    SetText(UTF16ToWide(
1213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        l10n_util::GetStringUTF16(IDS_STATUSBAR_NO_NETWORKS_MESSAGE)));
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SchedulePaint();
125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  UpdateMenu();
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace chromeos
129