Send setTime argument using epoch time
[profile/ivi/SettingsApp.git] / js / panel-wifi.js
1 /*
2  * Copyright (c) 2013, Intel Corporation.
3  *
4  * This program is licensed under the terms and conditions of the
5  * Apache License, version 2.0.  The full text of the Apache License is at
6  * http://www.apache.org/licenses/LICENSE-2.0
7  *
8  */
9
10 function wifiPanelInit() {
11
12     settings.wifi.subscribeEvents(wifiEventReceived);
13
14     /* WiFi Settings Panel */
15     $('#page_wifi').on('pageshow', function(event, data) {
16         if (data.prevPage.attr('id') === 'page_wifi_detail') return;
17
18         var adapter = settings.wifi.getDefaultAdapter();
19         if (adapter === null) {
20             showMsg('Error', 'WiFi adapter not found');
21             return;
22         }
23         console.log('Default WiFi adapter: ', adapter.name);
24
25         if (adapter.name != undefined) {
26             $('#label_wifi_adapter').html(adapter.name);
27         } else {
28             $('#label_wifi_adapter').html('WiFi adapter not found');
29         }
30
31         adapter.getPowered(function(is_powered) {
32             if (adapter.powered) {
33                 wifiToggleOn();
34                 wifiScan(adapter);
35             } else {
36                 wifiToggleOff();
37             }
38         }, function(e) {
39             showMsg('Error', 'Cannot get WiFi state: ' + e);
40         });
41     });
42
43     $('#toggle_wifi').change(function() {
44         var wifi_switch = $(this);
45         var adapter = settings.wifi.getDefaultAdapter();
46         if (adapter === null) {
47             showMsg('Error', 'WiFi adapter not found');
48             wifiToggleOff();
49             return;
50         }
51
52         if (wifi_switch[0].selectedIndex === 0) {
53             adapter.setPowered(false, function() {
54                 /* success */
55                 console.log('Successfully disable wifi subsystem');
56             }, function(e) {
57                 /* error */
58                 $('#toggle_wifi').val('on').slider('refresh');
59                 showMsg('Error', 'Cannot disable WiFi subsystem: ' + e);
60             });
61         } else {
62             adapter.setPowered(true, function() {
63                 /* success */
64                 console.log('Successfully enable WiFi subsystem');
65                 wifiScan(adapter);
66             }, function(e) {
67                 /* error */
68                 $('#toggle_wifi').val('off').slider('refresh');
69                 showMsg('Error', 'Cannot enable WiFi subsystem: ' + e);
70             });
71         }
72     });
73
74     $('#button_wifi_refresh').on('click', function() {
75         var adapter = settings.wifi.getDefaultAdapter();
76         if (adapter === null) {
77             showErr('Error', 'WiFi adapter not found');
78         }
79
80         wifiScan(adapter);
81     });
82
83     $('#button_wifi_add').on('click', function() {
84         var adapter = settings.wifi.getDefaultAdapter();
85         if (adapter === null) {
86             showMsg('Error', 'WiFi adapter not found');
87         }
88
89         $.mobile.changePage('#page_wifi_add');
90     });
91
92     /* WiFi network detail page */
93     $('#page_wifi_detail').on('pageshow', function(event, data) {
94         console.log('Entering WiFi detail info page');
95         var network_id = localStorage.getItem('wifi_network_id');
96         if (network_id == undefined) return;
97         var network = $(jqId(network_id)).data('network-object');
98         wifiConstructDetailPanel(network);
99     });
100
101     /* WiFi add new network page */
102     $('#page_wifi_add').on('pagebeforeshow', function(event, data) {
103         console.log('Entering wifi add network page');
104         $('#input_wifi_ssid').val('');
105         $('#input_wifi_password').val('');
106         $('#select_wifi_security').val('None').change();
107         $('#input_wifi_password').textinput('disable');
108     });
109
110     $('#page_wifi_button_add').on('click', function() {
111         var adapter = settings.wifi.getDefaultAdapter();
112         var ssid = $('#input_wifi_ssid').val();
113         var security_option = $('#select_wifi_security').val();
114         var passcode = $('#input_wifi_password').val();
115
116         console.log(ssid);
117         if (ssid === '') {
118             showMsg('Error', 'Enter SSID');
119             return;
120         }
121         if (security_option !== 'None') {
122             showMsg('Error', 'Not supported');
123             return;
124         }
125
126         showSpinner(false, 'Connecting...');
127         adapter.connectNetwork(ssid, security_option, passcode, function() {
128             /* success */
129             hideSpinner();
130             $.mobile.changePage('#page_wifi');
131
132         }, function(e) {
133             /* error */
134             hideSpinner();
135             showMsg('Error', 'WiFi connect failed: ' + e);
136         });
137     });
138
139     $('#select_wifi_security').on('change', function(event, data) {
140         var security = this.value;
141         console.log('selected WiFi security: ' + security);
142
143         if (security === 'None') {
144             $('#input_wifi_password').textinput('disable');
145             $('#input_wifi_password').val('');
146         } else {
147             $('#input_wifi_password').textinput('enable');
148         }
149     });
150 }
151
152 function wifiEventReceived(event) {
153     if (event.type !== WS_EVENT_TYPE.WIFI) return;
154     console.log('WiFi event received: [' + event.name + ', ' + event.value + ']');
155     if (event.name === 'enabled' && event.value === true) {
156         wifiToggleOn();
157     } else if (event.name === 'enabled' && event.value === false) {
158         wifiToggleOff();
159     }
160 }
161
162 function wifiClearKnownList() {
163     console.log('Clear known WiFi network list');
164     $('#listview_network_known').html('');
165 }
166
167 function wifiClearAvailableList() {
168     console.log('Clear available WiFi network list');
169     $('#listview_network_available').html('');
170 }
171
172 function wifiScan(adapter) {
173     console.log('Start wifi scan');
174     /* clear the network list with new scan */
175     wifiClearKnownList();
176     wifiClearAvailableList();
177
178     adapter.scan(function(networks) {
179         console.log('found ' + networks.length + ' networks');
180         for (var i = 0; i < networks.length; i++) {
181             var network = networks[i];
182             console.log('network ssid: ' + network.ssid);
183             console.log('network connected: ' + network.connected);
184             wifiUpdateNetwork(network);
185         }
186     }, function(e) {
187         showMsg('Error', 'Cannot scan: ' + e);
188     })
189 }
190
191 function wifiRefreshList() {
192     $('#listview_network_known').listview('refresh');
193     $('#listview_network_available').listview('refresh');
194 }
195
196 function wifiAppendToKnownList(network) {
197     console.log('Append to known network list - ' + network.ssid);
198     if ($('#listview_network_known').find(jqId(network.ssid)).length != 0) return;
199
200     var parent = '#listview_network_known';
201     wifiConstructNetworkElement(parent, network);
202     wifiUpdateNetworkButton(network);
203     wifiRefreshList();
204 }
205
206 function wifiRemoveFromKnownList(network_ssid) {
207     var removeThis = $('#listview_network_known li').filter(function() {
208         return $(this).find(jqId(network_ssid)).length === 1;
209     });
210
211     if (removeThis.length !== 0) {
212         console.log('Remove from known network list - ' + network_ssid);
213         removeThis.remove();
214         wifiRefreshList();
215     }
216 }
217
218 function wifiAppendToAvailableList(network) {
219     console.log('Append to available list - ' + network.ssid);
220     if ($('#listview_network_available').find(jqId(network.ssid)).length != 0) return;
221
222     var parent = '#listview_network_available';
223     wifiConstructNetworkElement(parent, network);
224     wifiUpdateNetworkButton(network);
225     wifiRefreshList();
226 }
227
228 function wifiRemoveFromAvailableList(network_ssid) {
229     var removeThis = $('#listview_network_available li').filter(function() {
230         return $(this).find(jqId(network_ssid)).length === 1;
231     });
232
233     if (removeThis.length !== 0) {
234         console.log('Remove from available list: ' + network_ssid);
235         removeThis.remove();
236         wifiRefreshList();
237     }
238 }
239
240 function wifiConstructNetworkElement(parent, network) {
241     var html = '<li data-icon="false"><a href="#" id="' + jqId(network.ssid).replace('#', '') + '">';
242     html += '<div class="network-ssid">' + network.ssid + '</div>';
243     html += '<div class="network-status"></div>';
244     html += '<div data-role="button" class="network-action-button ui-li-aside" data-inline="true"></div>';
245     html += '</a></li>';
246     $(parent).append(html).trigger('create');
247
248     /* store network object in the element so we can reference it later */
249     $(jqId(network.ssid)).data('network-object', network);
250
251     $(jqId(network.ssid)).on('click', function() {
252         localStorage.setItem('wifi_network_id', network.ssid);
253         $.mobile.changePage('#page_wifi_detail');
254     });
255
256     $(jqId(network.ssid)).find('div.network-action-button').on('click', function(e) {
257         var parent = $(this).parent().attr('id');
258         console.log('network action button clicked');
259
260         /*
261          * prevent the click event to propagate up
262          */
263         e.stopImmediatePropagation();
264         e.preventDefault();
265
266         var adapter = settings.wifi.getDefaultAdapter();
267         if (adapter === null) return;
268
269         /* retrieve the network object from element */
270         var network = $(jqId(parent)).data('network-object');
271         if (network == undefined) {
272             console.error('Wifi network not found');
273             return;
274         }
275
276         if (!network.connected) {
277             createPopupDialog(false, false, 'Connect to network', network.ssid, 'Connect', 'Cancel', function() {
278                 console.log('WiFi connect to network: ' + network.ssid);
279                 showSpinner(false, 'Connecting...');
280                 adapter.connectNetwork(network.ssid, null, null, function() {
281                     /* success */
282                     hideSpinner();
283                     network.connected = true;
284
285                     /* changing from disconnected to connected */
286                     wifiUpdateNetwork(network);
287                 }, function(e) {
288                     /* error */
289                     hideSpinner();
290                     showMsg('Error', 'WiFi connect failed: ' + e);
291                 });
292             });
293         } else {
294             console.log('Wifi disconnect from network: ' + network.ssid);
295             showSpinner(false, 'Disconnecting...');
296             adapter.disconnectNetwork(network.ssid, function() {
297                 /* success */
298                 hideSpinner();
299                 network.connected = false;
300                 $('#button_wifi_disconnect').remove();
301
302                 /* changing from connected to disconnected */
303                 wifiUpdateNetwork(network);
304             }, function(e) {
305                 /* error */
306                 hideSpinner();
307                 showMsg('Error', 'Network disconnect failed: ' + e);
308
309                 /* Something is wrong, remove from connected list */
310                 wifiRemoveFromKnownList(network.ssid);
311             });
312         }
313     });
314 }
315
316 function wifiUpdateNetwork(network) {
317     console.log('Constructing or updating WiFi network');
318
319     /* reposition device if it's connected or disconnected */
320     if (network.connected) {
321         wifiRemoveFromAvailableList(network.ssid);
322         wifiAppendToKnownList(network);
323     } else {
324         wifiRemoveFromKnownList(network.ssid);
325         wifiAppendToAvailableList(network);
326     }
327
328     /* update network button for allowed action */
329     wifiUpdateNetworkButton(network);
330
331     /* update network connection status */
332     wifiUpdateConnectionStatus(network);
333 }
334
335 function wifiUpdateNetworkButton(network) {
336     if (network.connected) {
337         $(jqId(network.ssid)).find('div.network-action-button').find('span').text('Disconnect');
338     } else {
339         $(jqId(network.ssid)).find('div.network-action-button').find('span').text('Connect');
340     }
341 }
342
343 function wifiUpdateConnectionStatus(network) {
344     var status = 'disconnected';
345     if (network.connected) {
346         $(jqId(network.ssid)).addClass('network-connected');
347         status = 'connected';
348     } else {
349         status = 'disconnected';
350         $(jqId(network.ssid)).removeClass('network-connected');
351     }
352
353     wifiUpdateConnectionStatusText(network, status);
354 }
355
356 function wifiUpdateConnectionStatusText(network, status) {
357     $(jqId(network.ssid)).find('div.network-status').text(status);
358 }
359
360 function wifiConstructDetailPanel(network) {
361     var status_connected = 'No';
362
363     if (network == null) return;
364     if (network.connected) status_connected = 'Yes';
365
366     $('#page_wifi_detail_content').html('');
367     var html = '<ul data-role="listview" id="listview_wifi_detail" data-inset="true" ' + 'class="network-list ui-listview">';
368     html += '<li id="wifi_detail_ssid"><h2>SSID: ' + network.ssid + '</h2></li>';
369     html += '<li id="wifi_detail_connected"><h2>Connected: ' + status_connected + '</h2></li>';
370     html += '</ul>';
371     $('#page_wifi_detail_content').append(html).trigger('create');
372
373     if (network.connected) {
374         html = '<div data-role="button" id="button_wifi_disconnect">Disconnect</div>';
375         $('#page_wifi_detail_content').append(html).trigger('create');
376
377         $('#button_wifi_disconnect').on('click', function(e) {
378             console.log('WiFi disconnect from network: ' + network.ssid);
379             /* retrieve the network object from element */
380             var adapter = settings.wifi.getDefaultAdapter();
381             if (adapter === null) return;
382
383             createPopupDialog(false, false, 'Disconnect from network', network.ssid, 'Disconnect', 'Cancel', function() {
384                 showSpinner(false, 'Disconnecting...');
385                 adapter.disconnectNetwork(network.ssid, function() {
386                     /* success */
387                     hideSpinner();
388                     network.connected = false;
389                     $('#button_wifi_disconnect').remove();
390
391                     /* changing from connected to disconnected */
392                     wifiUpdateNetwork(network);
393                     setTimeout(function() {
394                         $.mobile.changePage('#page_wifi');
395                     }, 1000);
396                 }, function(e) {
397                     /* error */
398                     hideSpinner();
399                     showMsg('Error', 'Network disconnect failed: ' + e);
400
401                     /* Something is wrong, remove from connected list */
402                     wifiRemoveFromKnownList(network.ssid);
403                 });
404             });
405         });
406     }
407     $('#listview_wifi_detail').listview('refresh');
408 }
409
410 function wifiUpdateDetailPanel(network) {
411     var status_connected = 'No';
412
413     if (network == null) return;
414     if (network.connected) status_connected = 'Yes';
415     $('#wifi_detail_connected').text(status_connected);
416     $('#listview_wifi_detail').listview('refresh');
417 }
418
419 function wifiToggleOn() {
420     $('#wifi_networks').show();
421     $('#toggle_wifi').val('on').slider('refresh');
422 }
423
424 function wifiToggleOff() {
425     $('#wifi_networks').hide();
426     $('#toggle_wifi').val('off').slider('refresh');
427 }