VulpesOS/assets/webapps/verticalhome.gaiamobile.org/shared/js/version_helper.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

136 lines
3.4 KiB
JavaScript

/* global Promise */
/* exported VersionHelper */
'use strict';
(function(exports) {
// Helper to work with version strings
// e.g. 2.0.0.1-prerelease becomes { major: 2, minor: 0 }
function Version(str) {
str = str || '0.0';
var parts = str.split('.');
this.major = parts[0];
this.minor = parts[1];
this.toString = function() {
return '' + str;
};
}
function InfoResult(current, previous) {
this.current = current;
this.previous = previous;
}
InfoResult.prototype.isUpgrade = function() {
var prev = this.previous,
curr = this.current,
isUpgrade = false;
// dont treat lack of previous version info as an upgrade
if (prev && curr) {
isUpgrade = curr.major > prev.major || curr.minor > prev.minor;
}
return isUpgrade;
};
InfoResult.prototype.delta = function() {
var prev = this.previous,
curr = this.current;
var delta = '';
if (prev) {
delta += prev.major + '.' +prev.minor;
}
delta += '..';
if (curr) {
delta += curr.major + '.' + curr.minor;
}
return delta;
};
// Helper to get settings
function getSetting(setting, cb, errback) {
var req = navigator.mozSettings.createLock().get(setting);
req.onsuccess = function() {
var value = req.result[setting];
if(typeof cb === 'function') {
cb(value);
}
};
req.onerror = function() {
if(typeof errback === 'function') {
errback(req.error);
}
};
}
function getCurrent() {
return new Promise(function(resolve, reject) {
getSetting('deviceinfo.os', function(value) {
resolve(value ? new Version(value) : null);
}, function(err) {
reject(err);
});
});
}
function getPrevious() {
return new Promise(function(resolve, reject) {
// XXX: we return null version when previous_os lookup fails
getSetting('deviceinfo.previous_os', function(value) {
resolve(value ? new Version(value) : null);
}, function(err) {
resolve(null);
});
});
}
function updatePrevious(str) {
var currentPromise = str ? Promise.resolve(new Version(str)) :
getCurrent();
var setPromise = new Promise(function(resolve, reject) {
currentPromise.then(function(version) {
// guard against empty deviceinfo.os
if (version) {
var req = navigator.mozSettings.createLock().set({
'deviceinfo.previous_os': version.toString()
});
req.onsuccess = function() {
resolve(version);
};
req.onerror = function() {
var reason = req.error;
reject(reason);
};
} else {
resolve(null);
}
}, function(err) {
reject('Error getting previous version: ', err);
});
});
return setPromise;
}
function getVersionInfo() {
var info = new InfoResult();
var infoPromise = new Promise(function(resolve, reject) {
Promise.all([
getCurrent().then(function(version) {
info.current = version;
}),
getPrevious().then(function(version) {
info.previous = version;
})
]).then(function() {
resolve(info);
}, reject);
});
return infoPromise;
}
exports.VersionHelper = {
updatePrevious: updatePrevious,
getVersionInfo: getVersionInfo
};
})(window);