tray_vpn.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/chromeos/network/network_icon_animation.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using chromeos::NetworkHandler;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkState;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkStateHandler;
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using chromeos::NetworkTypePattern;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VpnDefaultView : public TrayItemMore,
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       public ui::network_icon::AnimationObserver {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VpnDefaultView(SystemTrayItem* owner, bool show_more)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TrayItemMore(owner, show_more) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Update();
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~VpnDefaultView() {
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ui::network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool ShouldShow() {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Do not show VPN line in uber tray bubble if VPN is not configured.
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NetworkStateHandler* handler =
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        NetworkHandler::Get()->network_state_handler();
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const NetworkState* vpn =
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->FirstNetworkByType(NetworkTypePattern::VPN());
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return vpn != NULL;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Update() {
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gfx::ImageSkia image;
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::string16 label;
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool animating = false;
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GetNetworkStateHandlerImageAndLabel(&image, &label, &animating);
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (animating)
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui::network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this);
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    else
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui::network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          this);
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetImage(&image);
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetLabel(label);
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetAccessibleName(label);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // ui::network_icon::AnimationObserver
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NetworkIconChanged() OVERRIDE {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Update();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GetNetworkStateHandlerImageAndLabel(gfx::ImageSkia* image,
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::string16* label,
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           bool* animating) {
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NetworkStateHandler* handler =
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        NetworkHandler::Get()->network_state_handler();
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const NetworkState* vpn =
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->FirstNetworkByType(NetworkTypePattern::VPN());
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!vpn || (vpn->connection_state() == shill::kStateIdle)) {
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      *image = ui::network_icon::GetImageForDisconnectedNetwork(
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ui::network_icon::ICON_TYPE_DEFAULT_VIEW, shill::kTypeVPN);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (label) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *label = l10n_util::GetStringUTF16(
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_ASH_STATUS_TRAY_VPN_DISCONNECTED);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *animating = false;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *animating = vpn->IsConnectingState();
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *image = ui::network_icon::GetImageForNetwork(
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        vpn, ui::network_icon::ICON_TYPE_DEFAULT_VIEW);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (label) {
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      *label = ui::network_icon::GetLabelForNetwork(
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          vpn, ui::network_icon::ICON_TYPE_DEFAULT_VIEW);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VpnDefaultView);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayVPN::TrayVPN(SystemTray* system_tray)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_(NULL),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_(NULL) {
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  network_state_observer_.reset(new TrayNetworkStateObserver(this));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayVPN::~TrayVPN() {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayVPN::CreateTrayView(user::LoginStatus status) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayVPN::CreateDefaultView(user::LoginStatus status) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(default_ == NULL);
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!chromeos::NetworkHandler::IsInitialized())
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == user::LOGGED_IN_NONE)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tray::VpnDefaultView::ShouldShow())
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = new tray::VpnDefaultView(this, status != user::LOGGED_IN_LOCKED);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayVPN::CreateDetailedView(user::LoginStatus status) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(detailed_ == NULL);
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!chromeos::NetworkHandler::IsInitialized())
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Shell::GetInstance()->metrics()->RecordUserMetricsAction(
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ash::UMA_STATUS_AREA_DETAILED_VPN_VIEW);
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  detailed_ = new tray::NetworkStateListDetailedView(
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      this, tray::NetworkStateListDetailedView::LIST_TYPE_VPN, status);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_->Init();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return detailed_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyTrayView() {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyDefaultView() {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = NULL;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyDetailedView() {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_ = NULL;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::UpdateAfterLoginStatusChange(user::LoginStatus status) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayVPN::NetworkStateChanged(bool list_changed) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (default_)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_->Update();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (detailed_) {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (list_changed)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_->NetworkListChanged();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_->ManagerChanged();
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayVPN::NetworkServiceChanged(const chromeos::NetworkState* network) {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (detailed_)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_->NetworkServiceChanged(network);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
178