Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: ash/common/system/chromeos/network/vpn_list_view.cc

Issue 2510083006: chromeos: Move ownership of ash VPN provider list from chrome into ash (Closed)
Patch Set: Collapse VPNProvider::Key and VPNProvider structs Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ash/common/system/chromeos/network/vpn_list_view.h ('k') | ash/mus/vpn_delegate_mus.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/common/system/chromeos/network/vpn_list_view.h" 5 #include "ash/common/system/chromeos/network/vpn_list_view.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 16 matching lines...) Expand all
27 #include "base/bind.h" 27 #include "base/bind.h"
28 #include "base/bind_helpers.h" 28 #include "base/bind_helpers.h"
29 #include "base/logging.h" 29 #include "base/logging.h"
30 #include "base/strings/utf_string_conversions.h" 30 #include "base/strings/utf_string_conversions.h"
31 #include "base/values.h" 31 #include "base/values.h"
32 #include "chromeos/network/network_connection_handler.h" 32 #include "chromeos/network/network_connection_handler.h"
33 #include "chromeos/network/network_handler.h" 33 #include "chromeos/network/network_handler.h"
34 #include "chromeos/network/network_state.h" 34 #include "chromeos/network/network_state.h"
35 #include "chromeos/network/network_type_pattern.h" 35 #include "chromeos/network/network_type_pattern.h"
36 #include "grit/ash_strings.h" 36 #include "grit/ash_strings.h"
37 #include "third_party/cros_system_api/dbus/service_constants.h"
37 #include "ui/base/l10n/l10n_util.h" 38 #include "ui/base/l10n/l10n_util.h"
38 #include "ui/base/resource/resource_bundle.h" 39 #include "ui/base/resource/resource_bundle.h"
39 #include "ui/gfx/geometry/rect.h" 40 #include "ui/gfx/geometry/rect.h"
40 #include "ui/gfx/image/image_skia.h" 41 #include "ui/gfx/image/image_skia.h"
41 #include "ui/gfx/paint_vector_icon.h" 42 #include "ui/gfx/paint_vector_icon.h"
42 #include "ui/gfx/text_constants.h" 43 #include "ui/gfx/text_constants.h"
43 #include "ui/views/border.h" 44 #include "ui/views/border.h"
44 #include "ui/views/controls/button/button.h" 45 #include "ui/views/controls/button/button.h"
45 #include "ui/views/controls/label.h" 46 #include "ui/views/controls/label.h"
46 #include "ui/views/controls/separator.h" 47 #include "ui/views/controls/separator.h"
47 #include "ui/views/layout/box_layout.h" 48 #include "ui/views/layout/box_layout.h"
48 #include "ui/views/layout/fill_layout.h" 49 #include "ui/views/layout/fill_layout.h"
49 #include "ui/views/view.h" 50 #include "ui/views/view.h"
50 51
51 namespace ash { 52 namespace ash {
52 53
53 namespace { 54 namespace {
54 55
55 bool UseMd() { 56 bool UseMd() {
56 return MaterialDesignController::IsSystemTrayMenuMaterial(); 57 return MaterialDesignController::IsSystemTrayMenuMaterial();
57 } 58 }
58 59
59 bool IsConnectedOrConnecting(const chromeos::NetworkState* network) { 60 bool IsConnectedOrConnecting(const chromeos::NetworkState* network) {
60 return network->IsConnectedState() || network->IsConnectingState(); 61 return network->IsConnectedState() || network->IsConnectingState();
61 } 62 }
62 63
63 void IgnoreDisconnectError(const std::string& error_name, 64 void IgnoreDisconnectError(const std::string& error_name,
64 std::unique_ptr<base::DictionaryValue> error_data) {} 65 std::unique_ptr<base::DictionaryValue> error_data) {}
65 66
67 // Indicates whether |network| belongs to this VPN provider.
68 bool VpnProviderMatchesNetwork(const VPNProvider& provider,
69 const chromeos::NetworkState& network) {
70 if (network.type() != shill::kTypeVPN)
71 return false;
72 const bool network_uses_third_party_provider =
73 network.vpn_provider_type() == shill::kProviderThirdPartyVpn;
74 if (!provider.third_party)
75 return !network_uses_third_party_provider;
76 return network_uses_third_party_provider &&
77 network.third_party_vpn_provider_extension_id() ==
78 provider.extension_id;
79 }
stevenjb 2016/11/22 00:08:35 Thanks for moving this, I meant to suggest that be
80
66 // The base class of all list entries, a |HoverHighlightView| with no border. 81 // The base class of all list entries, a |HoverHighlightView| with no border.
67 class VPNListEntryBase : public HoverHighlightView { 82 class VPNListEntryBase : public HoverHighlightView {
68 public: 83 public:
69 // When the user clicks the entry, the |parent|'s OnViewClicked() will be 84 // When the user clicks the entry, the |parent|'s OnViewClicked() will be
70 // invoked. 85 // invoked.
71 explicit VPNListEntryBase(VPNListView* parent); 86 explicit VPNListEntryBase(VPNListView* parent);
72 87
73 private: 88 private:
74 DISALLOW_COPY_AND_ASSIGN(VPNListEntryBase); 89 DISALLOW_COPY_AND_ASSIGN(VPNListEntryBase);
75 }; 90 };
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 if (system_tray_delegate) { 330 if (system_tray_delegate) {
316 VPNDelegate* const vpn_delegate = system_tray_delegate->GetVPNDelegate(); 331 VPNDelegate* const vpn_delegate = system_tray_delegate->GetVPNDelegate();
317 if (vpn_delegate) 332 if (vpn_delegate)
318 vpn_delegate->RemoveObserver(this); 333 vpn_delegate->RemoveObserver(this);
319 } 334 }
320 } 335 }
321 336
322 void VPNListView::Update() { 337 void VPNListView::Update() {
323 // Before updating the list, determine whether the user was hovering over one 338 // Before updating the list, determine whether the user was hovering over one
324 // of the VPN provider or network entries. 339 // of the VPN provider or network entries.
325 std::unique_ptr<VPNProvider::Key> hovered_provider_key; 340 std::unique_ptr<VPNProvider> hovered_provider;
326 std::string hovered_network_service_path; 341 std::string hovered_network_service_path;
327 for (const std::pair<const views::View* const, VPNProvider::Key>& provider : 342 for (const std::pair<const views::View* const, VPNProvider>& provider :
328 provider_view_key_map_) { 343 provider_view_map_) {
329 if (static_cast<const HoverHighlightView*>(provider.first)->hover()) { 344 if (static_cast<const HoverHighlightView*>(provider.first)->hover()) {
330 hovered_provider_key.reset(new VPNProvider::Key(provider.second)); 345 hovered_provider.reset(new VPNProvider(provider.second));
331 break; 346 break;
332 } 347 }
333 } 348 }
334 if (!hovered_provider_key) { 349 if (!hovered_provider) {
335 for (const std::pair<const views::View*, std::string>& entry : 350 for (const std::pair<const views::View*, std::string>& entry :
336 network_view_service_path_map_) { 351 network_view_service_path_map_) {
337 if (static_cast<const HoverHighlightView*>(entry.first)->hover()) { 352 if (static_cast<const HoverHighlightView*>(entry.first)->hover()) {
338 hovered_network_service_path = entry.second; 353 hovered_network_service_path = entry.second;
339 break; 354 break;
340 } 355 }
341 } 356 }
342 } 357 }
343 358
344 // Clear the list. 359 // Clear the list.
345 container()->RemoveAllChildViews(true); 360 container()->RemoveAllChildViews(true);
346 provider_view_key_map_.clear(); 361 provider_view_map_.clear();
347 network_view_service_path_map_.clear(); 362 network_view_service_path_map_.clear();
348 list_empty_ = true; 363 list_empty_ = true;
349 if (!UseMd()) { 364 if (!UseMd()) {
350 container()->SetLayoutManager( 365 container()->SetLayoutManager(
351 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); 366 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0));
352 } 367 }
353 368
354 // Get the list of available VPN networks, in shill's priority order. 369 // Get the list of available VPN networks, in shill's priority order.
355 chromeos::NetworkStateHandler::NetworkStateList networks; 370 chromeos::NetworkStateHandler::NetworkStateList networks;
356 chromeos::NetworkHandler::Get() 371 chromeos::NetworkHandler::Get()
357 ->network_state_handler() 372 ->network_state_handler()
358 ->GetVisibleNetworkListByType(chromeos::NetworkTypePattern::VPN(), 373 ->GetVisibleNetworkListByType(chromeos::NetworkTypePattern::VPN(),
359 &networks); 374 &networks);
360 375
361 if (!networks.empty() && IsConnectedOrConnecting(networks.front())) { 376 if (!networks.empty() && IsConnectedOrConnecting(networks.front())) {
362 // If there is a connected or connecting network, show that network first. 377 // If there is a connected or connecting network, show that network first.
363 AddNetwork(networks.front()); 378 AddNetwork(networks.front());
364 networks.erase(networks.begin()); 379 networks.erase(networks.begin());
365 } 380 }
366 381
367 // Show all VPN providers and all networks that are currently disconnected. 382 // Show all VPN providers and all networks that are currently disconnected.
368 AddProvidersAndNetworks(networks); 383 AddProvidersAndNetworks(networks);
369 384
370 // Determine whether one of the new list entries corresponds to the entry that 385 // Determine whether one of the new list entries corresponds to the entry that
371 // the user was previously hovering over. If such an entry is found, the list 386 // the user was previously hovering over. If such an entry is found, the list
372 // will be scrolled to ensure the entry is visible. 387 // will be scrolled to ensure the entry is visible.
373 const views::View* scroll_to_show_view = nullptr; 388 const views::View* scroll_to_show_view = nullptr;
374 if (hovered_provider_key) { 389 if (hovered_provider) {
375 for (const std::pair<const views::View* const, VPNProvider::Key>& provider : 390 for (const std::pair<const views::View* const, VPNProvider>& provider :
376 provider_view_key_map_) { 391 provider_view_map_) {
377 if (provider.second == *hovered_provider_key) { 392 if (provider.second == *hovered_provider) {
378 scroll_to_show_view = provider.first; 393 scroll_to_show_view = provider.first;
379 break; 394 break;
380 } 395 }
381 } 396 }
382 } else if (!hovered_network_service_path.empty()) { 397 } else if (!hovered_network_service_path.empty()) {
383 for (const std::pair<const views::View*, std::string>& entry : 398 for (const std::pair<const views::View*, std::string>& entry :
384 network_view_service_path_map_) { 399 network_view_service_path_map_) {
385 if (entry.second == hovered_network_service_path) { 400 if (entry.second == hovered_network_service_path) {
386 scroll_to_show_view = entry.first; 401 scroll_to_show_view = entry.first;
387 break; 402 break;
(...skipping 18 matching lines...) Expand all
406 return false; 421 return false;
407 *service_path = entry->second; 422 *service_path = entry->second;
408 return true; 423 return true;
409 } 424 }
410 425
411 void VPNListView::OnVPNProvidersChanged() { 426 void VPNListView::OnVPNProvidersChanged() {
412 Update(); 427 Update();
413 } 428 }
414 429
415 void VPNListView::OnViewClicked(views::View* sender) { 430 void VPNListView::OnViewClicked(views::View* sender) {
416 const auto& provider = provider_view_key_map_.find(sender); 431 const auto& provider_iter = provider_view_map_.find(sender);
417 if (provider != provider_view_key_map_.end()) { 432 if (provider_iter != provider_view_map_.end()) {
418 // If the user clicks on a provider entry, request that the "add network" 433 // If the user clicks on a provider entry, request that the "add network"
419 // dialog for this provider be shown. 434 // dialog for this provider be shown.
420 const VPNProvider::Key& key = provider->second; 435 const VPNProvider& provider = provider_iter->second;
421 WmShell::Get()->RecordUserMetricsAction( 436 WmShell::Get()->RecordUserMetricsAction(
422 key.third_party ? UMA_STATUS_AREA_VPN_ADD_THIRD_PARTY_CLICKED 437 provider.third_party ? UMA_STATUS_AREA_VPN_ADD_THIRD_PARTY_CLICKED
423 : UMA_STATUS_AREA_VPN_ADD_BUILT_IN_CLICKED); 438 : UMA_STATUS_AREA_VPN_ADD_BUILT_IN_CLICKED);
424 WmShell::Get()->system_tray_delegate()->GetVPNDelegate()->ShowAddPage(key); 439 WmShell::Get()->system_tray_delegate()->GetVPNDelegate()->ShowAddPage(
440 provider.extension_id);
425 return; 441 return;
426 } 442 }
427 443
428 // If the user clicked on a network entry, let the |delegate_| trigger a 444 // If the user clicked on a network entry, let the |delegate_| trigger a
429 // connection attempt (if the network is currently disconnected) or show a 445 // connection attempt (if the network is currently disconnected) or show a
430 // configuration dialog (if the network is currently connected or connecting). 446 // configuration dialog (if the network is currently connected or connecting).
431 delegate_->OnNetworkEntryClicked(sender); 447 delegate_->OnNetworkEntryClicked(sender);
432 } 448 }
433 449
434 void VPNListView::AddNetwork(const chromeos::NetworkState* network) { 450 void VPNListView::AddNetwork(const chromeos::NetworkState* network) {
435 views::View* entry(new VPNListNetworkEntry(this, network)); 451 views::View* entry(new VPNListNetworkEntry(this, network));
436 container()->AddChildView(entry); 452 container()->AddChildView(entry);
437 network_view_service_path_map_[entry] = network->path(); 453 network_view_service_path_map_[entry] = network->path();
438 list_empty_ = false; 454 list_empty_ = false;
439 } 455 }
440 456
441 void VPNListView::AddProviderAndNetworks( 457 void VPNListView::AddProviderAndNetworks(
442 const VPNProvider::Key& key, 458 const VPNProvider& vpn_provider,
443 const std::string& name,
444 const chromeos::NetworkStateHandler::NetworkStateList& networks) { 459 const chromeos::NetworkStateHandler::NetworkStateList& networks) {
445 // Add a visual separator, unless this is the topmost entry in the list. 460 // Add a visual separator, unless this is the topmost entry in the list.
446 if (!list_empty_) { 461 if (!list_empty_) {
447 views::Separator* const separator = 462 views::Separator* const separator =
448 new views::Separator(views::Separator::HORIZONTAL); 463 new views::Separator(views::Separator::HORIZONTAL);
449 separator->SetColor(kBorderLightColor); 464 separator->SetColor(kBorderLightColor);
450 container()->AddChildView(separator); 465 container()->AddChildView(separator);
451 } else { 466 } else {
452 list_empty_ = false; 467 list_empty_ = false;
453 } 468 }
469 std::string vpn_name =
470 vpn_provider.third_party
471 ? vpn_provider.third_party_provider_name
472 : l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_VPN_BUILT_IN_PROVIDER);
473
454 // Add a list entry for the VPN provider. 474 // Add a list entry for the VPN provider.
455 views::View* provider = nullptr; 475 views::View* provider_view = nullptr;
456 if (UseMd()) { 476 if (UseMd()) {
457 provider = new VPNListProviderEntryMd(this, name, 477 provider_view = new VPNListProviderEntryMd(
458 IDS_ASH_STATUS_TRAY_ADD_CONNECTION); 478 this, vpn_name, IDS_ASH_STATUS_TRAY_ADD_CONNECTION);
459 } else { 479 } else {
460 provider = new VPNListProviderEntry(this, name); 480 provider_view = new VPNListProviderEntry(this, vpn_name);
461 } 481 }
462 container()->AddChildView(provider); 482 container()->AddChildView(provider_view);
463 provider_view_key_map_[provider] = key; 483 provider_view_map_[provider_view] = vpn_provider;
464 // Add the networks belonging to this provider, in the priority order returned 484 // Add the networks belonging to this provider, in the priority order returned
465 // by shill. 485 // by shill.
466 for (const chromeos::NetworkState* const& network : networks) { 486 for (const chromeos::NetworkState* const& network : networks) {
467 if (key.MatchesNetwork(*network)) 487 if (VpnProviderMatchesNetwork(vpn_provider, *network))
468 AddNetwork(network); 488 AddNetwork(network);
469 } 489 }
470 } 490 }
471 491
472 void VPNListView::AddProvidersAndNetworks( 492 void VPNListView::AddProvidersAndNetworks(
473 const chromeos::NetworkStateHandler::NetworkStateList& networks) { 493 const chromeos::NetworkStateHandler::NetworkStateList& networks) {
474 // Get the list of VPN providers enabled in the primary user's profile. 494 // Get the list of VPN providers enabled in the primary user's profile.
475 std::vector<VPNProvider> providers = WmShell::Get() 495 std::vector<VPNProvider> providers =
476 ->system_tray_delegate() 496 WmShell::Get()->system_tray_delegate()->GetVPNDelegate()->vpn_providers();
477 ->GetVPNDelegate()
478 ->GetVPNProviders();
479 497
480 // Add providers with at least one configured network along with their 498 // Add providers with at least one configured network along with their
481 // networks. Providers are added in the order of their highest priority 499 // networks. Providers are added in the order of their highest priority
482 // network. 500 // network.
483 for (const chromeos::NetworkState* const& network : networks) { 501 for (const chromeos::NetworkState* const& network : networks) {
484 for (auto provider = providers.begin(); provider != providers.end(); 502 for (auto provider = providers.begin(); provider != providers.end();
485 ++provider) { 503 ++provider) {
486 if (!provider->key.MatchesNetwork(*network)) 504 if (!VpnProviderMatchesNetwork(*provider, *network))
487 continue; 505 continue;
488 AddProviderAndNetworks(provider->key, provider->name, networks); 506 AddProviderAndNetworks(*provider, networks);
489 providers.erase(provider); 507 providers.erase(provider);
490 break; 508 break;
491 } 509 }
492 } 510 }
493 511
494 // Add providers without any configured networks, in the order that the 512 // Add providers without any configured networks, in the order that the
495 // providers were returned by the extensions system. 513 // providers were returned by the extensions system.
496 for (const VPNProvider& provider : providers) 514 for (const VPNProvider& provider : providers)
497 AddProviderAndNetworks(provider.key, provider.name, networks); 515 AddProviderAndNetworks(provider, networks);
498 } 516 }
499 517
500 } // namespace ash 518 } // namespace ash
OLDNEW
« no previous file with comments | « ash/common/system/chromeos/network/vpn_list_view.h ('k') | ash/mus/vpn_delegate_mus.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698