From 901491f999f064b5013a856f58a3a12405f9d4b2 Mon Sep 17 00:00:00 2001 From: Jimmy Huang Date: Tue, 15 Oct 2013 10:55:22 -0700 Subject: [PATCH] Monitor settings daemon events and update changes - Subscribe the serviceChanged and propertyChanged events from settings daemon - Update Bluetooth and WiFi status according to events Change-Id: I6a5ff62455d54ad9143299ed600c7d162984d251 Signed-off-by: Jimmy Huang --- js/api-wifi.js | 5 +- js/main.js | 12 +++- js/panel-bluetooth.js | 26 +++++++- js/panel-wifi.js | 151 +++++++++++++++++++++++++++++++++++++++++---- js/websocket.js | 85 +++++++++++++++---------- packaging/Settings.changes | 3 + 6 files changed, 227 insertions(+), 55 deletions(-) diff --git a/js/api-wifi.js b/js/api-wifi.js index bc9d13f..c8be691 100644 --- a/js/api-wifi.js +++ b/js/api-wifi.js @@ -71,7 +71,6 @@ settings.wifi = (function() { try { var results = []; - console.log('Found ' + network_list.length + ' networks'); for (var i = 0; i < network_list.length; i++) { if (network_list[i][1] === undefined) { console.log('Badly form json message: ' + json_msg); @@ -117,9 +116,9 @@ settings.wifi = (function() { wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'connect', network_id, success_cb, error_cb); }; - WiFiAdapter.prototype.disconnectNetwork = function(network, 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, success_cb, error_cb); + wsAPI.sendRequest(WS_REQUEST_TYPE.WIFI, 'disconnect', network_id, success_cb, error_cb); }; /* Network class */ diff --git a/js/main.js b/js/main.js index a5ac589..8b6595c 100644 --- a/js/main.js +++ b/js/main.js @@ -35,9 +35,15 @@ /* 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'); - else if (data.prevPage.attr('id') === 'page_bluetooth') console.log('Bluetooth settings exited'); - else if (data.prevPage.attr('id') === 'page_datetime') console.log('Date and Time settings exited'); + if (data.prevPage.attr('id') === 'page_wifi') { + console.log('Wi-Fi settings exited'); + settings.wifi.unsubscribeEvents(wifiEventReceived); + } else if (data.prevPage.attr('id') === 'page_bluetooth') { + console.log('Bluetooth settings exited'); + settings.wifi.unsubscribeEvents(bluetoothEventReceived); + } else if (data.prevPage.attr('id') === 'page_datetime') { + console.log('Date and Time settings exited'); + } }); /* Different sub panels */ diff --git a/js/panel-bluetooth.js b/js/panel-bluetooth.js index adf7668..769abab 100644 --- a/js/panel-bluetooth.js +++ b/js/panel-bluetooth.js @@ -9,12 +9,11 @@ function bluetoothPanelInit() { - settings.bluetooth.subscribeEvents(bluetoothEventReceived); - /* Bluetooth Settings Panel */ $('#page_bluetooth').on('pageshow', function(event, data) { if (data.prevPage.attr('id') === 'page_bluetooth_detail') return; + settings.bluetooth.subscribeEvents(bluetoothEventReceived); var adapter = settings.bluetooth.getDefaultAdapter(); if (adapter === null) { showMsg('Error', 'Bluetooth adapter not found'); @@ -104,7 +103,28 @@ function bluetoothPanelInit() { function bluetoothEventReceived(event) { if (event.type !== WS_EVENT_TYPE.BLUETOOTH) return; - console.log('Bluetooth event received: [' + event.name + ', ' + event.value + ']'); + if ($.mobile.activePage.attr('id') !== 'page_bluetooth' || $.mobile.activePage.attr('id') !== 'page_bluetooth_detail') { + return; + } + + if (event.name === 'PropertyChanged') { + bluetoothHandlePropertyChanged(event.value); + } else { + console.log('Unsupported bluetooth event received: ' + event.name); + } +} + +function bluetoothHandlePropertyChanged(property) { + if (property[0] === 'Powered') { + if (property[1] === true) { + bluetoothToggleOn(); + adapter.stopScanDevices(function() { + bluetoothStartScan(adapter); + }, null); + } else { + bluetoothToggleOff(); + } + } } function bluetoothClearAvailableList() { diff --git a/js/panel-wifi.js b/js/panel-wifi.js index ba2bf5b..ae4ccb4 100644 --- a/js/panel-wifi.js +++ b/js/panel-wifi.js @@ -10,12 +10,11 @@ var wifiScanInProgress = false; function wifiPanelInit() { - settings.wifi.subscribeEvents(wifiEventReceived); - /* 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'); @@ -164,7 +163,123 @@ function wifiPanelInit() { function wifiEventReceived(event) { if (event.type !== WS_EVENT_TYPE.WIFI) return; - console.log('WiFi event received: [' + event.name + ', ' + event.value + ']'); + 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() { @@ -196,8 +311,9 @@ function wifiScan(adapter) { for (var i = 0; i < networks.length; i++) { var network = networks[i]; if (network.ssid && network.ssid !== '') { - console.log('Skipping hidden network - ' + network.address); wifiUpdateNetwork(network); + } else { + console.log('Skipping hidden network - ' + network.ipAddress); } } }, function(e) { @@ -232,12 +348,16 @@ function wifiSync(adapter, success_cb, error_cb) { wifiUpdateNetwork(network); } } - success_cb(); + if (success_cb) { + success_cb(); + } }, function(e) { wifiScanInProgress = false; $('#toggle_wifi').slider('enable'); $('#toggle_wifi').slider('refresh'); - error_cb(e); + if (error_cb) { + error_cb(e); + } }); } @@ -275,9 +395,9 @@ function wifiAppendToAvailableList(network) { wifiRefreshList(); } -function wifiRemoveFromAvailableList(network_ssid) { +function wifiRemoveFromAvailableList(network_id) { var removeThis = $('#listview_network_available li').filter(function() { - return $(this).find(jqId(network_ssid)).length === 1; + return $(this).find(jqId(network_id)).length === 1; }); if (removeThis.length !== 0) { @@ -334,7 +454,7 @@ function wifiConstructNetworkElement(parent, network) { /* retrieve the network object from element */ var network = $(jqId(parent)).data('network-object'); - if (network == undefined) { + if (network == null) { console.error('Wifi network not found'); return; } @@ -382,9 +502,6 @@ function wifiConstructNetworkElement(parent, network) { /* error */ hideSpinner(); showMsg('Error', 'Network disconnect failed: ' + e); - - /* Something is wrong, remove from connected list */ - wifiRemoveFromKnownList(network.id); }); } }); @@ -405,6 +522,16 @@ function wifiUpdateNetwork(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) { diff --git a/js/websocket.js b/js/websocket.js index cbdb747..c4c962d 100644 --- a/js/websocket.js +++ b/js/websocket.js @@ -71,9 +71,10 @@ var wsAPI = (function() { } } - this.EventObject = function(type, name, value) { + this.EventObject = function(type, id, name, value) { var me = this; this.type = type; + this.id = id; this.name = name; this.value = value; } @@ -154,7 +155,6 @@ 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); @@ -163,9 +163,8 @@ var wsAPI = (function() { } } - function fireEvent(type, name, value) { - var event = new this.EventObject(type, name, value); - console.log('Fire event: [' + type + ', ' + name + ', ' + value + ']'); + function fireEvent(type, id, name, value) { + var event = new this.EventObject(type, id, name, value); event_callbacks.fire(event); } @@ -173,39 +172,54 @@ 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); return; } - if ((response === undefined) || (response.type === undefined) || (response.transactionid === undefined)) { + if ((response === undefined) || (response.type === undefined)) { console.error('Badly formed message: ' + msg); - return; - } else { - if (response.type === 'event') { - console.log('new event: ' + response.name + ', ' + response.data); - self.fireSevent(response.name, response.value); + } else if (response.type === 'event' && response.value !== undefined) { + if (response.value.interface_name === 'net.connman.Manager' || response.value.interface_name === 'net.connman.Service' || response.value.interface_name === 'net.connman.Technology') { + if (response.value.signal_name === undefined || response.value.parameters === undefined) { + console.error('Badly formed event: ' + msg); + return; + } + if (response.value.signal_name === 'ServiceChanged' && response.value.parameters.length !== 2) { + console.error('Badly formed event parameters: ' + msg); + 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); + } else { + console.error('Unrecognized event object_path, skipping'); + } } else { - var calls = this.methodCalls; - for (var i = 0; i < calls.length; i++) { - var call = calls[i]; - if (call && (!call.done) && (call.transactionid === response.transactionid)) { - call.finish(); - console.log('response matched'); - 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) { - call.successCB(response.value); - } else { - call.successCB(); - } + console.error('Unrecognized event, skipping'); + } + } else if (response.transactionid === undefined) { + console.error('Badly formed response: ' + msg); + } else { + var calls = this.methodCalls; + for (var i = 0; i < calls.length; i++) { + var call = calls[i]; + 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) { + call.successCB(response.value); + } else { + call.successCB(); } - return; } + return; } } } @@ -261,7 +275,6 @@ var wsAPI = (function() { if (msg.name === 'is_enabled') { /* default to enabled */ var result = true; - console.log('is_enabled response ' + result); call.successCB(result); return; } else if (msg.name === 'enable' && msg.value === true) { @@ -288,7 +301,7 @@ var wsAPI = (function() { "BSSID": "11:5d:49:88:3d:20", "MaxRate": 54000000, "Frequency": 2417, - "EncryptionMode": "aes", + "EncryptionMode": "none", "Ethernet": { "Method": "auto", "Interface": "wlp1s0", @@ -401,7 +414,6 @@ var wsAPI = (function() { ]; replyMsg = JSON.stringify(results); - console.log('scan response ' + replyMsg); /* simulate scan behavior */ setTimeout(function() { call.successCB(results); @@ -409,9 +421,15 @@ var wsAPI = (function() { return; } else if (msg.name === 'connect') { call.successCB(); + setTimeout(function() { + fireEvent(WS_REQUEST_TYPE.WIFI, '/net/connman/service/wifi_c8f733acdf96_3558364737_managed_psk', 'PropertyChanged', ["Connected", true]); + }, 2000); return; } else if (msg.name === 'disconnect') { call.successCB(); + setTimeout(function() { + fireEvent(WS_REQUEST_TYPE.WIFI, '/net/connman/service/wifi_c8f733acdf96_3558364737_managed_psk', 'PropertyChanged', ["Connected", false]); + }, 2000); return; } else { call.errorCB('Unsupported request: ' + msg.name + ', ' + msg.value); @@ -434,13 +452,11 @@ var wsAPI = (function() { if (msg.name === 'is_time_updates_auto' && msg.value !== undefined) { /* default to manual */ var result = false; - console.log('is_time_updates_auto response ' + result); call.successCB(result); return; } else if (msg.name === 'is_timezone_updates_auto' && msg.value !== undefined) { /* default to manual */ var result = false; - console.log('is_timezone_updates_auto response ' + result); call.successCB(result); return; } else if (msg.name === 'time' && msg.value !== undefined) { @@ -480,6 +496,7 @@ var wsAPI = (function() { connect: connect, reconnect: reconnect, sendRequest: sendRequest, - subscribeEvents: subscribeEvents + subscribeEvents: subscribeEvents, + unsubscribeEvents: unsubscribeEvents } })(); \ No newline at end of file diff --git a/packaging/Settings.changes b/packaging/Settings.changes index 5dcb789..44fdc0f 100644 --- a/packaging/Settings.changes +++ b/packaging/Settings.changes @@ -1,3 +1,6 @@ +* Tue Oct 15 2013 Jimmy Huang accepted/tizen/20131007.221312@71c3e9e +- Monitor settings daemon events and update changes + * Tue Oct 15 2013 Jimmy Huang accepted/tizen/20131007.221312@ff849bb - Remove duplicating disconnect button from WiFi details panel -- 2.7.4