mirror of https://github.com/espruino/BangleApps
App Manager: Add support for data files
parent
745e4d38a9
commit
2278947b3d
|
@ -319,7 +319,7 @@
|
|||
{ "id": "files",
|
||||
"name": "App Manager",
|
||||
"icon": "files.png",
|
||||
"version":"0.02",
|
||||
"version":"0.03",
|
||||
"description": "Show currently installed apps, free space, and allow their deletion from the watch",
|
||||
"tags": "tool,system,files",
|
||||
"storage": [
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
0.02: Fix deletion of apps - now use files list in app.info (fix #262)
|
||||
0.03: Add support for data files
|
||||
|
|
|
@ -30,29 +30,80 @@ function showMainMenu() {
|
|||
return E.showMenu(mainmenu);
|
||||
}
|
||||
|
||||
function eraseApp(app) {
|
||||
E.showMessage('Erasing\n' + app.name + '...');
|
||||
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) {
|
||||
app.files.split(",").forEach(f=>storage.erase(f));
|
||||
}
|
||||
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();
|
||||
})
|
||||
}
|
||||
|
||||
function showAppMenu(app) {
|
||||
const appmenu = {
|
||||
let appmenu = {
|
||||
'': {
|
||||
'title': app.name,
|
||||
},
|
||||
'< Back': () => m = showApps(),
|
||||
'Erase': () => {
|
||||
E.showPrompt('Erase\n' + app.name + '?').then((v) => {
|
||||
if (v) {
|
||||
Bangle.buzz(100, 1);
|
||||
eraseApp(app);
|
||||
m = showApps();
|
||||
} else {
|
||||
m = showAppMenu(app)
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
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)
|
||||
}
|
||||
return E.showMenu(appmenu);
|
||||
}
|
||||
|
||||
|
@ -78,13 +129,12 @@ function showApps() {
|
|||
return menu;
|
||||
}, appsmenu);
|
||||
appsmenu['Erase All'] = () => {
|
||||
E.showPrompt('Erase all?').then((v) => {
|
||||
if (v) {
|
||||
Bangle.buzz(100, 1);
|
||||
for (var n = 0; n < list.length; n++)
|
||||
eraseApp(list[n]);
|
||||
}
|
||||
m = showApps();
|
||||
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(),
|
||||
});
|
||||
};
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue