+/*
+ * 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
+ *
+ */
+
+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;
+
+ var adapter = settings.wifi.getDefaultAdapter();
+ if (adapter === null) {
+ showMsg('Error', 'WiFi adapter not found');
+ return;
+ }
+ console.log('Default WiFi adapter: ', adapter.name);
+
+ 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 (adapter.powered) {
+ wifiToggleOn();
+ wifiScan(adapter);
+ } else {
+ wifiToggleOff();
+ }
+ }, function(e) {
+ showMsg('Error', 'Cannot get WiFi state: ' + e);
+ });
+ });
+
+ $('#toggle_wifi').change(function() {
+ var wifi_switch = $(this);
+ var adapter = settings.wifi.getDefaultAdapter();
+ if (adapter === null) {
+ showMsg('Error', 'WiFi adapter not found');
+ wifiToggleOff();
+ return;
+ }
+
+ if (wifi_switch[0].selectedIndex === 0) {
+ adapter.setPowered(false, function() {
+ /* success */
+ console.log('Successfully disable wifi subsystem');
+ }, function(e) {
+ /* error */
+ $('#toggle_wifi').val('on').slider('refresh');
+ showMsg('Error', 'Cannot disable WiFi subsystem: ' + e);
+ });
+ } else {
+ adapter.setPowered(true, function() {
+ /* success */
+ console.log('Successfully enable WiFi subsystem');
+ wifiScan(adapter);
+ }, function(e) {
+ /* error */
+ $('#toggle_wifi').val('off').slider('refresh');
+ 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() {
+ 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) {
+ console.log('Entering WiFi detail info page');
+ 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) {
+ console.log('Entering wifi add network page');
+ $('#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();
+
+ console.log(ssid);
+ 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;
+ console.log('selected WiFi security: ' + security);
+
+ 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;
+ console.log('WiFi event received: [' + event.name + ', ' + event.value + ']');
+ if (event.name === 'enabled' && event.value === true) {
+ wifiToggleOn();
+ } else if (event.name === 'enabled' && event.value === false) {
+ wifiToggleOff();
+ }
+}
+
+function wifiClearKnownList() {
+ console.log('Clear known WiFi network list');
+ $('#listview_network_known').html('');
+}
+
+function wifiClearAvailableList() {
+ console.log('Clear available WiFi network list');
+ $('#listview_network_available').html('');
+}
+
+function wifiScan(adapter) {
+ console.log('Start wifi scan');
+ /* clear the network list with new scan */
+ wifiClearKnownList();
+ wifiClearAvailableList();
+
+ adapter.scan(function(networks) {
+ console.log('found ' + networks.length + ' networks');
+ for (var i = 0; i < networks.length; i++) {
+ var network = networks[i];
+ console.log('network ssid: ' + network.ssid);
+ console.log('network connected: ' + network.connected);
+ wifiUpdateNetwork(network);
+ }
+ }, function(e) {
+ showMsg('Error', 'Cannot scan: ' + e);
+ })
+}
+
+function wifiRefreshList() {
+ $('#listview_network_known').listview('refresh');
+ $('#listview_network_available').listview('refresh');
+}
+
+function wifiAppendToKnownList(network) {
+ console.log('Append to known network list - ' + network.ssid);
+ if ($('#listview_network_known').find(jqId(network.ssid)).length != 0) return;
+
+ var parent = '#listview_network_known';
+ wifiConstructNetworkElement(parent, network);
+ wifiUpdateNetworkButton(network);
+ wifiRefreshList();
+}
+
+function wifiRemoveFromKnownList(network_ssid) {
+ var removeThis = $('#listview_network_known li').filter(function() {
+ return $(this).find(jqId(network_ssid)).length === 1;
+ });
+
+ if (removeThis.length !== 0) {
+ console.log('Remove from known network list - ' + network_ssid);
+ removeThis.remove();
+ wifiRefreshList();
+ }
+}
+
+function wifiAppendToAvailableList(network) {
+ console.log('Append to available list - ' + network.ssid);
+ if ($('#listview_network_available').find(jqId(network.ssid)).length != 0) return;
+
+ var parent = '#listview_network_available';
+ wifiConstructNetworkElement(parent, network);
+ wifiUpdateNetworkButton(network);
+ wifiRefreshList();
+}
+
+function wifiRemoveFromAvailableList(network_ssid) {
+ var removeThis = $('#listview_network_available li').filter(function() {
+ return $(this).find(jqId(network_ssid)).length === 1;
+ });
+
+ if (removeThis.length !== 0) {
+ console.log('Remove from available list: ' + network_ssid);
+ removeThis.remove();
+ wifiRefreshList();
+ }
+}
+
+function wifiConstructNetworkElement(parent, network) {
+ var html = '<li data-icon="false"><a href="#" id="' + jqId(network.ssid).replace('#', '') + '">';
+ html += '<div class="network-ssid">' + network.ssid + '</div>';
+ html += '<div class="network-status"></div>';
+ html += '<div data-role="button" class="network-action-button ui-li-aside" data-inline="true"></div>';
+ html += '</a></li>';
+ $(parent).append(html).trigger('create');
+
+ /* store network object in the element so we can reference it later */
+ $(jqId(network.ssid)).data('network-object', network);
+
+ $(jqId(network.ssid)).on('click', function() {
+ localStorage.setItem('wifi_network_id', network.ssid);
+ $.mobile.changePage('#page_wifi_detail');
+ });
+
+ $(jqId(network.ssid)).find('div.network-action-button').on('click', function(e) {
+ var parent = $(this).parent().attr('id');
+ console.log('network action button clicked');
+
+ /*
+ * 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 == undefined) {
+ console.error('Wifi network not found');
+ 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.ssid, null, null, function() {
+ /* success */
+ hideSpinner();
+ network.connected = true;
+
+ /* changing from disconnected to connected */
+ 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.ssid, function() {
+ /* success */
+ hideSpinner();
+ network.connected = false;
+ $('#button_wifi_disconnect').remove();
+
+ /* changing from connected to disconnected */
+ wifiUpdateNetwork(network);
+ }, function(e) {
+ /* error */
+ hideSpinner();
+ showMsg('Error', 'Network disconnect failed: ' + e);
+
+ /* Something is wrong, remove from connected list */
+ wifiRemoveFromKnownList(network.ssid);
+ });
+ }
+ });
+}
+
+function wifiUpdateNetwork(network) {
+ console.log('Constructing or updating WiFi network');
+
+ /* reposition device if it's connected or disconnected */
+ if (network.connected) {
+ wifiRemoveFromAvailableList(network.ssid);
+ wifiAppendToKnownList(network);
+ } else {
+ wifiRemoveFromKnownList(network.ssid);
+ wifiAppendToAvailableList(network);
+ }
+
+ /* update network button for allowed action */
+ wifiUpdateNetworkButton(network);
+
+ /* update network connection status */
+ wifiUpdateConnectionStatus(network);
+}
+
+function wifiUpdateNetworkButton(network) {
+ if (network.connected) {
+ $(jqId(network.ssid)).find('div.network-action-button').find('span').text('Disconnect');
+ } else {
+ $(jqId(network.ssid)).find('div.network-action-button').find('span').text('Connect');
+ }
+}
+
+function wifiUpdateConnectionStatus(network) {
+ var status = 'disconnected';
+ if (network.connected) {
+ $(jqId(network.ssid)).addClass('network-connected');
+ status = 'connected';
+ } else {
+ status = 'disconnected';
+ $(jqId(network.ssid)).removeClass('network-connected');
+ }
+
+ wifiUpdateConnectionStatusText(network, status);
+}
+
+function wifiUpdateConnectionStatusText(network, status) {
+ $(jqId(network.ssid)).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 = '<ul data-role="listview" id="listview_wifi_detail" data-inset="true" ' + 'class="network-list ui-listview">';
+ html += '<li id="wifi_detail_ssid"><h2>SSID: ' + network.ssid + '</h2></li>';
+ html += '<li id="wifi_detail_connected"><h2>Connected: ' + status_connected + '</h2></li>';
+ html += '</ul>';
+ $('#page_wifi_detail_content').append(html).trigger('create');
+
+ if (network.connected) {
+ html = '<div data-role="button" id="button_wifi_disconnect">Disconnect</div>';
+ $('#page_wifi_detail_content').append(html).trigger('create');
+
+ $('#button_wifi_disconnect').on('click', function(e) {
+ console.log('WiFi disconnect from network: ' + network.ssid);
+ /* retrieve the network object from element */
+ var adapter = settings.wifi.getDefaultAdapter();
+ if (adapter === null) return;
+
+ createPopupDialog(false, false, 'Disconnect from network', network.ssid, 'Disconnect', 'Cancel', function() {
+ showSpinner(false, 'Disconnecting...');
+ adapter.disconnectNetwork(network.ssid, function() {
+ /* success */
+ hideSpinner();
+ network.connected = false;
+ $('#button_wifi_disconnect').remove();
+
+ /* changing from connected to disconnected */
+ wifiUpdateNetwork(network);
+ setTimeout(function() {
+ $.mobile.changePage('#page_wifi');
+ }, 1000);
+ }, function(e) {
+ /* error */
+ hideSpinner();
+ showMsg('Error', 'Network disconnect failed: ' + e);
+
+ /* Something is wrong, remove from connected list */
+ wifiRemoveFromKnownList(network.ssid);
+ });
+ });
+ });
+ }
+ $('#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() {
+ $('#wifi_networks').show();
+ $('#toggle_wifi').val('on').slider('refresh');
+}
+
+function wifiToggleOff() {
+ $('#wifi_networks').hide();
+ $('#toggle_wifi').val('off').slider('refresh');
+}
\ No newline at end of file