Publish Vulpes Preview 15 sources for desktop, Android and Tundra

Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
OverSu 2026-09-30 23:13:03 +02:00
commit b38dea0597
25901 changed files with 9982925 additions and 369 deletions

View file

@ -0,0 +1,21 @@
define(['require','modules/navigator/mozApps','modules/app','modules/apps_cache','modules/mvvm/observable_array','shared/addons/match_pattern'],function(require){'use strict';var mozApps=require('modules/navigator/mozApps');var App=require('modules/app');var AppsCache=require('modules/apps_cache');var ObservableArray=require('modules/mvvm/observable_array');var MatchPattern=require('shared/addons/match_pattern');function AddonManager(){this._addons=ObservableArray([]);this._bindEvents();AppsCache.apps().then((apps)=>{apps.some((app)=>{if(this._isAddon(app)){this._addons.push(App(app));}});});}
AddonManager.prototype={_bindEvents:function(){var _boundUpdateAddons=this._updateAddons.bind(this);AppsCache.addEventListener('oninstall',(evt)=>{var app=evt&&evt.application;if(this._isAddon(app)){_boundUpdateAddons(evt);}else{app.addEventListener('downloadsuccess',_boundUpdateAddons);}});AppsCache.addEventListener('onuninstall',_boundUpdateAddons);mozApps.mgmt.addEventListener('enabledstatechange',_boundUpdateAddons);},_updateAddons:function(evt){var app=evt&&evt.application;var type=evt.type;var index;if(this._isAddon(app)){if((type==='downloadsuccess'||type==='install')&&!this._alreadyExists(app)){this._addons.push(App(app));}else if(type==='uninstall'){index=this._findAddonIndex(app);if(index!==-1){this._addons.splice(index,1);}}else if(type==='enabledstatechange'){index=this._findAddonIndex(app);if(index!==-1){this._addons.get(index)._enabled=app.enabled;}}}},_alreadyExists:function(addon){return this._findAddonIndex(addon)!==-1;},_findAddonIndex:function(addon){return this._addons.array.findIndex((elem)=>{return addon.manifestURL===elem.instance.manifestURL;});},_privilegeCheck:function(addon,app){var addonManifest=this._getManifest(addon);var appManifest=this._getManifest(app);return addonManifest.type===appManifest.type||addonManifest.type==='certified'||addonManifest.type==='privileged';},_getManifest:function(app){return app.manifest||app.updateManifest;},_needsReboot:function({app,contentScripts}){var manifest=this._getManifest(app);var role=manifest.role;if(role==='system'||role==='homescreen'){return contentScripts.some(c=>c.js.length>0);}else{return false;}},_needsRestart:function({app,contentScripts}){return contentScripts.some(c=>c.js.length>0);},_isAddon:function(app){var manifest=this._getManifest(app);return manifest&&manifest.role==='addon';},_getAffectedApps:function(addon){if(!this._isAddon(addon)){return Promise.reject('not an addon');}
var manifest=this._getManifest(addon);var customizations=manifest&&manifest.customizations;var contentScripts=manifest&&manifest.content_scripts;if(customizations){return Promise.resolve([]);}
if(!contentScripts||contentScripts.length===0){return Promise.resolve([]);}
return AppsCache.apps().then(apps=>apps.filter(app=>{var manifest=this._getManifest(app);return manifest.role!=='addon'&&this._privilegeCheck(addon,app);})).then(apps=>{var matches=[];apps.forEach(app=>{var matched;if((matched=this._matchContentScripts(contentScripts,app))){matches.push({app:app,contentScripts:matched});}});return matches;}).catch(()=>[]);},_matchContentScripts:function(contentScripts,app){var manifest=this._getManifest(app);var launchPath=manifest.launch_path||'';var launchURL=new URL(launchPath,app.origin);var patterns=contentScripts.map(contentScript=>{return{matches:new MatchPattern(contentScript.matches),excludeMatches:new MatchPattern(contentScript.exclude_matches)};});var appliedContentScripts=[];for(var i=0;i<patterns.length;i++){var pattern=patterns[i];if(!pattern.excludeMatches.matches(launchURL)&&pattern.matches.matches(launchURL)){appliedContentScripts.push(contentScripts[i]);break;}}
if(appliedContentScripts.length>0){return appliedContentScripts;}},_blobToArrayBuffer:function(blob){return new Promise(function(resolve,reject){var fileReader=new FileReader();fileReader.onload=function(){resolve(fileReader.result);};fileReader.onerror=function(reason){reject(reason);};fileReader.readAsArrayBuffer(blob);});},_unpackScript:function(arrayBuffer){return this._JSZip.then(JSZip=>{var zip=new JSZip();zip.load(arrayBuffer);var applicationZipFile=zip.file('application.zip');if(!applicationZipFile){return;}
var applicationZip=new JSZip();applicationZip.load(applicationZipFile.asArrayBuffer());var scriptFile=applicationZip.file('main.js');if(!scriptFile){return;}
return(scriptFile.asText());});},_generate:function(manifest,script){return this._JSZip.then(JSZip=>{var id='addon'+Math.round(Math.random()*100000000);var applicationZip=new JSZip();manifest.role='addon';manifest.type='certified';manifest.origin='app://'+id+'.gaiamobile.org';manifest.activities=manifest.activities||{};applicationZip.file('manifest.webapp',JSON.stringify(manifest));applicationZip.file('main.js',script);var packageZip=new JSZip();packageZip.file('metadata.json',JSON.stringify({installOrigin:'http://gaiamobile.org',manifestURL:'app://'+id+'.gaiamobile.org/update.webapp',version:1}));packageZip.file('update.webapp',JSON.stringify({name:manifest.name,package_path:'/application.zip'}));packageZip.file('application.zip',applicationZip.generate({type:'arraybuffer'}));return new Blob([packageZip.generate({type:'arraybuffer'})],{type:'application/zip'});});},get _JSZip(){return new Promise(resolve=>{require(['vendor/jszip'],resolve);});},_install:function(blob){return navigator.mozApps.mgmt.import(blob).then(addon=>{var app={instance:addon};this.enableAddon(app);return app;});},isEnabled:function(addon){return this._isAddon(addon.instance)&&addon.instance.enabled===true;},canDelete:function(addon){return this._isAddon(addon.instance)&&addon.instance.removable===true;},enableAddon:function(addon){if(this._isAddon(addon.instance)&&!addon.instance.enabled){mozApps.mgmt.setEnabled(addon.instance,true);}},disableAddon:function(addon){if(this._isAddon(addon.instance)&&addon.instance.enabled){mozApps.mgmt.setEnabled(addon.instance,false);}},deleteAddon:function(addon){if(!this._isAddon(addon.instance)){return Promise.reject('not an addon');}
if(!addon.instance.removable){return Promise.reject('addon is not deletable');}
return new Promise(function(resolve,reject){var request=mozApps.mgmt.uninstall(addon.instance);request.onsuccess=function(){resolve();};request.onerror=function(){reject();};});},renameAddon:function(addon,name){if(!name){return Promise.reject('no name given');}
if(!this._isAddon(addon.instance)){return Promise.reject('not an addon');}
var manifest=this._getManifest(addon.instance);if(name===manifest.name){return Promise.reject('name is unchanged');}
var newManifest,addonBlob;return addon.instance.export().then(blob=>{addonBlob=blob;newManifest=Object.assign({},manifest);newManifest.name=name;return this.deleteAddon(addon);}).then(()=>{return this._blobToArrayBuffer(addonBlob);}).then(this._unpackScript.bind(this)).then(script=>{return this._generate(newManifest,script);}).then(this._install.bind(this));},shareAddon:function(addon){if(!this._isAddon(addon.instance)){return Promise.reject('not an addon');}
return new Promise(function(resolve,reject){var activity=new window.MozActivity({name:'share',data:{type:'app',app:addon.instance.manifestURL}});activity.onsuccess=function(){resolve();};activity.onerror=function(){reject((activity.error&&activity.error.name)||'activity error');};});},getAddonTargets:function(addon){return this._getAffectedApps(addon.instance).then((affectedApps)=>{return affectedApps.map((x)=>x.app);});},getAddonDisableType:function(addon){return this._getAffectedApps(addon.instance).then((affectedApps)=>{var needsReboot=affectedApps.some(this._needsReboot.bind(this));if(needsReboot){return'reboot';}
var needsRestart=affectedApps.some(this._needsRestart.bind(this));if(needsRestart){return'restart';}
return'';});},findAddonByManifestURL:function(manifestURL){return AppsCache.apps().then(()=>{return this._addons.array.find((addon)=>{return addon.instance.manifestURL===manifestURL;});});},addonAffectsApp:function(addon,manifestURL){if(!manifestURL){return Promise.reject('No manifestURL given for an app');}
if(!this._isAddon(addon.instance)){return Promise.reject('not an addon');}
var manifest=this._getManifest(addon.instance);var customizations=manifest&&manifest.customizations;var contentScripts=manifest&&manifest.content_scripts;if(customizations){return Promise.resolve(false);}
if(!contentScripts||contentScripts.length===0){return Promise.resolve(false);}
return AppsCache.apps().then(apps=>apps.find(app=>app.manifestURL===manifestURL)).then(app=>app?this._matchContentScripts(contentScripts,app):undefined).then(appliedContentScripts=>!!appliedContentScripts).catch(()=>false);},get length(){return this._addons.length;},get addons(){return this._addons;}};return new AddonManager();});

View file

