From 4d933ed959cd9cf2965879991cd07f2636eacb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20ICH=C3=89?= <4037271+peeweek@users.noreply.github.com> Date: Fri, 20 Aug 2021 15:49:13 +0200 Subject: [PATCH 01/10] Added Settings for Color scheme --- apps.json | 3 +- apps/hcclock/ChangeLog | 2 +- apps/hcclock/hcclock.app.js | 47 +++++++++++++++++++++++++++----- apps/hcclock/hcclock.settings.js | 32 ++++++++++++++++++++++ core | 2 +- 5 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 apps/hcclock/hcclock.settings.js diff --git a/apps.json b/apps.json index 2b28509cf..a9a6d736d 100644 --- a/apps.json +++ b/apps.json @@ -3390,13 +3390,14 @@ { "id": "hcclock", "name": "Hi-Contrast Clock", "icon": "hcclock-icon.png", - "version":"0.01", + "version":"0.02", "description": "Hi-Contrast Clock : A simple yet very bold clock that aims to be readable in high luninosity environments. Uses big 10x5 pixel digits. Use BTN 1 to switch background and foreground colors.", "tags": "clock", "type":"clock", "allow_emulator":true, "storage": [ {"name":"hcclock.app.js","url":"hcclock.app.js"}, + {"name":"hcclock.settings.js","url":"hcclock.settings.js"}, {"name":"hcclock.img","url":"hcclock-icon.js","evaluate":true} ] }, diff --git a/apps/hcclock/ChangeLog b/apps/hcclock/ChangeLog index 0ca30d066..343be7f07 100644 --- a/apps/hcclock/ChangeLog +++ b/apps/hcclock/ChangeLog @@ -1,2 +1,2 @@ 0.01: base code - +0.02: added settings for color schemes \ No newline at end of file diff --git a/apps/hcclock/hcclock.app.js b/apps/hcclock/hcclock.app.js index 98abbc6f3..4664dd763 100644 --- a/apps/hcclock/hcclock.app.js +++ b/apps/hcclock/hcclock.app.js @@ -174,19 +174,52 @@ function fmtDate(day,month,year,hour) let ap = "(AM)"; if(hour == 0 || hour > 12) ap = "(PM)"; - return months[month] + " " + day + " " + year + " "+ ap; + return months[month] + " " + day + " " + year + " "+ ap; } else return months[month] + ". " + day + " " + year; } -// Handles Flipping colors, then refreshes the UI + +////////////////////////////////////////// +// +// HANDLE COLORS + SETTINGS +// + +function getColorScheme() +{ + let settings = require('Storage').readJSON("hcclock.json", true) || {}; + if (!("scheme" in settings)) { + settings.scheme = 0; + } + return settings.scheme; +} + +function setColorScheme(value) +{ + let settings = require('Storage').readJSON("hcclock.json", true) || {}; + settings.scheme = value; + require('Storage').writeJSON('hcclock.json', settings); + + if(value == 0) // White + { + bg = 255; + fg = 0; + } + else // Black + { + bg = 0; + fg = 255; + } + redraw(); +} + function flipColors() { - let t = bg; - bg = fg; - fg = t; - redraw(); + if(getColorScheme() == 0) + setColorScheme(1); + else + setColorScheme(0); } ////////////////////////////////////////// @@ -197,7 +230,7 @@ function flipColors() // Initialize g.clear(); Bangle.loadWidgets(); -redraw(); +setColorScheme(getColorScheme()); // Define Refresh Interval setInterval(updateTime, interval); diff --git a/apps/hcclock/hcclock.settings.js b/apps/hcclock/hcclock.settings.js new file mode 100644 index 000000000..34d6d191a --- /dev/null +++ b/apps/hcclock/hcclock.settings.js @@ -0,0 +1,32 @@ +(function(back) { + + function getColorScheme() + { + let settings = require('Storage').readJSON("hcclock.json", true) || {}; + if (!("scheme" in settings)) { + settings.scheme = 0; + } + return settings.scheme; + } + function setColorScheme(value) + { + let settings = require('Storage').readJSON("hcclock.json", true) || {}; + settings.scheme = value? 1 : 0; + require('Storage').writeJSON('hcclock.json', settings); + } + function setIcon(visible) { + updateSetting('showIcon', visible); + + } + var mainmenu = { + "" : { "title" : "Hi-Contrast Clock" }, + "Color Scheme" : { + value: getColorScheme, + format: v => v == 0?"White":"Black", + onchange: setColorScheme + }, + "< Back" : back, + }; + E.showMenu(mainmenu); + }) + \ No newline at end of file diff --git a/core b/core index 27f9a7125..8d9a012d6 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 27f9a7125146a38c4357d679ec783f6e98a983c6 +Subproject commit 8d9a012d62d40aae1b2304d0149440fb3c022393 From 183a36f5acac51c184d002e838a4642179414680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20ICH=C3=89?= <4037271+peeweek@users.noreply.github.com> Date: Fri, 20 Aug 2021 15:54:32 +0200 Subject: [PATCH 02/10] Added Cycling for Values in Color Schemes --- apps/hcclock/hcclock.settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/hcclock/hcclock.settings.js b/apps/hcclock/hcclock.settings.js index 34d6d191a..92d5f47e5 100644 --- a/apps/hcclock/hcclock.settings.js +++ b/apps/hcclock/hcclock.settings.js @@ -10,6 +10,7 @@ } function setColorScheme(value) { + value = value + 1 % 2; let settings = require('Storage').readJSON("hcclock.json", true) || {}; settings.scheme = value? 1 : 0; require('Storage').writeJSON('hcclock.json', settings); From 7ae044e14b3049f3e131b5e93ffeb5faada65980 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 21 Oct 2021 17:18:55 +0100 Subject: [PATCH 03/10] updated image --- apps/gpstime/gpstime-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gpstime/gpstime-icon.js b/apps/gpstime/gpstime-icon.js index 665c8d5f6..99998c6c4 100644 --- a/apps/gpstime/gpstime-icon.js +++ b/apps/gpstime/gpstime-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwghC/AH8A1QWVhWq0AuVAAIuVAAIwT1WinQwTFwMzmQwTCYMjlUqGCIuBlWi0UzC6JdBIoMjC4UDmAuOkYXBPAWgmczLp2ilUiVAUDC4IwLFwIUBLoJ2BFwQwM1WjCgJ1DFwQwLFwJ1B0SQCkQWDGBQXBCgK9BDgKQBAAgwJOwUzRgIDBC54wCkZdGPBwACRgguDBIIwLFxEJBQIwLFxGaBYQwKFxQwLgAWGmQuBcAQwJC48ifYYwJgUidgsyC4L7DGBIXBdohnBCgL7BcYIXIGAqMCIoL7DL5IwERgIUBLoL7BO5QXBGAK7DkWiOxQXGFwOjFoUyFxZhDgBdCCgJ1CCxYxCgBABkcqOwIuNGAQXC0S9BLpgAFXoIwBmYuPAAYwCLp4wHFyYwDFyYwDFygwCCyoA/AFQA=")) +require("heatshrink").decompress(atob("mEw4UA////G161hyd8Jf4ALlQLK1WABREC1WgBZEK32oFxPW1QuJ7QwIFwOqvQLHhW31NaBY8qy2rtUFoAuG3W61EVqALF1+qr2gqtUHQu11dawNVqo6F22q9XFBYIwEhWqz2r6oLBGAheBqwuBBYx2CFwQLGlWqgoLCMAsKLoILChR6EgQuDqkqYYsBFweqYYoLDoWnYYoLD/WVYYv8FwXqPoIwEn52BqGrPoILEh/1FwOl9SsBBYcD/pdB2uq/QvEh/8LoOu1xHFh8/gGp9WWL4oMBgWltXeO4owBgWt1ReFYYh2GYYmXEQzDD3wiHegYKIGAJRGAAguJAH4AC")) From 8667cf1b04ec470b34ed6ffbe69a5f8c7a1a4781 Mon Sep 17 00:00:00 2001 From: peeweek <4037271+peeweek@users.noreply.github.com> Date: Thu, 21 Oct 2021 21:34:04 +0200 Subject: [PATCH 04/10] Simplified (Removed settings) --- apps.json | 1 - apps/hcclock/ChangeLog | 2 +- apps/hcclock/hcclock.settings.js | 33 -------------------------------- 3 files changed, 1 insertion(+), 35 deletions(-) delete mode 100644 apps/hcclock/hcclock.settings.js diff --git a/apps.json b/apps.json index a9a6d736d..ee81805a8 100644 --- a/apps.json +++ b/apps.json @@ -3397,7 +3397,6 @@ "allow_emulator":true, "storage": [ {"name":"hcclock.app.js","url":"hcclock.app.js"}, - {"name":"hcclock.settings.js","url":"hcclock.settings.js"}, {"name":"hcclock.img","url":"hcclock-icon.js","evaluate":true} ] }, diff --git a/apps/hcclock/ChangeLog b/apps/hcclock/ChangeLog index 343be7f07..aaa55d01a 100644 --- a/apps/hcclock/ChangeLog +++ b/apps/hcclock/ChangeLog @@ -1,2 +1,2 @@ 0.01: base code -0.02: added settings for color schemes \ No newline at end of file +0.02: saved settings when switching color scheme \ No newline at end of file diff --git a/apps/hcclock/hcclock.settings.js b/apps/hcclock/hcclock.settings.js deleted file mode 100644 index 92d5f47e5..000000000 --- a/apps/hcclock/hcclock.settings.js +++ /dev/null @@ -1,33 +0,0 @@ -(function(back) { - - function getColorScheme() - { - let settings = require('Storage').readJSON("hcclock.json", true) || {}; - if (!("scheme" in settings)) { - settings.scheme = 0; - } - return settings.scheme; - } - function setColorScheme(value) - { - value = value + 1 % 2; - let settings = require('Storage').readJSON("hcclock.json", true) || {}; - settings.scheme = value? 1 : 0; - require('Storage').writeJSON('hcclock.json', settings); - } - function setIcon(visible) { - updateSetting('showIcon', visible); - - } - var mainmenu = { - "" : { "title" : "Hi-Contrast Clock" }, - "Color Scheme" : { - value: getColorScheme, - format: v => v == 0?"White":"Black", - onchange: setColorScheme - }, - "< Back" : back, - }; - E.showMenu(mainmenu); - }) - \ No newline at end of file From f413930ced017c08b18c4f909657d0cda7388144 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 22 Oct 2021 08:52:05 +0100 Subject: [PATCH 06/10] Misc battery widget tweaks, and make icon = the actual widget's icon --- apps.json | 19 ++++++++++++++++--- apps/widbat/ChangeLog | 1 + apps/widbat/widget.js | 29 ++++++++++++----------------- apps/widbat/widget.png | Bin 297 -> 280 bytes apps/widbatv/ChangeLog | 1 + apps/widbatv/widget.js | 19 +++++++++++++++++++ apps/widbatv/widget.png | Bin 0 -> 221 bytes apps/widtbat/ChangeLog | 1 + apps/widtbat/widget.js | 28 +++++++++++----------------- apps/widtbat/widget.png | Bin 911 -> 238 bytes 10 files changed, 61 insertions(+), 37 deletions(-) create mode 100644 apps/widbatv/ChangeLog create mode 100644 apps/widbatv/widget.js create mode 100644 apps/widbatv/widget.png diff --git a/apps.json b/apps.json index 839787a2b..4a7517e22 100644 --- a/apps.json +++ b/apps.json @@ -716,7 +716,7 @@ { "id": "widbat", "name": "Battery Level Widget", - "version": "0.08", + "version": "0.09", "description": "Show the current battery level and charging status in the top right of the clock", "icon": "widget.png", "type": "widget", @@ -726,6 +726,19 @@ {"name":"widbat.wid.js","url":"widget.js"} ] }, + { + "id": "widbatv", + "name": "Battery Level Widget (Vertical)", + "version": "0.01", + "description": "Slim, vertical battery widget that only takes up 14px", + "icon": "widget.png", + "type": "widget", + "tags": "widget,battery", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbatv.wid.js","url":"widget.js"} + ] + }, { "id": "widlock", "name": "Lock Widget", @@ -1617,12 +1630,12 @@ { "id": "widtbat", "name": "Tiny Battery Widget", - "version": "0.01", + "version": "0.02", "description": "Tiny blueish battery widget, vibs and changes level color when charging", "icon": "widget.png", "type": "widget", "tags": "widget,tool,system", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"widtbat.wid.js","url":"widget.js"} ] diff --git a/apps/widbat/ChangeLog b/apps/widbat/ChangeLog index a5fdc31cc..5986ecf3f 100644 --- a/apps/widbat/ChangeLog +++ b/apps/widbat/ChangeLog @@ -5,3 +5,4 @@ 0.06: Use 'g.theme' (requires bootloader 0.23) 0.07: Move CHARGING variable to more readable string 0.08: Ensure battery updates every 60s even if LCD was on at boot and stays on +0.09: Misc speed/memory tweaks diff --git a/apps/widbat/widget.js b/apps/widbat/widget.js index 739326df0..a8a0c5382 100644 --- a/apps/widbat/widget.js +++ b/apps/widbat/widget.js @@ -1,26 +1,11 @@ (function(){ - function setWidth() { WIDGETS["bat"].width = 40 + (Bangle.isCharging()?16:0); } - function draw() { - var s = 39; - var x = this.x, y = this.y; - g.reset(); - if (Bangle.isCharging()) { - g.setColor("#0f0").drawImage(atob("DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y); - x+=16; - } - g.setColor(g.theme.fg); - g.fillRect(x,y+2,x+s-4,y+21); - g.clearRect(x+2,y+4,x+s-6,y+19); - g.fillRect(x+s-3,y+10,x+s,y+14); - g.setColor("#0f0").fillRect(x+4,y+6,x+4+E.getBattery()*(s-12)/100,y+17); - } Bangle.on('charging',function(charging) { if(charging) Bangle.buzz(); setWidth(); - Bangle.drawWidgets(); // relayout widgets + Bangle.drawWidgets(); // re-layout widgets g.flip(); }); var batteryInterval = Bangle.isLCDOn() ? setInterval(()=>WIDGETS["bat"].draw(), 60000) : undefined; @@ -37,6 +22,16 @@ } } }); - WIDGETS["bat"]={area:"tr",width:40,draw:draw}; + WIDGETS["bat"]={area:"tr",width:40,draw:function() { + var s = 39; + var x = this.x, y = this.y; + g.reset(); + if (Bangle.isCharging()) { + g.setColor("#0f0").drawImage(atob("DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y); + x+=16; + } + g.setColor(g.theme.fg).fillRect(x,y+2,x+s-4,y+21).clearRect(x+2,y+4,x+s-6,y+19).fillRect(x+s-3,y+10,x+s,y+14); + g.setColor("#0f0").fillRect(x+4,y+6,x+4+E.getBattery()*(s-12)/100,y+17); + }}; setWidth(); })() diff --git a/apps/widbat/widget.png b/apps/widbat/widget.png index 630692e38e3b9ba5fbb62b2bc3a33cd61be04836..4f7491ee9f2b43d2eb9d76638d0ac7236f71b3c3 100644 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$&H|6fVg?3oVGw3ym^DWND9B#o z>Fdh=luL|VRno>I?jle~HZvrm#5q4VH#M&W$Yo$~E=o--Nlj5G&n(GMaQE~LNYP7W z2a5N3x;Tbp+k%W^7#OjF z>xR6YxZwP~msj(vrfOZ-XeRq|Me#Trz%PXw%s%enD+*Q(4(O$7{!;ZftnH z;OBlT>zT*Z6fWiIJ=^fB#+Gq&KYwNU9G>d#i1%lbc&mQzv1$1Hd4@jEzQ$ig(U1P} ztw_>iy0bUgRQAhv#r8w_3THnth|Y_Bu~2P(K-W{of(yL1!oTHzSg}U@{@LL7qVaI@ z+@$_vb^q8z5_}o2;UU)6GFFD!1nXQXDJyW8*}q*=>C>8uX+JZBtJj^_U(L8LQa1YE T%Q{h@PZ>O2{an^LB{Ts5c#wMk diff --git a/apps/widbatv/ChangeLog b/apps/widbatv/ChangeLog new file mode 100644 index 000000000..55cda0f21 --- /dev/null +++ b/apps/widbatv/ChangeLog @@ -0,0 +1 @@ +0.01: New widget diff --git a/apps/widbatv/widget.js b/apps/widbatv/widget.js new file mode 100644 index 000000000..cc52a0f8e --- /dev/null +++ b/apps/widbatv/widget.js @@ -0,0 +1,19 @@ +Bangle.on('charging',function(charging) { + if(charging) Bangle.buzz(); + WIDGETS["batv"].draw(); +}); +setInterval(()=>WIDGETS["batv"].draw(), 60000); +Bangle.on('lcdPower', function(on) { + if (on) WIDGETS["batv"].draw(); // refresh at power on +}); +WIDGETS["batv"]={area:"tr",width:14,draw:function() { + var x = this.x, y = this.y; + g.reset(); + if (Bangle.isCharging()) { + g.setColor("#0f0").drawImage(atob("DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y); + } else { + g.clearRect(x,y,x+14,y+24); + g.setColor(g.theme.fg).fillRect(x+2,y+2,x+12,y+22).clearRect(x+4,y+4,x+10,y+20).fillRect(x+5,y+1,x+9,y+2); + g.setColor("#0f0").fillRect(x+4,y+20-(E.getBattery()*16/100),x+10,y+20); + } +}}; diff --git a/apps/widbatv/widget.png b/apps/widbatv/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..e31704d7bb7d90eeee09b4d116729f723a5f9490 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfQ!X)fMY&@Rd}Tl(+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9Vi~`>EamTas2HxOD+Zl9v0(A|M$y82O63^I+&;4;^W8jF3);u&Sn;lsp4-Ne(kiA zI^!$7f3MReSyibvNwwvMwORZISC|=D1RngEf99y { - const CBS = 0x41f, CBC = 0x07E0; - var xo = 6, xl = 22, yo = 9, h = 17; - - function draw() { - g.reset().setColor(CBS).drawImage(require("heatshrink").decompress(atob("j0TwIHEv///kD////EfAYPwuEAgPB4EAg/HCgMfzgDBvwOC/IOC84ONDoUcFgc/AYOAHYRDE")), this.x + 1, this.y + 4); - g.setColor(0).fillRect(this.x + xo, this.y + yo, this.x + xl, this.y + h); - var cbc = (Bangle.isCharging()) ? CBC : CBS; - g.setColor(cbc).fillRect(this.x + xo, this.y + yo, this.x + (xl - xo) / 100 * E.getBattery() + xo, this.y + h); - } - Bangle.on('charging', function(charging) { - if (charging) Bangle.buzz(); - Bangle.drawWidgets(); - }); - WIDGETS["widtbat"] = { area:"tr", width:32, draw: draw }; -})(); +Bangle.on('charging', function(charging) { + if (charging) Bangle.buzz(); + WIDGETS["widtbat"].draw(); +}); +WIDGETS["widtbat"] = { area:"tr", width:32, draw: function() { + const xo = 6, xl = 22, yo = 9, h = 17; + g.reset().setColor("#08f").drawImage(require("heatshrink").decompress(atob("j0TwIHEv///kD////EfAYPwuEAgPB4EAg/HCgMfzgDBvwOC/IOC84ONDoUcFgc/AYOAHYRDE")), this.x + 1, this.y + 4); + g.clearRect(this.x + xo, this.y + yo, this.x + xl, this.y + h); + var cbc = (Bangle.isCharging()) ? "#0f0" : "#08f"; + g.setColor(cbc).fillRect(this.x + xo, this.y + yo, this.x + (xl - xo) / 100 * E.getBattery() + xo, this.y + h); +} }; diff --git a/apps/widtbat/widget.png b/apps/widtbat/widget.png index 4294f0ca32299687f44c631a14109629f857f4a1..f2943bc52013b52db5cba8383076118faf2cee42 100644 GIT binary patch delta 210 zcmeBYf5$jMrJl3EBeIx*fm;}a85w5Hkzin8U@!6Xb!C6bCB|;Z|IEndDp07`)5S3) zc47kxh(UJ5u}CVu5^^4XIdJ^guk&< uHnkdA$(@|PJx4l!-G_RZkwCiPK9iWFx9rgeFQONMggssTT-G@yGywoz*h~We literal 911 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}0jUw5X}-P; zT0k}j0~4bV12aeo5Hhr9GO&Qz3=C>Ont_3N0V6_o0TW!-U;#6N4N`dWm6H(AkjTuC zh>{3jAFJg2T)o7U{G?R9irfN_0tTB3D*7iAWdWaj57fXq!y$}cUk zRZ;?31P2gzmSmu1yMhW`HkzTTSoaJ~2f8+kKR6OrFMCe`Z3#?B8 zC49*z`DeL<{|n(yEW*2#>kN&)@-iK7o}>EZyS}siuHP4aO2{#|b+YeT#Q0>l@TS?U z-Aq$V>eZY@m1ibibT(C-EV=!^vgEPuBgal1dB(`on$ebYVzQRQSqH^a%uB2$%z8DE z>HW$2WB(=7FJIlJG`oKy`vg^X$>_F+_K$r^%z0J$4H%3Uf0^)&Vb^2FKZ>Hvi{%c8 zF){0!&1!K=Za5?$k>$y;xZYrj&4(F{orb)&huCVPI|2^(Yw!ygvDk*ZIC=b8qrU_D zf!{11YaOe0ai@u|sP7R^IL*BK!>a|WRUYR#T}!NZa6kT-*Meo`Ehd*7|H&FNC$lP6 z8`u=+ML*@cApFdsH@o47vLbVa!hgXV%VUoI`al2PNuH;-O$_R Date: Fri, 22 Oct 2021 08:54:44 +0100 Subject: [PATCH 07/10] widbt: memory usage improvements --- apps.json | 2 +- apps/widbt/ChangeLog | 1 + apps/widbt/widget.js | 30 +++++++++++++----------------- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/apps.json b/apps.json index 4a7517e22..d6dc915e9 100644 --- a/apps.json +++ b/apps.json @@ -790,7 +790,7 @@ { "id": "widbt", "name": "Bluetooth Widget", - "version": "0.06", + "version": "0.07", "description": "Show the current Bluetooth connection status in the top right of the clock", "icon": "widget.png", "type": "widget", diff --git a/apps/widbt/ChangeLog b/apps/widbt/ChangeLog index 4509487ac..7aa96ce5c 100644 --- a/apps/widbt/ChangeLog +++ b/apps/widbt/ChangeLog @@ -3,3 +3,4 @@ 0.04: Fix automatic update of Bluetooth connection status 0.05: Make Bluetooth widget thinner, and when on a bright theme use light grey for disabled color 0.06: Tweaking colors for dark/light themes and low bpp screens +0.07: Memory usage improvements diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index a25d2c21c..209a8c8d8 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -1,17 +1,13 @@ -(function(){ - function draw() { - g.reset(); - if (NRF.getSecurityStatus().connected) - g.setColor((g.getBPP()>8) ? "#07f" : (g.theme.dark ? "#0ff" : "#00f")); - else - g.setColor(g.theme.dark ? "#666" : "#999"); - g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="),2+this.x,2+this.y); - } - function changed() { - WIDGETS["bluetooth"].draw(); - g.flip();// turns screen on - } - NRF.on('connect',changed); - NRF.on('disconnect',changed); - WIDGETS["bluetooth"]={area:"tr",width:15,draw:draw}; -})() +NRF.on('connect',WIDGETS["bluetooth"].changed); +NRF.on('disconnect',WIDGETS["bluetooth"].changed); +WIDGETS["bluetooth"]={area:"tr",width:15,draw:function() { + g.reset(); + if (NRF.getSecurityStatus().connected) + g.setColor((g.getBPP()>8) ? "#07f" : (g.theme.dark ? "#0ff" : "#00f")); + else + g.setColor(g.theme.dark ? "#666" : "#999"); + g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="),2+this.x,2+this.y); +},changed:function() { + WIDGETS["bluetooth"].draw(); + Bangle.setLCDPower(1); // turn screen on +}}; From 1942d5d6846c5dc093ce304f635ab9aaaea8788d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 22 Oct 2021 11:46:58 +0100 Subject: [PATCH 08/10] minor original launcher tweak --- apps/launch/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/launch/app.js b/apps/launch/app.js index 449e16e62..3d4682e55 100644 --- a/apps/launch/app.js +++ b/apps/launch/app.js @@ -16,7 +16,7 @@ function drawMenu() { var w = g.getWidth(); var h = g.getHeight(); var m = w/2; - var n = (h-48)/64; + var n = Math.floor((h-48)/64); if (selected>=n+menuScroll) menuScroll = 1+selected-n; if (selected Date: Fri, 22 Oct 2021 11:47:23 +0100 Subject: [PATCH 09/10] Adding BETA messages app --- apps.json | 20 ++- apps/messages/README.md | 21 +++ apps/messages/app-icon.js | 1 + apps/messages/app.js | 273 ++++++++++++++++++++++++++++++++++++++ apps/messages/app.png | Bin 0 -> 917 bytes apps/messages/boot.js | 36 +++++ apps/messages/lib.js | 0 apps/messages/widget.js | 20 +++ 8 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 apps/messages/README.md create mode 100644 apps/messages/app-icon.js create mode 100644 apps/messages/app.js create mode 100644 apps/messages/app.png create mode 100644 apps/messages/boot.js create mode 100644 apps/messages/lib.js create mode 100644 apps/messages/widget.js diff --git a/apps.json b/apps.json index d6dc915e9..a372476a0 100644 --- a/apps.json +++ b/apps.json @@ -31,6 +31,23 @@ ], "sortorder": -10 }, + { + "id": "messages", + "name": "Messages", + "version": "0.01", + "description": "App to display notifications from iOS and Gadgetbridge (BETA)", + "icon": "app.png", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"messages.app.js","url":"app.js"}, + {"name":"messages.img","url":"app-icon.js","evaluate":true}, + {"name":"messages.boot.js","url":"boot.js"}, + {"name":"messages.wid.js","url":"widget.js"} + ], + "sortorder": -9 + }, { "id": "health", "name": "Health Tracking", @@ -46,8 +63,9 @@ {"name":"health.boot.js","url":"boot.js"}, {"name":"health","url":"lib.js"} ], - "sortorder": -10 + "sortorder": -8 }, + { "id": "moonphase", "name": "Moonphase", diff --git a/apps/messages/README.md b/apps/messages/README.md new file mode 100644 index 000000000..c243ec06a --- /dev/null +++ b/apps/messages/README.md @@ -0,0 +1,21 @@ +# Messages app + +**THIS APP IS CURRENTLY BETA** + +This app handles the display of messages and message notifications. It stores +a list of currently received messages and allows them to be listed, viewed, +and responded to. + +It is a replacement for the old `notify`/`gadgetbridge` apps. + +## Usage + +... + +## Requests + +Please file any issues on https://github.com/espruino/BangleApps/issues/new?title=messages%20app + +## Creator + +Gordon Williams diff --git a/apps/messages/app-icon.js b/apps/messages/app-icon.js new file mode 100644 index 000000000..6ed3c1141 --- /dev/null +++ b/apps/messages/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///rkcAYP9ohL/ABMBqoAEoALDioLFqgLDBQoABERIkEBZcFBY9QBed61QAC1oLF7wLD24LF24LD7wLF1vqBQOrvQLFA4IuC9QLFD4IuC1QLGGAQOBBYwgBEwQLHvQBBEZHVq4jI7wWBHY5TLNZaDLTZazLffMBBY9ABZsABY4KCgEVBQtUBYYkGEQYA/AAwA=")) diff --git a/apps/messages/app.js b/apps/messages/app.js new file mode 100644 index 000000000..d369ee175 --- /dev/null +++ b/apps/messages/app.js @@ -0,0 +1,273 @@ +/* MESSAGES is a list of: + {id:int, + src, + title, + subject, + body, + sender, + tel:string, + new:true // not read yet + } +*/ + +/* For example for maps: + +GB({"t":"notify","id":1575479849,"src":"Hangouts","title":"A Name","body":"message contents"}) +GB({"t":"notify","id":2,"src":"Hangouts","title":"Gordon","body":"Hello world quite a lot of text here..."}) +GB({"t":"notify","id":3,"src":"Messages","title":"Ted","body":"Bed time."}) +GB({"t":"notify","id":4,"src":"Messages","title":"Kailo","body":"Mmm... food"}) +GB({"t":"notify-","id":1}) + +GB({"t":"notify","id":1,"src":"Maps","title":"0 yd - High St","body":"Campton - 11:48 ETA","img":"Y2MBAA....AAAAAAAAAAAAAA="}) +GB({"t":"notify~","id":1,"body":"Campton - 11:54 ETA"}) +GB({"t":"notify~","id":1,"title":"High St"}) +GB({"t":"notify~","id":1,"body":"Campton - 11:55 ETA"}) +GB({"t":"notify~","id":1,"title":"0 yd - High St"}) +GB({"t":"notify~","id":1,"body":"Campton - 11:56 ETA"}) + +*/ + +var Layout = require("Layout"); + +var MESSAGES = require("Storage").readJSON("messages.json",1)||[]; +if (!Array.isArray(MESSAGES)) MESSAGES=[]; +var onMessagesModified = function(msg) { + // TODO: if new, show this new one + if (msg.new) Bangle.buzz(); + showMessage(msg.id); +}; +function saveMessages() { + require("Storage").writeJSON("messages.json",MESSAGES) +} + +function showMapMessage(msg) { + var m; + var distance, street, target, eta; + m=msg.title.match(/(.*) - (.*)/); + if (m) { + distance = m[1]; + street = m[2]; + } else street=msg.title; + m=msg.body.match(/(.*) - (.*)/); + if (m) { + target = m[1]; + eta = m[2]; + } else target=msg.body; + layout = new Layout({ + type:"v", c: [ + {type:"txt", font:"6x15", label:target, bgCol:"#0f0", fillx:1, pad:2 }, + {type:"h", bgCol:"#0f0", fillx:1, c: [ + {type:"txt", font:"6x8", label:"Towards" }, + {type:"txt", font:"6x15:2", label:street } + ]}, + {type:"h",fillx:1, filly:1, c: [ + {type:"img",src:atob(msg.img)}, + {type:"v", fillx:1, c: [ + {type:"txt", font:"6x15:2", label:distance||"" } + ]}, + ]}, + + {type:"txt", font:"6x8:2", label:eta } + ] + }); + g.clearRect(0,24,g.getWidth()-1,g.getHeight()-1); + layout.render(); + Bangle.setUI("updown",function() { + // any input to mark as not new and return to menu + msg.new = false; + saveMessages(); + checkMessages(); + }); +} + +function showMessage(msgid) { + var msg = MESSAGES.find(m=>m.id==msgid); + if (!msg) return checkMessages(); // go home if no message found + if (msg.src=="Maps") return showMapMessage(msg); + var m = msg.title+"\n"+msg.body; + E.showPrompt(m,{title:"Message", buttons : {"Read":"read", "Back":"back"}}).then(chosen => { + if (chosen=="read") { + // any input to mark as not new and return to menu + msg.new = false; + saveMessages(); + checkMessages(); + } else { + checkMessages(true); + } + }); +} + +// Show a single menu item for the message +function showMessageMenuItem(y, idx) { + var msg = MESSAGES[idx]; + var W = g.getWidth(), H=48; + if (msg.new) g.setBgColor("#4F4"); + else g.setBgColor("#CFC"); + g.clearRect(0,y,W-1,y+H-1).setColor(g.theme.fg); + var m = msg.title+"\n"+msg.body; + if (msg.src) g.setFontAlign(1,-1).drawString(msg.src, W-2, y+2); + if (msg.title) g.setFontAlign(-1,-1).setFont("12x20").drawString(msg.title, 2,y+2); + if (msg.body) { + g.setFontAlign(-1,-1).setFont("6x8"); + var l = g.wrapString(msg.body, W-14); + if (l.length>3) { + l = l.slice(0,3); + l[l.length-1]+="..."; + } + g.drawString(l.join("\n"), 12,y+20); + } +} +//test +//g.clear(1); showMessageMenuItem(MESSAGES[0],24) + +if (process.env.HWVERSION==1) { // Bangle.js 1 + showBigMenu = function(options) { + /* options = { + h = height + items = # of items + draw = function(y, idx) + onSelect = function(idx) + }*/ + var selected = 0; + var menuScroll = 0; + var menuShowing = false; + var w = g.getWidth(); + var h = g.getHeight(); + var m = w/2; + var n = Math.floor((h-48)/options.h); + + function drawMenu() { + g.reset(); + if (selected>=n+menuScroll) menuScroll = 1+selected-n; + if (selected=options.items) break; + var y = 24+i*options.h; + options.draw(y, idx); + // border for selected + if (i+menuScroll==selected) { + g.setColor(g.theme.fgG).drawRect(0,y,w-1,y+options.h-1).drawRect(1,y+1,w-2,y+options.h-2); + } + } + // arrows + g.setColor(menuScroll ? g.theme.fg : g.theme.bg); + g.fillPoly([m,6,m-14,20,m+14,20]); + g.setColor((options.items>n+menuScroll) ? g.theme.fg : g.theme.bg); + g.fillPoly([m,h-7,m-14,h-21,m+14,h-21]); + } + g.clearRect(0,24,w-1,h-1); + drawMenu(); + Bangle.setUI("updown",dir=>{ + if (dir) { + selected += dir; + if (selected<0) selected = options.items-1; + if (selected>=options.items) selected = 0; + drawMenu(); + } else { + options.onSelect(selected); + } + }); + } +} else { // Bangle.js 2 + showBigMenu = function(options) { + /* options = { + h = height + items = # of items + draw = function(y, idx) + onSelect = function(idx) + }*/ + var menuScroll = 0; + var menuShowing = false; + var w = g.getWidth(); + var h = g.getHeight(); + var n = Math.ceil((h-24)/options.h); + var menuScrollMax = options.h*options.items - (h-24); + + function drawItem(i) { + var y = 24+i*options.h-menuScroll; + if (i<0 || i>=options.items || y<-options.h || y>=h) return; + options.draw(y, i); + } + + function drawMenu() { + g.reset().clearRect(0,24,w-1,h-1); + g.setClipRect(0,24,w-1,h-1); + for (var i=0;i{ + var dy = e.dy; + if (menuScroll - dy < 0) + dy = menuScroll; + if (menuScroll - dy > menuScrollMax) + dy = menuScroll - menuScrollMax; + if (!dy) return; + g.reset().setClipRect(0,24,g.getWidth()-1,g.getHeight()-1); + g.scroll(0,dy); + menuScroll -= dy; + if (e.dy < 0) { + drawItem(Math.floor((menuScroll+24+g.getHeight())/options.h)-1); + if (e.dy <= -options.h) drawItem(Math.floor((menuScroll+24+h)/options.h)-2); + } else { + drawItem(Math.floor((menuScroll+24)/options.h)); + if (e.dy >= options.h) drawItem(Math.floor((menuScroll+24)/options.h)+1); + } + g.setClipRect(0,0,w-1,h-1); + }; + Bangle.on('drag',Bangle.dragHandler); + Bangle.touchHandler = (_,e)=>{ + if (e.y<20) return; + var i = Math.floor((e.y+menuScroll-24) / options.h); + if (i>=0 && i { load() }); + // we have >0 messages + // TODO: IF A NEW MESSAGE, SHOW IT + if (!forceShowMenu) { + var newMessages = MESSAGES.filter(m=>m.new); + if (newMessages.length) + return showMessage(newMessages[0].id); + } + // Otherwise show a menu + var m = { + "":{title:"Messages"}, + "< Back": ()=>load() + }; + /*g.setFont("6x8"); + MESSAGES.forEach(msg=>{ + // "id":1575479849,"src":"Hangouts","title":"A Name","body":"message contents" + var title = g.wrapString(msg.title, g.getWidth())[0]; + m[title] = function() { + showMessage(msg.id); + } + }); + E.showMenu(m);*/ + showBigMenu({ + h : 48, + items : MESSAGES.length, + draw : showMessageMenuItem, + onSelect : idx => showMessage(MESSAGES[idx].id) + }); +} + +Bangle.loadWidgets(); +Bangle.drawWidgets(); +checkMessages(); diff --git a/apps/messages/app.png b/apps/messages/app.png new file mode 100644 index 0000000000000000000000000000000000000000..c9177692e282e1247ced30f6ec0e2d14dc6dfa25 GIT binary patch literal 917 zcmV;G18V$CmK~!jg?U~I_6G0fppJ|s5%ZG(_jU{sLoS)M|Tx5HNwbU93{dM|XETG(}U{r87GP zP5QgOGds^S`_B9Bv_O#}MT#6JB;SE&AFiJ#PVFW@+5j{Fs1U4W3&1i!=cz7@tv)#Y zDW6G)8t?@prO7h)FeSJHz+qQqp6HZfw0bu&7zz6JtOi;d@C75Ko8|7;0Ims@mp=#J3E*{IZSCaRo7jz0My7S0nqA z?9Rp%4b8HI>M{r3e%-^}7vKLHd-Y5ye(oBGDVaVJ^4o8QwhZKo5Ba?~SxzwZA%&Tb z+lVS@06>def}RU5^jtiFA3Jn^jtCRn26CIwMDK4Qfz}EHS`WVSdt3w|zjyyIcTdI< z_Iq%ulJDxlW!-Ky5!DO<4g;b}p(qo~D|bzZD}}iwxHqISKZAMo>{p|R3Ib$Ig#6z9 zuUuBR4)M~4hRY-CJX3}9-`~ir3~U~mio^M77O*m~S^yz@5V~R(vM@mB3ZaDu3db9> zn1uo77y$nJqBwM-ljmkZQv)kQbrDK2S{O|%(5EZ+>pq)BEvr!VZekF?f^bdwGcVVy z-?JKEX&@5x?N#k0IslB|Xwyjp=o7hSt>fM8D`~5NdH=;!|7gueKnEx>+CfPJ#Q*e| r1fk1>I_9WBo>`?$ks?Kk{5$*tT^fbQe@cvs00000NkvXXu0mjfYw(!I literal 0 HcmV?d00001 diff --git a/apps/messages/boot.js b/apps/messages/boot.js new file mode 100644 index 000000000..dce3979da --- /dev/null +++ b/apps/messages/boot.js @@ -0,0 +1,36 @@ +(function() { + var _GB = global.GB; + global.GB = (event) => { + if (_GB) setTimeout(_GB,0,event); + // call handling? + if (!event.t.startsWith("notify")) return; + /* event is: + {t:"notify",id:int, src,title,subject,body,sender,tel:string} + {t:"notify~",id:int, title:string} // modified + {t:"notify-",id:int} // remove + */ + var messages, inApp = "undefined"!=typeof MESSAGES; + if (inApp) + messages = MESSAGES; // we're in an app that has already loaded messages + else // no app - load messages + messages = require("Storage").readJSON("messages.json",1)||[]; + // now modify/delete as appropriate + var mIdx = messages.findIndex(m=>m.id==event.id); + if (event.t=="notify-") { + if (mIdx>=0) messages.splice(mIdx, 1); // remove item + mIdx=-1; + } else { // add/modify + if (event.t=="notify") event.new=true; // new message + if (mIdx<0) mIdx=messages.push(event)-1; + else Object.assign(messages[mIdx], event); + } + require("Storage").writeJSON("messages.json",messages); + if (inApp) return onMessagesModified(mIdx<0 ? {id:event.id} : messages[mIdx]); + // ok, saved now - we only care if it's new + if (event.t!="notify") return; + // if we're in a clock, go straight to messages app + if (Bangle.CLOCK) return load("messages.app.js"); + if (!global.WIDGETS || !WIDGETS.messages) return Bangle.buzz(); // no widgets - just buzz to let someone know + WIDGETS.messages.newMessage(); + }; +})() diff --git a/apps/messages/lib.js b/apps/messages/lib.js new file mode 100644 index 000000000..e69de29bb diff --git a/apps/messages/widget.js b/apps/messages/widget.js new file mode 100644 index 000000000..eda4a85a5 --- /dev/null +++ b/apps/messages/widget.js @@ -0,0 +1,20 @@ +WIDGETS["messages"]={area:"tl",width:0,draw:function() { + if (!this.width) return; + var c = (Date.now()-this.t)/1000; + g.reset().setBgColor((c&1) ? "#0f0" : "#030").setColor((c&1) ? "#000" : "#fff"); + g.clearRect(this.x,this.y,this.x+this.width,this.y+23); + g.setFont("6x8:1x2").setFontAlign(0,0).drawString("MESSAGES", this.x+this.width/2, this.y+12); + //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute + if (c<120 && (Date.now()-this.l)>4000) { + this.l = Date.now(); + Bangle.buzz(); // buzz every 4 seconds + } + setTimeout(()=>WIDGETS["messages"].draw(), 1000); +},newMessage:function() { + WIDGETS["messages"].t=Date.now(); // first time + WIDGETS["messages"].l=Date.now()-10000; // last buzz + if (WIDGETS["messages"].c!==undefined) return; // already called + WIDGETS["messages"].width=64; + Bangle.drawWidgets(); + Bangle.setLCDPower(1);// turns screen on +}}; From 4fae5fc05dad52ad997221493528f77b12cfa17e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 22 Oct 2021 12:57:53 +0100 Subject: [PATCH 10/10] oops --- apps/widbt/widget.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 209a8c8d8..88be3d5c9 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -1,5 +1,3 @@ -NRF.on('connect',WIDGETS["bluetooth"].changed); -NRF.on('disconnect',WIDGETS["bluetooth"].changed); WIDGETS["bluetooth"]={area:"tr",width:15,draw:function() { g.reset(); if (NRF.getSecurityStatus().connected) @@ -11,3 +9,5 @@ WIDGETS["bluetooth"]={area:"tr",width:15,draw:function() { WIDGETS["bluetooth"].draw(); Bangle.setLCDPower(1); // turn screen on }}; +NRF.on('connect',WIDGETS["bluetooth"].changed); +NRF.on('disconnect',WIDGETS["bluetooth"].changed);