VulpesOS/gaia/apps/fl/js/pick.js
OverSu b38dea0597 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.
2026-09-30 23:13:03 +02:00

193 lines
5.5 KiB
JavaScript
Executable file

'use strict';
/* global
_,
$,
ForwardLock,
objectStore,
RINGTONE_NAME_KEY
*/
// Wait until we're loaded, localized, and get an activity request
window.addEventListener('load', function() {
navigator.mozL10n.once(function() {
navigator.mozSetMessageHandler('activity', function(activity) {
var type = activity.source.data.type;
if (type === 'ringtone' ||
(Array.isArray(type) && type.indexOf('ringtone') !== -1)) {
pickRingtone(activity);
}
else if (type === 'wallpaper' ||
(Array.isArray(type) && type.indexOf('wallpaper') !== -1)) {
pickWallpaper(activity);
}
else {
console.error('unexpected activity request',
activity.source.name,
JSON.stringify(activity.source.data));
}
});
});
});
function pickRingtone(activity) {
var selectedRingtone;
var selectedRingtoneID;
var player = new Audio(); // for previewing sounds
var currentRingtoneName;
var numRingtones = 0;
var container = $('ringtones');
var header = $('header');
container.hidden = false;
// Display the right title
$('done').hidden = false;
$('title').textContent = _('pick-ringtone');
// Make the cancel button work
header.addEventListener('action', function() {
player.pause(); // Stop any currently playing sound.
activity.postError('cancelled');
});
// Make the done button work
$('done').onclick = function() {
player.pause(); // Stop any currently playing sound.
// Lock the ringtone and return it as the activity result
ForwardLock.getKey(function(secret) {
ForwardLock.lockBlob(secret, selectedRingtone.blob, {},
function(lockedBlob) {
activity.postResult({
blob: lockedBlob,
name: selectedRingtone.descriptor.name,
id: selectedRingtoneID
});
});
});
};
getCurrentRingtoneName(function(name) {
currentRingtoneName = name;
enumerateAndBuildUI();
});
function getCurrentRingtoneName(callback) {
navigator.mozSettings
.createLock()
.get(RINGTONE_NAME_KEY)
.onsuccess = function(e) {
callback(e.target.result[RINGTONE_NAME_KEY]);
};
}
function enumerateAndBuildUI() {
// Enumerate the ringtones from the database and display them onscreen
objectStore.readonly('ringtones', function(ringtoneStore) {
var cursor = ringtoneStore.openCursor();
cursor.onsuccess = function() {
if (cursor.result) {
addRingtone(cursor.result.value, 'forwardlock:' + cursor.result.key);
cursor.result.continue();
}
else { // we reached the end of the enumeration
if (numRingtones === 0) {
displayError(activity, 'no-installed-ringtones');
}
}
};
});
}
function addRingtone(ringtone, id) {
numRingtones++;
var name = ringtone.descriptor.name;
var listItem = document.createElement('li');
var radio = document.createElement('gaia-radio');
radio.name = 'ringtone';
var label = document.createElement('label');
label.textContent = name;
radio.appendChild(label);
if (name === currentRingtoneName) {
selectedRingtone = ringtone;
selectedRingtoneID = id;
radio.checked = true;
}
radio.addEventListener('change', function() {
if (radio.checked) {
selectedRingtone = ringtone;
selectedRingtoneID = id;
play(ringtone);
}
});
listItem.appendChild(radio);
container.appendChild(listItem);
}
function play(ringtone) {
// We create blob urls as needed. Since this app is always short-lived
// we don't bother releasing them.
if (!ringtone.url) {
ringtone.url = URL.createObjectURL(ringtone.blob);
}
player.src = ringtone.url;
player.play();
}
}
function pickWallpaper(activity) {
var numWallpapers = 0;
var template = $('wallpaper-template');
var container = $('wallpapers');
container.hidden = false;
$('title').textContent = _('pick-wallpaper');
$('header').addEventListener('action', function() {
activity.postError('cancelled');
});
// Enumerate the wallpapers from the database and display them onscreen
objectStore.readonly('wallpapers', function(wallpaperStore) {
var cursor = wallpaperStore.openCursor();
cursor.onsuccess = function() {
if (cursor.result) {
addWallpaper(cursor.result.value);
numWallpapers++;
cursor.result.continue();
}
else { // we reached the end of the enumeration
if (numWallpapers === 0) {
displayError(activity, 'no-installed-wallpaper');
}
}
};
});
function addWallpaper(wallpaper) {
var blob = wallpaper.blob;
var url = URL.createObjectURL(blob);
var wallpaperEl = template.content.cloneNode(true).firstElementChild;
container.appendChild(wallpaperEl);
wallpaperEl.style.backgroundImage = 'url(' + url + ')';
wallpaperEl.onclick = function() {
ForwardLock.getKey(function(secret) {
ForwardLock.lockBlob(secret, blob, {}, function(lockedBlob) {
activity.postResult({ blob: lockedBlob });
});
});
};
}
}
function displayError(activity, id) {
// using setTimeout here so we don't block with alert() while
// a db transaction is still pending
setTimeout(function() {
alert(_(id));
activity.postError(id);
});
}