@ -0,0 +1,41 @@
define('modules/apn/apn_const',['require'],function(require){'use strict';var APN_TYPES=['default','mms','supl','dun','ims','fota'];var CP_APN_KEY='ril.data.cp.apns';var DEFAULT_APN_KEY='ril.data.default.apns';var CACHED_ICCIDS_KEY='apn.cached.iccids';var APN_LIST_KEY='apn.list';var APN_SELECTIONS_KEY='apn.selections';var APN_SETTINGS_KEY='ril.data.apnSettings';var DEFAULT_APN_SETTINGS_KEY='ril.data.default.apnSettings';var MCC_SETTINGS_KEY='operatorvariant.mcc';var MNC_SETTINGS_KEY='operatorvariant.mnc';var EU_ROAMING_ENABLED_KEY='eu-roaming.enabled';var EU_ROAMING_FILE_PATH='/resources/eu-roaming.json';var APN_PROPS=['carrier','apn','user','passwd','httpproxyhost','httpproxyport','mmsc','mmsproxy','mmsport','authtype','types','protocol','roaming_protocol','mtu','_id'];return{get APN_TYPES(){return APN_TYPES;},get CP_APN_KEY(){return CP_APN_KEY;},get DEFAULT_APN_KEY(){return DEFAULT_APN_KEY;},get CACHED_ICCIDS_KEY(){return CACHED_ICCIDS_KEY;},get APN_LIST_KEY(){return APN_LIST_KEY;},get APN_SELECTIONS_KEY(){return APN_SELECTIONS_KEY;},get APN_SETTINGS_KEY(){return APN_SETTINGS_KEY;},get DEFAULT_APN_SETTINGS_KEY(){return DEFAULT_APN_SETTINGS_KEY;},get MCC_SETTINGS_KEY(){return MCC_SETTINGS_KEY;},get MNC_SETTINGS_KEY(){return MNC_SETTINGS_KEY;},get EU_ROAMING_ENABLED_KEY(){return EU_ROAMING_ENABLED_KEY;},get EU_ROAMING_FILE_PATH(){return EU_ROAMING_FILE_PATH;},get APN_PROPS(){return APN_PROPS;}};});define('modules/apn/apn_item',['require'],function(require){'use strict';var APN_CATEGORY={PRESET:'preset',CUSTOM:'custom',EU:'eu'};function ApnItem(id,category,apn){this._id=id;this._category=category;this._apn=apn;}
ApnItem.prototype={get id(){return this._id;},get category(){return this._category;},get apn(){return this._apn;}};var constructor=function ctor_apn_item(id,category,apn){return new ApnItem(id,category,apn);};constructor.APN_CATEGORY=APN_CATEGORY;return constructor;});define('modules/apn/apn_utils',['require','modules/settings_cache','shared/apn_helper','modules/apn/apn_const','modules/apn/apn_item','shared/lazy_loader'],function(require){'use strict';var SettingsCache=require('modules/settings_cache');var ApnHelper=require('shared/apn_helper');var ApnConst=require('modules/apn/apn_const');var ApnItem=require('modules/apn/apn_item');var LazyLoader=require('shared/lazy_loader');var CP_APN_KEY=ApnConst.CP_APN_KEY;var DEFAULT_APN_KEY=ApnConst.DEFAULT_APN_KEY;var MCC_SETTINGS_KEY=ApnConst.MCC_SETTINGS_KEY;var MNC_SETTINGS_KEY=ApnConst.MNC_SETTINGS_KEY;var APN_PROPS=ApnConst.APN_PROPS;var EU_ROAMING_FILE_PATH=ApnConst.EU_ROAMING_FILE_PATH;function _getOperatorCode(serviceId,type){var value;var key;if(type==='mcc'){value='000';key=MCC_SETTINGS_KEY;}else if(type==='mnc'){value='00';key=MNC_SETTINGS_KEY;}else{return Promise.reject('invalid type');}
return new Promise(function(resolve,reject){SettingsCache.getSettings(function(results){var values=results[key];if(values&&Array.isArray(values)&&values[serviceId]){value=values[serviceId];}
resolve(value);});});}
function _apnTypeFilter(type,apnItem){if(!type||!apnItem||!apnItem.apn.types){return false;}else if(type==='*'){return true;}
return apnItem.apn.types.indexOf(type)!=-1;}
function _getDefaultApns(mcc,mnc,networkType){return new Promise(function(resolve,reject){SettingsCache.getSettings(function(results){var apns=results[DEFAULT_APN_KEY]||{};resolve(ApnHelper.getCompatible(apns,mcc,mnc,networkType));});});}
function _getCpApns(mcc,mnc,networkType){return new Promise(function(resolve,reject){SettingsCache.getSettings(function(results){var apns=results[CP_APN_KEY]||{};resolve(ApnHelper.getCompatible(apns,mcc,mnc,networkType));});});}
var _euApnChecked=false;var _euApns=null;function _getEuApns(){if(_euApnChecked){return Promise.resolve(_euApns);}else{return LazyLoader.getJSON(EU_ROAMING_FILE_PATH).then(function(result){_euApnChecked=true;if(result.home&&result.foreign&&Object.keys(result.home).length>0&&Object.keys(result.foreign).length>0){_euApns=result.defaultApns;}
return _euApns;}).catch(function(){_euApnChecked=true;return null;});}}
function _generateId(){return Math.random().toString(36).substr(2,9);}
function _cloneApn(apn){var newApn={};for(var p in apn){newApn[p]=apn[p];}
return newApn;}
function _separateApnsByType(apns){if(!apns){return[];}
return apns.reduce(function(result,apn){apn.types.forEach(function(type){var cloneApn=_cloneApn(apn);cloneApn.types=[type];result.push(cloneApn);});return result;},[]);}
function _isMatchedApn(apn1,apn2){if(apn1==null||apn2==null){return false;}
if(!apn1.types.every(function(type){return(apn2.types.indexOf(type)!==-1);})){return false;}
return APN_PROPS.every(function(prop){if(prop==='types'){return true;}else{return apn1[prop]===apn2[prop];}});}
function _sortByCategory(apn1,apn2){if(apn1.category===ApnItem.APN_CATEGORY.PRESET){return true;}else if(apn2.category===ApnItem.APN_CATEGORY.PRESET){return false;}else{return true;}}
function _clone(apn){return JSON.parse(JSON.stringify(apn));}
return{getOperatorCode:_getOperatorCode,apnTypeFilter:_apnTypeFilter,getDefaultApns:_getDefaultApns,getCpApns:_getCpApns,getEuApns:_getEuApns,generateId:_generateId,separateApnsByType:_separateApnsByType,isMatchedApn:_isMatchedApn,sortByCategory:_sortByCategory,clone:_clone};});define('modules/apn/apn_settings',['require','modules/settings_cache','modules/apn/apn_utils','modules/apn/apn_const'],function(require){'use strict';var SettingsCache=require('modules/settings_cache');var ApnUtils=require('modules/apn/apn_utils');var ApnConst=require('modules/apn/apn_const');var APN_SETTINGS_KEY=ApnConst.APN_SETTINGS_KEY;var DEFAULT_APN_SETTINGS_KEY=ApnConst.DEFAULT_APN_SETTINGS_KEY;function ApnSettings(){this._isReady=false;this._readyPromise=null;this._isWritingDB=false;this._isDirty=false;this._apnSettings=null;this._promiseChain=Promise.resolve();}
ApnSettings.prototype={_schedule:function al__schedule(task){var that=this;this._promiseChain=this._promiseChain.then(function(){return task().then(function(){return that._commit();});});return this._promiseChain;},_commit:function al__commit(){if(!this._isDirty){return Promise.resolve();}
var that=this;return new Promise(function(resolve){that._isWritingDB=true;var obj={};obj[APN_SETTINGS_KEY]=that._apnSettings;var req=navigator.mozSettings.createLock().set(obj);req.onsuccess=req.onerror=function(){that._isDirty=false;that._isWritingDB=false;resolve();};});},_addObservers:function as__registerListeners(){var mozSettings=window.navigator.mozSettings;if(!mozSettings){return;}
mozSettings.addObserver(APN_SETTINGS_KEY,function(event){if(!this._isWritingDB){this._apnSettings=event.settingValue||[];}}.bind(this));},_ready:function as__ready(){if(this._isReady){return Promise.resolve();}else{if(!this._readyPromise){var that=this;this._readyPromise=new Promise(function(resolve){SettingsCache.getSettings(function(results){that._isReady=true;that._apnSettings=results[APN_SETTINGS_KEY]||[];that._addObservers();resolve();});});}
return this._readyPromise;}},_update:function as__update(serviceId,apnType,newApn){return this._ready().then(function(){var apns=this._apnSettings[serviceId];if(!apns){apns=this._apnSettings[serviceId]=[];}
var index=apns.findIndex(function(apn){return apn.types.some((type)=>apnType===type);});if(index===-1){if(newApn){this._isDirty=true;apns.push(newApn);}}else{if(newApn){if(!ApnUtils.isMatchedApn(apns[index],newApn)){this._isDirty=true;apns[index]=newApn;}}else{this._isDirty=true;apns.splice(index,1);}}}.bind(this));},getAll:function as_getAll(serviceId){return this._ready().then(function(){return this._apnSettings[serviceId];}.bind(this));},get:function as_get(serviceId,apnType){return this._ready().then(function(){var apns=this._apnSettings[serviceId];if(apns){return apns.find((apn)=>apn.types.indexOf(apnType)>=0);}else{return null;}}.bind(this));},update:function as_update(serviceId,apnType,apn){var apnClone=ApnUtils.clone(apn);return this._schedule(this._update.bind(this,serviceId,apnType,apnClone));},restore:function as_restore(serviceId){var that=this;return this._ready().then(function(){return new Promise(function(resolve){SettingsCache.getSettings(function(results){resolve(results[DEFAULT_APN_SETTINGS_KEY]||[]);});});}).then(function(defaultApnSettings){return that._schedule(function(){that._isDirty=true;that._apnSettings[serviceId]=defaultApnSettings[serviceId];return Promise.resolve();});});}};return function ctor_apn_settings(){return new ApnSettings();};});define('modules/apn/apn_list',['require','modules/async_storage','modules/apn/apn_utils','modules/apn/apn_item'],function(require){'use strict';var AsyncStorage=require('modules/async_storage');var ApnUtils=require('modules/apn/apn_utils');var ApnItem=require('modules/apn/apn_item');function ApnList(key){this._key=key;this._apnItems=null;this._pendingTaskCount=0;this._promiseChain=Promise.resolve();}
ApnList.prototype={_schedule:function al__schedule(task){var that=this;this._promiseChain=this._promiseChain.then(function(){that._pendingTaskCount++;return task().then(function(result){that._pendingTaskCount--;if(that._pendingTaskCount===0){return that._commit().then(function(){return result;});}else{return result;}});});return this._promiseChain;},_export:function al__export(){return this._apnItems.map(function(apnItem){var apnClone=ApnUtils.clone(apnItem.apn);apnClone.id=apnItem.id;apnClone.category=apnItem.category;return apnClone;});},_commit:function al__commit(){if(!this._apnItems){return Promise.resolve();}else{var apns=this._export();return AsyncStorage.setItem(this._key,apns);}},_add:function al__add(apn,category){return this.items().then(function(apnItems){if(!apnItems){this._apnItems=apnItems=[];}
category=category||ApnItem.APN_CATEGORY.CUSTOM;if(category===ApnItem.APN_CATEGORY.CUSTOM){apn.carrier='_custom_';}
var apnItem=ApnItem(ApnUtils.generateId(),category,apn);apnItems.unshift(apnItem);return apnItem.id;}.bind(this));},_remove:function al__remove(id){return this.items().then(function(apnItems){if(!apnItems){return Promise.reject('no apn items');}
var index=apnItems.findIndex((apnItem)=>apnItem.id===id);if(index>=0){apnItems=apnItems.splice(index,1);}else{return Promise.reject('apn not found');}}.bind(this));},_update:function al__update(id,apn){return this.items().then(function(apnItems){if(!apnItems){return Promise.reject('no apn items');}
var index=apnItems.findIndex((apnItem)=>apnItem.id===id);if(index>=0){var currentApn=apnItems[index].apn;for(var p in apn){if(p==='id'||p==='category'){continue;}
currentApn[p]=apn[p];}}else{return Promise.reject('apn not found');}}.bind(this));},items:function al_items(){if(this._apnItems){return Promise.resolve(this._apnItems);}else{return AsyncStorage.getItem(this._key).then(function(apns){if(apns){this._apnItems=apns.map(function(apn){return ApnItem(apn.id,apn.category,apn);});return this._apnItems;}else{return null;}}.bind(this));}},item:function al_item(id){return this.items().then(function(apnItems){if(!apnItems||!id){return null;}else{return apnItems.find((apnItem)=>apnItem.id===id);}});},add:function al_apns(apn,category){var apnClone=ApnUtils.clone(apn);return this._schedule(this._add.bind(this,apnClone,category));},remove:function al_remove(id){return this._schedule(this._remove.bind(this,id));},update:function al_update(id,apn){var apnClone=ApnUtils.clone(apn);return this._schedule(this._update.bind(this,id,apnClone));}};return function ctor_apn_list(key){return new ApnList(key);};});define('modules/apn/apn_selections',['require','modules/mvvm/observable','modules/settings_cache','modules/apn/apn_const'],function(require){'use strict';var Observable=require('modules/mvvm/observable');var SettingsCache=require('modules/settings_cache');var ApnConst=require('modules/apn/apn_const');var ICC_COUNT=navigator.mozMobileConnections.length;var APN_TYPES=ApnConst.APN_TYPES;var APN_SELECTIONS_KEY=ApnConst.APN_SELECTIONS_KEY;function ApnSelections(){this._readyPromise=null;this._apnSelections=[];}
ApnSelections.prototype={_export:function as__export(){return this._apnSelections.map(function(apnSelection){var obj={};APN_TYPES.forEach(function(apnType){obj[apnType]=apnSelection[apnType];});return obj;});},_commit:function as__commit(){return new Promise(function(resolve){var obj={};obj[APN_SELECTIONS_KEY]=this._export();var req=navigator.mozSettings.createLock().set(obj);req.onsuccess=function(){resolve();};req.onerror=function(){console.error('write apn selections failed');resolve();};}.bind(this));},_observeApnSelections:function as__observeApnSelections(apnSelection){APN_TYPES.forEach(function(apnType){apnSelection.observe(apnType,this._commit.bind(this));},this);},_createEmptySelections:function as__createEmptySelections(){var emptySelections=[];var emptySelection={};APN_TYPES.forEach((apnType)=>emptySelection[apnType]=null);for(var i=0;i<ICC_COUNT;i++){emptySelections.push(emptySelection);}
return new Promise(function(resolve,reject){var obj={};obj[APN_SELECTIONS_KEY]=emptySelections;var req=navigator.mozSettings.createLock().set(obj);req.onsuccess=req.onerror=function(){resolve(emptySelections);};}.bind(this));},_ready:function as__ready(){if(!this._readyPromise){var that=this;this._readyPromise=new Promise(function(resolve){SettingsCache.getSettings(function(results){resolve(results[APN_SELECTIONS_KEY]);});}).then(function(apnSelections){if(apnSelections){return apnSelections;}else{return that._createEmptySelections();}}).then(function(apnSelections){apnSelections.forEach(function(selection,index){var observableApnSelection=Observable(selection);that._observeApnSelections(observableApnSelection);that._apnSelections[index]=observableApnSelection;});navigator.mozSettings.addObserver(APN_SELECTIONS_KEY,function(event){if(event.settingValue===null){that._readyPromise=null;}});});}
return this._readyPromise;},get:function as_get(serviceId){return this._ready().then(function(){return this._apnSelections[serviceId];}.bind(this));},clear:function as_clear(serviceId){var apnSelection=this._apnSelections[serviceId];if(!apnSelection){return Promise.resolve();}
return this._ready().then(function(){APN_TYPES.forEach(function(apnType){apnSelection[apnType]=null;});});}};return function(){return new ApnSelections();};});define('modules/apn/apn_settings_manager',['require','modules/async_storage','modules/apn/apn_const','modules/apn/apn_utils','modules/apn/apn_item','modules/apn/apn_settings','modules/apn/apn_list','modules/apn/apn_selections'],function(require){'use strict';var AsyncStorage=require('modules/async_storage');var ApnConst=require('modules/apn/apn_const');var ApnUtils=require('modules/apn/apn_utils');var ApnItem=require('modules/apn/apn_item');var ApnSettings=require('modules/apn/apn_settings');var ApnList=require('modules/apn/apn_list');var ApnSelections=require('modules/apn/apn_selections');var APN_TYPES=ApnConst.APN_TYPES;var APN_LIST_KEY=ApnConst.APN_LIST_KEY;var CACHED_ICCIDS_KEY=ApnConst.CACHED_ICCIDS_KEY;var RESTORE_MODE={ALL:0,ONLY_APN_ITEMS:1,};function ApnSettingsManager(){this._apnLists={};this._apnSelections=ApnSelections();this._apnSettings=ApnSettings();this._readyPromises={};Object.defineProperty(this,'RESTORE_MODE',{configurable:false,get:function(){return RESTORE_MODE;}});}
ApnSettingsManager.prototype={_ready:function asc_fromItems(serviceId){if(!this._readyPromises[serviceId]){this._readyPromises[serviceId]=AsyncStorage.getItem(CACHED_ICCIDS_KEY).then((cachedIccIds)=>{var cachedIccId=cachedIccIds&&cachedIccIds[serviceId];var curIccId=navigator.mozMobileConnections[serviceId].iccId;if(!curIccId||curIccId===cachedIccId){return;}
cachedIccIds=cachedIccIds||{};cachedIccIds[serviceId]=curIccId;return Promise.all([this.restore(serviceId,RESTORE_MODE.ONLY_APN_ITEMS),AsyncStorage.setItem(CACHED_ICCIDS_KEY,cachedIccIds)]);});}
return this._readyPromises[serviceId];},_deriveActiveApnIdFromItems:function asc_fromItems(serviceId,apnType){return this._apnItems(serviceId,apnType).then(function(apnItems){if(apnItems.length){return apnItems.sort(ApnUtils.sortByCategory)[0].id;}else{return null;}});},_deriveActiveApnIdFromSettings:function asc_deriveFromSettings(serviceId,apnType){return Promise.all([this._apnItems(serviceId,apnType),this._apnSettings.get(serviceId,apnType)]).then(function(results){var apnItems=results[0];var apnInUse=results[1];if(apnInUse){var matchedApnItem=apnItems.find(function(apnItem){return ApnUtils.isMatchedApn(apnItem.apn,apnInUse);});if(matchedApnItem){return matchedApnItem.id;}else{var category=(apnInUse.carrier==='_custom_')?ApnItem.APN_CATEGORY.CUSTOM:ApnItem.APN_CATEGORY.PRESET;return this.addApn(serviceId,apnInUse,category);}}else{return null;}}.bind(this));},_getApnAppliedType:function asc_getApnAppliedType(serviceId,apnId){return this._apnSelections.get(serviceId).then(function(apnSelection){return APN_TYPES.find((apnType)=>apnSelection[apnType]===apnId);}.bind(this));},_storeApnSettingByType:function asc_storeApnByType(serviceId,apnType){return this._apnSelections.get(serviceId).then(function(apnSelection){var apnList=this._apnList(serviceId);var apnId=apnSelection[apnType];if(apnId){return apnList.item(apnId);}}.bind(this)).then(function(apnItem){if(apnItem){return this._apnSettings.update(serviceId,apnType,apnItem.apn);}else{return this._apnSettings.update(serviceId,apnType,null);}}.bind(this));},_apnList:function asc_apnList(serviceId){var apnList=this._apnLists[serviceId];if(!apnList){this._apnLists[serviceId]=apnList=ApnList(APN_LIST_KEY+serviceId);}
return apnList;},_apnItems:function asc_apnItems(serviceId,apnType){return this._ready(serviceId).then(()=>{return this._apnList(serviceId).items();}).then((apnItems)=>{return apnItems&&apnItems.filter(ApnUtils.apnTypeFilter.bind(null,apnType))||[];});},_restoreApnItemsOfCategory:function asc_restoreApnItems(apnList,apnsForRestoring,category){return apnList.items().then(function(apnItems){apnItems=apnItems||[];var promises=[];apnItems.filter(function(apnItem){if(apnItem.category===category){return true;}}).forEach(function(apnItem){promises.push(apnList.remove(apnItem.id));});return Promise.all(promises);}).then(function(){var promises=[];apnsForRestoring.forEach(function(apns){promises.push(apnList.add(apns,category));});return Promise.all(promises);});},restore:function asc_restore(serviceId,mode){var mobileConnection=navigator.mozMobileConnections[serviceId];var networkType=mobileConnection.data.type;var apnList=this._apnList(serviceId);var that=this;return Promise.all([ApnUtils.getOperatorCode(serviceId,'mcc'),ApnUtils.getOperatorCode(serviceId,'mnc')]).then(function(values){var mcc=values[0];var mnc=values[1];return Promise.all([ApnUtils.getEuApns(),ApnUtils.getDefaultApns(mcc,mnc,networkType),ApnUtils.getCpApns(mcc,mnc,networkType)]);}).then(function(results){var euApns=ApnUtils.separateApnsByType(results[0]);var presetApns=ApnUtils.separateApnsByType(Array.prototype.concat.apply([],results.slice(1)));return that._restoreApnItemsOfCategory(apnList,euApns,ApnItem.APN_CATEGORY.EU).then(function(){return that._restoreApnItemsOfCategory(apnList,presetApns,ApnItem.APN_CATEGORY.PRESET);});}).then(function(){return that._apnSelections.clear(serviceId);}).then(function(){if(mode!==RESTORE_MODE.ONLY_APN_ITEMS){return that._apnSettings.restore(serviceId);}});},queryApns:function asc_queryApns(serviceId,apnType){return this.getActiveApnId(serviceId,apnType).then(function(activeApnId){return this._apnItems(serviceId,apnType).then(function(items){items.forEach(function(apnItem){apnItem.active=(apnItem.id===activeApnId);});return items;});}.bind(this));},addApn:function asc_addApn(serviceId,apn,category){return this._ready(serviceId).then(()=>{return this._apnList(serviceId).add(apn,category||ApnItem.APN_CATEGORY.CUSTOM);});},removeApn:function asc_removeApn(serviceId,id){return this._ready(serviceId).then(()=>{return this._apnList(serviceId).remove(id);}).then(()=>{return this._getApnAppliedType(serviceId,id);}).then((matchedApnType)=>{if(matchedApnType){return this._deriveActiveApnIdFromItems(serviceId,matchedApnType).then((activeApnId)=>{return this.setActiveApnId(serviceId,matchedApnType,activeApnId);});}});},updateApn:function asc_updateApn(serviceId,id,apn){return this._ready(serviceId).then(()=>{return this._apnList(serviceId).update(id,apn);}).then(()=>{return this._getApnAppliedType(serviceId,id);}).then((matchedApnType)=>{if(matchedApnType){return this._storeApnSettingByType(serviceId,matchedApnType);}});},getActiveApnId:function asc_getActiveApnId(serviceId,apnType){var that=this;return this._ready(serviceId).then(function(){return that._apnSelections.get(serviceId);}).then(function(apnSelection){return apnSelection&&apnSelection[apnType];}).then(function(activeApnId){if(activeApnId){return activeApnId;}else{return that._deriveActiveApnIdFromSettings(serviceId,apnType).then(function(apnId){that.setActiveApnId(serviceId,apnType,apnId);return apnId;});}}).then(function(activeApnId){if(activeApnId){return activeApnId;}else{return that._deriveActiveApnIdFromItems(serviceId,apnType).then(function(apnId){that.setActiveApnId(serviceId,apnType,apnId);return apnId;});}});},setActiveApnId:function asc_setActiveApnId(serviceId,apnType,id){return this._ready(serviceId).then(()=>{return this._apnSelections.get(serviceId);}).then((apnSelection)=>{if(apnSelection[apnType]!==id){apnSelection[apnType]=id;return this._storeApnSettingByType(serviceId,apnType);}});}};return new ApnSettingsManager();});

