VulpesOS/assets/webapps/homescreen.gaiamobile.org/js/firstrun.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

180 lines
5.5 KiB
JavaScript

/* global LazyLoader */
'use strict';
(function(exports) {
const COLS_PREF = 'grid.cols';
const VERTICALHOME_APPS = 'verticalhome_items_migration';
const VERTICALHOME_SETTINGS = 'vertical_preferences_store';
const HOMESCREEN_SETTINGS = 'homescreen_settings';
function FirstRun() {
return importVerticalHome().then(Promise.resolve(),
(e) => {
console.warn('Loading default settings, import failed:', e);
return loadDefault();
});
}
function importVerticalHome() {
return new Promise((resolve, reject) => {
if (!navigator.getDataStores) {
reject('DataStore API is unavailable');
return;
}
navigator.getDataStores(VERTICALHOME_APPS).then(
stores => {
if (stores.length < 1) {
reject('verticalhome datastores inaccessible');
return;
}
stores[0].getLength().then(length => {
if (length === 0) {
reject('No verticalhome app order to import');
return;
}
var cursor = stores[0].sync();
var items = {};
var iterateItems = () => {
cursor.next().then(task => {
switch (task.operation) {
case 'done':
// Convert from verticalhome storage format to something
// homescreen can use, skipping over features that aren't
// supported.
var id;
var order = [];
for (var prop in items) {
var item = items[prop];
switch (item.type) {
case 'app':
id = item.manifestURL + '/' +
(item.entryPoint ? item.entryPoint : '');
break;
case 'bookmark':
id = item.id;
break;
default:
continue;
}
order.push({ id: id, order: item.index });
}
// Sort by order
order.sort((a, b) => { return a.order - b.order; });
// Rewrite order so there are no gaps
order.forEach((entry, index) => {
entry.order = index;
});
// Load columns setting and resolve
navigator.getDataStores(VERTICALHOME_SETTINGS).then(
stores => {
stores[0].get(COLS_PREF).then(cols => {
resolve({ order: order, small: cols >= 4 });
// If 4-column is set, we should synchronise the
// homescreen settings datastore so that Settings
// reflects the correct value. (3 is the default)
if (cols >= 4) {
navigator.getDataStores(HOMESCREEN_SETTINGS).then(
stores => {
stores[0].put(cols, COLS_PREF);
}).catch(
e => {
console.error(
'Error storing homescreen cols setting', e);
});
}
}, () => {
resolve({ order: order, small: false });
});
},
(e) => {
console.error('Error retrieving columns preference', e);
resolve({ order: order, small: false });
});
return;
case 'clear':
items = {};
break;
case 'put':
case 'add':
items[task.id] = task.data;
break;
case 'remove':
delete items[task.id];
break;
default:
reject('Unhandled datastore operation: ' + task.operation);
return;
}
iterateItems();
}, reject);
};
iterateItems();
}, reject);
}, reject);
});
}
function loadDefault() {
return new Promise((resolve, reject) => {
LazyLoader.getJSON('js/init.json').then(
json => {
if (!json) {
resolve({ order: [], small: false});
return;
}
// Convert the initialisation JSON format to something more useful
// for homescreen.
var small = !!(json.preferences && json.preferences[COLS_PREF] &&
(json.preferences[COLS_PREF] > 3));
var order = [];
if (json.grid) {
var index = 0;
json.grid.forEach((section) => {
section.forEach((entry) => {
if (!entry || !entry.manifestURL) {
return;
}
var id = entry.manifestURL + '/' +
(entry.entry_point ? entry.entry_point : '');
order.push({ id: id, order: index });
index ++;
});
});
}
resolve({ order: order, small: small});
},
e => {
reject(e);
}
);
});
}
exports.FirstRun = FirstRun;
}(window));