// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/status/network_dropdown_button.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/options/network_config_view.h"
#include "chrome/browser/chromeos/status/status_area_host.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas_skia.h"
#include "views/window/window.h"
namespace chromeos {
////////////////////////////////////////////////////////////////////////////////
// NetworkDropdownButton
// static
const int NetworkDropdownButton::kThrobDuration = 750;
NetworkDropdownButton::NetworkDropdownButton(bool browser_mode,
gfx::NativeWindow parent_window)
: DropDownButton(NULL,
UTF16ToWide(l10n_util::GetStringUTF16(
IDS_STATUSBAR_NO_NETWORKS_MESSAGE)),
this,
true),
browser_mode_(browser_mode),
ALLOW_THIS_IN_INITIALIZER_LIST(animation_connecting_(this)),
parent_window_(parent_window) {
animation_connecting_.SetThrobDuration(kThrobDuration);
animation_connecting_.SetTweenType(ui::Tween::LINEAR);
CrosLibrary::Get()->GetNetworkLibrary()->AddNetworkManagerObserver(this);
// The initial state will be updated on Refresh.
// See network_selection_view.cc.
}
NetworkDropdownButton::~NetworkDropdownButton() {
CrosLibrary::Get()->GetNetworkLibrary()->RemoveNetworkManagerObserver(this);
}
////////////////////////////////////////////////////////////////////////////////
// NetworkMenuButton, ui::AnimationDelegate implementation:
void NetworkDropdownButton::AnimationProgressed(
const ui::Animation* animation) {
if (animation == &animation_connecting_) {
SetIcon(*IconForNetworkConnecting(animation_connecting_.GetCurrentValue(),
true));
SchedulePaint();
} else {
MenuButton::AnimationProgressed(animation);
}
}
void NetworkDropdownButton::Refresh() {
OnNetworkManagerChanged(CrosLibrary::Get()->GetNetworkLibrary());
}
////////////////////////////////////////////////////////////////////////////////
// NetworkDropdownButton, NetworkLibrary::NetworkManagerObserver implementation:
void NetworkDropdownButton::OnNetworkManagerChanged(NetworkLibrary* cros) {
// Show network that we will actually use. It could be another network than
// user selected. For example user selected WiFi network but we have Ethernet
// connection and Chrome OS device will actually use Ethernet.
// This gets called on initialization, so any changes should be reflected
// in CrosMock::SetNetworkLibraryStatusAreaExpectations().
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
if (CrosLibrary::Get()->EnsureLoaded()) {
// Always show the active network, if any
const Network* active_network = cros->active_network();
if (active_network != NULL) {
animation_connecting_.Stop();
if (active_network->type() == TYPE_ETHERNET) {
SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WIRED));
SetText(UTF16ToWide(
l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET)));
} else if (active_network->type() == TYPE_WIFI) {
const WifiNetwork* wifi =
static_cast<const WifiNetwork*>(active_network);
SetIcon(*IconForNetworkStrength(wifi, true));
SetText(UTF8ToWide(wifi->name()));
} else if (active_network->type() == TYPE_CELLULAR) {
const CellularNetwork* cellular =
static_cast<const CellularNetwork*>(active_network);
SetIcon(*IconForNetworkStrength(cellular, true));
SetText(UTF8ToWide(cellular->name()));
} else {
NOTREACHED();
}
} else if (cros->wifi_connecting() || cros->cellular_connecting()) {
if (!animation_connecting_.is_animating()) {
animation_connecting_.Reset();
animation_connecting_.StartThrobbing(-1);
SetIcon(*IconForNetworkConnecting(0, true));
}
if (cros->wifi_connecting())
SetText(UTF8ToWide(cros->wifi_network()->name()));
else if (cros->cellular_connecting())
SetText(UTF8ToWide(cros->cellular_network()->name()));
}
if (!cros->Connected() && !cros->Connecting()) {
animation_connecting_.Stop();
SetIcon(SkBitmap());
SetText(UTF16ToWide(
l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_NONE)));
}
} else {
animation_connecting_.Stop();
SetIcon(SkBitmap());
SetText(UTF16ToWide(
l10n_util::GetStringUTF16(IDS_STATUSBAR_NO_NETWORKS_MESSAGE)));
}
SchedulePaint();
UpdateMenu();
}
} // namespace chromeos