View file

@ -0,0 +1,2 @@
define(['require','modules/base/module','modules/mvvm/observable'],function(require){'use strict';var Module=require('modules/base/module');var Observable=require('modules/mvvm/observable');var App=Module.create(function App(app){this.super(Observable).call(this);this._app=app;this._enabled=app.enabled;}).extend(Observable);Observable.defineObservableProperty(App.prototype,'enabled',{readonly:true});Object.defineProperty(App.prototype,'instance',{enumerable:true,get:function(){return this._app;}});return App;});

View file

@ -0,0 +1,4 @@
define(['require','modules/base/module','modules/mvvm/observable'],function(require){'use strict';var Module=require('modules/base/module');var Observable=require('modules/mvvm/observable');var AppStorage=Module.create(function AppStorage(){this.super(Observable).call(this);this._appStorage=navigator.getDeviceStorage('apps');this._attachListeners();this._getSpaceInfo();}).extend(Observable);Observable.defineObservableProperty(AppStorage.prototype,'usedPercentage',{readonly:true,value:0});Observable.defineObservableProperty(AppStorage.prototype,'totalSize',{readonly:true,value:0});Observable.defineObservableProperty(AppStorage.prototype,'usedSize',{readonly:true,value:0});Observable.defineObservableProperty(AppStorage.prototype,'freeSize',{readonly:true,value:0});AppStorage.prototype.updateInfo=function as_updateInfo(){this._getSpaceInfo();};AppStorage.prototype._attachListeners=function as_attachListeners(){this._appStorage.addEventListener('change',this);};AppStorage.prototype.handleEvent=function as_handler(evt){switch(evt.type){case'change':this._getSpaceInfo();break;}};AppStorage.prototype._getSpaceInfo=function as_getSpaceInfo(){var deviceStorage=this._appStorage;if(!deviceStorage){console.error('Cannot get DeviceStorage for: app');return;}
deviceStorage.freeSpace().onsuccess=(e)=>{this._freeSize=e.target.result;deviceStorage.usedSpace().onsuccess=(e)=>{this._usedSize=e.target.result;this._totalSize=this._usedSize+this._freeSize;var usedPercentage=(this._totalSize===0)?0:(this._usedSize*100/this._totalSize);if(usedPercentage>100){usedPercentage=100;}
this._usedPercentage=usedPercentage;};};};return AppStorage();});

View file

@ -0,0 +1,5 @@
define(['require'],function(require){'use strict';var mozApps=window.navigator.mozApps;var mozAppsMgmt=mozApps&&mozApps.mgmt;var AppsCache=function(){this._initPromise=null;this._apps=[];this._eventHandlers={};this._eventHandlers.oninstall=[];this._eventHandlers.onuninstall=[];};AppsCache.prototype={apps:function am_apps(){var self=this;return this._init().then(function(){return self._apps;});},_init:function am__init(){var self=this;if(!this._initPromise){this._initPromise=this._initApps().then(function(){self._initEvents();});}
return this._initPromise;},_initEvents:function am__initEvents(){var self=this;mozAppsMgmt.oninstall=function(evt){var newApp=evt.application;var existing=false;self._apps.some((app,i)=>{if(app.manifestURL===newApp.manifestURL){self._apps[i]=newApp;existing=true;return true;}});if(!existing){self._apps.push(newApp);}
self._eventHandlers.oninstall.forEach(function(eventHandler){eventHandler(evt);});};mozAppsMgmt.onuninstall=function(evt){var manifestURL=evt.application.manifestURL;var appRemoved=false;self._apps=self._apps.filter(app=>{if(app.manifestURL===manifestURL){appRemoved=true;return false;}
return true;});if(appRemoved){self._eventHandlers.onuninstall.forEach(function(eventHandler){eventHandler(evt);});}};},_initApps:function am__initApps(){var self=this;var promise=new Promise(function(resolve,reject){var req=mozAppsMgmt.getAll();req.onsuccess=function success(evt){self._apps=evt.target.result;resolve(self._apps);};req.onerror=function error(evt){console.log('failed to get installed apps');reject(req.error);};});return promise;},addEventListener:function am_addEventListener(eventName,callback){if(this._eventHandlers[eventName]){this._eventHandlers[eventName].push(callback);}},removeEventListener:function am_removeEventListener(eventName,callback){if(this._eventHandlers[eventName]){var index=this._eventHandlers[eventName].indexOf(callback);if(index>=0){this._eventHandlers[eventName].splice(index,1);}}},};var appsCache=new AppsCache();return appsCache;});

View file

@ -0,0 +1,2 @@
define(['require','shared/async_storage'],function(require){'use strict';var AsyncStorage=require('shared/async_storage');return{getItem:function as_getItem(key){return new Promise(function(resolve,reject){AsyncStorage.getItem(key,resolve);});},setItem:function as_setItem(key,value){return new Promise(function(resolve,reject){AsyncStorage.setItem(key,value,resolve);});}};});

View file

@ -0,0 +1,5 @@
define(['require','modules/defer','modules/base/module','modules/mvvm/observable'],function(require){'use strict';var Defer=require('modules/defer');var Module=require('modules/base/module');var Observable=require('modules/mvvm/observable');var TaskScheduler=Module.create(function TaskScheduler(){this.super(Observable).call(this);this.isLocked=false;this._tasks=[];}).extend(Observable);Observable.defineObservableProperty(TaskScheduler.prototype,'isLocked',{value:false});const TASK_TYPE={GENERAL:0};Object.defineProperty(TaskScheduler,'TASK_TYPE',{enumerable:true,configurable:false,get:function(){return TASK_TYPE;}});TaskScheduler.prototype._lock=function(){this.isLocked=true;};TaskScheduler.prototype._unlock=function(){this.isLocked=false;this._executeNextTask();};TaskScheduler.prototype._removeRedundantTasks=function(type){return this._tasks.filter((task)=>{if(!task.cancelable){return true;}else{return task.type!==type;}});};TaskScheduler.prototype._executeNextTask=function(){if(this.isLocked){return;}
var nextTask=this._tasks.shift();if(nextTask){this._lock();return nextTask.func().then((result)=>{nextTask.defer.resolve(result);this._unlock();},()=>{nextTask.defer.reject();this._unlock();});}};TaskScheduler.prototype.enqueue=function(task){var defer=Defer();if(!task.func){return Promise.resolve();}
if(!task.type){task=Object.assign({},task);task.type=TaskScheduler.TASK_TYPE.GENERAL;}
task.defer=defer;this._tasks=this._removeRedundantTasks(task.type);this._tasks.push(task);this._executeNextTask();return defer.promise;};return TaskScheduler;});

View file

@ -0,0 +1,2 @@
define(['require','modules/navigator/battery','modules/base/module','modules/mvvm/observable'],function(require){'use strict';var NavigatorBattery=require('modules/navigator/battery');var Module=require('modules/base/module');var Observable=require('modules/mvvm/observable');var Battery=Module.create(function Battery(){this.super(Observable).call(this);this._level=this._getLevel();this._state=this._getState();this._chargingTime=this._getChargingTime();this._dischargingTime=this._getDischargingTime();NavigatorBattery.addEventListener('levelchange',()=>{this._level=this._getLevel();});NavigatorBattery.addEventListener('chargingchange',()=>{this._state=this._getState();this._chargingTime=this._getChargingTime();this._dischargingTime=this._getDischargingTime();});NavigatorBattery.addEventListener('chargingtimechange',()=>{this._chargingTime=this._getChargingTime();});NavigatorBattery.addEventListener('dischargingtimechange',()=>{this._dischargingTime=this._getDischargingTime();});}).extend(Observable);Observable.defineObservableProperty(Battery.prototype,'level',{readonly:true,value:''});Observable.defineObservableProperty(Battery.prototype,'state',{readonly:true,value:''});Observable.defineObservableProperty(Battery.prototype,'chargingTime',{readonly:true,value:''});Observable.defineObservableProperty(Battery.prototype,'dischargingTime',{readonly:true,value:''});Battery.prototype._getLevel=function(){return Math.min(100,Math.round(NavigatorBattery.level*100));};Battery.prototype._getState=function(){if(NavigatorBattery.charging){return(this._getLevel()==100)?'charged':'charging';}else{return'unplugged';}};Battery.prototype._getChargingTime=function(){return NavigatorBattery.chargingTime;};Battery.prototype._getDischargingTime=function(){return NavigatorBattery.dischargingTime;};return Battery();});

View file

@ -0,0 +1,5 @@
define(['require','modules/navigator/mozBluetooth','modules/mvvm/observable'],function(require){'use strict';var NavigatorBluetooth=require('modules/navigator/mozBluetooth');var Observable=require('modules/mvvm/observable');var _debug=false;var debug=function(){};if(_debug){debug=function btam_debug(msg){console.log('--> [BluetoothAdapterManager]: '+msg);};}
var BluetoothAdapterManager={defaultAdapter:null,_init:function btam__init(){if(!NavigatorBluetooth){return;}
this._watchMozBluetoothAttributechanged();this._initDefaultAdapter();},_watchMozBluetoothAttributechanged:function btam__watchMozBluetoothAttributechanged(){NavigatorBluetooth.addEventListener('attributechanged',(evt)=>{for(var i in evt.attrs){switch(evt.attrs[i]){case'defaultAdapter':this.defaultAdapter=NavigatorBluetooth.defaultAdapter;debug('_watchMozBluetoothAttributechanged(): '+'this.defaultAdapter = '+this.defaultAdapter);break;default:break;}}});},_initDefaultAdapter:function btam__initDefaultAdapter(){this.defaultAdapter=NavigatorBluetooth.defaultAdapter;debug('_initDefaultAdapter(): this.defaultAdapter = '+
this.defaultAdapter);}};var bluetoothAdapterManager=Observable(BluetoothAdapterManager);bluetoothAdapterManager._init();return bluetoothAdapterManager;});

View file

@ -0,0 +1,3 @@
define([],function(){'use strict';var _debug=false;var debug=function(){};if(_debug){debug=function btcodm_debug(msg){console.log('--> [BluetoothCODMapper]: '+msg);};}
var MinorDeviceClasses={Computer:{0:'computer',1:'computer',2:'computer',3:'computer',4:'pda',5:'pda',6:'computer',7:'computer',reserved:'computer'},Phone:{0:'phone',1:'phone',2:'phone',3:'phone',4:'modem',5:'phone',reserved:'phone'},AudioVideo:{0:'audio-card',1:'audio-card',2:'audio-card',4:'audio-input-microphone',5:'audio-card',6:'audio-card',7:'audio-card',8:'audio-card',9:'audio-card',10:'audio-card',11:'camera-video',12:'camera-video',13:'camera-video',14:'video-display',15:'video-display',16:'video-display',18:'audio-card',reserved:'audio-card'},Peripheral:{1:'input-gaming',2:'input-gaming',16:'input-keyboard',17:'input-keyboard',18:'input-keyboard',19:'input-keyboard',20:'input-keyboard',21:'input-keyboard',22:'input-keyboard',23:'input-keyboard',24:'input-keyboard',25:'input-keyboard',26:'input-keyboard',27:'input-keyboard',28:'input-keyboard',29:'input-keyboard',30:'input-keyboard',31:'input-keyboard',32:'input-mouse',33:'input-mouse',34:'input-mouse',35:'input-mouse',36:'input-mouse',37:'input-tablet',38:'input-mouse',39:'input-mouse',40:'input-mouse',41:'input-mouse',42:'input-mouse',43:'input-mouse',44:'input-mouse',45:'input-mouse',46:'input-mouse',47:'input-mouse'},Imaging:{4:'video-display',8:'camera-photo',16:'scanner',32:'printer'}};var MajorDeviceClasses={1:MinorDeviceClasses.Computer,2:MinorDeviceClasses.Phone,3:'network-wireless',4:MinorDeviceClasses.AudioVideo,5:MinorDeviceClasses.Peripheral,6:MinorDeviceClasses.Imaging};var BluetoothClassOfDeviceMapper={getDeviceType:function btcodm_getDeviceType(cod){debug('cod.majorDeviceClass = '+cod.majorDeviceClass);debug('cod.majorServiceClass = '+cod.majorServiceClass);debug('cod.minorDeviceClass = '+cod.minorDeviceClass);var deviceType='';var majorDeviceClass=MajorDeviceClasses[cod.majorDeviceClass];debug('majorDeviceClass = '+majorDeviceClass);if(typeof(majorDeviceClass)==='object'){deviceType=majorDeviceClass[cod.minorDeviceClass]||majorDeviceClass.reserved||'';debug('return in minor class, type = '+deviceType);return deviceType;}else if(typeof(majorDeviceClass)==='string'){debug('return in major class, type = network-wireless');return majorDeviceClass;}else if(cod.majorServiceClass&0x100){deviceType='audio-card';debug('return in major service class, type = audio-card');return deviceType;}else{debug('not mapping in any class, return type = '+deviceType);return deviceType;}}};return BluetoothClassOfDeviceMapper;});

View file

