summaryrefslogtreecommitdiffstats
path: root/chromium/ash/system/chromeos/network/network_state_list_detailed_view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/system/chromeos/network/network_state_list_detailed_view.cc')
-rw-r--r--chromium/ash/system/chromeos/network/network_state_list_detailed_view.cc896
1 files changed, 0 insertions, 896 deletions
diff --git a/chromium/ash/system/chromeos/network/network_state_list_detailed_view.cc b/chromium/ash/system/chromeos/network/network_state_list_detailed_view.cc
deleted file mode 100644
index ed2d0382b63..00000000000
--- a/chromium/ash/system/chromeos/network/network_state_list_detailed_view.cc
+++ /dev/null
@@ -1,896 +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/system/chromeos/network/network_state_list_detailed_view.h"
-
-#include "ash/ash_switches.h"
-#include "ash/metrics/user_metrics_recorder.h"
-#include "ash/root_window_controller.h"
-#include "ash/shell.h"
-#include "ash/shell_delegate.h"
-#include "ash/shell_window_ids.h"
-#include "ash/system/chromeos/network/network_connect.h"
-#include "ash/system/chromeos/network/network_icon.h"
-#include "ash/system/chromeos/network/network_icon_animation.h"
-#include "ash/system/chromeos/network/tray_network_state_observer.h"
-#include "ash/system/tray/fixed_sized_scroll_view.h"
-#include "ash/system/tray/hover_highlight_view.h"
-#include "ash/system/tray/system_tray.h"
-#include "ash/system/tray/system_tray_delegate.h"
-#include "ash/system/tray/tray_constants.h"
-#include "ash/system/tray/tray_details_view.h"
-#include "ash/system/tray/tray_popup_header_button.h"
-#include "ash/system/tray/tray_popup_label_button.h"
-#include "base/command_line.h"
-#include "base/message_loop/message_loop.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
-#include "chromeos/chromeos_switches.h"
-#include "chromeos/network/device_state.h"
-#include "chromeos/network/favorite_state.h"
-#include "chromeos/network/network_configuration_handler.h"
-#include "chromeos/network/network_state.h"
-#include "chromeos/network/network_state_handler.h"
-#include "chromeos/network/shill_property_util.h"
-#include "grit/ash_resources.h"
-#include "grit/ash_strings.h"
-#include "third_party/cros_system_api/dbus/service_constants.h"
-#include "ui/aura/window.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/views/bubble/bubble_delegate.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/layout/box_layout.h"
-#include "ui/views/layout/fill_layout.h"
-#include "ui/views/widget/widget.h"
-
-using chromeos::DeviceState;
-using chromeos::FavoriteState;
-using chromeos::NetworkHandler;
-using chromeos::NetworkState;
-using chromeos::NetworkStateHandler;
-using chromeos::NetworkTypePattern;
-
-namespace ash {
-namespace internal {
-namespace tray {
-
-namespace {
-
-// 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->SetFont(rb.GetFont(ui::ResourceBundle::SmallFont));
- label->SetEnabledColor(SkColorSetARGB(127, 0, 0, 0));
- return label;
-}
-
-// Create a label formatted for info items in the menu
-views::Label* CreateMenuInfoLabel(const base::string16& text) {
- views::Label* label = new views::Label(text);
- label->set_border(views::Border::CreateEmptyBorder(
- ash::kTrayPopupPaddingBetweenItems,
- ash::kTrayPopupPaddingHorizontal,
- ash::kTrayPopupPaddingBetweenItems, 0));
- label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- label->SetEnabledColor(SkColorSetARGB(192, 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(UTF8ToUTF16(": ")));
- view->AddChildView(CreateInfoBubbleLabel(UTF8ToUTF16(text_string)));
- return view;
-}
-
-} // namespace
-
-
-//------------------------------------------------------------------------------
-
-struct NetworkInfo {
- NetworkInfo(const std::string& path)
- : service_path(path),
- disable(false),
- highlight(false) {
- }
-
- std::string service_path;
- base::string16 label;
- gfx::ImageSkia image;
- bool disable;
- bool highlight;
-};
-
-//------------------------------------------------------------------------------
-
-// A bubble which displays network info.
-class NetworkStateListDetailedView::InfoBubble
- : public views::BubbleDelegateView {
- public:
- InfoBubble(views::View* anchor,
- views::View* content,
- NetworkStateListDetailedView* detailed_view)
- : views::BubbleDelegateView(anchor, views::BubbleBorder::TOP_RIGHT),
- detailed_view_(detailed_view) {
- set_use_focusless(true);
- set_parent_window(ash::Shell::GetContainer(
- anchor->GetWidget()->GetNativeWindow()->GetRootWindow(),
- ash::internal::kShellWindowId_SettingBubbleContainer));
- SetLayoutManager(new views::FillLayout());
- AddChildView(content);
- }
-
- virtual ~InfoBubble() {
- detailed_view_->OnInfoBubbleDestroyed();
- }
-
- virtual bool CanActivate() const OVERRIDE { return false; }
-
- private:
- // Not owned.
- NetworkStateListDetailedView* detailed_view_;
-
- DISALLOW_COPY_AND_ASSIGN(InfoBubble);
-};
-
-//------------------------------------------------------------------------------
-// NetworkStateListDetailedView
-
-NetworkStateListDetailedView::NetworkStateListDetailedView(
- SystemTrayItem* owner,
- ListType list_type,
- user::LoginStatus login)
- : NetworkDetailedView(owner),
- list_type_(list_type),
- login_(login),
- info_icon_(NULL),
- button_wifi_(NULL),
- button_mobile_(NULL),
- other_wifi_(NULL),
- turn_on_wifi_(NULL),
- other_mobile_(NULL),
- other_vpn_(NULL),
- toggle_debug_preferred_networks_(NULL),
- settings_(NULL),
- proxy_settings_(NULL),
- scanning_view_(NULL),
- no_wifi_networks_view_(NULL),
- no_cellular_networks_view_(NULL),
- info_bubble_(NULL) {
-}
-
-NetworkStateListDetailedView::~NetworkStateListDetailedView() {
- if (info_bubble_)
- info_bubble_->GetWidget()->CloseNow();
- network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
-}
-
-void NetworkStateListDetailedView::ManagerChanged() {
- UpdateNetworkList();
- UpdateHeaderButtons();
- UpdateNetworkExtra();
- Layout();
-}
-
-void NetworkStateListDetailedView::NetworkListChanged() {
- NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
- if (list_type_ == LIST_TYPE_DEBUG_PREFERRED) {
- NetworkStateHandler::FavoriteStateList favorite_list;
- handler->GetFavoriteList(&favorite_list);
- UpdatePreferred(favorite_list);
- } else {
- NetworkStateHandler::NetworkStateList network_list;
- handler->GetNetworkList(&network_list);
- UpdateNetworks(network_list);
- }
- UpdateNetworkList();
- UpdateHeaderButtons();
- UpdateNetworkExtra();
- Layout();
-}
-
-void NetworkStateListDetailedView::NetworkServiceChanged(
- const NetworkState* network) {
- UpdateNetworkList();
- Layout();
-}
-
-void NetworkStateListDetailedView::NetworkIconChanged() {
- UpdateNetworkList();
- Layout();
-}
-
-// Overridden from NetworkDetailedView:
-
-void NetworkStateListDetailedView::Init() {
- Reset();
- network_map_.clear();
- service_path_map_.clear();
- info_icon_ = NULL;
- button_wifi_ = NULL;
- button_mobile_ = NULL;
- other_wifi_ = NULL;
- turn_on_wifi_ = NULL;
- other_mobile_ = NULL;
- other_vpn_ = NULL;
- toggle_debug_preferred_networks_ = NULL;
- settings_ = NULL;
- proxy_settings_ = NULL;
- scanning_view_ = NULL;
- no_wifi_networks_view_ = NULL;
- no_cellular_networks_view_ = NULL;
-
- CreateScrollableList();
- CreateNetworkExtra();
- CreateHeaderEntry();
- CreateHeaderButtons();
-
- NetworkListChanged();
-
- CallRequestScan();
-}
-
-NetworkDetailedView::DetailedViewType
-NetworkStateListDetailedView::GetViewType() const {
- return STATE_LIST_VIEW;
-}
-
-// Views overrides
-
-void NetworkStateListDetailedView::ButtonPressed(views::Button* sender,
- const ui::Event& event) {
- if (sender == info_icon_) {
- ToggleInfoBubble();
- return;
- }
-
- // If the info bubble was visible, close it when some other item is clicked.
- ResetInfoBubble();
-
- NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
- ash::SystemTrayDelegate* delegate =
- ash::Shell::GetInstance()->system_tray_delegate();
- if (sender == button_wifi_) {
- bool enabled = handler->IsTechnologyEnabled(
- NetworkTypePattern::WiFi());
- handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(),
- !enabled,
- chromeos::network_handler::ErrorCallback());
- } else if (sender == turn_on_wifi_) {
- handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(),
- true,
- chromeos::network_handler::ErrorCallback());
- } else if (sender == button_mobile_) {
- ToggleMobile();
- } else if (sender == settings_) {
- Shell::GetInstance()->metrics()->RecordUserMetricsAction(
- list_type_ == LIST_TYPE_VPN ?
- ash::UMA_STATUS_AREA_VPN_SETTINGS_CLICKED :
- ash::UMA_STATUS_AREA_NETWORK_SETTINGS_CLICKED);
- delegate->ShowNetworkSettings("");
- } else if (sender == proxy_settings_) {
- delegate->ChangeProxySettings();
- } else if (sender == other_mobile_) {
- delegate->ShowOtherNetworkDialog(shill::kTypeCellular);
- } else if (sender == toggle_debug_preferred_networks_) {
- list_type_ = (list_type_ == LIST_TYPE_NETWORK)
- ? LIST_TYPE_DEBUG_PREFERRED : LIST_TYPE_NETWORK;
- // Re-initialize this after processing the event.
- base::MessageLoopForUI::current()->PostTask(
- FROM_HERE,
- base::Bind(&NetworkStateListDetailedView::Init, AsWeakPtr()));
- } else if (sender == other_wifi_) {
- Shell::GetInstance()->metrics()->RecordUserMetricsAction(
- ash::UMA_STATUS_AREA_NETWORK_JOIN_OTHER_CLICKED);
- delegate->ShowOtherNetworkDialog(shill::kTypeWifi);
- } else if (sender == other_vpn_) {
- Shell::GetInstance()->metrics()->RecordUserMetricsAction(
- ash::UMA_STATUS_AREA_VPN_JOIN_OTHER_CLICKED);
- delegate->ShowOtherNetworkDialog(shill::kTypeVPN);
- } else {
- NOTREACHED();
- }
-}
-
-void NetworkStateListDetailedView::OnViewClicked(views::View* sender) {
- // If the info bubble was visible, close it when some other item is clicked.
- ResetInfoBubble();
-
- if (sender == footer()->content()) {
- TransitionToDefaultView();
- return;
- }
-
- if (login_ == user::LOGGED_IN_LOCKED)
- return;
-
- std::map<views::View*, std::string>::iterator found =
- network_map_.find(sender);
- if (found == network_map_.end())
- return;
-
- const std::string& service_path = found->second;
- if (list_type_ == LIST_TYPE_DEBUG_PREFERRED) {
- NetworkHandler::Get()->network_configuration_handler()->
- RemoveConfiguration(service_path,
- base::Bind(&base::DoNothing),
- chromeos::network_handler::ErrorCallback());
- return;
- }
-
- const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
- GetNetworkState(service_path);
- if (!network || network->IsConnectedState() || network->IsConnectingState()) {
- Shell::GetInstance()->metrics()->RecordUserMetricsAction(
- list_type_ == LIST_TYPE_VPN ?
- ash::UMA_STATUS_AREA_SHOW_NETWORK_CONNECTION_DETAILS :
- ash::UMA_STATUS_AREA_SHOW_VPN_CONNECTION_DETAILS);
- Shell::GetInstance()->system_tray_delegate()->ShowNetworkSettings(
- service_path);
- } else {
- Shell::GetInstance()->metrics()->RecordUserMetricsAction(
- list_type_ == LIST_TYPE_VPN ?
- ash::UMA_STATUS_AREA_CONNECT_TO_VPN :
- ash::UMA_STATUS_AREA_CONNECT_TO_CONFIGURED_NETWORK);
- ash::network_connect::ConnectToNetwork(service_path, NULL);
- }
-}
-
-// Create UI components.
-
-void NetworkStateListDetailedView::CreateHeaderEntry() {
- CreateSpecialRow(IDS_ASH_STATUS_TRAY_NETWORK, this);
-}
-
-void NetworkStateListDetailedView::CreateHeaderButtons() {
- if (list_type_ != LIST_TYPE_VPN) {
- button_wifi_ = new TrayPopupHeaderButton(
- this,
- IDR_AURA_UBER_TRAY_WIFI_ENABLED,
- IDR_AURA_UBER_TRAY_WIFI_DISABLED,
- IDR_AURA_UBER_TRAY_WIFI_ENABLED_HOVER,
- IDR_AURA_UBER_TRAY_WIFI_DISABLED_HOVER,
- IDS_ASH_STATUS_TRAY_WIFI);
- button_wifi_->SetTooltipText(
- l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_WIFI));
- button_wifi_->SetToggledTooltipText(
- l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_WIFI));
- footer()->AddButton(button_wifi_);
-
- button_mobile_ = new TrayPopupHeaderButton(
- this,
- IDR_AURA_UBER_TRAY_CELLULAR_ENABLED,
- IDR_AURA_UBER_TRAY_CELLULAR_DISABLED,
- IDR_AURA_UBER_TRAY_CELLULAR_ENABLED_HOVER,
- IDR_AURA_UBER_TRAY_CELLULAR_DISABLED_HOVER,
- IDS_ASH_STATUS_TRAY_CELLULAR);
- button_mobile_->SetTooltipText(
- l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_MOBILE));
- button_mobile_->SetToggledTooltipText(
- l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_MOBILE));
- footer()->AddButton(button_mobile_);
- }
-
- info_icon_ = new TrayPopupHeaderButton(
- this,
- IDR_AURA_UBER_TRAY_NETWORK_INFO,
- IDR_AURA_UBER_TRAY_NETWORK_INFO,
- IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER,
- IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER,
- IDS_ASH_STATUS_TRAY_NETWORK_INFO);
- info_icon_->SetTooltipText(
- l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_INFO));
- footer()->AddButton(info_icon_);
-}
-
-void NetworkStateListDetailedView::CreateNetworkExtra() {
- if (login_ == user::LOGGED_IN_LOCKED)
- return;
-
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-
- views::View* bottom_row = new views::View();
- views::BoxLayout* layout = new views::BoxLayout(
- views::BoxLayout::kHorizontal,
- kTrayMenuBottomRowPadding,
- kTrayMenuBottomRowPadding,
- kTrayMenuBottomRowPaddingBetweenItems);
- layout->set_spread_blank_space(true);
- bottom_row->SetLayoutManager(layout);
-
- if (list_type_ != LIST_TYPE_VPN) {
- other_wifi_ = new TrayPopupLabelButton(
- this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_OTHER_WIFI));
- bottom_row->AddChildView(other_wifi_);
-
- turn_on_wifi_ = new TrayPopupLabelButton(
- this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_TURN_ON_WIFI));
- bottom_row->AddChildView(turn_on_wifi_);
-
- other_mobile_ = new TrayPopupLabelButton(
- this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_OTHER_MOBILE));
- bottom_row->AddChildView(other_mobile_);
-
- if (CommandLine::ForCurrentProcess()->HasSwitch(
- ash::switches::kAshDebugShowPreferredNetworks)) {
- // Debugging UI to view and remove favorites from the status area.
- std::string toggle_debug_preferred_label =
- (list_type_ == LIST_TYPE_DEBUG_PREFERRED) ? "Visible" : "Preferred";
- toggle_debug_preferred_networks_ = new TrayPopupLabelButton(
- this, UTF8ToUTF16(toggle_debug_preferred_label));
- bottom_row->AddChildView(toggle_debug_preferred_networks_);
- }
- } else {
- other_vpn_ = new TrayPopupLabelButton(
- this,
- ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
- IDS_ASH_STATUS_TRAY_OTHER_VPN));
- bottom_row->AddChildView(other_vpn_);
- }
-
- CreateSettingsEntry();
- DCHECK(settings_ || proxy_settings_);
- bottom_row->AddChildView(settings_ ? settings_ : proxy_settings_);
-
- AddChildView(bottom_row);
-}
-
-// Update UI components.
-
-void NetworkStateListDetailedView::UpdateHeaderButtons() {
- NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
- if (button_wifi_)
- UpdateTechnologyButton(button_wifi_, NetworkTypePattern::WiFi());
- if (button_mobile_) {
- UpdateTechnologyButton(button_mobile_, NetworkTypePattern::Mobile());
- }
- if (proxy_settings_)
- proxy_settings_->SetEnabled(handler->DefaultNetwork() != NULL);
-
- static_cast<views::View*>(footer())->Layout();
-}
-
-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::UpdateNetworks(
- const NetworkStateHandler::NetworkStateList& networks) {
- DCHECK(list_type_ != LIST_TYPE_DEBUG_PREFERRED);
- network_list_.clear();
- for (NetworkStateHandler::NetworkStateList::const_iterator iter =
- networks.begin(); iter != networks.end(); ++iter) {
- const NetworkState* network = *iter;
- if ((list_type_ == LIST_TYPE_NETWORK &&
- network->type() != shill::kTypeVPN) ||
- (list_type_ == LIST_TYPE_VPN &&
- network->type() == shill::kTypeVPN)) {
- NetworkInfo* info = new NetworkInfo(network->path());
- network_list_.push_back(info);
- }
- }
-}
-
-void NetworkStateListDetailedView::UpdatePreferred(
- const NetworkStateHandler::FavoriteStateList& favorites) {
- DCHECK(list_type_ == LIST_TYPE_DEBUG_PREFERRED);
- network_list_.clear();
- for (NetworkStateHandler::FavoriteStateList::const_iterator iter =
- favorites.begin(); iter != favorites.end(); ++iter) {
- const FavoriteState* favorite = *iter;
- NetworkInfo* info = new NetworkInfo(favorite->path());
- network_list_.push_back(info);
- }
-}
-
-void NetworkStateListDetailedView::UpdateNetworkList() {
- NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
-
- // First, update state for all networks
- bool animating = false;
- for (size_t i = 0; i < network_list_.size(); ++i) {
- NetworkInfo* info = network_list_[i];
- const NetworkState* network =
- handler->GetNetworkState(info->service_path);
- if (network) {
- info->image = network_icon::GetImageForNetwork(
- network, network_icon::ICON_TYPE_LIST);
- info->label = network_icon::GetLabelForNetwork(
- network, network_icon::ICON_TYPE_LIST);
- info->highlight =
- network->IsConnectedState() || network->IsConnectingState();
- info->disable =
- network->activation_state() == shill::kActivationStateActivating;
- if (!animating && network->IsConnectingState())
- animating = true;
- } else if (list_type_ == LIST_TYPE_DEBUG_PREFERRED) {
- // Favorites that are visible will use the same display info as the
- // visible network. Non visible favorites will show the disconnected
- // icon and the name of the network.
- const FavoriteState* favorite =
- handler->GetFavoriteState(info->service_path);
- if (favorite) {
- info->image = network_icon::GetImageForDisconnectedNetwork(
- network_icon::ICON_TYPE_LIST, favorite->type());
- info->label = UTF8ToUTF16(favorite->name());
- }
- }
- }
- if (animating)
- network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this);
- else
- network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this);
-
- // Get the updated list entries
- network_map_.clear();
- std::set<std::string> new_service_paths;
- bool needs_relayout = UpdateNetworkListEntries(&new_service_paths);
-
- // Remove old children
- std::set<std::string> remove_service_paths;
- for (ServicePathMap::const_iterator it = service_path_map_.begin();
- it != service_path_map_.end(); ++it) {
- if (new_service_paths.find(it->first) == new_service_paths.end()) {
- remove_service_paths.insert(it->first);
- network_map_.erase(it->second);
- scroll_content()->RemoveChildView(it->second);
- needs_relayout = true;
- }
- }
-
- for (std::set<std::string>::const_iterator remove_it =
- remove_service_paths.begin();
- remove_it != remove_service_paths.end(); ++remove_it) {
- service_path_map_.erase(*remove_it);
- }
-
- if (needs_relayout) {
- views::View* selected_view = NULL;
- for (ServicePathMap::const_iterator iter = service_path_map_.begin();
- iter != service_path_map_.end(); ++iter) {
- if (iter->second->hover()) {
- selected_view = iter->second;
- break;
- }
- }
- scroll_content()->SizeToPreferredSize();
- static_cast<views::View*>(scroller())->Layout();
- if (selected_view)
- scroll_content()->ScrollRectToVisible(selected_view->bounds());
- }
-}
-
-bool NetworkStateListDetailedView::CreateOrUpdateInfoLabel(
- int index, const base::string16& text, views::Label** label) {
- if (*label == NULL) {
- *label = CreateMenuInfoLabel(text);
- scroll_content()->AddChildViewAt(*label, index);
- return true;
- } else {
- (*label)->SetText(text);
- return OrderChild(*label, index);
- }
-}
-
-bool NetworkStateListDetailedView::UpdateNetworkChild(int index,
- const NetworkInfo* info) {
- bool needs_relayout = false;
- HoverHighlightView* container = NULL;
- ServicePathMap::const_iterator found =
- service_path_map_.find(info->service_path);
- gfx::Font::FontStyle font =
- info->highlight ? gfx::Font::BOLD : gfx::Font::NORMAL;
- if (found == service_path_map_.end()) {
- container = new HoverHighlightView(this);
- container->AddIconAndLabel(info->image, info->label, font);
- scroll_content()->AddChildViewAt(container, index);
- container->set_border(views::Border::CreateEmptyBorder(
- 0, kTrayPopupPaddingHorizontal, 0, 0));
- needs_relayout = true;
- } else {
- container = found->second;
- container->RemoveAllChildViews(true);
- container->AddIconAndLabel(info->image, info->label, font);
- container->Layout();
- container->SchedulePaint();
- needs_relayout = OrderChild(container, index);
- }
- if (info->disable)
- container->SetEnabled(false);
- network_map_[container] = info->service_path;
- service_path_map_[info->service_path] = container;
- return needs_relayout;
-}
-
-bool NetworkStateListDetailedView::OrderChild(views::View* view, int index) {
- if (scroll_content()->child_at(index) != view) {
- scroll_content()->ReorderChildView(view, index);
- return true;
- }
- return false;
-}
-
-bool NetworkStateListDetailedView::UpdateNetworkListEntries(
- std::set<std::string>* new_service_paths) {
- bool needs_relayout = false;
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
-
- // Insert child views
- int index = 0;
-
- // Highlighted networks
- for (size_t i = 0; i < network_list_.size(); ++i) {
- const NetworkInfo* info = network_list_[i];
- if (info->highlight) {
- if (UpdateNetworkChild(index++, info))
- needs_relayout = true;
- new_service_paths->insert(info->service_path);
- }
- }
-
- if (list_type_ == LIST_TYPE_NETWORK) {
- // Cellular initializing
- int status_message_id = network_icon::GetCellularUninitializedMsg();
- if (!status_message_id &&
- handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()) &&
- !handler->FirstNetworkByType(NetworkTypePattern::Mobile())) {
- status_message_id = IDS_ASH_STATUS_TRAY_NO_CELLULAR_NETWORKS;
- }
- if (status_message_id) {
- base::string16 text = rb.GetLocalizedString(status_message_id);
- if (CreateOrUpdateInfoLabel(index++, text, &no_cellular_networks_view_))
- needs_relayout = true;
- } else if (no_cellular_networks_view_) {
- scroll_content()->RemoveChildView(no_cellular_networks_view_);
- no_cellular_networks_view_ = NULL;
- needs_relayout = true;
- }
-
- // "Wifi Enabled / Disabled"
- if (network_list_.empty()) {
- int message_id = handler->IsTechnologyEnabled(NetworkTypePattern::WiFi())
- ? IDS_ASH_STATUS_TRAY_NETWORK_WIFI_ENABLED
- : IDS_ASH_STATUS_TRAY_NETWORK_WIFI_DISABLED;
- base::string16 text = rb.GetLocalizedString(message_id);
- if (CreateOrUpdateInfoLabel(index++, text, &no_wifi_networks_view_))
- needs_relayout = true;
- } else if (no_wifi_networks_view_) {
- scroll_content()->RemoveChildView(no_wifi_networks_view_);
- no_wifi_networks_view_ = NULL;
- needs_relayout = true;
- }
-
- // "Wifi Scanning"
- if (handler->GetScanningByType(NetworkTypePattern::WiFi())) {
- base::string16 text =
- rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_WIFI_SCANNING_MESSAGE);
- if (CreateOrUpdateInfoLabel(index++, text, &scanning_view_))
- needs_relayout = true;
- } else if (scanning_view_ != NULL) {
- scroll_content()->RemoveChildView(scanning_view_);
- scanning_view_ = NULL;
- needs_relayout = true;
- }
- }
-
- // Un-highlighted networks
- for (size_t i = 0; i < network_list_.size(); ++i) {
- const NetworkInfo* info = network_list_[i];
- if (!info->highlight) {
- if (UpdateNetworkChild(index++, info))
- needs_relayout = true;
- new_service_paths->insert(info->service_path);
- }
- }
-
- // No networks or other messages (fallback)
- if (index == 0) {
- base::string16 text;
- if (list_type_ == LIST_TYPE_VPN)
- text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_NO_VPN);
- else
- text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NO_NETWORKS);
- if (CreateOrUpdateInfoLabel(index++, text, &scanning_view_))
- needs_relayout = true;
- }
-
- return needs_relayout;
-}
-
-void NetworkStateListDetailedView::UpdateNetworkExtra() {
- if (login_ == user::LOGGED_IN_LOCKED)
- return;
-
- View* layout_parent = NULL; // All these buttons have the same parent.
- NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
- if (other_wifi_) {
- DCHECK(turn_on_wifi_);
- NetworkStateHandler::TechnologyState state =
- handler->GetTechnologyState(NetworkTypePattern::WiFi());
- if (state == NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) {
- turn_on_wifi_->SetVisible(false);
- other_wifi_->SetVisible(false);
- } else {
- if (state == NetworkStateHandler::TECHNOLOGY_AVAILABLE) {
- turn_on_wifi_->SetVisible(true);
- turn_on_wifi_->SetEnabled(true);
- other_wifi_->SetVisible(false);
- } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLED) {
- turn_on_wifi_->SetVisible(false);
- other_wifi_->SetVisible(true);
- } else {
- // Initializing or Enabling
- turn_on_wifi_->SetVisible(true);
- turn_on_wifi_->SetEnabled(false);
- other_wifi_->SetVisible(false);
- }
- }
- layout_parent = other_wifi_->parent();
- }
-
- if (other_mobile_) {
- bool show_other_mobile = false;
- NetworkStateHandler::TechnologyState state =
- handler->GetTechnologyState(NetworkTypePattern::Mobile());
- if (state != NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) {
- const chromeos::DeviceState* device =
- handler->GetDeviceStateByType(NetworkTypePattern::Mobile());
- show_other_mobile = (device && device->support_network_scan());
- }
- if (show_other_mobile) {
- other_mobile_->SetVisible(true);
- other_mobile_->SetEnabled(
- state == NetworkStateHandler::TECHNOLOGY_ENABLED);
- } else {
- other_mobile_->SetVisible(false);
- }
- if (!layout_parent)
- layout_parent = other_wifi_->parent();
- }
-
- if (layout_parent)
- layout_parent->Layout();
-}
-
-void NetworkStateListDetailedView::CreateSettingsEntry() {
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- if (login_ != user::LOGGED_IN_NONE) {
- // Settings, only if logged in.
- settings_ = new TrayPopupLabelButton(
- this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS));
- } else {
- proxy_settings_ = new TrayPopupLabelButton(
- this,
- rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_PROXY_SETTINGS));
- }
-}
-
-void NetworkStateListDetailedView::ToggleInfoBubble() {
- if (ResetInfoBubble())
- return;
-
- info_bubble_ = new InfoBubble(
- info_icon_, CreateNetworkInfoView(), this);
- views::BubbleDelegateView::CreateBubble(info_bubble_)->Show();
-}
-
-bool NetworkStateListDetailedView::ResetInfoBubble() {
- if (!info_bubble_)
- return false;
- info_bubble_->GetWidget()->Close();
- info_bubble_ = NULL;
- return true;
-}
-
-void NetworkStateListDetailedView::OnInfoBubbleDestroyed() {
- info_bubble_ = NULL;
-}
-
-views::View* NetworkStateListDetailedView::CreateNetworkInfoView() {
- ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
- NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
-
- std::string ip_address("0.0.0.0");
- const NetworkState* network = handler->DefaultNetwork();
- if (network)
- ip_address = network->ip_address();
-
- views::View* container = new views::View;
- container->SetLayoutManager(
- new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
- container->set_border(views::Border::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 (!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;
-}
-
-void NetworkStateListDetailedView::CallRequestScan() {
- VLOG(1) << "Requesting Network Scan.";
- NetworkHandler::Get()->network_state_handler()->RequestScan();
- // Periodically request a scan while this UI is open.
- base::MessageLoopForUI::current()->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());
- ash::network_connect::SetTechnologyEnabled(NetworkTypePattern::Mobile(),
- !enabled);
-}
-
-} // namespace tray
-} // namespace internal
-} // namespace ash