diff options
Diffstat (limited to 'apps/system/js/quick_settings.js')
-rw-r--r-- | apps/system/js/quick_settings.js | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/apps/system/js/quick_settings.js b/apps/system/js/quick_settings.js new file mode 100644 index 0000000..328bb35 --- /dev/null +++ b/apps/system/js/quick_settings.js @@ -0,0 +1,279 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- / +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ + +'use strict'; + +var QuickSettings = { + // Indicate setting status of geolocation.enabled + geolocationEnabled: false, + WIFI_STATUSCHANGE_TIMEOUT: 2000, + + init: function qs_init() { + var settings = window.navigator.mozSettings; + var conn = window.navigator.mozMobileConnection; + if (!settings || !conn) + return; + + this.getAllElements(); + + this.overlay.addEventListener('click', this); + window.addEventListener('utilitytrayshow', this); + + var self = this; + + /* + * Monitor data network icon + */ + conn.addEventListener('datachange', function qs_onDataChange() { + var label = { + 'lte': '4G', // 4G LTE + 'ehrpd': '4G', // 4G CDMA + 'hspa+': 'H+', // 3.5G HSPA+ + 'hsdpa': 'H', 'hsupa': 'H', 'hspa': 'H', // 3.5G HSDPA + 'evdo0': '3G', 'evdoa': '3G', 'evdob': '3G', '1xrtt': '3G', // 3G CDMA + 'umts': '3G', // 3G + 'edge': 'E', // EDGE + 'is95a': '2G', 'is95b': '2G', // 2G CDMA + 'gprs': '2G' + }; + self.data.dataset.network = label[conn.data.type]; + }); + + /* monitor data setting + * TODO prevent quickly tapping on it + */ + SettingsListener.observe('ril.data.enabled', true, function(value) { + if (value) { + self.data.dataset.enabled = 'true'; + } else { + delete self.data.dataset.enabled; + } + }); + + /* monitor bluetooth setting and initialization/disable ready event + * - when settings changed, update UI and lock toogle to prevent quickly + * tapping on it. + * - when got bluetooth initialization/disable ready, active toogle, so + * return the control to user. + */ + var btFirstSet = true; + SettingsListener.observe('bluetooth.enabled', true, function(value) { + // check self.bluetooth.dataset.enabled and value are identical + if ((self.bluetooth.dataset.enabled && value) || + (self.bluetooth.dataset.enabled === undefined && !value)) + return; + + if (value) { + self.bluetooth.dataset.enabled = 'true'; + } else { + delete self.bluetooth.dataset.enabled; + } + + // Set to the initializing state to block user interaction until the + // operation completes. (unless we are being called for the first time, + // where Bluetooth is already initialize + if (!btFirstSet) + self.bluetooth.dataset.initializing = 'true'; + btFirstSet = false; + }); + window.addEventListener('bluetooth-adapter-added', this); + window.addEventListener('bluetooth-disabled', this); + + + /* monitor wifi setting and initialization/disable ready event + * - when settings changed, update UI and lock toogle to prevent quickly + * tapping on it. + * - when got bluetooth initialization/disable ready, active toogle, so + * return the control to user. + */ + var wifiFirstSet = true; + SettingsListener.observe('wifi.enabled', true, function(value) { + // check self.wifi.dataset.enabled and value are identical + if ((self.wifi.dataset.enabled && value) || + (self.wifi.dataset.enabled === undefined && !value)) + return; + + if (value) { + self.wifi.dataset.enabled = 'true'; + } else { + delete self.wifi.dataset.enabled; + } + // Set to the initializing state to block user interaction until the + // operation completes. (unless we are being called for the first time, + // where Wifi is already initialize + if (!wifiFirstSet) + self.wifi.dataset.initializing = 'true'; + wifiFirstSet = false; + }); + window.addEventListener('wifi-enabled', this); + window.addEventListener('wifi-disabled', this); + window.addEventListener('wifi-statuschange', this); + + /* monitor geolocation setting + * TODO prevent quickly tapping on it + */ + SettingsListener.observe('geolocation.enabled', true, function(value) { + self.geolocationEnabled = value; + }); + + // monitor airplane mode + SettingsListener.observe('ril.radio.disabled', false, function(value) { + self.data.dataset.airplaneMode = value; + if (value) { + self.data.classList.add('quick-settings-airplane-mode'); + self.airplaneMode.dataset.enabled = 'true'; + } else { + self.data.classList.remove('quick-settings-airplane-mode'); + delete self.airplaneMode.dataset.enabled; + } + }); + }, + + handleEvent: function qs_handleEvent(evt) { + evt.preventDefault(); + switch (evt.type) { + case 'click': + switch (evt.target) { + case this.wifi: + // do nothing if wifi isn't ready + if (this.wifi.dataset.initializing) + return; + var enabled = !!this.wifi.dataset.enabled; + SettingsListener.getSettingsLock().set({ + 'wifi.enabled': !enabled + }); + if (!enabled) + this.toggleAutoConfigWifi = true; + break; + + case this.data: + if (this.data.dataset.airplaneMode !== 'true') { + // TODO should ignore the action if data initialization isn't done + var enabled = !!this.data.dataset.enabled; + + SettingsListener.getSettingsLock().set({ + 'ril.data.enabled': !enabled + }); + } + + break; + + case this.bluetooth: + // do nothing if bluetooth isn't ready + if (this.bluetooth.dataset.initializing) + return; + + var enabled = !!this.bluetooth.dataset.enabled; + SettingsListener.getSettingsLock().set({ + 'bluetooth.enabled': !enabled + }); + break; + + case this.airplaneMode: + var enabled = !!this.airplaneMode.dataset.enabled; + SettingsListener.getSettingsLock().set({ + 'ril.radio.disabled': !enabled + }); + break; + + case this.fullApp: + // XXX: This should be replaced probably by Web Activities + var host = document.location.host; + var domain = host.replace(/(^[\w\d]+\.)?([\w\d]+\.[a-z]+)/, '$2'); + var protocol = document.location.protocol + '//'; + Applications.getByManifestURL(protocol + 'settings.' + + domain + '/manifest.webapp').launch(); + + UtilityTray.hide(); + break; + } + break; + + case 'utilitytrayshow': + break; + + // unlock bluetooth toggle + case 'bluetooth-adapter-added': + case 'bluetooth-disabled': + delete this.bluetooth.dataset.initializing; + break; + // unlock wifi toggle + case 'wifi-enabled': + delete this.wifi.dataset.initializing; + if (this.toggleAutoConfigWifi) { + // Check whether it found a wifi to connect after a timeout. + this.wifiStatusTimer = setTimeout(this.autoConfigWifi.bind(this), + this.WIFI_STATUSCHANGE_TIMEOUT); + } + break; + case 'wifi-disabled': + delete this.wifi.dataset.initializing; + if (this.toggleAutoConfigWifi) { + clearTimeout(this.wifiStatusTimer); + this.wifiStatusTimer = null; + this.toggleAutoConfigWifi = false; + } + break; + + case 'wifi-statuschange': + if (this.toggleAutoConfigWifi && !this.wifi.dataset.initializing) + this.autoConfigWifi(); + break; + } + }, + + getAllElements: function qs_getAllElements() { + // ID of elements to create references + var elements = ['wifi', 'data', 'bluetooth', 'airplane-mode', 'full-app']; + + var toCamelCase = function toCamelCase(str) { + return str.replace(/\-(.)/g, function replacer(str, p1) { + return p1.toUpperCase(); + }); + }; + + elements.forEach(function createElementRef(name) { + this[toCamelCase(name)] = + document.getElementById('quick-settings-' + name); + }, this); + + this.overlay = document.getElementById('quick-settings'); + }, + + // XXX Break down obj keys in a for each loop because mozSettings + // does not currently supports multiple keys in one set() + // https://bugzilla.mozilla.org/show_bug.cgi?id=779381 + setMozSettings: function qs_setter(keypairs) { + var setlock = SettingsListener.getSettingsLock(); + for (var key in keypairs) { + var obj = {}; + obj[key] = keypairs[key]; + setlock.set(obj); + } + }, + + /* Auto-config wifi if user enabled wifi from quick settings bar. + * If there are no known networks around, wifi settings page + * will be opened. Otherwise nothing will be done. + */ + autoConfigWifi: function qs_autoConfigWifi() { + clearTimeout(this.wifiStatusTimer); + this.wifiStatusTimer = null; + this.toggleAutoConfigWifi = false; + + var wifiManager = window.navigator.mozWifiManager; + var status = wifiManager.connection.status; + + if (status == 'disconnected') { + var activity = new MozActivity({ + name: 'configure', + data: { + target: 'device', + section: 'wifi' + } + }); + } + } +}; + +QuickSettings.init(); |