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:
parent
93e3a48004
commit
b38dea0597
25901 changed files with 9982925 additions and 369 deletions
|
|
@ -0,0 +1,7 @@
|
|||
;'use strict';function ActionsMenu(menuElement){this._menuElement=menuElement;function getButton(action){return menuElement.querySelector('button[data-action="'+action+'"]');}
|
||||
this._shareButton=getButton('share');this._deleteButton=getButton('delete');this._shareButton.addEventListener('click',this._share.bind(this));this._deleteButton.addEventListener('click',this._delete.bind(this));}
|
||||
ActionsMenu.prototype={open:function(tone,inUseAs,callback){if(!this._menuElement.hidden){throw new Error('actions menu is already open');}
|
||||
if(tone.shareable||tone.deletable){this._tone=tone;this._callback=callback;this._menuElement.hidden=false;this._inUseAs=inUseAs;this._shareButton.hidden=!tone.shareable;this._shareButton.dataset.l10nId='actions-share-'+tone.type;this._deleteButton.hidden=!tone.deletable;this._deleteButton.dataset.l10nId='actions-delete-'+tone.type;}
|
||||
return!this._menuElement.hidden;},_share:function(event){var self=this;this._menuElement.hide();this._tone.getBlob().then(function(blob){var activity=new MozActivity({name:'share',data:{type:'audio/*',__bug1015513_hide_from_self__:true,number:1,blobs:[blob],filenames:[self._tone.filename],metadata:[{title:self._tone.name}]}});activity.onerror=function(e){console.warn('share activity error:',activity.error.name);self._finish('share');};activity.onsuccess=function(e){self._finish('share');};});},_delete:function(event){var self=this;this._menuElement.hide();var messageKey='delete-message';if(self._inUseAs.length){messageKey+='-default-'+self._inUseAs[0];}
|
||||
var cancelButton={title:'delete-cancel',callback:function(){CustomDialog.hide();self._finish('cancel');}};var confirmButton={title:'delete-confirm',callback:function(){CustomDialog.hide();Toaster.showToast({messageL10nId:'deleted-'+self._tone.type,latency:3000,useTransition:true});self._tone.remove();self._finish('delete');}};CustomDialog.show('delete-title',{id:messageKey,args:{tone:self._tone.name}},cancelButton,confirmButton);},_finish:function(command){if(this._callback){this._callback(command);}
|
||||
this._tone=null;this._callback=null;this._inUseAs=null;}};
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
;;'use strict';window.builtInRingtones=(function(){var ID_PREFIX='builtin:';var BASE_URLS={'ringtone':'/shared/resources/media/ringtones/','alerttone':'/shared/resources/media/notifications/'};var mimeTypeMap={'.mp3':'audio/mp3','.mp4':'audio/mp4','.ogg':'audio/ogg','.opus':'audio/ogg'};function inferMimeType(filename){var dot=filename.lastIndexOf('.');if(dot===-1){console.warn('Couldn\'t infer mimetype for '+filename);return'application/octet-stream';}
|
||||
var ext=filename.substr(dot);return mimeTypeMap[ext]||'application/octet-stream';}
|
||||
function BuiltInRingtone(toneType,filename,toneDef){this._toneType=toneType;this._filename=filename;this._l10nID=toneDef.l10nID;}
|
||||
BuiltInRingtone.prototype={get _rootName(){return this._filename.replace(/\.\w+$/,'');},get name(){return navigator.mozL10n.get(this.l10nID);},get filename(){return this._filename;},get l10nID(){return this._l10nID;},get id(){return ID_PREFIX+this._toneType+'/'+this._rootName;},get type(){return this._toneType;},get url(){return BASE_URLS[this._toneType]+this._filename;},get shareable(){return true;},get deletable(){return false;},getBlob:function(){var url=this.url;return new Promise(function(resolve,reject){var xhr=new XMLHttpRequest();xhr.open('GET',url);xhr.overrideMimeType(inferMimeType(url));xhr.responseType='blob';xhr.send();xhr.onload=function(){resolve(xhr.response);};xhr.onerror=function(){var err=new Error('Could not read sound file: '+url+' (status: '+xhr.status+')');console.error(err);reject(err);};});}};function idToToneType(id){var slash=id.indexOf('/');if(id.indexOf(ID_PREFIX)!==0||slash===-1){throw new Error('invalid id: '+id);}
|
||||
return id.substring(ID_PREFIX.length,slash);}
|
||||
function idMatchesFilename(id,toneType,filename){return id===ID_PREFIX+toneType+'/'+filename.replace(/\.\w+$/,'');}
|
||||
var toneDefsCache={};function getSoundFilenames(toneType){if(!(toneType in BASE_URLS)){throw new Error('tone type not supported: '+toneType);}
|
||||
return new Promise(function(resolve,reject){if(toneType in toneDefsCache){resolve(toneDefsCache[toneType]);return;}
|
||||
var xhr=new XMLHttpRequest();xhr.open('GET',BASE_URLS[toneType]+'list.json');xhr.responseType='json';xhr.send(null);xhr.onload=function(){toneDefsCache[toneType]=xhr.response;resolve(xhr.response);};xhr.onerror=function(){var err=new Error('Could not read sounds list for '+toneType+' (status: '+xhr.status+')');console.error(err);reject(err);};});}
|
||||
function list(toneType){return getSoundFilenames(toneType).then(function(toneDefs){var tones=[];for(var filename in toneDefs){tones.push(new BuiltInRingtone(toneType,filename,toneDefs[filename]));}
|
||||
return tones;});}
|
||||
function get(id){return new Promise(function(resolve,reject){var toneType=idToToneType(id);resolve(getSoundFilenames(toneType).then(function(toneDefs){for(var filename in toneDefs){if(idMatchesFilename(id,toneType,filename)){return new BuiltInRingtone(toneType,filename,toneDefs[filename]);}}
|
||||
var err=new Error('No '+toneType+' found with id = '+id);console.error(err);throw err;}));});}
|
||||
return{list:list,get:get,get toneTypes(){return Object.keys(BASE_URLS);}};})();
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
;;;'use strict';window.customRingtones=(function(){var ID_PREFIX='custom:';function CustomRingtone(info,dbKey){this._name=info.name;if(info.uniqueNum!==0||info.isExplicitNum){this._name+=' ('+info.uniqueNum+')';}
|
||||
this._subtitle=info.subtitle||null;this._id=ID_PREFIX+dbKey;this._blob=info.blob;}
|
||||
CustomRingtone.prototype={get name(){return this._name;},get filename(){return this._blob.name;},get subtitle(){return this._subtitle;},get id(){return this._id;},get type(){return'ringtone';},get url(){return this._url||(this._url=URL.createObjectURL(this._blob));},get shareable(){return true;},get deletable(){return true;},remove:function(){return remove(this.id);},getBlob:function(){return Promise.resolve(this._blob);}};function idToDBKey(id){if(id.indexOf(ID_PREFIX)!==0){throw new Error('invalid id: '+id);}
|
||||
return parseInt(id.substr(ID_PREFIX.length));}
|
||||
var DBNAME='customTones';var DBVERSION=1;var STORENAME='ringtones';var db=null;function withStore(type,callback){if(db){var transaction=db.transaction(STORENAME,type);callback(null,transaction.objectStore(STORENAME),transaction);}else{var openreq=indexedDB.open(DBNAME,DBVERSION);openreq.onerror=function(){console.error('customRingtones: can\'t open database:',openreq.error.name);callback(openreq.error);};openreq.onupgradeneeded=function(){var objStore=openreq.result.createObjectStore(STORENAME,{autoIncrement:true});objStore.createIndex('fullname',['name','subtitle','uniqueNum'],{unique:false});};openreq.onsuccess=function(){db=openreq.result;var transaction=db.transaction(STORENAME,type);callback(null,transaction.objectStore(STORENAME),transaction);};}}
|
||||
function uniqueify(info){return new Promise(function(resolve,reject){withStore('readonly',function(err,store){if(err){reject(err);return;}
|
||||
var nextUniqueNum=info.uniqueNum||0;var index=store.index('fullname');var req=index.openCursor(IDBKeyRange.bound([info.name,info.subtitle,0],[info.name,info.subtitle,Infinity]));req.onsuccess=function(event){var cursor=event.target.result;if(!cursor||nextUniqueNum<cursor.value.uniqueNum){resolve(nextUniqueNum);return;}
|
||||
nextUniqueNum=cursor.value.uniqueNum+1;cursor.continue();};req.onerror=function(){console.error('Error in customRingtones.uniqueify(): ',req.error.name);reject(req.error);};});});}
|
||||
function add(info){var cleanedInfo={name:info.name||'',subtitle:info.subtitle||'',blob:info.blob,uniqueNum:0};var m=/^(.*) \((\d+)\)$/.exec(cleanedInfo.name);if(m){cleanedInfo.name=m[1];cleanedInfo.uniqueNum=m[2];cleanedInfo.isExplicitNum=true;}
|
||||
return uniqueify(cleanedInfo).then(function(uniqueNum){return new Promise(function(resolve,reject){withStore('readwrite',function(err,store,transaction){if(err){reject(err);return;}
|
||||
cleanedInfo.uniqueNum=uniqueNum;var tone;var req=store.add(cleanedInfo);req.onsuccess=function(event){tone=new CustomRingtone(cleanedInfo,event.target.result);};transaction.oncomplete=function(event){resolve(tone);};transaction.onabort=transaction.onerror=function(){console.error('Error in customRingtones.add(): ',transaction.error.name);reject(req.error);};});});});}
|
||||
function remove(id){return new Promise(function(resolve,reject){withStore('readwrite',function(err,store,transaction){if(err){reject(err);return;}
|
||||
var req=store.delete(idToDBKey(id));transaction.oncomplete=function(event){resolve();};transaction.onabort=transaction.onerror=function(){console.error('Error in customRingtones.remove(): ',transaction.error.name);reject(req.error);};});});}
|
||||
function clear(){return new Promise(function(resolve,reject){withStore('readwrite',function(err,store,transaction){if(err){reject(err);return;}
|
||||
var req=store.clear();transaction.oncomplete=function(event){resolve();};transaction.onabort=transaction.onerror=function(){console.error('Error in customRingtones.clear(): ',transaction.error.name);reject(req.error);};});});}
|
||||
function get(id){return new Promise(function(resolve,reject){withStore('readonly',function(err,store){if(err){reject(err);return;}
|
||||
var key=idToDBKey(id);var req=store.get(key);req.onsuccess=function(event){var data=event.target.result;if(!data){resolve(null);}else{resolve(new CustomRingtone(data,key));}};req.onerror=function(){console.error('Error in customRingtones.get(): ',req.error.name);reject(req.error);};});});}
|
||||
function list(toneType){return new Promise(function(resolve,reject){if(toneType==='alerttone'){resolve([]);return;}
|
||||
withStore('readonly',function(err,store){if(err){reject(err);return;}
|
||||
var req=store.openCursor();var results=[];req.onsuccess=function listOnSuccess(event){var cursor=event.target.result;if(cursor){var value=cursor.value;results.push(new CustomRingtone(value,cursor.key));cursor.continue();}else{resolve(results);}};req.onerror=function listOnError(){console.error('Error in customRingtones.list(): ',req.error.name);reject(req.error);};});});}
|
||||
return{add:add,remove:remove,clear:clear,get:get,list:list};})();
|
||||
5
assets/webapps/ringtones.gaiamobile.org/js/manage.js
Normal file
5
assets/webapps/ringtones.gaiamobile.org/js/manage.js
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
;'use strict';navigator.mozSetMessageHandler('activity',function(activity){var tonePlayer=new TonePlayer();document.getElementById('header').addEventListener('action',function(){tonePlayer.stop();window.close();});function addNewTone(customRingtonesList){tonePlayer.stop();var pickActivity=new MozActivity({name:'pick',data:{type:'audio/*'}});pickActivity.onsuccess=function(){var result=pickActivity.result;var popup=window.open('share.html','share','mozhaidasheet');popup.addEventListener('load',function loaded(){popup.removeEventListener('load',loaded);popup.postMessage(result,window.location.origin);});window.addEventListener('message',function receive(event){window.removeEventListener('message',receive);if(event.origin!==window.location.origin){console.error('Couldn\'t recieve message: origins don\'t match',event.origin,window.location.origin);return;}
|
||||
var data=event.data;if(data.command!=='save'){return;}
|
||||
window.customRingtones.get(data.details.toneID).then(function(tone){customRingtonesList.add(tone);});});};}
|
||||
var actionsMenu=new ActionsMenu(document.getElementById('ringtone-actions'));function ManagerToneList(...args){ToneList.apply(this,args);}
|
||||
ManagerToneList.prototype=Object.create(ToneList.prototype);ManagerToneList.prototype.constructor=ManagerToneList;ManagerToneList.prototype.makeItem=function(tone){var item=ToneList.prototype.makeItem.call(this,tone);item.querySelector('.desc').addEventListener('click',function(){tonePlayer.setTone(tone,function(playing){item.dataset.playing=playing;});});var self=this;var actionsButton=item.querySelector('.actions-button');actionsButton.addEventListener('click',function(){tonePlayer.stop();window.systemTones.isInUse(tone).then(function(inUseAs){actionsMenu.open(tone,inUseAs,function(command){if(command==='delete'){self.remove(tone);inUseAs.forEach(function(toneType){window.systemTones.getDefault(toneType).then(function(tone){window.systemTones.set(toneType,tone);});});}});});});return item;};navigator.mozL10n.once(function(){var promises=[];var listParent=document.getElementById('list-parent');window.builtInRingtones.toneTypes.forEach(function(toneType){var builtInList=new ManagerToneList('section-title-builtin-'+toneType,listParent);promises.push(window.builtInRingtones.list(toneType).then(function(tones){builtInList.add(tones);}));var customList=new ManagerToneList('section-title-custom-'+toneType,listParent);promises.push(window.customRingtones.list(toneType).then(function(tones){customList.add(tones);if(toneType==='ringtone'){document.getElementById('add').addEventListener('click',addNewTone.bind(null,customList));}}));promises.push(window.sdCardRingtones.list(toneType).then(function(tones){customList.add(tones);}));});Promise.all(promises).then(function(){document.querySelector('body').dataset.ready=true;});});});
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
;'use strict';var Templates={soundList:function({l10nID}){return Sanitizer.escapeHTML`
|
||||
<section hidden>
|
||||
<gaia-subheader skin="organic">
|
||||
<span data-l10n-id="${l10nID}"></span>
|
||||
</gaia-subheader>
|
||||
<ul data-type="list"></ul>
|
||||
</section>`;},soundItem:function({l10nID,name}){return Sanitizer.escapeHTML`
|
||||
<li>
|
||||
<aside class="pack-end">
|
||||
<a class="actions-button"></a>
|
||||
</aside>
|
||||
<div class="desc">
|
||||
<div class="play-icon"></div>
|
||||
<p class="name"><bdi data-l10n-id="${l10nID}">${name}</bdi></p>
|
||||
</div>
|
||||
</li>`;}};
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
;'use strict';function NullRingtone(){}
|
||||
NullRingtone.prototype={get name(){return navigator.mozL10n.get(this.l10nID);},get filename(){return null;},get l10nID(){return'ringtone-none';},get id(){return'none:none';},get type(){return null;},get url(){return null;},get shareable(){return false;},get deletable(){return false;},getBlob:function(){return new Promise(function(resolve,reject){resolve(null);});}};
|
||||
5
assets/webapps/ringtones.gaiamobile.org/js/pick.js
Normal file
5
assets/webapps/ringtones.gaiamobile.org/js/pick.js
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
;'use strict';navigator.mozSetMessageHandler('activity',function(activity){var tonePlayer=new TonePlayer();var toneTypes=activity.source.data.type;var allowNone=activity.source.data.allowNone;var currentToneID=activity.source.data.currentToneID;var allToneTypes=window.builtInRingtones.toneTypes;if(!Array.isArray(toneTypes)){toneTypes=[toneTypes];}
|
||||
toneTypes=toneTypes.filter(function(x){return allToneTypes.indexOf(x)!==-1;});var otherToneTypes=allToneTypes.filter(function(x){return toneTypes.indexOf(x)===-1;});document.getElementById('header').addEventListener('action',function(){tonePlayer.stop();activity.postError('cancelled');});document.getElementById('set').addEventListener('click',function(){tonePlayer.stop();tonePlayer.isValid(function(valid){if(!valid){activity.postError('cancelled');}
|
||||
var selectedTone=tonePlayer.currentTone;selectedTone.getBlob().then(function(blob){activity.postResult({name:selectedTone.name,l10nID:selectedTone.l10nID,id:selectedTone.id,blob:blob});});});});function PickerToneList(...args){ToneList.apply(this,args);}
|
||||
PickerToneList.prototype=Object.create(ToneList.prototype);PickerToneList.prototype.constructor=PickerToneList;PickerToneList.prototype.makeItem=function(tone){var item=ToneList.prototype.makeItem.call(this,tone);var input=item.querySelector('gaia-radio');input.checked=(tone.id===currentToneID);input.addEventListener('click',function(){tonePlayer.setTone(tone);document.getElementById('set').disabled=false;});return item;};navigator.mozL10n.once(function(){var promises=[];var listParent=document.getElementById('list-parent');function addToneLists(toneType,includeNone){var builtInList=new PickerToneList('section-title-builtin-'+toneType,listParent);promises.push(window.builtInRingtones.list(toneType).then(function(tones){builtInList.add(tones);if(includeNone){builtInList.add(new NullRingtone());}}));var customList=new PickerToneList('section-title-custom-'+toneType,listParent);promises.push(window.customRingtones.list(toneType).then(function(tones){customList.add(tones);}));promises.push(window.sdCardRingtones.list(toneType).then(function(tones){customList.add(tones);}));}
|
||||
toneTypes.forEach(function(toneType,i){addToneLists(toneType,i===0&&allowNone);});otherToneTypes.forEach(function(toneType){addToneLists(toneType);});Promise.all(promises).then(function(listsData){document.querySelector('body').dataset.ready=true;});});});
|
||||
17
assets/webapps/ringtones.gaiamobile.org/js/pick_templates.js
Normal file
17
assets/webapps/ringtones.gaiamobile.org/js/pick_templates.js
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
;'use strict';var Templates={soundList:function({l10nID}){return Sanitizer.escapeHTML`
|
||||
<section hidden>
|
||||
<gaia-subheader skin="organic">
|
||||
<span data-l10n-id="${l10nID}"></span>
|
||||
</gaia-subheader>
|
||||
<section data-type="list">
|
||||
<ul></ul>
|
||||
</section>
|
||||
</section>`;},soundItem:function({l10nID,name}){return Sanitizer.escapeHTML`
|
||||
<li>
|
||||
<gaia-radio name="sounds" class="truncate">
|
||||
<label class="name">
|
||||
<bdi data-l10n-id="${l10nID}">${name}</bdi>
|
||||
</label>
|
||||
<details></details>
|
||||
</gaia-radio>
|
||||
</li>`;}};
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
;;'use strict';window.sdCardRingtones=(function(){var ID_PREFIX='sdcard:';var BASE_DIRS={'ringtone':'Ringtones','alerttone':'Notifications'};function pathToType(path){var folder=new RegExp('^(/[^/]*/)?([^/]*)/').exec(path)[2];for(var type in BASE_DIRS){if(BASE_DIRS[type]===folder){return type;}}
|
||||
throw new Error('unexpected SD card folder: '+folder);}
|
||||
function SDCardRingtone(file){var leafname=file.name.substr(file.name.lastIndexOf('/')+1);this._name=leafname.replace(/\.\w+$/,'');this._blob=file;this._type=pathToType(this._blob.name);}
|
||||
SDCardRingtone.prototype={get name(){return this._name;},get filename(){return this._blob.name;},get subtitle(){return navigator.mozL10n.get('sd-card-subtitle');},get id(){return ID_PREFIX+this._blob.name;},get type(){return this._type;},get url(){return this._url||(this._url=URL.createObjectURL(this._blob));},get shareable(){return true;},get deletable(){return true;},remove:function(){return remove(this.id);},getBlob:function(){return Promise.resolve(this._blob);}};function idToFilename(id){return id.substr(ID_PREFIX.length);}
|
||||
var defaultStorage=navigator.getDeviceStorage('music');function remove(id){return new Promise(function(resolve,reject){var request=defaultStorage.delete(idToFilename(id));request.onsuccess=function(){resolve();};request.onerror=function(){console.error('Error in sdCardRingtones.remove(): ',this.error);reject(this.error);};});}
|
||||
function get(id){return new Promise(function(resolve,reject){var request=defaultStorage.get(idToFilename(id));request.onsuccess=function(){resolve(new SDCardRingtone(this.result));};request.onerror=function(){console.error('Error in sdCardRingtones.get(): ',this.error);reject(this.error);};});}
|
||||
function list(toneType){if(!(toneType in BASE_DIRS)){throw new Error('tone type not supported: '+toneType);}
|
||||
return new Promise(function(resolve,reject){var results=[];var sdcards=navigator.getDeviceStorages('music');var cursor=enumerateAll(sdcards,BASE_DIRS[toneType]);cursor.onsuccess=function(){var file=this.result;if(file){if(file.name[0]!=='.'&&file.name.indexOf('/.')===-1){results.push(new SDCardRingtone(file));}
|
||||
this.continue();}else{resolve(results);}};cursor.onerror=function(){if(this.error.name==='NotFoundError'||this.error.name==='TypeMismatchError'){resolve([]);}else{console.error('Error in sdCardRingtones.list(): ',this.error);reject(this.error);}};});}
|
||||
return{remove:remove,get:get,list:list};})();
|
||||
16
assets/webapps/ringtones.gaiamobile.org/js/share.js
Normal file
16
assets/webapps/ringtones.gaiamobile.org/js/share.js
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
;'use strict';screen.mozLockOrientation('portrait');if(document.location.hash==='#activity'){navigator.mozSetMessageHandler('activity',function(activity){function flatten(arr){return arr&&arr.length?arr[0]:null;}
|
||||
var data=activity.source.data;data.blob=flatten(data.blobs);data.metadata=flatten(data.metadata);data.name=flatten(data.filenames);handleShare(data,function(command,details){switch(command){case'save':activity.postResult({});break;case'cancel':activity.postError('pick cancelled');break;case'error':activity.postError('pick error');break;}});});}
|
||||
else{window.addEventListener('visibilitychange',function(){if(document.hidden){window.close();}});window.addEventListener('message',function(event){if(event.origin!==window.location.origin){console.error('Couldn\'t recieve message: origins don\'t match',event.origin,window.location.origin);return;}
|
||||
handleShare(event.data,function(command,details){event.source.postMessage({command:command,details:details},event.origin);window.close();});});}
|
||||
function handleShare(data,callback){navigator.mozL10n.once(function(){function showError(title,message,okCallback){var okButton={title:'ok',callback:function(){CustomDialog.hide();okCallback();}};CustomDialog.show(title,message,okButton);}
|
||||
var save=document.getElementById('save');var header=document.getElementById('header');var control=document.getElementById('playpause');var preview=document.getElementById('preview');var songtitle;if(data.metadata&&data.metadata.title){songtitle=data.metadata.title;}
|
||||
else if(data.name){songtitle=data.name;}
|
||||
else{songtitle='ringtone-untitled';}
|
||||
var subtitle='';if(data.metadata&&data.metadata.artist){subtitle=data.metadata.artist;}
|
||||
document.getElementById('songtitle').textContent=songtitle;document.getElementById('artist').textContent=subtitle;if(data.metadata&&data.metadata.picture){if(!subtitle){document.getElementById('artist').textContent='\u00a0';}
|
||||
try{var pictureURL=URL.createObjectURL(data.metadata.picture);var picture=document.getElementById('picture');picture.hidden=false;picture.style.backgroundImage='url('+pictureURL+')';}
|
||||
catch(e){console.error('Couldn\'t set picture:',e);}}
|
||||
control.addEventListener('click',function(){if(preview.paused){(function(){var hack_activity_property='_hack_hack_shut_up';var hack_settings_property=data[hack_activity_property];if(hack_settings_property){var lock=navigator.mozSettings.createLock();lock.get(hack_settings_property).onsuccess=function(e){var value=e.target.result[hack_settings_property];var o={};o[hack_settings_property]=!value;navigator.mozSettings.createLock().set(o).onsuccess=function(){preview.play();};delete data[hack_activity_property];};}
|
||||
else{preview.play();}}());}
|
||||
else{preview.pause();}});preview.src=URL.createObjectURL(data.blob);preview.addEventListener('canplay',function(){save.disabled=false;});preview.addEventListener('error',function(){showError('play-error-title','play-error-desc',callback.bind(null,'error'));});preview.addEventListener('playing',function(){control.classList.add('playing');});preview.addEventListener('pause',function(){control.classList.remove('playing');});header.addEventListener('action',function(){callback('cancel');});save.addEventListener('click',function(){save.disabled=true;document.getElementById('saving-overlay').hidden=false;var info={name:songtitle,subtitle:subtitle,blob:data.blob};window.customRingtones.add(info).then(function(tone){if(document.getElementById('default-switch').checked){return window.systemTones.set('ringtone',tone).then(function(){return{toneID:tone.id,setAsDefault:true};});}
|
||||
return{toneID:tone.id,setAsDefault:false};}).then(function(details){NotificationHelper.send(songtitle,{bodyL10n:details.setAsDefault?'set-default-tone':'created-tone',closeOnClick:false}).then((notification)=>{notification.close();callback('save',details);});},function(error){console.log('Error saving ringtone',error);showError('save-error-title','save-error-desc',callback.bind(null,'error'));});});});}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
;;'use strict';window.systemTones=(function(){function _getSettingsBase(toneType){switch(toneType){case'ringtone':return'dialer.ringtone';case'alerttone':return'notification.ringtone';default:throw new Error('tone type not supported');}}
|
||||
function _getSetting(settingKey){return new Promise(function(resolve,reject){var req=navigator.mozSettings.createLock().get(settingKey);req.onsuccess=function(){resolve(req.result[settingKey]);};req.onerror=function(){reject(req.error);};});}
|
||||
function getDefault(toneType){var settingKey=_getSettingsBase(toneType)+'.default.id';return _getSetting(settingKey).then(function(id){return window.builtInRingtones.get(id);});}
|
||||
function set(toneType,tone){var settingsBase=_getSettingsBase(toneType);return tone.getBlob().then(function(blob){return new Promise(function(resolve,reject){navigator.mozL10n.once(function(){var settings={};var name=tone.l10nID?{l10nID:tone.l10nID}:tone.name;settings[settingsBase]=blob;settings[settingsBase+'.name']=name||'';settings[settingsBase+'.id']=tone.id;var req=navigator.mozSettings.createLock().set(settings);req.onsuccess=function(){resolve();};req.onerror=function(){reject(req.error);};});});});}
|
||||
function isInUse(tone){var inUseAs=[];var getCurrentID=function(toneType){return _getSetting(_getSettingsBase(toneType)+'.id');};return getCurrentID('ringtone').then(function(id){if(tone.id===id){inUseAs.push('ringtone');}
|
||||
return getCurrentID('alerttone').then(function(id){if(tone.id===id){inUseAs.push('alerttone');}
|
||||
return inUseAs;});});}
|
||||
return{getDefault:getDefault,set:set,isInUse:isInUse};})();
|
||||
14
assets/webapps/ringtones.gaiamobile.org/js/tone_list.js
Normal file
14
assets/webapps/ringtones.gaiamobile.org/js/tone_list.js
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
;;'use strict';var ToneList=(function(){var NONE_ID='none:none';function toneCompare(a,b){if(a.id===NONE_ID&&b.id===NONE_ID){return 0;}else if(a.id===NONE_ID){return-1;}else if(b.id===NONE_ID){return 1;}
|
||||
var aName=a.name.toLocaleLowerCase();var bName=b.name.toLocaleLowerCase();var cmp=aName.localeCompare(bName);if(cmp){return cmp;}
|
||||
var aSubtitle=(a.subtitle||'').toLocaleLowerCase();var bSubtitle=(b.subtitle||'').toLocaleLowerCase();return aSubtitle.localeCompare(bSubtitle);}
|
||||
function domify(htmlText){var dummyDiv=document.createElement('div');dummyDiv.innerHTML=htmlText;var element=dummyDiv.firstElementChild;return element;}
|
||||
function ToneList(titleID,parent){this.element=domify(Templates.soundList({l10nID:titleID}));if(parent){parent.appendChild(this.element);}
|
||||
this._ul=this.element.querySelector('ul');this._toneMap={};}
|
||||
ToneList.prototype={makeItem:function(tone){var templateArgs={};if(tone.l10nID){templateArgs.l10nID=tone.l10nID;}else{templateArgs.name=tone.name;}
|
||||
var item=domify(Templates.soundItem(templateArgs));item.dataset.id=tone.id;var detailNode=item.querySelector('details');if(detailNode&&tone.subtitle){detailNode.textContent=tone.subtitle;}else if(detailNode){detailNode.parentNode.hideDetails();}else if(tone.subtitle){var subtitle=document.createElement('p');subtitle.classList.add('subtitle');var bdi=document.createElement('bdi');bdi.textContent=tone.subtitle;subtitle.appendChild(bdi);item.querySelector('.name').parentNode.appendChild(subtitle);}
|
||||
return item;},add:function(tones){if(this._ul.children.length===0){if(Array.isArray(tones)){tones.sort(toneCompare);tones.forEach(this._append.bind(this));}else{this._append(tones);}}else{if(Array.isArray(tones)){tones.forEach(this._insertSorted.bind(this));}else{this._insertSorted(tones);}}},remove:function(tone){this._ul.removeChild(this._toneMap[tone.id].element);if(!this._ul.firstChild){this.element.hidden=true;}},_append:function(tone){if(tone.id in this._toneMap){throw new Error('A tone with this ID is already in the list: '+
|
||||
tone.id);}
|
||||
var newItem=this.makeItem(tone);this._toneMap[tone.id]={tone:tone,element:newItem};this.element.hidden=false;this._ul.appendChild(newItem);},_insertSorted:function(tone){if(tone.id in this._toneMap){throw new Error('A tone with this ID is already in the list: '+
|
||||
tone.id);}
|
||||
var newItem=this.makeItem(tone);this._toneMap[tone.id]={tone:tone,element:newItem};this.element.hidden=false;var items=this._ul.querySelectorAll('li');for(var i=0;i<items.length;i++){var currTone=this._toneMap[items[i].dataset.id].tone;if(toneCompare(tone,currTone)<0){this._ul.insertBefore(newItem,items[i]);return;}}
|
||||
this._ul.appendChild(newItem);}};return ToneList;})();
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
;;'use strict';function TonePlayer(){this._currentTone=null;this._isValid=true;this._player=new Audio();this._player.addEventListener('loadedmetadata',function(){if(this._player.src){this._isValid=true;this._player.dispatchEvent(new CustomEvent('validated',{detail:this._isValid}));}}.bind(this));this._player.addEventListener('error',function(){if(this._player.src){this._isValid=false;this._player.dispatchEvent(new CustomEvent('validated',{detail:this._isValid}));}}.bind(this));this._player.addEventListener('ended',function(){this._firePlayingCallback(false);}.bind(this));window.addEventListener('visibilitychange',function(){if(document.hidden){this.stop();this._setExclusiveMode(false);}}.bind(this));}
|
||||
TonePlayer.prototype={setTone:function(tone,callback){if(tone!==this._currentTone){this._firePlayingCallback(false);this._currentTone=tone;this._playingCallback=callback;if(tone&&tone.url){this._isValid=undefined;this._player.src=tone.url;this._player.play();this._firePlayingCallback(true);this._setExclusiveMode(true);}else{this._isValid=true;this._player.removeAttribute('src');this._player.load();}}else{if(!this._isValid){return;}
|
||||
if(this._player.paused||this._player.ended){this._player.currentTime=0;this._player.play();this._firePlayingCallback(true);this._setExclusiveMode(true);}else{this._player.pause();this._firePlayingCallback(false);}}},stop:function(){this._player.pause();this._firePlayingCallback(false);},get currentTone(){return this._currentTone;},isValid:function(callback){if(this._isValid!==undefined){callback(this._isValid);return;}
|
||||
this._player.addEventListener('validated',function validated(event){this.removeEventListener('validated',validated);callback(event.detail);});},_firePlayingCallback:function(playing){if(this._playingCallback){this._playingCallback(playing);}},_setExclusiveMode:function(exclusive){if(exclusive){if(!this._source){this._context=new AudioContext('ringer');this._source=this._context.createMediaElementSource(this._player);this._source.connect(this._context.destination);}}else{if(this._source){this._source.disconnect();this._context=null;this._source=null;}}}};
|
||||
Loading…
Reference in a new issue