From 5a4ae5d3bde26528dc5b714e14066822e0f2bd5b Mon Sep 17 00:00:00 2001 From: Jimmy Huang Date: Wed, 13 Nov 2013 11:56:46 -0800 Subject: [PATCH] Refactor WiFi module - Renamed WiFi settings to Connman settings to support different connman technologies - Fixed event handling for connman property changes - Added support for adding unknown/hidden networks - Added support to connect to protected networks Change-Id: I15557ff56582b7202d20a0e55d78ce0af432b266 Signed-off-by: Jimmy Huang --- css/style.css | 23 +- index.html | 502 +++++++++++++++++----------------- js/api-connman.js | 196 ++++++++++++++ js/api-wifi.js | 164 ------------ js/main.js | 10 +- js/panel-bluetooth.js | 4 +- js/panel-connman.js | 654 +++++++++++++++++++++++++++++++++++++++++++++ js/panel-wifi.js | 607 ----------------------------------------- js/utils.js | 2 +- js/websocket.js | 11 +- packaging/Settings.changes | 3 + 11 files changed, 1141 insertions(+), 1035 deletions(-) create mode 100644 js/api-connman.js delete mode 100644 js/api-wifi.js create mode 100644 js/panel-connman.js delete mode 100644 js/panel-wifi.js diff --git a/css/style.css b/css/style.css index b19f5a0..b8f6d66 100644 --- a/css/style.css +++ b/css/style.css @@ -17,38 +17,35 @@ margin: auto; right: 10px; } -/* WiFi */ -#wifi_networks { - display: none; -} -.network-connected .network-status { +/* Connman */ +.service-connected .service-status { color: green; } -.network-ssid { +.service-ssid { font-size: 15px; } -.network-encryption { +.service-encryption { font-size: 10px; } -.network-strength { +.service-strength { font-size: 10px; } -.network-address { +.service-address { font-size: 10px; } -.network-status { +.service-status { font-size: 10px; } -.network-action-button { +.service-action-button { max-width: 150px; text-align: center; } /* make the button text so that it doesn't add the ellipsis */ -.network-action-button .ui-btn-inner { +.service-action-button .ui-btn-inner { text-overflow: initial; } /* make room for bottom for bottom of the screen due to weston compositor */ -#button_wifi_add { +#button_connman_wifi_add { margin-bottom: 100px; } /* Bluetooth */ diff --git a/index.html b/index.html index 22b4f69..530cd5a 100644 --- a/index.html +++ b/index.html @@ -8,170 +8,197 @@ * --> + Settings - + - + - + - +
- Quit + Quit

Settings

-
+
+ -
-
-

Connectivity

-
- -
-
-
+
+
+

Connectivity

+
+ +
+
+
-
-
-

System

-
- -
-
-
- +
+
+

System

+
+ +
+
+
+ - -
-
- Back -

Wi-Fi

-
+ +
+
+ Back +

Connman

+
-
-
-
-
-
+
+
+

Technologies

-
    -
  • - - -
  • -
-
-

Available Networks

