Source: panels/hotspot/hotspot.js

  1. /**
  2. * Hotspot is a singleton that you can easily use it to fetch
  3. * some shared data across different panels
  4. *
  5. * @module Hotspot
  6. */
  7. define(function(require) {
  8. 'use strict';
  9. // modules / helpers
  10. var SettingsListener = require('shared/settings_listener');
  11. const RE_ENABLE_WIFI_TETHERING_TIME = 1000;
  12. var Hotspot = function() {
  13. this._settings = navigator.mozSettings;
  14. };
  15. /**
  16. * @alias module:hotspot/hotspot
  17. * @requires module:hotspot/hotspot_settings
  18. * @returns {Hotspot}
  19. */
  20. Hotspot.prototype = {
  21. /**
  22. * Wifi hotspot setting
  23. *
  24. * @memberOf Hotspot
  25. * @type {Boolean}
  26. */
  27. _hotspotSetting: null,
  28. /**
  29. * Usb hotspot setting
  30. *
  31. * @memberOf Hotspot
  32. * @type {Boolean}
  33. */
  34. _usbHotspotSetting: null,
  35. /**
  36. * Usb storage setting
  37. *
  38. * @memberOf Hotspot
  39. * @type {Boolean}
  40. */
  41. _usbStorageSetting: null,
  42. /**
  43. * These listeners would be called when hotspot setting is changed
  44. *
  45. * @memberOf Hotspot
  46. * @type {Array}
  47. */
  48. _hotspotChangeListeners: [],
  49. /**
  50. * These listeners would be called when usb hotspot setting is changed
  51. *
  52. * @memberOf Hotspot
  53. * @type {Array}
  54. */
  55. _usbHotspotChangeListeners: [],
  56. /**
  57. * These listeners would be called when usb storage setting is changed
  58. *
  59. * @memberOf Hotspot
  60. * @type {Array}
  61. */
  62. _usbStorageChangeListeners: [],
  63. /**
  64. * These listeners would be called when incompatibles settings are
  65. * enabled at the same time
  66. *
  67. * @memberOf Hotspot
  68. * @type {Array}
  69. */
  70. _incompatibleSettingsListeners: [],
  71. /**
  72. * Wifi tethering setting key
  73. *
  74. * @access public
  75. * @memberOf Hotspot
  76. * @type {String}
  77. */
  78. tetheringWifiKey: 'tethering.wifi.enabled',
  79. /**
  80. * Usb tethering setting key
  81. *
  82. * @access public
  83. * @memberOf Hotspot
  84. * @type {String}
  85. */
  86. tetheringUsbKey: 'tethering.usb.enabled',
  87. /**
  88. * Usb storage setting key
  89. *
  90. * @access public
  91. * @memberOf Hotspot
  92. * @type {String}
  93. */
  94. usbStorageKey: 'ums.enabled',
  95. /**
  96. * Init is used to initialize some basic stuffs
  97. *
  98. * @memberOf Hotspot
  99. */
  100. init: function h_init() {
  101. this._bindEvents();
  102. },
  103. /**
  104. * We will bind some default listeners here
  105. *
  106. * @memberOf Hotspot
  107. */
  108. _bindEvents: function() {
  109. // Wifi tethering enabled
  110. SettingsListener.observe(this.tetheringWifiKey, false,
  111. this._hotspotSettingChange.bind(this));
  112. // USB tethering enabled
  113. SettingsListener.observe(this.tetheringUsbKey, false,
  114. this._usbHotspotSettingChange.bind(this));
  115. // USB storage enabled
  116. SettingsListener.observe(this.usbStorageKey, false,
  117. this._usbStorageSettingChange.bind(this));
  118. },
  119. /**
  120. * When wifi hotspot is changed, we will call all registered listeners
  121. *
  122. * @memberOf Hotspot
  123. */
  124. _hotspotSettingChange: function(enabled) {
  125. this._hotspotSetting = enabled;
  126. this._hotspotChangeListeners.forEach(function(listener) {
  127. listener(enabled);
  128. });
  129. },
  130. /**
  131. * When usb hotspot is changed, we will call all registered listeners
  132. *
  133. * @memberOf Hotspot
  134. */
  135. _usbHotspotSettingChange: function(enabled) {
  136. this._usbHotspotSetting = enabled;
  137. this._usbHotspotChangeListeners.forEach(function(listener) {
  138. listener(enabled);
  139. });
  140. },
  141. /**
  142. * When usb storage is changed, we will call all registered listeners
  143. *
  144. * @memberOf Hotspot
  145. */
  146. _usbStorageSettingChange: function(enabled) {
  147. this._usbStorageSetting = enabled;
  148. this._usbStorageChangeListeners.forEach(function(listener) {
  149. listener(enabled);
  150. });
  151. },
  152. /**
  153. * When two incompatible settings are enabled we will call all
  154. * registered listeners.
  155. *
  156. * @param bothConflicts Indicates that usb hotspot has the two
  157. * possible conflicts (wifi hotspot and usb storage)
  158. *
  159. * @memberOf Hotspot
  160. */
  161. _incompatibleSettings: function(newSetting, oldSetting, bothConflicts) {
  162. this._incompatibleSettingsListeners.forEach(function(listener) {
  163. listener(newSetting, oldSetting, bothConflicts);
  164. });
  165. },
  166. /**
  167. * Check if two incompatible settings are enabled
  168. *
  169. * @memberOf Hotspot
  170. */
  171. checkIncompatibleSettings: function(newSetting, value) {
  172. switch(newSetting) {
  173. case this.tetheringWifiKey:
  174. // Early return if the user has disabled the setting
  175. if (!value) {
  176. this._setWifiTetheringSetting(value);
  177. return;
  178. }
  179. if (value && this._usbHotspotSetting) {
  180. this._incompatibleSettings(this.tetheringWifiKey,
  181. this.tetheringUsbKey, false);
  182. } else {
  183. this._setWifiTetheringSetting(value);
  184. }
  185. break;
  186. case this.tetheringUsbKey:
  187. // Early return if the user has disabled the setting or the
  188. // incompatible settings are disabled
  189. if (!value || (!this._hotspotSetting && !this._usbStorageSetting)) {
  190. this._setUsbTetheringSetting(value);
  191. return;
  192. }
  193. if (this._usbStorageSetting && this._hotspotSetting) {
  194. this._incompatibleSettings(this.tetheringUsbKey, null, true);
  195. } else {
  196. var oldSetting = this._usbStorageSetting ? this.usbStorageKey :
  197. this.tetheringWifiKey;
  198. this._incompatibleSettings(this.tetheringUsbKey, oldSetting, false);
  199. }
  200. break;
  201. }
  202. },
  203. reEnableWifiTetheringSetting: function() {
  204. if (!this.wifiHotspotSetting) {
  205. return;
  206. }
  207. // The time is used to avoid the quick changes on the toggle that may
  208. // cause bad user experience.
  209. this._setWifiTetheringSetting(false);
  210. setTimeout(() => {
  211. this._setWifiTetheringSetting(true);
  212. }, RE_ENABLE_WIFI_TETHERING_TIME);
  213. },
  214. /**
  215. * This is an internal function that can help us find out the matched
  216. * callback from catched listeners and remove it
  217. *
  218. * @memberOf Hotspot
  219. * @param {Array} listeners
  220. * @param {Function} callback
  221. */
  222. _removeEventListener: function(listeners, callback) {
  223. var index = listeners.indexOf(callback);
  224. if (index >= 0) {
  225. listeners.splice(index, 1);
  226. }
  227. },
  228. /**
  229. * This is an internal function that set a value to the
  230. * Wifi tethering setting
  231. *
  232. * @memberOf Hotspot
  233. * @param {Boolean} Setting value
  234. */
  235. _setWifiTetheringSetting: function(value) {
  236. var cset = {};
  237. cset[this.tetheringWifiKey] = value;
  238. this._settings.createLock().set(cset);
  239. },
  240. /**
  241. * This is an internal function that set a value to the
  242. * Usb tethering setting
  243. *
  244. * @memberOf Hotspot
  245. * @param {Boolean} Setting value
  246. */
  247. _setUsbTetheringSetting: function(value) {
  248. var cset = {};
  249. cset[this.tetheringUsbKey] = value;
  250. this._settings.createLock().set(cset);
  251. },
  252. addEventListener: function(eventName, callback) {
  253. if (eventName === 'incompatibleSettings') {
  254. this._incompatibleSettingsListeners.push(callback);
  255. } else if (eventName === 'wifiHotspotChange') {
  256. this._hotspotChangeListeners.push(callback);
  257. } else if (eventName === 'usbHotspotChange') {
  258. this._usbHotspotChangeListeners.push(callback);
  259. } else if (eventName === 'usbStorageChange') {
  260. this._usbStorageChangeListeners.push(callback);
  261. }
  262. },
  263. removeEventListener: function(eventName, callback) {
  264. if (eventName === 'incompatibleSettings') {
  265. this._removeEventListener(
  266. this._incompatibleSettingsListeners, callback);
  267. } else if (eventName === 'wifiHotspotChange') {
  268. this._removeEventListener(
  269. this._hotspotChangeListeners, callback);
  270. } else if (eventName === 'usbHotspotChange') {
  271. this._removeEventListener(
  272. this._usbHotspotChangeListeners, callback);
  273. } else if (eventName === 'usbStorageChange') {
  274. this._removeEventListener(
  275. this._usbStorageChangeListeners, callback);
  276. }
  277. },
  278. get wifiHotspotSetting() {
  279. return this._hotspotSetting;
  280. },
  281. get usbHotspotSetting() {
  282. return this._usbHotspotSetting;
  283. },
  284. get usbStorageSetting() {
  285. return this._usbStorageSetting;
  286. },
  287. set hotspotSetting(value) {
  288. this._setWifiTetheringSetting(value);
  289. },
  290. set usbHotspotSetting(value) {
  291. this._setUsbTetheringSetting(value);
  292. }
  293. };
  294. return function ctor_hotspot() {
  295. return new Hotspot();
  296. };
  297. });