12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_state_list_detailed_view.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/ash_switches.h" 8d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "ash/metrics/user_metrics_recorder.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h" 11d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "ash/shell_delegate.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/system/chromeos/network/network_connect.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_icon.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_icon_animation.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/tray_network_state_observer.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_scroll_view.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/hover_highlight_view.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_constants.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_details_view.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_header_button.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/message_loop/message_loop.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/device_state.h" 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/favorite_state.h" 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_configuration_handler.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state_handler.h" 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/network/shill_property_util.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_strings.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/bubble/bubble_delegate.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/label.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/box_layout.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/fill_layout.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using chromeos::DeviceState; 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing chromeos::FavoriteState; 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using chromeos::NetworkHandler; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkState; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::NetworkStateHandler; 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using chromeos::NetworkTypePattern; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internal { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace tray { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Delay between scan requests. 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kRequestScanDelaySeconds = 10; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create a label with the font size and color used in the network info bubble. 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::Label* CreateInfoBubbleLabel(const base::string16& text) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Label* label = new views::Label(text); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label->SetFont(rb.GetFont(ui::ResourceBundle::SmallFont)); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label->SetEnabledColor(SkColorSetARGB(127, 0, 0, 0)); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return label; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create a label formatted for info items in the menu 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::Label* CreateMenuInfoLabel(const base::string16& text) { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Label* label = new views::Label(text); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label->set_border(views::Border::CreateEmptyBorder( 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::kTrayPopupPaddingBetweenItems, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::kTrayPopupPaddingHorizontal, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::kTrayPopupPaddingBetweenItems, 0)); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label->SetEnabledColor(SkColorSetARGB(192, 0, 0, 0)); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return label; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create a row of labels for the network info bubble. 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::View* CreateInfoBubbleLine(const base::string16& text_label, 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& text_string) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View* view = new views::View; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->SetLayoutManager( 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 1)); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->AddChildView(CreateInfoBubbleLabel(text_label)); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->AddChildView(CreateInfoBubbleLabel(UTF8ToUTF16(": "))); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->AddChildView(CreateInfoBubbleLabel(UTF8ToUTF16(text_string))); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return view; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------ 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NetworkInfo { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkInfo(const std::string& path) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : service_path(path), 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disable(false), 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) highlight(false) { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string service_path; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 label; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia image; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool disable; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool highlight; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------ 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// A bubble which displays network info. 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class NetworkStateListDetailedView::InfoBubble 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public views::BubbleDelegateView { 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InfoBubble(views::View* anchor, 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) views::View* content, 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NetworkStateListDetailedView* detailed_view) 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : views::BubbleDelegateView(anchor, views::BubbleBorder::TOP_RIGHT), 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) detailed_view_(detailed_view) { 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) set_use_focusless(true); 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) set_parent_window(ash::Shell::GetContainer( 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) anchor->GetWidget()->GetNativeWindow()->GetRootWindow(), 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::internal::kShellWindowId_SettingBubbleContainer)); 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetLayoutManager(new views::FillLayout()); 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddChildView(content); 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~InfoBubble() { 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) detailed_view_->OnInfoBubbleDestroyed(); 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual bool CanActivate() const OVERRIDE { return false; } 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Not owned. 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NetworkStateListDetailedView* detailed_view_; 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InfoBubble); 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//------------------------------------------------------------------------------ 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkStateListDetailedView 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::NetworkStateListDetailedView( 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SystemTrayItem* owner, 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListType list_type, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user::LoginStatus login) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : NetworkDetailedView(owner), 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list_type_(list_type), 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) login_(login), 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info_icon_(NULL), 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button_wifi_(NULL), 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button_mobile_(NULL), 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_wifi_(NULL), 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) turn_on_wifi_(NULL), 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_mobile_(NULL), 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_vpn_(NULL), 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch toggle_debug_preferred_networks_(NULL), 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings_(NULL), 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy_settings_(NULL), 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanning_view_(NULL), 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) no_wifi_networks_view_(NULL), 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) no_cellular_networks_view_(NULL), 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info_bubble_(NULL) { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::~NetworkStateListDetailedView() { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (info_bubble_) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info_bubble_->GetWidget()->CloseNow(); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ManagerChanged() { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateNetworkList(); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateHeaderButtons(); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateNetworkExtra(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layout(); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkListChanged() { 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); 1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (list_type_ == LIST_TYPE_DEBUG_PREFERRED) { 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NetworkStateHandler::FavoriteStateList favorite_list; 1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch handler->GetFavoriteList(&favorite_list); 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UpdatePreferred(favorite_list); 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NetworkStateHandler::NetworkStateList network_list; 1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch handler->GetNetworkList(&network_list); 1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UpdateNetworks(network_list); 1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateNetworkList(); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateHeaderButtons(); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateNetworkExtra(); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layout(); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkServiceChanged( 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NetworkState* network) { 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateNetworkList(); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layout(); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::NetworkIconChanged() { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateNetworkList(); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layout(); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Overridden from NetworkDetailedView: 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::Init() { 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Reset(); 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch network_map_.clear(); 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch service_path_map_.clear(); 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info_icon_ = NULL; 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch button_wifi_ = NULL; 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch button_mobile_ = NULL; 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch other_wifi_ = NULL; 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch turn_on_wifi_ = NULL; 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch other_mobile_ = NULL; 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch other_vpn_ = NULL; 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch toggle_debug_preferred_networks_ = NULL; 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch settings_ = NULL; 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch proxy_settings_ = NULL; 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scanning_view_ = NULL; 2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch no_wifi_networks_view_ = NULL; 2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch no_cellular_networks_view_ = NULL; 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateScrollableList(); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateNetworkExtra(); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateHeaderEntry(); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateHeaderButtons(); 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NetworkListChanged(); 2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CallRequestScan(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkDetailedView::DetailedViewType 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkStateListDetailedView::GetViewType() const { 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return STATE_LIST_VIEW; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Views overrides 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ButtonPressed(views::Button* sender, 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::Event& event) { 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sender == info_icon_) { 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToggleInfoBubble(); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the info bubble was visible, close it when some other item is clicked. 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResetInfoBubble(); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::SystemTrayDelegate* delegate = 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->system_tray_delegate(); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sender == button_wifi_) { 26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool enabled = handler->IsTechnologyEnabled( 26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NetworkTypePattern::WiFi()); 26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(), 26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !enabled, 27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) chromeos::network_handler::ErrorCallback()); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (sender == turn_on_wifi_) { 27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(), 27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) true, 27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) chromeos::network_handler::ErrorCallback()); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (sender == button_mobile_) { 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToggleMobile(); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (sender == settings_) { 278d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 279d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) list_type_ == LIST_TYPE_VPN ? 280d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ash::UMA_STATUS_AREA_VPN_SETTINGS_CLICKED : 281d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ash::UMA_STATUS_AREA_NETWORK_SETTINGS_CLICKED); 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate->ShowNetworkSettings(""); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (sender == proxy_settings_) { 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->ChangeProxySettings(); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (sender == other_mobile_) { 2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate->ShowOtherNetworkDialog(shill::kTypeCellular); 2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (sender == toggle_debug_preferred_networks_) { 2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch list_type_ = (list_type_ == LIST_TYPE_NETWORK) 2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ? LIST_TYPE_DEBUG_PREFERRED : LIST_TYPE_NETWORK; 2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Re-initialize this after processing the event. 2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::MessageLoopForUI::current()->PostTask( 2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FROM_HERE, 2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&NetworkStateListDetailedView::Init, AsWeakPtr())); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (sender == other_wifi_) { 295d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 296d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ash::UMA_STATUS_AREA_NETWORK_JOIN_OTHER_CLICKED); 2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate->ShowOtherNetworkDialog(shill::kTypeWifi); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (sender == other_vpn_) { 299d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 300d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ash::UMA_STATUS_AREA_VPN_JOIN_OTHER_CLICKED); 3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate->ShowOtherNetworkDialog(shill::kTypeVPN); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::OnViewClicked(views::View* sender) { 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the info bubble was visible, close it when some other item is clicked. 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResetInfoBubble(); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sender == footer()->content()) { 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TransitionToDefaultView(); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login_ == user::LOGGED_IN_LOCKED) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::map<views::View*, std::string>::iterator found = 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_map_.find(sender); 3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (found == network_map_.end()) 3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& service_path = found->second; 3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (list_type_ == LIST_TYPE_DEBUG_PREFERRED) { 3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NetworkHandler::Get()->network_configuration_handler()-> 3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RemoveConfiguration(service_path, 3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&base::DoNothing), 3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch chromeos::network_handler::ErrorCallback()); 3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const NetworkState* network = NetworkHandler::Get()->network_state_handler()-> 3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetNetworkState(service_path); 3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!network || network->IsConnectedState() || network->IsConnectingState()) { 336d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 337d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) list_type_ == LIST_TYPE_VPN ? 338d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ash::UMA_STATUS_AREA_SHOW_NETWORK_CONNECTION_DETAILS : 339d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ash::UMA_STATUS_AREA_SHOW_VPN_CONNECTION_DETAILS); 3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Shell::GetInstance()->system_tray_delegate()->ShowNetworkSettings( 3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch service_path); 3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 343d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 344d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) list_type_ == LIST_TYPE_VPN ? 345d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ash::UMA_STATUS_AREA_CONNECT_TO_VPN : 346d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ash::UMA_STATUS_AREA_CONNECT_TO_CONFIGURED_NETWORK); 347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ash::network_connect::ConnectToNetwork(service_path, NULL); 34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Create UI components. 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateHeaderEntry() { 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateSpecialRow(IDS_ASH_STATUS_TRAY_NETWORK, this); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateHeaderButtons() { 3587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (list_type_ != LIST_TYPE_VPN) { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button_wifi_ = new TrayPopupHeaderButton( 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_WIFI_ENABLED, 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_WIFI_DISABLED, 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_WIFI_ENABLED_HOVER, 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_WIFI_DISABLED_HOVER, 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_WIFI); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button_wifi_->SetTooltipText( 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_WIFI)); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button_wifi_->SetToggledTooltipText( 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_WIFI)); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) footer()->AddButton(button_wifi_); 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button_mobile_ = new TrayPopupHeaderButton( 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_CELLULAR_ENABLED, 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_CELLULAR_DISABLED, 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_CELLULAR_ENABLED_HOVER, 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_CELLULAR_DISABLED_HOVER, 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_CELLULAR); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button_mobile_->SetTooltipText( 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISABLE_MOBILE)); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button_mobile_->SetToggledTooltipText( 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ENABLE_MOBILE)); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) footer()->AddButton(button_mobile_); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info_icon_ = new TrayPopupHeaderButton( 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_NETWORK_INFO, 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_NETWORK_INFO, 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER, 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_AURA_UBER_TRAY_NETWORK_INFO_HOVER, 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_NETWORK_INFO); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info_icon_->SetTooltipText( 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_INFO)); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) footer()->AddButton(info_icon_); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateNetworkExtra() { 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login_ == user::LOGGED_IN_LOCKED) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View* bottom_row = new views::View(); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::BoxLayout* layout = new views::BoxLayout( 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::BoxLayout::kHorizontal, 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayMenuBottomRowPadding, 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayMenuBottomRowPadding, 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayMenuBottomRowPaddingBetweenItems); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout->set_spread_blank_space(true); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bottom_row->SetLayoutManager(layout); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (list_type_ != LIST_TYPE_VPN) { 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_wifi_ = new TrayPopupLabelButton( 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_OTHER_WIFI)); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bottom_row->AddChildView(other_wifi_); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) turn_on_wifi_ = new TrayPopupLabelButton( 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_TURN_ON_WIFI)); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bottom_row->AddChildView(turn_on_wifi_); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_mobile_ = new TrayPopupLabelButton( 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_OTHER_MOBILE)); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bottom_row->AddChildView(other_mobile_); 4257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (CommandLine::ForCurrentProcess()->HasSwitch( 4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ash::switches::kAshDebugShowPreferredNetworks)) { 4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Debugging UI to view and remove favorites from the status area. 4297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string toggle_debug_preferred_label = 4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (list_type_ == LIST_TYPE_DEBUG_PREFERRED) ? "Visible" : "Preferred"; 4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch toggle_debug_preferred_networks_ = new TrayPopupLabelButton( 4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch this, UTF8ToUTF16(toggle_debug_preferred_label)); 4337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bottom_row->AddChildView(toggle_debug_preferred_networks_); 4347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 4357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_vpn_ = new TrayPopupLabelButton( 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle::GetSharedInstance().GetLocalizedString( 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_OTHER_VPN)); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bottom_row->AddChildView(other_vpn_); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateSettingsEntry(); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(settings_ || proxy_settings_); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bottom_row->AddChildView(settings_ ? settings_ : proxy_settings_); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(bottom_row); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Update UI components. 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateHeaderButtons() { 45390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (button_wifi_) 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UpdateTechnologyButton(button_wifi_, NetworkTypePattern::WiFi()); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (button_mobile_) { 45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UpdateTechnologyButton(button_mobile_, NetworkTypePattern::Mobile()); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (proxy_settings_) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy_settings_->SetEnabled(handler->DefaultNetwork() != NULL); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<views::View*>(footer())->Layout(); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkStateListDetailedView::UpdateTechnologyButton( 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TrayPopupHeaderButton* button, 46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const NetworkTypePattern& technology) { 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkStateHandler::TechnologyState state = 46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NetworkHandler::Get()->network_state_handler()->GetTechnologyState( 47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) technology); 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (state == NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) { 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button->SetVisible(false); 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button->SetVisible(true); 476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (state == NetworkStateHandler::TECHNOLOGY_AVAILABLE) { 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button->SetEnabled(true); 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button->SetToggled(true); 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLED) { 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button->SetEnabled(true); 481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button->SetToggled(false); 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLING) { 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button->SetEnabled(false); 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button->SetToggled(false); 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { // Initializing 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button->SetEnabled(false); 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) button->SetToggled(true); 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworks( 4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const NetworkStateHandler::NetworkStateList& networks) { 493558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(list_type_ != LIST_TYPE_DEBUG_PREFERRED); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_list_.clear(); 4957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (NetworkStateHandler::NetworkStateList::const_iterator iter = 4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) networks.begin(); iter != networks.end(); ++iter) { 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NetworkState* network = *iter; 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((list_type_ == LIST_TYPE_NETWORK && 49968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) network->type() != shill::kTypeVPN) || 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (list_type_ == LIST_TYPE_VPN && 50168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) network->type() == shill::kTypeVPN)) { 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkInfo* info = new NetworkInfo(network->path()); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_list_.push_back(info); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid NetworkStateListDetailedView::UpdatePreferred( 5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const NetworkStateHandler::FavoriteStateList& favorites) { 5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(list_type_ == LIST_TYPE_DEBUG_PREFERRED); 5117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch network_list_.clear(); 5127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (NetworkStateHandler::FavoriteStateList::const_iterator iter = 5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch favorites.begin(); iter != favorites.end(); ++iter) { 5147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const FavoriteState* favorite = *iter; 5157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NetworkInfo* info = new NetworkInfo(favorite->path()); 5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch network_list_.push_back(info); 5177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworkList() { 52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First, update state for all networks 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool animating = false; 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < network_list_.size(); ++i) { 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkInfo* info = network_list_[i]; 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NetworkState* network = 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handler->GetNetworkState(info->service_path); 5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (network) { 5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info->image = network_icon::GetImageForNetwork( 5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch network, network_icon::ICON_TYPE_LIST); 5327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info->label = network_icon::GetLabelForNetwork( 5337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch network, network_icon::ICON_TYPE_LIST); 5347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info->highlight = 5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch network->IsConnectedState() || network->IsConnectingState(); 5367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info->disable = 53768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) network->activation_state() == shill::kActivationStateActivating; 5387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!animating && network->IsConnectingState()) 5397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch animating = true; 5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (list_type_ == LIST_TYPE_DEBUG_PREFERRED) { 5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Favorites that are visible will use the same display info as the 5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // visible network. Non visible favorites will show the disconnected 5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // icon and the name of the network. 5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const FavoriteState* favorite = 5457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch handler->GetFavoriteState(info->service_path); 5467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (favorite) { 5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info->image = network_icon::GetImageForDisconnectedNetwork( 5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch network_icon::ICON_TYPE_LIST, favorite->type()); 5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch info->label = UTF8ToUTF16(favorite->name()); 5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (animating) 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this); 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the updated list entries 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_map_.clear(); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<std::string> new_service_paths; 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_relayout = UpdateNetworkListEntries(&new_service_paths); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove old children 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<std::string> remove_service_paths; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ServicePathMap::const_iterator it = service_path_map_.begin(); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != service_path_map_.end(); ++it) { 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_service_paths.find(it->first) == new_service_paths.end()) { 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remove_service_paths.insert(it->first); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_map_.erase(it->second); 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_content()->RemoveChildView(it->second); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::set<std::string>::const_iterator remove_it = 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remove_service_paths.begin(); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remove_it != remove_service_paths.end(); ++remove_it) { 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) service_path_map_.erase(*remove_it); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (needs_relayout) { 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View* selected_view = NULL; 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ServicePathMap::const_iterator iter = service_path_map_.begin(); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != service_path_map_.end(); ++iter) { 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->second->hover()) { 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selected_view = iter->second; 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_content()->SizeToPreferredSize(); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<views::View*>(scroller())->Layout(); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (selected_view) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_content()->ScrollRectToVisible(selected_view->bounds()); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::CreateOrUpdateInfoLabel( 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int index, const base::string16& text, views::Label** label) { 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (*label == NULL) { 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *label = CreateMenuInfoLabel(text); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_content()->AddChildViewAt(*label, index); 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*label)->SetText(text); 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return OrderChild(*label, index); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool NetworkStateListDetailedView::UpdateNetworkChild(int index, 6107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const NetworkInfo* info) { 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_relayout = false; 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HoverHighlightView* container = NULL; 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ServicePathMap::const_iterator found = 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) service_path_map_.find(info->service_path); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Font::FontStyle font = 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info->highlight ? gfx::Font::BOLD : gfx::Font::NORMAL; 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (found == service_path_map_.end()) { 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container = new HoverHighlightView(this); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->AddIconAndLabel(info->image, info->label, font); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_content()->AddChildViewAt(container, index); 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->set_border(views::Border::CreateEmptyBorder( 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, kTrayPopupPaddingHorizontal, 0, 0)); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container = found->second; 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->RemoveAllChildViews(true); 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->AddIconAndLabel(info->image, info->label, font); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->Layout(); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->SchedulePaint(); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = OrderChild(container, index); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (info->disable) 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->SetEnabled(false); 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_map_[container] = info->service_path; 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) service_path_map_[info->service_path] = container; 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return needs_relayout; 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::OrderChild(views::View* view, int index) { 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (scroll_content()->child_at(index) != view) { 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_content()->ReorderChildView(view, index); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::UpdateNetworkListEntries( 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<std::string>* new_service_paths) { 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_relayout = false; 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 65190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Insert child views 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int index = 0; 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Highlighted networks 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < network_list_.size(); ++i) { 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NetworkInfo* info = network_list_[i]; 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (info->highlight) { 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (UpdateNetworkChild(index++, info)) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_service_paths->insert(info->service_path); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (list_type_ == LIST_TYPE_NETWORK) { 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cellular initializing 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int status_message_id = network_icon::GetCellularUninitializedMsg(); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!status_message_id && 67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()) && 67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !handler->FirstNetworkByType(NetworkTypePattern::Mobile())) { 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_message_id = IDS_ASH_STATUS_TRAY_NO_CELLULAR_NETWORKS; 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status_message_id) { 675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text = rb.GetLocalizedString(status_message_id); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CreateOrUpdateInfoLabel(index++, text, &no_cellular_networks_view_)) 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (no_cellular_networks_view_) { 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_content()->RemoveChildView(no_cellular_networks_view_); 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) no_cellular_networks_view_ = NULL; 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // "Wifi Enabled / Disabled" 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (network_list_.empty()) { 68658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int message_id = handler->IsTechnologyEnabled(NetworkTypePattern::WiFi()) 68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ? IDS_ASH_STATUS_TRAY_NETWORK_WIFI_ENABLED 68858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : IDS_ASH_STATUS_TRAY_NETWORK_WIFI_DISABLED; 689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text = rb.GetLocalizedString(message_id); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CreateOrUpdateInfoLabel(index++, text, &no_wifi_networks_view_)) 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (no_wifi_networks_view_) { 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_content()->RemoveChildView(no_wifi_networks_view_); 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) no_wifi_networks_view_ = NULL; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // "Wifi Scanning" 69958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (handler->GetScanningByType(NetworkTypePattern::WiFi())) { 700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text = 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_WIFI_SCANNING_MESSAGE); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CreateOrUpdateInfoLabel(index++, text, &scanning_view_)) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (scanning_view_ != NULL) { 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_content()->RemoveChildView(scanning_view_); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanning_view_ = NULL; 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Un-highlighted networks 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < network_list_.size(); ++i) { 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NetworkInfo* info = network_list_[i]; 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!info->highlight) { 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (UpdateNetworkChild(index++, info)) 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_service_paths->insert(info->service_path); 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No networks or other messages (fallback) 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (index == 0) { 723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text; 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (list_type_ == LIST_TYPE_VPN) 725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_NO_VPN); 726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NO_NETWORKS); 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CreateOrUpdateInfoLabel(index++, text, &scanning_view_)) 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_relayout = true; 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return needs_relayout; 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::UpdateNetworkExtra() { 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login_ == user::LOGGED_IN_LOCKED) 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* layout_parent = NULL; // All these buttons have the same parent. 74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (other_wifi_) { 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(turn_on_wifi_); 743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkStateHandler::TechnologyState state = 74458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) handler->GetTechnologyState(NetworkTypePattern::WiFi()); 745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (state == NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) { 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) turn_on_wifi_->SetVisible(false); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_wifi_->SetVisible(false); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (state == NetworkStateHandler::TECHNOLOGY_AVAILABLE) { 750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) turn_on_wifi_->SetVisible(true); 751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) turn_on_wifi_->SetEnabled(true); 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) other_wifi_->SetVisible(false); 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (state == NetworkStateHandler::TECHNOLOGY_ENABLED) { 754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) turn_on_wifi_->SetVisible(false); 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) other_wifi_->SetVisible(true); 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initializing or Enabling 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) turn_on_wifi_->SetVisible(true); 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) turn_on_wifi_->SetEnabled(false); 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) other_wifi_->SetVisible(false); 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout_parent = other_wifi_->parent(); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (other_mobile_) { 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool show_other_mobile = false; 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkStateHandler::TechnologyState state = 76958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) handler->GetTechnologyState(NetworkTypePattern::Mobile()); 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (state != NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) { 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const chromeos::DeviceState* device = 77258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) handler->GetDeviceStateByType(NetworkTypePattern::Mobile()); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_other_mobile = (device && device->support_network_scan()); 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (show_other_mobile) { 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_mobile_->SetVisible(true); 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_mobile_->SetEnabled( 778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) state == NetworkStateHandler::TECHNOLOGY_ENABLED); 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_mobile_->SetVisible(false); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layout_parent) 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout_parent = other_wifi_->parent(); 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layout_parent) 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout_parent->Layout(); 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::CreateSettingsEntry() { 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login_ != user::LOGGED_IN_NONE) { 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Settings, only if logged in. 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings_ = new TrayPopupLabelButton( 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS)); 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy_settings_ = new TrayPopupLabelButton( 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_PROXY_SETTINGS)); 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkStateListDetailedView::ToggleInfoBubble() { 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ResetInfoBubble()) 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) info_bubble_ = new InfoBubble( 8084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) info_icon_, CreateNetworkInfoView(), this); 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::BubbleDelegateView::CreateBubble(info_bubble_)->Show(); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkStateListDetailedView::ResetInfoBubble() { 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!info_bubble_) 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info_bubble_->GetWidget()->Close(); 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info_bubble_ = NULL; 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void NetworkStateListDetailedView::OnInfoBubbleDestroyed() { 8214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) info_bubble_ = NULL; 8224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 8234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::View* NetworkStateListDetailedView::CreateNetworkInfoView() { 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string ip_address("0.0.0.0"); 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NetworkState* network = handler->DefaultNetwork(); 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (network) 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ip_address = network->ip_address(); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View* container = new views::View; 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->SetLayoutManager( 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1)); 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->set_border(views::Border::CreateEmptyBorder(0, 5, 0, 5)); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string ethernet_address, wifi_address, vpn_address; 8397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (list_type_ != LIST_TYPE_VPN) { 84058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ethernet_address = handler->FormattedHardwareAddressForType( 84158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NetworkTypePattern::Ethernet()); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wifi_address = 84358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) handler->FormattedHardwareAddressForType(NetworkTypePattern::WiFi()); 8447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vpn_address = 84658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) handler->FormattedHardwareAddressForType(NetworkTypePattern::VPN()); 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ip_address.empty()) { 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString( 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_IP), ip_address)); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ethernet_address.empty()) { 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString( 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_ETHERNET), ethernet_address)); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!wifi_address.empty()) { 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString( 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_WIFI), wifi_address)); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!vpn_address.empty()) { 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->AddChildView(CreateInfoBubbleLine(bundle.GetLocalizedString( 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_VPN), vpn_address)); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Avoid an empty bubble in the unlikely event that there is no network 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // information at all. 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container->has_children()) { 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->AddChildView(CreateInfoBubbleLabel(bundle.GetLocalizedString( 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_NO_NETWORKS))); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return container; 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkStateListDetailedView::CallRequestScan() { 877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(1) << "Requesting Network Scan."; 87890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkHandler::Get()->network_state_handler()->RequestScan(); 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Periodically request a scan while this UI is open. 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoopForUI::current()->PostDelayedTask( 881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, 882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&NetworkStateListDetailedView::CallRequestScan, AsWeakPtr()), 883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(kRequestScanDelaySeconds)); 884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkStateListDetailedView::ToggleMobile() { 88790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); 888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool enabled = 88958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()); 89058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ash::network_connect::SetTechnologyEnabled(NetworkTypePattern::Mobile(), 89158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !enabled); 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace tray 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace internal 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ash 897