@ -0,0 +1,42 @@
define(['require','modules/bluetooth/bluetooth_adapter_manager','shared/async_storage'],function(require){'use strict';var AdapterManager=require('modules/bluetooth/bluetooth_adapter_manager');var AsyncStorage=require('shared/async_storage');var _debug=false;var debug=function(){};if(_debug){debug=function btam_debug(msg){console.log('--> [BluetoothConnectionManager]: '+msg);};}
var BluetoothConnectionManager={Profiles:{'hfp':0x111E,'a2dp':0x110D},connectingAddress:null,_connectedDevicesInfo:{},_getConnectedDevicesPromise:null,_listeners:{'connecting':[],'connected':[],'disconnected':[],'profileChanged':[]},_defaultAdapter:null,_init:function btcm__init(){AdapterManager.observe('defaultAdapter',this._onDefaultAdapterChanged.bind(this));this._onDefaultAdapterChanged(AdapterManager.defaultAdapter);},_onDefaultAdapterChanged:function btcm__onDefaultAdapterChanged(newAdapter,oldAdapter){debug('_onDefaultAdapterChanged(): newAdapter = '+newAdapter);debug('_onDefaultAdapterChanged(): oldAdapter = '+oldAdapter);this._defaultAdapter=newAdapter;if(oldAdapter){this._unwatchProfilesStatuschanged(oldAdapter);this._unwatchDefaultAdapterOnattributechanged(oldAdapter);}
if(newAdapter){this._watchProfilesStatuschanged(newAdapter);this._watchDefaultAdapterOnattributechanged(newAdapter);if(newAdapter.state==='enabled'){this._restoreConnection();}}else{this._resetConnectionInfo();}},getConnectedDevices:function btcm_getConnectedDevices(){if(!this._getConnectedDevicesPromise){this._getConnectedDevicesPromise=this._initConnectedDevicesInfo().then(()=>{debug('getConnectedDevices(): resolved with latest cache = '+
JSON.stringify(this._connectedDevicesInfo));return this._connectedDevicesInfo;},(reason)=>{debug('getConnectedDevices(): rejected with reason = '+reason);this._getConnectedDevicesPromise=null;});}
return this._getConnectedDevicesPromise;},_initConnectedDevicesInfo:function btcm__initConnectedDevicesInfo(){if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
return this._getConnectedDevicesFromPlatform().then((connectedDevicesByProfile)=>{this._constructDeviceItemsMap(connectedDevicesByProfile);},(reason)=>{debug('_initConnectedDevicesInfo(): rejected in '+'_getConnectedDevicesFromPlatform');return Promise.reject(reason);});},_constructDeviceItemsMap:function btcm__constructDeviceItemsMap(connectedDevices){debug('_constructDeviceItemsMap(): connectedDevices = '+
JSON.stringify(connectedDevices));if(!connectedDevices){debug('_constructDeviceItemsMap(): early return with empty object');return;}
Object.keys(this.Profiles).map((profileID)=>{connectedDevices[profileID].forEach((connectedDevice)=>{var connectionDeviceInfo={address:connectedDevice.address,connected:true,profileID:profileID,device:connectedDevice};debug('_constructDeviceItemsMap(): connectionDeviceInfo = '+
JSON.stringify(connectionDeviceInfo));this._initConnectedDevicesCache(connectionDeviceInfo);});});},_initConnectedDevicesCache:function btcm__initConnectedDevicesCache(options){debug('_initConnectedDevicesCache(): options = '+
JSON.stringify(options));var info=this._connectedDevicesInfo[options.address];if(info){info.connectedProfiles[options.profileID]=options.connected;}else{var connectedDevice=(options.device)?options.device:null;info={'device':connectedDevice,'connectedProfiles':{}};info.connectedProfiles[options.profileID]=options.connected;}
this._connectedDevicesInfo[options.address]=info;var dataToCheckConnectedProfile={address:options.address,connectedDevices:this._connectedDevicesInfo};if(!this._hasConnectedProfileByAddress(dataToCheckConnectedProfile)){delete this._connectedDevicesInfo[options.address];}
debug('_initConnectedDevicesCache(): this._connectedDevicesInfo = '+
JSON.stringify(this._connectedDevicesInfo));return this._connectedDevicesInfo;},_updateConnectedDevices:function btcm__updateConnectedDevices(options){return this.getConnectedDevices().then((connectedDevicesInfo)=>{debug('_updateConnectedDevices(): connectedDevicesInfo = '+
JSON.stringify(connectedDevicesInfo));var info=(connectedDevicesInfo)?connectedDevicesInfo[options.address]:null;if(info){info.connectedProfiles[options.profileID]=options.connected;}else{var connectedDevice=(options.device)?options.device:null;info={'device':connectedDevice,'connectedProfiles':{}};info.connectedProfiles[options.profileID]=options.connected;}
this._connectedDevicesInfo[options.address]=info;var dataToCheckConnectedProfile={address:options.address,connectedDevices:this._connectedDevicesInfo};if(!this._hasConnectedProfileByAddress(dataToCheckConnectedProfile)){delete this._connectedDevicesInfo[options.address];}
debug('_updateConnectedDevices(): this._connectedDevicesInfo = '+
JSON.stringify(this._connectedDevicesInfo));return Promise.resolve(this._connectedDevicesInfo);},()=>{debug('_updateConnectedDevices(): rejected with some exception');return Promise.reject('rejected with some exception');});},_resetConnectionInfo:function btcm__resetConnectionInfo(){this.connectingAddress=null;this._getConnectedDevicesPromise=null;},_watchDefaultAdapterOnattributechanged:function btcm__watchDefaultAdapterOnattributechanged(adapter){adapter.addEventListener('attributechanged',this._onAdapterAttributeChanged.bind(this,adapter));},_unwatchDefaultAdapterOnattributechanged:function btcm__unwatchDefaultAdapterOnattributechanged(adapter){adapter.removeEventListener('attributechanged',this._onAdapterAttributeChanged);},_onAdapterAttributeChanged:function btcm__onAdapterAttributeChanged(adapter,evt){for(var i in evt.attrs){debug('_onAdapterAttributeChanged(): '+evt.attrs[i]);switch(evt.attrs[i]){case'state':if(adapter.state==='enabled'){this._restoreConnection();}
break;default:break;}}},_watchProfilesStatuschanged:function btcm__watchProfilesStatuschanged(adapter){var eventName;for(var profileID in this.Profiles){eventName='on'+profileID+'statuschanged';adapter[eventName]=this._onProfileStatuschangeHandler.bind(this,profileID);}},_unwatchProfilesStatuschanged:function btc__unwatchProfilesStatuschanged(adapter){var eventName;for(var profileID in this.Profiles){eventName='on'+profileID+'statuschanged';adapter[eventName]=null;}},_onProfileStatuschangeHandler:function btcm__onProfileStatuschangeHandler(profileID,evt){debug('_onProfileStatuschangeHandler(): profileID = '+profileID+', evt.address = '+evt.address+', evt.status = '+evt.status);var options={address:evt.address,connected:evt.status,profileID:profileID};this._updateConnectionStatus(options);},_restoreConnection:function btcm__restoreConnection(){if(!this._defaultAdapter){return;}
AsyncStorage.getItem('device.connected',(address)=>{if(!address){return;}
this.getConnectedDevices().then((connectedDevices)=>{if(connectedDevices&&connectedDevices[address]){debug('_restoreConnection(): early return cause connected already');return;}
var restoreDevice=this._getPairedDeviceByAddress(address);if(restoreDevice){this.connectingAddress=restoreDevice.address;var event={type:'connecting',detail:{address:restoreDevice.address}};this._emitEvent(event);this._connect(restoreDevice).then(()=>{debug('_restoreConnection(): restore connection successfully');},(reason)=>{debug('_restoreConnection(): restore connection failed, '+'reason = '+reason);this.connectingAddress=null;event={type:'disconnected',detail:{address:restoreDevice.address}};this._emitEvent(event);});}});});},_recordConnection:function btcm__recordConnection(action,address){if(action==='set'){AsyncStorage.setItem('device.connected',address);debug('_recordConnection(): set item');}else if((action==='remove')&&(this._defaultAdapter.state==='enabled')){AsyncStorage.removeItem('device.connected');debug('_recordConnection(): remove item');}},_updateConnectionStatus:function btcm___updateConnectionStatus(options){debug('_updateConnectionStatus(): address = '+options.address+', connected = '+options.connected+', profileID = '+options.profileID);this.connectingAddress=null;this._updateConnectedDevices(options).then((connectedDevicesInfo)=>{debug('_updateConnectionStatus(): _updateConnectedDevices() '+'resolved with connectedDevicesInfo = '+
JSON.stringify(connectedDevicesInfo));var dataToCheckConnectedProfile={address:options.address,connectedDevices:connectedDevicesInfo};var event;if(options.connected){event={type:'connected',detail:{address:options.address}};this._emitEvent(event);this._recordConnection('set',options.address);}else{if(!this._hasConnectedProfileByAddress(dataToCheckConnectedProfile)){if(this._defaultAdapter.state==='enabled'){this._recordConnection('remove');}
event={type:'disconnected',detail:{address:options.address}};this._emitEvent(event);}}
var newProfiles;if(!this._hasConnectedProfileByAddress(dataToCheckConnectedProfile)){newProfiles=null;}else{newProfiles=connectedDevicesInfo[options.address].connectedProfiles;}
event={type:'profileChanged',detail:{address:options.address,profiles:newProfiles}};this._emitEvent(event);},(reason)=>{debug('_updateConnectionStatus(): miss to update in rejected case, '+'reason = '+reason);});},connect:function btcm_connect(device){if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
debug('connect(): Want to connect device address = '+device.address+', name = '+device.name);var connectedDevices=[];return this.getConnectedDevices().then((connectedDevicesInfo)=>{for(var address in connectedDevicesInfo){if(connectedDevicesInfo[address].device!==null){connectedDevices.push(connectedDevicesInfo[address].device);debug('connect(): push device cache in queue = '+
JSON.stringify(connectedDevices));}else{var regetPairedDevice=this._getPairedDeviceByAddress(address);connectedDevices.push(regetPairedDevice);debug('connect(): push _getPairedDeviceByAddress in queue = '+
JSON.stringify(regetPairedDevice));}}
debug('connect(): Will disconnect these connected devices = '+
JSON.stringify(connectedDevices));return Promise.all(connectedDevices.map((connectedDevice)=>{return this.disconnect(connectedDevice);})).then(()=>{debug('connect(): Start to connect with wanted device address = '+
device.address);return this._connect(device).then(()=>{debug('connect(): Resolved');},(reason)=>{debug('connect(): reason = '+reason);return Promise.reject(reason);});});});},_connect:function btcm__connect(device){if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
this.connectingAddress=device.address;var event={type:'connecting',detail:{address:device.address}};this._emitEvent(event);debug('_connect(): before start to connect, stop discovery first');return this._defaultAdapter.stopDiscovery().then(()=>{debug('_connect(): start connecting device, '+'address = '+device.address);return this._defaultAdapter.connect(device).then(()=>{debug('_connect(): resolve, already connected with address = '+
device.address);},()=>{this.connectingAddress=null;event={type:'disconnected',detail:{address:device.address}};this._emitEvent(event);debug('_connect(): reject with connection failed');return Promise.reject('connection failed');});},()=>{this.connectingAddress=null;event={type:'disconnected',detail:{address:device.address}};this._emitEvent(event);debug('_connect(): reject with stop discovery failed');return Promise.reject('stop discovery failed');});},disconnect:function btcm_disconnect(device){if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
return this._defaultAdapter.disconnect(device).then(()=>{debug('disconnect(): onsuccess(): resolve');},()=>{debug('disconnect(): onerror(): reject with disconnect failed');return Promise.reject('disconnect failed');});},_getConnectedDevicesFromPlatform:function btcm__getConnectedDevicesFromPlatform(){return Promise.all(Object.keys(this.Profiles).map((profile)=>{return this._getConnectedDevicesByProfile(this.Profiles[profile]);})).then((connectedDevices)=>{var collectedConnectedDevicesByProfile={};Object.keys(this.Profiles).forEach((profile,index)=>{collectedConnectedDevicesByProfile[profile]=connectedDevices[index];});debug('_getConnectedDevicesFromPlatform(): '+'collectedConnectedDevicesByProfile = '+
JSON.stringify(collectedConnectedDevicesByProfile));return Promise.resolve(collectedConnectedDevicesByProfile);});},_getConnectedDevicesByProfile:function btcm__getConnectedDevicesByProfile(profileID){if(!this._defaultAdapter){debug('_getConnectedDevicesByProfile(): reject with no adapter');return Promise.reject('default adapter is not existed!!');}
if(this._defaultAdapter.state==='disabled'){debug('_getConnectedDevicesByProfile(): resolve with empty array '+'since it is impossible to connect with any device');return Promise.reject('getConnectedDevices in disabled state');}
return this._defaultAdapter.getConnectedDevices(profileID).then((connectedDevice)=>{debug('_getConnectedDevicesByProfile(): resolved with '+'connectedDevice = '+JSON.stringify(connectedDevice));return Promise.resolve(connectedDevice||[]);},(reason)=>{debug('_getConnectedDevicesByProfile(): rejected with '+'reason = '+reason);return Promise.reject(reason);});},_getPairedDeviceByAddress:function btcm__getPairedDeviceByAddress(address){if(!this._defaultAdapter){return null;}
var pairedDevices=this._defaultAdapter.getPairedDevices();if(pairedDevices.length===0){return null;}else{for(var i in pairedDevices){if(pairedDevices[i].address===address){return pairedDevices[i];}}
return null;}},_hasConnectedProfileByAddress:function btcm__hasConnectedProfileByAddress(options){if(!options.connectedDevices[options.address]){return false;}
var hasConnectedProfile=false;for(var profileID in this.Profiles){var connectedProfiles=options.connectedDevices[options.address].connectedProfiles;if(connectedProfiles&&(connectedProfiles[profileID]===true)){hasConnectedProfile=true;}}
return hasConnectedProfile;},_emitEvent:function btcm__emitEvent(options){this._listeners[options.type].forEach(function(listener){listener(options);});},addEventListener:function btcm_addEventListener(eventName,callback){if(callback&&(this._listeners.hasOwnProperty(eventName))){this._listeners[eventName].push(callback);}},removeEventListener:function btcm_removeEventListener(eventName,callback){if(callback&&(this._listeners.hasOwnProperty(eventName))){var index=this._listeners[eventName].indexOf(callback);if(index>=0){this._listeners[eventName].splice(index,1);}}}};BluetoothConnectionManager._init();return BluetoothConnectionManager;});

View file

