diff --git a/apps.json b/apps.json index c971fb710..f0bc4874a 100644 --- a/apps.json +++ b/apps.json @@ -117,7 +117,7 @@ { "id": "setting", "name": "Settings", "icon": "settings.png", - "version":"0.07", + "version":"0.08", "description": "A menu for setting up Bangle.js", "tags": "tool,system", "storage": [ diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index d29a312d0..0cfa04bf0 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -4,3 +4,4 @@ 0.05: Fix Settings json 0.06: Remove distance setting as there's a separate app for Locale now 0.07: Added vibrate as beep workaround +0.08: Add support for app/widget settings diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 9d5fa2775..dbb03555c 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -114,6 +114,7 @@ function showMainMenu() { } }, 'Set Time': showSetTimeMenu, + 'App/widget settings': showAppSettingsMenu, 'Reset Settings': showResetMenu, 'Turn Off': Bangle.off, '< Back': ()=> {load();} @@ -295,4 +296,48 @@ function showSetTimeMenu() { return E.showMenu(timemenu); } +function showAppSettingsMenu(){ + let appmenu = { + '': {'title': 'App Settings'}, + '< Back': showMainMenu, + } + const apps = storage.list(/\.info$/) + .map(app => storage.readJSON(app, 1)) + .filter(app => app && app.settings) + .sort((a, b) => a.sortorder - b.sortorder) + if (apps.length === 0) { + appmenu['No app has settings'] = () => {}; + } + apps.forEach(function (app) { + appmenu[app.name] = () => {showAppSettings(app)}; + }) + E.showMenu(appmenu) +} +function showAppSettings(app) { + const showError = msg => { + E.showMessage(`${app.name}:\n${msg}!\n\nBTN1 to go back`); + setWatch(showAppSettingsMenu, BTN1, { repeat: false }); + } + let appSettings = storage.read(app.settings); + if (!appSettings) { + return showError('Missing settings'); + } + try { + appSettings = eval(appSettings); + } catch (e) { + console.log(`${app.name} settings error:`, e) + return showError('Error in settings'); + } + if (typeof appSettings !== "function") { + return showError('Invalid settings'); + } + try { + // pass showAppSettingsMenu as "back" argument + appSettings(showAppSettingsMenu); + } catch (e) { + console.log(`${app.name} settings error:`, e) + return showError('Error in settings'); + } +} + showMainMenu(); diff --git a/js/appinfo.js b/js/appinfo.js index 613d15379..f4ab498b1 100644 --- a/js/appinfo.js +++ b/js/appinfo.js @@ -60,6 +60,8 @@ var AppInfo = { if (app.type && app.type!="app") json.type = app.type; if (fileContents.find(f=>f.name==app.id+".app.js")) json.src = app.id+".app.js"; + if (fileContents.find(f=>f.name==app.id+".settings.js")) + json.settings = app.id+".settings.js"; if (fileContents.find(f=>f.name==app.id+".img")) json.icon = app.id+".img"; if (app.sortorder) json.sortorder = app.sortorder;