Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/apps/system/js/quick_settings.js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/system/js/quick_settings.js')
-rw-r--r--apps/system/js/quick_settings.js279
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();