@ -0,0 +1,27 @@
define(['require','modules/bluetooth/bluetooth_adapter_manager','modules/bluetooth/bluetooth_device','modules/bluetooth/bluetooth_connection_manager','modules/mvvm/observable','modules/mvvm/observable_array','modules/settings_cache'],function(require){'use strict';var AdapterManager=require('modules/bluetooth/bluetooth_adapter_manager');var BtDevice=require('modules/bluetooth/bluetooth_device');var ConnectionManager=require('modules/bluetooth/bluetooth_connection_manager');var Observable=require('modules/mvvm/observable');var ObservableArray=require('modules/mvvm/observable_array');var SettingsCache=require('modules/settings_cache');var settings=navigator.mozSettings;var _debug=false;var debug=function(){};if(_debug){debug=function btc_debug(msg){console.log('--> [BluetoothContext]: '+msg);};}
var BluetoothContext={state:'disabled',enabled:undefined,address:null,name:'',discoverable:false,discovering:false,numberOfPairedDevices:0,firstPairedDeviceName:'',hasPairedDevice:false,_defaultAdapter:null,_init:function btc__init(){AdapterManager.observe('defaultAdapter',this._onDefaultAdapterChanged.bind(this));this._onDefaultAdapterChanged(AdapterManager.defaultAdapter);ConnectionManager.addEventListener('connecting',this._updateDeviceConnectionInfo.bind(this));ConnectionManager.addEventListener('connected',this._updateDeviceConnectionInfo.bind(this));ConnectionManager.addEventListener('disconnected',this._updateDeviceConnectionInfo.bind(this));ConnectionManager.addEventListener('profileChanged',this._updateDeviceConnectionInfo.bind(this));},_initProperties:function btc__initProperties(adapter){this._updateStatus(adapter.state);this.address=adapter.address;this.name=adapter.name;this.discoverable=adapter.discoverable;this.discovering=adapter.discovering;},_resetProperties:function btc__resetProperties(){this._updateStatus('disabled');this.address='';this.name='';this.discoverable=false;this.discovering=false;},_watchDefaultAdapterAttributechanged:function btc__watchDefaultAdapterAttributechanged(adapter){adapter.addEventListener('attributechanged',this._onAdapterAttributeChanged.bind(this,adapter));},_unwatchDefaultAdapterAttributechanged:function btc__unwatchDefaultAdapterAttributechanged(adapter){adapter.removeEventListener('attributechanged',this._onAdapterAttributeChanged);},_watchDefaultAdapterOndevicepaired:function btc__watchDefaultAdapterOndevicepaired(adapter){adapter.ondevicepaired=this._onAdapterDevicepaired.bind(this,adapter);},_unwatchDefaultAdapterOndevicepaired:function btc__unwatchDefaultAdapterOndevicepaired(adapter){adapter.ondevicepaired=null;},_watchDefaultAdapterOndeviceunpaired:function btc__watchDefaultAdapterOndeviceunpaired(adapter){adapter.ondeviceunpaired=this._onAdapterDeviceunpaired.bind(this,adapter);},_unwatchDefaultAdapterOndeviceunpaired:function btc__unwatchDefaultAdapterOndeviceunpaired(adapter){adapter.ondeviceunpaired=null;},_onAdapterAttributeChanged:function btc__onAdapterAttributeChanged(adapter,evt){for(var i in evt.attrs){debug('--> _onAdapterAttributeChanged(): '+evt.attrs[i]);switch(evt.attrs[i]){case'state':this._updateStatus(adapter.state);if(adapter.state==='enabled'){this._refreshPairedDevicesInfo(adapter);this.startDiscovery();}
break;case'address':this.address=adapter.address;break;case'name':this.name=adapter.name;break;case'discoverable':this.discoverable=adapter.discoverable;break;case'discovering':this.discovering=adapter.discovering;break;default:break;}}},_onAdapterDevicepaired:function btc__onAdapterDevicepaired(adapter,evt){debug('_onAdapterDevicepaired evt = '+evt);this._removeItemFromList(this._remoteDevices,evt.device.address);this._refreshPairedDevicesInfo(adapter);},_onAdapterDeviceunpaired:function btc__onAdapterDeviceunpaired(adapter,evt){debug('_onAdapterDeviceunpaired evt = '+evt);this._refreshPairedDevicesInfo(adapter);},_onDefaultAdapterChanged:function btc__onDefaultAdapterChanged(newAdapter,oldAdapter){debug('_onDefaultAdapterChanged(): newAdapter = '+newAdapter);debug('_onDefaultAdapterChanged(): oldAdapter = '+oldAdapter);this._defaultAdapter=newAdapter;if(oldAdapter){this._unwatchDefaultAdapterAttributechanged(oldAdapter);this._unwatchDefaultAdapterOndeviceunpaired(oldAdapter);this._unwatchDefaultAdapterOndevicepaired(oldAdapter);}
if(newAdapter){this._initProperties(newAdapter);this._watchDefaultAdapterAttributechanged(newAdapter);this._watchDefaultAdapterOndevicepaired(newAdapter);this._watchDefaultAdapterOndeviceunpaired(newAdapter);if(newAdapter.state==='enabled'){this._refreshPairedDevicesInfo(newAdapter);}}else{this._resetProperties();}},_refreshPairedDevicesInfo:function btc__refreshPairedDevicesInfo(adapter){var pairedDevices=adapter.getPairedDevices();debug('pairedDevices.length = '+pairedDevices.length);this._pairedDevices.reset([]);if(pairedDevices.length===0){this.firstPairedDeviceName='';this.hasPairedDevice=false;}else{pairedDevices.sort(function(a,b){return a.name>b.name;});for(var i in pairedDevices){var observableBtDevice=BtDevice(pairedDevices[i]);this._pairedDevices.push(observableBtDevice);}
this.firstPairedDeviceName=this._pairedDevices.get(0).name;this.hasPairedDevice=true;this._initConnectingDevices();this._initConnectedDevices();}
this.numberOfPairedDevices=pairedDevices.length;},_updateStatus:function btc__updateStatus(state){var enabled;if(state==='enabled'||state==='disabling'){enabled=true;}else if(state==='disabled'||state==='enabling'){enabled=false;}
this.state=state;debug('_updateStatus(): set state = '+state);this.enabled=enabled;debug('_updateStatus(): set enabled = '+enabled);this._syncWithSettingsKey(enabled);},_syncWithSettingsKey:function btc__syncWithSettingsKey(enabled){SettingsCache.getSettings((results)=>{var btEnabled=results['bluetooth.enabled'];if(btEnabled!==enabled){settings.createLock().set({'bluetooth.enabled':enabled});}});},setEnabled:function btc_setEnabled(enabled){debug('setEnabled(): request set enabled = '+enabled);if((this.enabled===enabled)||(this.state==='enabling')||(this.state==='disabling')){return Promise.reject('state transition!!');}
if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
if(enabled){return this._defaultAdapter.enable().then(()=>{debug('setEnabled(): set enable successfully :)');},(reason)=>{debug('setEnabled(): set enable failed: reason = '+reason);return Promise.reject(reason);});}else{return this._defaultAdapter.disable().then(()=>{debug('setEnabled(): set disable successfully :)');},(reason)=>{debug('setEnabled(): set disable failed: reason = '+reason);return Promise.reject(reason);});}},setDiscoverable:function btc_setDiscoverable(enabled){if((this.discoverable===enabled)||(this.state!=='enabled')){return Promise.reject('same state or Bluetooth is disabled!!');}
if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
return this._defaultAdapter.setDiscoverable(enabled).then(()=>{debug('setDiscoverable(): set discoverable '+
enabled+' successfully :)');},(reason)=>{debug('setDiscoverable(): set discoverable failed: '+'reason = '+reason);return Promise.reject(reason);});},setName:function btc_setName(name){if(name===this.name){return Promise.reject('same name!!');}
if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
return this._defaultAdapter.setName(name).then(()=>{debug('setName(): set name successfully :) name = '+
this._defaultAdapter.name);},(reason)=>{debug('setName(): set name failed: reason = '+reason);return Promise.reject(reason);});},setNameByProductModel:function btc_setNameByProductModel(){SettingsCache.getSettings((results)=>{var productModel=results['deviceinfo.product_model'];debug('setNameByProductModel(): productModel = '+productModel);this.setName(productModel);});},_pairedDevices:ObservableArray([]),_remoteDevices:ObservableArray([]),_discoveryHandler:null,startDiscovery:function btc_startDiscovery(){if((this.discovering===true)||(this.state!=='enabled')){return Promise.reject('same state or Bluetooth is disabled!!');}
this._remoteDevices.reset([]);if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
return this._defaultAdapter.startDiscovery().then((handle)=>{debug('startDiscovery(): startDiscovery successfully :)');this._setDiscoveryHandler(handle);},(reason)=>{debug('startDiscovery(): startDiscovery failed: '+'reason = '+reason);return Promise.reject(reason);});},stopDiscovery:function btc_stopDiscovery(){if(this.discovering===false){debug('stopDiscovery(): stopDiscovery successfully in same state :)');return Promise.resolve('same state');}
if(this.state!=='enabled'){return Promise.reject('Bluetooth is disabled!!');}
if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
return this._defaultAdapter.stopDiscovery().then(()=>{debug('stopDiscovery(): stopDiscovery successfully :)');},(reason)=>{debug('stopDiscovery(): stopDiscovery failed: reason = '+reason);return Promise.reject(reason);});},_setDiscoveryHandler:function btc__setDiscoveryHandler(handle){debug('_setDiscoveryHandler(): handle = '+handle);this._discoveryHandler=handle;this._discoveryHandler.ondevicefound=this._onDeviceFound.bind(this);},_onDeviceFound:function btc__onDeviceFound(evt){this._saveDevice(evt.device);},_saveDevice:function btc__saveDevice(device){var existedDevice=this._findDeviceByAddress({paired:device.paired,address:device.address});if(!existedDevice){var observableBtDevice=BtDevice(device);var operatingDevices=(device.paired)?this.getPairedDevices():this.getRemoteDevices();operatingDevices.push(observableBtDevice);}else{}},_removeItemFromList:function btc__removeItemFromList(list,address){var index=list.array.findIndex(this._matchDeviceByAddress.bind(this,address));if(index>-1){list.splice(index,1);debug('_removeItemFromList(): index = '+index);}else{}},_findDeviceByAddress:function btc__findDeviceByAddress(options){var operatingDevices=(options.paired)?this.getPairedDevices():this.getRemoteDevices();var index=operatingDevices.array.findIndex(this._matchDeviceByAddress.bind(this,options.address));if(index>-1){return operatingDevices.get(index);}else{return null;}},_matchDeviceByAddress:function btc__matchDeviceByAddress(address,btDevice){return btDevice.address&&(btDevice.address===address);},getPairedDevices:function btc_getPairedDevices(){return this._pairedDevices;},getRemoteDevices:function btc_getRemoteDevices(){return this._remoteDevices;},pair:function btc_pair(address){if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
return this.stopDiscovery().then(()=>{return this._defaultAdapter.pair(address).then(()=>{debug('pair(): Resolved with void value');},(reason)=>{debug('pair(): Reject with this reason: '+reason);return Promise.reject(reason);});},(reason)=>{return Promise.reject(reason);});},unpair:function btc_unpair(address){if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
return this._defaultAdapter.unpair(address).then(()=>{debug('unpair(): Resolved with void value');},(reason)=>{debug('unpair(): Reject with this reason: '+reason);return Promise.reject(reason);});},sendFile:function btc_sendFile(address,blob){if(!this._defaultAdapter){return Promise.reject('default adapter is not existed!!');}
return this._defaultAdapter.sendFile(address,blob).then(()=>{debug('sendFile(): Resolved with void value');},(reason)=>{debug('sendFile(): Reject with this reason: '+reason);return Promise.reject(reason);});},_initConnectingDevices:function btc__initConnectingDevices(){if(!ConnectionManager.connectingAddress){return;}
var existedDevice=this._findDeviceByAddress({paired:true,address:ConnectionManager.connectingAddress});if(existedDevice){var options={connectionStatus:'connecting'};debug('_initConnectingDevices(): options = '+JSON.stringify(options));existedDevice.updateConnectionInfo(options);}},_initConnectedDevices:function btc__initConnectedDevices(){ConnectionManager.getConnectedDevices().then((connectedDevices)=>{for(var address in connectedDevices){var existedDevice=this._findDeviceByAddress({paired:true,address:address});if(existedDevice){var options={connectionStatus:'connected',profiles:connectedDevices[address].connectedProfiles};debug('_initConnectedDevices(): address = '+address+', options = '+JSON.stringify(options));existedDevice.updateConnectionInfo(options);}}},(reason)=>{debug('_initConnectedDevices(): getConnectedDevices(): failed, '+'reason = '+reason);});},_updateDeviceConnectionInfo:function btc__updateDeviceConnectionInfo(event){debug('_updateDeviceConnectionInfo(): event = '+JSON.stringify(event));var existedDevice=this._findDeviceByAddress({paired:true,address:event.detail.address});if(existedDevice){var options;switch(event.type){case'connecting':case'connected':case'disconnected':options={connectionStatus:event.type};break;case'profileChanged':options={profiles:event.detail.profiles};break;default:break;}
debug('_updateDeviceConnectionInfo(): options = '+
JSON.stringify(options));existedDevice.updateConnectionInfo(options);}else{}}};var bluetoothContext=Observable(BluetoothContext);bluetoothContext._init();return bluetoothContext;});

View file

@ -0,0 +1,9 @@
define(['require','modules/bluetooth/bluetooth_cod_mapper','modules/mvvm/observable'],function(require){'use strict';var BtClassOfDeviceMapper=require('modules/bluetooth/bluetooth_cod_mapper');var Observable=require('modules/mvvm/observable');var _debug=false;var debug=function(){};if(_debug){debug=function btd_debug(msg){console.log('--> [BluetoothDevice]: '+msg);};}
var updateConnectionInfo=function(options){debug('updateConnectionInfo(): this.address = '+this.address+', this.name = '+this.name+', options = '+JSON.stringify(options));if(options.connectionStatus){this.connectionStatus=options.connectionStatus;}
if(options.profiles){this.profiles=Object.create(options.profiles);}
debug('updateConnectionInfo(): this.connectionStatus = '+
this.connectionStatus+', this.profiles = '+
JSON.stringify(this.profiles));};var updateDescriptionText=function(){debug('updateDescriptionText():');if(this.paired===false){this.descriptionText='tapToConnect';}else if(this.paired==='pairing'){this.descriptionText='pairing';}else if(this.paired===true){this.descriptionText='paired';if(this.connectionStatus==='connecting'){this.descriptionText='connecting';}else if(this.connectionStatus==='connected'){if(this.profiles){var hfpConnected=this.profiles.hfp;var a2dpConnected=this.profiles.a2dp;if(hfpConnected&&a2dpConnected){this.descriptionText='connectedWithDeviceMedia';}else if(hfpConnected){this.descriptionText='connectedWithDevice';}else if(a2dpConnected){this.descriptionText='connectedWithMedia';}else{this.descriptionText='connectedWithNoProfileInfo';}}else{this.descriptionText='connectedWithNoProfileInfo';}}else if(this.connectionStatus==='disconnected'){this.descriptionText='disconnected';}}
debug('updateDescriptionText(): this.descriptionText = '+
this.descriptionText);};return function ctor_bluetooth_device(device){var type=BtClassOfDeviceMapper.getDeviceType(device.cod);var connectionStatus=device.connectionStatus||'disconnected';var observableBluetoothDevice=Observable({name:device.name,paired:device.paired,address:device.address,type:type,connectionStatus:connectionStatus,profiles:null,descriptionText:'',get data(){return device;},updateConnectionInfo:updateConnectionInfo,updateDescriptionText:updateDescriptionText});observableBluetoothDevice._init=function btd__init(){this.observe('paired',this.updateDescriptionText.bind(this));this.observe('connectionStatus',this.updateDescriptionText.bind(this));this.observe('profiles',this.updateDescriptionText.bind(this));};device.onattributechanged=function btd_onDeviceAttributeChanged(evt){for(var i in evt.attrs){debug('onDeviceAttributeChanged(): '+evt.attrs[i]);switch(evt.attrs[i]){case'name':observableBluetoothDevice.name=device.name;break;case'paired':debug('onDeviceAttributeChanged(): '+'device.paired = '+device.paired);observableBluetoothDevice.paired=device.paired;break;case'cod':debug('onDeviceAttributeChanged(): '+'device.cod = '+device.cod);observableBluetoothDevice.type=BtClassOfDeviceMapper.getDeviceType(device.cod);break;default:break;}}};observableBluetoothDevice._init();return observableBluetoothDevice;};});

View file

@ -0,0 +1,5 @@
define(['require'],function(require){'use strict';const KEY='operatorResources.data.icon';var initialized=false;var map={};function getCustomizedNetworkTypeMap(){if(initialized){return Promise.resolve(map);}else{return new Promise((resolve)=>{var req=navigator.mozSettings.createLock().get(KEY);req.onsuccess=function(){initialized=true;var result=req.result[KEY];if(result&&Object.keys(result).length){map=Object.create(result);}
resolve(map);};req.onerror=function(){initialized=true;console.error('Error loading '+KEY+' settings. '+
req.error&&req.error.name);resolve(map);};});}}
return Object.freeze({get:getCustomizedNetworkTypeMap});});

View file

