Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |