From 0fb45cb6fcd3f12fea84fda23033bc6549ab4190 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 16 Nov 2022 15:17:28 +0000 Subject: [PATCH] Add module app type and provides_modules, --- README.md | 4 ++ apps/messageicons/ChangeLog | 1 + apps/messageicons/app.png | Bin 0 -> 16339 bytes apps/messageicons/lib.js | 104 +++++++++++++++++++++++++++++ apps/messageicons/metadata.json | 14 ++++ apps/messages/ChangeLog | 1 + apps/messages/app.js | 19 ++++-- apps/messages/lib.js | 114 ++------------------------------ apps/messages/metadata.json | 3 +- apps/messages/widget.js | 5 +- apps/widmsggrid/ChangeLog | 3 +- apps/widmsggrid/metadata.json | 3 +- apps/widmsggrid/widget.js | 10 +-- bin/sanitycheck.js | 22 ++++-- core | 2 +- 15 files changed, 172 insertions(+), 133 deletions(-) create mode 100644 apps/messageicons/ChangeLog create mode 100644 apps/messageicons/app.png create mode 100644 apps/messageicons/lib.js create mode 100644 apps/messageicons/metadata.json diff --git a/README.md b/README.md index d2f7022e9..07d831e43 100644 --- a/README.md +++ b/README.md @@ -265,11 +265,15 @@ and which gives information about the app for the Launcher. // 'notify' - provides 'notify' library for showing notifications // 'locale' - provides 'locale' library for language-specific date/distance/etc // (a version of 'locale' is included in the firmware) + // 'module' - this provides a module that can be used with 'require'. + // 'provides_modules' should be used if type:module is specified "tags": "", // comma separated tag list for searching "supports": ["BANGLEJS2"], // List of device IDs supported, either BANGLEJS or BANGLEJS2 "dependencies" : { "notify":"type" } // optional, app 'types' we depend on (see "type" above) "dependencies" : { "messages":"app" } // optional, depend on a specific app ID // for instance this will use notify/notifyfs is they exist, or will pull in 'notify' + "dependencies" : { "messageicons":"module" } // optional, depend on a specific library to be used with 'require' + "provides_modules" : ["messageicons"] // optional, this app provides a module that can be used with 'require' "readme": "README.md", // if supplied, a link to a markdown-style text file // that contains more information about this app (usage, etc) // A 'Read more...' link will be added under the app diff --git a/apps/messageicons/ChangeLog b/apps/messageicons/ChangeLog new file mode 100644 index 000000000..52a4b35a7 --- /dev/null +++ b/apps/messageicons/ChangeLog @@ -0,0 +1 @@ +0.01: Moved message icons from messages into standalone library diff --git a/apps/messageicons/app.png b/apps/messageicons/app.png new file mode 100644 index 0000000000000000000000000000000000000000..1e47a39c60959fb2dec3097d60c4d04f9f4e2a36 GIT binary patch literal 16339 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 - cancelReloadTimeout(); // don't auto-reload to clock now - showMessageSettings(msg); - }}, + { type:"btn", + src:require("messageicons").getImage(msg), + col:require("messageicons").getColor(msg, {settings:settings, default:g.theme.fg2}), + pad: 3, cb:()=>{ + cancelReloadTimeout(); // don't auto-reload to clock now + showMessageSettings(msg); + } + }, ]}, {type:"txt", font:bodyFont, label:body, fillx:1, filly:1, pad:2, cb:()=>{ // allow tapping to show a larger version @@ -382,14 +386,15 @@ function checkMessages(options) { g.clearRect(r.x,r.y,r.x+r.w, r.y+r.h); if (!msg) return; var x = r.x+2, title = msg.title, body = msg.body; - var img = require("messages").getMessageImage(msg); + var img = require("messageicons").getImage(msg); if (msg.id=="music") { title = msg.artist || /*LANG*/"Music"; body = msg.track; } if (img) { - var fg = g.getColor(); - g.setColor(require("messages").getMessageImageCol(msg,fg)).drawImage(img, x+24, r.y+24, {rotate:0}) // force centering + var fg = g.getColor(), + col = require("messageicons").getColor(msg, {settings:settings, default:fg}); + g.setColor(col).drawImage(img, x+24, r.y+24, {rotate:0}) // force centering .setColor(fg); // only color the icon x += 50; } diff --git a/apps/messages/lib.js b/apps/messages/lib.js index e94d6c8f6..0ed03e4b6 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -142,22 +142,22 @@ exports.getMessages = function() { exports.buzz = function(msgSrc) { exports.stopBuzz(); // cancel any previous buzz timeouts if ((require('Storage').readJSON('setting.json',1)||{}).quiet) return Promise.resolve(); // never buzz during Quiet Mode - + var msgSettings = require('Storage').readJSON("messages.settings.json", true) || {}; var pattern; if (msgSrc && msgSrc.toLowerCase() === "phone") { // special vibration pattern for incoming calls - pattern = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrateCalls; + pattern = msgSettings.vibrateCalls; } else { - pattern = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrate; + pattern = msgSettings.vibrate; } if (pattern === undefined) { pattern = ":"; } // pattern may be "", so we can't use || ":" here if (!pattern) return Promise.resolve(); - var repeat = (require('Storage').readJSON("messages.settings.json", true) || {}).repeat; + var repeat = msgSettings.repeat; if (repeat===undefined) repeat=4; // repeat may be zero if (repeat) { exports.buzzTimeout = setTimeout(()=>require("buzz").pattern(pattern), repeat*1000); - var vibrateTimeout = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrateTimeout; + var vibrateTimeout = msgSettings.vibrateTimeout; if (vibrateTimeout===undefined) vibrateTimeout=60; if (vibrateTimeout && !exports.stopTimeout) exports.stopTimeout = setTimeout(exports.stopBuzz, vibrateTimeout*1000); } @@ -172,107 +172,3 @@ exports.stopBuzz = function() { if (exports.stopTimeout) clearTimeout(exports.stopTimeout); delete exports.stopTimeout; }; - -exports.getMessageImage = function(msg) { - /* - * icons should be 24x24px or less with 1bpp colors and 'Transparency to Color' - * http://www.espruino.com/Image+Converter - */ - if (msg.img) return atob(msg.img); - const s = (("string"=== typeof msg) ? msg : (msg.src || "")).toLowerCase(); - if (s=="airbnb") return atob("GBgBAAAAAAAAAAAAADwAAH4AAGYAAMMAAIEAAYGAAYGAAzzAA2bABmZgBmZgDGYwDDwwCDwQCBgQDDwwB+fgA8PAAAAAAAAAAAAA"); - if (s=="alarm" || s =="alarmclockreceiver") return atob("GBjBAP////8AAAAAAAACAEAHAOAefng5/5wTgcgHAOAOGHAMGDAYGBgYGBgYGBgYGBgYDhgYBxgMATAOAHAHAOADgcAB/4AAfgAAAAAAAAA="); - if (s=="bibel") return atob("GBgBAAAAA//wD//4D//4H//4H/f4H/f4H+P4H4D4H4D4H/f4H/f4H/f4H/f4H/f4H//4H//4H//4GAAAEAAAEAAACAAAB//4AAAA"); - if (s=="bring") return atob("GBgBAAAAAAAAAAAAAAAAAHwAAFoAAf+AA/+AA/+AA/+AA/eAA+eAA0+AAx+AA7+AA/+AA//AA/+AAf8AAAIAAAAAAAAAAAAAAAAA"); - if (s=="calendar" || s=="etar") return atob("GBiBAAAAAAAAAAAAAA//8B//+BgAGBgAGBgAGB//+B//+B//+B9m2B//+B//+Btm2B//+B//+Btm+B//+B//+A//8AAAAAAAAAAAAA=="); - if (s=="corona-warn") return atob("GBgBAAAAABwAAP+AAf/gA//wB/PwD/PgDzvAHzuAP8EAP8AAPAAAPMAAP8AAH8AAHzsADzuAB/PAB/PgA//wAP/gAH+AAAwAAAAA"); - if (s=="discord") return atob("GBgBAAAAAAAAAAAAAIEABwDgDP8wH//4H//4P//8P//8P//8Pjx8fhh+fzz+f//+f//+e//ePH48HwD4AgBAAAAAAAAAAAAAAAAA"); - if (s=="facebook" || s=="messenger") return atob("GBiBAAAAAAAAAAAYAAD/AAP/wAf/4A/48A/g8B/g+B/j+B/n+D/n/D8A/B8A+B+B+B/n+A/n8A/n8Afn4APnwADnAAAAAAAAAAAAAA=="); - if (s=="gmx") return atob("GBgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEJmfmd8Zuc85v847/88Z9s8fttmHIHiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); - if (s=="google") return atob("GBiBAAAAAAD/AAP/wAf/4A/D4B8AwDwAADwAAHgAAHgAAHAAAHAH/nAH/nAH/ngH/ngAHjwAPDwAfB8A+A/D8Af/4AP/wAD/AAAAAA=="); - if (s=="google home") return atob("GBiCAAAAAAAAAAAAAAAAAAAAAoAAAAAACqAAAAAAKqwAAAAAqroAAAACquqAAAAKq+qgAAAqr/qoAACqv/6qAAKq//+qgA6r///qsAqr///6sAqv///6sAqv///6sAqv///6sA6v///6sA6v///qsA6qqqqqsA6qqqqqsA6qqqqqsAP7///vwAAAAAAAAAAAAAAAAA=="); // 2 bit unpaletted - if (s=="home assistant") return atob("FhaBAAAAAADAAAeAAD8AAf4AD/3AfP8D7fwft/D/P8ec572zbzbNsOEhw+AfD8D8P4fw/z/D/P8P8/w/z/AAAAA="); - if (s=="instagram") return atob("GBiBAAAAAAAAAAAAAAAAAAP/wAYAYAwAMAgAkAh+EAjDEAiBEAiBEAiBEAiBEAjDEAh+EAgAEAwAMAYAYAP/wAAAAAAAAAAAAAAAAA=="); - if (s=="kalender") return atob("GBgBBgBgBQCgff++RQCiRgBiQAACf//+QAACQAACR//iRJkiRIEiR//iRNsiRIEiRJkiR//iRIEiRIEiR//iQAACQAACf//+AAAA"); - if (s=="lieferando") return atob("GBgBABgAAH5wAP9wAf/4A//4B//4D//4H//4P/88fV8+fV4//V4//Vw/HVw4HVw4HBg4HBg4HBg4HDg4Hjw4Hj84Hj44Hj44Hj44"); - if (s=="mattermost") return atob("GBgBAAAAAPAAA+EAB4MADgcYHAcYOA8MOB8OeD8GcD8GcH8GcD8HcD8HeBwHeAAOfAAOfgAePwA8P8D8H//4D//wB//gAf/AAH4A"); - if (s=="n26") return atob("GBgBAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAOIAAOIAAPIAANoAANoAAM4AAMYAAMYAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA"); - if (s=="nextbike") return atob("GBgBAAAAAAAAAAAAAAAAAAAAAACAfgDAPwDAP4HAH4N4H8f8D82GMd8CMDsDMGMDMGGGGMHOD4D8AAAAAAAAAAAAAAAAAAAAAAAA"); - if (s=="nina") return atob("GBgBAAAABAAQCAAICAAIEAAEEgAkJAgSJBwSKRxKSj4pUn8lVP+VVP+VUgAlSgApKQBKJAASJAASEgAkEAAECAAICAAIBAAQAAAA"); - if (s=="outlook mail") return atob("HBwBAAAAAAAAAAAIAAAfwAAP/gAB/+AAP/5/A//v/D/+/8P/7/g+Pv8Dye/gPd74w5znHDnOB8Oc4Pw8nv/Dwe/8Pj7/w//v/D/+/8P/7/gf/gAA/+AAAfwAAACAAAAAAAAAAAA="); - if (s=="paypal") return atob("GBgBAAAAAAAAAAAAAf+AAf/AAf/gA//gA//gA//wA//wA//wA//wB//wB//wB//gB/+AB/gAB/gAB/gAAPgAAPgAAAAAAAAAAAAA"); - if (s=="phone") return atob("FxeBABgAAPgAAfAAB/AAD+AAH+AAP8AAP4AAfgAA/AAA+AAA+AAA+AAB+AAB+AAB+OAB//AB//gB//gA//AA/8AAf4AAPAA="); - if (s=="post & dhl") return atob("GBgBAPgAE/5wMwZ8NgN8NgP4NgP4HgP4HgPwDwfgD//AB/+AAf8AAAAABs7AHcdgG4MwAAAAGESAFESAEkSAEnyAEkSAFESAGETw"); - if (s=="signal") return atob("GBgBAAAAAGwAAQGAAhggCP8QE//AB//oJ//kL//wD//0D//wT//wD//wL//0J//kB//oA//ICf8ABfxgBYBAADoABMAABAAAAAAA"); - if (s=="skype") return atob("GhoBB8AAB//AA//+Af//wH//+D///w/8D+P8Afz/DD8/j4/H4fP5/A/+f4B/n/gP5//B+fj8fj4/H8+DB/PwA/x/A/8P///B///gP//4B//8AD/+AAA+AA=="); - if (s=="slack") return atob("GBiBAAAAAAAAAABAAAHvAAHvAADvAAAPAB/PMB/veD/veB/mcAAAABzH8B3v+B3v+B3n8AHgAAHuAAHvAAHvAADGAAAAAAAAAAAAAA=="); - if (s=="snapchat") return atob("GBgBAAAAAAAAAH4AAf+AAf+AA//AA//AA//AA//AA//AH//4D//wB//gA//AB//gD//wH//4f//+P//8D//wAf+AAH4AAAAAAAAA"); - if (s=="steam") return atob("GBgBAAAAAAAAAAAAAAAAAAAAAAfgAAwwAAvQABvQABvQADvQgDww4H/g+f8A/zwAf9gAH9AAB8AAACAAAcAAAAAAAAAAAAAAAAAA"); - if (s=="teams") return atob("GBgBAAAAAAAAAAQAAB4AAD8IAA8cP/M+f/scf/gIeDgAfvvefvvffvvffvvffvvff/vff/veP/PeAA/cAH/AAD+AAD8AAAQAAAAA"); - if (s=="telegram" || s=="telegram foss") return atob("GBiBAAAAAAAAAAAAAAAAAwAAHwAA/wAD/wAf3gD/Pgf+fh/4/v/z/P/H/D8P/Acf/AM//AF/+AF/+AH/+ADz+ADh+ADAcAAAMAAAAA=="); - if (s=="threema") return atob("GBjB/4Yx//8AAAAAAAAAAAAAfgAB/4AD/8AH/+AH/+AP//AP2/APw/APw/AHw+AH/+AH/8AH/4AH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="); - if (s=="to do" || s=="opentasks") return atob("GBgBAAAAAAAAAAAwAAB4AAD8AAH+AAP/DAf/Hg//Px/+f7/8///4///wf//gP//AH/+AD/8AB/4AA/wAAfgAAPAAAGAAAAAAAAAA"); - if (s=="twitch") return atob("GBgBH//+P//+P//+eAAGeAAGeAAGeDGGeDOGeDOGeDOGeDOGeDOGeDOGeAAOeAAOeAAcf4/4f5/wf7/gf//Af/+AA/AAA+AAAcAA"); - if (s=="twitter") return atob("GhYBAABgAAB+JgA/8cAf/ngH/5+B/8P8f+D///h///4f//+D///g///wD//8B//+AP//gD//wAP/8AB/+AB/+AH//AAf/AAAYAAA"); - if (s=="warnapp") return atob("GBgBAAAAAAAAAAAAAH4AAP8AA//AA//AD//gP//gf//4f//+/+P+/8H//8n//4n/fxh/fzg+Pj88Dn44AA4AAAwAAAwAAAgAAAAA"); - if (s=="whatsapp") return atob("GBiBAAB+AAP/wAf/4A//8B//+D///H9//n5//nw//vw///x///5///4///8e//+EP3/APn/wPn/+/j///H//+H//8H//4H//wMB+AA=="); - if (s=="wordfeud") return atob("GBgCWqqqqqqlf//////9v//////+v/////++v/////++v8///Lu+v8///L++v8///P/+v8v//P/+v9v//P/+v+fx/P/+v+Pk+P/+v/PN+f/+v/POuv/+v/Ofdv/+v/NvM//+v/I/Y//+v/k/k//+v/i/w//+v/7/6//+v//////+v//////+f//////9Wqqqqqql"); - if (s=="youtube" || s=="newpipe") return atob("GBgBAAAAAAAAAAAAAAAAAf8AH//4P//4P//8P//8P5/8P4/8f4P8f4P8P4/8P5/8P//8P//8P//4H//4Af8AAAAAAAAAAAAAAAAA"); - if (msg.id=="music") return atob("FhaBAH//+/////////////h/+AH/4Af/gB/+H3/7/f/v9/+/3/7+f/vB/w8H+Dwf4PD/x/////////////3//+A="); - // if (s=="sms message" || s=="mail" || s=="gmail") // .. default icon (below) - return atob("FhKBAH//+P//yf/+c//z5/+fz/z/n+f/Pz/+ef/8D///////////////////////f//4///A"); -}; - -exports.getMessageImageCol = function(msg,def) { - let iconColorMode = (require('Storage').readJSON("messages.settings.json", 1) || {}).iconColorMode; - if (iconColorMode == 'mono') - return g.theme.fg; - const s = (("string"=== typeof msg) ? msg : (msg.src || "")).toLowerCase(); - return { - // generic colors, using B2-safe colors - // DO NOT USE BLACK OR WHITE HERE, just leave the declaration out and then the theme's fg color will be used - "airbnb": "#f00", - "mail": "#ff0", - "music": "#f0f", - "phone": "#0f0", - "sms message": "#0ff", - // brands, according to https://www.schemecolor.com/?s (picking one for multicolored logos) - // all dithered on B2, but we only use the color for the icons. (Could maybe pick the closest 3-bit color for B2?) - "bibel": "#54342c", - "bring": "#455a64", - "discord": "#738adb", - "etar": "#36a18b", - "facebook": "#4267b2", - "gmail": "#ea4335", - "gmx": "#1c449b", - "google": "#4285F4", - "google home": "#fbbc05", -// "home assistant": "#41bdf5", // ha-blue is #41bdf5, but that's the background - "instagram": "#dd2a7b", - "lieferando": "#ee5c00", - "messenger": "#0078ff", - "mattermost": "#00f", - "n26": "#36a18b", - "nextbike": "#00f", - "newpipe": "#f00", - "nina": "#e57004", - "opentasks": "#409f8f", - "outlook mail": "#0072c6", - "paypal": "#003087", - "post & dhl": "#f2c101", - "signal": "#00f", - "skype": "#00aff0", - "slack": "#e51670", - "snapchat": "#ff0", - "steam": "#171a21", - "teams": "#464eb8", - "telegram": "#0088cc", - "telegram foss": "#0088cc", - "to do": "#3999e5", - "twitch": "#6441A4", - "twitter": "#1da1f2", - "whatsapp": "#4fce5d", - "wordfeud": "#e7d3c7", - "youtube": "#f00", - }[s]||(def !== undefined?def:g.theme.fg); -}; diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index bc6d18f3f..f3051958e 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,12 +1,13 @@ { "id": "messages", "name": "Messages", - "version": "0.53", + "version": "0.54", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", "tags": "tool,system", "supports": ["BANGLEJS","BANGLEJS2"], + "dependencies" : { "messageicons":"module" }, "readme": "README.md", "storage": [ {"name":"messages.app.js","url":"app.js"}, diff --git a/apps/messages/widget.js b/apps/messages/widget.js index c8d132f82..c0dcd132f 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -21,7 +21,8 @@ WIDGETS["messages"]={area:"tl", width:0, draw:function(recall) { g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+23); for(let i = 0;i < msgsShown;i++) { const msg = this.msgs[i]; - const colors = [g.theme.bg, g.setColor(require("messages").getMessageImageCol(msg)).getColor()]; + const colors = [g.theme.bg, + require("messageicons").getColor(msg, {settings:settings})]; if (settings.flash && ((Date.now()/1000)&1)) { if (colors[1] == g.theme.fg) { colors.reverse(); @@ -31,7 +32,7 @@ WIDGETS["messages"]={area:"tl", width:0, draw:function(recall) { } g.setColor(colors[1]).setBgColor(colors[0]); // draw the icon, or '...' if too many messages - g.drawImage(i == (settings.maxMessages - 1) && this.msgs.length > settings.maxMessages ? atob("EASBAGGG88/zz2GG") : require("messages").getMessageImage(msg), + g.drawImage(i == (settings.maxMessages - 1) && this.msgs.length > settings.maxMessages ? atob("EASBAGGG88/zz2GG") : require("messageicons").getImage(msg), this.x + 12 + i * 24, this.y + 12, {rotate:0/*force centering*/}); } } diff --git a/apps/widmsggrid/ChangeLog b/apps/widmsggrid/ChangeLog index 4be6afb16..75259c4f0 100644 --- a/apps/widmsggrid/ChangeLog +++ b/apps/widmsggrid/ChangeLog @@ -1 +1,2 @@ -0.01: New widget! \ No newline at end of file +0.01: New widget! +0.02: Adjust to message icons moving to messageicons lib diff --git a/apps/widmsggrid/metadata.json b/apps/widmsggrid/metadata.json index b624f5c23..c9ed5bbe0 100644 --- a/apps/widmsggrid/metadata.json +++ b/apps/widmsggrid/metadata.json @@ -1,13 +1,14 @@ { "id": "widmsggrid", "name": "Messages Grid Widget", - "version": "0.01", + "version": "0.02", "description": "Widget that display notification icons in a grid", "icon": "widget.png", "type": "widget", "dependencies": {"messages":"app"}, "tags": "tool,system", "supports": ["BANGLEJS","BANGLEJS2"], + "dependencies" : { "messageicons":"module" }, "readme": "README.md", "storage": [ {"name":"widmsggrid.wid.js","url":"widget.js"} diff --git a/apps/widmsggrid/widget.js b/apps/widmsggrid/widget.js index 7c5882e6c..431adf479 100644 --- a/apps/widmsggrid/widget.js +++ b/apps/widmsggrid/widget.js @@ -32,15 +32,17 @@ .setClipRect(w.x, w.y, w.x + w.width - 1, w.y + 24); // guard against oversized icons let r = 0, c = 0; // row, column const offset = pos => Math.floor(pos / cols * 24); // pixel offset for position in row/column + let icons = require("messageicons"); + let defaultCol = icons.getColor("alert", {settings:settings}); w.srcs.forEach(src => { - const appColor = require("messages").getMessageImageCol(src, require("messages").getMessageImageCol("alert")); - let colors = [g.theme.bg, g.setColor(appColor).getColor()]; + const appColor = icons.getColor(src, {settings:settings,default:defaultCol}); + let colors = [g.theme.bg, appColor]; if (b) { if (colors[1] == g.theme.fg) colors = colors.reverse(); else colors[1] = g.theme.fg; } g.setColor(colors[1]).setBgColor(colors[0]); - g.drawImage(require("messages").getMessageImage(src, "alert"), w.x+offset(c), w.y+offset(r), { scale: 1 / cols }); + g.drawImage(icons.getImage(src), w.x+offset(c), w.y+offset(r), { scale: 1 / cols }); if (++c >= cols) { c = 0; r++; @@ -89,4 +91,4 @@ }; delete s; const w = WIDGETS["msggrid"]; -})(); \ No newline at end of file +})(); diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index c7dbb0d03..dddccf3a8 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -76,12 +76,12 @@ const APP_KEYS = [ 'id', 'name', 'shortName', 'version', 'icon', 'screenshots', 'description', 'tags', 'type', 'sortorder', 'readme', 'custom', 'customConnect', 'interface', 'storage', 'data', 'supports', 'allow_emulator', - 'dependencies' + 'dependencies', 'provides_modules' ]; const STORAGE_KEYS = ['name', 'url', 'content', 'evaluate', 'noOverwite', 'supports', 'noOverwrite']; const DATA_KEYS = ['name', 'wildcard', 'storageFile', 'url', 'content', 'evaluate']; const SUPPORTS_DEVICES = ["BANGLEJS","BANGLEJS2"]; // device IDs allowed for 'supports' -const METADATA_TYPES = ["app","clock","widget","bootloader","RAM","launch","textinput","scheduler","notify","locale","settings","waypoints"]; // values allowed for "type" field +const METADATA_TYPES = ["app","clock","widget","bootloader","RAM","launch","scheduler","notify","locale","settings","waypoints","module"]; // values allowed for "type" field const FORBIDDEN_FILE_NAME_CHARS = /[,;]/; // used as separators in appid.info const VALID_DUPLICATES = [ '.tfmodel', '.tfnames' ]; const GRANDFATHERED_ICONS = ["s7clk", "snek", "astral", "alpinenav", "slomoclock", "arrow", "pebble", "rebble"]; @@ -167,16 +167,15 @@ apps.forEach((app,appIdx) => { if (app.dependencies) { if (("object"==typeof app.dependencies) && !Array.isArray(app.dependencies)) { Object.keys(app.dependencies).forEach(dependency => { - if (!["type","app"].includes(app.dependencies[dependency])) - ERROR(`App ${app.id} 'dependencies' must all be tagged 'type' or 'app' right now`, {file:metadataFile}); + if (!["type","app","module"].includes(app.dependencies[dependency])) + ERROR(`App ${app.id} 'dependencies' must all be tagged 'type/app/module' right now`, {file:metadataFile}); if (app.dependencies[dependency]=="type" && !METADATA_TYPES.includes(dependency)) ERROR(`App ${app.id} 'type' dependency must be one of `+METADATA_TYPES, {file:metadataFile}); - }); } else ERROR(`App ${app.id} 'dependencies' must be an object`, {file:metadataFile}); } - + var fileNames = []; app.storage.forEach((file) => { if (!file.name) ERROR(`App ${app.id} has a file with no name`, {file:metadataFile}); @@ -236,7 +235,7 @@ apps.forEach((app,appIdx) => { // clock app checks if (app.type=="clock") { var a = fileContents.indexOf("Bangle.loadWidgets()"); - var b = fileContents.indexOf("Bangle.setUI("); + var b = fileContents.indexOf("Bangle.setUI("); if (a>=0 && b>=0 && a { ERROR(`App ${app.id} should include file named ${fileName} but it doesn't`, {file:metadataFile}); }); } + if (app.type=="module" && !app.provides_modules) { + ERROR(`App ${app.id} has type:module but it doesn't have a provides_modules field`, {file:metadataFile}); + } + if (app.provides_modules) { + app.provides_modules.forEach(modulename => { + if (!app.storage.find(s=>s.name==modulename)) + ERROR(`App ${app.id} has provides_modules ${modulename} but it doesn't provide that filename`, {file:metadataFile}); + }); + } }); diff --git a/core b/core index b294d25f3..c379f01ca 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit b294d25f395c0d2830dcb4203a6aff46339d17b7 +Subproject commit c379f01cac3f41e3d60ec4ff2d162331fffb799f