@ -0,0 +1,5 @@
define(['require','modules/settings_cache','modules/base/module','modules/mvvm/observable'],function(require){'use strict';var SettingsCache=require('modules/settings_cache');var Module=require('modules/base/module');var Observable=require('modules/mvvm/observable');var settings=window.navigator.mozSettings;var _kClockAutoEnabled='time.clock.automatic-update.enabled';var _kTimezoneAutoEnabled='time.timezone.automatic-update.enabled';var _kClockAutoAvailable='time.clock.automatic-update.available';var _kTimezoneAutoAvailable='time.timezone.automatic-update.available';var _kTimezone='time.timezone';var _kUserSelected='time.timezone.user-selected';var _kLocaleTime='locale.hour12';var _updateDateTimeout=null;var _updateTimeTimeout=null;var DateTime=Module.create(function DateTime(){this.super(Observable).call(this);this._init();}).extend(Observable);Observable.defineObservableProperty(DateTime.prototype,'clockAutoEnabled',{readonly:true,value:true});Observable.defineObservableProperty(DateTime.prototype,'clockAutoAvailable',{readonly:true,value:true});Observable.defineObservableProperty(DateTime.prototype,'timezoneAutoAvailable',{readonly:true,value:true});Observable.defineObservableProperty(DateTime.prototype,'timezone',{readonly:true,value:''});Observable.defineObservableProperty(DateTime.prototype,'userSelectedTimezone',{readonly:true,value:''});Observable.defineObservableProperty(DateTime.prototype,'date',{readonly:true,value:''});Observable.defineObservableProperty(DateTime.prototype,'time',{readonly:true,value:''});Observable.defineObservableProperty(DateTime.prototype,'currentHour12',{readonly:true,value:true});DateTime.prototype._init=function(){this._mozTime=window.navigator.mozTime;if(!this._mozTime){console.error('Could not get window.navigator.mozTime');return;}
this._boundSetTimeAutoEnabled=function(event){this._clockAutoEnabled=event.settingValue;this._setTimezoneAutoEnabled(event.settingValue);}.bind(this);this._boundSetClockAutoAvailable=function(event){this._clockAutoAvailable=event.settingValue;}.bind(this);this._boundSetTimezoneAutoAvailable=function(event){this._timezoneAutoAvailable=event.settingValue;}.bind(this);this._boundSetTimezone=function(event){this._timezone=event.settingValue;}.bind(this);this._boundUserSelectedTimezone=function(event){this._userSelectedTimezone=event.settingValue;}.bind(this);this._boundCurrentHour12=function(event){this._currentHour12=event.settingValue;this._autoUpdateDateTime();}.bind(this);this._getDefaults();this._attachListeners();};DateTime.prototype._attachListeners=function(){window.navigator.mozSettings.addObserver(_kClockAutoEnabled,this._boundSetTimeAutoEnabled);window.navigator.mozSettings.addObserver(_kClockAutoAvailable,this._boundSetClockAutoAvailable);window.navigator.mozSettings.addObserver(_kTimezoneAutoAvailable,this._boundSetTimezoneAutoAvailable);window.navigator.mozSettings.addObserver(_kTimezone,this._boundSetTimezone);window.navigator.mozSettings.addObserver(_kUserSelected,this._boundUserSelectedTimezone);window.navigator.mozSettings.addObserver(_kLocaleTime,this._boundCurrentHour12);document.addEventListener('DOMRetranslated',this);window.addEventListener('moztimechange',this);};DateTime.prototype.handleEvent=function(evt){switch(evt.type){case'moztimechange':this._autoUpdateDateTime();break;case'DOMRetranslated':var d=new Date();this._date=this._formatDate(d);this._time=this._formatTime(d);break;}};DateTime.prototype._getDefaults=function(){SettingsCache.getSettings(function(results){this._clockAutoEnabled=results[_kClockAutoEnabled];this._clockAutoAvailable=results[_kClockAutoAvailable];this._timezoneAutoAvailable=results[_kTimezoneAutoAvailable];this._timezone=results[_kTimezone];this._currentHour12=results[_kLocaleTime];this._autoUpdateDateTime();}.bind(this));};DateTime.prototype._autoUpdateDateTime=function(){window.clearTimeout(_updateDateTimeout);window.clearTimeout(_updateTimeTimeout);this._autoUpdateDate();this._autoUpdateTime();};DateTime.prototype._autoUpdateDate=function(){var d=new Date();this._date=this._formatDate(d);var remainMillisecond=(24-d.getHours())*3600*1000-
d.getMinutes()*60*1000-d.getMilliseconds();_updateDateTimeout=window.setTimeout(function updateDateTimeout(){this._autoUpdateDate();}.bind(this),remainMillisecond);};DateTime.prototype._autoUpdateTime=function(){var d=new Date();this._time=this._formatTime(d);var remainMillisecond=(60-d.getSeconds())*1000;_updateTimeTimeout=window.setTimeout(function updateTimeTimeout(){this._autoUpdateTime();}.bind(this),remainMillisecond);};DateTime.prototype._formatDate=function(d){return d.toLocaleString(navigator.languages,{year:'numeric',month:'long',day:'2-digit',});};DateTime.prototype._formatTime=function(d){return d.toLocaleString(navigator.languages,{hour12:navigator.mozHour12,hour:'numeric',minute:'numeric',});};DateTime.prototype.setTime=function(type,value){var newDate=new Date();var tokens;switch(type){case'date':tokens=value.split('-');newDate.setYear(tokens[0]);newDate.setMonth(tokens[1]-1);newDate.setDate(tokens[2]);break;case'time':tokens=value.split(':');newDate.setHours(parseInt(tokens[0]));newDate.setMinutes(parseInt(tokens[1]));break;}
this._mozTime.set(newDate);};DateTime.prototype._setTimezoneAutoEnabled=function(enabled){var cset={};cset[_kTimezoneAutoEnabled]=enabled;settings.createLock().set(cset);},DateTime.prototype.setUserSelectedTimezone=function(selected){var cset={};cset[_kTimezone]=selected;settings.createLock().set(cset);};DateTime.prototype.setCurrentHour12=function(selected){var cset={};cset[_kLocaleTime]=selected;settings.createLock().set(cset);};DateTime.prototype.getHour12ForCurrentLocale=function(){var format=new Intl.DateTimeFormat(navigator.languages,{hour:'numeric'});return format.resolvedOptions().hour12;};return DateTime();});

View file

@ -0,0 +1,2 @@
define(['require'],function(require){'use strict';var Defer=function(){this.promise=new Promise((resolve,reject)=>{this.resolve=resolve;this.reject=reject;});};return function ctor_defer(){return new Defer();};});

View file

@ -0,0 +1,2 @@
define(['require','modules/panel'],function(require){'use strict';var Panel=require('modules/panel');var DialogPanel=function ctor_dialogPanel(panelOptions){var panel=Panel(panelOptions);var _emptyFunc=function(){};var submitFunction=_emptyFunc;var cancelFunction=_emptyFunc;var originalInit=panel.init;panel.init=function(panel,userOptions){submitFunction=userOptions.onWrapSubmit.bind(userOptions);cancelFunction=userOptions.onWrapCancel.bind(userOptions);return originalInit.apply(panel,arguments);};panel.onSubmit=panelOptions.onSubmit||_emptyFunc;panel.onCancel=panelOptions.onCancel||_emptyFunc;panel.onSubmit=panel.onSubmit.bind(panelOptions);panel.onCancel=panel.onCancel.bind(panelOptions);panelOptions.submit=function(){submitFunction();};panelOptions.cancel=function(){cancelFunction();};return panel;};return DialogPanel;});

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,7 @@
define([],function(){'use strict';var FdnContext={_fdnContacts:[],_cloneObject:function(obj){return JSON.parse(JSON.stringify(obj));},getContacts:function(cardIndex){var promise=new Promise((resolve,reject)=>{var iccId=navigator.mozMobileConnections[cardIndex].iccId;if(!iccId){console.log('can\'t get right iccId');reject();}
var icc=navigator.mozIccManager.getIccById(iccId);if(!icc){console.log('Could not retrieve ICC object');reject();}
var request=icc.readContacts('fdn');request.onerror=(error)=>{console.log('we got error when reading contacts from icc');console.log(error);reject();};request.onsuccess=()=>{var result=this._fdnContacts[cardIndex]=request.result;var contacts=[];for(var i=0,l=result.length;i<l;i++){contacts.push({id:i,name:result[i].name||'',number:result[i].tel[0].value||''});}
resolve(contacts);};});return promise;},createAction:function(action,options){var simContact={};var cardIndex=options.cardIndex;var contact=options.contact;switch(action){case'add':simContact.name=[contact.name];simContact.tel=[{value:contact.number}];break;case'edit':simContact=this._cloneObject(this._fdnContacts[cardIndex][contact.id]);simContact.name[0]=contact.name;simContact.tel[0].value=contact.number;break;case'remove':simContact=this._cloneObject(this._fdnContacts[cardIndex][contact.id]);simContact.name[0]='';simContact.tel[0].value='';break;}
var result=new window.mozContact(simContact);if('id'in simContact){result.id=simContact.id;}
return result;}};return FdnContext;});

View file

@ -0,0 +1,13 @@
define(['require','modules/mvvm/observable','modules/mvvm/observable_array','shared/keyboard_helper','shared/manifest_helper'],function(require){'use strict';var Observable=require('modules/mvvm/observable');var ObservableArray=require('modules/mvvm/observable_array');var KeyboardHelper=require('shared/keyboard_helper');var ManifestHelper=require('shared/manifest_helper');var _layoutDict=null;var _keyboards=ObservableArray([]);var _enabledLayouts=ObservableArray([]);var _isReady=false;var _parsingApps=false;var _callbacks=[];var _defaultEnabledCallbacks=[];var Keyboard=function(name,description,launchPath,layouts,app){var _observable=Observable({name:name,description:description,launchPath:launchPath,layouts:layouts,app:app});return _observable;};var Layout=function(options){var _observable=Observable({id:options.id,appName:options.appName,name:options.name,nameL10nId:options.nameL10nId,description:options.description,types:options.types,enabled:options.enabled});_observable.observe('enabled',function(newValue,oldValue){if(!_parsingApps){KeyboardHelper.setLayoutEnabled(options.appManifestURL,options.id,newValue);if(!newValue){KeyboardHelper.checkDefaults(function(layouts,missingTypes){refreshEnabledLayouts(layouts);notifyDefaultEnabled(layouts,missingTypes);});}}});return _observable;};var _waitForLayouts;function refreshEnabledLayouts(reEnabledLayouts){reEnabledLayouts.forEach(function(layout){var app=_layoutDict[layout.app.manifestURL];if(app){app[layout.layoutId].enabled=true;}});}
function notifyDefaultEnabled(layouts,missingTypes){_defaultEnabledCallbacks.forEach(function withCallbacks(callback){callback(layouts[0],missingTypes[0]);});}
function updateLayouts(layouts,reason){function mapLayout(layout){var app=_layoutDict[layout.app.manifestURL];if(!app){app=_layoutDict[layout.app.manifestURL]={};}
if(app[layout.layoutId]){app[layout.layoutId].enabled=layout.enabled;return app[layout.layoutId];}
app[layout.layoutId]=Layout({id:layout.layoutId,appName:layout.manifest.name,appManifestURL:layout.app.manifestURL,name:layout.inputManifest.name,nameL10nId:layout.inputManifest.nameL10nId,description:layout.inputManifest.description,types:layout.inputManifest.types,enabled:layout.enabled});return app[layout.layoutId];}
function reduceApps(carry,layout){if(!carry.some(function checkApp(app){if(app.app===layout.app){app.layouts.push(mapLayout(layout));return true;}})){carry.push({app:layout.app,manifest:layout.manifest,layouts:[mapLayout(layout)]});}
return carry;}
function mapKeyboard(app){return Keyboard(app.manifest.name,app.manifest.description,app.manifest.launch_path,app.layouts,app.app);}
_parsingApps=true;if(reason.apps){_layoutDict={};var apps=layouts.reduce(reduceApps,[]);var keyboards=apps.map(mapKeyboard);_keyboards.reset(keyboards);}
var enabled=layouts.filter(function filterEnabled(layout){return layout.enabled;}).map(mapLayout);_enabledLayouts.reset(enabled);_parsingApps=false;if(_waitForLayouts){_waitForLayouts();_waitForLayouts=undefined;}}
var _init=function(callback){document.addEventListener('DOMRetranslated',function(){_keyboards.forEach(function(keyboard){var keyboardAppInstance=keyboard.app;var keyboardManifest=new ManifestHelper(keyboardAppInstance.manifest);keyboard.name=keyboardManifest.name;keyboard.description=keyboardManifest.description;keyboard.layouts.forEach(function(layout){layout.appName=keyboardManifest.name;});});});_waitForLayouts=callback;KeyboardHelper.stopWatching();KeyboardHelper.watchLayouts(updateLayouts);};var _ready=function(callback){if(!callback){return;}
if(_isReady){callback();}else{_callbacks.push(callback);}};return{reset:function kc_reset(){_layoutDict=null;_keyboards=ObservableArray([]);_enabledLayouts=ObservableArray([]);_isReady=false;_parsingApps=false;_callbacks=[];_defaultEnabledCallbacks=[];},init:function kc_init(callback){_defaultEnabledCallbacks=[];_isReady=false;_init(function(){_isReady=true;_callbacks.forEach(function(callback){callback();});});_ready(callback);},keyboards:function kc_keyboards(callback){_ready(function(){callback(_keyboards);});},enabledLayouts:function kc_enabledLayouts(callback){_ready(function(){callback(_enabledLayouts);});},defaultKeyboardEnabled:function kc_defaultKeyboardEnabled(callback){_defaultEnabledCallbacks.push(callback);}};});

View file

@ -0,0 +1,7 @@
define(['require','modules/base/module','modules/mvvm/observable','shared/settings_listener'],function(require){'use strict';var Module=require('modules/base/module');var Observable=require('modules/mvvm/observable');var SettingsListener=require('shared/settings_listener');var MediaStorage=Module.create(function MediaStorage(){this.super(Observable).call(this);this._defaultMediaVolume=null;this._defaultMediaVolumeKey='device.storage.writable.name';SettingsListener.observe(this._defaultMediaVolumeKey,'sdcard',this._mediaVolumeChangeHandler.bind(this));}).extend(Observable);Observable.defineObservableProperty(MediaStorage.prototype,'volumeState',{readonly:true,value:'available'});Observable.defineObservableProperty(MediaStorage.prototype,'freeSize',{readonly:true,value:0});MediaStorage.prototype.handleEvent=function ms_handler(evt){switch(evt.type){case'change':this._updateMediaStorageInfo();break;}};MediaStorage.prototype._mediaVolumeChangeHandler=function ms__mediaVolumeChangeHandler(defaultName){if(this._defaultMediaVolume){this._defaultMediaVolume.removeEventListener('change',this);}
this._defaultMediaVolume=this._getDefaultVolume(defaultName);if(this._defaultMediaVolume){this._defaultMediaVolume.addEventListener('change',this);}
this._updateMediaStorageInfo();};MediaStorage.prototype._updateMediaStorageInfo=function ms__updateMediaStorageInfo(){if(!this._defaultMediaVolume){this._updateVolumeState(null,'unavailable');return;}
var req=this._defaultMediaVolume.available();req.onsuccess=evt=>{var state=evt.target.result;var firstVolume=navigator.getDeviceStorages('sdcard')[0];if(state==='unavailable'&&this._defaultMediaVolume.storageName!==firstVolume.storageName){firstVolume.available().onsuccess=e=>{this._updateVolumeState(firstVolume,e.target.result);};}else{this._updateVolumeState(this._defaultMediaVolume,state);}};};MediaStorage.prototype._updateVolumeState=function ms__updateVolumeState(volume,state){this._volumeState=state;volume.freeSpace().onsuccess=(e)=>{this._freeSize=e.target.result;};};MediaStorage.prototype._getDefaultVolume=function ms__getDefaultVolume(name){var volumes=navigator.getDeviceStorages('sdcard');if(!name||name===''){return volumes[0];}
for(var i=0;i<volumes.length;++i){if(volumes[i].storageName===name){return volumes[i];}}
return volumes[0];};return MediaStorage();});

View file

