| Index: ash/common/system/chromeos/network/vpn_list_view.cc
|
| diff --git a/ash/common/system/chromeos/network/vpn_list_view.cc b/ash/common/system/chromeos/network/vpn_list_view.cc
|
| deleted file mode 100644
|
| index c1c1c6e7fa384fcddbd46a1a0069458646c42ea7..0000000000000000000000000000000000000000
|
| --- a/ash/common/system/chromeos/network/vpn_list_view.cc
|
| +++ /dev/null
|
| @@ -1,440 +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/common/system/chromeos/network/vpn_list_view.h"
|
| -
|
| -#include <memory>
|
| -#include <utility>
|
| -#include <vector>
|
| -
|
| -#include "ash/common/ash_view_ids.h"
|
| -#include "ash/common/material_design/material_design_controller.h"
|
| -#include "ash/common/system/chromeos/network/network_icon.h"
|
| -#include "ash/common/system/chromeos/network/network_icon_animation.h"
|
| -#include "ash/common/system/chromeos/network/network_icon_animation_observer.h"
|
| -#include "ash/common/system/chromeos/network/network_list_delegate.h"
|
| -#include "ash/common/system/chromeos/network/vpn_list.h"
|
| -#include "ash/common/system/tray/hover_highlight_view.h"
|
| -#include "ash/common/system/tray/system_menu_button.h"
|
| -#include "ash/common/system/tray/system_tray_controller.h"
|
| -#include "ash/common/system/tray/throbber_view.h"
|
| -#include "ash/common/system/tray/tray_constants.h"
|
| -#include "ash/common/system/tray/tray_popup_utils.h"
|
| -#include "ash/common/system/tray/tri_view.h"
|
| -#include "ash/common/wm_shell.h"
|
| -#include "ash/resources/vector_icons/vector_icons.h"
|
| -#include "ash/strings/grit/ash_strings.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 "third_party/cros_system_api/dbus/service_constants.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/gfx/geometry/rect.h"
|
| -#include "ui/gfx/image/image_skia.h"
|
| -#include "ui/gfx/paint_vector_icon.h"
|
| -#include "ui/gfx/text_constants.h"
|
| -#include "ui/views/border.h"
|
| -#include "ui/views/controls/button/button.h"
|
| -#include "ui/views/controls/button/label_button.h"
|
| -#include "ui/views/controls/label.h"
|
| -#include "ui/views/controls/separator.h"
|
| -#include "ui/views/layout/box_layout.h"
|
| -#include "ui/views/layout/fill_layout.h"
|
| -#include "ui/views/view.h"
|
| -
|
| -namespace ash {
|
| -
|
| -namespace {
|
| -
|
| -bool UseMd() {
|
| - return MaterialDesignController::IsSystemTrayMenuMaterial();
|
| -}
|
| -
|
| -// Indicates whether |network| belongs to this VPN provider.
|
| -bool VpnProviderMatchesNetwork(const VPNProvider& provider,
|
| - const chromeos::NetworkState& network) {
|
| - if (network.type() != shill::kTypeVPN)
|
| - return false;
|
| - const bool network_uses_third_party_provider =
|
| - network.vpn_provider_type() == shill::kProviderThirdPartyVpn;
|
| - if (!provider.third_party)
|
| - return !network_uses_third_party_provider;
|
| - return network_uses_third_party_provider &&
|
| - network.third_party_vpn_provider_extension_id() ==
|
| - provider.extension_id;
|
| -}
|
| -
|
| -// 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)
|
| - : VPNListEntryBase(parent) {
|
| - views::Label* const label = AddLabel(
|
| - base::UTF8ToUTF16(name), gfx::ALIGN_LEFT, false /* highlight */);
|
| - label->SetBorder(views::CreateEmptyBorder(5, 0, 5, 0));
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(VPNListProviderEntry);
|
| -};
|
| -
|
| -// A list entry that represents a VPN provider with Material Design.
|
| -class VPNListProviderEntryMd : public views::ButtonListener,
|
| - public views::View {
|
| - public:
|
| - VPNListProviderEntryMd(ViewClickListener* parent,
|
| - bool top_item,
|
| - const std::string& name,
|
| - int button_accessible_name_id)
|
| - : parent_(parent) {
|
| - TrayPopupUtils::ConfigureAsStickyHeader(this);
|
| - SetLayoutManager(new views::FillLayout);
|
| - TriView* tri_view = TrayPopupUtils::CreateSubHeaderRowView();
|
| - AddChildView(tri_view);
|
| -
|
| - views::Label* label = TrayPopupUtils::CreateDefaultLabel();
|
| - TrayPopupItemStyle style(TrayPopupItemStyle::FontStyle::SUB_HEADER);
|
| - style.SetupLabel(label);
|
| - label->SetText(base::ASCIIToUTF16(name));
|
| - tri_view->AddView(TriView::Container::CENTER, label);
|
| -
|
| - const SkColor image_color = GetNativeTheme()->GetSystemColor(
|
| - ui::NativeTheme::kColorId_ProminentButtonColor);
|
| - gfx::ImageSkia icon =
|
| - gfx::CreateVectorIcon(kSystemMenuAddConnectionIcon, image_color);
|
| - SystemMenuButton* add_vpn_button =
|
| - new SystemMenuButton(this, TrayPopupInkDropStyle::HOST_CENTERED, icon,
|
| - icon, button_accessible_name_id);
|
| - add_vpn_button->SetInkDropColor(image_color);
|
| - add_vpn_button->SetEnabled(true);
|
| - tri_view->AddView(TriView::Container::END, add_vpn_button);
|
| - }
|
| -
|
| - protected:
|
| - // views::ButtonListener:
|
| - void ButtonPressed(views::Button* sender, const ui::Event& event) override {
|
| - parent_->OnViewClicked(this);
|
| - }
|
| -
|
| - private:
|
| - // Our parent to handle events.
|
| - ViewClickListener* parent_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(VPNListProviderEntryMd);
|
| -};
|
| -
|
| -// 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 network_icon::AnimationObserver {
|
| - public:
|
| - VPNListNetworkEntry(VPNListView* parent,
|
| - const chromeos::NetworkState* network);
|
| - ~VPNListNetworkEntry() override;
|
| -
|
| - // network_icon::AnimationObserver:
|
| - void NetworkIconChanged() override;
|
| -
|
| - private:
|
| - void UpdateFromNetworkState(const chromeos::NetworkState* network);
|
| - void SetupConnectedItemMd(const base::string16& text,
|
| - const gfx::ImageSkia& image);
|
| - void SetupConnectingItemMd(const base::string16& text,
|
| - const gfx::ImageSkia& image);
|
| -
|
| - const std::string guid_;
|
| -
|
| - views::LabelButton* disconnect_button_ = nullptr;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(VPNListNetworkEntry);
|
| -};
|
| -
|
| -VPNListEntryBase::VPNListEntryBase(VPNListView* parent)
|
| - : HoverHighlightView(parent) {
|
| - if (!UseMd())
|
| - SetBorder(views::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal, 0, 0));
|
| -}
|
| -
|
| -VPNListNetworkEntry::VPNListNetworkEntry(VPNListView* parent,
|
| - const chromeos::NetworkState* network)
|
| - : VPNListEntryBase(parent), guid_(network->guid()) {
|
| - UpdateFromNetworkState(network);
|
| -}
|
| -
|
| -VPNListNetworkEntry::~VPNListNetworkEntry() {
|
| - network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
|
| -}
|
| -
|
| -void VPNListNetworkEntry::NetworkIconChanged() {
|
| - UpdateFromNetworkState(chromeos::NetworkHandler::Get()
|
| - ->network_state_handler()
|
| - ->GetNetworkStateFromGuid(guid_));
|
| -}
|
| -
|
| -void VPNListNetworkEntry::UpdateFromNetworkState(
|
| - const chromeos::NetworkState* network) {
|
| - if (network && network->IsConnectingState())
|
| - network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this);
|
| - else
|
| - 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;
|
| -
|
| - gfx::ImageSkia image =
|
| - network_icon::GetImageForNetwork(network, network_icon::ICON_TYPE_LIST);
|
| - base::string16 label = network_icon::GetLabelForNetwork(
|
| - network, UseMd() ? network_icon::ICON_TYPE_MENU_LIST
|
| - : network_icon::ICON_TYPE_LIST);
|
| - if (network->IsConnectedState())
|
| - SetupConnectedItemMd(label, image);
|
| - else if (network->IsConnectingState())
|
| - SetupConnectingItemMd(label, image);
|
| - else
|
| - AddIconAndLabel(image, label, false);
|
| -
|
| - if (network->IsConnectedState()) {
|
| - disconnect_button_ = TrayPopupUtils::CreateTrayPopupButton(
|
| - this, l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_VPN_DISCONNECT));
|
| - tri_view()->AddView(TriView::Container::END, disconnect_button_);
|
| - tri_view()->SetContainerVisible(TriView::Container::END, true);
|
| - tri_view()->SetContainerBorder(
|
| - TriView::Container::END,
|
| - views::CreateEmptyBorder(0, 0, 0, kTrayPopupButtonEndMargin));
|
| - }
|
| - Layout();
|
| -}
|
| -
|
| -// TODO(varkha): Consolidate with a similar method in tray_bluetooth.cc.
|
| -void VPNListNetworkEntry::SetupConnectedItemMd(const base::string16& text,
|
| - const gfx::ImageSkia& image) {
|
| - AddIconAndLabels(
|
| - image, text,
|
| - l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTED));
|
| - TrayPopupItemStyle style(TrayPopupItemStyle::FontStyle::CAPTION);
|
| - style.set_color_style(TrayPopupItemStyle::ColorStyle::CONNECTED);
|
| - style.SetupLabel(sub_text_label());
|
| -}
|
| -
|
| -// TODO(varkha): Consolidate with a similar method in tray_bluetooth.cc.
|
| -void VPNListNetworkEntry::SetupConnectingItemMd(const base::string16& text,
|
| - const gfx::ImageSkia& image) {
|
| - AddIconAndLabels(
|
| - image, text,
|
| - l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTING));
|
| - ThrobberView* throbber = new ThrobberView;
|
| - throbber->Start();
|
| - AddRightView(throbber);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -VPNListView::VPNListView(NetworkListDelegate* delegate) : delegate_(delegate) {
|
| - WmShell::Get()->vpn_list()->AddObserver(this);
|
| -}
|
| -
|
| -VPNListView::~VPNListView() {
|
| - WmShell::Get()->vpn_list()->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> hovered_provider;
|
| - std::string hovered_network_guid;
|
| - for (const std::pair<const views::View* const, VPNProvider>& provider :
|
| - provider_view_map_) {
|
| - if (static_cast<const HoverHighlightView*>(provider.first)->hover()) {
|
| - hovered_provider.reset(new VPNProvider(provider.second));
|
| - break;
|
| - }
|
| - }
|
| - if (!hovered_provider) {
|
| - for (const std::pair<const views::View*, std::string>& entry :
|
| - network_view_guid_map_) {
|
| - if (static_cast<const HoverHighlightView*>(entry.first)->hover()) {
|
| - hovered_network_guid = entry.second;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Clear the list.
|
| - container()->RemoveAllChildViews(true);
|
| - provider_view_map_.clear();
|
| - network_view_guid_map_.clear();
|
| - list_empty_ = true;
|
| - if (!UseMd()) {
|
| - 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);
|
| -
|
| - // 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) {
|
| - for (const std::pair<const views::View* const, VPNProvider>& provider :
|
| - provider_view_map_) {
|
| - if (provider.second == *hovered_provider) {
|
| - scroll_to_show_view = provider.first;
|
| - break;
|
| - }
|
| - }
|
| - } else if (!hovered_network_guid.empty()) {
|
| - for (const std::pair<const views::View*, std::string>& entry :
|
| - network_view_guid_map_) {
|
| - if (entry.second == hovered_network_guid) {
|
| - 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* guid) const {
|
| - const auto& entry = network_view_guid_map_.find(view);
|
| - if (entry == network_view_guid_map_.end())
|
| - return false;
|
| - *guid = entry->second;
|
| - return true;
|
| -}
|
| -
|
| -void VPNListView::OnVPNProvidersChanged() {
|
| - Update();
|
| -}
|
| -
|
| -void VPNListView::OnViewClicked(views::View* sender) {
|
| - const auto& provider_iter = provider_view_map_.find(sender);
|
| - if (provider_iter != provider_view_map_.end()) {
|
| - // If the user clicks on a provider entry, request that the "add network"
|
| - // dialog for this provider be shown.
|
| - const VPNProvider& provider = provider_iter->second;
|
| - WmShell* shell = WmShell::Get();
|
| - if (provider.third_party) {
|
| - shell->RecordUserMetricsAction(
|
| - UMA_STATUS_AREA_VPN_ADD_THIRD_PARTY_CLICKED);
|
| - shell->system_tray_controller()->ShowThirdPartyVpnCreate(
|
| - provider.extension_id);
|
| - } else {
|
| - shell->RecordUserMetricsAction(UMA_STATUS_AREA_VPN_ADD_BUILT_IN_CLICKED);
|
| - shell->system_tray_controller()->ShowNetworkCreate(shill::kTypeVPN);
|
| - }
|
| - 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_->OnNetworkEntryClicked(sender);
|
| -}
|
| -
|
| -void VPNListView::AddNetwork(const chromeos::NetworkState* network) {
|
| - views::View* entry(new VPNListNetworkEntry(this, network));
|
| - container()->AddChildView(entry);
|
| - network_view_guid_map_[entry] = network->guid();
|
| - list_empty_ = false;
|
| -}
|
| -
|
| -void VPNListView::AddProviderAndNetworks(
|
| - const VPNProvider& vpn_provider,
|
| - const chromeos::NetworkStateHandler::NetworkStateList& networks) {
|
| - // Add a visual separator, unless this is the topmost entry in the list.
|
| - if (!list_empty_)
|
| - container()->AddChildView(TrayPopupUtils::CreateListSubHeaderSeparator());
|
| - std::string vpn_name =
|
| - vpn_provider.third_party
|
| - ? vpn_provider.third_party_provider_name
|
| - : l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_VPN_BUILT_IN_PROVIDER);
|
| -
|
| - // Add a list entry for the VPN provider.
|
| - views::View* provider_view = nullptr;
|
| - if (UseMd()) {
|
| - provider_view = new VPNListProviderEntryMd(
|
| - this, list_empty_, vpn_name, IDS_ASH_STATUS_TRAY_ADD_CONNECTION);
|
| - } else {
|
| - provider_view = new VPNListProviderEntry(this, vpn_name);
|
| - }
|
| - container()->AddChildView(provider_view);
|
| - provider_view_map_[provider_view] = vpn_provider;
|
| - list_empty_ = false;
|
| - // Add the networks belonging to this provider, in the priority order returned
|
| - // by shill.
|
| - for (const chromeos::NetworkState* const& network : networks) {
|
| - if (VpnProviderMatchesNetwork(vpn_provider, *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()->vpn_list()->vpn_providers();
|
| -
|
| - // 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 (!VpnProviderMatchesNetwork(*provider, *network))
|
| - continue;
|
| - AddProviderAndNetworks(*provider, 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, networks);
|
| -}
|
| -
|
| -} // namespace ash
|
|
|