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