@ -0,0 +1,8 @@
define(['require','shared/icc_helper','shared/async_storage','modules/settings_utils','shared/settings_listener'],function(require){'use strict';var CBS_KEY='ril.cellbroadcast.disabled';var CMAS_KEY='cmas.enabled';var CMAS_PREF_KEY='cmas.user-pref.enabled';var IccHelper=require('shared/icc_helper');var asyncStorage=require('shared/async_storage');var SettingsUtils=require('modules/settings_utils');var SettingsListener=require('shared/settings_listener');var settings=window.navigator.mozSettings;var Messaging=function(){this._cardIndex=0;this._cbs=null;this._cbsInput=null;this._cbsInit=false;this._cmas=null;this._cmasInput=null;this._cmasInit=false;this._boundCBSChanged=this._cbsChanged.bind(this);this._boundCBSInputChanged=this._cbsInputChanged.bind(this);this._boundCMASInputChanged=this._cmasInputChanged.bind(this);};Messaging.prototype={_disableItems:function m__disableItems(panel,disable){var elementIds=['menuItem-deliveryReport','menuItem-readReport','menuItem-autoRetrieve','menuItem-wapPush','menuItem-cellBroadcast','menuItem-emergencyAlert'];elementIds.forEach(function(id){var element=panel.querySelector(id);if(!element){return;}
if(disable){element.setAttribute('aria-disabled',true);}else{element.removeAttribute('aria-disabled');}
var input=element.querySelector('gaia-switch');if(!input){input=element.querySelector('select');}
input.disabled=disable;});},_setCMAS:function m__setCMAS(enabled){var cardIndex=this._cardIndex;this._cmasInput.checked=enabled;var getReq=settings.createLock().get(CMAS_KEY);getReq.onsuccess=function(){var values=getReq.result[CMAS_KEY];values[cardIndex]=enabled;var cmasset={};cmasset[CMAS_KEY]=values;settings.createLock().set(cmasset);};},_cbsChanged:function m__cbsChanged(cbsSettings){var cardIndex=this._cardIndex;var value=cbsSettings[cardIndex];this._cbsInput.checked=!value;if(value){this._setCMAS(false);}else{this._restoreCMASPref();}
this._cmasInput.disabled=value;if(!this._cbsInit){this._cbsInput.disabled=false;this._cbs.removeAttribute('aria-disabled');this._cbsInit=true;}},_cbsInputChanged:function m__cbsInputChanged(){var cardIndex=this._cardIndex;var cbsInputChecked=this._cbsInput.checked;if(!cbsInputChecked){this._storeCMASPref(this._cmasInput.checked);}
var getReq=settings.createLock().get(CBS_KEY);getReq.onsuccess=function(){var values=getReq.result[CBS_KEY];values[cardIndex]=!cbsInputChecked;var cbsset={};cbsset[CBS_KEY]=values;settings.createLock().set(cbsset);};},_cmasInputChanged:function m__cmasInputChanged(){this._setCMAS(this._cmasInput.checked);this._storeCMASPref(this._cmasInput.checked);},_storeCMASPref:function m__storeCMASPref(checked){var cardIndex=this._cardIndex;asyncStorage.getItem(CMAS_PREF_KEY,function(pref){var states=pref||[true,true];states[cardIndex]=checked;asyncStorage.setItem(CMAS_PREF_KEY,states);});},_restoreCMASPref:function m__restoreCMASPref(){var cardIndex=this._cardIndex;asyncStorage.getItem(CMAS_PREF_KEY,function(pref){var states=pref||[true,true];this._setCMAS(states[cardIndex]);if(!this._cmasInit){this._cmasInput.disabled=false;this._cmas.removeAttribute('aria-disabled');this._cmasInit=true;}}.bind(this));},initCBS:function m_initCBS(panel,cardIndex){this._cardIndex=cardIndex;this._cbs=panel.querySelector('#menuItem-cellBroadcast');this._cbsInput=this._cbs.querySelector('gaia-switch');this._cbsInit=false;this._cmas=panel.querySelector('#menuItem-emergencyAlert');this._cmasInput=this._cmas.querySelector('gaia-switch');this._cmasInit=false;this._cbsInput.removeEventListener('change',this._boundCBSInputChanged);this._cmasInput.removeEventListener('change',this._boundCMASInputChanged);SettingsListener.unobserve(CBS_KEY,this._boundCBSChanged);this._cbsInput.addEventListener('change',this._boundCBSInputChanged);this._cmasInput.addEventListener('change',this._boundCMASInputChanged);SettingsListener.observe(CBS_KEY,[false,false],this._boundCBSChanged);},disableItems:function m_disableItems(panel){var self=this;if(!settings||!IccHelper||IccHelper.cardState!=='ready'){this._disableItems(panel,true);return;}
IccHelper.addEventListener('cardstatechange',function(){self._disableItems(panel,IccHelper.cardState!=='ready');});this._disableItems(panel,false);},injectCBSTemplate:function m_injectCBSTemplate(containerNode){var promise=new Promise(function(resolve,reject){var templateId='template-messaging';SettingsUtils.loadTemplate(templateId,function(html){if(!html){reject('We can\'t get the template '+templateId);}else{containerNode.innerHTML=html;resolve();}});});return promise;}};var messaging=new Messaging();return messaging;});

View file

@ -0,0 +1,4 @@
define(['require','modules/mobile/supported_network_type'],function(require){'use strict';var NetworkType=require('modules/mobile/supported_network_type');var SupportedNetworkInfo={supportedNetworkTypeHelpers:[],_getMobileConnectionIndex:function ni_getMobileConnectionIndex(mobileConnection){return Array.prototype.indexOf.call(navigator.mozMobileConnections,mobileConnection);},getSupportedNetworkInfo:function getSupportedNetworkInfo(mobileConnection,callback){if(!navigator.mozMobileConnections){if(typeof callback==='function'){callback();}}
var index=this._getMobileConnectionIndex(mobileConnection);var helper=this.supportedNetworkTypeHelpers[index];if(!helper){this.supportedNetworkTypeHelpers[index]=helper=NetworkType.SupportedNetworkTypeHelper(mobileConnection.supportedNetworkTypes);}
if(typeof callback==='function'){callback(helper);}}};return SupportedNetworkInfo;});

View file

@ -0,0 +1,2 @@
define(['require'],function(require){'use strict';const NETWORK_TYPES=['wcdma/gsm','gsm','wcdma','wcdma/gsm-auto','cdma/evdo','cdma','evdo','wcdma/gsm/cdma/evdo','lte/cdma/evdo','lte/wcdma/gsm','lte/wcdma/gsm/cdma/evdo','lte','lte/wcdma'];const NETWORK_TYPE_STRING_MAP={'CDMA':{'cdma/evdo':'operator-networkType-auto','cdma':'operator-networkType-CDMA','evdo':'operator-networkType-EVDO'},'LTE':{'lte':'operator-networkType-LTE'},'GSM':{'wcdma/gsm':'operator-networkType-prefer3G','gsm':'operator-networkType-2G','wcdma':'operator-networkType-3G','wcdma/gsm-auto':'operator-networkType-auto'},'GSM,LTE':{'lte/wcdma/gsm':'operator-networkType-auto','lte/wcdma':'operator-networkType-auto-3G-4G','gsm':'operator-networkType-2G','wcdma':'operator-networkType-3G','wcdma/gsm-auto':'operator-networkType-auto-2G-3G','wcdma/gsm':'operator-networkType-prefer3G','lte':'operator-networkType-LTE'},'CDMA,LTE':{'lte/cdma/evdo':'operator-networkType-auto','cdma/evdo':'operator-networkType-auto-CDMA-EVDO','cdma':'operator-networkType-CDMA','evdo':'operator-networkType-EVDO','lte':'operator-networkType-LTE'},'GSM,CDMA':{'wcdma/gsm':'operator-networkType-preferWCDMA','gsm':'operator-networkType-GSM','wcdma':'operator-networkType-WCDMA','wcdma/gsm-auto':'operator-networkType-auto-WCDMA-GSM','cdma/evdo':'operator-networkType-auto-CDMA-EVDO','cdma':'operator-networkType-CDMA','evdo':'operator-networkType-EVDO','wcdma/gsm/cdma/evdo':'operator-networkType-auto'},'GSM,CDMA,LTE':{'wcdma/gsm':'operator-networkType-preferWCDMA','gsm':'operator-networkType-GSM','wcdma':'operator-networkType-WCDMA','wcdma/gsm-auto':'operator-networkType-auto-WCDMA-GSM','cdma/evdo':'operator-networkType-auto-CDMA-EVDO','cdma':'operator-networkType-CDMA','evdo':'operator-networkType-EVDO','wcdma/gsm/cdma/evdo':'operator-networkType-auto-WCDMA-GSM-CDMA-EVDO','lte':'operator-networkType-LTE','lte/wcdma/gsm':'operator-networkType-auto-LTE-WCDMA-GSM','lte/wcdma':'operator-networkType-auto-LTE-WCDMA','lte/cdma/evdo':'operator-networkType-auto-LTE-CDMA-EVDO','lte/wcdma/gsm/cdma/evdo':'operator-networkType-auto'},'':{'wcdma/gsm':'operator-networkType-preferWCDMA','gsm':'operator-networkType-GSM','wcdma':'operator-networkType-WCDMA','wcdma/gsm-auto':'operator-networkType-auto-WCDMA-GSM','cdma/evdo':'operator-networkType-auto-CDMA-EVDO','cdma':'operator-networkType-CDMA','evdo':'operator-networkType-EVDO','wcdma/gsm/cdma/evdo':'operator-networkType-auto'}};var NetworkType={SupportedNetworkTypeHelper:function ctor_snth(hwSupportedTypes){var _hwSupportedTypeMap={gsm:hwSupportedTypes.indexOf('gsm')!==-1,cdma:hwSupportedTypes.indexOf('cdma')!==-1,wcdma:hwSupportedTypes.indexOf('wcdma')!==-1,evdo:hwSupportedTypes.indexOf('evdo')!==-1,lte:hwSupportedTypes.indexOf('lte')!==-1};var _networkTypes=NETWORK_TYPES.filter(function(type){return type.split('/').every(function(subtype){return _hwSupportedTypeMap[subtype.split('-')[0]];});});var _stringMap=NETWORK_TYPE_STRING_MAP[['GSM','CDMA','LTE'].filter(function(category){switch(category){case'GSM':return _hwSupportedTypeMap.gsm||_hwSupportedTypeMap.wcdma;case'CDMA':return _hwSupportedTypeMap.cdma||_hwSupportedTypeMap.evdo;case'LTE':return _hwSupportedTypeMap.lte;}}).toString()];return{get gsm(){return _hwSupportedTypeMap.gsm;},get cdma(){return _hwSupportedTypeMap.cdma;},get wcdma(){return _hwSupportedTypeMap.wcdma;},get evdo(){return _hwSupportedTypeMap.evdo;},get lte(){return _hwSupportedTypeMap.lte;},get networkTypes(){return _networkTypes;},l10nIdForType:function(type){return _stringMap[type];}};}};return NetworkType;});

View file

@ -0,0 +1,15 @@
define(['require','modules/mvvm/observable_array'],function(require){var elements=new WeakMap();var ObservableArray=require('modules/mvvm/observable_array');var ListView=function(root,observableArray,templateFunc){var _observableArray=null;var _root=root;var _templateFunc=templateFunc;var _enabled=true;var observerMap=new WeakMap();function releaseObservers(element){var observable=observerMap.get(element);if(!observable||typeof observable!=='object'){return;}
var observers=observerMap.get(observable);if(observers){observers.forEach(function eachObserver(observer){observable.unobserve(observer);});observerMap.delete(observable);observerMap.delete(element);}}
function observeAndCall(observable,map){var observers=observerMap.get(observable)||[];if(observerMap.has(observable)){observers=observerMap.get(observable);}
observers=Object.keys(map).map(function eachProperty(property){observable.observe(property,map[property]);map[property]();return map[property];});observerMap.set(observable,observers);}
var _helper={observeAndCall:observeAndCall};var _handleEvent=function(event){if(!_enabled){return;}
var data=event.detail;switch(event.type){case'insert':_insert(data.index,data.items);break;case'remove':_remove(data.index,data.count);break;case'replace':_replace(data.index,data.newValue);break;case'reset':_reset(data.items||[]);break;default:break;}};var _insert=function(index,items){if(items.length<=0){return;}
var referenceElement=_root.children[index];for(var i=items.length-1;i>=0;i--){var curElement=_templateFunc(items[i],undefined,_helper);observerMap.set(curElement,items[i]);_root.insertBefore(curElement,referenceElement);referenceElement=curElement;}};var _remove=function(index,count){if(count===0){return;}
if(count>=_root.childElementCount){while(_root.firstElementChild){releaseObservers(_root.firstElementChild);_root.removeChild(_root.firstElementChild);}}else{var nextElement=_root.children[index];for(var i=0;i<count;i++){if(nextElement){var temp=nextElement.nextElementSibling;releaseObservers(nextElement);_root.removeChild(nextElement);nextElement=temp;}else{break;}}}};var _replace=function(index,value){var element=_root.children[index];if(element){releaseObservers(element);var newElement=_templateFunc(value,element,_helper);observerMap.set(element,value);if(newElement!==element){_root.insertBefore(newElement,element);_root.removeChild(element);}}};var _reset=function(items){var itemCount=items.length;var elementCount=_root.childElementCount;if(itemCount===0){_remove(0,elementCount);}else if(itemCount<=elementCount){items.forEach(function(item,index){_replace(index,item);});_remove(itemCount,elementCount-itemCount);}else{var slicedItems=items.slice(0,elementCount);var remainingItems=items.slice(elementCount);slicedItems.forEach(function(item,index){_replace(index,item);});_insert(elementCount,remainingItems);}};var _enabledChanged=function(){if(_enabled){_reset(_observableArray.array);}};var view={set:function lv_set(newArray){if(_observableArray){_observableArray.removeEventListener('insert',_handleEvent);_observableArray.removeEventListener('remove',_handleEvent);_observableArray.removeEventListener('replace',_handleEvent);_observableArray.removeEventListener('reset',_handleEvent);}
if(!newArray){if(_observableArray){_remove(0,_observableArray.length);_observableArray=null;}
return;}
if(Array.isArray(newArray)){newArray=ObservableArray(newArray);}
_observableArray=newArray;_observableArray.addEventListener('insert',_handleEvent);_observableArray.addEventListener('remove',_handleEvent);_observableArray.addEventListener('replace',_handleEvent);_observableArray.addEventListener('reset',_handleEvent);if(this.enabled){_reset(_observableArray.array);}},destroy:function(){if(_observableArray){_observableArray.removeEventListener('insert',_handleEvent);_observableArray.removeEventListener('remove',_handleEvent);_observableArray.removeEventListener('replace',_handleEvent);_observableArray.removeEventListener('reset',_handleEvent);}
_remove(0,_observableArray.length);elements.delete(_root);_root=null;_observableArray=null;_templateFunc=null;_enabled=false;},get element(){return _root;},set enabled(value){if(_enabled!==value){_enabled=value;_enabledChanged();}},get enabled(){return _enabled;}};if(elements.has(_root)){elements.get(_root).destroy();}
elements.set(_root,view);_root.innerHTML='';view.set(observableArray);return view;};return ListView;});

View file

@ -0,0 +1,2 @@
define([],function(){'use strict';return navigator.battery;});

View file

@ -0,0 +1,2 @@
define([],function(){'use strict';return window.navigator.mozApps;});

View file

@ -0,0 +1,2 @@
define([],function(){'use strict';if(navigator.mozBluetooth){return navigator.mozBluetooth;}else{return null;}});

View file

@ -0,0 +1,2 @@
define(['require','shared/lazy_loader'],function(require){'use strict';var LazyLoader=require('shared/lazy_loader');var SettingsUtils={loadTemplate:function su_loadTemplate(panelId,callback){var templateElement=document.getElementById(panelId);if(!templateElement){callback(null);}else{LazyLoader.load([templateElement],function(){callback(templateElement.innerHTML);});}},runHeaderFontFit:function su_runHeaderFontFit(header){var titles=header.querySelectorAll('h1');[].forEach.call(titles,function(title){title.textContent=title.textContent;});}};return SettingsUtils;});

View file

@ -0,0 +1,8 @@
define(['require','modules/base/module','modules/base/event_emitter'],function(require){'use strict';var Module=require('modules/base/module');var EventEmitter=require('modules/base/event_emitter');var APIS=['unlockCardLock','setCardLock','updateContact','getCardLock','getCardLockRetryCount'];var EVENT_CHANGE_APIS=['unlockCardLock','setCardLock'];var _debug=false;var debug=function(){};if(_debug){debug=function ss_debug(msg){console.log('--> [SimSecurity]: '+msg);};}
var SimSecurity=Module.create(function(){this.super(EventEmitter).call(this,['pin-enabled','pin-disabled','pin2-enabled','pin2-disabled','fdn-enabled','fdn-disabled','pin-changed','pin2-changed','puk2-changed']);}).extend(EventEmitter);SimSecurity.prototype._getIccByCardIndex=function(cardIndex){if(cardIndex===undefined){return null;}
var iccObj;if(navigator.mozMobileConnections[cardIndex]){var iccId=navigator.mozMobileConnections[cardIndex].iccId;if(iccId){iccObj=navigator.mozIccManager.getIccById(iccId);}}
return iccObj;};APIS.forEach(function(apiName){SimSecurity.prototype[apiName]=function(cardIndex){if(arguments.length<2){this.throw('You are using SimSecurity API wrongly and you may forget'+'to put your cardIndex, please check again');}
var passedArguments=[].slice.call(arguments,1);var icc=this._getIccByCardIndex(cardIndex);if(!icc){console.error('We can\'t find needed icc object');return Promise.reject();}else{var func=icc[apiName];var promise=func.apply(icc,passedArguments);return promise.then((result)=>{if(EVENT_CHANGE_APIS.indexOf(apiName)>-1){var status='';var lockType=passedArguments[0].lockType;var enabled=passedArguments[0].enabled;var newPin=passedArguments[0].newPin;if(newPin){status='changed';}else{status=enabled?'enabled':'disabled';}
debug('_emitEvent: '+lockType+'-'+status+' through card '+cardIndex);this._emitEvent(lockType+'-'+status,cardIndex);}
return result;});}};});var simSecurity=new SimSecurity();return simSecurity;});

