| Index: ash/system/network/network_list.cc
|
| diff --git a/ash/system/network/network_list.cc b/ash/system/network/network_list.cc
|
| index f0f1a929d8b59ae2b476b791a969ec7e8342b666..ae84a0a93d020fbddcbb8d554c8d5628fe56cccc 100644
|
| --- a/ash/system/network/network_list.cc
|
| +++ b/ash/system/network/network_list.cc
|
| @@ -4,18 +4,29 @@
|
|
|
| #include "ash/system/network/network_list.h"
|
|
|
| -#include <stddef.h>
|
| +#include <memory>
|
|
|
| +#include "ash/shell.h"
|
| +#include "ash/shell_port.h"
|
| #include "ash/strings/grit/ash_strings.h"
|
| #include "ash/system/network/network_icon.h"
|
| #include "ash/system/network/network_icon_animation.h"
|
| -#include "ash/system/network/network_list_delegate.h"
|
| +#include "ash/system/network/network_info.h"
|
| +#include "ash/system/network/network_state_list_detailed_view.h"
|
| +#include "ash/system/networking_config_delegate.h"
|
| +#include "ash/system/tray/fixed_sized_image_view.h"
|
| +#include "ash/system/tray/hover_highlight_view.h"
|
| #include "ash/system/tray/system_menu_button.h"
|
| +#include "ash/system/tray/system_tray_controller.h"
|
| +#include "ash/system/tray/system_tray_delegate.h"
|
| +#include "ash/system/tray/throbber_view.h"
|
| #include "ash/system/tray/tray_constants.h"
|
| #include "ash/system/tray/tray_popup_item_style.h"
|
| #include "ash/system/tray/tray_popup_utils.h"
|
| #include "ash/system/tray/tri_view.h"
|
| #include "base/memory/ptr_util.h"
|
| +#include "base/strings/string16.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| #include "chromeos/dbus/dbus_thread_manager.h"
|
| #include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
|
| #include "chromeos/dbus/power_manager_client.h"
|
| @@ -26,12 +37,16 @@
|
| #include "chromeos/network/network_state_handler_observer.h"
|
| #include "chromeos/network/proxy/ui_proxy_config_service.h"
|
| #include "components/device_event_log/device_event_log.h"
|
| +#include "third_party/skia/include/core/SkColor.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| #include "ui/gfx/color_palette.h"
|
| #include "ui/gfx/font.h"
|
| +#include "ui/gfx/image/image_skia.h"
|
| #include "ui/gfx/paint_vector_icon.h"
|
| +#include "ui/gfx/text_constants.h"
|
| #include "ui/views/background.h"
|
| +#include "ui/views/border.h"
|
| #include "ui/views/controls/button/toggle_button.h"
|
| #include "ui/views/controls/image_view.h"
|
| #include "ui/views/controls/label.h"
|
| @@ -73,6 +88,32 @@ bool IsProhibitedByPolicy(const chromeos::NetworkState* network) {
|
| network->guid(), network->profile_path());
|
| }
|
|
|
| +// TODO(varkha|mohsen): Consolidate with a similar method in
|
| +// BluetoothDetailedView (see https://crbug.com/686924).
|
| +void SetupConnectedItem(HoverHighlightView* container,
|
| + const base::string16& text,
|
| + const gfx::ImageSkia& image) {
|
| + container->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(container->sub_text_label());
|
| +}
|
| +
|
| +// TODO(varkha|mohsen): Consolidate with a similar method in
|
| +// BluetoothDetailedView (see https://crbug.com/686924).
|
| +void SetupConnectingItem(HoverHighlightView* container,
|
| + const base::string16& text,
|
| + const gfx::ImageSkia& image) {
|
| + container->AddIconAndLabels(
|
| + image, text,
|
| + l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTING));
|
| + ThrobberView* throbber = new ThrobberView;
|
| + throbber->Start();
|
| + container->AddRightView(throbber);
|
| +}
|
| +
|
| } // namespace
|
|
|
| // A header row for sections in network detailed view which contains a title and
|
| @@ -210,9 +251,8 @@ class TetherHeaderRowView : public NetworkListView::SectionHeaderRowView {
|
|
|
| class WifiHeaderRowView : public NetworkListView::SectionHeaderRowView {
|
| public:
|
| - explicit WifiHeaderRowView(NetworkListDelegate* network_list_delegate)
|
| + WifiHeaderRowView()
|
| : SectionHeaderRowView(IDS_ASH_STATUS_TRAY_NETWORK_WIFI),
|
| - network_list_delegate_(network_list_delegate),
|
| join_(nullptr) {}
|
|
|
| ~WifiHeaderRowView() override {}
|
| @@ -252,7 +292,10 @@ class WifiHeaderRowView : public NetworkListView::SectionHeaderRowView {
|
|
|
| void ButtonPressed(views::Button* sender, const ui::Event& event) override {
|
| if (sender == join_) {
|
| - network_list_delegate_->OnOtherWifiClicked();
|
| + ShellPort::Get()->RecordUserMetricsAction(
|
| + UMA_STATUS_AREA_NETWORK_JOIN_OTHER_CLICKED);
|
| + Shell::Get()->system_tray_controller()->ShowNetworkCreate(
|
| + shill::kTypeWifi);
|
| return;
|
| }
|
| SectionHeaderRowView::ButtonPressed(sender, event);
|
| @@ -271,8 +314,6 @@ class WifiHeaderRowView : public NetworkListView::SectionHeaderRowView {
|
| // .30 * .38 opacity for disabled icon.
|
| static constexpr int kDisabledJoinIconAlpha = 0x1D;
|
|
|
| - NetworkListDelegate* network_list_delegate_;
|
| -
|
| // A button to invoke "Join Wi-Fi network" dialog.
|
| SystemMenuButton* join_;
|
|
|
| @@ -283,9 +324,10 @@ class WifiHeaderRowView : public NetworkListView::SectionHeaderRowView {
|
|
|
| // NetworkListView:
|
|
|
| -NetworkListView::NetworkListView(NetworkListDelegate* delegate)
|
| - : needs_relayout_(false),
|
| - delegate_(delegate),
|
| +NetworkListView::NetworkListView(
|
| + tray::NetworkStateListDetailedView* detailed_view)
|
| + : NetworkListViewBase(detailed_view),
|
| + needs_relayout_(false),
|
| no_wifi_networks_view_(nullptr),
|
| no_cellular_networks_view_(nullptr),
|
| cellular_header_view_(nullptr),
|
| @@ -294,9 +336,7 @@ NetworkListView::NetworkListView(NetworkListDelegate* delegate)
|
| cellular_separator_view_(nullptr),
|
| tether_separator_view_(nullptr),
|
| wifi_separator_view_(nullptr),
|
| - connection_warning_(nullptr) {
|
| - CHECK(delegate_);
|
| -}
|
| + connection_warning_(nullptr) {}
|
|
|
| NetworkListView::~NetworkListView() {
|
| network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
|
| @@ -345,9 +385,8 @@ void NetworkListView::UpdateNetworks(
|
| last_network_info_map_[info->guid] = std::move(info);
|
|
|
| network_list_.clear();
|
| - const NetworkTypePattern pattern = delegate_->GetNetworkTypePattern();
|
| for (const auto* network : networks) {
|
| - if (!pattern.MatchesType(network->type()))
|
| + if (!NetworkTypePattern::NonVirtual().MatchesType(network->type()))
|
| continue;
|
|
|
| // Do not add Wi-Fi networks that are associated with a Tether network.
|
| @@ -474,7 +513,7 @@ void NetworkListView::UpdateNetworkListInternal() {
|
| }
|
| }
|
| container()->SizeToPreferredSize();
|
| - delegate_->RelayoutScrollList();
|
| + detailed_view()->RelayoutScrollList();
|
| if (selected_view)
|
| container()->ScrollRectToVisible(selected_view->bounds());
|
| }
|
| @@ -505,32 +544,29 @@ NetworkListView::UpdateNetworkListEntries() {
|
| UpdateNetworkChildren(NetworkInfo::Type::UNKNOWN, index);
|
| index += new_guids->size();
|
|
|
| - const NetworkTypePattern pattern = delegate_->GetNetworkTypePattern();
|
| - if (pattern.MatchesPattern(NetworkTypePattern::Cellular())) {
|
| - if (handler->IsTechnologyAvailable(NetworkTypePattern::Cellular())) {
|
| - index = UpdateSectionHeaderRow(
|
| - NetworkTypePattern::Cellular(),
|
| - handler->IsTechnologyEnabled(NetworkTypePattern::Cellular()), index,
|
| - &cellular_header_view_, &cellular_separator_view_);
|
| - }
|
| -
|
| - // Cellular initializing.
|
| - int message_id = network_icon::GetCellularUninitializedMsg();
|
| - if (!message_id &&
|
| - handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()) &&
|
| - !handler->FirstNetworkByType(NetworkTypePattern::Mobile())) {
|
| - message_id = IDS_ASH_STATUS_TRAY_NO_MOBILE_NETWORKS;
|
| - }
|
| - UpdateInfoLabel(message_id, index, &no_cellular_networks_view_);
|
| - if (message_id)
|
| - ++index;
|
| + if (handler->IsTechnologyAvailable(NetworkTypePattern::Cellular())) {
|
| + index = UpdateSectionHeaderRow(
|
| + NetworkTypePattern::Cellular(),
|
| + handler->IsTechnologyEnabled(NetworkTypePattern::Cellular()), index,
|
| + &cellular_header_view_, &cellular_separator_view_);
|
| + }
|
|
|
| - // Add cellular networks.
|
| - std::unique_ptr<std::set<std::string>> new_cellular_guids =
|
| - UpdateNetworkChildren(NetworkInfo::Type::CELLULAR, index);
|
| - index += new_cellular_guids->size();
|
| - new_guids->insert(new_cellular_guids->begin(), new_cellular_guids->end());
|
| + // Cellular initializing.
|
| + int cellular_message_id = network_icon::GetCellularUninitializedMsg();
|
| + if (!cellular_message_id &&
|
| + handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()) &&
|
| + !handler->FirstNetworkByType(NetworkTypePattern::Mobile())) {
|
| + cellular_message_id = IDS_ASH_STATUS_TRAY_NO_MOBILE_NETWORKS;
|
| }
|
| + UpdateInfoLabel(cellular_message_id, index, &no_cellular_networks_view_);
|
| + if (cellular_message_id)
|
| + ++index;
|
| +
|
| + // Add cellular networks.
|
| + std::unique_ptr<std::set<std::string>> new_cellular_guids =
|
| + UpdateNetworkChildren(NetworkInfo::Type::CELLULAR, index);
|
| + index += new_cellular_guids->size();
|
| + new_guids->insert(new_cellular_guids->begin(), new_cellular_guids->end());
|
|
|
| // TODO (hansberry): Audit existing usage of NonVirtual and consider changing
|
| // it to include Tether. See crbug.com/693647.
|
| @@ -541,8 +577,8 @@ NetworkListView::UpdateNetworkListEntries() {
|
| &tether_header_view_, &tether_separator_view_);
|
|
|
| // TODO (hansberry): Should a message similar to
|
| - // IDS_ASH_STATUS_TRAY_NO_CELLULAR_NETWORKS be shown if Tether technology
|
| - // is enabled but no networks are around?
|
| + // IDS_ASH_STATUS_TRAY_NO_CELLULAR_NETWORKS be shown if Tether technology is
|
| + // enabled but no networks are around?
|
|
|
| // Add Tether networks.
|
| std::unique_ptr<std::set<std::string>> new_tether_guids =
|
| @@ -551,29 +587,27 @@ NetworkListView::UpdateNetworkListEntries() {
|
| new_guids->insert(new_tether_guids->begin(), new_tether_guids->end());
|
| }
|
|
|
| - if (pattern.MatchesPattern(NetworkTypePattern::WiFi())) {
|
| - index = UpdateSectionHeaderRow(
|
| - NetworkTypePattern::WiFi(),
|
| - handler->IsTechnologyEnabled(NetworkTypePattern::WiFi()), index,
|
| - &wifi_header_view_, &wifi_separator_view_);
|
| -
|
| - // "Wifi Enabled / Disabled".
|
| - int message_id = 0;
|
| - if (network_list_.empty()) {
|
| - message_id = handler->IsTechnologyEnabled(NetworkTypePattern::WiFi())
|
| - ? IDS_ASH_STATUS_TRAY_NETWORK_WIFI_ENABLED
|
| - : IDS_ASH_STATUS_TRAY_NETWORK_WIFI_DISABLED;
|
| - }
|
| - UpdateInfoLabel(message_id, index, &no_wifi_networks_view_);
|
| - if (message_id)
|
| - ++index;
|
| -
|
| - // Add Wi-Fi networks.
|
| - std::unique_ptr<std::set<std::string>> new_wifi_guids =
|
| - UpdateNetworkChildren(NetworkInfo::Type::WIFI, index);
|
| - index += new_wifi_guids->size();
|
| - new_guids->insert(new_wifi_guids->begin(), new_wifi_guids->end());
|
| + index = UpdateSectionHeaderRow(
|
| + NetworkTypePattern::WiFi(),
|
| + handler->IsTechnologyEnabled(NetworkTypePattern::WiFi()), index,
|
| + &wifi_header_view_, &wifi_separator_view_);
|
| +
|
| + // "Wifi Enabled / Disabled".
|
| + int wifi_message_id = 0;
|
| + if (network_list_.empty()) {
|
| + wifi_message_id = handler->IsTechnologyEnabled(NetworkTypePattern::WiFi())
|
| + ? IDS_ASH_STATUS_TRAY_NETWORK_WIFI_ENABLED
|
| + : IDS_ASH_STATUS_TRAY_NETWORK_WIFI_DISABLED;
|
| }
|
| + UpdateInfoLabel(wifi_message_id, index, &no_wifi_networks_view_);
|
| + if (wifi_message_id)
|
| + ++index;
|
| +
|
| + // Add Wi-Fi networks.
|
| + std::unique_ptr<std::set<std::string>> new_wifi_guids =
|
| + UpdateNetworkChildren(NetworkInfo::Type::WIFI, index);
|
| + index += new_wifi_guids->size();
|
| + new_guids->insert(new_wifi_guids->begin(), new_wifi_guids->end());
|
|
|
| // No networks or other messages (fallback).
|
| if (index == 0) {
|
| @@ -584,6 +618,63 @@ NetworkListView::UpdateNetworkListEntries() {
|
| return new_guids;
|
| }
|
|
|
| +HoverHighlightView* NetworkListView::CreateViewForNetwork(
|
| + const NetworkInfo& info) {
|
| + HoverHighlightView* container = new HoverHighlightView(detailed_view());
|
| + if (info.connected)
|
| + SetupConnectedItem(container, info.label, info.image);
|
| + else if (info.connecting)
|
| + SetupConnectingItem(container, info.label, info.image);
|
| + else
|
| + container->AddIconAndLabel(info.image, info.label);
|
| + container->SetTooltipText(info.tooltip);
|
| + views::View* controlled_icon = CreateControlledByExtensionView(info);
|
| + if (controlled_icon)
|
| + container->AddChildView(controlled_icon);
|
| + return container;
|
| +}
|
| +
|
| +void NetworkListView::UpdateViewForNetwork(HoverHighlightView* view,
|
| + const NetworkInfo& info) {
|
| + DCHECK(!view->has_children());
|
| + if (info.connected)
|
| + SetupConnectedItem(view, info.label, info.image);
|
| + else if (info.connecting)
|
| + SetupConnectingItem(view, info.label, info.image);
|
| + else
|
| + view->AddIconAndLabel(info.image, info.label);
|
| + views::View* controlled_icon = CreateControlledByExtensionView(info);
|
| + view->SetTooltipText(info.tooltip);
|
| + if (controlled_icon)
|
| + view->AddChildView(controlled_icon);
|
| +}
|
| +
|
| +views::View* NetworkListView::CreateControlledByExtensionView(
|
| + const NetworkInfo& info) {
|
| + NetworkingConfigDelegate* networking_config_delegate =
|
| + Shell::Get()->system_tray_delegate()->GetNetworkingConfigDelegate();
|
| + if (!networking_config_delegate)
|
| + return nullptr;
|
| + std::unique_ptr<const NetworkingConfigDelegate::ExtensionInfo>
|
| + extension_info =
|
| + networking_config_delegate->LookUpExtensionForNetwork(info.guid);
|
| + if (!extension_info)
|
| + return nullptr;
|
| +
|
| + // Get the tooltip text.
|
| + base::string16 tooltip_text = l10n_util::GetStringFUTF16(
|
| + IDS_ASH_STATUS_TRAY_EXTENSION_CONTROLLED_WIFI,
|
| + base::UTF8ToUTF16(extension_info->extension_name));
|
| +
|
| + views::ImageView* controlled_icon =
|
| + new FixedSizedImageView(kTrayPopupDetailsIconWidth, 0);
|
| +
|
| + controlled_icon->SetImage(
|
| + gfx::CreateVectorIcon(kCaptivePortalIcon, kMenuIconColor));
|
| + controlled_icon->SetTooltipText(tooltip_text);
|
| + return controlled_icon;
|
| +}
|
| +
|
| std::unique_ptr<std::set<std::string>> NetworkListView::UpdateNetworkChildren(
|
| NetworkInfo::Type type,
|
| int index) {
|
| @@ -598,15 +689,15 @@ std::unique_ptr<std::set<std::string>> NetworkListView::UpdateNetworkChildren(
|
| }
|
|
|
| void NetworkListView::UpdateNetworkChild(int index, const NetworkInfo* info) {
|
| - views::View* network_view = nullptr;
|
| + HoverHighlightView* network_view = nullptr;
|
| NetworkGuidMap::const_iterator found = network_guid_map_.find(info->guid);
|
| if (found == network_guid_map_.end()) {
|
| - network_view = delegate_->CreateViewForNetwork(*info);
|
| + network_view = CreateViewForNetwork(*info);
|
| } else {
|
| network_view = found->second;
|
| if (NeedUpdateViewForNetwork(*info)) {
|
| network_view->RemoveAllChildViews(true);
|
| - delegate_->UpdateViewForNetwork(network_view, *info);
|
| + UpdateViewForNetwork(network_view, *info);
|
| network_view->Layout();
|
| network_view->SchedulePaint();
|
| }
|
| @@ -643,8 +734,16 @@ void NetworkListView::UpdateInfoLabel(int message_id,
|
| }
|
| base::string16 text =
|
| ui::ResourceBundle::GetSharedInstance().GetLocalizedString(message_id);
|
| - if (!label)
|
| - label = delegate_->CreateInfoLabel();
|
| + if (!label) {
|
| + // TODO(mohsen): Update info label to follow MD specs. See
|
| + // https://crbug.com/687778.
|
| + label = new views::Label();
|
| + label->SetBorder(views::CreateEmptyBorder(
|
| + kTrayPopupPaddingBetweenItems, kTrayPopupPaddingHorizontal,
|
| + kTrayPopupPaddingBetweenItems, 0));
|
| + label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + label->SetEnabledColor(SkColorSetARGB(192, 0, 0, 0));
|
| + }
|
| label->SetText(text);
|
| PlaceViewAtIndex(label, insertion_index);
|
| *label_ptr = label;
|
| @@ -661,7 +760,7 @@ int NetworkListView::UpdateSectionHeaderRow(NetworkTypePattern pattern,
|
| else if (pattern.Equals(NetworkTypePattern::Tether()))
|
| *view = new TetherHeaderRowView();
|
| else if (pattern.Equals(NetworkTypePattern::WiFi()))
|
| - *view = new WifiHeaderRowView(delegate_);
|
| + *view = new WifiHeaderRowView();
|
| else
|
| NOTREACHED();
|
| (*view)->Init(enabled);
|
|
|