Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
330 lines
8.6 KiB
JavaScript
Executable file
330 lines
8.6 KiB
JavaScript
Executable file
/**
|
|
* Hotspot is a singleton that you can easily use it to fetch
|
|
* some shared data across different panels
|
|
*
|
|
* @module Hotspot
|
|
*/
|
|
define(function(require) {
|
|
'use strict';
|
|
|
|
// modules / helpers
|
|
var SettingsListener = require('shared/settings_listener');
|
|
|
|
const RE_ENABLE_WIFI_TETHERING_TIME = 1000;
|
|
|
|
var Hotspot = function() {
|
|
this._settings = navigator.mozSettings;
|
|
};
|
|
|
|
/**
|
|
* @alias module:hotspot/hotspot
|
|
* @requires module:hotspot/hotspot_settings
|
|
* @returns {Hotspot}
|
|
*/
|
|
Hotspot.prototype = {
|
|
/**
|
|
* Wifi hotspot setting
|
|
*
|
|
* @memberOf Hotspot
|
|
* @type {Boolean}
|
|
*/
|
|
_hotspotSetting: null,
|
|
/**
|
|
* Usb hotspot setting
|
|
*
|
|
* @memberOf Hotspot
|
|
* @type {Boolean}
|
|
*/
|
|
_usbHotspotSetting: null,
|
|
/**
|
|
* Usb storage setting
|
|
*
|
|
* @memberOf Hotspot
|
|
* @type {Boolean}
|
|
*/
|
|
_usbStorageSetting: null,
|
|
/**
|
|
* These listeners would be called when hotspot setting is changed
|
|
*
|
|
* @memberOf Hotspot
|
|
* @type {Array}
|
|
*/
|
|
_hotspotChangeListeners: [],
|
|
|
|
/**
|
|
* These listeners would be called when usb hotspot setting is changed
|
|
*
|
|
* @memberOf Hotspot
|
|
* @type {Array}
|
|
*/
|
|
_usbHotspotChangeListeners: [],
|
|
|
|
/**
|
|
* These listeners would be called when usb storage setting is changed
|
|
*
|
|
* @memberOf Hotspot
|
|
* @type {Array}
|
|
*/
|
|
_usbStorageChangeListeners: [],
|
|
|
|
/**
|
|
* These listeners would be called when incompatibles settings are
|
|
* enabled at the same time
|
|
*
|
|
* @memberOf Hotspot
|
|
* @type {Array}
|
|
*/
|
|
_incompatibleSettingsListeners: [],
|
|
|
|
/**
|
|
* Wifi tethering setting key
|
|
*
|
|
* @access public
|
|
* @memberOf Hotspot
|
|
* @type {String}
|
|
*/
|
|
tetheringWifiKey: 'tethering.wifi.enabled',
|
|
|
|
/**
|
|
* Usb tethering setting key
|
|
*
|
|
* @access public
|
|
* @memberOf Hotspot
|
|
* @type {String}
|
|
*/
|
|
tetheringUsbKey: 'tethering.usb.enabled',
|
|
|
|
/**
|
|
* Usb storage setting key
|
|
*
|
|
* @access public
|
|
* @memberOf Hotspot
|
|
* @type {String}
|
|
*/
|
|
usbStorageKey: 'ums.enabled',
|
|
|
|
/**
|
|
* Init is used to initialize some basic stuffs
|
|
*
|
|
* @memberOf Hotspot
|
|
*/
|
|
init: function h_init() {
|
|
this._bindEvents();
|
|
},
|
|
|
|
/**
|
|
* We will bind some default listeners here
|
|
*
|
|
* @memberOf Hotspot
|
|
*/
|
|
_bindEvents: function() {
|
|
// Wifi tethering enabled
|
|
SettingsListener.observe(this.tetheringWifiKey, false,
|
|
this._hotspotSettingChange.bind(this));
|
|
|
|
// USB tethering enabled
|
|
SettingsListener.observe(this.tetheringUsbKey, false,
|
|
this._usbHotspotSettingChange.bind(this));
|
|
|
|
// USB storage enabled
|
|
SettingsListener.observe(this.usbStorageKey, false,
|
|
this._usbStorageSettingChange.bind(this));
|
|
},
|
|
|
|
/**
|
|
* When wifi hotspot is changed, we will call all registered listeners
|
|
*
|
|
* @memberOf Hotspot
|
|
*/
|
|
_hotspotSettingChange: function(enabled) {
|
|
this._hotspotSetting = enabled;
|
|
this._hotspotChangeListeners.forEach(function(listener) {
|
|
listener(enabled);
|
|
});
|
|
},
|
|
|
|
/**
|
|
* When usb hotspot is changed, we will call all registered listeners
|
|
*
|
|
* @memberOf Hotspot
|
|
*/
|
|
_usbHotspotSettingChange: function(enabled) {
|
|
this._usbHotspotSetting = enabled;
|
|
this._usbHotspotChangeListeners.forEach(function(listener) {
|
|
listener(enabled);
|
|
});
|
|
},
|
|
|
|
/**
|
|
* When usb storage is changed, we will call all registered listeners
|
|
*
|
|
* @memberOf Hotspot
|
|
*/
|
|
_usbStorageSettingChange: function(enabled) {
|
|
this._usbStorageSetting = enabled;
|
|
this._usbStorageChangeListeners.forEach(function(listener) {
|
|
listener(enabled);
|
|
});
|
|
},
|
|
|
|
/**
|
|
* When two incompatible settings are enabled we will call all
|
|
* registered listeners.
|
|
*
|
|
* @param bothConflicts Indicates that usb hotspot has the two
|
|
* possible conflicts (wifi hotspot and usb storage)
|
|
*
|
|
* @memberOf Hotspot
|
|
*/
|
|
_incompatibleSettings: function(newSetting, oldSetting, bothConflicts) {
|
|
this._incompatibleSettingsListeners.forEach(function(listener) {
|
|
listener(newSetting, oldSetting, bothConflicts);
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Check if two incompatible settings are enabled
|
|
*
|
|
* @memberOf Hotspot
|
|
*/
|
|
checkIncompatibleSettings: function(newSetting, value) {
|
|
switch(newSetting) {
|
|
case this.tetheringWifiKey:
|
|
// Early return if the user has disabled the setting
|
|
if (!value) {
|
|
this._setWifiTetheringSetting(value);
|
|
return;
|
|
}
|
|
|
|
if (value && this._usbHotspotSetting) {
|
|
this._incompatibleSettings(this.tetheringWifiKey,
|
|
this.tetheringUsbKey, false);
|
|
} else {
|
|
this._setWifiTetheringSetting(value);
|
|
}
|
|
break;
|
|
case this.tetheringUsbKey:
|
|
// Early return if the user has disabled the setting or the
|
|
// incompatible settings are disabled
|
|
if (!value || (!this._hotspotSetting && !this._usbStorageSetting)) {
|
|
this._setUsbTetheringSetting(value);
|
|
return;
|
|
}
|
|
if (this._usbStorageSetting && this._hotspotSetting) {
|
|
this._incompatibleSettings(this.tetheringUsbKey, null, true);
|
|
} else {
|
|
var oldSetting = this._usbStorageSetting ? this.usbStorageKey :
|
|
this.tetheringWifiKey;
|
|
this._incompatibleSettings(this.tetheringUsbKey, oldSetting, false);
|
|
}
|
|
break;
|
|
}
|
|
},
|
|
|
|
reEnableWifiTetheringSetting: function() {
|
|
if (!this.wifiHotspotSetting) {
|
|
return;
|
|
}
|
|
|
|
// The time is used to avoid the quick changes on the toggle that may
|
|
// cause bad user experience.
|
|
this._setWifiTetheringSetting(false);
|
|
setTimeout(() => {
|
|
this._setWifiTetheringSetting(true);
|
|
}, RE_ENABLE_WIFI_TETHERING_TIME);
|
|
},
|
|
|
|
/**
|
|
* This is an internal function that can help us find out the matched
|
|
* callback from catched listeners and remove it
|
|
*
|
|
* @memberOf Hotspot
|
|
* @param {Array} listeners
|
|
* @param {Function} callback
|
|
*/
|
|
_removeEventListener: function(listeners, callback) {
|
|
var index = listeners.indexOf(callback);
|
|
if (index >= 0) {
|
|
listeners.splice(index, 1);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* This is an internal function that set a value to the
|
|
* Wifi tethering setting
|
|
*
|
|
* @memberOf Hotspot
|
|
* @param {Boolean} Setting value
|
|
*/
|
|
_setWifiTetheringSetting: function(value) {
|
|
var cset = {};
|
|
cset[this.tetheringWifiKey] = value;
|
|
this._settings.createLock().set(cset);
|
|
},
|
|
|
|
/**
|
|
* This is an internal function that set a value to the
|
|
* Usb tethering setting
|
|
*
|
|
* @memberOf Hotspot
|
|
* @param {Boolean} Setting value
|
|
*/
|
|
_setUsbTetheringSetting: function(value) {
|
|
var cset = {};
|
|
cset[this.tetheringUsbKey] = value;
|
|
this._settings.createLock().set(cset);
|
|
},
|
|
|
|
addEventListener: function(eventName, callback) {
|
|
if (eventName === 'incompatibleSettings') {
|
|
this._incompatibleSettingsListeners.push(callback);
|
|
} else if (eventName === 'wifiHotspotChange') {
|
|
this._hotspotChangeListeners.push(callback);
|
|
} else if (eventName === 'usbHotspotChange') {
|
|
this._usbHotspotChangeListeners.push(callback);
|
|
} else if (eventName === 'usbStorageChange') {
|
|
this._usbStorageChangeListeners.push(callback);
|
|
}
|
|
},
|
|
|
|
removeEventListener: function(eventName, callback) {
|
|
if (eventName === 'incompatibleSettings') {
|
|
this._removeEventListener(
|
|
this._incompatibleSettingsListeners, callback);
|
|
} else if (eventName === 'wifiHotspotChange') {
|
|
this._removeEventListener(
|
|
this._hotspotChangeListeners, callback);
|
|
} else if (eventName === 'usbHotspotChange') {
|
|
this._removeEventListener(
|
|
this._usbHotspotChangeListeners, callback);
|
|
} else if (eventName === 'usbStorageChange') {
|
|
this._removeEventListener(
|
|
this._usbStorageChangeListeners, callback);
|
|
}
|
|
},
|
|
|
|
get wifiHotspotSetting() {
|
|
return this._hotspotSetting;
|
|
},
|
|
|
|
get usbHotspotSetting() {
|
|
return this._usbHotspotSetting;
|
|
},
|
|
|
|
get usbStorageSetting() {
|
|
return this._usbStorageSetting;
|
|
},
|
|
|
|
set hotspotSetting(value) {
|
|
this._setWifiTetheringSetting(value);
|
|
},
|
|
|
|
set usbHotspotSetting(value) {
|
|
this._setUsbTetheringSetting(value);
|
|
}
|
|
};
|
|
|
|
return function ctor_hotspot() {
|
|
return new Hotspot();
|
|
};
|
|
});
|