Monitor settings daemon events and update changes 72/10972/1
authorJimmy Huang <jimmy.huang@intel.com>
Tue, 15 Oct 2013 17:55:22 +0000 (10:55 -0700)
committerJimmy Huang <jimmy.huang@intel.com>
Tue, 15 Oct 2013 18:04:07 +0000 (11:04 -0700)
- 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 <jimmy.huang@intel.com>
js/api-wifi.js
js/main.js
js/panel-bluetooth.js
js/panel-wifi.js
js/websocket.js
packaging/Settings.changes

index bc9d13f..c8be691 100644 (file)
@@ -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 */
index a5ac589..8b6595c 100644 (file)
             /* 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 */
index adf7668..769abab 100644 (file)
@@ -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() {
index ba2bf5b..ae4ccb4 100644 (file)
@@ -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) {
index cbdb747..c4c962d 100644 (file)
@@ -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
index 5dcb789..44fdc0f 100644 (file)
@@ -1,3 +1,6 @@
+* Tue Oct 15 2013 Jimmy Huang <jimmy.huang@intel.com> accepted/tizen/20131007.221312@71c3e9e
+- Monitor settings daemon events and update changes
+
 * Tue Oct 15 2013 Jimmy Huang <jimmy.huang@intel.com> accepted/tizen/20131007.221312@ff849bb
 - Remove duplicating disconnect button from WiFi details panel