Index: ash/common/system/chromeos/network/network_state_list_detailed_view.cc |
diff --git a/ash/common/system/chromeos/network/network_state_list_detailed_view.cc b/ash/common/system/chromeos/network/network_state_list_detailed_view.cc |
deleted file mode 100644 |
index 99332efcd74e48c49c0b7a106ec87698148d7268..0000000000000000000000000000000000000000 |
--- a/ash/common/system/chromeos/network/network_state_list_detailed_view.cc |
+++ /dev/null |
@@ -1,758 +0,0 @@ |
-// Copyright (c) 2012 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/network_state_list_detailed_view.h" |
- |
-#include <algorithm> |
-#include <vector> |
- |
-#include "ash/common/ash_constants.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_info.h" |
-#include "ash/common/system/chromeos/network/network_list.h" |
-#include "ash/common/system/chromeos/network/network_list_md.h" |
-#include "ash/common/system/chromeos/network/network_list_view_base.h" |
-#include "ash/common/system/chromeos/network/tray_network_state_observer.h" |
-#include "ash/common/system/chromeos/network/vpn_list_view.h" |
-#include "ash/common/system/networking_config_delegate.h" |
-#include "ash/common/system/tray/fixed_sized_image_view.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.h" |
-#include "ash/common/system/tray/system_tray_controller.h" |
-#include "ash/common/system/tray/system_tray_delegate.h" |
-#include "ash/common/system/tray/throbber_view.h" |
-#include "ash/common/system/tray/tray_constants.h" |
-#include "ash/common/system/tray/tray_details_view.h" |
-#include "ash/common/system/tray/tray_popup_header_button.h" |
-#include "ash/common/system/tray/tri_view.h" |
-#include "ash/common/wm_shell.h" |
-#include "ash/common/wm_window.h" |
-#include "ash/public/cpp/shell_window_ids.h" |
-#include "ash/resources/grit/ash_resources.h" |
-#include "ash/root_window_controller.h" |
-#include "ash/strings/grit/ash_strings.h" |
-#include "base/command_line.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "base/time/time.h" |
-#include "chromeos/chromeos_switches.h" |
-#include "chromeos/login/login_state.h" |
-#include "chromeos/network/device_state.h" |
-#include "chromeos/network/managed_network_configuration_handler.h" |
-#include "chromeos/network/network_connect.h" |
-#include "chromeos/network/network_state.h" |
-#include "chromeos/network/network_state_handler.h" |
-#include "third_party/cros_system_api/dbus/service_constants.h" |
-#include "ui/accessibility/ax_node_data.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/compositor/layer.h" |
-#include "ui/compositor/scoped_layer_animation_settings.h" |
-#include "ui/gfx/text_constants.h" |
-#include "ui/views/bubble/bubble_dialog_delegate.h" |
-#include "ui/views/controls/label.h" |
-#include "ui/views/controls/scroll_view.h" |
-#include "ui/views/layout/box_layout.h" |
-#include "ui/views/layout/fill_layout.h" |
-#include "ui/views/layout/layout_manager.h" |
-#include "ui/views/painter.h" |
-#include "ui/views/widget/widget.h" |
- |
-using chromeos::DeviceState; |
-using chromeos::LoginState; |
-using chromeos::NetworkHandler; |
-using chromeos::NetworkState; |
-using chromeos::NetworkStateHandler; |
-using chromeos::NetworkTypePattern; |
- |
-namespace ash { |
-namespace tray { |
-namespace { |
- |
-bool UseMd() { |
- return MaterialDesignController::IsSystemTrayMenuMaterial(); |
-} |
- |
-// Delay between scan requests. |
-const int kRequestScanDelaySeconds = 10; |
- |
-// Create a label with the font size and color used in the network info bubble. |
-views::Label* CreateInfoBubbleLabel(const base::string16& text) { |
- views::Label* label = new views::Label(text); |
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
- label->SetFontList(rb.GetFontList(ui::ResourceBundle::SmallFont)); |
- label->SetEnabledColor(SkColorSetARGB(127, 0, 0, 0)); |
- return label; |
-} |
- |
-// Create a row of labels for the network info bubble. |
-views::View* CreateInfoBubbleLine(const base::string16& text_label, |
- const std::string& text_string) { |
- views::View* view = new views::View; |
- view->SetLayoutManager( |
- new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 1)); |
- view->AddChildView(CreateInfoBubbleLabel(text_label)); |
- view->AddChildView(CreateInfoBubbleLabel(base::UTF8ToUTF16(": "))); |
- view->AddChildView(CreateInfoBubbleLabel(base::UTF8ToUTF16(text_string))); |
- return view; |
-} |
- |
-// TODO(varkha): Consolidate with a similar method in tray_bluetooth.cc. |
-void SetupConnectedItemMd(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): Consolidate with a similar method in tray_bluetooth.cc. |
-void SetupConnectingItemMd(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 bubble which displays network info. |
-class NetworkStateListDetailedView::InfoBubble |
- : public views::BubbleDialogDelegateView { |
- public: |
- InfoBubble(views::View* anchor, |
- views::View* content, |
- NetworkStateListDetailedView* detailed_view) |
- : views::BubbleDialogDelegateView(anchor, views::BubbleBorder::TOP_RIGHT), |
- detailed_view_(detailed_view) { |
- set_can_activate(false); |
- SetLayoutManager(new views::FillLayout()); |
- AddChildView(content); |
- } |
- |
- ~InfoBubble() override { detailed_view_->OnInfoBubbleDestroyed(); } |
- |
- private: |
- // BubbleDialogDelegateView: |
- int GetDialogButtons() const override { return ui::DIALOG_BUTTON_NONE; } |
- |
- void OnBeforeBubbleWidgetInit(views::Widget::InitParams* params, |
- views::Widget* widget) const override { |
- DCHECK(anchor_widget()); |
- // Place the bubble in the anchor widget's root window. |
- WmWindow::Get(anchor_widget()->GetNativeWindow()) |
- ->GetRootWindowController() |
- ->ConfigureWidgetInitParamsForContainer( |
- widget, kShellWindowId_SettingBubbleContainer, params); |
- params->name = "NetworkStateListDetailedView::InfoBubble"; |
- } |
- |
- // Not owned. |
- NetworkStateListDetailedView* detailed_view_; |
- |
- DISALLOW_COPY_AND_ASSIGN(InfoBubble); |
-}; |
- |
-//------------------------------------------------------------------------------ |
- |
-const int kFadeIconMs = 500; |
- |
-// A throbber view that fades in/out when shown/hidden. |
-class ScanningThrobber : public ThrobberView { |
- public: |
- ScanningThrobber() { |
- SetPaintToLayer(); |
- layer()->SetFillsBoundsOpaquely(false); |
- layer()->SetOpacity(1.0); |
- accessible_name_ = |
- l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_WIFI_SCANNING_MESSAGE); |
- } |
- ~ScanningThrobber() override {} |
- |
- // views::View |
- void SetVisible(bool visible) override { |
- layer()->GetAnimator()->StopAnimating(); // Stop any previous animation. |
- ui::ScopedLayerAnimationSettings animation(layer()->GetAnimator()); |
- animation.SetTransitionDuration( |
- base::TimeDelta::FromMilliseconds(kFadeIconMs)); |
- layer()->SetOpacity(visible ? 1.0 : 0.0); |
- } |
- |
- void GetAccessibleNodeData(ui::AXNodeData* node_data) override { |
- node_data->SetName(accessible_name_); |
- node_data->role = ui::AX_ROLE_BUSY_INDICATOR; |
- } |
- |
- private: |
- base::string16 accessible_name_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ScanningThrobber); |
-}; |
- |
-//------------------------------------------------------------------------------ |
- |
-// An image button showing the info icon similar to TrayPopupHeaderButton, |
-// but without the toggle properties, that fades in/out when shown/hidden. |
-class InfoIcon : public views::ImageButton { |
- public: |
- explicit InfoIcon(views::ButtonListener* listener) |
- : views::ImageButton(listener) { |
- ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); |
- SetImage( |
- STATE_NORMAL, |
- bundle.GetImageNamed(IDR_AURA_UBER_TRAY_NETWORK_INFO).ToImageSkia()); |
- SetImage(STATE_HOVERED, |
- bundle.GetImageNamed(IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER) |
- .ToImageSkia()); |
- SetImageAlignment(ALIGN_CENTER, ALIGN_MIDDLE); |
- SetAccessibleName( |
- bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_INFO)); |
- SetPaintToLayer(); |
- layer()->SetFillsBoundsOpaquely(false); |
- layer()->SetOpacity(1.0); |
- } |
- |
- ~InfoIcon() override {} |
- |
- // views::View |
- gfx::Size GetPreferredSize() const override { |
- return gfx::Size(kTrayPopupItemMinHeight, kTrayPopupItemMinHeight); |
- } |
- |
- void SetVisible(bool visible) override { |
- layer()->GetAnimator()->StopAnimating(); // Stop any previous animation. |
- ui::ScopedLayerAnimationSettings animation(layer()->GetAnimator()); |
- animation.SetTransitionDuration( |
- base::TimeDelta::FromMilliseconds(kFadeIconMs)); |
- layer()->SetOpacity(visible ? 1.0 : 0.0); |
- } |
- |
- // views::CustomButton |
- void StateChanged(ButtonState old_state) override { |
- if (state() == STATE_HOVERED || state() == STATE_PRESSED) { |
- set_background(views::Background::CreateSolidBackground( |
- kTrayPopupHoverBackgroundColor)); |
- } else { |
- set_background(nullptr); |
- } |
- SchedulePaint(); |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(InfoIcon); |
-}; |
- |
-//------------------------------------------------------------------------------ |
- |
-// Special layout to overlap the scanning throbber and the info button. |
-class InfoThrobberLayout : public views::LayoutManager { |
- public: |
- InfoThrobberLayout() {} |
- ~InfoThrobberLayout() override {} |
- |
- // views::LayoutManager |
- void Layout(views::View* host) override { |
- gfx::Size max_size(GetMaxChildSize(host)); |
- // Center each child view within |max_size|. |
- for (int i = 0; i < host->child_count(); ++i) { |
- views::View* child = host->child_at(i); |
- if (!child->visible()) |
- continue; |
- gfx::Size child_size = child->GetPreferredSize(); |
- gfx::Point origin; |
- origin.set_x((max_size.width() - child_size.width()) / 2); |
- origin.set_y((max_size.height() - child_size.height()) / 2); |
- gfx::Rect bounds(origin, child_size); |
- bounds.Inset(-host->GetInsets()); |
- child->SetBoundsRect(bounds); |
- } |
- } |
- |
- gfx::Size GetPreferredSize(const views::View* host) const override { |
- gfx::Point origin; |
- gfx::Rect rect(origin, GetMaxChildSize(host)); |
- rect.Inset(-host->GetInsets()); |
- return rect.size(); |
- } |
- |
- private: |
- gfx::Size GetMaxChildSize(const views::View* host) const { |
- int width = 0, height = 0; |
- for (int i = 0; i < host->child_count(); ++i) { |
- const views::View* child = host->child_at(i); |
- if (!child->visible()) |
- continue; |
- gfx::Size child_size = child->GetPreferredSize(); |
- width = std::max(width, child_size.width()); |
- height = std::max(height, child_size.width()); |
- } |
- return gfx::Size(width, height); |
- } |
- |
- DISALLOW_COPY_AND_ASSIGN(InfoThrobberLayout); |
-}; |
- |
-//------------------------------------------------------------------------------ |
-// NetworkStateListDetailedView |
- |
-NetworkStateListDetailedView::NetworkStateListDetailedView( |
- SystemTrayItem* owner, |
- ListType list_type, |
- LoginStatus login) |
- : NetworkDetailedView(owner), |
- list_type_(list_type), |
- login_(login), |
- prev_wifi_scanning_state_(false), |
- info_icon_(nullptr), |
- info_button_md_(nullptr), |
- settings_button_md_(nullptr), |
- proxy_settings_button_md_(nullptr), |
- info_bubble_(nullptr), |
- scanning_throbber_(nullptr) { |
- if (list_type == LIST_TYPE_VPN) { |
- // Use a specialized class to list VPNs. |
- network_list_view_.reset(new VPNListView(this)); |
- } else { |
- // Use a common class to list any other network types. |
- // TODO(varkha): NetworkListViewMd is a temporary fork of NetworkListView. |
- // NetworkListView will go away when Material Design becomes default. |
- // See crbug.com/614453. |
- if (UseMd()) |
- network_list_view_.reset(new NetworkListViewMd(this)); |
- else |
- network_list_view_.reset(new NetworkListView(this)); |
- } |
-} |
- |
-NetworkStateListDetailedView::~NetworkStateListDetailedView() { |
- if (info_bubble_) |
- info_bubble_->GetWidget()->CloseNow(); |
-} |
- |
-void NetworkStateListDetailedView::Update() { |
- UpdateNetworkList(); |
- UpdateHeaderButtons(); |
- Layout(); |
-} |
- |
-// Overridden from NetworkDetailedView: |
- |
-void NetworkStateListDetailedView::Init() { |
- Reset(); |
- info_icon_ = nullptr; |
- info_button_md_ = nullptr; |
- settings_button_md_ = nullptr; |
- proxy_settings_button_md_ = nullptr; |
- scanning_throbber_ = nullptr; |
- |
- CreateScrollableList(); |
- if (!UseMd()) |
- CreateNetworkExtra(); |
- CreateTitleRow(list_type_ == ListType::LIST_TYPE_NETWORK |
- ? IDS_ASH_STATUS_TRAY_NETWORK |
- : IDS_ASH_STATUS_TRAY_VPN); |
- |
- network_list_view_->set_container(scroll_content()); |
- Update(); |
- |
- if (list_type_ != LIST_TYPE_VPN) |
- CallRequestScan(); |
-} |
- |
-NetworkDetailedView::DetailedViewType |
-NetworkStateListDetailedView::GetViewType() const { |
- return STATE_LIST_VIEW; |
-} |
- |
-void NetworkStateListDetailedView::HandleButtonPressed(views::Button* sender, |
- const ui::Event& event) { |
- if (sender == info_button_md_) { |
- ToggleInfoBubble(); |
- return; |
- } else if (sender == settings_button_md_) { |
- ShowSettings(); |
- } else if (sender == proxy_settings_button_md_) { |
- WmShell::Get()->system_tray_controller()->ShowProxySettings(); |
- } |
- |
- if (owner()->system_tray()) |
- owner()->system_tray()->CloseSystemBubble(); |
-} |
- |
-void NetworkStateListDetailedView::HandleViewClicked(views::View* view) { |
- // If the info bubble was visible, close it when some other item is clicked. |
- ResetInfoBubble(); |
- |
- if (login_ == LoginStatus::LOCKED) |
- return; |
- |
- std::string guid; |
- if (!network_list_view_->IsNetworkEntry(view, &guid)) |
- return; |
- |
- const NetworkState* network = |
- NetworkHandler::Get()->network_state_handler()->GetNetworkStateFromGuid( |
- guid); |
- if (!network || network->IsConnectedState() || network->IsConnectingState()) { |
- WmShell::Get()->RecordUserMetricsAction( |
- list_type_ == LIST_TYPE_VPN |
- ? UMA_STATUS_AREA_SHOW_VPN_CONNECTION_DETAILS |
- : UMA_STATUS_AREA_SHOW_NETWORK_CONNECTION_DETAILS); |
- WmShell::Get()->system_tray_controller()->ShowNetworkSettings( |
- network ? network->guid() : std::string()); |
- } else { |
- WmShell::Get()->RecordUserMetricsAction( |
- list_type_ == LIST_TYPE_VPN |
- ? UMA_STATUS_AREA_CONNECT_TO_VPN |
- : UMA_STATUS_AREA_CONNECT_TO_CONFIGURED_NETWORK); |
- chromeos::NetworkConnect::Get()->ConnectToNetworkId(network->guid()); |
- } |
-} |
- |
-void NetworkStateListDetailedView::CreateExtraTitleRowButtons() { |
- if (login_ == LoginStatus::LOCKED) |
- return; |
- |
- DCHECK(!info_button_md_); |
- tri_view()->SetContainerVisible(TriView::Container::END, true); |
- |
- info_button_md_ = new SystemMenuButton( |
- this, TrayPopupInkDropStyle::HOST_CENTERED, kSystemMenuInfoIcon, |
- IDS_ASH_STATUS_TRAY_NETWORK_INFO); |
- tri_view()->AddView(TriView::Container::END, info_button_md_); |
- |
- if (login_ != LoginStatus::NOT_LOGGED_IN) { |
- DCHECK(!settings_button_md_); |
- settings_button_md_ = new SystemMenuButton( |
- this, TrayPopupInkDropStyle::HOST_CENTERED, kSystemMenuSettingsIcon, |
- IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS); |
- |
- // Allow the user to access settings only if user is logged in |
- // and showing settings is allowed. There are situations (supervised user |
- // creation flow) when session is started but UI flow continues within |
- // login UI, i.e., no browser window is yet avaialable. |
- if (!WmShell::Get()->system_tray_delegate()->ShouldShowSettings()) |
- settings_button_md_->SetEnabled(false); |
- |
- tri_view()->AddView(TriView::Container::END, settings_button_md_); |
- } else { |
- proxy_settings_button_md_ = new SystemMenuButton( |
- this, TrayPopupInkDropStyle::HOST_CENTERED, kSystemMenuSettingsIcon, |
- IDS_ASH_STATUS_TRAY_NETWORK_PROXY_SETTINGS); |
- tri_view()->AddView(TriView::Container::END, proxy_settings_button_md_); |
- } |
-} |
- |
-void NetworkStateListDetailedView::ShowSettings() { |
- WmShell::Get()->RecordUserMetricsAction( |
- list_type_ == LIST_TYPE_VPN ? UMA_STATUS_AREA_VPN_SETTINGS_OPENED |
- : UMA_STATUS_AREA_NETWORK_SETTINGS_OPENED); |
- WmShell::Get()->system_tray_controller()->ShowNetworkSettings(std::string()); |
-} |
- |
-void NetworkStateListDetailedView::CreateNetworkExtra() { |
- DCHECK(!UseMd()); |
-} |
- |
-void NetworkStateListDetailedView::SetScanningStateForThrobberView( |
- bool is_scanning) { |
- if (UseMd()) |
- return; |
- |
- // Hide the network info button if the device is scanning for Wi-Fi networks |
- // and display the WiFi scanning indicator. |
- info_icon_->SetVisible(!is_scanning); |
- scanning_throbber_->SetVisible(is_scanning); |
- // Set the element, network info button or the wifi scanning indicator, as |
- // focusable based on which one is active/visible. |
- // NOTE: As we do not want to lose focus from the network info throbber view, |
- // the order of below operation is important. |
- if (is_scanning) { |
- scanning_throbber_->SetFocusBehavior(FocusBehavior::ALWAYS); |
- info_icon_->SetFocusBehavior(FocusBehavior::NEVER); |
- } else { |
- info_icon_->SetFocusBehavior(FocusBehavior::ALWAYS); |
- scanning_throbber_->SetFocusBehavior(FocusBehavior::NEVER); |
- } |
- // If the Network Info view was in focus while this toggle operation was |
- // being performed then the focus should remain on this view. |
- if (info_icon_->HasFocus() && is_scanning) |
- scanning_throbber_->RequestFocus(); |
- else if (scanning_throbber_->HasFocus() && !is_scanning) |
- info_icon_->RequestFocus(); |
-} |
- |
-void NetworkStateListDetailedView::UpdateTechnologyButton( |
- TrayPopupHeaderButton* button, |
- const NetworkTypePattern& technology) { |
- NetworkStateHandler::TechnologyState state = |
- NetworkHandler::Get()->network_state_handler()->GetTechnologyState( |
- technology); |
- if (state == NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) { |
- button->SetVisible(false); |
- return; |
- } |
- button->SetVisible(true); |
- if (state == NetworkStateHandler::TECHNOLOGY_AVAILABLE) { |
- button->SetEnabled(true); |
- button->SetToggled(true); |
- } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLED) { |
- button->SetEnabled(true); |
- button->SetToggled(false); |
- } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLING) { |
- button->SetEnabled(false); |
- button->SetToggled(false); |
- } else { // Initializing |
- button->SetEnabled(false); |
- button->SetToggled(true); |
- } |
-} |
- |
-void NetworkStateListDetailedView::UpdateNetworkList() { |
- network_list_view_->Update(); |
-} |
- |
-void NetworkStateListDetailedView::UpdateHeaderButtons() { |
- if (proxy_settings_button_md_) { |
- proxy_settings_button_md_->SetEnabled( |
- NetworkHandler::Get()->network_state_handler()->DefaultNetwork() != |
- nullptr); |
- } |
-} |
- |
-bool NetworkStateListDetailedView::OrderChild(views::View* view, int index) { |
- if (scroll_content()->child_at(index) != view) { |
- scroll_content()->ReorderChildView(view, index); |
- return true; |
- } |
- return false; |
-} |
- |
-void NetworkStateListDetailedView::CreateSettingsEntry() { |
- DCHECK(!UseMd()); |
-} |
- |
-void NetworkStateListDetailedView::ToggleInfoBubble() { |
- if (ResetInfoBubble()) |
- return; |
- |
- info_bubble_ = new InfoBubble(UseMd() ? info_button_md_ : info_icon_, |
- CreateNetworkInfoView(), this); |
- views::BubbleDialogDelegateView::CreateBubble(info_bubble_)->Show(); |
- info_bubble_->NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, false); |
-} |
- |
-bool NetworkStateListDetailedView::ResetInfoBubble() { |
- if (!info_bubble_) |
- return false; |
- info_bubble_->GetWidget()->Close(); |
- info_bubble_ = nullptr; |
- return true; |
-} |
- |
-void NetworkStateListDetailedView::OnInfoBubbleDestroyed() { |
- info_bubble_ = nullptr; |
-} |
- |
-views::View* NetworkStateListDetailedView::CreateNetworkInfoView() { |
- ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); |
- NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); |
- |
- std::string ip_address, ipv6_address; |
- const NetworkState* network = handler->DefaultNetwork(); |
- if (network) { |
- const DeviceState* device = handler->GetDeviceState(network->device_path()); |
- if (device) { |
- ip_address = device->GetIpAddressByType(shill::kTypeIPv4); |
- ipv6_address = device->GetIpAddressByType(shill::kTypeIPv6); |
- } |
- } |
- |
- views::View* container = new views::View; |
- container->SetLayoutManager( |
- new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1)); |
- container->SetBorder(views::CreateEmptyBorder(0, 5, 0, 5)); |
- |
- std::string ethernet_address, wifi_address, vpn_address; |
- if (list_type_ != LIST_TYPE_VPN) { |
- ethernet_address = handler->FormattedHardwareAddressForType( |
- NetworkTypePattern::Ethernet()); |
- wifi_address = |
- handler->FormattedHardwareAddressForType(NetworkTypePattern::WiFi()); |
- } else { |
- vpn_address = |
- handler->FormattedHardwareAddressForType(NetworkTypePattern::VPN()); |
- } |
- |
- if (!ip_address.empty()) { |
- container->AddChildView(CreateInfoBubbleLine( |
- bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_IP), ip_address)); |
- } |
- if (!ipv6_address.empty()) { |
- container->AddChildView(CreateInfoBubbleLine( |
- bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_IPV6), ipv6_address)); |
- } |
- if (!ethernet_address.empty()) { |
- container->AddChildView(CreateInfoBubbleLine( |
- bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_ETHERNET), |
- ethernet_address)); |
- } |
- if (!wifi_address.empty()) { |
- container->AddChildView(CreateInfoBubbleLine( |
- bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_WIFI), wifi_address)); |
- } |
- if (!vpn_address.empty()) { |
- container->AddChildView(CreateInfoBubbleLine( |
- bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_VPN), vpn_address)); |
- } |
- |
- // Avoid an empty bubble in the unlikely event that there is no network |
- // information at all. |
- if (!container->has_children()) { |
- container->AddChildView(CreateInfoBubbleLabel( |
- bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_NO_NETWORKS))); |
- } |
- |
- return container; |
-} |
- |
-const gfx::ImageSkia* |
-NetworkStateListDetailedView::GetControlledByExtensionIcon() { |
- // Lazily load the icon from the resource bundle. |
- if (controlled_by_extension_icon_.IsEmpty()) { |
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
- controlled_by_extension_icon_ = |
- rb.GetImageNamed(IDR_AURA_UBER_TRAY_NETWORK_CONTROLLED); |
- } |
- DCHECK(!controlled_by_extension_icon_.IsEmpty()); |
- return controlled_by_extension_icon_.ToImageSkia(); |
-} |
- |
-views::View* NetworkStateListDetailedView::CreateControlledByExtensionView( |
- const NetworkInfo& info) { |
- NetworkingConfigDelegate* networking_config_delegate = |
- WmShell::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(GetControlledByExtensionIcon()); |
- controlled_icon->SetTooltipText(tooltip_text); |
- return controlled_icon; |
-} |
- |
-void NetworkStateListDetailedView::CallRequestScan() { |
- VLOG(1) << "Requesting Network Scan."; |
- NetworkHandler::Get()->network_state_handler()->RequestScan(); |
- // Periodically request a scan while this UI is open. |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&NetworkStateListDetailedView::CallRequestScan, AsWeakPtr()), |
- base::TimeDelta::FromSeconds(kRequestScanDelaySeconds)); |
-} |
- |
-void NetworkStateListDetailedView::ToggleMobile() { |
- NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); |
- bool enabled = handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()); |
- chromeos::NetworkConnect::Get()->SetTechnologyEnabled( |
- NetworkTypePattern::Mobile(), !enabled); |
-} |
- |
-views::View* NetworkStateListDetailedView::CreateViewForNetwork( |
- const NetworkInfo& info) { |
- HoverHighlightView* container = new HoverHighlightView(this); |
- if (info.connected) |
- SetupConnectedItemMd(container, info.label, info.image); |
- else if (info.connecting) |
- SetupConnectingItemMd(container, info.label, info.image); |
- else |
- container->AddIconAndLabel(info.image, info.label, info.highlight); |
- container->set_tooltip(info.tooltip); |
- if (!UseMd()) { |
- container->SetBorder( |
- views::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal, 0, 0)); |
- } |
- views::View* controlled_icon = CreateControlledByExtensionView(info); |
- if (controlled_icon) |
- container->AddChildView(controlled_icon); |
- return container; |
-} |
- |
-bool NetworkStateListDetailedView::IsViewHovered(views::View* view) { |
- return static_cast<HoverHighlightView*>(view)->hover(); |
-} |
- |
-NetworkTypePattern NetworkStateListDetailedView::GetNetworkTypePattern() const { |
- return list_type_ == LIST_TYPE_VPN ? NetworkTypePattern::VPN() |
- : NetworkTypePattern::NonVirtual(); |
-} |
- |
-void NetworkStateListDetailedView::UpdateViewForNetwork( |
- views::View* view, |
- const NetworkInfo& info) { |
- HoverHighlightView* container = static_cast<HoverHighlightView*>(view); |
- DCHECK(!container->has_children()); |
- if (info.connected) |
- SetupConnectedItemMd(container, info.label, info.image); |
- else if (info.connecting) |
- SetupConnectingItemMd(container, info.label, info.image); |
- else |
- container->AddIconAndLabel(info.image, info.label, info.highlight); |
- views::View* controlled_icon = CreateControlledByExtensionView(info); |
- container->set_tooltip(info.tooltip); |
- if (controlled_icon) |
- view->AddChildView(controlled_icon); |
-} |
- |
-views::Label* NetworkStateListDetailedView::CreateInfoLabel() { |
- views::Label* label = new views::Label(); |
- label->SetBorder(views::CreateEmptyBorder(kTrayPopupPaddingBetweenItems, |
- kTrayPopupPaddingHorizontal, |
- kTrayPopupPaddingBetweenItems, 0)); |
- label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
- label->SetEnabledColor(SkColorSetARGB(192, 0, 0, 0)); |
- return label; |
-} |
- |
-void NetworkStateListDetailedView::OnNetworkEntryClicked(views::View* sender) { |
- HandleViewClicked(sender); |
-} |
- |
-void NetworkStateListDetailedView::OnOtherWifiClicked() { |
- WmShell::Get()->RecordUserMetricsAction( |
- UMA_STATUS_AREA_NETWORK_JOIN_OTHER_CLICKED); |
- WmShell::Get()->system_tray_controller()->ShowNetworkCreate(shill::kTypeWifi); |
-} |
- |
-void NetworkStateListDetailedView::RelayoutScrollList() { |
- scroller()->Layout(); |
-} |
- |
-} // namespace tray |
-} // namespace ash |