OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "ash/system/chromeos/network/tray_vpn.h" | |
6 | |
7 #include "ash/common/session/session_state_delegate.h" | |
8 #include "ash/common/system/tray/system_tray_delegate.h" | |
9 #include "ash/common/system/tray/tray_constants.h" | |
10 #include "ash/common/system/tray/tray_item_more.h" | |
11 #include "ash/common/system/tray/tray_popup_label_button.h" | |
12 #include "ash/common/wm_shell.h" | |
13 #include "ash/system/chromeos/network/network_state_list_detailed_view.h" | |
14 #include "ash/system/chromeos/network/vpn_delegate.h" | |
15 #include "ash/system/tray/system_tray.h" | |
16 #include "chromeos/network/network_state.h" | |
17 #include "chromeos/network/network_state_handler.h" | |
18 #include "grit/ash_strings.h" | |
19 #include "grit/ui_chromeos_strings.h" | |
20 #include "third_party/cros_system_api/dbus/service_constants.h" | |
21 #include "ui/base/l10n/l10n_util.h" | |
22 #include "ui/chromeos/network/network_icon.h" | |
23 #include "ui/chromeos/network/network_icon_animation.h" | |
24 #include "ui/chromeos/network/network_icon_animation_observer.h" | |
25 | |
26 using chromeos::NetworkHandler; | |
27 using chromeos::NetworkState; | |
28 using chromeos::NetworkStateHandler; | |
29 using chromeos::NetworkTypePattern; | |
30 | |
31 namespace ash { | |
32 namespace tray { | |
33 | |
34 class VpnDefaultView : public TrayItemMore, | |
35 public ui::network_icon::AnimationObserver { | |
36 public: | |
37 VpnDefaultView(SystemTrayItem* owner, bool show_more) | |
38 : TrayItemMore(owner, show_more) { | |
39 Update(); | |
40 } | |
41 | |
42 ~VpnDefaultView() override { | |
43 ui::network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); | |
44 } | |
45 | |
46 static bool ShouldShow() { | |
47 // Show the VPN entry in the ash tray bubble if at least one third-party VPN | |
48 // provider is installed. | |
49 if (WmShell::Get() | |
50 ->system_tray_delegate() | |
51 ->GetVPNDelegate() | |
52 ->HaveThirdPartyVPNProviders()) { | |
53 return true; | |
54 } | |
55 | |
56 // Also show the VPN entry if at least one VPN network is configured. | |
57 NetworkStateHandler* const handler = | |
58 NetworkHandler::Get()->network_state_handler(); | |
59 if (handler->FirstNetworkByType(NetworkTypePattern::VPN())) | |
60 return true; | |
61 return false; | |
62 } | |
63 | |
64 void Update() { | |
65 gfx::ImageSkia image; | |
66 base::string16 label; | |
67 bool animating = false; | |
68 GetNetworkStateHandlerImageAndLabel(&image, &label, &animating); | |
69 if (animating) | |
70 ui::network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this); | |
71 else | |
72 ui::network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver( | |
73 this); | |
74 SetImage(&image); | |
75 SetLabel(label); | |
76 SetAccessibleName(label); | |
77 } | |
78 | |
79 // ui::network_icon::AnimationObserver | |
80 void NetworkIconChanged() override { Update(); } | |
81 | |
82 private: | |
83 void GetNetworkStateHandlerImageAndLabel(gfx::ImageSkia* image, | |
84 base::string16* label, | |
85 bool* animating) { | |
86 NetworkStateHandler* handler = | |
87 NetworkHandler::Get()->network_state_handler(); | |
88 const NetworkState* vpn = | |
89 handler->FirstNetworkByType(NetworkTypePattern::VPN()); | |
90 if (!vpn || (!vpn->IsConnectedState() && !vpn->IsConnectingState())) { | |
91 *image = ui::network_icon::GetImageForDisconnectedNetwork( | |
92 ui::network_icon::ICON_TYPE_DEFAULT_VIEW, shill::kTypeVPN); | |
93 if (label) { | |
94 *label = | |
95 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_VPN_DISCONNECTED); | |
96 } | |
97 *animating = false; | |
98 return; | |
99 } | |
100 *animating = vpn->IsConnectingState(); | |
101 *image = ui::network_icon::GetImageForNetwork( | |
102 vpn, ui::network_icon::ICON_TYPE_DEFAULT_VIEW); | |
103 if (label) { | |
104 *label = ui::network_icon::GetLabelForNetwork( | |
105 vpn, ui::network_icon::ICON_TYPE_DEFAULT_VIEW); | |
106 } | |
107 } | |
108 | |
109 DISALLOW_COPY_AND_ASSIGN(VpnDefaultView); | |
110 }; | |
111 | |
112 } // namespace tray | |
113 | |
114 TrayVPN::TrayVPN(SystemTray* system_tray) | |
115 : SystemTrayItem(system_tray), default_(NULL), detailed_(NULL) { | |
116 network_state_observer_.reset(new TrayNetworkStateObserver(this)); | |
117 } | |
118 | |
119 TrayVPN::~TrayVPN() {} | |
120 | |
121 views::View* TrayVPN::CreateTrayView(LoginStatus status) { | |
122 return NULL; | |
123 } | |
124 | |
125 views::View* TrayVPN::CreateDefaultView(LoginStatus status) { | |
126 CHECK(default_ == NULL); | |
127 if (!chromeos::NetworkHandler::IsInitialized()) | |
128 return NULL; | |
129 if (status == LoginStatus::NOT_LOGGED_IN) | |
130 return NULL; | |
131 if (!tray::VpnDefaultView::ShouldShow()) | |
132 return NULL; | |
133 | |
134 const bool is_in_secondary_login_screen = | |
135 WmShell::Get()->GetSessionStateDelegate()->IsInSecondaryLoginScreen(); | |
136 | |
137 default_ = new tray::VpnDefaultView( | |
138 this, status != LoginStatus::LOCKED && !is_in_secondary_login_screen); | |
139 | |
140 return default_; | |
141 } | |
142 | |
143 views::View* TrayVPN::CreateDetailedView(LoginStatus status) { | |
144 CHECK(detailed_ == NULL); | |
145 if (!chromeos::NetworkHandler::IsInitialized()) | |
146 return NULL; | |
147 | |
148 WmShell::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_DETAILED_VPN_VIEW); | |
149 detailed_ = new tray::NetworkStateListDetailedView( | |
150 this, tray::NetworkStateListDetailedView::LIST_TYPE_VPN, status); | |
151 detailed_->Init(); | |
152 return detailed_; | |
153 } | |
154 | |
155 void TrayVPN::DestroyTrayView() {} | |
156 | |
157 void TrayVPN::DestroyDefaultView() { | |
158 default_ = NULL; | |
159 } | |
160 | |
161 void TrayVPN::DestroyDetailedView() { | |
162 detailed_ = NULL; | |
163 } | |
164 | |
165 void TrayVPN::UpdateAfterLoginStatusChange(LoginStatus status) {} | |
166 | |
167 void TrayVPN::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {} | |
168 | |
169 void TrayVPN::NetworkStateChanged() { | |
170 if (default_) | |
171 default_->Update(); | |
172 if (detailed_) | |
173 detailed_->Update(); | |
174 } | |
175 | |
176 } // namespace ash | |
OLD | NEW |