| Index: ash/system/chromeos/network/vpn_list_view.cc
|
| diff --git a/ash/system/chromeos/network/vpn_list_view.cc b/ash/system/chromeos/network/vpn_list_view.cc
|
| deleted file mode 100644
|
| index 1fb751e0156024c6ca594b543a74cb978ee3ca5e..0000000000000000000000000000000000000000
|
| --- a/ash/system/chromeos/network/vpn_list_view.cc
|
| +++ /dev/null
|
| @@ -1,419 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "ash/system/chromeos/network/vpn_list_view.h"
|
| -
|
| -#include <memory>
|
| -#include <utility>
|
| -#include <vector>
|
| -
|
| -#include "ash/common/system/tray/hover_highlight_view.h"
|
| -#include "ash/common/system/tray/system_tray_delegate.h"
|
| -#include "ash/common/system/tray/tray_constants.h"
|
| -#include "ash/common/system/tray/tray_popup_label_button.h"
|
| -#include "ash/common/wm_shell.h"
|
| -#include "ash/system/chromeos/network/vpn_delegate.h"
|
| -#include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| -#include "base/logging.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/values.h"
|
| -#include "chromeos/network/network_connection_handler.h"
|
| -#include "chromeos/network/network_handler.h"
|
| -#include "chromeos/network/network_state.h"
|
| -#include "chromeos/network/network_type_pattern.h"
|
| -#include "grit/ash_strings.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -#include "ui/chromeos/network/network_icon.h"
|
| -#include "ui/chromeos/network/network_icon_animation.h"
|
| -#include "ui/chromeos/network/network_icon_animation_observer.h"
|
| -#include "ui/chromeos/network/network_list_delegate.h"
|
| -#include "ui/gfx/geometry/rect.h"
|
| -#include "ui/gfx/image/image_skia.h"
|
| -#include "ui/gfx/text_constants.h"
|
| -#include "ui/views/border.h"
|
| -#include "ui/views/controls/button/button.h"
|
| -#include "ui/views/controls/label.h"
|
| -#include "ui/views/controls/separator.h"
|
| -#include "ui/views/layout/box_layout.h"
|
| -#include "ui/views/view.h"
|
| -
|
| -namespace ash {
|
| -
|
| -namespace {
|
| -
|
| -bool IsConnectedOrConnecting(const chromeos::NetworkState* network) {
|
| - return network->IsConnectedState() || network->IsConnectingState();
|
| -}
|
| -
|
| -void IgnoreDisconnectError(const std::string& error_name,
|
| - std::unique_ptr<base::DictionaryValue> error_data) {}
|
| -
|
| -// The base class of all list entries, a |HoverHighlightView| with no border.
|
| -class VPNListEntryBase : public HoverHighlightView {
|
| - public:
|
| - // When the user clicks the entry, the |parent|'s OnViewClicked() will be
|
| - // invoked.
|
| - explicit VPNListEntryBase(VPNListView* parent);
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(VPNListEntryBase);
|
| -};
|
| -
|
| -// A list entry that represents a VPN provider.
|
| -class VPNListProviderEntry : public VPNListEntryBase {
|
| - public:
|
| - VPNListProviderEntry(VPNListView* parent, const std::string& name);
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(VPNListProviderEntry);
|
| -};
|
| -
|
| -// A list entry that represents a network. If the network is currently
|
| -// connecting, the icon shown by this list entry will be animated. If the
|
| -// network is currently connected, a disconnect button will be shown next to its
|
| -// name.
|
| -class VPNListNetworkEntry : public VPNListEntryBase,
|
| - public ui::network_icon::AnimationObserver,
|
| - public views::ButtonListener {
|
| - public:
|
| - VPNListNetworkEntry(VPNListView* parent,
|
| - const chromeos::NetworkState* network);
|
| - ~VPNListNetworkEntry() override;
|
| -
|
| - // ui::network_icon::AnimationObserver:
|
| - void NetworkIconChanged() override;
|
| -
|
| - // views::ButtonListener:
|
| - void ButtonPressed(views::Button* sender, const ui::Event& event) override;
|
| -
|
| - private:
|
| - // A disconnect button that will be shown if the network is currently
|
| - // connected. Updates the list entry's hover state as the mouse enters/exits
|
| - // the button.
|
| - class DisconnectButton : public TrayPopupLabelButton {
|
| - public:
|
| - explicit DisconnectButton(VPNListNetworkEntry* parent);
|
| -
|
| - private:
|
| - // TrayPopupLabelButton:
|
| - void OnMouseEntered(const ui::MouseEvent& event) override;
|
| - void OnMouseExited(const ui::MouseEvent& event) override;
|
| - void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
|
| -
|
| - VPNListNetworkEntry* parent_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DisconnectButton);
|
| - };
|
| -
|
| - void UpdateFromNetworkState(const chromeos::NetworkState* network);
|
| -
|
| - const std::string service_path_;
|
| -
|
| - DisconnectButton* disconnect_button_ = nullptr;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(VPNListNetworkEntry);
|
| -};
|
| -
|
| -VPNListEntryBase::VPNListEntryBase(VPNListView* parent)
|
| - : HoverHighlightView(parent) {
|
| - SetBorder(
|
| - views::Border::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal, 0, 0));
|
| -}
|
| -
|
| -VPNListProviderEntry::VPNListProviderEntry(VPNListView* parent,
|
| - const std::string& name)
|
| - : VPNListEntryBase(parent) {
|
| - views::Label* const label =
|
| - AddLabel(base::UTF8ToUTF16(name), gfx::ALIGN_LEFT, false /* highlight */);
|
| - label->SetBorder(views::Border::CreateEmptyBorder(5, 0, 5, 0));
|
| -}
|
| -
|
| -VPNListNetworkEntry::VPNListNetworkEntry(VPNListView* parent,
|
| - const chromeos::NetworkState* network)
|
| - : VPNListEntryBase(parent), service_path_(network->path()) {
|
| - UpdateFromNetworkState(network);
|
| -}
|
| -
|
| -VPNListNetworkEntry::~VPNListNetworkEntry() {
|
| - ui::network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
|
| -}
|
| -
|
| -void VPNListNetworkEntry::NetworkIconChanged() {
|
| - UpdateFromNetworkState(
|
| - chromeos::NetworkHandler::Get()->network_state_handler()->GetNetworkState(
|
| - service_path_));
|
| -}
|
| -
|
| -void VPNListNetworkEntry::ButtonPressed(views::Button* sender,
|
| - const ui::Event& event) {
|
| - WmShell::Get()->RecordUserMetricsAction(
|
| - UMA_STATUS_AREA_VPN_DISCONNECT_CLICKED);
|
| - chromeos::NetworkHandler::Get()
|
| - ->network_connection_handler()
|
| - ->DisconnectNetwork(service_path_, base::Bind(&base::DoNothing),
|
| - base::Bind(&IgnoreDisconnectError));
|
| -}
|
| -
|
| -VPNListNetworkEntry::DisconnectButton::DisconnectButton(
|
| - VPNListNetworkEntry* parent)
|
| - : TrayPopupLabelButton(
|
| - parent,
|
| - l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_VPN_DISCONNECT)),
|
| - parent_(parent) {
|
| - DCHECK(parent_);
|
| -}
|
| -
|
| -void VPNListNetworkEntry::DisconnectButton::OnMouseEntered(
|
| - const ui::MouseEvent& event) {
|
| - TrayPopupLabelButton::OnMouseEntered(event);
|
| - parent_->SetHoverHighlight(false);
|
| -}
|
| -
|
| -void VPNListNetworkEntry::DisconnectButton::OnMouseExited(
|
| - const ui::MouseEvent& event) {
|
| - TrayPopupLabelButton::OnMouseExited(event);
|
| - if (parent_->IsMouseHovered())
|
| - parent_->SetHoverHighlight(true);
|
| -}
|
| -
|
| -void VPNListNetworkEntry::DisconnectButton::OnBoundsChanged(
|
| - const gfx::Rect& previous_bounds) {
|
| - TrayPopupLabelButton::OnBoundsChanged(previous_bounds);
|
| - if (IsMouseHovered()) {
|
| - SetState(STATE_HOVERED);
|
| - parent_->SetHoverHighlight(false);
|
| - }
|
| -}
|
| -
|
| -void VPNListNetworkEntry::UpdateFromNetworkState(
|
| - const chromeos::NetworkState* network) {
|
| - if (network && network->IsConnectingState())
|
| - ui::network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this);
|
| - else
|
| - ui::network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
|
| -
|
| - if (!network) {
|
| - // This is a transient state where the network has been removed already but
|
| - // the network list in the UI has not been updated yet.
|
| - return;
|
| - }
|
| -
|
| - RemoveAllChildViews(true);
|
| - disconnect_button_ = nullptr;
|
| -
|
| - AddIconAndLabel(ui::network_icon::GetImageForNetwork(
|
| - network, ui::network_icon::ICON_TYPE_LIST),
|
| - ui::network_icon::GetLabelForNetwork(
|
| - network, ui::network_icon::ICON_TYPE_LIST),
|
| - IsConnectedOrConnecting(network));
|
| - if (IsConnectedOrConnecting(network)) {
|
| - disconnect_button_ = new DisconnectButton(this);
|
| - AddChildView(disconnect_button_);
|
| - SetBorder(
|
| - views::Border::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal, 0, 3));
|
| - } else {
|
| - SetBorder(
|
| - views::Border::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal, 0, 0));
|
| - }
|
| -
|
| - // The icon and the disconnect button are always set to their preferred size.
|
| - // All remaining space is used for the network name.
|
| - views::BoxLayout* layout = new views::BoxLayout(
|
| - views::BoxLayout::kHorizontal, 0, 3, kTrayPopupPaddingBetweenItems);
|
| - SetLayoutManager(layout);
|
| - layout->SetDefaultFlex(0);
|
| - layout->SetFlexForView(text_label(), 1);
|
| - Layout();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -VPNListView::VPNListView(ui::NetworkListDelegate* delegate)
|
| - : delegate_(delegate) {
|
| - WmShell::Get()->system_tray_delegate()->GetVPNDelegate()->AddObserver(this);
|
| -}
|
| -
|
| -VPNListView::~VPNListView() {
|
| - // We need the check as on shell destruction, the delegate is destroyed first.
|
| - SystemTrayDelegate* const system_tray_delegate =
|
| - WmShell::Get()->system_tray_delegate();
|
| - if (system_tray_delegate) {
|
| - VPNDelegate* const vpn_delegate = system_tray_delegate->GetVPNDelegate();
|
| - if (vpn_delegate)
|
| - vpn_delegate->RemoveObserver(this);
|
| - }
|
| -}
|
| -
|
| -void VPNListView::Update() {
|
| - // Before updating the list, determine whether the user was hovering over one
|
| - // of the VPN provider or network entries.
|
| - std::unique_ptr<VPNProvider::Key> hovered_provider_key;
|
| - std::string hovered_network_service_path;
|
| - for (const std::pair<const views::View* const, VPNProvider::Key>& provider :
|
| - provider_view_key_map_) {
|
| - if (static_cast<const HoverHighlightView*>(provider.first)->hover()) {
|
| - hovered_provider_key.reset(new VPNProvider::Key(provider.second));
|
| - break;
|
| - }
|
| - }
|
| - if (!hovered_provider_key) {
|
| - for (const std::pair<const views::View*, std::string>& entry :
|
| - network_view_service_path_map_) {
|
| - if (static_cast<const HoverHighlightView*>(entry.first)->hover()) {
|
| - hovered_network_service_path = entry.second;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Clear the list.
|
| - container_->RemoveAllChildViews(true);
|
| - provider_view_key_map_.clear();
|
| - network_view_service_path_map_.clear();
|
| - list_empty_ = true;
|
| - container_->SetLayoutManager(
|
| - new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0));
|
| -
|
| - // Get the list of available VPN networks, in shill's priority order.
|
| - chromeos::NetworkStateHandler::NetworkStateList networks;
|
| - chromeos::NetworkHandler::Get()
|
| - ->network_state_handler()
|
| - ->GetVisibleNetworkListByType(chromeos::NetworkTypePattern::VPN(),
|
| - &networks);
|
| -
|
| - if (!networks.empty() && IsConnectedOrConnecting(networks.front())) {
|
| - // If there is a connected or connecting network, show that network first.
|
| - AddNetwork(networks.front());
|
| - networks.erase(networks.begin());
|
| - }
|
| -
|
| - // Show all VPN providers and all networks that are currently disconnected.
|
| - AddProvidersAndNetworks(networks);
|
| -
|
| - // Determine whether one of the new list entries corresponds to the entry that
|
| - // the user was previously hovering over. If such an entry is found, the list
|
| - // will be scrolled to ensure the entry is visible.
|
| - const views::View* scroll_to_show_view = nullptr;
|
| - if (hovered_provider_key) {
|
| - for (const std::pair<const views::View* const, VPNProvider::Key>& provider :
|
| - provider_view_key_map_) {
|
| - if (provider.second == *hovered_provider_key) {
|
| - scroll_to_show_view = provider.first;
|
| - break;
|
| - }
|
| - }
|
| - } else if (!hovered_network_service_path.empty()) {
|
| - for (const std::pair<const views::View*, std::string>& entry :
|
| - network_view_service_path_map_) {
|
| - if (entry.second == hovered_network_service_path) {
|
| - scroll_to_show_view = entry.first;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Layout the updated list.
|
| - container_->SizeToPreferredSize();
|
| - delegate_->RelayoutScrollList();
|
| -
|
| - if (scroll_to_show_view) {
|
| - // Scroll the list so that |scroll_to_show_view| is in view.
|
| - container_->ScrollRectToVisible(scroll_to_show_view->bounds());
|
| - }
|
| -}
|
| -
|
| -bool VPNListView::IsNetworkEntry(views::View* view,
|
| - std::string* service_path) const {
|
| - const auto& entry = network_view_service_path_map_.find(view);
|
| - if (entry == network_view_service_path_map_.end())
|
| - return false;
|
| - *service_path = entry->second;
|
| - return true;
|
| -}
|
| -
|
| -void VPNListView::OnVPNProvidersChanged() {
|
| - Update();
|
| -}
|
| -
|
| -void VPNListView::OnViewClicked(views::View* sender) {
|
| - const auto& provider = provider_view_key_map_.find(sender);
|
| - if (provider != provider_view_key_map_.end()) {
|
| - // If the user clicks on a provider entry, request that the "add network"
|
| - // dialog for this provider be shown.
|
| - const VPNProvider::Key& key = provider->second;
|
| - WmShell::Get()->RecordUserMetricsAction(
|
| - key.third_party ? UMA_STATUS_AREA_VPN_ADD_THIRD_PARTY_CLICKED
|
| - : UMA_STATUS_AREA_VPN_ADD_BUILT_IN_CLICKED);
|
| - WmShell::Get()->system_tray_delegate()->GetVPNDelegate()->ShowAddPage(key);
|
| - return;
|
| - }
|
| -
|
| - // If the user clicked on a network entry, let the |delegate_| trigger a
|
| - // connection attempt (if the network is currently disconnected) or show a
|
| - // configuration dialog (if the network is currently connected or connecting).
|
| - delegate_->OnViewClicked(sender);
|
| -}
|
| -
|
| -void VPNListView::AddNetwork(const chromeos::NetworkState* network) {
|
| - views::View* entry(new VPNListNetworkEntry(this, network));
|
| - container_->AddChildView(entry);
|
| - network_view_service_path_map_[entry] = network->path();
|
| - list_empty_ = false;
|
| -}
|
| -
|
| -void VPNListView::AddProviderAndNetworks(
|
| - const VPNProvider::Key& key,
|
| - const std::string& name,
|
| - const chromeos::NetworkStateHandler::NetworkStateList& networks) {
|
| - // Add a visual separator, unless this is the topmost entry in the list.
|
| - if (!list_empty_) {
|
| - views::Separator* const separator =
|
| - new views::Separator(views::Separator::HORIZONTAL);
|
| - separator->SetColor(kBorderLightColor);
|
| - container_->AddChildView(separator);
|
| - } else {
|
| - list_empty_ = false;
|
| - }
|
| - // Add a list entry for the VPN provider.
|
| - views::View* provider(new VPNListProviderEntry(this, name));
|
| - container_->AddChildView(provider);
|
| - provider_view_key_map_[provider] = key;
|
| - // Add the networks belonging to this provider, in the priority order returned
|
| - // by shill.
|
| - for (const chromeos::NetworkState* const& network : networks) {
|
| - if (key.MatchesNetwork(*network))
|
| - AddNetwork(network);
|
| - }
|
| -}
|
| -
|
| -void VPNListView::AddProvidersAndNetworks(
|
| - const chromeos::NetworkStateHandler::NetworkStateList& networks) {
|
| - // Get the list of VPN providers enabled in the primary user's profile.
|
| - std::vector<VPNProvider> providers = WmShell::Get()
|
| - ->system_tray_delegate()
|
| - ->GetVPNDelegate()
|
| - ->GetVPNProviders();
|
| -
|
| - // Add providers with at least one configured network along with their
|
| - // networks. Providers are added in the order of their highest priority
|
| - // network.
|
| - for (const chromeos::NetworkState* const& network : networks) {
|
| - for (auto provider = providers.begin(); provider != providers.end();
|
| - ++provider) {
|
| - if (!provider->key.MatchesNetwork(*network))
|
| - continue;
|
| - AddProviderAndNetworks(provider->key, provider->name, networks);
|
| - providers.erase(provider);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - // Add providers without any configured networks, in the order that the
|
| - // providers were returned by the extensions system.
|
| - for (const VPNProvider& provider : providers)
|
| - AddProviderAndNetworks(provider.key, provider.name, networks);
|
| -}
|
| -
|
| -} // namespace ash
|
|
|