From 9a58a14681f8c112266dde5726097cacbefe6db4 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 21 Dec 2021 21:46:30 +0000 Subject: [PATCH] swp2clk: Create Initial app with whitelist feature --- apps.json | 17 +++++ apps/swp2clk/ChangeLog | 1 + apps/swp2clk/README.md | 12 ++++ apps/swp2clk/app-icon.js | 1 + apps/swp2clk/app.pdn | Bin 0 -> 7005 bytes apps/swp2clk/app.png | Bin 0 -> 1569 bytes apps/swp2clk/boot.js | 92 +++++++++++++++++++++++++++ apps/swp2clk/settings.js | 133 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 256 insertions(+) create mode 100644 apps/swp2clk/ChangeLog create mode 100644 apps/swp2clk/README.md create mode 100644 apps/swp2clk/app-icon.js create mode 100644 apps/swp2clk/app.pdn create mode 100644 apps/swp2clk/app.png create mode 100644 apps/swp2clk/boot.js create mode 100644 apps/swp2clk/settings.js diff --git a/apps.json b/apps.json index e5e9f8f02..0a537d676 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,22 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "swp2clk", + "name": "Swipe back to the Clock", + "shortName": "Swipe to Clock", + "version": "0.01", + "description": "Let's you swipe from left to right on any app to return back to the clock face. Please configure in the settings app after installing to activate, since its disabled by default.", + "icon": "app.png", + "tags": "tools", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + { "name": "swp2clk.boot.js", "url": "boot.js" }, + {"name":"swp2clk.settings.js","url":"settings.js"}, + { "name": "swp2clk.img", "url": "app-icon.js", "evaluate": true } + ], + "data": [{"name":"swp2clk.data.json"}] } ] diff --git a/apps/swp2clk/ChangeLog b/apps/swp2clk/ChangeLog new file mode 100644 index 000000000..ea6473980 --- /dev/null +++ b/apps/swp2clk/ChangeLog @@ -0,0 +1 @@ +0.01: Initial creation of "Swipe back to the Clock" App. Let's you swipe from left to right on any app to return back to the clock face. diff --git a/apps/swp2clk/README.md b/apps/swp2clk/README.md new file mode 100644 index 000000000..f6d0dd2b4 --- /dev/null +++ b/apps/swp2clk/README.md @@ -0,0 +1,12 @@ +# Swipe back to the Clock + +Let's you swipe from left to right on any app to return back to the clock face. + +## Configurable Modes: + +The swipe modes can be configured in the settings app, under "Swipe to Clock". + +- Always Off: Deactivated for all apps (Default) +- White List: Only activate for chosen apps, otherwise deactivated for all apps. +- Black List: Only disabled for chosen apps, otherwise activated for all apps. +- Always On: Active for all apps (Not actually recommended! E.g. Games need to be able to deal with swipe gestures) \ No newline at end of file diff --git a/apps/swp2clk/app-icon.js b/apps/swp2clk/app-icon.js new file mode 100644 index 000000000..e59cd6244 --- /dev/null +++ b/apps/swp2clk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkE/4A2+cyiJABiMjn4WPiAVCDIUBDBsyiEBiUzAwMzkIHBl4tMBw/yBIIxKkIME+YEEiESIpMBkYGD+MfKQoMEEQcgiYHE+EPAwkxgRJG+RSGC4xJBNYwuGC44wCD4sRG4wXHCAweGC5JABQAhGHC5IpFiDIHC5HzgIEHC5oqE+JeHC5RgDmBkEC5vxgYXZkDdGC5fyLYSOIC5SLDC5MgQJAXDUxHygEAKREQC5XxC4KCIC8xHLO4/ziERiSPTmI4IC4rXGFwMTC5LXDmBsFFwLHINQUDC44uH+fc54XG+LlE+QuFnvM5gXDkArCMYYFCkYsECwIAHSBIsDC5cgLIoVMC4ZgFC6PziJIFLpYXDJA53PUY6nHZQMvEwwwIa4kxgQmHmUBXoYMHiAMJkJJJIoMSEZIMBgJTG+QJBERAOFiUzAwMzkIgIGJEAgERiIDBFpgYEmQVCiMjCx4AoA=")) \ No newline at end of file diff --git a/apps/swp2clk/app.pdn b/apps/swp2clk/app.pdn new file mode 100644 index 0000000000000000000000000000000000000000..60baf6cab3ff2c1a4c0ed0f096d691b636627b77 GIT binary patch literal 7005 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 LKL52a!)x_F<_%{L literal 0 HcmV?d00001 diff --git a/apps/swp2clk/app.png b/apps/swp2clk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..b964520e684ed24dbe4052cce745c2eea43921ff GIT binary patch literal 1569 zcmV++2HyFJP)Px#1ZP1_K>z@;j|==^1poj77Enx7MgRZ*{{H^@`ug?t_3`oX?(XjF?Ck67>-hNi z*Voslr>Agma7RZ+CMG5k5fKIk1}7&cadB~|sHoW3*!1-D-rnA$qoY$(QxXyq2?+@k z6B8R78zCVfC@3gYR8*v-q}|=!n3$M3IXMmv4j331FE1}!TU(Klk-53K+S=Oi@bLTl z`;d^3T3T8JEo?l3JMB5JUnY_Ye7Ll`T6;_wzfh-LbbKEQBhIc+}un|Odud2RaI5s;NUJU zE)*0LTwGjPSy`&8s*aA1a&mIJySuo!xJgM#BqSsvA|l({+XV#$B_$;Q001;JGy(zw z2L}f@I5;yiGrGFE3=9lEKR?sc(@IK84Gj%OMn=%k&=3$1)z#Ji*Vn77tN;7^|GT^Y zaB%-1ApZaW-{0SUetsMr9RKt4|EH(_TwMPU5SN#iR#sN6t*w21egEU*|Cg8lL`44x z2>;K||AT}7G&KMB_y25c|F5tAWMuyo6#u`!|0E>;)6@SrICXV(|C^itNJ!)3B2^e;OJZqN1WpOG}TBj~*T#Qc_ay@9&(PoCpXAS65d$gE8=cCr5lsMH#q&}s=> zqgDarTo*tRDXD3?^i6vGrp>x7TQdl9BMmSZGq+JD+H6T@m~@MoHqqOyM#H)i(w3EN zcjV;m$aCfw6y!Ve3U}r>?5-jsi2|emytssNdrG}5azNN!MIJZhDZ>>8@p;Rcib{VK zGI#Gm6~bB_2-bLg$P{2hwc)yYo6ytV98|%8EfNezL!xmxe9nf(Sd#`>kmhDofoS|K zfqfy#7{D8?*k9a=EDo^%Q?<1>)_TS3z{|re9g;yM0*oz-g==tRK*(aIE>+xrvH)xK z2ZJ5L?gCp$MZIYL97zI96A5%06O%GzQI$4SPmnCYy1J=S178Kk>;p~7CnFPpOt%XS zL0avdiSrVW2{3Jm-OsOr*ybpWSH#E#SeBzF-Y>|YbG&hn7zIIZ-$5rgCsnHHP|~?W z6a;L)X+Q-_bsD{c_lQvtV1v|<8WtLz`7rMgqa+wMk8r1jA2~Y8JJu*D9~&DiK!!lb zlFp?EL5+*Dgr}UEn4kxdA%Kt51T3_AhFgk+W0MmTlgE%D(8?Uw!a_j+PH+MjvILMo zJ|)n5a%^%^zISL!vPJtw+f64=WEaXNiWUvG^%U>mVN-Oc&j^_;25l=mxI*3$hn+fm z?)<1yeB$6>YUHk^20LASL3dGd;V+>Qrp9G%nq2bj;$4tw4^=(2rk|O;a&->X=TY)u z#CAtf+{1D0x@S5Ozi?ym<{Si>OO9LowITg>k8pu*-$C(r@7;gEMJEHBfYIglOIP`D z`4MWD!8IF-sOq&x;PLE}tFS?_dk7Z-jGjP5cxE0yefAtRDiMz%%Ys3_=pmbVapfgy zm%&HiHQ`v9^q#(2evLw;@U6i620q5gADX*w-^EvgwRW^OMpq>J!aescYtnNGS$Mzr zd@kP_t7wou_wd|9(Qq)*rI14(K7L|8zi~<@4Doquf`RT#F5x9;zkChUt**#ES#TYA zM { + var settings = readSettings(); + + if (settings.addSwipeHandler) { + var swipeHandler = (dir) => { + log("swipe"); + log(dir); + if (dir === 1) { + load(); + } + }; + Bangle.on("swipe", swipeHandler); + } + + var global_load = global.load; + global.load = (fileName) => { + log("loading filename!"); + log(fileName); + var settings = readSettings(); + + if (fileName) { + // "Off" + if (settings.mode === 0) { + settings.addSwipeHandler = false; + } + + // "White List" + if (settings.mode === 1) { + if (settings.whiteList.indexOf(fileName) >= 0) { + settings.addSwipeHandler = true; + } else { + settings.addSwipeHandler = false; + } + } + + // "Black List" + if (settings.mode === 2) { + if (settings.blackList.indexOf(fileName) >= 0) { + settings.addSwipeHandler = false; + } else { + settings.addSwipeHandler = true; + } + } + + // "Always" + if (settings.mode === 3) { + settings.addSwipeHandler = true; + } + } else { + // Clock will load + settings.addSwipeHandler = false; + } + + writeSettings(settings); + global_load(fileName); + }; + }; + + // lib functions + + var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } + }; + + var readSettings = () => { + log("reading settings"); + var settings = require("Storage").readJSON(FILE, 1) || { + mode: 0, + whiteList: [], + blackList: [], + addSwipeHandler: false, + }; + log(settings); + return settings; + }; + + var writeSettings = (settings) => { + log("writing settings"); + log(settings); + require("Storage").writeJSON(FILE, settings); + }; + + // start main function + + main(); +})(); diff --git a/apps/swp2clk/settings.js b/apps/swp2clk/settings.js new file mode 100644 index 000000000..8af34fe68 --- /dev/null +++ b/apps/swp2clk/settings.js @@ -0,0 +1,133 @@ +(function (back) { + var DEBUG = true; + var FILE = "swp2clk.data.json"; + + var settings = {}; + + var showMainMenu = () => { + log("Loading main menu"); + + E.showMenu({ + "": { title: "Swipe to Clock" }, + "< Back": () => back(), + Mode: { + value: settings.mode, + min: 0, + max: 3, + format: (value) => ["Off", "White List", "Black List", "Always"][value], + onchange: (value) => { + settings.mode = value; + writeSettings(settings); + }, + }, + "White List": () => showWhiteListMenu(), + "Black List": () => {}, + }); + }; + + var showWhiteListMenu = () => { + var appList = getAppList(); + + var whiteListMenu = { + "": { title: "White List" }, + "< Back": () => showMainMenu(), + "_Add App_": () => { + var addAppMenu = { + "": { title: "Add to WL" }, + "< Back": () => showWhiteListMenu(), + }; + + appList.forEach((app) => { + if (settings.whiteList.indexOf(app.src) < 0) { + addAppMenu[app.name] = () => { + settings.whiteList.push(app.src); + writeSettings(settings); + showWhiteListMenu(); + }; + } + }); + + E.showMenu(addAppMenu); + }, + }; + + appList.forEach((app) => { + if (settings.whiteList.indexOf(app.src) >= 0) { + whiteListMenu[app.name] = () => { + E.showPrompt("Delete from WL?", { + title: "Delete from WL?", + buttons: { Yes: true, No: false }, + }).then(function (flag) { + if (flag) { + settings.whiteList.splice(index, 1); + writeSettings(settings); + } + + showWhiteListMenu(); + }); + }; + } + }); + + log("Loading white list menu"); + E.showMenu(whiteListMenu); + }; + + // lib functions + + var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } + }; + + var readSettings = () => { + log("reading settings"); + var settings = require("Storage").readJSON(FILE, 1) || { + mode: 0, + whiteList: [], + blackList: [], + addSwipeHandler: false, + }; + log(settings); + return settings; + }; + + var writeSettings = (settings) => { + log("writing settings"); + log(settings); + require("Storage").writeJSON(FILE, settings); + }; + + var getAppList = () => { + var appList = storage + .list(/\.info$/) + .map((appInfoFileName) => { + var appInfo = storage.readJSON(appInfoFileName, 1); + return ( + appInfo && { + name: appInfo.name, + // type: appInfo.type, + // icon: appInfo.icon, + sortorder: appInfo.sortorder, + src: appInfo.src, + } + ); + }) + .filter((app) => app && !!app.src); + appList.sort((a, b) => { + var n = (0 | a.sortorder) - (0 | b.sortorder); + if (n) return n; // do sortorder first + if (a.name < b.name) return -1; + if (a.name > b.name) return 1; + return 0; + }); + + return appList; + }; + + // start main function + + settings = readSettings(); + showMainMenu(); +});