tray_vpn.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/chromeos/network/tray_vpn.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/metrics/user_metrics_recorder.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_state_list_detailed_view.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_more.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state_handler.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "grit/ui_chromeos_strings.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/chromeos/network/network_icon.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/chromeos/network/network_icon_animation.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using chromeos::NetworkHandler;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkState;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkStateHandler;
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using chromeos::NetworkTypePattern;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VpnDefaultView : public TrayItemMore,
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       public ui::network_icon::AnimationObserver {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VpnDefaultView(SystemTrayItem* owner, bool show_more)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TrayItemMore(owner, show_more) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Update();
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~VpnDefaultView() {
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ui::network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool ShouldShow() {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Do not show VPN line in uber tray bubble if VPN is not configured.
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NetworkStateHandler* handler =
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        NetworkHandler::Get()->network_state_handler();
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const NetworkState* vpn =
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->FirstNetworkByType(NetworkTypePattern::VPN());
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return vpn != NULL;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Update() {
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gfx::ImageSkia image;
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::string16 label;
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool animating = false;
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GetNetworkStateHandlerImageAndLabel(&image, &label, &animating);
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (animating)
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui::network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this);
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    else
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui::network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          this);
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetImage(&image);
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetLabel(label);
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetAccessibleName(label);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // ui::network_icon::AnimationObserver
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NetworkIconChanged() OVERRIDE {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Update();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GetNetworkStateHandlerImageAndLabel(gfx::ImageSkia* image,
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::string16* label,
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           bool* animating) {
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NetworkStateHandler* handler =
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        NetworkHandler::Get()->network_state_handler();
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const NetworkState* vpn =
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->FirstNetworkByType(NetworkTypePattern::VPN());
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!vpn || (vpn->connection_state() == shill::kStateIdle)) {
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      *image = ui::network_icon::GetImageForDisconnectedNetwork(
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ui::network_icon::ICON_TYPE_DEFAULT_VIEW, shill::kTypeVPN);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (label) {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *label = l10n_util::GetStringUTF16(
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_ASH_STATUS_TRAY_VPN_DISCONNECTED);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *animating = false;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *animating = vpn->IsConnectingState();
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *image = ui::network_icon::GetImageForNetwork(
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        vpn, ui::network_icon::ICON_TYPE_DEFAULT_VIEW);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (label) {
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      *label = ui::network_icon::GetLabelForNetwork(
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          vpn, ui::network_icon::ICON_TYPE_DEFAULT_VIEW);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VpnDefaultView);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayVPN::TrayVPN(SystemTray* system_tray)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_(NULL),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_(NULL) {
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  network_state_observer_.reset(new TrayNetworkStateObserver(this));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayVPN::~TrayVPN() {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayVPN::CreateTrayView(user::LoginStatus status) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayVPN::CreateDefaultView(user::LoginStatus status) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(default_ == NULL);
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!chromeos::NetworkHandler::IsInitialized())
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == user::LOGGED_IN_NONE)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tray::VpnDefaultView::ShouldShow())
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = new tray::VpnDefaultView(this, status != user::LOGGED_IN_LOCKED);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayVPN::CreateDetailedView(user::LoginStatus status) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(detailed_ == NULL);
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!chromeos::NetworkHandler::IsInitialized())
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Shell::GetInstance()->metrics()->RecordUserMetricsAction(
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ash::UMA_STATUS_AREA_DETAILED_VPN_VIEW);
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  detailed_ = new tray::NetworkStateListDetailedView(
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      this, tray::NetworkStateListDetailedView::LIST_TYPE_VPN, status);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_->Init();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return detailed_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyTrayView() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyDefaultView() {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = NULL;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyDetailedView() {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_ = NULL;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::UpdateAfterLoginStatusChange(user::LoginStatus status) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayVPN::NetworkStateChanged(bool list_changed) {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (default_)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_->Update();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (detailed_) {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (list_changed)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_->NetworkListChanged();
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_->ManagerChanged();
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayVPN::NetworkServiceChanged(const chromeos::NetworkState* network) {
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (detailed_)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_->NetworkServiceChanged(network);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
180