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