From 5e87fc2bcfec4c5d8898bec1477bd6152d7dd09b Mon Sep 17 00:00:00 2001 From: Kedlub Date: Fri, 20 Jan 2023 08:32:08 +0100 Subject: [PATCH 1/5] Swipe to back prototype --- apps/backswipe/ChangeLog | 1 + apps/backswipe/app.png | Bin 0 -> 1620 bytes apps/backswipe/boot.js | 33 +++++++++++++++++++++++++++++++++ apps/backswipe/metadata.json | 13 +++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 apps/backswipe/ChangeLog create mode 100644 apps/backswipe/app.png create mode 100644 apps/backswipe/boot.js create mode 100644 apps/backswipe/metadata.json diff --git a/apps/backswipe/ChangeLog b/apps/backswipe/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/backswipe/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/backswipe/app.png b/apps/backswipe/app.png new file mode 100644 index 0000000000000000000000000000000000000000..582cb2e0853a5a2899a3afbd7eb19cde2ee7f6a0 GIT binary patch literal 1620 zcmV-a2CMmrP)1gXjloC|3_d8m;N2OpV(|i0q4YwBna<2! zK9thw%-*|urnNbV{Gax^?eD+#{x0kLJ~)lj_;W+1>qV*k8akT^^dvctZccUyj4}H~#M%Wwee_v` zHMv7o%BM8@dBrLshn{wGD9BDl?^eV5vSM3T96;NnHvtc6La=(qzq)xrX1d8bK-TN- zrd_f$_O`9nEmS+_S7HTXK<&u;LDIW|qlN&KJvM}tt6TVVqL-AvNv`B*{NzNpBfSQwQP5~Sf(Dp@Vq1+3Q`N9wBQN2`J_?M^u0FIMlt?p^8 z%U3%80kIwg!T{E9<8J18S&$k1`eO)@HP+=TZKo(z3_A3VFYJB=sn`2^Q$mRE>02(+W)np;)L1!GUvU2{O{<&F_nE6Qe#D~Xf|dD z+?d3-D1(IUiL`C2;PPv4CKw8H)v7h8^obJ&Z6D0CjVUe8Xq_NAymxUyPAMU^CCrIu z%1M71EC`5o2if_~7E&h??0jeQ1Y3N6p?}G72FmS*)xQD)%wBE=2tW6@(+MTi!fk9H1pWKew2(jTXVu4%vk26QvSQCbGmk`Z)Y! zBIhh)6vG2)h6mF8wC^|l$M(Eo9D?JiW}=_T2jUA>LC80foTera{^p)Wi`>}Gf;(|ZwEZQ zS^k|*9wyt=f4ZOo!xty7{%}HKD9tBZ50g$=%v&&vMa!#@Nsf>EkEEDA*ST6fiC+An zsNK1#>!x0obq@j$QqYU-ad3ZvbjqUU+%iw(0WahgmHV6yeLWqoYkSl4pzFQ(_Vp&I ztO{WI-48rGLwQb?#vgVvduyd9_6W)rFRoQJq3I(J?{Xmin45#=3l9BmL6Bp<*MZej zrsWN7oRPUr7IvrHoIHOjS=gPTCw>d)^LQK+B|=f2qbGjrWaOd5D<<9Dv>MTW0X3z> zyPy}9`<>1~?NCx@m8G$_@rRTy5zH12YM&P)=tU+L^fgY z^0Z&_6^qdVuwgN3wt_Ze(10?J@%{C2grBk42hsu74qEo^nd&v`X`IHN9lrxzS~GeF S(*#!l0000 Date: Fri, 20 Jan 2023 09:32:11 +0100 Subject: [PATCH 2/5] Settings for disabling specific apps --- apps/backswipe/boot.js | 17 +++++- apps/backswipe/metadata.json | 6 +- apps/backswipe/settings.js | 103 +++++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 apps/backswipe/settings.js diff --git a/apps/backswipe/boot.js b/apps/backswipe/boot.js index c45acd4c8..5f7122220 100644 --- a/apps/backswipe/boot.js +++ b/apps/backswipe/boot.js @@ -1,4 +1,6 @@ (function () { + var settings = require("Storage").readJSON("backswipe.json", 1) || {}; + // Overrride the default setUI method, so we can save the back button callback var setUI = Bangle.setUI; Bangle.setUI = function (mode, cb) { @@ -7,9 +9,11 @@ options = mode; } + var currentFile = global.__FILE__ || ""; + print("Setting UI"); if(global.BACK) delete global.BACK; - if (options && options.back) { + if (options && options.back && enabledForApp(currentFile)) { print("Saving back callback"); global.BACK = options.back; } @@ -28,6 +32,17 @@ } } + function enabledForApp(app) { + if (!settings) return true; + if (settings.mode === "blacklist") { + return !settings.apps.includes(app); + } else if (settings.mode === "whitelist") { + return settings.apps.includes(app); + } else { + return settings.mode === "on" ? true : false; + } + } + // Listen to left to right swipe Bangle.on("swipe", goBack); })(); diff --git a/apps/backswipe/metadata.json b/apps/backswipe/metadata.json index 6b7eea3d8..7aa9f6247 100644 --- a/apps/backswipe/metadata.json +++ b/apps/backswipe/metadata.json @@ -8,6 +8,10 @@ "supports" : ["BANGLEJS2"], "type": "bootloader", "storage": [ - {"name":"backswipe.boot.js","url":"boot.js"} + {"name":"backswipe.boot.js","url":"boot.js"}, + {"name":"backswipe.settings.js","url":"settings.js"} + ], + "data": [ + {"name":"backswipe.json"} ] } diff --git a/apps/backswipe/settings.js b/apps/backswipe/settings.js new file mode 100644 index 000000000..80ab25878 --- /dev/null +++ b/apps/backswipe/settings.js @@ -0,0 +1,103 @@ +(function() { + var FILE = 'backswipe.json'; + // Mode can be 'blacklist', 'whitelist', 'on' or 'disabled' + // Apps is an array of app names, where all the apps that are there are either blocked or allowed, depending on the mode + var DEFAULTS = { + 'mode': 'blacklist', + 'apps': [] + }; + + var settings = {}; + + var loadSettings = function() { + var settings = require('Storage').readJSON(FILE, 1) || DEFAULTS; + return settings; + } + + var saveSettings = function(settings) { + require('Storage').write(FILE, settings); + } + + var getApps = function() { + var apps = require('Storage').list(/\.info$/).map(app => { + return app.replace('.info', ''); + }); + return apps; + } + + var getSettings = function() { + var settings = loadSettings(); + return { + mode: settings.mode, + apps: settings.apps, + }; + } + + var showMenu = function() { + var settings = getSettings(); + var menu = { + '': { 'title': 'Backswipe' }, + '< Back': () => { + load(); + E.showMenu(); + }, + 'Mode': { + value: settings.mode, + format: v => v, + onchange: v => { + settings.mode = v; + }, + options: ['blacklist', 'whitelist', 'on', 'disabled'] + }, + 'App List': { + value: '', + format: v => v, + onchange: v => { + showAppSubMenu(); + } + } + }; + + E.showMenu(menu); + } + + var showAppSubMenu = function() { + var menu = { + '': { 'title': 'Backswipe' }, + '< Back': () => { + showMenu(); + }, + 'Add App': () => { + showAppList(); + } + }; + settings.apps.forEach(app => { + menu[app.app] = () => { + settings.apps.splice(settings.apps.indexOf(app), 1); + } + saveSettings(settings); + }); + E.showMenu(menu); + } + + var showAppList = function() { + var apps = getApps(); + var menu = { + '': { 'title': 'Backswipe' }, + '< Back': () => { + showMenu(); + } + }; + apps.forEach(app => { + menu[app] = () => { + settings.apps.push(app); + saveSettings(settings); + showAppSubMenu(); + } + }); + E.showMenu(menu); + } + + loadSettings(); + showMenu(); +}) \ No newline at end of file From 3ea038bd85146119f59231594d52040524126daf Mon Sep 17 00:00:00 2001 From: Kedlub Date: Sun, 22 Jan 2023 09:47:48 +0100 Subject: [PATCH 3/5] Functional blacklist and whitelist modes --- apps/backswipe/boot.js | 20 ++++++++----- apps/backswipe/settings.js | 61 +++++++++++++++++++------------------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/apps/backswipe/boot.js b/apps/backswipe/boot.js index 5f7122220..634a6e9d9 100644 --- a/apps/backswipe/boot.js +++ b/apps/backswipe/boot.js @@ -1,5 +1,9 @@ (function () { - var settings = require("Storage").readJSON("backswipe.json", 1) || {}; + var DEFAULTS = { + mode: 0, + apps: [], + }; + var settings = require("Storage").readJSON("backswipe.json", 1) || DEFAULTS; // Overrride the default setUI method, so we can save the back button callback var setUI = Bangle.setUI; @@ -32,17 +36,19 @@ } } + // Check if the back button should be enabled for the current app + // app is the src file of the app function enabledForApp(app) { if (!settings) return true; - if (settings.mode === "blacklist") { - return !settings.apps.includes(app); - } else if (settings.mode === "whitelist") { - return settings.apps.includes(app); + if (settings.mode === 0) { + return !(settings.apps.filter((a) => a.src === app).length > 0); + } else if (settings.mode === 1) { + return settings.apps.filter((a) => a.src === app).length > 0; } else { - return settings.mode === "on" ? true : false; + return settings.mode === 2 ? true : false; } } - + // Listen to left to right swipe Bangle.on("swipe", goBack); })(); diff --git a/apps/backswipe/settings.js b/apps/backswipe/settings.js index 80ab25878..281f391fe 100644 --- a/apps/backswipe/settings.js +++ b/apps/backswipe/settings.js @@ -1,60 +1,60 @@ -(function() { +(function(back) { var FILE = 'backswipe.json'; // Mode can be 'blacklist', 'whitelist', 'on' or 'disabled' - // Apps is an array of app names, where all the apps that are there are either blocked or allowed, depending on the mode + // Apps is an array of app info objects, where all the apps that are there are either blocked or allowed, depending on the mode var DEFAULTS = { - 'mode': 'blacklist', + 'mode': 0, 'apps': [] }; var settings = {}; var loadSettings = function() { - var settings = require('Storage').readJSON(FILE, 1) || DEFAULTS; - return settings; + settings = require('Storage').readJSON(FILE, 1) || DEFAULTS; } var saveSettings = function(settings) { require('Storage').write(FILE, settings); } + // Get all app info files var getApps = function() { - var apps = require('Storage').list(/\.info$/).map(app => { - return app.replace('.info', ''); + var apps = require('Storage').list(/\.info$/).map(appInfoFileName => { + var appInfo = require('Storage').readJSON(appInfoFileName, 1); + return appInfo && { + 'name': appInfo.name, + 'sortorder': appInfo.sortorder, + 'src': appInfo.src + }; + }).filter(app => app && !!app.src); + apps.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 apps; } - var getSettings = function() { - var settings = loadSettings(); - return { - mode: settings.mode, - apps: settings.apps, - }; - } - var showMenu = function() { - var settings = getSettings(); var menu = { '': { 'title': 'Backswipe' }, '< Back': () => { - load(); - E.showMenu(); + back(); }, 'Mode': { value: settings.mode, - format: v => v, + min: 0, + max: 3, + format: v => ["Blacklist", "Whitelist", "Always On", "Disabled"][v], onchange: v => { settings.mode = v; + saveSettings(settings); }, - options: ['blacklist', 'whitelist', 'on', 'disabled'] }, - 'App List': { - value: '', - format: v => v, - onchange: v => { - showAppSubMenu(); - } + 'App List': () => { + showAppSubMenu(); } }; @@ -72,10 +72,11 @@ } }; settings.apps.forEach(app => { - menu[app.app] = () => { + menu[app.name] = () => { settings.apps.splice(settings.apps.indexOf(app), 1); + saveSettings(settings); + showAppSubMenu(); } - saveSettings(settings); }); E.showMenu(menu); } @@ -89,8 +90,8 @@ } }; apps.forEach(app => { - menu[app] = () => { - settings.apps.push(app); + menu[app.name] = () => { + settings.apps.push(app); saveSettings(settings); showAppSubMenu(); } From 73c7dbf459c07135926ec2eabc115d3838f68c8d Mon Sep 17 00:00:00 2001 From: Kedlub Date: Sun, 22 Jan 2023 09:52:05 +0100 Subject: [PATCH 4/5] Remove debug printing --- apps/backswipe/boot.js | 4 - apps/backswipe/settings.js | 200 ++++++++++++++++++------------------- 2 files changed, 100 insertions(+), 104 deletions(-) diff --git a/apps/backswipe/boot.js b/apps/backswipe/boot.js index 634a6e9d9..523149e8c 100644 --- a/apps/backswipe/boot.js +++ b/apps/backswipe/boot.js @@ -15,10 +15,8 @@ var currentFile = global.__FILE__ || ""; - print("Setting UI"); if(global.BACK) delete global.BACK; if (options && options.back && enabledForApp(currentFile)) { - print("Saving back callback"); global.BACK = options.back; } setUI(mode, cb); @@ -27,10 +25,8 @@ function goBack(lr, ud) { // if it is a left to right swipe if (lr === 1) { - print("Back swipe detected"); // if we're in an app that has a back button, run the callback for it if (global.BACK) { - print("Running back callback"); global.BACK(); } } diff --git a/apps/backswipe/settings.js b/apps/backswipe/settings.js index 281f391fe..2c29e86f8 100644 --- a/apps/backswipe/settings.js +++ b/apps/backswipe/settings.js @@ -1,104 +1,104 @@ (function(back) { - var FILE = 'backswipe.json'; - // Mode can be 'blacklist', 'whitelist', 'on' or 'disabled' - // Apps is an array of app info objects, where all the apps that are there are either blocked or allowed, depending on the mode - var DEFAULTS = { - 'mode': 0, - 'apps': [] + var FILE = 'backswipe.json'; + // Mode can be 'blacklist', 'whitelist', 'on' or 'disabled' + // Apps is an array of app info objects, where all the apps that are there are either blocked or allowed, depending on the mode + var DEFAULTS = { + 'mode': 0, + 'apps': [] + }; + + var settings = {}; + + var loadSettings = function() { + settings = require('Storage').readJSON(FILE, 1) || DEFAULTS; + } + + var saveSettings = function(settings) { + require('Storage').write(FILE, settings); + } + + // Get all app info files + var getApps = function() { + var apps = require('Storage').list(/\.info$/).map(appInfoFileName => { + var appInfo = require('Storage').readJSON(appInfoFileName, 1); + return appInfo && { + 'name': appInfo.name, + 'sortorder': appInfo.sortorder, + 'src': appInfo.src + }; + }).filter(app => app && !!app.src); + apps.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 apps; + } + + var showMenu = function() { + var menu = { + '': { 'title': 'Backswipe' }, + '< Back': () => { + back(); + }, + 'Mode': { + value: settings.mode, + min: 0, + max: 3, + format: v => ["Blacklist", "Whitelist", "Always On", "Disabled"][v], + onchange: v => { + settings.mode = v; + saveSettings(settings); + }, + }, + 'App List': () => { + showAppSubMenu(); + } }; - - var settings = {}; - var loadSettings = function() { - settings = require('Storage').readJSON(FILE, 1) || DEFAULTS; - } - - var saveSettings = function(settings) { - require('Storage').write(FILE, settings); - } - - // Get all app info files - var getApps = function() { - var apps = require('Storage').list(/\.info$/).map(appInfoFileName => { - var appInfo = require('Storage').readJSON(appInfoFileName, 1); - return appInfo && { - 'name': appInfo.name, - 'sortorder': appInfo.sortorder, - 'src': appInfo.src - }; - }).filter(app => app && !!app.src); - apps.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 apps; - } - - var showMenu = function() { - var menu = { - '': { 'title': 'Backswipe' }, - '< Back': () => { - back(); - }, - 'Mode': { - value: settings.mode, - min: 0, - max: 3, - format: v => ["Blacklist", "Whitelist", "Always On", "Disabled"][v], - onchange: v => { - settings.mode = v; - saveSettings(settings); - }, - }, - 'App List': () => { - showAppSubMenu(); - } - }; - - E.showMenu(menu); - } - - var showAppSubMenu = function() { - var menu = { - '': { 'title': 'Backswipe' }, - '< Back': () => { - showMenu(); - }, - 'Add App': () => { - showAppList(); - } - }; - settings.apps.forEach(app => { - menu[app.name] = () => { - settings.apps.splice(settings.apps.indexOf(app), 1); - saveSettings(settings); - showAppSubMenu(); - } - }); - E.showMenu(menu); - } - - var showAppList = function() { - var apps = getApps(); - var menu = { - '': { 'title': 'Backswipe' }, - '< Back': () => { - showMenu(); - } - }; - apps.forEach(app => { - menu[app.name] = () => { - settings.apps.push(app); - saveSettings(settings); - showAppSubMenu(); - } - }); - E.showMenu(menu); - } - - loadSettings(); - showMenu(); + E.showMenu(menu); + } + + var showAppSubMenu = function() { + var menu = { + '': { 'title': 'Backswipe' }, + '< Back': () => { + showMenu(); + }, + 'Add App': () => { + showAppList(); + } + }; + settings.apps.forEach(app => { + menu[app.name] = () => { + settings.apps.splice(settings.apps.indexOf(app), 1); + saveSettings(settings); + showAppSubMenu(); + } + }); + E.showMenu(menu); + } + + var showAppList = function() { + var apps = getApps(); + var menu = { + '': { 'title': 'Backswipe' }, + '< Back': () => { + showMenu(); + } + }; + apps.forEach(app => { + menu[app.name] = () => { + settings.apps.push(app); + saveSettings(settings); + showAppSubMenu(); + } + }); + E.showMenu(menu); + } + + loadSettings(); + showMenu(); }) \ No newline at end of file From c9e95ed7f31f872424437942f3af1922851907ee Mon Sep 17 00:00:00 2001 From: Kedlub Date: Sun, 22 Jan 2023 10:01:13 +0100 Subject: [PATCH 5/5] New icon --- apps/backswipe/app.png | Bin 1620 -> 764 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/backswipe/app.png b/apps/backswipe/app.png index 582cb2e0853a5a2899a3afbd7eb19cde2ee7f6a0..93019e1e2ca438547bb310cb6d1d0b24ba71ba3d 100644 GIT binary patch delta 740 zcmVAW00c}93=Fw>B}GB*P6`o`Q3?!5 zAThbPfB`pPWMKGq4MZ|9T-FUNVdcl878~F!0$K>9KLD{vI+)GK0%9jY*b*Ric}YPD zkgWq^Cl?ff*gzLE@DzmvIRn`~K(<0U5<3ZroswFd3}oj3*?;i}zva(oV6gbYz`#5a zA(k|afnj?)1B1jJgqX@g1_u6C28L~y5n`YH!Tx0wJ5-WdQ34Y2(|2SjNGwVOOEZH4 zG%byR;nQ*k2Hr>p2H^_~3|!F=cYpzFF)*M>3@1VW0CLzigrgrvvj6}932;bRa{vGi z!vFvd!vV){sDESt00F^CL_t(&f#sO7E<`~ThQF~EQArdcD_GfxLPeudNoW)jjYve~ z?hAMWqV^!3!3%f*g#x=abPBCa+@qF^*mLikxjXCY@0t0NIcL5*kT|aD4aoBH7PUMh zcMq=fa;^P-++tIIA#06U`n3}vgM1wUoLm;E6)k|k7=O*h9U!C60WcY&u6Y1yH5QQZ zGepjSX6X7RJs_K#bw1wr5orT^K+R$u2pm9G8mmytfKy;DWbNN59YE&irHpt09j)9qgdr~o0)xx3pzemVNl1=O**)i%vagklR=iY_3zIhY7$G2Da z^m4^>uYZNGi*N&chN>TJ3OUGKr+4c*y(1>R8o)VlAE0h{G>SYlI$czeUAKD&+!bB7 zQ~)bQ)=(&bwIXX6xCdg+b`5_9sN#0j;0;i<-)Q);v0+hU4Wp^k$sQpeNj9;MWXGrv zYem*jsEMr=SwpEQWTnW;J%mTA$Yqq;k1hCX^vl}+ny%9V> z?3+7CfGXXo)I!6c-=nG1T9Q3NK9X!=AIXkUAC~$ZrHL)|JL(j&(C?x6SuguSoiyKs WlKY?1AE^fb00004iBBgQZ;76qOQH!eYQP$e z!AKAcJ}AB5-5IcA@d8w#^g@T3&dgpul+x+U-n)CIwK<9WpMUnc?eD+#{x0kLJ~)lj z_;W+1>qV*0;V;<>t_7g#4P@iwmk z1qmdsUbfUStd9Y|TVP;i68~i*#Z&Y~>jipZkI1cLC-XG&6_#ObWSo3TMb<VnloLT~EMt9))wb_t9z`$fds1weiDS%fvYLsiPBH2ZnQDk6uTc5^7mPDSrl!}_vf zTUQ)F+oLxD4{1WMdd9!Hc|m5n$vQyR>+YsqvNZO#t<^15JLgwo1!6$$$ooOkyMm*J z0F*s8gnyK)TljRMmz2LruK4O$zQL{wjY9)Z0kt|Lq(2FsQU|U{&Lnw&nv-iz0UQ(1 z_C;r*+zXKT!Vl?Dy;NHGm#6;#j+0`o?rE&cS33Uzu^t4%0M>8gZsvJekQx2@V+fHo z*5xa0rzlknI`ob)Spqpmmr>I{XwtT=f>`%xcYlkXpJLUDL8`0V*CWqymfo()hTHYJB=sn`2^Q$mRE>02( z+W)np;)L1!GUvU2{O{<&F_nE6Qe#D~Xf|dD+?d3-D1(IUiL`C2;PPv4CKw8H)v7h8 z^nZyH25leAvW+P%&S;$=IlOmqK~5megP0ekG0q%cjYX8Luf59F*IsobYlouaRHM0~ z(;q09t|si8%+WECi^loRmFYCwYI6mr1b@o&75=}a@Lib3Y|Ie4CxKK>Okic}5Rq_U zeN+~H!uVe{{lz}^`kQW`|!xuR17T{A$XG+1=zihuSA zi1p!&kSPh)j$Fxp5Gw{9(I0?wrrO+K-v|fy4|DX;36jHEtgI3$_c6CFMEwO7gd?t7 z-aKL)pd~&(x0thy7QxaE*@Ws7r4mmjvcx<3IQ(NG=PY9s!vkrC2h#ks?>HAOpF`dJ zh_{!DY|1~1bS#dwebHHv-OtHAL4Pqg_G^mIKKhN3WERtBFmGXm+WH8Q3O|NVINqP; zhpz`Xd?0}cEM8H=+`36mP?GrceEI9%2{WYQhDKVxISl-_Sn>l$M(Eo9D?J ziW}=_T2jUA>LC80foTera{^p)Wi`>}Gf;(|ZwEZQS^k|*9wyt=f4ZOo!+#eiul{gC zVkpfgTMv^?S+&Oz-^QfHN=vA6Mu zqQHxcUJp$bNst%thoZ%hhv~ZHvseduC&kuI$^k?+Ves;_U-A`;(L4gMVKHj9f;MB& zfHIHq{q=E#pRw2n(gD^ETK4Xl>NV?WoW`FWzXM%bGkOQp1Xln6002ovPDHLkV1k{q B8?pcZ