15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/network_dropdown.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/system/chromeos/network/network_icon.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/system/chromeos/network/network_icon_animation.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_display_host.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/login_display_host_impl.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state_handler.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/menu_model.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/webui/web_ui_util.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Timeout between consecutive requests to network library for network 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scan. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kNetworkScanIntervalSecs = 60; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUI specific implementation of the NetworkMenu class. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkMenuWebUI : public NetworkMenu { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkMenuWebUI(NetworkMenu::Delegate* delegate, content::WebUI* web_ui); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NetworkMenu override: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateMenu() OVERRIDE; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when item with command |id| is chosen. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnItemChosen(int id); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts menu model into the ListValue, ready for passing to WebUI. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* ConvertMenuModel(ui::MenuModel* model); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebUI where network menu is located. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebUI* web_ui_; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetworkMenuWebUI); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkMenuWebUI ------------------------------------------------------------ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkMenuWebUI::NetworkMenuWebUI(NetworkMenu::Delegate* delegate, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebUI* web_ui) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : NetworkMenu(delegate), 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui_(web_ui) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkMenuWebUI::UpdateMenu() { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkMenu::UpdateMenu(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_ui_) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::ListValue> list(ConvertMenuModel(GetMenuModel())); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui_->CallJavascriptFunction("cr.ui.DropDown.updateNetworks", *list); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkMenuWebUI::OnItemChosen(int id) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MenuModel* model = GetMenuModel(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index)) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model->ActivatedAt(index); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::ListValue* NetworkMenuWebUI::ConvertMenuModel(ui::MenuModel* model) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* list = new base::ListValue(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < model->GetItemCount(); ++i) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MenuModel::ItemType type = model->GetTypeAt(i); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == ui::MenuModel::TYPE_SEPARATOR) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = -2; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = model->GetCommandIdAt(i); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* item = new base::DictionaryValue(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->SetInteger("id", id); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->SetString("label", model->GetLabelAt(i)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image icon; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model->GetIconAt(i, &icon)) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap icon_bitmap = icon.ToImageSkia()->GetRepresentation( 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui_->GetDeviceScaleFactor()).sk_bitmap(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item->SetString("icon", webui::GetBitmapDataUrl(icon_bitmap)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id >= 0) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->SetBoolean("enabled", model->IsEnabledAt(i)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font* font = model->GetLabelFontAt(i); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (font) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->SetBoolean("bold", font->GetStyle() == gfx::Font::BOLD); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == ui::MenuModel::TYPE_SUBMENU) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->Set("sub", ConvertMenuModel(model->GetSubmenuModelAt(i))); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list->Append(item); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return list; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkDropdown ------------------------------------------------------------- 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochNetworkDropdown::NetworkDropdown(Actor* actor, 1132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch content::WebUI* web_ui, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool oobe) 1152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch : actor_(actor), 1162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch web_ui_(web_ui), 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oobe_(oobe) { 1182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DCHECK(actor_); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_menu_.reset(new NetworkMenuWebUI(this, web_ui)); 120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(NetworkHandler::IsInitialized()); 121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) handler->RequestScan(); 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) handler->AddObserver(this, FROM_HERE); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Refresh(); 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) network_scan_timer_.Start( 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FROM_HERE, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromSeconds(kNetworkScanIntervalSecs), 128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) this, &NetworkDropdown::RequestNetworkScan); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkDropdown::~NetworkDropdown() { 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ash::network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (NetworkHandler::IsInitialized()) { 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NetworkHandler::Get()->network_state_handler()->RemoveObserver( 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) this, FROM_HERE); 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkDropdown::OnItemChosen(int id) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_menu_->OnItemChosen(id); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow NetworkDropdown::GetNativeWindow() const { 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return LoginDisplayHostImpl::default_host()->GetNativeWindow(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkDropdown::OpenButtonOptions() { 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoginDisplayHostImpl::default_host()->OpenProxySettings(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetworkDropdown::ShouldOpenButtonOptions() const { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !oobe_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid NetworkDropdown::OnConnectToNetworkRequested( 1562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& service_path) { 1572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch actor_->OnConnectToNetworkRequested(service_path); 1582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetworkDropdown::DefaultNetworkChanged(const NetworkState* network) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Refresh(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetworkDropdown::NetworkConnectionStateChanged( 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const NetworkState* network) { 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Refresh(); 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetworkDropdown::NetworkListChanged() { 170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Refresh(); 171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetworkDropdown::NetworkIconChanged() { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNetworkIconAndText(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetworkDropdown::Refresh() { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNetworkIconAndText(); 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) network_menu_->UpdateMenu(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkDropdown::SetNetworkIconAndText() { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 text; 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::ImageSkia icon_image; 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool animating = false; 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ash::network_icon::GetDefaultNetworkImageAndLabel( 187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ash::network_icon::ICON_TYPE_LIST, &icon_image, &text, &animating); 188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (animating) { 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ash::network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this); 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ash::network_icon::NetworkIconAnimation::GetInstance()-> 192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RemoveObserver(this); 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap icon_bitmap = icon_image.GetRepresentation( 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui_->GetDeviceScaleFactor()).sk_bitmap(); 196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string icon_str; 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!icon_image.isNull()) 198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) icon_str = webui::GetBitmapDataUrl(icon_bitmap); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringValue title(text); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringValue icon(icon_str); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui_->CallJavascriptFunction("cr.ui.DropDown.updateNetworkTitle", 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title, icon); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NetworkDropdown::RequestNetworkScan() { 206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NetworkHandler::Get()->network_state_handler()->RequestScan(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Refresh(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 211