2019-11-07 08:44:08 +00:00
|
|
|
const storage = require('Storage');
|
|
|
|
|
|
|
|
const boolFormat = (v) => v ? "On" : "Off";
|
|
|
|
|
|
|
|
let m;
|
|
|
|
|
|
|
|
function showMainMenu() {
|
|
|
|
const mainmenu = {
|
|
|
|
'': {
|
|
|
|
'title': 'App Manager',
|
|
|
|
},
|
|
|
|
'Free': {
|
|
|
|
value: undefined,
|
|
|
|
format: (v) => {
|
|
|
|
return storage.getFree();
|
|
|
|
},
|
|
|
|
onchange: () => {}
|
|
|
|
},
|
|
|
|
'Compact': () => {
|
|
|
|
E.showMessage('Compacting...');
|
|
|
|
try {
|
|
|
|
storage.compact();
|
|
|
|
} catch (e) {
|
|
|
|
}
|
|
|
|
m = showMainMenu();
|
|
|
|
},
|
|
|
|
'Apps': ()=> m = showApps(),
|
2020-01-17 11:53:54 +00:00
|
|
|
'< Back': ()=> {load();}
|
2019-11-07 08:44:08 +00:00
|
|
|
};
|
2020-01-17 11:32:32 +00:00
|
|
|
return E.showMenu(mainmenu);
|
2019-11-07 08:44:08 +00:00
|
|
|
}
|
|
|
|
|
2020-04-17 22:51:22 +00:00
|
|
|
function isGlob(f) {return /[?*]/.test(f)}
|
|
|
|
function globToRegex(pattern) {
|
|
|
|
const ESCAPE = '.*+-?^${}()|[]\\';
|
|
|
|
const regex = pattern.replace(/./g, c => {
|
|
|
|
switch (c) {
|
|
|
|
case '?': return '.';
|
|
|
|
case '*': return '.*';
|
|
|
|
default: return ESCAPE.includes(c) ? ('\\' + c) : c;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return new RegExp('^'+regex+'$');
|
|
|
|
}
|
|
|
|
|
|
|
|
function eraseFiles(app) {
|
2020-04-09 08:03:42 +00:00
|
|
|
app.files.split(",").forEach(f=>storage.erase(f));
|
2019-11-07 08:44:08 +00:00
|
|
|
}
|
2020-04-17 22:51:22 +00:00
|
|
|
function eraseData(app) {
|
|
|
|
if(!app.data) return;
|
|
|
|
const d=app.data.split(';'),
|
|
|
|
files=d[0].split(','),
|
|
|
|
sFiles=(d[1]||'').split(',');
|
|
|
|
let erase = f=>storage.erase(f);
|
|
|
|
files.forEach(f=>{
|
|
|
|
if (!isGlob(f)) erase(f);
|
|
|
|
else storage.list(globToRegex(f)).forEach(erase);
|
|
|
|
})
|
|
|
|
erase = sf=>storage.open(sf,'r').erase();
|
|
|
|
sFiles.forEach(sf=>{
|
|
|
|
if (!isGlob(sf)) erase(sf);
|
|
|
|
else storage.list(globToRegex(sf+'\u0001'))
|
|
|
|
.forEach(fs=>erase(fs.substring(0,fs.length-1)));
|
|
|
|
})
|
|
|
|
}
|
|
|
|
function eraseApp(app, files,data) {
|
|
|
|
E.showMessage('Erasing\n' + app.name + '...');
|
|
|
|
if (files) eraseFiles(app)
|
|
|
|
if (data) eraseData(app)
|
|
|
|
}
|
|
|
|
function eraseOne(app, files,data){
|
|
|
|
E.showPrompt('Erase\n'+app.name+'?').then((v) => {
|
|
|
|
if (v) {
|
|
|
|
Bangle.buzz(100, 1);
|
|
|
|
eraseApp(app, files,data)
|
|
|
|
showApps();
|
|
|
|
} else {
|
|
|
|
showAppMenu(app)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
function eraseAll(apps, files,data) {
|
|
|
|
E.showPrompt('Erase all?').then((v) => {
|
|
|
|
if (v) {
|
|
|
|
Bangle.buzz(100, 1);
|
|
|
|
for(var n = 0; n<apps.length; n++)
|
|
|
|
eraseApp(apps[n], files,data);
|
|
|
|
}
|
|
|
|
showApps();
|
|
|
|
})
|
|
|
|
}
|
2019-11-07 08:44:08 +00:00
|
|
|
|
|
|
|
function showAppMenu(app) {
|
2020-04-17 22:51:22 +00:00
|
|
|
let appmenu = {
|
2019-11-07 08:44:08 +00:00
|
|
|
'': {
|
|
|
|
'title': app.name,
|
|
|
|
},
|
|
|
|
'< Back': () => m = showApps(),
|
2020-04-17 22:51:22 +00:00
|
|
|
}
|
|
|
|
if (app.data) {
|
|
|
|
appmenu['Erase Completely'] = () => eraseOne(app, true, true)
|
|
|
|
appmenu['Erase App,Keep Data'] = () => eraseOne(app,true, false)
|
|
|
|
appmenu['Only Erase Data'] = () => eraseOne(app,false, true)
|
|
|
|
} else {
|
|
|
|
appmenu['Erase'] = () => eraseOne(app,true, false)
|
|
|
|
}
|
2020-01-17 11:32:32 +00:00
|
|
|
return E.showMenu(appmenu);
|
2019-11-07 08:44:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function showApps() {
|
|
|
|
const appsmenu = {
|
|
|
|
'': {
|
|
|
|
'title': 'Apps',
|
|
|
|
},
|
|
|
|
'< Back': () => m = showMainMenu(),
|
|
|
|
};
|
|
|
|
|
2020-02-28 11:44:25 +00:00
|
|
|
var list = storage.list(/\.info$/).filter((a)=> {
|
|
|
|
return a !== 'setting.info';
|
2019-11-07 08:44:08 +00:00
|
|
|
}).sort().map((app) => {
|
2020-02-28 17:02:26 +00:00
|
|
|
var ret = storage.readJSON(app,1)||{};
|
2019-11-07 08:44:08 +00:00
|
|
|
ret[''] = app;
|
|
|
|
return ret;
|
|
|
|
});
|
|
|
|
|
|
|
|
if (list.length > 0) {
|
|
|
|
list.reduce((menu, app) => {
|
|
|
|
menu[app.name] = () => m = showAppMenu(app);
|
|
|
|
return menu;
|
|
|
|
}, appsmenu);
|
|
|
|
appsmenu['Erase All'] = () => {
|
2020-04-17 22:51:22 +00:00
|
|
|
E.showMenu({
|
|
|
|
'': {'title': 'Erase All'},
|
|
|
|
'Erase Everything': () => eraseAll(list, true, true),
|
|
|
|
'Erase Apps,Keep Data': () => eraseAll(list, true, false),
|
|
|
|
'Only Erase Data': () => eraseAll(list, false, true),
|
|
|
|
'< Back': () => showApps(),
|
2019-11-07 08:44:08 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
} else {
|
|
|
|
appsmenu['...No Apps...'] = {
|
|
|
|
value: undefined,
|
|
|
|
format: ()=> '',
|
|
|
|
onchange: ()=> {}
|
|
|
|
};
|
|
|
|
}
|
2020-01-17 11:32:32 +00:00
|
|
|
return E.showMenu(appsmenu);
|
2019-11-07 08:44:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
m = showMainMenu();
|