tray_vpn.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ash/session/session_state_delegate.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_state_list_detailed_view.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_more.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state_handler.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "grit/ui_chromeos_strings.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.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) 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool userAddingRunning = ash::Shell::GetInstance() 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ->session_state_delegate() 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ->IsInSecondaryLoginScreen(); 1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) default_ = new tray::VpnDefaultView( 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) this, status != user::LOGGED_IN_LOCKED && !userAddingRunning); 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayVPN::CreateDetailedView(user::LoginStatus status) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(detailed_ == NULL); 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!chromeos::NetworkHandler::IsInitialized()) 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return NULL; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_DETAILED_VPN_VIEW); 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) detailed_ = new tray::NetworkStateListDetailedView( 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this, tray::NetworkStateListDetailedView::LIST_TYPE_VPN, status); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_->Init(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return detailed_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyTrayView() { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyDefaultView() { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_ = NULL; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::DestroyDetailedView() { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_ = NULL; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::UpdateAfterLoginStatusChange(user::LoginStatus status) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayVPN::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayVPN::NetworkStateChanged(bool list_changed) { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (default_) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_->Update(); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (detailed_) { 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (list_changed) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_->NetworkListChanged(); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_->ManagerChanged(); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayVPN::NetworkServiceChanged(const chromeos::NetworkState* network) { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (detailed_) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_->NetworkServiceChanged(network); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 186