From 45194a542868a4f83da98b73754e5925c72ec39c Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Mon, 13 Dec 2021 16:00:56 +0000 Subject: [PATCH 01/15] Add CoreTemp app --- apps.json | 15 +++++++++++++++ apps/coretemp/ChangeLog | 1 + apps/coretemp/boot.js | 23 +++++++++++++++++++++++ apps/coretemp/coretemp-icon.js | 1 + apps/coretemp/coretemp.js | 19 +++++++++++++++++++ apps/coretemp/coretemp.png | Bin 0 -> 4870 bytes 6 files changed, 59 insertions(+) create mode 100644 apps/coretemp/ChangeLog create mode 100644 apps/coretemp/boot.js create mode 100644 apps/coretemp/coretemp-icon.js create mode 100644 apps/coretemp/coretemp.js create mode 100644 apps/coretemp/coretemp.png diff --git a/apps.json b/apps.json index 2752e2a0f..95484dbe9 100644 --- a/apps.json +++ b/apps.json @@ -4931,5 +4931,20 @@ {"name":"awairmonitor.app.js","url":"app.js"}, {"name":"awairmonitor.img","url":"app-icon.js","evaluate":true} ] + }, + { + "id": "coretemp", + "name": "Core Temp Display", + "version": "0.01", + "description": "Display CoreTemp sensor data", + "icon": "coretemp.png", + "type": "app", + "tags": "health", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"coretemp.boot.js","url":"boot.js"}, + {"name":"coretemp.app.js","url":"coretemp.js"}, + {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} + ] } ] diff --git a/apps/coretemp/ChangeLog b/apps/coretemp/ChangeLog new file mode 100644 index 000000000..c7b309a74 --- /dev/null +++ b/apps/coretemp/ChangeLog @@ -0,0 +1 @@ +0.1: New app diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js new file mode 100644 index 000000000..59e227dad --- /dev/null +++ b/apps/coretemp/boot.js @@ -0,0 +1,23 @@ +(function() { + var gatt; + + //Would it be better to scan by uuid rather than name? + NRF.requestDevice({ timeout: 20000, filters: [{ name: 'CORE [a]' }] }).then(function(device) { + return device.gatt.connect(); + }).then(function(g) { + gatt = g; + return gatt.getPrimaryService("1809"); + }).then(function(service) { + return service.getCharacteristic("2A1C"); + }).then(function(characteristic) { + characteristic.on('characteristicvaluechanged', function(event) { + var dv = event.target.value; + var core = (dv.buffer[2]*256+dv.buffer[1])/100; + Bangle.emit('Core',{ + temp:core + }); + }); + return characteristic.startNotifications(); + }).then(function() { + }); +})(); diff --git a/apps/coretemp/coretemp-icon.js b/apps/coretemp/coretemp-icon.js new file mode 100644 index 000000000..051c6b953 --- /dev/null +++ b/apps/coretemp/coretemp-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("AAAAADgAAAAAADgAAAADxgDAAAH0zABgAAPAWAAwAB4AMDgYADAAIM4IAGABIYcAAIABIwMEAQABIwEEAwADIwAEBAA+IwEEDAB8IQMEGAHAIcYAGAAAIMQYGAQAMAAYEAwAGAAgAAwADABgIBgABgDEIBgAAP4wIDAAAPxgACAAAAOAACAAAAMDICAAAAADICAAAAADICAAAAADACAAAAADACAAAAYAICAAAAfgICAAAAf8IBAAAA/8IBgAABh8MAgAABgMMAAAABAEGAAAACAAGAGAAMAYDADAAIAQBAA4HIAgAAAACcAAAQAAAcBAAAAAAOHAAAAAAOGAAAAAAHwAABgAADAAAAgAACAAAAOAAMAAAAAAEAAAAAAH+AAA")); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js new file mode 100644 index 000000000..226508c83 --- /dev/null +++ b/apps/coretemp/coretemp.js @@ -0,0 +1,19 @@ +Bangle.setLCDPower(1); +Bangle.setLCDTimeout(0); +var btm = g.getHeight()-1; + +function onCore(c) { + var px = g.getWidth()/2; + g.setFontAlign(0,0); + g.clearRect(0,24,g.getWidth(),80); + var str = c.temp + "C"; + g.setFontVector(40).drawString(str,px,45); +} +Bangle.on('Core', onCore); + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +g.reset().setFont("6x8",2).setFontAlign(0,0); +g.drawString("Please wait...",g.getWidth()/2,g.getHeight()/2 - 16); diff --git a/apps/coretemp/coretemp.png b/apps/coretemp/coretemp.png new file mode 100644 index 0000000000000000000000000000000000000000..a573828f8eddc2cfaaf74dbf03e3d1a796a98847 GIT binary patch literal 4870 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 literal 0 HcmV?d00001 From b214d53fcf8e2123aaf280368bfbc4e808afe725 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Mon, 13 Dec 2021 16:18:48 +0000 Subject: [PATCH 02/15] Add readme --- apps.json | 3 ++- apps/coretemp/README.md | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 apps/coretemp/README.md diff --git a/apps.json b/apps.json index 95484dbe9..50510b780 100644 --- a/apps.json +++ b/apps.json @@ -4936,10 +4936,11 @@ "id": "coretemp", "name": "Core Temp Display", "version": "0.01", - "description": "Display CoreTemp sensor data", + "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", "type": "app", "tags": "health", + "readme": "README.md" "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"coretemp.boot.js","url":"boot.js"}, diff --git a/apps/coretemp/README.md b/apps/coretemp/README.md new file mode 100644 index 000000000..fac25df21 --- /dev/null +++ b/apps/coretemp/README.md @@ -0,0 +1,20 @@ +# CoreTemp display + +Basic bare-bones example of connecting to a bluetooth [CoreTemp](https://corebodytemp.com/) device and displaying the current body core temperature readings. + +## Usage + +On startup connects to a CoreTemp device (1809/2A1C) and emits a "Core, temp" value for each reading. +The app simply displays these readings on screen. + +## TODO + +* Integrate with other tracking/sports apps to log data. +* Add device selection +* Provide enable/disable option +* Check status, add Retry/reconnect +* Also provide skin temp reading + +## Creator + +Ivor Hewitt From d1efe34f631720dd311125c63de3bb5794edbfff Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Mon, 13 Dec 2021 16:22:30 +0000 Subject: [PATCH 03/15] Fix icon --- apps/coretemp/coretemp-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/coretemp/coretemp-icon.js b/apps/coretemp/coretemp-icon.js index 051c6b953..5f36b9090 100644 --- a/apps/coretemp/coretemp-icon.js +++ b/apps/coretemp/coretemp-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AAAAADgAAAAAADgAAAADxgDAAAH0zABgAAPAWAAwAB4AMDgYADAAIM4IAGABIYcAAIABIwMEAQABIwEEAwADIwAEBAA+IwEEDAB8IQMEGAHAIcYAGAAAIMQYGAQAMAAYEAwAGAAgAAwADABgIBgABgDEIBgAAP4wIDAAAPxgACAAAAOAACAAAAMDICAAAAADICAAAAADICAAAAADACAAAAADACAAAAYAICAAAAfgICAAAAf8IBAAAA/8IBgAABh8MAgAABgMMAAAABAEGAAAACAAGAGAAMAYDADAAIAQBAA4HIAgAAAACcAAAQAAAcBAAAAAAOHAAAAAAOGAAAAAAHwAABgAADAAAAgAACAAAAOAAMAAAAAAEAAAAAAH+AAA")); +require("heatshrink").decompress(atob("mEw4UA///k0DxUFgsDCY8KwAfJlQLHhWglWq1WgBIcCA4QCB1WoComq0+iBYWqCwl//4OBAAQxChWlv/2BYIlCBYUqv9VvQLBwA9BBYWlqtV/QLBGoRIBgQLBr9aBYQ2BBYMKroLBtQLCgALClIKC1AXG1NVuoFBF4sC09V+woCBAJHCgWXq9oPQZrDgWdq9gBZG9rqgCTwSbCgVVqysDBYkK6tWYoa/DkEJ6vaaIgWBaAILCbQhUCBYXoc4wNBBZWqBfBtB1ALKKZILCR4J3FToQLBU4KPEWoQLNZYILIa4NVcYReEcYOnqtaDAbvDgALBcg4EBlNVqtqDoOgd4YoBBYNWytWCwQdCgQLBAAVaBYkA0oLDuwLFkv1BgZGDAAMJuoKCroWEGAOnDAVftShGr////1tDdG14LB+wiEAAdqHAjTHBYgA==")) From c3605c42c1cfa16730141817e5fe5c9014d70b0f Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Mon, 13 Dec 2021 16:24:34 +0000 Subject: [PATCH 04/15] Fix comma --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 50510b780..155909076 100644 --- a/apps.json +++ b/apps.json @@ -4940,7 +4940,7 @@ "icon": "coretemp.png", "type": "app", "tags": "health", - "readme": "README.md" + "readme": "README.md", "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"coretemp.boot.js","url":"boot.js"}, From f243c0972b9426b0fa25e46b665a4c2d80479754 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Mon, 13 Dec 2021 10:33:58 -0800 Subject: [PATCH 05/15] Update ChangeLog --- apps/pooqroman/ChangeLog | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/pooqroman/ChangeLog b/apps/pooqroman/ChangeLog index 9debf0efe..c4f3171d3 100644 --- a/apps/pooqroman/ChangeLog +++ b/apps/pooqroman/ChangeLog @@ -1,2 +1,3 @@ -0.01: New App! -0.02: Make internal menu time out + small fixes +0.01: Initial check-in. +0.02: Make internal menu time out + small fixes. +0.03: Autolight feature. From fcce9b7336fb617a8a6888197c2c15e92e884693 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Mon, 13 Dec 2021 10:35:21 -0800 Subject: [PATCH 06/15] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 0826bbf81..4a7d02093 100644 --- a/apps.json +++ b/apps.json @@ -4734,7 +4734,7 @@ { "id": "pooqroman", "name": "pooq Roman watch face", "shortName":"pooq Roman", - "version":"0.02", + "version":"0.03", "description": "A classic watch face with a certain dynamicity. Most amusing in 24h mode. Slide up to show more hands, down for less(!). By design does not support standard widgets, sorry!", "icon": "app.png", "type": "clock", From 358a02471dfbe2cda75f3c59176a3371bcbbd9df Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Mon, 13 Dec 2021 13:42:14 -0500 Subject: [PATCH 07/15] android: Send notification id when handling notifications --- apps.json | 2 +- apps/android/ChangeLog | 1 + apps/android/boot.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 0826bbf81..fa01da76b 100644 --- a/apps.json +++ b/apps.json @@ -98,7 +98,7 @@ "id": "android", "name": "Android Integration", "shortName": "Android", - "version": "0.04", + "version": "0.05", "description": "Display notifications/music/etc from Gadgetbridge on Android. This replaces the old Gadgetbridge widget.", "icon": "app.png", "tags": "tool,system,messages,notifications", diff --git a/apps/android/ChangeLog b/apps/android/ChangeLog index 35fa0e386..c2c4ea6be 100644 --- a/apps/android/ChangeLog +++ b/apps/android/ChangeLog @@ -3,3 +3,4 @@ Fix music control 0.03: Handling of message actions (ok/clear) 0.04: Android icon now goes to settings page with 'find phone' +0.05: Fix handling of message actions diff --git a/apps/android/boot.js b/apps/android/boot.js index 97e3a5641..59ffe006d 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -65,7 +65,7 @@ // Message response Bangle.messageResponse = (msg,response) => { if (msg.id=="call") return gbSend({ t: "call", n:response?"ACCEPT":"REJECT" }); - if (isFinite(msg.id)) return gbSend({ t: "notify", n:response?"OPEN":"DISMISS" }); + if (isFinite(msg.id)) return gbSend({ t: "notify", n:response?"OPEN":"DISMISS", id: msg.id }); // error/warn here? }; })(); From 186258e3984a1a2f2586cbf576e8b99dcd779e83 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Mon, 13 Dec 2021 11:17:24 -0800 Subject: [PATCH 08/15] Update app.js Add an option to illuminate the display on twist. --- apps/pooqroman/app.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/pooqroman/app.js b/apps/pooqroman/app.js index d59d4ef6c..52fffa76f 100644 --- a/apps/pooqroman/app.js +++ b/apps/pooqroman/app.js @@ -138,6 +138,10 @@ class RomanOptions extends Options { onchange: x => this.calendric = x, format: x => ['none', 'day', 'date'][x] }, + 'Auto-Illum.': { + init: _ => this.autolight, + onchange: x => this.autolight = x + }, Defaults: _ => {this.reset(); this.interact();} }; } @@ -164,6 +168,7 @@ RomanOptions.defaults = { alarmFg: '#f00', timerFg: '#0f0', activeFg: g.theme.fg2, + autolight: true, }; ////////////////////////////////////////////////////////////////////////////// @@ -664,8 +669,8 @@ class Clock { this.listeners = { lcdPower: on => on ? this.active() : this.inactive(), - charging: () => {face.doIcons('charging'); this.active();}, - lock: () => {face.doIcons('locked'); this.active();}, + charging: _ => {face.doIcons('charging'); this.active();}, + lock: _ => {face.doIcons('locked'); this.active();}, faceUp: up => {this.conservative = !up; this.active();}, drag: e => { if (this.t0) { @@ -694,6 +699,8 @@ class Clock { } } }; + this.options.autolight && + (this.listeners.twist = _ => Bangle.setLCDBrightness(1)); } redraw(rate) { @@ -728,7 +735,6 @@ class Clock { } const delay = rate - now % rate + 1; this.refresh = true; - if (rate !== prev) { this.inactive(); this.redraw(rate); From 134935dc469f61fbe6be5053e60a97ce87f9e565 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Mon, 13 Dec 2021 11:52:10 -0800 Subject: [PATCH 09/15] Update app.js Debugged. Also, it seems that on Bangle 2, the responsible way to do this is with LCDPower, not LCDBrightness. --- apps/pooqroman/app.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/pooqroman/app.js b/apps/pooqroman/app.js index 52fffa76f..9e13e6e03 100644 --- a/apps/pooqroman/app.js +++ b/apps/pooqroman/app.js @@ -668,10 +668,10 @@ class Clock { this.options.on('done', () => this.start()); this.listeners = { - lcdPower: on => on ? this.active() : this.inactive(), charging: _ => {face.doIcons('charging'); this.active();}, lock: _ => {face.doIcons('locked'); this.active();}, faceUp: up => {this.conservative = !up; this.active();}, + twist: _ => this.options.autolight && Bangle.setLCDPower(true), drag: e => { if (this.t0) { if (e.b) { @@ -699,8 +699,6 @@ class Clock { } } }; - this.options.autolight && - (this.listeners.twist = _ => Bangle.setLCDBrightness(1)); } redraw(rate) { @@ -771,7 +769,7 @@ class Clock { this.rates.clock = this.timescales[this.options.resolution]; this.active(); for (const l in this.listeners) { - Bangle.on(l, this.listeners[l]); + this.listeners[l] && Bangle.on(l, this.listeners[l]); } Bangle.setUI('clock'); return this; From abfb7fc8a47a92648a23a21e996a2d62423fe062 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Mon, 13 Dec 2021 12:51:01 -0800 Subject: [PATCH 10/15] Update README.md FIx a typo, add a couple of sentences about autolight. --- apps/pooqroman/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/pooqroman/README.md b/apps/pooqroman/README.md index b41a4a316..87acea9ca 100644 --- a/apps/pooqroman/README.md +++ b/apps/pooqroman/README.md @@ -13,9 +13,12 @@ you can alter the number of hands on the display. When the watch is unlocked, sl There's also a setting that displays the second hand, but only if the watch is perfectly face-to-the-sky, in case you want the ability to check the _exact_ time, hands free, without the impact on battery life this usually entails. -Although we genrally obey the system-wide theming, you can long press on the display for a menu of additional options specific to the face. +Although we generally obey the system-wide theming, you can long press on the display for a menu of additional options specific to the face. You can also override the system 12/24 hour setting just for this face here, since it's, well, a rather different experience than with numeric displays. +By default, there is a backlight that comes on when you twist your wrist. This, of course, somewhat increases power draw and could be +annoying in an intentionally dark environment, so there is an option to disable it. + One other thing: there's some integration with system timers and alarms; they will show as small pips at the appropriate places in the day around the display. When they come within an hour, the pips turn to crosses relating to the minute hand, and the minute hand turns itself on. When timers are mere seconds away, the display changes again and the second hand activates itself, so you From c1cbc3937779482f43cd214263ebcd5d1b748517 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Mon, 13 Dec 2021 13:00:29 -0800 Subject: [PATCH 11/15] Update app.js Remove an unneeded piece of defensiveness. --- apps/pooqroman/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pooqroman/app.js b/apps/pooqroman/app.js index 9e13e6e03..bed8ef3d2 100644 --- a/apps/pooqroman/app.js +++ b/apps/pooqroman/app.js @@ -769,7 +769,7 @@ class Clock { this.rates.clock = this.timescales[this.options.resolution]; this.active(); for (const l in this.listeners) { - this.listeners[l] && Bangle.on(l, this.listeners[l]); + Bangle.on(l, this.listeners[l]); } Bangle.setUI('clock'); return this; From b541a4b6a7a02ab92791aa91b9dc0bb3a719af72 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 13 Dec 2021 21:52:41 +0100 Subject: [PATCH 12/15] Draw correct border (1px all around) --- apps/dtlaunch/app-b2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dtlaunch/app-b2.js b/apps/dtlaunch/app-b2.js index 674fe3677..1aecdaa88 100644 --- a/apps/dtlaunch/app-b2.js +++ b/apps/dtlaunch/app-b2.js @@ -28,7 +28,7 @@ const YOFF = 30; function draw_icon(p,n,selected) { var x = (n%2)*72+XOFF; var y = n>1?72+YOFF:YOFF; - (selected?g.setColor(g.theme.fgH):g.setColor(g.theme.bg)).fillRect(x+10,y+2,x+60,y+52); + (selected?g.setColor(g.theme.fgH):g.setColor(g.theme.bg)).fillRect(x+11,y+3,x+60,y+52); g.clearRect(x+12,y+4,x+59,y+51); g.setColor(g.theme.fg); try{g.drawImage(apps[p*4+n].icon,x+12,y+4);} catch(e){} From a42b609d232e27b6610e8b95571d230952b259c6 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 13 Dec 2021 22:48:20 +0100 Subject: [PATCH 13/15] Adds settings page for hiding launchers and clocks --- apps.json | 4 +++- apps/dtlaunch/app-b1.js | 13 ++++++++++++- apps/dtlaunch/app-b2.js | 13 ++++++++++++- apps/dtlaunch/settings.js | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 apps/dtlaunch/settings.js diff --git a/apps.json b/apps.json index 0826bbf81..044ec88e1 100644 --- a/apps.json +++ b/apps.json @@ -3305,8 +3305,10 @@ "storage": [ {"name":"dtlaunch.app.js","url":"app-b1.js", "supports": ["BANGLEJS"]}, {"name":"dtlaunch.app.js","url":"app-b2.js", "supports": ["BANGLEJS2"]}, + {"name":"dtlaunch.settings.js","url":"settings.js"}, {"name":"dtlaunch.img","url":"app-icon.js","evaluate":true} - ] + ], + "data": [{"name":"dtlaunch.json"}] }, { "id": "HRV", diff --git a/apps/dtlaunch/app-b1.js b/apps/dtlaunch/app-b1.js index 9bbf3e219..ec0569127 100644 --- a/apps/dtlaunch/app-b1.js +++ b/apps/dtlaunch/app-b1.js @@ -2,6 +2,11 @@ * */ +var settings = Object.assign({ + showClocks: true, + showLaunchers: true, +}, require('Storage').readJSON("dtlaunch.json", true) || {}); + function wdog(handle,timeout){ if(handle !== undefined){ wdog.handle = handle; @@ -17,7 +22,13 @@ function wdog(handle,timeout){ wdog(load,120000) var s = require("Storage"); -var apps = s.list(/\.info$/).map(app=>{var a=s.readJSON(app,1);return a&&{name:a.name,type:a.type,icon:a.icon,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="clock" || !app.type)); +var apps = s.list(/\.info$/).map(app=>{ + var a=s.readJSON(app,1); + return a && { + name:a.name, type:a.type, icon:a.icon, sortorder:a.sortorder, src:a.src + };}).filter( + app=>app && (app.type=="app" || (app.type=="clock" && settings.showClocks) || (app.type=="launch" && settings.showLaunchers) || !app.type)); + apps.sort((a,b)=>{ var n=(0|a.sortorder)-(0|b.sortorder); if (n) return n; // do sortorder first diff --git a/apps/dtlaunch/app-b2.js b/apps/dtlaunch/app-b2.js index 1aecdaa88..19e0d7c98 100644 --- a/apps/dtlaunch/app-b2.js +++ b/apps/dtlaunch/app-b2.js @@ -2,8 +2,19 @@ * */ +var settings = Object.assign({ + showClocks: true, + showLaunchers: true, +}, require('Storage').readJSON("dtlaunch.json", true) || {}); + var s = require("Storage"); -var apps = s.list(/\.info$/).map(app=>{var a=s.readJSON(app,1);return a&&{name:a.name,type:a.type,icon:a.icon,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="clock" || !app.type)); +var apps = s.list(/\.info$/).map(app=>{ + var a=s.readJSON(app,1); + return a && { + name:a.name, type:a.type, icon:a.icon, sortorder:a.sortorder, src:a.src + };}).filter( + app=>app && (app.type=="app" || (app.type=="clock" && settings.showClocks) || (app.type=="launch" && settings.showLaunchers) || !app.type)); + apps.sort((a,b)=>{ var n=(0|a.sortorder)-(0|b.sortorder); if (n) return n; // do sortorder first diff --git a/apps/dtlaunch/settings.js b/apps/dtlaunch/settings.js new file mode 100644 index 000000000..5bfe83ba5 --- /dev/null +++ b/apps/dtlaunch/settings.js @@ -0,0 +1,33 @@ +(function(back) { + var FILE = "dtlaunch.json"; + + var settings = Object.assign({ + showClocks: true, + showLaunchers: true + }, require('Storage').readJSON(FILE, true) || {}); + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + + E.showMenu({ + "" : { "title" : "Desktop launcher" }, + "< Back" : () => back(), + 'Show clocks': { + value: settings.showClocks, + format: v => v?"On":"Off", + onchange: v => { + settings.showClocks = v; + writeSettings(); + } + }, + 'Show launchers': { + value: settings.showLaunchers, + format: v => v?"On":"Off", + onchange: v => { + settings.showLaunchers = v; + writeSettings(); + } + }, + }); +}) From 3cfb42456aa5d996141d85e68a7fbbbf09f55e17 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 13 Dec 2021 22:49:03 +0100 Subject: [PATCH 14/15] Bump version --- apps.json | 2 +- apps/dtlaunch/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 044ec88e1..8f7be447a 100644 --- a/apps.json +++ b/apps.json @@ -3294,7 +3294,7 @@ { "id": "dtlaunch", "name": "Desktop Launcher", - "version": "0.05", + "version": "0.06", "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], "icon": "icon.png", diff --git a/apps/dtlaunch/ChangeLog b/apps/dtlaunch/ChangeLog index c3102b4b9..a2b41b828 100644 --- a/apps/dtlaunch/ChangeLog +++ b/apps/dtlaunch/ChangeLog @@ -3,3 +3,4 @@ 0.03: cycle thru pages 0.04: reset to clock after 2 mins of inactivity 0.05: add Bangle 2 version +0.06: Adds settings page (hide clocks or launchers) From 3cb795c033307df91beb5b68d845ca66d838195b Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 13 Dec 2021 23:20:56 +0100 Subject: [PATCH 15/15] Adds setting for direct launch of apps on touch with Bangle 2 --- apps.json | 5 ++- apps/dtlaunch/ChangeLog | 1 + apps/dtlaunch/app-b2.js | 9 ++-- apps/dtlaunch/{settings.js => settings-b1.js} | 2 +- apps/dtlaunch/settings-b2.js | 42 +++++++++++++++++++ 5 files changed, 52 insertions(+), 7 deletions(-) rename apps/dtlaunch/{settings.js => settings-b1.js} (99%) create mode 100644 apps/dtlaunch/settings-b2.js diff --git a/apps.json b/apps.json index 8f7be447a..6930d027d 100644 --- a/apps.json +++ b/apps.json @@ -3294,7 +3294,7 @@ { "id": "dtlaunch", "name": "Desktop Launcher", - "version": "0.06", + "version": "0.07", "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], "icon": "icon.png", @@ -3305,7 +3305,8 @@ "storage": [ {"name":"dtlaunch.app.js","url":"app-b1.js", "supports": ["BANGLEJS"]}, {"name":"dtlaunch.app.js","url":"app-b2.js", "supports": ["BANGLEJS2"]}, - {"name":"dtlaunch.settings.js","url":"settings.js"}, + {"name":"dtlaunch.settings.js","url":"settings-b1.js", "supports": ["BANGLEJS"]}, + {"name":"dtlaunch.settings.js","url":"settings-b2.js", "supports": ["BANGLEJS2"]}, {"name":"dtlaunch.img","url":"app-icon.js","evaluate":true} ], "data": [{"name":"dtlaunch.json"}] diff --git a/apps/dtlaunch/ChangeLog b/apps/dtlaunch/ChangeLog index a2b41b828..c414c1ddc 100644 --- a/apps/dtlaunch/ChangeLog +++ b/apps/dtlaunch/ChangeLog @@ -4,3 +4,4 @@ 0.04: reset to clock after 2 mins of inactivity 0.05: add Bangle 2 version 0.06: Adds settings page (hide clocks or launchers) +0.06: Adds setting for directly launching app on touch for Bangle 2 diff --git a/apps/dtlaunch/app-b2.js b/apps/dtlaunch/app-b2.js index 19e0d7c98..800ec456c 100644 --- a/apps/dtlaunch/app-b2.js +++ b/apps/dtlaunch/app-b2.js @@ -5,6 +5,7 @@ var settings = Object.assign({ showClocks: true, showLaunchers: true, + direct: false, }, require('Storage').readJSON("dtlaunch.json", true) || {}); var s = require("Storage"); @@ -63,7 +64,7 @@ function drawPage(p){ } for (var i=0;i<4;i++) { if (!apps[p*4+i]) return i; - draw_icon(p,i,selected==i); + draw_icon(p,i,selected==i && !settings.direct); } g.flip(); } @@ -92,9 +93,9 @@ Bangle.on("touch",(_,p)=>{ for (i=0;i<4;i++){ if((page*4+i)=0) { - if (selected!=i){ + draw_icon(page,i,true && !settings.direct); + if (selected>=0 || settings.direct) { + if (selected!=i && !settings.direct){ draw_icon(page,selected,false); } else { load(apps[page*4+i].src); diff --git a/apps/dtlaunch/settings.js b/apps/dtlaunch/settings-b1.js similarity index 99% rename from apps/dtlaunch/settings.js rename to apps/dtlaunch/settings-b1.js index 5bfe83ba5..f3101da16 100644 --- a/apps/dtlaunch/settings.js +++ b/apps/dtlaunch/settings-b1.js @@ -28,6 +28,6 @@ settings.showLaunchers = v; writeSettings(); } - }, + } }); }) diff --git a/apps/dtlaunch/settings-b2.js b/apps/dtlaunch/settings-b2.js new file mode 100644 index 000000000..7f667d213 --- /dev/null +++ b/apps/dtlaunch/settings-b2.js @@ -0,0 +1,42 @@ +(function(back) { + var FILE = "dtlaunch.json"; + + var settings = Object.assign({ + showClocks: true, + showLaunchers: true, + direct: false + }, require('Storage').readJSON(FILE, true) || {}); + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + + E.showMenu({ + "" : { "title" : "Desktop launcher" }, + "< Back" : () => back(), + 'Show clocks': { + value: settings.showClocks, + format: v => v?"On":"Off", + onchange: v => { + settings.showClocks = v; + writeSettings(); + } + }, + 'Show launchers': { + value: settings.showLaunchers, + format: v => v?"On":"Off", + onchange: v => { + settings.showLaunchers = v; + writeSettings(); + } + }, + 'Direct launch': { + value: settings.direct, + format: v => v?"On":"Off", + onchange: v => { + settings.direct = v; + writeSettings(); + } + } + }); +})