tray_vpn.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_icon_animation.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"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/network/shill_property_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_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"
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 internal {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VpnDefaultView : public TrayItemMore,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       public 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() {
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    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)
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this);
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    else
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetImage(&image);
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetLabel(label);
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetAccessibleName(label);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // network_icon::AnimationObserver
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NetworkIconChanged() OVERRIDE {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Update();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GetNetworkStateHandlerImageAndLabel(gfx::ImageSkia* image,
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::string16* label,
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           bool* animating) {
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NetworkStateHandler* handler =
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        NetworkHandler::Get()->network_state_handler();
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const NetworkState* vpn =
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->FirstNetworkByType(NetworkTypePattern::VPN());
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!vpn || (vpn->connection_state() == shill::kStateIdle)) {
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *image = network_icon::GetImageForDisconnectedNetwork(
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          network_icon::ICON_TYPE_DEFAULT_VIEW, shill::kTypeVPN);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (label) {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *label = l10n_util::GetStringUTF16(
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_ASH_STATUS_TRAY_VPN_DISCONNECTED);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *animating = false;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *animating = vpn->IsConnectingState();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *image = network_icon::GetImageForNetwork(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        vpn, network_icon::ICON_TYPE_DEFAULT_VIEW);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (label) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *label = network_icon::GetLabelForNetwork(
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          vpn, network_icon::ICON_TYPE_DEFAULT_VIEW);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VpnDefaultView);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayVPN::TrayVPN(SystemTray* system_tray)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : SystemTrayItem(system_tray),
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_(NULL),
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_(NULL) {
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  network_state_observer_.reset(new TrayNetworkStateObserver(this));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayVPN::~TrayVPN() {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayVPN::CreateTrayView(user::LoginStatus status) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayVPN::CreateDefaultView(user::LoginStatus status) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(default_ == NULL);
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!chromeos::NetworkHandler::IsInitialized())
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == user::LOGGED_IN_NONE)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!tray::VpnDefaultView::ShouldShow())
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = new tray::VpnDefaultView(this, status != user::LOGGED_IN_LOCKED);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayVPN::CreateDetailedView(user::LoginStatus status) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(detailed_ == NULL);
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!chromeos::NetworkHandler::IsInitialized())
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return NULL;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  detailed_ = new tray::NetworkStateListDetailedView(
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      this, tray::NetworkStateListDetailedView::LIST_TYPE_VPN, status);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_->Init();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return detailed_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyTrayView() {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyDefaultView() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = NULL;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyDetailedView() {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_ = NULL;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::UpdateAfterLoginStatusChange(user::LoginStatus status) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayVPN::NetworkStateChanged(bool list_changed) {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (default_)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_->Update();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (detailed_) {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (list_changed)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_->NetworkListChanged();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_->ManagerChanged();
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayVPN::NetworkServiceChanged(const chromeos::NetworkState* network) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (detailed_)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_->NetworkServiceChanged(network);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
178