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/options/chromeos/internet_options_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/system/chromeos/network/network_connect.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/mobile_config.h"
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/chromeos/net/onc_utils.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/options/network_config_view.h"
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/options/network_property_ui_data.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/sim_dialog_delegate.h"
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/ui/choose_mobile_network_dialog.h"
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/ui/mobile_config_ui.h"
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/ui_proxy_config_service.h"
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile.h"
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/webui/chromeos/mobile_setup_dialog.h"
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/ui/webui/options/chromeos/internet_options_handler_strings.h"
33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/login/login_state.h"
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/device_state.h"
36a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chromeos/network/managed_network_configuration_handler.h"
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_configuration_handler.h"
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_connection_handler.h"
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_device_handler.h"
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_event_log.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_ip_config.h"
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_profile.h"
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_profile_handler.h"
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_state.h"
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chromeos/network/network_state_handler.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_util.h"
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/onc/onc_signature.h"
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chromeos/network/onc/onc_translation_tables.h"
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/onc/onc_translator.h"
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chromeos/network/onc/onc_utils.h"
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/onc/onc_constants.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "grit/ui_chromeos_resources.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/chromeos/network/network_icon.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace chromeos {
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace options {
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keys for the network description dictionary passed to the web ui. Make sure
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to keep the strings in sync with what the JavaScript side uses.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNetworkInfoKeyIconURL[] = "iconURL";
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNetworkInfoKeyPolicyManaged[] = "policyManaged";
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These are types of name server selections from the web ui.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNameServerTypeAutomatic[] = "automatic";
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNameServerTypeGoogle[] = "google";
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Google public name servers (DNS).
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoogleNameServers[] = "8.8.4.4,8.8.8.8";
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Functions we call in JavaScript.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRefreshNetworkDataFunction[] =
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "options.network.NetworkList.refreshNetworkData";
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSetDefaultNetworkIconsFunction[] =
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "options.network.NetworkList.setDefaultNetworkIcons";
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kSendNetworkDetailsFunction[] =
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    "options.internet.DetailsInternetPage.sendNetworkDetails";
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kShowDetailedInfoFunction[] =
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "options.internet.DetailsInternetPage.showDetailedInfo";
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kUpdateConnectionDataFunction[] =
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "options.internet.DetailsInternetPage.updateConnectionData";
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUpdateCarrierFunction[] =
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "options.internet.DetailsInternetPage.updateCarrier";
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These are used to register message handlers with JavaScript.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNetworkCommandMessage[] = "networkCommand";
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSetApnMessage[] = "setApn";
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSetAutoConnectMessage[] = "setAutoConnect";
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSetCarrierMessage[] = "setCarrier";
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSetIPConfigMessage[] = "setIPConfig";
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSetPreferNetworkMessage[] = "setPreferNetwork";
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSetServerHostname[] = "setServerHostname";
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kShowMorePlanInfoMessage[] = "showMorePlanInfo";
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kSimOperationMessage[] = "simOperation";
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(stevenjb): Replace these with the matching networkingPrivate methods.
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// crbug.com/279351.
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDisableNetworkTypeMessage[] = "disableNetworkType";
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kEnableNetworkTypeMessage[] = "enableNetworkType";
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kGetManagedPropertiesMessage[] = "getManagedProperties";
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kRequestNetworkScanMessage[] = "requestNetworkScan";
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kStartConnectMessage[] = "startConnect";
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kStartDisconnectMessage[] = "startDisconnect";
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These are strings used to communicate with JavaScript.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagActivate[] = "activate";
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagAddConnection[] = "add";
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagCarrierSelectFlag[] = "showCarrierSelect";
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagCellularAvailable[] = "cellularAvailable";
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagCellularEnabled[] = "cellularEnabled";
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTagCellularSimAbsent[] = "cellularSimAbsent";
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTagCellularSimLockType[] = "cellularSimLockType";
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagCellularSupportsScan[] = "cellularSupportsScan";
1212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kTagConfigure[] = "configure";
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagForget[] = "forget";
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagRememberedList[] = "rememberedList";
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTagShowDetails[] = "showDetails";
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagShowViewAccountButton[] = "showViewAccountButton";
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTagSimOpChangePin[] = "changePin";
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTagSimOpConfigure[] = "configure";
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTagSimOpSetLocked[] = "setLocked";
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTagSimOpSetUnlocked[] = "setUnlocked";
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTagSimOpUnlock[] = "unlock";
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagTrue[] = "true";
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagVpnList[] = "vpnList";
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagWifiAvailable[] = "wifiAvailable";
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagWifiEnabled[] = "wifiEnabled";
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagWimaxAvailable[] = "wimaxAvailable";
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagWimaxEnabled[] = "wimaxEnabled";
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagWiredList[] = "wiredList";
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTagWirelessList[] = "wirelessList";
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Pseudo-ONC chrome specific properties appended to the ONC dictionary.
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTagErrorMessage[] = "errorMessage";
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kNetworkInfoKeyServicePath[] = "servicePath";
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kNetworkInfoKeyGUID[] = "GUID";
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kPreferredPriority = 1;
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShillError(const std::string& function,
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                const std::string& error_name,
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                scoped_ptr<base::DictionaryValue> error_data) {
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // UpdateConnectionData may send requests for stale services; ignore
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // these errors.
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (function == "UpdateConnectionData" &&
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      error_name == network_handler::kDBusFailedError)
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NET_LOG_ERROR("Shill Error from InternetOptionsHandler: " + error_name,
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                function);
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst NetworkState* GetNetworkState(const std::string& service_path) {
1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return NetworkHandler::Get()->network_state_handler()->
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetNetworkState(service_path);
1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SetNetworkProperty(const std::string& service_path,
1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        const std::string& property,
1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        base::Value* value) {
1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NET_LOG_EVENT("SetNetworkProperty: " + property, service_path);
1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DictionaryValue properties;
169558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  properties.SetWithoutPathExpansion(property, value);
1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkHandler::Get()->network_configuration_handler()->SetProperties(
1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      service_path, properties,
1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&base::DoNothing),
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&ShillError, "SetNetworkProperty"));
1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Builds a dictionary with network information and an icon used for the
177d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// NetworkList on the settings page. Ownership of the returned pointer is
178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// transferred to the caller.
179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)base::DictionaryValue* BuildNetworkDictionary(
180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const NetworkState* network,
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    float icon_scale_factor,
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const PrefService* profile_prefs) {
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::DictionaryValue> network_info =
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      network_util::TranslateNetworkStateToONC(network);
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool has_policy = onc::HasPolicyForNetwork(
187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      profile_prefs, g_browser_process->local_state(), *network);
188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  network_info->SetBoolean(kNetworkInfoKeyPolicyManaged, has_policy);
1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string icon_url = ui::network_icon::GetImageUrlForNetwork(
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      network, ui::network_icon::ICON_TYPE_LIST, icon_scale_factor);
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  network_info->SetString(kNetworkInfoKeyIconURL, icon_url);
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  network_info->SetString(kNetworkInfoKeyServicePath, network->path());
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return network_info.release();
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ShowViewAccountButton(const NetworkState* cellular) {
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (cellular->activation_state() != shill::kActivationStateActivating &&
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cellular->activation_state() != shill::kActivationStateActivated)
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const DeviceState* device =
2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      NetworkHandler::Get()->network_state_handler()->GetDeviceState(
2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          cellular->device_path());
2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If no online payment URL was provided by shill, Check to see if the
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // MobileConfig carrier indicates that "View Account" should be shown.
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (cellular->payment_url().empty()) {
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!device || !MobileConfig::GetInstance()->IsReady())
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return false;
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const MobileConfig::Carrier* carrier =
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        MobileConfig::GetInstance()->GetCarrier(device->home_provider_id());
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!carrier || !carrier->show_portal_button())
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return false;
2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!cellular->IsConnectedState()) {
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Disconnected LTE networks should show the button if we are online and
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // the device's MDN is set. This is to enable users to update their plan
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // if they are out of credits.
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!NetworkHandler::Get()->network_state_handler()->DefaultNetwork())
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return false;
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& technology = cellular->network_technology();
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (technology != shill::kNetworkTechnologyLte &&
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        technology != shill::kNetworkTechnologyLteAdvanced)
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return false;
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::string mdn;
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (device) {
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      device->properties().GetStringWithoutPathExpansion(shill::kMdnProperty,
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                         &mdn);
2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (mdn.empty())
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return false;
2360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
2390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<base::DictionaryValue> PopulateConnectionDetails(
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const NetworkState* network,
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::DictionaryValue& onc_properties) {
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::DictionaryValue> dictionary(onc_properties.DeepCopy());
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Append Service Path for now.
2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  dictionary->SetString(kNetworkInfoKeyServicePath, network->path());
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Append a Chrome specific translated error message.
2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  dictionary->SetString(
2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      kTagErrorMessage,
2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ash::network_connect::ErrorString(network->error(), network->path()));
2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return dictionary.Pass();
2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Helper methods for SetIPConfigProperties
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool AppendPropertyKeyIfPresent(const std::string& key,
2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                const base::DictionaryValue& old_properties,
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                std::vector<std::string>* property_keys) {
2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (old_properties.HasKey(key)) {
2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    property_keys->push_back(key);
2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return true;
2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return false;
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool AddStringPropertyIfChanged(const std::string& key,
2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                const std::string& new_value,
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                const base::DictionaryValue& old_properties,
2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                base::DictionaryValue* new_properties) {
2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string old_value;
2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!old_properties.GetStringWithoutPathExpansion(key, &old_value) ||
2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new_value != old_value) {
2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    new_properties->SetStringWithoutPathExpansion(key, new_value);
2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return true;
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return false;
2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool AddIntegerPropertyIfChanged(const std::string& key,
2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 int new_value,
2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 const base::DictionaryValue& old_properties,
2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 base::DictionaryValue* new_properties) {
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int old_value;
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!old_properties.GetIntegerWithoutPathExpansion(key, &old_value) ||
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new_value != old_value) {
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    new_properties->SetIntegerWithoutPathExpansion(key, new_value);
2883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return true;
2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
2903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return false;
2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InternetOptionsHandler::InternetOptionsHandler()
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : weak_factory_(this) {
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InternetOptionsHandler::~InternetOptionsHandler() {
3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (NetworkHandler::IsInitialized()) {
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NetworkHandler::Get()->network_state_handler()->RemoveObserver(
3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        this, FROM_HERE);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InternetOptionsHandler::GetLocalizedValues(
3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::DictionaryValue* localized_strings) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(localized_strings);
3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  internet_options_strings::RegisterLocalizedStrings(localized_strings);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(stevenjb): Find a better way to populate initial data before
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // InitializePage() gets called.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string owner;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  localized_strings->SetString("ownerUserId", base::UTF8ToUTF16(owner));
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool logged_in_as_owner = LoginState::Get()->GetLoggedInUserType() ==
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            LoginState::LOGGED_IN_USER_OWNER;
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  localized_strings->SetBoolean("loggedInAsOwner", logged_in_as_owner);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DictionaryValue* network_dictionary = new base::DictionaryValue;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillNetworkInfo(network_dictionary);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->Set("networkData", network_dictionary);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InternetOptionsHandler::InitializePage() {
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DictionaryValue dictionary;
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dictionary.SetString(::onc::network_type::kCellular,
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetIconDataUrl(IDR_AURA_UBER_TRAY_NETWORK_BARS_DARK));
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dictionary.SetString(::onc::network_type::kWiFi,
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetIconDataUrl(IDR_AURA_UBER_TRAY_NETWORK_ARCS_DARK));
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dictionary.SetString(::onc::network_type::kVPN,
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetIconDataUrl(IDR_AURA_UBER_TRAY_NETWORK_VPN));
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction(kSetDefaultNetworkIconsFunction,
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   dictionary);
3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkHandler::Get()->network_state_handler()->RequestScan();
337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RefreshNetworkData();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InternetOptionsHandler::RegisterMessages() {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup handlers specific to this panel.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(kNetworkCommandMessage,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&InternetOptionsHandler::NetworkCommandCallback,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(kSetPreferNetworkMessage,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&InternetOptionsHandler::SetPreferNetworkCallback,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(kSetAutoConnectMessage,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&InternetOptionsHandler::SetAutoConnectCallback,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(kSetIPConfigMessage,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&InternetOptionsHandler::SetIPConfigCallback,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(kShowMorePlanInfoMessage,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&InternetOptionsHandler::ShowMorePlanInfoCallback,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(kSetApnMessage,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&InternetOptionsHandler::SetApnCallback,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(kSetCarrierMessage,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&InternetOptionsHandler::SetCarrierCallback,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->RegisterMessageCallback(kSimOperationMessage,
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&InternetOptionsHandler::SimOperationCallback,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(kSetServerHostname,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&InternetOptionsHandler::SetServerHostnameCallback,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // networkingPrivate methods
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->RegisterMessageCallback(kDisableNetworkTypeMessage,
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&InternetOptionsHandler::DisableNetworkTypeCallback,
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this)));
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->RegisterMessageCallback(kEnableNetworkTypeMessage,
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&InternetOptionsHandler::EnableNetworkTypeCallback,
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this)));
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->RegisterMessageCallback(kGetManagedPropertiesMessage,
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&InternetOptionsHandler::GetManagedPropertiesCallback,
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this)));
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->RegisterMessageCallback(kRequestNetworkScanMessage,
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&InternetOptionsHandler::RequestNetworkScanCallback,
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this)));
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->RegisterMessageCallback(kStartConnectMessage,
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&InternetOptionsHandler::StartConnectCallback,
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this)));
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->RegisterMessageCallback(kStartDisconnectMessage,
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&InternetOptionsHandler::StartDisconnectCallback,
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this)));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::ShowMorePlanInfoCallback(
3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::ListValue* args) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_ui())
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string service_path;
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (args->GetSize() != 1 || !args->GetString(0, &service_path)) {
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ash::network_connect::ShowMobileSetup(service_path);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::SetApnCallback(const base::ListValue* args) {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string service_path;
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!args->GetString(0, &service_path)) {
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NOTREACHED();
4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkHandler::Get()->network_configuration_handler()->GetProperties(
4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      service_path,
4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&InternetOptionsHandler::SetApnProperties,
4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 weak_factory_.GetWeakPtr(), base::Owned(args->DeepCopy())),
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&ShillError, "SetApnCallback"));
4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::SetApnProperties(
4177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::ListValue* args,
4187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& service_path,
4197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::DictionaryValue& shill_properties) {
4207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string apn, username, password;
4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!args->GetString(1, &apn) ||
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(2, &username) ||
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(3, &password)) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NET_LOG_EVENT("SetApnCallback", service_path);
4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (apn.empty()) {
4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    std::vector<std::string> properties_to_clear;
43168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    properties_to_clear.push_back(shill::kCellularApnProperty);
4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NetworkHandler::Get()->network_configuration_handler()->ClearProperties(
4337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      service_path, properties_to_clear,
4347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&base::DoNothing),
4357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&ShillError, "ClearCellularApnProperties"));
4367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
4377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::DictionaryValue* shill_apn_dict = NULL;
4407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string network_id;
4417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (shill_properties.GetDictionaryWithoutPathExpansion(
44268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          shill::kCellularApnProperty, &shill_apn_dict)) {
4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    shill_apn_dict->GetStringWithoutPathExpansion(
44468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        shill::kApnNetworkIdProperty, &network_id);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DictionaryValue properties;
4477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DictionaryValue* apn_dict = new base::DictionaryValue;
44868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  apn_dict->SetStringWithoutPathExpansion(shill::kApnProperty, apn);
44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  apn_dict->SetStringWithoutPathExpansion(shill::kApnNetworkIdProperty,
4507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                          network_id);
45168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  apn_dict->SetStringWithoutPathExpansion(shill::kApnUsernameProperty,
4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                          username);
45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  apn_dict->SetStringWithoutPathExpansion(shill::kApnPasswordProperty,
4547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                          password);
45568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  properties.SetWithoutPathExpansion(shill::kCellularApnProperty, apn_dict);
4567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkHandler::Get()->network_configuration_handler()->SetProperties(
4577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      service_path, properties,
4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&base::DoNothing),
4597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&ShillError, "SetApnProperties"));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::CarrierStatusCallback() {
4637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
4647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const DeviceState* device =
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handler->GetDeviceStateByType(NetworkTypePattern::Cellular());
4667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (device && (device->carrier() == shill::kCarrierSprint)) {
4677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const NetworkState* network =
46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        handler->FirstNetworkByType(NetworkTypePattern::Cellular());
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (network && network->path() == details_path_) {
470ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ash::network_connect::ActivateCellular(network->path());
4717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      UpdateConnectionData(network->path());
4727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateCarrier();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::SetCarrierCallback(const base::ListValue* args) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string service_path;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string carrier;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetSize() != 2 ||
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(0, &service_path) ||
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(1, &carrier)) {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const DeviceState* device = NetworkHandler::Get()->network_state_handler()->
48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetDeviceStateByType(NetworkTypePattern::Cellular());
4887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!device) {
4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LOG(WARNING) << "SetCarrierCallback with no cellular device.";
4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkHandler::Get()->network_device_handler()->SetCarrier(
4937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      device->path(),
4947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      carrier,
4957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&InternetOptionsHandler::CarrierStatusCallback,
4967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 weak_factory_.GetWeakPtr()),
4977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&ShillError, "SetCarrierCallback"));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InternetOptionsHandler::SimOperationCallback(const base::ListValue* args) {
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string operation;
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (args->GetSize() != 1 || !args->GetString(0, &operation)) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (operation == kTagSimOpConfigure) {
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    mobile_config_ui::DisplayConfigDialog();
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. Bring up SIM unlock dialog, pass new RequirePin setting in URL.
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. Dialog will ask for current PIN in any case.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3. If card is locked it will first call PIN unlock operation
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 4. Then it will call Set RequirePin, passing the same PIN.
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // 5. The dialog may change device properties, in which case
5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  //    DevicePropertiesUpdated() will get called which will update the UI.
5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SimDialogDelegate::SimDialogMode mode;
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (operation == kTagSimOpSetLocked) {
5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    mode = SimDialogDelegate::SIM_DIALOG_SET_LOCK_ON;
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (operation == kTagSimOpSetUnlocked) {
5207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    mode = SimDialogDelegate::SIM_DIALOG_SET_LOCK_OFF;
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (operation == kTagSimOpUnlock) {
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    mode = SimDialogDelegate::SIM_DIALOG_UNLOCK;
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (operation == kTagSimOpChangePin) {
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    mode = SimDialogDelegate::SIM_DIALOG_CHANGE_PIN;
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SimDialogDelegate::ShowDialog(GetNativeWindow(), mode);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci////////////////////////////////////////////////////////////////////////////////
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// networkingPrivate implementation methods. TODO(stevenjb): Use the
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// networkingPrivate API directly in the settings JS and deprecate these
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// methods. crbug.com/279351.
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InternetOptionsHandler::DisableNetworkTypeCallback(
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::ListValue* args) {
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string type;
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!args->GetString(0, &type)) {
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      chromeos::onc::NetworkTypePatternFromOncType(type), false,
5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&ShillError, "DisableNetworkType"));
5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InternetOptionsHandler::EnableNetworkTypeCallback(
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::ListValue* args) {
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string type;
5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!args->GetString(0, &type)) {
5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      chromeos::onc::NetworkTypePatternFromOncType(type), true,
5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&ShillError, "EnableNetworkType"));
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InternetOptionsHandler::GetManagedPropertiesCallback(
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::ListValue* args) {
5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string service_path;
5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!args->GetString(0, &service_path)) {
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NetworkHandler::Get()->managed_network_configuration_handler()
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->GetManagedProperties(
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          LoginState::Get()->primary_user_hash(),
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          service_path,
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              &InternetOptionsHandler::PopulateDictionaryDetailsCallback,
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              weak_factory_.GetWeakPtr()),
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(&ShillError, "GetManagedProperties"));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InternetOptionsHandler::RequestNetworkScanCallback(
5797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::ListValue* args) {
5807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkHandler::Get()->network_state_handler()->RequestScan();
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InternetOptionsHandler::StartConnectCallback(const base::ListValue* args) {
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string service_path;
5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!args->GetString(0, &service_path)) {
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ash::network_connect::ConnectToNetwork(service_path);
5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InternetOptionsHandler::StartDisconnectCallback(
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::ListValue* args) {
5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string service_path;
5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!args->GetString(0, &service_path)) {
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NetworkHandler::Get()->network_connection_handler()->DisconnectNetwork(
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      service_path,
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&base::DoNothing),
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&ShillError, "StartDisconnectCallback"));
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci////////////////////////////////////////////////////////////////////////////////
6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string InternetOptionsHandler::GetIconDataUrl(int resource_id) const {
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::ImageSkia* icon =
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id);
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::ImageSkiaRep image_rep = icon->GetRepresentation(
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      web_ui()->GetDeviceScaleFactor());
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return webui::GetBitmapDataUrl(image_rep.sk_bitmap());
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InternetOptionsHandler::RefreshNetworkData() {
6167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DictionaryValue dictionary;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillNetworkInfo(&dictionary);
618116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_ui()->CallJavascriptFunction(kRefreshNetworkDataFunction, dictionary);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InternetOptionsHandler::UpdateConnectionData(
6227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& service_path) {
6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NetworkHandler::Get()
6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->managed_network_configuration_handler()
6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->GetManagedProperties(
6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          LoginState::Get()->primary_user_hash(),
6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          service_path,
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(&InternetOptionsHandler::UpdateConnectionDataCallback,
6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     weak_factory_.GetWeakPtr()),
6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(&ShillError, "UpdateConnectionData"));
6317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
6327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::UpdateConnectionDataCallback(
6347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& service_path,
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::DictionaryValue& onc_properties) {
6367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const NetworkState* network = GetNetworkState(service_path);
6377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!network)
6387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::DictionaryValue> dictionary =
6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PopulateConnectionDetails(network, onc_properties);
641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_ui()->CallJavascriptFunction(kUpdateConnectionDataFunction, *dictionary);
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InternetOptionsHandler::UpdateCarrier() {
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction(kUpdateCarrierFunction);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
648d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void InternetOptionsHandler::DeviceListChanged() {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_ui())
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshNetworkData();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::NetworkListChanged() {
6557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!web_ui())
6567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
6577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RefreshNetworkData();
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void InternetOptionsHandler::NetworkConnectionStateChanged(
66158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const NetworkState* network) {
66258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!web_ui())
66358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (network->path() == details_path_)
6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateConnectionData(network->path());
66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::NetworkPropertiesUpdated(
6697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const NetworkState* network) {
6707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!web_ui())
6717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
6727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RefreshNetworkData();
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (network->path() == details_path_)
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateConnectionData(network->path());
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void InternetOptionsHandler::DevicePropertiesUpdated(
6785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const DeviceState* device) {
6795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!web_ui())
6805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
6815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (device->type() != shill::kTypeCellular)
6825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
6835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const NetworkState* network =
6845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      NetworkHandler::Get()->network_state_handler()->FirstNetworkByType(
6855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          NetworkTypePattern::Cellular());
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (network && network->path() == details_path_)
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateConnectionData(network->path());
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::SetServerHostnameCallback(
6917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::ListValue* args) {
6927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string service_path, server_hostname;
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetSize() < 2 ||
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(0, &service_path) ||
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(1, &server_hostname)) {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetNetworkProperty(service_path,
700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     shill::kProviderHostProperty,
701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     new base::StringValue(server_hostname));
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::SetPreferNetworkCallback(
7057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::ListValue* args) {
7067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string service_path, prefer_network_str;
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetSize() < 2 ||
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(0, &service_path) ||
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(1, &prefer_network_str)) {
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int priority = (prefer_network_str == kTagTrue) ? kPreferredPriority : 0;
7145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SetNetworkProperty(service_path,
7155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     shill::kPriorityProperty,
7165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     new base::FundamentalValue(priority));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::SetAutoConnectCallback(
7207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::ListValue* args) {
7217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string service_path, auto_connect_str;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetSize() < 2 ||
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(0, &service_path) ||
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(1, &auto_connect_str)) {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool auto_connect = auto_connect_str == kTagTrue;
729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetNetworkProperty(service_path,
730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     shill::kAutoConnectProperty,
731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     new base::FundamentalValue(auto_connect));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::SetIPConfigCallback(const base::ListValue* args) {
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string service_path;
7367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!args->GetString(0, &service_path)) {
7377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NOTREACHED();
7387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
7397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
7407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkHandler::Get()->network_configuration_handler()->GetProperties(
7417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      service_path,
7427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&InternetOptionsHandler::SetIPConfigProperties,
7437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 weak_factory_.GetWeakPtr(), base::Owned(args->DeepCopy())),
7447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&ShillError, "SetIPConfigCallback"));
7457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::SetIPConfigProperties(
7487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::ListValue* args,
7497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& service_path,
7507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::DictionaryValue& shill_properties) {
7517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string address, netmask, gateway, name_server_type, name_servers;
7527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool dhcp_for_ip;
7537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!args->GetBoolean(1, &dhcp_for_ip) ||
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(2, &address) ||
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(3, &netmask) ||
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(4, &gateway) ||
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(5, &name_server_type) ||
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(6, &name_servers)) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7625b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  NET_LOG_USER("SetIPConfigProperties: " + name_server_type, service_path);
7637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<std::string> properties_to_clear;
7657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DictionaryValue properties_to_set;
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dhcp_for_ip) {
7685b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    AppendPropertyKeyIfPresent(shill::kStaticIPAddressProperty,
7695b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               shill_properties,
7705b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               &properties_to_clear);
7715b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    AppendPropertyKeyIfPresent(shill::kStaticIPPrefixlenProperty,
7725b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               shill_properties,
7735b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               &properties_to_clear);
7745b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    AppendPropertyKeyIfPresent(shill::kStaticIPGatewayProperty,
7755b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               shill_properties,
7765b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               &properties_to_clear);
7777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
7785b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    AddStringPropertyIfChanged(shill::kStaticIPAddressProperty,
7795b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               address,
7805b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               shill_properties,
7815b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               &properties_to_set);
7827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int prefixlen = network_util::NetmaskToPrefixLength(netmask);
7831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (prefixlen < 0) {
7841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      LOG(ERROR) << "Invalid prefix length for: " << service_path
7851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 << " with netmask " << netmask;
7867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      prefixlen = 0;
7877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
7885b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    AddIntegerPropertyIfChanged(shill::kStaticIPPrefixlenProperty,
7895b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                                prefixlen,
7905b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                                shill_properties,
7915b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                                &properties_to_set);
7925b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    AddStringPropertyIfChanged(shill::kStaticIPGatewayProperty,
7935b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               gateway,
7945b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               shill_properties,
7955b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               &properties_to_set);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (name_server_type == kNameServerTypeAutomatic) {
7997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    AppendPropertyKeyIfPresent(shill::kStaticIPNameServersProperty,
8005b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               shill_properties,
8015b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               &properties_to_clear);
8027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
8037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (name_server_type == kNameServerTypeGoogle)
8047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      name_servers = kGoogleNameServers;
8055b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    AddStringPropertyIfChanged(shill::kStaticIPNameServersProperty,
8065b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               name_servers,
8075b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               shill_properties,
8085b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                               &properties_to_set);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!properties_to_clear.empty()) {
8127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NetworkHandler::Get()->network_configuration_handler()->ClearProperties(
8135b892326406927b709cdaf6c384d4ababf456332Ben Murdoch        service_path,
8145b892326406927b709cdaf6c384d4ababf456332Ben Murdoch        properties_to_clear,
8155b892326406927b709cdaf6c384d4ababf456332Ben Murdoch        base::Bind(&base::DoNothing),
8165b892326406927b709cdaf6c384d4ababf456332Ben Murdoch        base::Bind(&ShillError, "ClearIPConfigProperties"));
8177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
8187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!properties_to_set.empty()) {
8197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NetworkHandler::Get()->network_configuration_handler()->SetProperties(
8205b892326406927b709cdaf6c384d4ababf456332Ben Murdoch        service_path,
8215b892326406927b709cdaf6c384d4ababf456332Ben Murdoch        properties_to_set,
8227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::Bind(&base::DoNothing),
8237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::Bind(&ShillError, "SetIPConfigProperties"));
8247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
8257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string device_path;
8265b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  shill_properties.GetStringWithoutPathExpansion(shill::kDeviceProperty,
8275b892326406927b709cdaf6c384d4ababf456332Ben Murdoch                                                 &device_path);
8287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!device_path.empty()) {
8293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    NetworkHandler::Get()->network_device_handler()->RequestRefreshIPConfigs(
8303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        device_path,
8315b892326406927b709cdaf6c384d4ababf456332Ben Murdoch        base::Bind(&base::DoNothing),
8323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        base::Bind(&ShillError, "RequestRefreshIPConfigs"));
833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::PopulateDictionaryDetailsCallback(
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& service_path,
8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::DictionaryValue& onc_properties) {
8397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const NetworkState* network = GetNetworkState(service_path);
8407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!network) {
8417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LOG(ERROR) << "Network properties not found: " << service_path;
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::DictionaryValue> dictionary =
8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PopulateConnectionDetails(network, onc_properties);
8467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Show details dialog
8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->CallJavascriptFunction(kSendNetworkDetailsFunction, *dictionary);
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow InternetOptionsHandler::GetNativeWindow() const {
852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return web_ui()->GetWebContents()->GetTopLevelNativeWindow();
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfloat InternetOptionsHandler::GetScaleFactor() const {
856116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return web_ui()->GetDeviceScaleFactor();
857116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
858116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
859116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst PrefService* InternetOptionsHandler::GetPrefs() const {
860116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return Profile::FromWebUI(web_ui())->GetPrefs();
861116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
862116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::NetworkCommandCallback(
8647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::ListValue* args) {
865116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string onc_type;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string service_path;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string command;
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetSize() != 3 ||
869116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !args->GetString(0, &onc_type) ||
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(1, &service_path) ||
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(2, &command)) {
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string type;  // Shill type
876116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!onc_type.empty()) {
877116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    type = network_util::TranslateONCTypeToShill(onc_type);
878116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (type.empty())
879116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      LOG(ERROR) << "Unable to translate ONC type: " << onc_type;
880116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process commands that do not require an existing network.
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command == kTagAddConnection) {
883116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AddConnection(type);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (command == kTagForget) {
885116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NetworkHandler::Get()->network_configuration_handler()->
886116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        RemoveConfiguration(
887116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            service_path,
888116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            base::Bind(&base::DoNothing),
889116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            base::Bind(&ShillError, "NetworkCommand: " + command));
8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (command == kTagShowDetails) {
8911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SendShowDetailedInfo(service_path);
8922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  } else if (command == kTagConfigure) {
893ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    NetworkConfigView::Show(service_path, GetNativeWindow());
89468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else if (command == kTagActivate && type == shill::kTypeCellular) {
895ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ash::network_connect::ActivateCellular(service_path);
89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Activation may update network properties (e.g. ActivationState), so
89790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // request them here in case they change.
8987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    UpdateConnectionData(service_path);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOG(ERROR) << "Unknown internet options command: " << command;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::AddConnection(const std::string& type) {
906c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (type == shill::kTypeWifi) {
90768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    NetworkConfigView::ShowForType(shill::kTypeWifi, GetNativeWindow());
908c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else if (type == shill::kTypeVPN) {
90968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    NetworkConfigView::ShowForType(shill::kTypeVPN, GetNativeWindow());
910c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else if (type == shill::kTypeCellular) {
9117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ChooseMobileNetworkDialog::ShowDialog(GetNativeWindow());
912c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else {
913116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    LOG(ERROR) << "Unsupported type for AddConnection";
914c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid InternetOptionsHandler::SendShowDetailedInfo(
9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& service_path) {
9191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  details_path_ = service_path;
9201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::DictionaryValue> dictionary(new base::DictionaryValue);
9221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const NetworkState* network = GetNetworkState(service_path);
9231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (network) {
9241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dictionary->SetString(kNetworkInfoKeyServicePath, service_path);
9251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dictionary->SetString(kNetworkInfoKeyGUID, network->guid());
9261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (network->type() == shill::kTypeCellular) {
9271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      dictionary->SetBoolean(
9281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kTagCarrierSelectFlag,
9291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          CommandLine::ForCurrentProcess()
9301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ->HasSwitch(chromeos::switches::kEnableCarrierSwitching));
9311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      dictionary->SetBoolean(kTagShowViewAccountButton,
9321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             ShowViewAccountButton(network));
9331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
9341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->CallJavascriptFunction(kShowDetailedInfoFunction, *dictionary);
9361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::ListValue* InternetOptionsHandler::GetWiredList() {
9397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::ListValue* list = new base::ListValue();
9407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
94158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      FirstNetworkByType(NetworkTypePattern::Ethernet());
9427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!network)
9437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return list;
944116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  list->Append(BuildNetworkDictionary(network, GetScaleFactor(), GetPrefs()));
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return list;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::ListValue* InternetOptionsHandler::GetWirelessList() {
9497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::ListValue* list = new base::ListValue();
9507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
9517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkStateHandler::NetworkStateList networks;
952f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NetworkHandler::Get()->network_state_handler()->GetVisibleNetworkListByType(
95358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NetworkTypePattern::Wireless(), &networks);
9547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for (NetworkStateHandler::NetworkStateList::const_iterator iter =
9557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch           networks.begin(); iter != networks.end(); ++iter) {
956116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    list->Append(BuildNetworkDictionary(*iter, GetScaleFactor(), GetPrefs()));
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return list;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::ListValue* InternetOptionsHandler::GetVPNList() {
9637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::ListValue* list = new base::ListValue();
9647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
9657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkStateHandler::NetworkStateList networks;
966f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NetworkHandler::Get()->network_state_handler()->GetVisibleNetworkListByType(
96758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NetworkTypePattern::VPN(), &networks);
9687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for (NetworkStateHandler::NetworkStateList::const_iterator iter =
9697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch           networks.begin(); iter != networks.end(); ++iter) {
970116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    list->Append(BuildNetworkDictionary(*iter, GetScaleFactor(), GetPrefs()));
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return list;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::ListValue* InternetOptionsHandler::GetRememberedList() {
9777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::ListValue* list = new base::ListValue();
9787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
979f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NetworkStateHandler::NetworkStateList networks;
980f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NetworkHandler::Get()->network_state_handler()->GetNetworkListByType(
981f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      NetworkTypePattern::Default(),
982f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true /* configured_only */,
983f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false /* visible_only */,
984f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      0 /* no limit */,
985f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &networks);
986f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (NetworkStateHandler::NetworkStateList::const_iterator iter =
987f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)           networks.begin(); iter != networks.end(); ++iter) {
988f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const NetworkState* network = *iter;
989f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (network->type() != shill::kTypeWifi &&
990f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        network->type() != shill::kTypeVPN)
9917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      continue;
992d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    list->Append(
993f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        BuildNetworkDictionary(network,
994f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               web_ui()->GetDeviceScaleFactor(),
995f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               Profile::FromWebUI(web_ui())->GetPrefs()));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return list;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InternetOptionsHandler::FillNetworkInfo(
10027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::DictionaryValue* dictionary) {
10037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary->Set(kTagWiredList, GetWiredList());
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary->Set(kTagWirelessList, GetWirelessList());
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary->Set(kTagVpnList, GetVPNList());
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary->Set(kTagRememberedList, GetRememberedList());
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  dictionary->SetBoolean(
101058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kTagWifiAvailable,
101158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handler->IsTechnologyAvailable(NetworkTypePattern::WiFi()));
101258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  dictionary->SetBoolean(
101358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kTagWifiEnabled,
101458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handler->IsTechnologyEnabled(NetworkTypePattern::WiFi()));
101558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const DeviceState* cellular =
10171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      handler->GetDeviceStateByType(NetworkTypePattern::Mobile());
101858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  dictionary->SetBoolean(
101958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kTagCellularAvailable,
102058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handler->IsTechnologyAvailable(NetworkTypePattern::Mobile()));
102158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  dictionary->SetBoolean(
102258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kTagCellularEnabled,
102358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()));
10241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dictionary->SetBoolean(kTagCellularSupportsScan,
10251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         cellular && cellular->support_network_scan());
10261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dictionary->SetBoolean(kTagCellularSimAbsent,
10271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         cellular && cellular->IsSimAbsent());
10281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dictionary->SetString(kTagCellularSimLockType,
10291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        cellular ? cellular->sim_lock_type() : "");
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  dictionary->SetBoolean(
103258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kTagWimaxAvailable,
103358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handler->IsTechnologyAvailable(NetworkTypePattern::Wimax()));
103458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  dictionary->SetBoolean(
103558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kTagWimaxEnabled,
103658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handler->IsTechnologyEnabled(NetworkTypePattern::Wimax()));
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace options
10407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace chromeos
1041