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