-
    -
      -
      Refresh
      -
      Add
      +
      +
        +
      • + + +
      • +
      +
      +
      +
      +

      Available Services

      +
      +
        +
          +
          Refresh
          +
          Add
          -
          -
          +
          +
          - -
          + +
          - Back -

          Network Info

          + Back +

          Service Info

          -
          +
          - Back + Back

          Add Network

          - Add + Add
          - - + + + + +
          + + + + + - + + + + + +
            -
          • - +
          • + +
          • -
          • - - +
          +
          +
          + + +
          +
          + Back +

          Enter passphrase

          +
          + +
          +
            +
          • + +
          +
          Connect
          - - -
          -
          - Back -

          Bluetooth

          -
          -
          -
          -
          -
          -
          -
          -
            -
          • - - -
          • -
          -
          -

          Available Devices

          + +
          +
          + Back +

          Bluetooth

          +
          + +
          +
          +
          +
          +
          +
          +
            +
          • + + +
          • +
          +
          +
          +

          Available Devices

          +
            -
              -
              Scan
              -
              -
              -
              +
                +
                Scan
                +
                +
                +
                @@ -184,29 +211,29 @@
                - -
                -
                - Back -

                Date and Time

                -
                + +
                +
                + Back +

                Date and Time

                +
                -
                -
                  -
                • - - + +
                -
                  -
                • - - -
                • -
                +
                  +
                • + + +
                • +
                • @@ -215,114 +242,113 @@
                • - - + + + +
                • +
                +
                  +
                • + +
                -
                  -
                • - - -
                • -
                -
                Apply
                -
                Cancel
                -
                -
                - +
                Apply
                +
                Cancel
                +
                +
                diff --git a/js/api-connman.js b/js/api-connman.js new file mode 100644 index 0000000..08b8660 --- /dev/null +++ b/js/api-connman.js @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2013, Intel Corporation. + * + * This program is licensed under the terms and conditions of the + * Apache License, version 2.0. The full text of the Apache License is at + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ + +/* Namespace */ +var settings = settings || {}; +settings.connman = settings.connman || {}; + +/* Module */ +settings.connman = (function() { + + var default_adapter = null; + + /* Technology class */ + var ConnmanTechnology = function(technology_path, technology_properties) { + this.id = technology_path; + this.prop = technology_properties; + }; + + ConnmanTechnology.prototype.setPowered = function(powered, success_cb, error_cb) { + if (wsAPI === undefined) return; + if (this.setPowerInProgress) { + console.log('Enabling/disabling technology in progress'); + return; + } + + var me = this; + this.setPowerInProgress = true; + setTimeout(function() { + wsAPI.sendRequest(me.prop.Type, 'enable', powered, function() { + me.setPowerInProgress = false; + success_cb(); + }, function(e) { + if (e.indexOf('Already enabled') >= 0) { + console.log('connman ' + me.prop.Type + ' already enabled'); + me.setPowerInProgress = false; + success_cb(); + } else if (e.indexOf('Already disabled') >= 0) { + console.log('connman ' + me.prop.Type + ' already disabled'); + me.setPowerInProgress = false; + success_cb(); + } else { + me.setPowerInProgress = false; + error_cb(e); + } + }) + }, 2000); + }; + + ConnmanTechnology.prototype.getPowered = function(success_cb, error_cb) { + if (wsAPI === undefined) return; + var me = this; + wsAPI.sendRequest(this.prop.Type, 'is_enabled', null, function(isEnabled) { + if (isEnabled === undefined) { + console.log('Badly formed json message: ' + json_msg); + } + me.powered = isEnabled; + success_cb(me.powered); + }, error_cb); + }; + + /* Service class */ + ConnmanService = function(service_path, service_properties) { + this.id = service_path; + this.prop = service_properties; + }; + + ConnmanService.prototype.connect = function(passphrase, success_cb, error_cb) { + if (wsAPI === undefined) return; + + var info = [this.id, + { + 'Name': this.prop.Name, + 'Type': this.prop.EncryptionMode, + 'Passphrase': passphrase + }] + wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'connect', info, success_cb, error_cb); + }; + + ConnmanService.prototype.disconnect = function(success_cb, error_cb) { + if (wsAPI === undefined) return; + wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'disconnect', this.id, success_cb, error_cb); + }; + + /* global functions */ + function subscribeEvents(callback) { + wsAPI.subscribeEvents(callback); + } + + function unsubscribeEvents(callback) { + wsAPI.unsubscribeEvents(callback); + } + + function getTechnologies(success_cb, error_cb) { + wsAPI.sendRequest('connman', 'getTechnologies', null, function(results) { + success_cb(results); + }, function(error) { + console.log('getTechnologies not implemented in settingsd, using pre-defined values'); + var results = [ + ['/net/connman/technology/ethernet', + { + 'Name': 'Wired', + 'Type': 'ethernet', + }], + ['/net/connman/technology/wifi', + { + 'Name': 'WiFi', + 'Type': 'wifi', + }], + ['/net/connman/technology/bluetooth', + { + 'Name': 'Bluetooth', + 'Type': 'bluetooth', + }] + ]; + + var technologies = []; + for (var i = 0; i < results.length; i++) { + var technology = new settings.connman.ConnmanTechnology(results[i][0], results[i][1]); + technologies.push(technology); + } + + success_cb(technologies); + }); + } + + function getServices(success_cb, error_cb) { + return this.scan(success_cb, error_cb); + + wsAPI.sendRequest(WS_REQUEST_TYPE.CONNMAN, 'getServices', null, function(results) { + if (results.length >= 0 && results[0].length >= 0 && results[0][0][0] === undefined) { + error_cb('Cannot parse getServices results'); + return; + } + + var services_list = results[0]; + + try { + var results = []; + for (var i = 0; i < services_list.length; i++) { + if (services_list[i][0] === undefined || services_list[i][1] === undefined) { + console.log('Badly form json message: ' + json_msg); + } + + var service = new settings.connman.ConnmanService(services_list[i][0], services_list[i][1]); + results.push(service); + } + } catch (e) { + error_cb(e); + } + success_cb(results); + }, error_cb); + } + + function scan(success_cb, error_cb) { + if (wsAPI === undefined) return; + wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'scan', null, function(results) { + if (results.length >= 0 && results[0].length >= 0 && results[0][0][0] === undefined) { + error_cb('Cannot parse scan results'); + return; + } + + var services_list = results[0]; + + try { + var results = []; + for (var i = 0; i < services_list.length; i++) { + if (services_list[i][0] === undefined || services_list[i][1] === undefined) { + console.log('Badly form json message: ' + json_msg); + } + + var service = new settings.connman.ConnmanService(services_list[i][0], services_list[i][1]); + results.push(service); + } + } catch (e) { + error_cb(e); + } + success_cb(results); + }, error_cb); + }; + + return { + ConnmanTechnology: ConnmanTechnology, + ConnmanService: ConnmanService, + subscribeEvents: subscribeEvents, + unsubscribeEvents: unsubscribeEvents, + getTechnologies: getTechnologies, + getServices: getServices, + scan: scan + }; +})(); \ No newline at end of file diff --git a/js/api-wifi.js b/js/api-wifi.js deleted file mode 100644 index c8be691..0000000 --- a/js/api-wifi.js +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2013, Intel Corporation. - * - * This program is licensed under the terms and conditions of the - * Apache License, version 2.0. The full text of the Apache License is at - * http://www.apache.org/licenses/LICENSE-2.0 - * - */ - -/* Namespace */ -var settings = settings || {}; -settings.wifi = settings.wifi || {}; - -var WIFI_SECURITY_TYPE = { - NONE: 0, - WEP: 1, - WPA: 2, - WPA2: 3, - WPA_ENTERPRISE: 4, - WPA2_ENTERPRISE: 5 -}; - -/* Module */ -settings.wifi = (function() { - - var default_adapter = null; - - /* Adapter class */ - var WiFiAdapter = function(adapter) { - this.wifi_adapter = adapter; - this.name = 'Connman-WiFi'; - this.powered = false; - }; - - WiFiAdapter.prototype.setPowered = function(powered, success_cb, error_cb) { - if (wsAPI === undefined) return; - wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'enable', powered, success_cb, function(e) { - if (e.indexOf('Already enabled') >= 0) { - console.log('wifi subsystem already enabled'); - success_cb(); - } else if (e.indexOf('Already disabled') >= 0) { - console.log('wifi subsystem already disabled'); - success_cb(); - } else { - error_cb(e); - } - }); - }; - - WiFiAdapter.prototype.getPowered = function(success_cb, error_cb) { - if (wsAPI === undefined) return; - var me = this; - wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'is_enabled', null, function(isEnabled) { - if (isEnabled === undefined) { - console.log('Badly formed json message: ' + json_msg); - } - me.powered = isEnabled; - success_cb(me.powered); - }, error_cb); - }; - - WiFiAdapter.prototype.scan = function(success_cb, error_cb) { - if (wsAPI === undefined) return; - wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'scan', null, function(results) { - if (results.length >= 0 && results[0].length >= 0 && results[0][0][0] === undefined) { - error_cb('Cannot parse scan results'); - return; - } - - var network_list = results[0]; - - try { - var results = []; - for (var i = 0; i < network_list.length; i++) { - if (network_list[i][1] === undefined) { - console.log('Badly form json message: ' + json_msg); - } - if (network_list[i][1].Type === 'wifi') { - var network = new settings.wifi.WiFiNetwork(network_list[i][0]); - if (network_list[i][1].Name !== undefined) { - network.ssid = network_list[i][1].Name; - } - if (network_list[i][1].State === 'ready') { - network.connected = true; - } else if (network_list[i][1].State === 'idle') { - network.connected = false; - } - if (network_list[i][1].EncryptionMode !== undefined) { - network.encryption = network_list[i][1].EncryptionMode; - } - if (network_list[i][1].Strength !== undefined) { - network.strength = network_list[i][1].Strength; - } - if (network_list[i][1].IPv4.Address !== undefined) { - network.ipAddress = network_list[i][1].IPv4.Address; - } - if (network_list[i][1].IPv4.Gateway !== undefined) { - network.gateway = network_list[i][1].IPv4.Gateway; - } - if (network_list[i][1].IPv4.Netmask !== undefined) { - network.netmask = network_list[i][1].IPv4.Netmask; - } - results.push(network); - } - } - } catch (e) { - error_cb(e); - } - success_cb(results); - }, error_cb); - }; - - WiFiAdapter.prototype.connectNetwork = function(network_id, security, passcode, success_cb, error_cb) { - if (wsAPI === undefined) return; - - wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'connect', network_id, success_cb, error_cb); - }; - - WiFiAdapter.prototype.disconnectNetwork = function(network_id, success_cb, error_cb) { - if (wsAPI === undefined) return; - wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'disconnect', network_id, success_cb, error_cb); - }; - - /* Network class */ - WiFiNetwork = function(object_path) { - this.id = object_path; - this.ssid = ''; - this.connected = false; - this.security = WIFI_SECURITY_TYPE.NONE; - this.encryption = 'Unknown'; - this.ipAddress = 'Unknown'; - this.gateway = 'Unknown'; - this.netmask = 'Unknown'; - this.strength = -1; - }; - - WiFiNetwork.prototype.getSecurity = function() { - return this.security; - } - - function subscribeEvents(callback) { - wsAPI.subscribeEvents(callback); - } - - function unsubscribeEvents(callback) { - wsAPI.unsubscribeEvents(callback); - } - - function getDefaultAdapter() { - if (default_adapter === null) { - default_adapter = new WiFiAdapter(wsAPI); - } - - return default_adapter; - }; - - return { - WiFiAdapter: WiFiAdapter, - WiFiNetwork: WiFiNetwork, - subscribeEvents: subscribeEvents, - unsubscribeEvents: unsubscribeEvents, - getDefaultAdapter: getDefaultAdapter - }; -})(); \ No newline at end of file diff --git a/js/main.js b/js/main.js index 8b6595c..3c16653 100644 --- a/js/main.js +++ b/js/main.js @@ -35,19 +35,19 @@ /* Settings Panel */ $('#main').on('pageshow', function(event, data) { /* TODO: unsubscribe events if neccessary */ - if (data.prevPage.attr('id') === 'page_wifi') { - console.log('Wi-Fi settings exited'); - settings.wifi.unsubscribeEvents(wifiEventReceived); + if (data.prevPage.attr('id') === 'page_connman') { + console.log('Connman settings exited'); + settings.connman.unsubscribeEvents(connmanEventReceived); } else if (data.prevPage.attr('id') === 'page_bluetooth') { console.log('Bluetooth settings exited'); - settings.wifi.unsubscribeEvents(bluetoothEventReceived); + settings.bluetooth.unsubscribeEvents(bluetoothEventReceived); } else if (data.prevPage.attr('id') === 'page_datetime') { console.log('Date and Time settings exited'); } }); /* Different sub panels */ - wifiPanelInit(); + connmanPanelInit(); bluetoothPanelInit(); datetimePanelInit(); } catch (e) { diff --git a/js/panel-bluetooth.js b/js/panel-bluetooth.js index 769abab..c2aeb84 100644 --- a/js/panel-bluetooth.js +++ b/js/panel-bluetooth.js @@ -102,12 +102,12 @@ function bluetoothPanelInit() { } function bluetoothEventReceived(event) { - if (event.type !== WS_EVENT_TYPE.BLUETOOTH) return; + if (event.type !== WS_EVENT_TYPE.BLUETOOTH && event.type !== WS_EVENT_TYPE.CONNMAN) return; if ($.mobile.activePage.attr('id') !== 'page_bluetooth' || $.mobile.activePage.attr('id') !== 'page_bluetooth_detail') { return; } - if (event.name === 'PropertyChanged') { + if (event.id === '/net/connman/technology/bluetooth' && event.name === 'PropertyChanged') { bluetoothHandlePropertyChanged(event.value); } else { console.log('Unsupported bluetooth event received: ' + event.name); diff --git a/js/panel-connman.js b/js/panel-connman.js new file mode 100644 index 0000000..bf6fa80 --- /dev/null +++ b/js/panel-connman.js @@ -0,0 +1,654 @@ +/* + * Copyright (c) 2013, Intel Corporation. + * + * This program is licensed under the terms and conditions of the + * Apache License, version 2.0. The full text of the Apache License is at + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +var connmanScanInProgress = false; + +function connmanPanelInit() { + + /* Connman Settings Panel */ + $('#page_connman').on('pageshow', function(event, data) { + if (data.prevPage.attr('id') === 'page_connman_service') return; + + settings.connman.subscribeEvents(connmanEventReceived); + + console.log('Get all the available technologies'); + $('#connman_technologies').html(''); + settings.connman.getTechnologies(function(technologies) { + for (var i = 0; i < technologies.length; i++) { + var technology = technologies[i]; + console.log('Connman technology found: ' + technology.prop.Type); + if (technology.prop.Type === 'bluetooth') { + /* Do not show bluetooth */ + continue; + } + if (technology.prop.Powered === undefined) { + (function(t) { + t.getPowered(function(is_powered) { + t.prop.Powered = is_powered; + connmanConstructTechnologyElement(t); + }, function(e) { + t.prop.Powered = false; + connmanConstructTechnologyElement(t); + }); + })(technology); + } else { + connmanConstructTechnologyElement(technology); + } + } + }); + }); + + $('#button_connman_refresh').on('click', function() { + /* connman only supports wifi scan */ + connmanScan('wifi'); + }); + + $('#button_connman_wifi_add').on('click', function() { + if (connmanScanInProgress) return; + + console.log('Enter add WiFi page'); + $.mobile.changePage('#page_wifi_add'); + }); + + /* Connman service detail page */ + $('#page_connman_service').on('pageshow', function(event, data) { + var service_id = localStorage.getItem('connman_service_id'); + if (service_id == undefined) return; + var service = $(jqId(service_id)).data('service-object'); + connmanConstructServicePanel(service); + }); + + /* WiFi add new network page */ + $('#page_wifi_add').on('pagebeforeshow', function(event, data) { + $('#input_wifi_add_ssid').val(''); + $('#input_wifi_add_password').val(''); + $('#radio_wifi_none').prop('checked', true); + $('input[name=radio_wifi_security]').checkboxradio('refresh'); + $('#input_wifi_add_password').textinput('disable'); + }); + + $('#button_wifi_add').on('click', function() { + var name = $('#input_wifi_add_ssid').val(); + var security = $('input[name=radio_wifi_security]:checked').val(); + var passcode = $('#input_wifi_add_password').val(); + + if (name === '') { + showMsg('Error', 'Enter SSID'); + return; + } + + if (security !== 'None' && passcode === '') { + showMsg('Error', 'Enter passphrase'); + return; + } + + showSpinner(false, 'Adding...'); + connmanGetHiddenServicePath(security, function(service_path) { + var service = new settings.connman.ConnmanService('', { + 'Name': name, + 'EncryptionMode': security + }); + service.connect(passcode, function() { + /* success */ + connmanSync(function() { + hideSpinner(); + console.log('Go back to Connman page'); + $.mobile.changePage('#page_connman'); + }, null); + }, function(e) { + /* error */ + hideSpinner(); + showMsg('Error', 'Failed to add network: ' + e); + }); + }, function(e) { + hideSpinner(); + showMsg('Error', e); + }); + }); + + $('[name="radio_wifi_security"]').on('change', function(event, data) { + var security = $('input[name=radio_wifi_security]:checked').val(); + + if (security === 'none') { + $('#input_wifi_add_password').textinput('disable'); + $('#input_wifi_add_password').val(''); + } else { + $('#input_wifi_add_password').textinput('enable'); + } + }); + + $('#button_wifi_connect').on('click', function() { + var service_id = localStorage.getItem('connman_service_id'); + if (service_id == undefined) return; + var service = $(jqId(service_id)).data('service-object'); + var passcode = $('#input_wifi_connect_passphrase').val(); + connmanConnectToService(service, passcode, function() { + console.log('Successfully connected to service: ' + service.prop.Name); + if ($.mobile.activePage.attr('id') !== 'page_connman') { + console.log('Go back to Connman page'); + $.mobile.changePage('#page_connman'); + } + }, function(e) { + showMsg('Error', 'Connect service failed: ' + e); + }); + }); +} + +function connmanEventReceived(event) { + if (event.type !== WS_EVENT_TYPE.CONNMAN) return; + if ($.mobile.activePage.attr('id') !== 'page_connman' && $.mobile.activePage.attr('id') !== 'page_connman_service') { + return; + } + + if (event.name === 'ServicesChanged') { + connmanHandleServicesChanged(event.id, event.value); + } else if (event.name === 'PropertyChanged') { + connmanHandlePropertyChanged(event.id, event.value); + } else { + console.log('Unsupported event received: ' + event.name); + } +} + +function connmanHandleServicesChanged(object_path, services) { + var servicesChanged = services[0]; + var servicesRemoved = services[1]; + + console.log(servicesChanged.length + ' services changed'); + for (var i = 0; i < servicesChanged.length; i++) { + if (servicesChanged[i][0] === undefined) { + console.log('Invalid parameters, missing object path'); + continue; + } + + var service = $(jqId(servicesChanged[i][0])).data('service-object'); + + if (service == null) { + console.log('could not find service object ' + servicesChanged[i][0]); + continue; + } + + for (var prop in servicesChanged[i][1]) { + if (servicesChanged[i][1].hasOwnProperty(prop)) { + service.prop.prop = servicesChanged[i][1].prop; + connmanUpdateService(service); + console.log('Service ' + service.prop.Name + ' updated: ' + prop); + } + } + } + + console.log(servicesRemoved.length + ' services removed'); + for (var i = 0; i < servicesRemoved.length; i++) { + if (servicesRemoved[i] === undefined) { + console.log('Invalid parameters, missing object path'); + continue; + } + + connmanRemoveFromAvailableList(servicesRemoved[i]); + } +} + +function connmanHandlePropertyChanged(id, property) { + if (property[0] === 'Powered') { + var index = id.lastIndexOf('/'); + var technology = id.substring(index + 1); + if (property[1] === true) { + connmanToggleOn(technology); + if (technology === 'wifi') { + setTimeout(function() { + /* add a 1 sec delay */ + connmanScan(technology); + }, 1000); + } + } else { + connmanToggleOff(technology); + } + } + + if (property[0] === 'State') { + /* specific service has changed */ + var service = $(jqId(id)).data('service-object'); + if (service == null) { + console.error('Connman service not found ' + id); + return; + } + + service.prop.State = property[1]; + connmanUpdateService(service); + } else if (property[0] === 'Connected') { + /* unknown service has changed, sync Connman */ + console.log('Unknown service connected property changed'); + connmanSync(null, null); + } +} + +function connmanClearAvailableList() { + $('#listview_services_available').html(''); +} + +function connmanScan(technology) { + if (technology !== 'wifi') { + /* Connman only supports wifi scan */ + return; + } + + if (connmanScanInProgress) { + console.log('Connman scan in progress...'); + return; + } + + console.log('Start connman scan'); + connmanScanInProgress = true; + + /* clear the services list with new scan */ + connmanClearAvailableList(); + + showSpinner(false, 'Scanning...'); + $('#toggle_connman_wifi').slider('disable'); + $('#toggle_connman_wifi').slider('refresh'); + settings.connman.scan(function(services) { + hideSpinner(); + connmanScanInProgress = false; + $('#toggle_connman_wifi').slider('enable'); + $('#toggle_connman_wifi').slider('refresh'); + console.log('found ' + services.length + ' connman services'); + for (var i = 0; i < services.length; i++) { + var service = services[i]; + if (service.prop.Type === undefined || service.prop.Type === 'bluetooth') { + console.log('Ignore bluetooth or unknown services'); + continue; + } + if (service.prop.Name === undefined) { + console.log('Ignore hidden service - ' + service.id); + continue; + } + + connmanUpdateService(service); + } + }, function(e) { + hideSpinner(); + connmanScanInProgress = false; + $('#toggle_connman_wifi').slider('enable'); + $('#toggle_connman_wifi').slider('refresh'); + showMsg('Error', 'Cannot scan: ' + e); + }); +} + +function connmanSync(success_cb, error_cb) { + if (connmanScanInProgress) { + console.log('Connman scan in progress...'); + return; + } + + console.log('Start connman sync'); + /* clear the services list with new scan */ + connmanClearAvailableList(); + + wifiScanInProgress = true; + $('#toggle_connman_wifi').slider('disable'); + $('#toggle_connman_wifi').slider('refresh'); + settings.connman.getServices(function(services) { + connmanScanInProgress = false; + $('#toggle_connman_wifi').slider('enable'); + $('#toggle_connman_wifi').slider('refresh'); + console.log('found ' + services.length + ' connman services'); + for (var i = 0; i < services.length; i++) { + var service = services[i]; + if (service.prop.Type === undefined || service.prop.Type === 'bluetooth') { + console.log('Ignore bluetooth or unknown services'); + continue; + } + if (service.prop.Name === undefined) { + console.log('Ignore hidden service - ' + service.id); + continue; + } + + connmanUpdateService(service); + } + if (success_cb) { + success_cb(); + } + }, function(e) { + connmanScanInProgress = false; + $('#toggle_connman_wifi').slider('enable'); + $('#toggle_connman_wifi').slider('refresh'); + if (error_cb) { + error_cb(e); + } + }); +} + +function connmanRefreshServicesList() { + $('#listview_services_available').listview('refresh'); +} + +function connmanAppendToAvailableList(service) { + if ($('#listview_services_available').find(jqId(service.id)).length != 0) return; + + var parent = '#listview_services_available'; + connmanConstructServiceElement(parent, service); + connmanUpdateServiceButton(service); + connmanRefreshServicesList(); +} + +function connmanRemoveFromAvailableList(service_id) { + var removeThis = $('#listview_services_available li').filter(function() { + return $(this).find(jqId(service_id)).length === 1; + }); + + if (removeThis.length !== 0) { + removeThis.remove(); + connmanRefreshServicesList(); + } +} + +function getSignalStrengthStr(strength) { + var signal_strength = 'unknown'; + if (strength > 0 && strength <= 20) { + strength = 'very poor'; + } else if (strength > 20 && strength <= 40) { + signal_strength = 'poor'; + } else if (strength > 40 && strength <= 70) { + signal_strength = 'average'; + } else if (strength > 70 && strength <= 90) { + signal_strength = 'good'; + } else if (strength > 90 && strength <= 100) { + signal_strength = 'excellent'; + } + return signal_strength; +} + +function connmanConstructTechnologyElement(technology) { + if (technology.prop.Type === undefined || technology.prop.Name == undefined) { + console.error('technology type or name missing ' + technology); + return; + } + + var html = '
                  '; + html += '
                • '; + html += ''; + html += '
                '; + $('#connman_technologies').append(html).trigger('create'); + + console.log('Connman technology ' + technology.prop.Type + ' is powered: ' + technology.prop.Powered); + if (technology.prop.Powered) { + connmanToggleOn(technology.prop.Type); + if ($('ul#listview_services_available li').length === 0) { + connmanScan(technology.prop.Type); + } + } else { + connmanToggleOff(technology.prop.Type); + } + + $('#toggle_connman_' + technology.prop.Type).change(function() { + console.log('toggle ' + technology.prop.Type + ' changed'); + + if (connmanScanInProgress) { + console.log('Connman scan in progress...'); + return; + } + + $('#toggle_connman_' + technology.prop.Type).slider('disable'); + $('#toggle_connman_' + technology.prop.Type).slider('refresh'); + if ($('#toggle_connman_' + technology.prop.Type).val() === 'off') { + technology.setPowered(false, function() { + /* success */ + $('#toggle_connman_' + technology.prop.Type).slider('enable'); + $('#toggle_connman_' + technology.prop.Type).slider('refresh'); + console.log('Successfully disabled connman technology ' + technology.prop.Type); + }, function(e) { + /* error */ + hideSpinner(); + $('#toggle_connman_' + technology.prop.Type).slider('enable'); + $('#toggle_connman_' + technology.prop.Type).val('on').slider('refresh'); + showMsg('Error', 'Cannot disable ' + technology.prop.Type); + }); + } else { + technology.setPowered(true, function() { + /* success */ + $('#toggle_connman_' + technology.prop.Type).slider('enable'); + $('#toggle_connman_' + technology.prop.Type).slider('refresh'); + if (technology.prop.Type === 'wifi') { + setTimeout(function() { + /* add a 1 sec delay */ + connmanScan(technology.prop.Type); + }, 1000); + } + console.log('Successfully enabled connman technology ' + technology.prop.Type); + }, function(e) { + /* error */ + hideSpinner(); + $('#toggle_connman_' + technology.prop.Type).slider('enable'); + $('#toggle_connman_' + technology.prop.Type).val('off').slider('refresh'); + showMsg('Error', 'Cannot enable ' + technology.prop.Type); + }); + } + }); +} + +function connmanConstructServiceElement(parent, service) { + if (service.id === undefined || service.prop.Type === undefined) { + console.error('service id or type missing ' + service); + return; + } + + var html = '
              • '; + html += '
                ' + service.prop.Name + '
                '; + + if (service.prop.Type === 'wifi') { + html += '
                Encryption: ' + service.prop.EncryptionMode + '
                '; + html += '
                Signal: ' + getSignalStrengthStr(service.prop.Strength) + '
                '; + } + html += '
                '; + html += '
                '; + html += '
              • '; + $(parent).append(html).trigger('create'); + + /* store service object in the element so we can reference it later */ + $(jqId(service.id)).data('service-object', service); + + $(jqId(service.id)).on('click', function() { + /* BUG in webruntime that cause click event when another page is rendered */ + if ($.mobile.activePage.attr('id') === 'page_connman') { + localStorage.setItem('connman_service_id', service.id); + console.log('Enter Connman service page'); + $.mobile.changePage('#page_connman_service'); + } + }); + + $(jqId(service.id)).find('div.service-action-button').on('click', function(e) { + var parent = $(this).parent().attr('id'); + + /* + * prevent the click event to propagate up + */ + e.stopImmediatePropagation(); + e.preventDefault(); + + /* retrieve the service object from element */ + var service = $(jqId(parent)).data('service-object'); + if (service == null) { + console.error('Connman service object not found'); + return; + } + + if (service.prop.State === 'idle') { + if (service.prop.EncryptionMode === 'none') { + connmanConnectToService(service, null); + } else { + connmanConnectToService(service, null, null, function(e) { + console.log('Connect failed, will ask for passphrase'); + localStorage.setItem('connman_service_id', service.id); + console.log('Enter connect WiFi page'); + $.mobile.changePage('#page_wifi_connect'); + }); + } + } else if (service.prop.State === 'ready') { + console.log('Disconnecting from service: ' + service.prop.Name); + showSpinner(false, 'Disconnecting...'); + service.disconnect(function() { + /* success */ + connmanSync(function() { + hideSpinner(); + }, null) + }, function(e) { + /* error */ + hideSpinner(); + showMsg('Error', 'Disconnect service failed: ' + e); + }); + } + }); +} + +function connmanUpdateService(service) { + connmanAppendToAvailableList(service); + + /* update service button for allowed action */ + connmanUpdateServiceButton(service); + + /* update service connection status */ + connmanUpdateConnectionStatus(service); + + /* update service detail panel */ + if ($.mobile.activePage.attr('id') === 'page_connman_service') { + var service_id = localStorage.getItem('connman_service_id'); + if (service_id == undefined) return; + var service_object = $(jqId(service_id)).data('service-object'); + if (service.id === service_object.id) { + connmanConstructServicePanel(service); + } + } +} + +function connmanUpdateServiceButton(service) { + if (service.prop.State === 'ready') { + $(jqId(service.id)).find('div.service-action-button').find('span').text('Disconnect'); + } else if (service.prop.State === 'idle' || service.prop.State === 'online') { + $(jqId(service.id)).find('div.service-action-button').find('span').text('Connect'); + } +} + +function connmanUpdateConnectionStatus(service) { + var status = 'disconnected'; + if (service.prop.State === 'ready') { + $(jqId(service.id)).addClass('service-connected'); + status = 'connected'; + } else if (service.prop.State === 'idle' || service.prop.State === 'online') { + status = 'disconnected'; + $(jqId(service.id)).removeClass('service-connected'); + } + + connmanUpdateConnectionStatusText(service, status); +} + +function connmanUpdateConnectionStatusText(service, status) { + $(jqId(service.id)).find('div.service-status').text(status); +} + +function connmanConstructServicePanel(service) { + var status_connected = 'No'; + + if (service == null) return; + if (service.prop.State === 'ready') status_connected = 'Yes'; + + $('#page_connman_service_content').html(''); + var html = '
                  '; + html += '
                • Name: ' + service.prop.Name + '

                • '; + html += '
                • Type: ' + service.prop.Type + '

                • '; + html += '
                • State: ' + service.prop.State + '

                • '; + if (service.prop.Type === 'ethernet' || service.prop.Type === 'wifi') { + if (service.prop.Type === 'wifi') { + html += '
                • SSID: ' + service.prop.BSSID + '

                • '; + html += '
                • Encryption: ' + service.prop.EncryptionMode + '

                • '; + html += '
                • Signal Strength: ' + service.prop.Strength + '

                • '; + } + if (service.prop.State === 'ready') { + html += '
                • IP Address: ' + service.prop.IPv4.Address + '

                • '; + html += '
                • Gateway: ' + service.prop.IPv4.Gateway + '

                • '; + html += '
                • Netmask: ' + service.prop.IPv4.Netmask + '

                • '; + } + } + html += '
                • Connected: ' + status_connected + '

                • '; + html += '
                • AutoConnect: ' + service.prop.AutoConnect + '

                • '; + html += '
                '; + $('#page_connman_service_content').append(html).trigger('create'); + $('#listview_connman_services').listview('refresh'); +} + +function connmanUpdateServicePanel(service) { + var status_connected = 'No'; + + if (service == null) return; + if (service.prop.State === 'ready') status_connected = 'Yes'; + $('#connman_service_connected').text(status_connected); + $('#listview_connman_service').listview('refresh'); +} + +function connmanToggleOn(technology_type) { + setTimeout(function() { + $('#toggle_connman_' + technology_type).val('on').slider('refresh'); + console.log('Turn on toggle #toggle_connman_' + technology_type); + }, 1000); +} + +function connmanToggleOff(technology_type) { + setTimeout(function() { + $('#toggle_connman_' + technology_type).val('off').slider('refresh'); + console.log('Turn off toggle #toggle_connman_' + technology_type); + }, 1000); +} + +function connmanConnectToService(service, passphrase, success_cb, error_cb) { + console.log('Connect to service: ' + service.prop.Name); + showSpinner(false, 'Connecting...'); + service.connect(passphrase, function() { + /* success */ + connmanSync(function() { + hideSpinner(); + if (success_cb) { + success_cb(); + } + }, function(e) { + hideSpinner(); + if (error_cb) { + error_cb(e); + } + }); + }, function(e) { + /* error */ + hideSpinner(); + if (error_cb) { + error_cb(e); + } + }); +} + +function connmanGetHiddenServicePath(security_type, success_cb, error_cb) { + if (security_type === undefined || success_cb === undefined || error_cb === undefined) return; + settings.connman.scan(function(services) { + connmanScanInProgress = false; + console.log('found ' + services.length + ' connman services'); + for (var i = 0; i < services.length; i++) { + var service = services[i]; + if (service.prop.Name === undefined && service.prop.Type === 'wifi') { + console.log('Hidden network matched - ' + service.id); + success_cb(service.id); + return; + } + } + error_cb('No hidden network with security: ' + security_type); + }, function(e) { + connmanScanInProgress = false; + if (error_cb) { + error_cb(e); + } + }); +} \ No newline at end of file diff --git a/js/panel-wifi.js b/js/panel-wifi.js deleted file mode 100644 index 2ba9683..0000000 --- a/js/panel-wifi.js +++ /dev/null @@ -1,607 +0,0 @@ -/* - * Copyright (c) 2013, Intel Corporation. - * - * This program is licensed under the terms and conditions of the - * Apache License, version 2.0. The full text of the Apache License is at - * http://www.apache.org/licenses/LICENSE-2.0 - * - */ -var wifiScanInProgress = false; - -function wifiPanelInit() { - - /* WiFi Settings Panel */ - $('#page_wifi').on('pageshow', function(event, data) { - if (data.prevPage.attr('id') === 'page_wifi_detail') return; - - settings.wifi.subscribeEvents(wifiEventReceived); - var adapter = settings.wifi.getDefaultAdapter(); - if (adapter === null) { - showMsg('Error', 'WiFi adapter not found'); - return; - } - - if (adapter.name != undefined) { - $('#label_wifi_adapter').html(adapter.name); - } else { - $('#label_wifi_adapter').html('WiFi adapter not found'); - } - - adapter.getPowered(function(is_powered) { - if (is_powered) { - wifiToggleOn(); - if ($('ul#listview_network_known li').length === 0 && $('ul#listview_network_available li').length === 0) { - wifiClearKnownList(); - wifiClearAvailableList(); - setTimeout(function() { - wifiScan(adapter); - }, 1000); - } - } else { - wifiToggleOff(); - } - }, function(e) { - showMsg('Error', 'Cannot get WiFi state: ' + e); - }); - }); - - $('#toggle_wifi').change(function() { - if (wifiScanInProgress) return; - - var adapter = settings.wifi.getDefaultAdapter(); - if (adapter === null) { - showMsg('Error', 'WiFi adapter not found'); - wifiToggleOff(); - return; - } - - if ($('#toggle_wifi').val() === 'off') { - adapter.setPowered(false, function() { - /* success */ - console.log('Successfully disable wifi subsystem'); - wifiToggleOff(); - }, function(e) { - /* error */ - wifiToggleOn(); - showMsg('Error', 'Cannot disable WiFi subsystem: ' + e); - }); - } else { - adapter.setPowered(true, function() { - /* success */ - console.log('Successfully enable WiFi subsystem'); - wifiClearKnownList(); - wifiClearAvailableList(); - wifiToggleOn(); - setTimeout(function() { - wifiScan(adapter); - }, 1000); - }, function(e) { - /* error */ - wifiToggleOff(); - showMsg('Error', 'Cannot enable WiFi subsystem: ' + e); - }); - } - }); - - $('#button_wifi_refresh').on('click', function() { - var adapter = settings.wifi.getDefaultAdapter(); - if (adapter === null) { - showErr('Error', 'WiFi adapter not found'); - } - - wifiScan(adapter); - }); - - $('#button_wifi_add').on('click', function() { - if (wifiScanInProgress) return; - - /* Not fully implemented, disable for now */ - showMsg('Error', 'Not supported'); - return; - - var adapter = settings.wifi.getDefaultAdapter(); - if (adapter === null) { - showMsg('Error', 'WiFi adapter not found'); - } - - $.mobile.changePage('#page_wifi_add'); - }); - - /* WiFi network detail page */ - $('#page_wifi_detail').on('pageshow', function(event, data) { - var network_id = localStorage.getItem('wifi_network_id'); - if (network_id == undefined) return; - var network = $(jqId(network_id)).data('network-object'); - wifiConstructDetailPanel(network); - }); - - /* WiFi add new network page */ - $('#page_wifi_add').on('pagebeforeshow', function(event, data) { - $('#input_wifi_ssid').val(''); - $('#input_wifi_password').val(''); - $('#select_wifi_security').val('None').change(); - $('#input_wifi_password').textinput('disable'); - }); - - $('#page_wifi_button_add').on('click', function() { - var adapter = settings.wifi.getDefaultAdapter(); - var ssid = $('#input_wifi_ssid').val(); - var security_option = $('#select_wifi_security').val(); - var passcode = $('#input_wifi_password').val(); - - if (ssid === '') { - showMsg('Error', 'Enter SSID'); - return; - } - if (security_option !== 'None') { - showMsg('Error', 'Not supported'); - return; - } - - showSpinner(false, 'Connecting...'); - adapter.connectNetwork(ssid, security_option, passcode, function() { - /* success */ - hideSpinner(); - $.mobile.changePage('#page_wifi'); - - }, function(e) { - /* error */ - hideSpinner(); - showMsg('Error', 'WiFi connect failed: ' + e); - }); - }); - - $('#select_wifi_security').on('change', function(event, data) { - var security = this.value; - - if (security === 'None') { - $('#input_wifi_password').textinput('disable'); - $('#input_wifi_password').val(''); - } else { - $('#input_wifi_password').textinput('enable'); - } - }); -} - -function wifiEventReceived(event) { - if (event.type !== WS_EVENT_TYPE.WIFI) return; - if ($.mobile.activePage.attr('id') !== 'page_wifi' && $.mobile.activePage.attr('id') !== 'page_wifi_detail') { - return; - } - - if (event.name === 'ServicesChanged') { - wifiHandleServicesChanged(event.id, event.value); - } else if (event.name === 'PropertyChanged') { - wifiHandlePropertyChanged(event.id, event.value); - } else { - console.log('Unsupported WiFi event received: ' + event.name); - } -} - -function wifiHandleServicesChanged(object_path, services) { - var servicesChanged = services[0]; - var servicesRemoved = services[1]; - - if ($('#toggle_wifi').val() === 'off') return; - - console.log(servicesChanged.length + ' networks changed'); - for (var i = 0; i < servicesChanged.length; i++) { - if (servicesChanged[i][0] === undefined) { - console.log('Invalid parameters, missing object path'); - continue; - } - - if (servicesChanged[i][1].Type === 'wifi') { - var network = $(jqId(servicesChanged[i][0])).data('network-object'); - - if (network == null) { - console.log('could not find network object ' + servicesChanged[i][0]); - continue; - } - - var network = new settings.wifi.WiFiNetwork(servicesChanged[i][0]); - if (servicesChanged[i][1].Name !== undefined) { - network.ssid = servicesChanged[i][1].Name; - } - if (servicesChanged[i][1].State === 'ready') { - network.connected = true; - } else if (servicesChanged[i][1].State === 'idle') { - network.connected = false; - } - if (servicesChanged[i][1].EncryptionMode !== undefined) { - network.encryption = servicesChanged[i][1].EncryptionMode; - } - if (servicesChanged[i][1].Strength !== undefined) { - network.strength = servicesChanged[i][1].Strength; - } - if (servicesChanged[i][1].IPv4.Address !== undefined) { - network.ipAddress = servicesChanged[i][1].IPv4.Address; - } - if (servicesChanged[i][1].IPv4.Gateway !== undefined) { - network.gateway = servicesChanged[i][1].IPv4.Gateway; - } - if (servicesChanged[i][1].IPv4.Netmask !== undefined) { - network.netmask = servicesChanged[i][1].IPv4.Netmask; - } - - if ($.mobile.activePage.attr('id') === 'page_wifi') { - console.log('Network updated'); - wifiUpdateNetwork(network); - } - } - } - - console.log(servicesRemoved.length + ' networks removed'); - for (var i = 0; i < servicesRemoved.length; i++) { - if (servicesRemoved[i] === undefined) { - console.log('Invalid parameters, missing object path'); - continue; - } - - wifiRemoveFromKnownList(servicesRemoved[i]); - wifiRemoveFromAvailableList(servicesRemoved[i]); - } -} - -function wifiHandlePropertyChanged(id, property) { - if (property[0] === 'Powered') { - if (property[1] === true) { - wifiClearKnownList(); - wifiClearAvailableList(); - wifiToggleOn(); - setTimeout(function() { - var adapter = settings.wifi.getDefaultAdapter(); - wifiScan(adapter); - }, 1000); - } else { - wifiToggleOff(); - } - } - - /* if wifi is off, ignore all the propertyChanged events */ - if ($('#toggle_wifi').val() === 'off') return; - - if (property[0] === 'State') { - /* specific network has changed */ - var network = $(jqId(parent)).data('network-object'); - if (network == null) { - console.error('Wifi network not found'); - return; - } - - if (property[1] === 'ready') { - network.connected = true; - } else if (property[1] === 'idle') { - network.connected = false; - } - - wifiUpdateNetwork(network); - } else if (property[0] === 'Connected') { - /* unknown network has changed, sync WiFi network */ - console.log('Unknown network connected property changed'); - var adapter = settings.wifi.getDefaultAdapter(); - wifiSync(adapter, null, null); - } -} - -function wifiClearKnownList() { - $('#listview_network_known').html(''); -} - -function wifiClearAvailableList() { - $('#listview_network_available').html(''); -} - -function wifiScan(adapter) { - if (wifiScanInProgress) return; - - console.log('Start wifi scan'); - /* clear the network list with new scan */ - wifiClearKnownList(); - wifiClearAvailableList(); - - showSpinner(false, 'Scanning...'); - wifiScanInProgress = true; - $('#toggle_wifi').slider('disable'); - $('#toggle_wifi').slider('refresh'); - adapter.scan(function(networks) { - hideSpinner(); - wifiScanInProgress = false; - $('#toggle_wifi').slider('enable'); - $('#toggle_wifi').slider('refresh'); - console.log('found ' + networks.length + ' wifi networks'); - for (var i = 0; i < networks.length; i++) { - var network = networks[i]; - if (network.ssid && network.ssid !== '') { - wifiUpdateNetwork(network); - } else { - console.log('Skipping hidden network - ' + network.ipAddress); - } - } - }, function(e) { - hideSpinner(); - wifiScanInProgress = false; - $('#toggle_wifi').slider('enable'); - $('#toggle_wifi').slider('refresh'); - showMsg('Error', 'Cannot scan: ' + e); - }); -} - -function wifiSync(adapter, success_cb, error_cb) { - if (wifiScanInProgress) return; - - console.log('Start wifi sync'); - /* clear the network list with new scan */ - wifiClearKnownList(); - wifiClearAvailableList(); - - wifiScanInProgress = true; - $('#toggle_wifi').slider('disable'); - $('#toggle_wifi').slider('refresh'); - adapter.scan(function(networks) { - hideSpinner(); - wifiScanInProgress = false; - $('#toggle_wifi').slider('enable'); - $('#toggle_wifi').slider('refresh'); - console.log('found ' + networks.length + ' wifi networks'); - for (var i = 0; i < networks.length; i++) { - var network = networks[i]; - if (network.ssid && network.ssid !== '') { - wifiUpdateNetwork(network); - } - } - if (success_cb) { - success_cb(); - } - }, function(e) { - wifiScanInProgress = false; - $('#toggle_wifi').slider('enable'); - $('#toggle_wifi').slider('refresh'); - if (error_cb) { - error_cb(e); - } - }); -} - -function wifiRefreshList() { - $('#listview_network_known').listview('refresh'); - $('#listview_network_available').listview('refresh'); -} - -function wifiAppendToKnownList(network) { - if ($('#listview_network_known').find(jqId(network.id)).length != 0) return; - - var parent = '#listview_network_known'; - wifiConstructNetworkElement(parent, network); - wifiUpdateNetworkButton(network); - wifiRefreshList(); -} - -function wifiRemoveFromKnownList(network_id) { - var removeThis = $('#listview_network_known li').filter(function() { - return $(this).find(jqId(network_id)).length === 1; - }); - - if (removeThis.length !== 0) { - removeThis.remove(); - wifiRefreshList(); - } -} - -function wifiAppendToAvailableList(network) { - if ($('#listview_network_available').find(jqId(network.id)).length != 0) return; - - var parent = '#listview_network_available'; - wifiConstructNetworkElement(parent, network); - wifiUpdateNetworkButton(network); - wifiRefreshList(); -} - -function wifiRemoveFromAvailableList(network_id) { - var removeThis = $('#listview_network_available li').filter(function() { - return $(this).find(jqId(network_id)).length === 1; - }); - - if (removeThis.length !== 0) { - removeThis.remove(); - wifiRefreshList(); - } -} - -function getSignalStrengthStr(strength) { - var signal_strength = 'unknown'; - if (strength > 0 && strength <= 20) { - strength = 'very poor'; - } else if (strength > 20 && strength <= 40) { - signal_strength = 'poor'; - } else if (strength > 40 && strength <= 70) { - signal_strength = 'average'; - } else if (strength > 70 && strength <= 90) { - signal_strength = 'good'; - } else if (strength > 90 && strength <= 100) { - signal_strength = 'excellent'; - } - return signal_strength; -} - -function wifiConstructNetworkElement(parent, network) { - var html = '
              • '; - html += '
                ' + network.ssid + '
                '; - html += '
                Encryption: ' + network.encryption + '
                '; - html += '
                Signal: ' + getSignalStrengthStr(network.strength) + '
                '; - html += '
                '; - html += '
                '; - html += '
              • '; - $(parent).append(html).trigger('create'); - - /* store network object in the element so we can reference it later */ - $(jqId(network.id)).data('network-object', network); - - $(jqId(network.id)).on('click', function() { - localStorage.setItem('wifi_network_id', network.id); - $.mobile.changePage('#page_wifi_detail'); - }); - - $(jqId(network.id)).find('div.network-action-button').on('click', function(e) { - var parent = $(this).parent().attr('id'); - - /* - * prevent the click event to propagate up - */ - e.stopImmediatePropagation(); - e.preventDefault(); - - var adapter = settings.wifi.getDefaultAdapter(); - if (adapter === null) return; - - /* retrieve the network object from element */ - var network = $(jqId(parent)).data('network-object'); - if (network == null) { - console.error('Wifi network not found'); - return; - } - - if (!network.connected && network.encryption !== 'none') { - /* Encryption based connection not supported now */ - showMsg('Error', 'Only open networks are supported'); - return; - } - - if (!network.connected) { - createPopupDialog(false, false, 'Connect to network', network.ssid, 'Connect', 'Cancel', function() { - console.log('WiFi connect to network: ' + network.ssid); - showSpinner(false, 'Connecting...'); - adapter.connectNetwork(network.id, null, null, function() { - /* success */ - wifiSync(adapter, function() { - hideSpinner(); - }, function(e) { - /* changing from disconnected to connected */ - hideSpinner(); - network.connected = true; - wifiUpdateNetwork(network); - }) - }, function(e) { - /* error */ - hideSpinner(); - showMsg('Error', 'WiFi connect failed: ' + e); - }); - }); - } else { - console.log('Wifi disconnect from network: ' + network.ssid); - showSpinner(false, 'Disconnecting...'); - adapter.disconnectNetwork(network.id, function() { - /* success */ - wifiSync(adapter, function() { - hideSpinner(); - }, function(e) { - /* changing from connected to disconnected */ - hideSpinner(); - network.connected = false; - wifiUpdateNetwork(network); - }) - }, function(e) { - /* error */ - hideSpinner(); - showMsg('Error', 'Network disconnect failed: ' + e); - }); - } - }); -} - -function wifiUpdateNetwork(network) { - /* reposition device if it's connected or disconnected */ - if (network.connected) { - wifiRemoveFromAvailableList(network.id); - wifiAppendToKnownList(network); - } else { - wifiRemoveFromKnownList(network.id); - wifiAppendToAvailableList(network); - } - - /* update network button for allowed action */ - wifiUpdateNetworkButton(network); - - /* update network connection status */ - wifiUpdateConnectionStatus(network); - - /* update network detail panel */ - if ($.mobile.activePage.attr('id') === 'page_wifi_detail') { - var network_id = localStorage.getItem('wifi_network_id'); - if (network_id == undefined) return; - var network_object = $(jqId(network_id)).data('network-object'); - if (network.id === network_object.id) { - wifiConstructDetailPanel(network); - } - } -} - -function wifiUpdateNetworkButton(network) { - if (network.connected) { - $(jqId(network.id)).find('div.network-action-button').find('span').text('Disconnect'); - } else { - $(jqId(network.id)).find('div.network-action-button').find('span').text('Connect'); - } -} - -function wifiUpdateConnectionStatus(network) { - var status = 'disconnected'; - if (network.connected) { - $(jqId(network.id)).addClass('network-connected'); - status = 'connected'; - } else { - status = 'disconnected'; - $(jqId(network.id)).removeClass('network-connected'); - } - - wifiUpdateConnectionStatusText(network, status); -} - -function wifiUpdateConnectionStatusText(network, status) { - $(jqId(network.id)).find('div.network-status').text(status); -} - -function wifiConstructDetailPanel(network) { - var status_connected = 'No'; - - if (network == null) return; - if (network.connected) status_connected = 'Yes'; - - $('#page_wifi_detail_content').html(''); - var html = '
                  '; - html += '
                • SSID: ' + network.ssid + '

                • '; - html += '
                • Encryption: ' + network.encryption + '

                • '; - html += '
                • Signal Strength: ' + network.strength + '

                • '; - html += '
                • Connected: ' + status_connected + '

                • '; - if (network.connected) { - html += '
                • IP Address: ' + network.ipAddress + '

                • '; - html += '
                • Gateway: ' + network.gateway + '

                • '; - html += '
                • Netmask: ' + network.netmask + '

                • '; - } - html += '
                '; - $('#page_wifi_detail_content').append(html).trigger('create'); - $('#listview_wifi_detail').listview('refresh'); -} - -function wifiUpdateDetailPanel(network) { - var status_connected = 'No'; - - if (network == null) return; - if (network.connected) status_connected = 'Yes'; - $('#wifi_detail_connected').text(status_connected); - $('#listview_wifi_detail').listview('refresh'); -} - -function wifiToggleOn() { - setTimeout(function() { - $('#wifi_networks').show(); - $('#toggle_wifi').val('on').slider('refresh'); - }, 100); -} - -function wifiToggleOff() { - setTimeout(function() { - $('#wifi_networks').hide(); - $('#toggle_wifi').val('off').slider('refresh'); - }, 100); -} \ No newline at end of file diff --git a/js/utils.js b/js/utils.js index cbf0067..9345063 100644 --- a/js/utils.js +++ b/js/utils.js @@ -15,7 +15,7 @@ function jqId(id) { } function showMsg(title, message) { - if (title == 'Error') { + if (title === 'Error') { console.error(message); if (message.indexOf(ERROR_SETTINGSD_DISCONNECTED) >= 0) { createPopupDialog(false, false, ERROR_SETTINGSD_DISCONNECTED, 'Reconnect?', 'OK', 'Cancel', function() { diff --git a/js/websocket.js b/js/websocket.js index c4c962d..901c1c2 100644 --- a/js/websocket.js +++ b/js/websocket.js @@ -13,6 +13,7 @@ var dummyBackend = false; var ERROR_SETTINGSD_DISCONNECTED = 'Settings daemon is not connected'; var WS_REQUEST_TYPE = { + CONNMAN: "connman::manager", WIFI: "wifi", BLUETOOTH: "bluetooth", DISPLAY: "display", @@ -22,6 +23,7 @@ var WS_REQUEST_TYPE = { }; var WS_EVENT_TYPE = { + CONNMAN: "connman::manager", WIFI: "wifi", BLUETOOTH: "bluetooth", DISPLAY: "display", @@ -155,6 +157,7 @@ var wsAPI = (function() { this.methodCalls[i].start(); var jsonMsg = JSON.stringify(msg); + console.log('Sending json msg: ' + jsonMsg); if (dummyBackend) { /* fake with dummy data */ dummyBackendSend(msg); @@ -172,6 +175,7 @@ var wsAPI = (function() { var self = this; var response; try { + console.log("Received json msg: " + msg); response = JSON.parse(msg); } catch (e) { console.error('Garbage message: ' + msg); @@ -191,10 +195,8 @@ var wsAPI = (function() { return; } - if (response.value.object_path === '/' || response.value.object_path.indexOf('/net/connman/technology/wifi') >= 0) { - fireEvent(WS_REQUEST_TYPE.WIFI, response.value.object_path, response.value.signal_name, response.value.parameters); - } else if (response.value.object_path.indexOf('/net/connman/technology/bluetooth') >= 0) { - fireEvent(WS_REQUEST_TYPE.BLUETOOTH, response.value.object_path, response.value.signal_name, response.value.parameters); + if (response.value.object_path === '/' || response.value.object_path.indexOf('/net/connman/technology/') >= 0) { + fireEvent(WS_REQUEST_TYPE.CONNMAN, response.value.object_path, response.value.signal_name, response.value.parameters); } else { console.error('Unrecognized event object_path, skipping'); } @@ -210,7 +212,6 @@ var wsAPI = (function() { if (call && (!call.done) && (call.transactionid === response.transactionid)) { call.finish(); if (response.result !== 'succeeded' && response.reason !== undefined && call.errorCB !== undefined) { - console.log('error - ' + response.reason); call.errorCB(response.reason); } else if (call.successCB !== undefined) { if (response.value !== undefined) { diff --git a/packaging/Settings.changes b/packaging/Settings.changes index 3ce5dac..7142887 100644 --- a/packaging/Settings.changes +++ b/packaging/Settings.changes @@ -1,3 +1,6 @@ +* Fri Nov 15 2013 Jimmy Huang submit/tizen_ivi_milestone/20131113.054020@1cf567d +- Refactor WiFi module + * Thu Oct 17 2013 Jimmy Huang accepted/tizen/20131007.221312@7a2360b - Improve page load time by not doing a scan everytime user enters page -- 2.7.4