diff options
Diffstat (limited to 'chromium/ash/system/chromeos/network/tray_vpn.cc')
-rw-r--r-- | chromium/ash/system/chromeos/network/tray_vpn.cc | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/chromium/ash/system/chromeos/network/tray_vpn.cc b/chromium/ash/system/chromeos/network/tray_vpn.cc new file mode 100644 index 00000000000..31c6d6a76cc --- /dev/null +++ b/chromium/ash/system/chromeos/network/tray_vpn.cc @@ -0,0 +1,182 @@ +// Copyright (c) 2012 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 "ash/system/chromeos/network/tray_vpn.h" + +#include "ash/shell.h" +#include "ash/system/chromeos/network/network_icon_animation.h" +#include "ash/system/chromeos/network/network_state_list_detailed_view.h" +#include "ash/system/tray/system_tray.h" +#include "ash/system/tray/system_tray_delegate.h" +#include "ash/system/tray/system_tray_notifier.h" +#include "ash/system/tray/tray_constants.h" +#include "ash/system/tray/tray_item_more.h" +#include "ash/system/tray/tray_popup_label_button.h" +#include "chromeos/network/network_state.h" +#include "chromeos/network/network_state_handler.h" +#include "grit/ash_strings.h" +#include "third_party/cros_system_api/dbus/service_constants.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/resource/resource_bundle.h" + +using chromeos::NetworkHandler; +using chromeos::NetworkState; +using chromeos::NetworkStateHandler; + +namespace ash { +namespace internal { + +namespace tray { + +class VpnDefaultView : public TrayItemMore, + public network_icon::AnimationObserver { + public: + VpnDefaultView(SystemTrayItem* owner, bool show_more) + : TrayItemMore(owner, show_more) { + Update(); + } + + virtual ~VpnDefaultView() { + network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); + } + + static bool ShouldShow() { + // Do not show VPN line in uber tray bubble if VPN is not configured. + NetworkStateHandler* handler = + NetworkHandler::Get()->network_state_handler(); + const NetworkState* vpn = handler->FirstNetworkByType(flimflam::kTypeVPN); + return vpn != NULL; + } + + void Update() { + gfx::ImageSkia image; + base::string16 label; + bool animating = false; + GetNetworkStateHandlerImageAndLabel(&image, &label, &animating); + if (animating) + network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this); + else + network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); + SetImage(&image); + SetLabel(label); + SetAccessibleName(label); + } + + // network_icon::AnimationObserver + virtual void NetworkIconChanged() OVERRIDE { + Update(); + } + + private: + void GetNetworkStateHandlerImageAndLabel(gfx::ImageSkia* image, + base::string16* label, + bool* animating) { + NetworkStateHandler* handler = + NetworkHandler::Get()->network_state_handler(); + const NetworkState* vpn = handler->FirstNetworkByType( + flimflam::kTypeVPN); + if (!vpn || (vpn->connection_state() == flimflam::kStateIdle)) { + *image = network_icon::GetImageForDisconnectedNetwork( + network_icon::ICON_TYPE_DEFAULT_VIEW, flimflam::kTypeVPN); + if (label) { + *label = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_VPN_DISCONNECTED); + } + *animating = false; + return; + } + *animating = vpn->IsConnectingState(); + *image = network_icon::GetImageForNetwork( + vpn, network_icon::ICON_TYPE_DEFAULT_VIEW); + if (label) { + *label = network_icon::GetLabelForNetwork( + vpn, network_icon::ICON_TYPE_DEFAULT_VIEW); + } + } + + DISALLOW_COPY_AND_ASSIGN(VpnDefaultView); +}; + +} // namespace tray + +TrayVPN::TrayVPN(SystemTray* system_tray) + : SystemTrayItem(system_tray), + default_(NULL), + detailed_(NULL) { + network_state_observer_.reset(new TrayNetworkStateObserver(this)); +} + +TrayVPN::~TrayVPN() { +} + +views::View* TrayVPN::CreateTrayView(user::LoginStatus status) { + return NULL; +} + +views::View* TrayVPN::CreateDefaultView(user::LoginStatus status) { + CHECK(default_ == NULL); + if (!chromeos::NetworkHandler::IsInitialized()) + return NULL; + if (status == user::LOGGED_IN_NONE) + return NULL; + if (!tray::VpnDefaultView::ShouldShow()) + return NULL; + + default_ = new tray::VpnDefaultView(this, status != user::LOGGED_IN_LOCKED); + return default_; +} + +views::View* TrayVPN::CreateDetailedView(user::LoginStatus status) { + CHECK(detailed_ == NULL); + if (!chromeos::NetworkHandler::IsInitialized()) + return NULL; + + detailed_ = new tray::NetworkStateListDetailedView( + this, tray::NetworkStateListDetailedView::LIST_TYPE_VPN, status); + detailed_->Init(); + return detailed_; +} + +views::View* TrayVPN::CreateNotificationView(user::LoginStatus status) { + return NULL; +} + +void TrayVPN::DestroyTrayView() { +} + +void TrayVPN::DestroyDefaultView() { + default_ = NULL; +} + +void TrayVPN::DestroyDetailedView() { + detailed_ = NULL; +} + +void TrayVPN::DestroyNotificationView() { +} + +void TrayVPN::UpdateAfterLoginStatusChange(user::LoginStatus status) { +} + +void TrayVPN::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { +} + +void TrayVPN::NetworkStateChanged(bool list_changed) { + if (default_) + default_->Update(); + if (detailed_) { + if (list_changed) + detailed_->NetworkListChanged(); + else + detailed_->ManagerChanged(); + } +} + +void TrayVPN::NetworkServiceChanged(const chromeos::NetworkState* network) { + if (detailed_) + detailed_->NetworkServiceChanged(network); +} + +} // namespace internal +} // namespace ash |