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