View file

@ -0,0 +1,5 @@
define(['require','modules/base/module','modules/mvvm/observable'],function(require){'use strict';var Module=require('modules/base/module');var Observable=require('modules/mvvm/observable');var StateModel=Module.create(function StateModel({onInit,onGetState,onSetState}){if(typeof onInit!=='function'||typeof onGetState!=='function'||typeof onSetState!=='function'){this.throw('invalid arguments');}
this.super(Observable).call(this);var argument=arguments[0];this._init(onInit.bind(argument),onGetState.bind(argument),onSetState.bind(argument));}).extend(Observable);Observable.defineObservableProperty(StateModel.prototype,'targetState',{value:null});Observable.defineObservableProperty(StateModel.prototype,'currentState',{readonly:true,value:null});Observable.defineObservableProperty(StateModel.prototype,'transitioning',{readonly:true,value:false});StateModel.prototype._init=function(onInit,onGetState,onSetState){this._onInit=onInit;this._onGetState=onGetState;this._onSetState=onSetState;this.targetState=this._onInit((realState)=>{if(!this._transitioning){this._currentState=realState;this.targetState=realState;}});this._currentState=this.targetState;this._onGetState().then((realState)=>{this._currentState=realState;if(this.targetState!==realState){this._setState(this.targetState);}
this.observe('targetState',(newState)=>{if(this._transitioning||newState===this._currentState){return;}
this._setState(newState);});}).catch((err)=>{this.error('initialization error '+err);});};StateModel.prototype._setState=function(state){this.debug('set state: '+state);this._transitioning=true;return this._onSetState(state).then((realState)=>{this.debug('set state completed: '+state+', real state: '+realState);this._currentState=realState;if(this.targetState!==realState){this._setState(this.targetState);}else{this._transitioning=false;}},(realState)=>{this.debug('set state failed: '+state+', real state: '+realState);this._currentState=realState;this.targetState=realState;this._transitioning=false;});};return StateModel;});

View file

@ -0,0 +1,12 @@
define(['require','modules/settings_cache','shared/wifi_helper'],function(require){'use strict';var SettingsCache=require('modules/settings_cache');var WifiHelper=require('shared/wifi_helper');var wifiManager=WifiHelper.getWifiManager();var settings=navigator.mozSettings;var _currentNetwork=wifiManager&&wifiManager.connection&&wifiManager.connection.network;var WifiContext={_wifiEnabledListeners:[],_wifiDisabledListeners:[],_wifiStatusChangeListeners:[],_wifiStatusTextChangeListeners:[],_wifiConnectionInfoUpdateListeners:[],_wifiNetworkForgottenListeners:[],_wifiWrongPasswordListeners:[],_wifiStatusText:{id:null},_macAddress:'',_init:function(){if(!wifiManager){return;}
settings.createLock().set({'wifi.enabled':wifiManager.enabled});this._bindEvents();this._updateWifi();},_bindEvents:function(){var self=this;var _updateWifi=this._updateWifi.bind(this);var _updateNetworkStatus=this._updateNetworkStatus.bind(this);this._wifiEnabledListeners.push(_updateWifi,_updateNetworkStatus);this._wifiDisabledListeners.push(_updateWifi);this._wifiStatusChangeListeners.push(_updateWifi,_updateNetworkStatus);if(wifiManager){wifiManager.onenabled=function(event){self._wifiEnabled(event);self._wifiStatusTextChange();};wifiManager.ondisabled=function(event){self._wifiDisabled(event);self._wifiStatusTextChange();};wifiManager.onstatuschange=function(event){self._wifiStatusChange.call(self,event);self._wifiStatusTextChange();};wifiManager.onconnectioninfoupdate=self._wifiConnectionInfoUpdate.bind(self);}},_updateWifi:function(event){var self=this;if(!wifiManager){return;}
if(!this._macAddress&&settings){SettingsCache.getSettings(function(results){self._macAddress=results['deviceinfo.mac'];});}
if(wifiManager.enabled){this._storeMacAddress();}
this._updateWifiStatusText(event);},_updateWifiStatusText:function(event){if(wifiManager.enabled){var network=(event&&event.network)?event.network:wifiManager.connection.network;var status=event&&event.status?event.status:wifiManager.connection.status;var networkProp=network?{ssid:network.ssid}:null;this._wifiStatusText={id:'full-status-'+status,args:networkProp};}else{this._wifiStatusText={id:'disabled'};}},_updateNetworkStatus:function(event){if(!_currentNetwork){return;}
if(event&&event.network&&_currentNetwork.ssid!=event.network.ssid){return;}
var networkStatus=event?event.status:wifiManager.connection.status;if(networkStatus==='connectingfailed'){var isCurrentNetworkKnown=_currentNetwork.known;delete _currentNetwork.password;this.forgetNetwork(_currentNetwork);if(isCurrentNetworkKnown===false){this._wifiWrongPassword();}}},_wifiEnabled:function(event){var self=this;this._syncWifiEnabled(true,function(){self._wifiEnabledListeners.forEach(function(listener){listener(event);});});},_wifiDisabled:function(event){var self=this;this._syncWifiEnabled(false,function(){self._wifiDisabledListeners.forEach(function(listener){listener(event);});});},_wifiStatusChange:function(event){this._wifiStatusChangeListeners.forEach(function(listener){listener(event);});},_wifiStatusTextChange:function(){this._wifiStatusTextChangeListeners.forEach(function(listener){listener();});},_wifiWrongPassword:function(){this._wifiWrongPasswordListeners.forEach(function(listener){listener();});},_wifiConnectionInfoUpdate:function(event){this._wifiConnectionInfoUpdateListeners.forEach(function(listener){listener(event);});},_wifiNetworkForgotten:function(event){this._wifiNetworkForgottenListeners.forEach(function(listener){listener(event);});},_storeMacAddress:function(){if(!wifiManager){return;}
if(settings&&wifiManager.macAddress&&wifiManager.macAddress!==this._macAddress&&wifiManager.macAddress!=='undefined'){this._macAddress=wifiManager.macAddress;settings.createLock().set({'deviceinfo.mac':this._macAddress});}},_syncWifiEnabled:function(enabled,callback){SettingsCache.getSettings(function(results){var wifiEnabled=results['wifi.enabled'];if(wifiEnabled!==enabled){settings.createLock().set({'wifi.enabled':enabled});}
callback();});},_removeEventListener:function(listeners,callback){var index=listeners.indexOf(callback);if(index>=0){listeners.splice(index,1);}},associateNetwork:function(network,cb){cb=cb||function(){};var request=wifiManager.associate(network);var done=function(){if(!request.error){_currentNetwork=network;}
cb(request.error);};request.onsuccess=done;request.onerror=done;},forgetNetwork:function(network,cb){cb=cb||function(){};var request=wifiManager.forget(network);var done=function(){if(!request.error){_currentNetwork=null;WifiContext._wifiNetworkForgotten({network:network});}
cb(request.error);};request.onsuccess=done;request.onerror=done;}};WifiContext._init();return{addEventListener:function(eventName,callback){if(eventName==='wifiEnabled'){WifiContext._wifiEnabledListeners.push(callback);}else if(eventName==='wifiDisabled'){WifiContext._wifiDisabledListeners.push(callback);}else if(eventName==='wifiStatusChange'){WifiContext._wifiStatusChangeListeners.push(callback);}else if(eventName==='wifiStatusTextChange'){WifiContext._wifiStatusTextChangeListeners.push(callback);}else if(eventName==='wifiWrongPassword'){WifiContext._wifiWrongPasswordListeners.push(callback);}else if(eventName==='wifiConnectionInfoUpdate'){WifiContext._wifiConnectionInfoUpdateListeners.push(callback);}else if(eventName==='wifiNetworkForgotten'){WifiContext._wifiNetworkForgottenListeners.push(callback);}},removeEventListener:function(eventName,callback){if(eventName==='wifiEnabled'){WifiContext._removeEventListener(WifiContext._wifiEnabledListeners,callback);}else if(eventName==='wifiDisabled'){WifiContext._removeEventListener(WifiContext._wifiDisabledListeners,callback);}else if(eventName==='wifiStatusChange'){WifiContext._removeEventListener(WifiContext._wifiStatusChangeListeners,callback);}else if(eventName==='wifiStatusTextChange'){WifiContext._removeEventListener(WifiContext._wifiStatusTextChangeListeners,callback);}else if(eventName==='wifiWrongPassword'){WifiContext._removeEventListener(WifiContext._wifiWrongPasswordListeners,callback);}else if(eventName==='wifiConnectionInfoUpdate'){WifiContext._removeEventListener(WifiContext._wifiConnectionInfoUpdateListeners,callback);}else if(eventName==='wifiNetworkForgotten'){WifiContext._removeEventListener(WifiContext._wifiNetworkForgottenListeners,callback);}},get wifiStatusText(){return WifiContext._wifiStatusText;},get currentNetwork(){return _currentNetwork;},forgetNetwork:WifiContext.forgetNetwork,associateNetwork:WifiContext.associateNetwork};});

View file

@ -0,0 +1,12 @@
define(['require','shared/wifi_helper'],function(require){'use strict';var WifiHelper=require('shared/wifi_helper');var wifiManager=WifiHelper.getWifiManager();var WifiUtils={newExplanationItem:function(message){var li=document.createElement('li');li.className='explanation';li.setAttribute('data-l10n-id',message);return li;},newListItem:function(options){var network=options.network;var showNotInRange=options.showNotInRange||false;var onClick=options.onClick||function(){};var icon=document.createElement('aside');icon.classList.add('pack-end');icon.classList.add('wifi-icon');var level=Math.min(Math.floor(network.relSignalStrength/20),4);icon.classList.add('level-'+level);var ssid=document.createElement('span');ssid.dir='auto';ssid.textContent=network.ssid;var small=document.createElement('small');var keys=WifiHelper.getSecurity(network);var networkNotInRange=(network.known&&level===0);var hasSecurity=(keys&&keys.length);if(hasSecurity){if(showNotInRange&&networkNotInRange){small.setAttribute('data-l10n-id','notInRange');}else{document.l10n.setAttributes(small,'securedBy',{capabilities:keys.join(', ')});}
icon.classList.add('secured');}else{if(showNotInRange&&networkNotInRange){small.setAttribute('data-l10n-id','notInRange');}else{small.setAttribute('data-l10n-id','securityOpen');}}
var a=document.createElement('a');a.appendChild(ssid);a.appendChild(small);var li=document.createElement('li');li.dataset.ssid=network.ssid;li.appendChild(icon);li.appendChild(a);icon.classList.add('wifi-signal');var networkStatus=WifiHelper.getNetworkStatus(network);var kActiveStatuses=['associated','connecting','connected'];if(-1!==kActiveStatuses.indexOf(networkStatus)){li.classList.add('active');if('connected'===networkStatus){icon.classList.add('connected');}else{icon.classList.add('connecting');}
small.setAttribute('data-l10n-id','short-status-'+networkStatus);}
li.onclick=function(){onClick(network);};return li;},changeDisplay:function(panel,security){var eap=panel.querySelector('li.eap select');var identity=panel.querySelector('input[name=identity]');var password=panel.querySelector('input[name=password]');var authPhase2=panel.querySelector('li.auth-phase2 select');var certificate=panel.querySelector('li.server-certificate select');var description=panel.querySelector('li.server-certificate-description');if(security==='WEP'||security==='WPA-PSK'){identity.parentNode.style.display='none';password.parentNode.style.display='block';authPhase2.parentNode.parentNode.style.display='none';certificate.parentNode.parentNode.style.display='none';description.style.display='none';}else if(security==='WPA-EAP'){if(eap){switch(eap.value){case'SIM':identity.parentNode.style.display='none';password.parentNode.style.display='none';authPhase2.parentNode.parentNode.style.display='none';certificate.parentNode.parentNode.style.display='none';description.style.display='none';break;case'PEAP':case'TLS':case'TTLS':identity.parentNode.style.display='block';password.parentNode.style.display='block';authPhase2.parentNode.parentNode.style.display='block';certificate.parentNode.parentNode.style.display='block';description.style.display='block';break;default:break;}}}else{identity.parentNode.style.display='none';password.parentNode.style.display='none';}},initializeAuthFields:function(panel,network){var ssid=panel.querySelector('input[name=ssid]');var identity=panel.querySelector('input[name=identity]');var password=panel.querySelector('input[name=password]');var showPassword=panel.querySelector('gaia-checkbox[name=show-pwd]');var eap=panel.querySelector('li.eap select');var certificate=panel.querySelector('li.server-certificate select');var submitButton=panel.querySelector('button[type=submit]');this.loadImportedCertificateOptions(certificate);identity.value=network.identity||'';password.type='password';password.value=network.password||'';showPassword.checked=false;showPassword.onchange=function(){password.type=this.checked?'text':'password';};var checkPassword=function(){var key=WifiHelper.getKeyManagement(network);var isDisabled=!WifiHelper.isValidInput(key,password.value,identity.value,eap.value);if(ssid){isDisabled=isDisabled||!WifiHelper.isSSIDValid(ssid.value);}
submitButton.disabled=isDisabled;};eap.onchange=function(){var key=WifiHelper.getKeyManagement(network);checkPassword();WifiUtils.changeDisplay(panel,key);};if(ssid){ssid.oninput=checkPassword;}
password.oninput=checkPassword;identity.oninput=checkPassword;checkPassword();},loadImportedCertificateOptions:function(select){if(!wifiManager.getImportedCerts){return;}
var certRequest=wifiManager.getImportedCerts();certRequest.onsuccess=function(){var i;var certList=certRequest.result;var certificateList=certList.ServerCert;var originLengthOfOptions=select.options.length;for(i=0;i<originLengthOfOptions-1;i++){select.remove(1);}
for(i=0;i<certificateList.length;i++){var option=document.createElement('option');option.text=certificateList[i];option.value=certificateList[i];select.add(option,null);}};certRequest.onerror=function(){console.warn('getImportedCerts failed');};},updateNetworkSignal:function(network,networkSignal){var li=document.querySelector('li[data-ssid="'+network.ssid+'"]');var icon=li.querySelector('aside');icon.className=icon.className.replace(/level-\w*/,'');var level=Math.min(Math.floor(networkSignal/20),4);icon.classList.add('level-'+level);},getNetworkKey:function(network){if(!network){return'';}else{var key=network.ssid+'+'+WifiHelper.getSecurity(network).join('+');return key;}},updateListItemStatus:function(options){options=options||{};var listItems=options.listItems;var activeItemDOM=options.activeItemDOM;var network=options.network;var networkStatus=options.networkStatus;if(!network||!networkStatus||!listItems){console.log('Please check passing options for updateListItemStatus');return;}
var key=this.getNetworkKey(network);var listItemDOM=listItems[key];if(activeItemDOM&&activeItemDOM!=listItemDOM){activeItemDOM.classList.remove('active');activeItemDOM.querySelector('small').setAttribute('data-l10n-id','short-status-disconnected');activeItemDOM.querySelector('aside').classList.remove('connecting');activeItemDOM.querySelector('aside').classList.remove('connected');}
if(listItemDOM){listItemDOM.classList.add('active');listItemDOM.querySelector('small').setAttribute('data-l10n-id','short-status-'+networkStatus);if(networkStatus==='connecting'||networkStatus==='associated'){listItemDOM.querySelector('aside').classList.remove('connected');listItemDOM.querySelector('aside').classList.add('connecting');}else if(networkStatus==='connected'){listItemDOM.querySelector('aside').classList.remove('connecting');listItemDOM.querySelector('aside').classList.add('connected');}}}};return WifiUtils;});