summaryrefslogtreecommitdiff
path: root/chromium/ash/system/chromeos/network/tray_vpn.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/system/chromeos/network/tray_vpn.cc')
-rw-r--r--chromium/ash/system/chromeos/network/tray_vpn.cc182
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