From bff8fbacda2e8cfb289dd08f507822e1d3c3ba3c Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Fri, 9 Dec 2022 18:52:30 +0000 Subject: [PATCH 01/30] Simplest++ dropped the word clock from the app name --- apps/simplestpp/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/simplestpp/metadata.json b/apps/simplestpp/metadata.json index 10f756e32..cf7648d85 100644 --- a/apps/simplestpp/metadata.json +++ b/apps/simplestpp/metadata.json @@ -1,6 +1,6 @@ { "id": "simplestpp", - "name": "Simplest++ Clock", + "name": "Simplest++", "version": "0.01", "description": "The simplest working clock, with fast load and clock_info, acts as a tutorial piece", "readme": "README.md", From 30bf43ecc27482057ac03cab5bfe5e8c3982ac84 Mon Sep 17 00:00:00 2001 From: Leon Matthes Date: Sat, 10 Dec 2022 12:40:39 +0100 Subject: [PATCH 02/30] CalClock: 0.06 - Improved multi-line text --- apps/calclock/ChangeLog | 1 + apps/calclock/calclock.js | 7 ++++--- apps/calclock/metadata.json | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/calclock/ChangeLog b/apps/calclock/ChangeLog index 5c1b7c4bc..90bcfb9d4 100644 --- a/apps/calclock/ChangeLog +++ b/apps/calclock/ChangeLog @@ -3,3 +3,4 @@ 0.03: Tell clock widgets to hide. 0.04: Improve current time readability in light theme. 0.05: Show calendar colors & improved all day events. +0.06: Improved multi-line locations & titles diff --git a/apps/calclock/calclock.js b/apps/calclock/calclock.js index 5a13a202f..1f98502ef 100644 --- a/apps/calclock/calclock.js +++ b/apps/calclock/calclock.js @@ -54,13 +54,15 @@ function drawEventBody(event, y) { var yStart = y; if (lines.length > 2) { lines = lines.slice(0,2); - lines[1] = lines[1].slice(0,-3)+"..."; + lines[1] += "..."; } g.drawString(lines.join('\n'),10,y); y+=20 * lines.length; if(event.location) { g.drawImage(atob("DBSBAA8D/H/nDuB+B+B+B3Dn/j/B+A8A8AYAYAYAAAAAAA=="),10,y); - g.drawString(event.location,25,y); + var loclines = g.wrapString(event.location, g.getWidth()-30); + if(loclines.length>1) loclines[0] += "..."; + g.drawString(loclines[0],25,y); y+=20; } if (event.color) { @@ -131,4 +133,3 @@ var minuteInterval = setInterval(redraw, 60 * 1000); Bangle.setUI("clock"); Bangle.loadWidgets(); Bangle.drawWidgets(); - diff --git a/apps/calclock/metadata.json b/apps/calclock/metadata.json index be0a1bdd8..bfd847595 100644 --- a/apps/calclock/metadata.json +++ b/apps/calclock/metadata.json @@ -2,7 +2,7 @@ "id": "calclock", "name": "Calendar Clock", "shortName": "CalClock", - "version": "0.05", + "version": "0.06", "description": "Show the current and upcoming events synchronized from Gadgetbridge", "icon": "calclock.png", "type": "clock", From 825a705339e390e8fb07567592caa40aa1ede0fb Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sun, 11 Dec 2022 15:15:44 +0100 Subject: [PATCH 03/30] ClockFace: fix fast loading --- modules/ClockFace.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ClockFace.js b/modules/ClockFace.js index b1b007be9..bf64d418a 100644 --- a/modules/ClockFace.js +++ b/modules/ClockFace.js @@ -58,6 +58,7 @@ function ClockFace(options) { ClockFace.prototype.tick = function() { "ram" + if (this._removed) return; const time = new Date(); const now = { d: `${time.getFullYear()}-${time.getMonth()}-${time.getDate()}`, @@ -131,6 +132,7 @@ ClockFace.prototype.resume = function() { this.tick(); }; ClockFace.prototype.remove = function() { + this._removed = true; if (this._timeout) clearTimeout(this._timeout); Bangle.removeListener("lcdPower", this._onLcd); if (this._remove) this._remove.apply(this); From 3af685e0722fd8c7323f698bc1f73df562fcf8e9 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Sun, 11 Dec 2022 17:25:38 +0000 Subject: [PATCH 04/30] Firmware ClockInfo --- apps/clkinfofw/ChangeLog | 1 + apps/clkinfofw/app.png | Bin 0 -> 1012 bytes apps/clkinfofw/clkinfo.js | 31 +++++++++++++++++++++++++++++++ apps/clkinfofw/metadata.json | 12 ++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 apps/clkinfofw/ChangeLog create mode 100644 apps/clkinfofw/app.png create mode 100644 apps/clkinfofw/clkinfo.js create mode 100644 apps/clkinfofw/metadata.json diff --git a/apps/clkinfofw/ChangeLog b/apps/clkinfofw/ChangeLog new file mode 100644 index 000000000..7b83706bf --- /dev/null +++ b/apps/clkinfofw/ChangeLog @@ -0,0 +1 @@ +0.01: First release diff --git a/apps/clkinfofw/app.png b/apps/clkinfofw/app.png new file mode 100644 index 0000000000000000000000000000000000000000..c6575b73b8824950ae1478b4fcdfe3ee180ed586 GIT binary patch literal 1012 zcmVQEHN5433o2V)~G3@io)j7a1p8f7BJ)!o6-#o%O& z{t0aU1q`NPa?ltDe}E`vogHz#Qomho=-0K zT<*EJ48s6B>AKFcY!|21Y5{=T?f(5CpUG|e#P;^K$KyFTIH1nT%8JkDt5hn~nVg)Q znwp}`N~JP1G_<<9N}c`veUHbpv$OLLfK*l0bzN0ev-A4;S}K*y&dtpYZI()cWy;v;%10aWG|D^^30YsD}i8`TB2ob$rFLlPp$IU~$UN0hsLLur%l7xtXK)^Pf ztK*_>G#b~}*VSs(cKn}dU|=8`jrR5Rb?7tNbaZs&^ZC9Bg-R5~d_LbE-3nB%*Bzjt zOpQjv21rp9XK08NMX>-_v+V8d%}Jp4a6Os!ySuxZrU8K8?;jo>c9>vubMxWh0RSSA z$lTl<=(^5v9O*;ELZRR!O`%XgMDm&E`DU}pG7Ph~w|8-I0RVo#-$@#x<>h5EL-Bar z?RHzU%=sCz$+90;&jGOju(q~F)=)Sco}ZuZ^7Q)p`pnGCmjdMT`E)wn<$%L~m}CJ2JA>ny`Cnx@^~-vfZx>wSKH{?Y{e zy<}Og)oK6`3-mX^iNV1^06@h52ejW%&jGOjaCmrld3gyxT?WPD@!8qg9x8)4j{7*EZEbDQLeWVY zB3cHGjEpc0^FPb%WCiN)?{_kMhj5k|tJmxFeEr>$B+355$}o&vF6RJ~BuU4|$L-NO zUwXd3zh7Nlee0#?*w`4)^Bwxy87<0WGKiSXW~q}(r4Uh7Rq7-X334JPQdJcZQ>hen zve_&mW-=MuaQ64q<#Jh36!RYmcXxM+qL4!j5!vXeYPFi8DCW!4N~NMGO1WIN4cBvN zZ$CrPXq4yqXf#TlSS)saejW@4&5pTr2?m3LAjD!Z>Wq$#avW!V$!F@ks4Z%>TIRo= i+8y!|Gn4I*&-4ql4;+?rBV)q=0000 { + let d = new Date(); + let g = Graphics.createArrayBuffer(24,24,1,{msb:true}); + //g.drawImage(atob("FhgBDADAMAMP/////////////////////8AADwAAPAAA8AADwAAPAAA8AADwAAPAAA8AADwAAPAAA8AADwAAP///////"),1,0); + g.drawImage(atob("GBjD/wAA//8c56pSLGOylJrWwxgkknFY7HI4kkkkk5mw2mUvEkkklarVWq5XIkkksAAAAAAABkklAAAAAAAAAIk7AAAAAAAAAbHOgAAAAAAAAV4lAAAAAAAAAIlXAAdtttvgAarSgAMkkklgAWYlAAMkkklgAInXAAMkkklgAa7XAAMkkklgAa4lAAMkkklgAInSgAMkkklgAWZXAAdtttvgAaolAAAAAAAAAInOgAAAAAAAAV47AAAAAAAAAbElAAAAAAAAAIkksAAAAAAABkkklarVWq5XIkkkk5mw2mUvEkkkknFY7HI4kkk="),1,0); + return { + text : process.env.VERSION, + img : g.asImage("string") + }; + }, + show : function() { + this.interval = setTimeout(()=>{ + this.emit("redraw"); + this.interval = setInterval(()=>{ + this.emit("redraw"); + }, 86400000); + }, 86400000 - (Date.now() % 86400000)); + }, + hide : function() { + clearInterval(this.interval); + this.interval = undefined; + } + } + ] + }; +}) diff --git a/apps/clkinfofw/metadata.json b/apps/clkinfofw/metadata.json new file mode 100644 index 000000000..8b722e52f --- /dev/null +++ b/apps/clkinfofw/metadata.json @@ -0,0 +1,12 @@ +{ "id": "clkinfofw", + "name": "Firmware Clockinfo", + "version":"0.01", + "description": "For clocks that display 'clockinfo', this displays the firmware version string", + "icon": "app.png", + "type": "clkinfo", + "tags": "clkinfo,firmware", + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"clkinfofw.clkinfo.js","url":"clkinfo.js"} + ] +} From 3b0f525bd2d7e6d290bf0a657a954322cd731862 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sun, 11 Dec 2022 18:34:07 +0100 Subject: [PATCH 05/30] messagegui: write "remove" messages to flash Whoops: we didn't handle these at all, but are actually responsible for saving them, even if the UI won't be launched. Fixes #2380 --- apps/messagegui/ChangeLog | 1 + apps/messagegui/lib.js | 17 +++++++++++++---- apps/messagegui/metadata.json | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/apps/messagegui/ChangeLog b/apps/messagegui/ChangeLog index 3f5ff70fd..36ec8191f 100644 --- a/apps/messagegui/ChangeLog +++ b/apps/messagegui/ChangeLog @@ -82,3 +82,4 @@ 0.58: Fast load messages without writing to flash Don't write messages to flash until the app closes 0.59: Ensure we do write messages if messages app can't be fast loaded (see #2373) +0.60: Fix saving of removal messages if UI not open diff --git a/apps/messagegui/lib.js b/apps/messagegui/lib.js index f9919c01c..57dc3c1e2 100644 --- a/apps/messagegui/lib.js +++ b/apps/messagegui/lib.js @@ -10,7 +10,15 @@ exports.listener = function(type, msg) { clearTimeout(exports.messageTimeout); delete exports.messageTimeout; } - if (msg.t==="remove") return; + if (msg.t==="remove") { + // we won't open the UI for removed messages, so make sure to delete it from flash + if (Bangle.MESSAGES) { + // we were waiting for exports.messageTimeout + require("messages").apply(msg, Bangle.MESSAGES); + if (!Bangle.MESSAGES.length) delete Bangle.MESSAGES; + } + return require("messages").save(msg); // always write removal to flash + } const appSettings = require("Storage").readJSON("messages.settings.json", 1) || {}; let loadMessages = (Bangle.CLOCK || event.important); @@ -26,12 +34,12 @@ exports.listener = function(type, msg) { require("messages").save(msg); } else { if (!Bangle.MESSAGES) Bangle.MESSAGES = []; - Bangle.MESSAGES.push(msg); + require("messages").apply(msg, Bangle.MESSAGES); + if (!Bangle.MESSAGES.length) delete Bangle.MESSAGES; } const saveToFlash = () => { // save messages from RAM to flash after all, if we decide not to launch app - if (!Bangle.MESSAGES) return; - Bangle.MESSAGES.forEach(m => require("messages").save(m)); + if (Bangle.MESSAGES) Bangle.MESSAGES.forEach(m => require("messages").save(m)); delete Bangle.MESSAGES; } msg.handled = true; @@ -50,6 +58,7 @@ exports.listener = function(type, msg) { if (exports.messageTimeout) clearTimeout(exports.messageTimeout); exports.messageTimeout = setTimeout(function() { delete exports.messageTimeout; + if (!Bangle.MESSAGES) return; // message was removed during the delay if (type!=="music") { if (!loadMessages) { // not opening the app, just buzz diff --git a/apps/messagegui/metadata.json b/apps/messagegui/metadata.json index 80b362551..5b1cb60c6 100644 --- a/apps/messagegui/metadata.json +++ b/apps/messagegui/metadata.json @@ -2,7 +2,7 @@ "id": "messagegui", "name": "Message UI", "shortName": "Messages", - "version": "0.59", + "version": "0.60", "description": "Default app to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", From 8a67b1a63d0841b7785625c1b9a681b45eb8c175 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Sun, 11 Dec 2022 17:56:18 +0000 Subject: [PATCH 06/30] changed icon to be transparent --- apps/clkinfofw/clkinfo.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/clkinfofw/clkinfo.js b/apps/clkinfofw/clkinfo.js index 44b94afa8..a7886e2bc 100644 --- a/apps/clkinfofw/clkinfo.js +++ b/apps/clkinfofw/clkinfo.js @@ -7,7 +7,8 @@ let d = new Date(); let g = Graphics.createArrayBuffer(24,24,1,{msb:true}); //g.drawImage(atob("FhgBDADAMAMP/////////////////////8AADwAAPAAA8AADwAAPAAA8AADwAAPAAA8AADwAAPAAA8AADwAAP///////"),1,0); - g.drawImage(atob("GBjD/wAA//8c56pSLGOylJrWwxgkknFY7HI4kkkkk5mw2mUvEkkklarVWq5XIkkksAAAAAAABkklAAAAAAAAAIk7AAAAAAAAAbHOgAAAAAAAAV4lAAAAAAAAAIlXAAdtttvgAarSgAMkkklgAWYlAAMkkklgAInXAAMkkklgAa7XAAMkkklgAa4lAAMkkklgAInSgAMkkklgAWZXAAdtttvgAaolAAAAAAAAAInOgAAAAAAAAV47AAAAAAAAAbElAAAAAAAAAIkksAAAAAAABkkklarVWq5XIkkkk5mw2mUvEkkkknFY7HI4kkk="),1,0); + //g.drawImage(atob("GBjD/wAA//8c56pSLGOylJrWwxgkknFY7HI4kkkkk5mw2mUvEkkklarVWq5XIkkksAAAAAAABkklAAAAAAAAAIk7AAAAAAAAAbHOgAAAAAAAAV4lAAAAAAAAAIlXAAdtttvgAarSgAMkkklgAWYlAAMkkklgAInXAAMkkklgAa7XAAMkkklgAa4lAAMkkklgAInSgAMkkklgAWZXAAdtttvgAaolAAAAAAAAAInOgAAAAAAAAV47AAAAAAAAAbElAAAAAAAAAIkksAAAAAAABkkklarVWq5XIkkkk5mw2mUvEkkkknFY7HI4kkk="),1,0); + g.drawImage(atob("GBjD/wAA//8QhEEIvvfPewhC970kk9Ho/lcrkkkkkpxOJRqNEkkkxZ3O7V6vKEkmMAAAAAAABwklAAAAAAAAAInrAAAAAAAAAZdNgAAAAAAAANoygAAAAAAAAWHrAABtttsAAZdNgAOSSSRgANoygAOEkkxgAWHrAAOEkkxgAZfrAAOEkkxgAZcygAOEkkxgAWFNgAOSSSRgANrrAABtttsAAZcygAAAAAAAAWFNgAAAAAAAANrrAAAAAAAAAZclAAAAAAAAAIkmMAAAAAAABwkkxZ3O7V6vKEkkkpxOJRqNEkkkk9Ho/lcrkkk="),1,0); return { text : process.env.VERSION, img : g.asImage("string") From 776ef09608f69e02501b523376a517127c41b67c Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Sun, 11 Dec 2022 18:23:05 +0000 Subject: [PATCH 07/30] added screenshot --- apps/clkinfofw/clkinfo.js | 4 +--- apps/clkinfofw/metadata.json | 1 + apps/clkinfofw/screenshot.png | Bin 0 -> 2772 bytes 3 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 apps/clkinfofw/screenshot.png diff --git a/apps/clkinfofw/clkinfo.js b/apps/clkinfofw/clkinfo.js index a7886e2bc..4ca05e8d1 100644 --- a/apps/clkinfofw/clkinfo.js +++ b/apps/clkinfofw/clkinfo.js @@ -6,9 +6,7 @@ get : () => { let d = new Date(); let g = Graphics.createArrayBuffer(24,24,1,{msb:true}); - //g.drawImage(atob("FhgBDADAMAMP/////////////////////8AADwAAPAAA8AADwAAPAAA8AADwAAPAAA8AADwAAPAAA8AADwAAP///////"),1,0); - //g.drawImage(atob("GBjD/wAA//8c56pSLGOylJrWwxgkknFY7HI4kkkkk5mw2mUvEkkklarVWq5XIkkksAAAAAAABkklAAAAAAAAAIk7AAAAAAAAAbHOgAAAAAAAAV4lAAAAAAAAAIlXAAdtttvgAarSgAMkkklgAWYlAAMkkklgAInXAAMkkklgAa7XAAMkkklgAa4lAAMkkklgAInSgAMkkklgAWZXAAdtttvgAaolAAAAAAAAAInOgAAAAAAAAV47AAAAAAAAAbElAAAAAAAAAIkksAAAAAAABkkklarVWq5XIkkkk5mw2mUvEkkkknFY7HI4kkk="),1,0); - g.drawImage(atob("GBjD/wAA//8QhEEIvvfPewhC970kk9Ho/lcrkkkkkpxOJRqNEkkkxZ3O7V6vKEkmMAAAAAAABwklAAAAAAAAAInrAAAAAAAAAZdNgAAAAAAAANoygAAAAAAAAWHrAABtttsAAZdNgAOSSSRgANoygAOEkkxgAWHrAAOEkkxgAZfrAAOEkkxgAZcygAOEkkxgAWFNgAOSSSRgANrrAABtttsAAZcygAAAAAAAAWFNgAAAAAAAANrrAAAAAAAAAZclAAAAAAAAAIkmMAAAAAAABwkkxZ3O7V6vKEkkkpxOJRqNEkkkk9Ho/lcrkkk="),1,0); + g.drawImage(atob("GBjC////AADve773VWmmmmlVVW22nnlVVbLL445VVwAAAADVWAAAAAAlrAAAAAA6sAAAAAAOWAAAAAAlrAD//wA6sANVVcAOWANVVcAlrANVVcA6rANVVcA6WANVVcAlsANVVcAOrAD//wA6WAAAAAAlsAAAAAAOrAAAAAA6WAAAAAAlVwAAAADVVbLL445VVW22nnlVVWmmmmlV"),1,0); return { text : process.env.VERSION, img : g.asImage("string") diff --git a/apps/clkinfofw/metadata.json b/apps/clkinfofw/metadata.json index 8b722e52f..924297ca3 100644 --- a/apps/clkinfofw/metadata.json +++ b/apps/clkinfofw/metadata.json @@ -4,6 +4,7 @@ "description": "For clocks that display 'clockinfo', this displays the firmware version string", "icon": "app.png", "type": "clkinfo", + "screenshots": [{"url":"screenshot.png"}], "tags": "clkinfo,firmware", "supports" : ["BANGLEJS2"], "storage": [ diff --git a/apps/clkinfofw/screenshot.png b/apps/clkinfofw/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..da185bd2e2837ea214c62f22cc25a2c7616c18e5 GIT binary patch literal 2772 zcmeH}c~sJg7RP^}xPW_UZn#ldiY3yxOJ)$ZsWl@Sq@gLAdzxFMp|7S)Ma#xA7o5Se z6a_WY2^X3Sb#kN4)C9)L9R>Ha=sD-S_t*RPz5m`H_kPbk_xsm9=iblF^6|o}Lk*z- z0H`1K#Gc$#&flS;w3*pWp8_`plyDO70o3*xPXPdwei(b;r<6cR>0j}qR%%y@S1(Tr z&p(*+IpfatAny)av_|W3SeTb~m2O|wmuCj&&#d26z`@sacsR7>kVr#?oZ&MJ0-bhF z)A_!icKLf*Q^%PzgZc9Q@Y$%GlV-{U<27Y6Oi2CJB>$cNftFi4bKy<{kQBuc^(i&+ zM5A8R0i+fat^#_Wc|j?C>F0eSu7ojIlhWp09k}`%|CX@sbrh63f_22D!F>#^%YHn!N=n2x~Flz= zScSA9`FCc(zWxk`slC~59~|!VdW(K63R`0L-A2(aEBF(y2LwW5J^_Exa}t{>L<=CxBJC3PU~?j@e~^!vpCvvAd}9h>*~7(Lxbu5AkCXElf+2 z`9fh1t;&6j>ZSyXq(y?{7jpy6x@1@dJl{Xk?!o*(Co7Lnr1o+00t}l#QL1gXwnQWA zcS2vlx7FMX5Z%D9lmuxOda?O704X?`m%$oBcf0g~XF3wG8+4CnbLxU3Fc}-pO=VA3 zX1sga<*c2+$y(-^xhqapJtEnz$D*?nJ*uR z?CP^r;UGL~T7}&p49lSW11(LK1 zL;~I<07`x?Q@QRY?z`3EYziJyrTG!BQ8mHM08b@OfZ~GawB!rNrdpo`Fgoh^^Y%$e zVGTrvEby$~;Bt;glJMqh6|e7(qvqDZyH;9w(7VOm@i8E^G6l4yDnWD_H0Ifrf5(2l z*M?@4%v`stQ18}|Y0#M8d^KCNh0|IL#gxw!0z`grm_AM3JYCPEl+)$XifXAd?YTuNMyj!$C5V`)B(pS5}5=9leOQhGf{cD}v($e~_p zf5WR8^loil4hcKE=WI<=h^C`tb+Dlwb1w?FJA#Hg+cz1ced1pX+Dm)keok32Zffap3!tZPAFjo_|JqUp_E)=|d_CA_g0Ng-(Fx$@vH$6k8U*|y3Dd- zdl-Lv>#b%e87@o1(qj`5MB!5OCs`zbK75&PLCG7(w}nN8%7@y@A{%CAGq-`h92Zf_ zOd$HG3=kDUdvg4owOk~$S|j!PwckYPq$kZc7=gU|trm$w z8f?9XFlntGX31145bT=YTieV((m|J^F-IYoqU&MtZrv+6sXNYN>Q zcd%Q_PJGy6e4&kGZ4@ifPIX8Timj#80dWqLSPlL<$k1Kk}& zYC|nTcWuaJzX;B1B^kO7=7C%z%mvGZ(9$8;zu8s9q9;RL#cN923%k z4^-p&*bOddg;4$kYVLr5+78Ewk89M5 z0+V{X{JkNEVjl|6jusRTxi*y4ZG=5Gufto#QD_21|8FR$PJQ4{IS}_Z&RwpBdh^Q& zAS~M4|06Z+x3?~sE&pI;b+FppaqMU7V#tcqoCsN=~ zSDHq75f(19z)g9>CP3No52iWgKiAFljfaxm2PHMva^PvRBbm89ugA@fWLvUl?;>;^ z55lx>V!chXYO^0h^+K3!`fmrSSC}gks)j^QfA^X-CV9^J9H z`sCKqn4&b*r@nR#%5x}pxGp*WeldJH^|+LRn}P?h!I#>@mjV}9&~Nkr;t$0NY*0zB t%G9GN8cF%`p&jz*(B_*89L9NJYdy%B{{%!t5fuOc literal 0 HcmV?d00001 From 8465d61d3115d412bd80b9728d7b87b8f3138409 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Sun, 11 Dec 2022 18:52:59 +0000 Subject: [PATCH 08/30] made icon transparent, fixed screenshot filename --- apps/lato/icon.js | 2 +- apps/lato/screenshot1..png | Bin 2666 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 apps/lato/screenshot1..png diff --git a/apps/lato/icon.js b/apps/lato/icon.js index 345458d53..746f010dc 100644 --- a/apps/lato/icon.js +++ b/apps/lato/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwkA/4A/AH4AUiIAKCxXzC5c/C5PyC5cvC8PxC5cfLxNEABhgI+gXNp4X3//+9wAK96PJC6/zC5bvKC6//C5YWKC4nUoMUpoXS8lDn/zmlOC6NCA4ckC6Hkl4HD+QwCC5c+LoIsCoSKBMIPjC5tD//0olEp//mgXNmMRiYuBC4JjBBAYAK+MRj//CwIABBAgXkI5AXOiRyBC4J8BkIXN+dEoKnFiNEAYIXNa4sUC59EJAIACkIHBC5iMCoMTn/zmIuBSQIXODAMRAAKqDABikCAAqqBC8i8CAArCBC/n0C49PC5oA/AH4AIA==")) +require("heatshrink").decompress(atob("mEw4UA///1NygH+zn/Jf4AJgdVAAnABZ8BBYtABbc1BYtcBYcVBYtUBbcC1QAEwALPgYLFQYoLWgAHBytWAYK0F1Wpv/9tQLH0v//9aBY+XBYPWBY3qz/1r/21YLGv/Vq/9BY3Vv6NB/tXBaMVBYamEBZ1fHYP1BY01r5TB+ruEBYVXNYPVBY9VBYNVBY0FqoiBqtQBY4ACBb0NBYdwBbsBBYdABYoA/AAg=")) diff --git a/apps/lato/screenshot1..png b/apps/lato/screenshot1..png deleted file mode 100644 index 14c8d6d048afce0b1540cc32e155886a022fd675..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2666 zcmc&$=~vPT7yd!uLhhy&naiN0sih*8iHwqhrnzsSiA@%YqBd6UiPkjZB<7a5Vs5=P zhT@)y$=hOk|ad@)u+JFO~ zGM5ZRCmtFft~pHF%{_+&t1Ans_e$*~@Vkd*wRG z2>HHQGRw!AjTlr;DTH|(5$bXc=iU;w7YBd+fs**#)`%r9@bVf&f&GE!Cx6waC02Q2 zi+75$DkkN+Uck$@M;<_i;(At*W=GhDG-7y<@zwUku2}&@ecZe!Fb;Y2u>IRo?TLo6 z=avcKB=lS-+&qCC@nsZqAuAUr-Ve$FH@H=`25N=)4qi|axiLoy=sH}S(rT8;JYN|7d2cI8vzkz-FOsD#)*|A0Z z;An$b%^9+`L@hA&46*2etwyHTu|#O#XVRZUva_fr)G~>1WPUDoG>18Dh~`e8wOX$= zi@Q9a4wZ@+L!OZqzGFR~qvHgzj|bJCACeSg-CW*VK~$}NieIn}y&^xBKXdDZs*7H} zDEZj%Aa=hXDMOlg3Ln+w_`Lp2C2e<59?0$UQuN3Xx1>DllcjKwy6c?~cU^9xTXyML z$Jz=2ggo>}MU(qz^!1dq(Lp;F0CF0~BAsb(tSGxJd|5S)0Xs^#>08mErPBM3 zPtU^G9-M47w*V@AU)0NL?=*zD&wzXTy)P@N^dQaYSqUSzC;!mR5-Apwg9vZayZ6vB zukay^t5Ki>hQu>+hRgoHw;vYAv6?MGcyt|u^9hcOw4zy9T$wo*ErK?wJR1zsyFG2e z?YNH{P~zisLadqJ$ng#lCC-Q6$b<*&BY5lpn36>&%OOi>AOFRA4hqvfvDdd+u@0*v^m62ri-NY!*^$$1@_puyu&4V@$7^Mc|I%Z3$hu#|N4)xK zWJMVR2S6}^%bFiGZ&23nUytf7_akm=x2U|9z9T!HyncX|F`oMPAXIT_zD5FMUaHzP zzqw+{**3oUJI%S6X`zsE(UWBJg7vE{GRDS|*E#_Un9?l)X_tP=-@=pbr>}638iM(j zamawvtq_Vp-j=}8sSw9Gpe8<(DlfF_Ei1re7F?%_ zW>R}HfgJ~YHlL_~UUfy|!&JcrTMuqcPde=>{%w&$v#iIc^E-ksfJ)j45N>y@5?`=^ ze)78hBbR)kMJeF8fLDX7* zQi87{S0KKQ&d@^S2^q2ObU*6xT|&KeQ876 znXLFNOsp*6Z<)|fkh0Mg%eli28`hS;c^BRhj5b&_F?N$|An~KXP^xVrsHMw zex?h&cq6%)t>p|+v*-Knnr|2*{?L9 zbO9fk9;W2tLb*cz@Y*uEqAR_NAWrdX>xX=6UCS<|d`tD-+RqLlo{E1pR<(8&>IUeQ);Nvt-lj6Ah+eUk;olM~?7 z8INA?ix$1d?>+8+3nyeN;!QFYJzNaC4p_mopf; zmwgpG0IO`CX4f7b&u#hdX5BDq0;k#gz4>zeCt^pipqgt8DElYodf8}l^*zXrC}<;e zE#_7Gd`Nreg4%A;g}%$U8JI#qr2V{+8wjlS$n0X?t^&W;sd!HA-RBXow{^0q!UZJ%4PfNx A&j0`b From ad9ea67cba4aef8d5f234ee6537d4744dd50cdd5 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Sun, 11 Dec 2022 19:11:36 +0000 Subject: [PATCH 09/30] fixed whitespace --- apps/clkinfofw/clkinfo.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/clkinfofw/clkinfo.js b/apps/clkinfofw/clkinfo.js index 4ca05e8d1..9815ca87f 100644 --- a/apps/clkinfofw/clkinfo.js +++ b/apps/clkinfofw/clkinfo.js @@ -6,8 +6,8 @@ get : () => { let d = new Date(); let g = Graphics.createArrayBuffer(24,24,1,{msb:true}); - g.drawImage(atob("GBjC////AADve773VWmmmmlVVW22nnlVVbLL445VVwAAAADVWAAAAAAlrAAAAAA6sAAAAAAOWAAAAAAlrAD//wA6sANVVcAOWANVVcAlrANVVcA6rANVVcA6WANVVcAlsANVVcAOrAD//wA6WAAAAAAlsAAAAAAOrAAAAAA6WAAAAAAlVwAAAADVVbLL445VVW22nnlVVWmmmmlV"),1,0); - return { + g.drawImage(atob("GBjC////AADve773VWmmmmlVVW22nnlVVbLL445VVwAAAADVWAAAAAAlrAAAAAA6sAAAAAAOWAAAAAAlrAD//wA6sANVVcAOWANVVcAlrANVVcA6rANVVcA6WANVVcAlsANVVcAOrAD//wA6WAAAAAAlsAAAAAAOrAAAAAA6WAAAAAAlVwAAAADVVbLL445VVW22nnlVVWmmmmlV"),1,0); + return { text : process.env.VERSION, img : g.asImage("string") }; From 0a0c6f8d23b21ab41ce7c9bc76e000fdd9f1cdf4 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Sun, 11 Dec 2022 19:13:36 +0000 Subject: [PATCH 10/30] Lato, fixed screenshot filename --- apps/lato/screenshot1.png | Bin 0 -> 2666 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/lato/screenshot1.png diff --git a/apps/lato/screenshot1.png b/apps/lato/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..14c8d6d048afce0b1540cc32e155886a022fd675 GIT binary patch literal 2666 zcmc&$=~vPT7yd!uLhhy&naiN0sih*8iHwqhrnzsSiA@%YqBd6UiPkjZB<7a5Vs5=P zhT@)y$=hOk|ad@)u+JFO~ zGM5ZRCmtFft~pHF%{_+&t1Ans_e$*~@Vkd*wRG z2>HHQGRw!AjTlr;DTH|(5$bXc=iU;w7YBd+fs**#)`%r9@bVf&f&GE!Cx6waC02Q2 zi+75$DkkN+Uck$@M;<_i;(At*W=GhDG-7y<@zwUku2}&@ecZe!Fb;Y2u>IRo?TLo6 z=avcKB=lS-+&qCC@nsZqAuAUr-Ve$FH@H=`25N=)4qi|axiLoy=sH}S(rT8;JYN|7d2cI8vzkz-FOsD#)*|A0Z z;An$b%^9+`L@hA&46*2etwyHTu|#O#XVRZUva_fr)G~>1WPUDoG>18Dh~`e8wOX$= zi@Q9a4wZ@+L!OZqzGFR~qvHgzj|bJCACeSg-CW*VK~$}NieIn}y&^xBKXdDZs*7H} zDEZj%Aa=hXDMOlg3Ln+w_`Lp2C2e<59?0$UQuN3Xx1>DllcjKwy6c?~cU^9xTXyML z$Jz=2ggo>}MU(qz^!1dq(Lp;F0CF0~BAsb(tSGxJd|5S)0Xs^#>08mErPBM3 zPtU^G9-M47w*V@AU)0NL?=*zD&wzXTy)P@N^dQaYSqUSzC;!mR5-Apwg9vZayZ6vB zukay^t5Ki>hQu>+hRgoHw;vYAv6?MGcyt|u^9hcOw4zy9T$wo*ErK?wJR1zsyFG2e z?YNH{P~zisLadqJ$ng#lCC-Q6$b<*&BY5lpn36>&%OOi>AOFRA4hqvfvDdd+u@0*v^m62ri-NY!*^$$1@_puyu&4V@$7^Mc|I%Z3$hu#|N4)xK zWJMVR2S6}^%bFiGZ&23nUytf7_akm=x2U|9z9T!HyncX|F`oMPAXIT_zD5FMUaHzP zzqw+{**3oUJI%S6X`zsE(UWBJg7vE{GRDS|*E#_Un9?l)X_tP=-@=pbr>}638iM(j zamawvtq_Vp-j=}8sSw9Gpe8<(DlfF_Ei1re7F?%_ zW>R}HfgJ~YHlL_~UUfy|!&JcrTMuqcPde=>{%w&$v#iIc^E-ksfJ)j45N>y@5?`=^ ze)78hBbR)kMJeF8fLDX7* zQi87{S0KKQ&d@^S2^q2ObU*6xT|&KeQ876 znXLFNOsp*6Z<)|fkh0Mg%eli28`hS;c^BRhj5b&_F?N$|An~KXP^xVrsHMw zex?h&cq6%)t>p|+v*-Knnr|2*{?L9 zbO9fk9;W2tLb*cz@Y*uEqAR_NAWrdX>xX=6UCS<|d`tD-+RqLlo{E1pR<(8&>IUeQ);Nvt-lj6Ah+eUk;olM~?7 z8INA?ix$1d?>+8+3nyeN;!QFYJzNaC4p_mopf; zmwgpG0IO`CX4f7b&u#hdX5BDq0;k#gz4>zeCt^pipqgt8DElYodf8}l^*zXrC}<;e zE#_7Gd`Nreg4%A;g}%$U8JI#qr2V{+8wjlS$n0X?t^&W;sd!HA-RBXow{^0q!UZJ%4PfNx A&j0`b literal 0 HcmV?d00001 From 90b68051c57fafe6f245f133d5ff2956bf0a6ad4 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sun, 11 Dec 2022 22:09:16 +0100 Subject: [PATCH 11/30] astrocalc - Compatibility with Bangle.js 2 - Get location from My Location --- .gitignore | 1 + apps/astrocalc/ChangeLog | 1 + apps/astrocalc/astrocalc-app.js | 107 ++++++-------------------------- apps/astrocalc/metadata.json | 7 ++- modules/suncalc.js | 2 +- 5 files changed, 27 insertions(+), 91 deletions(-) diff --git a/.gitignore b/.gitignore index f4588ac6f..7687a770a 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ _site .owncloudsync.log Desktop.ini .sync_*.db* +*.swp diff --git a/apps/astrocalc/ChangeLog b/apps/astrocalc/ChangeLog index 746ab2162..11b2d7177 100644 --- a/apps/astrocalc/ChangeLog +++ b/apps/astrocalc/ChangeLog @@ -1,3 +1,4 @@ 0.01: Create astrocalc app 0.02: Store last GPS lock, can be used instead of waiting for new GPS on start 0.03: Use 'modules/suncalc.js' to avoid it being copied 8 times for different apps +0.04: Compatibility with Bangle.js 2, get location from My Location diff --git a/apps/astrocalc/astrocalc-app.js b/apps/astrocalc/astrocalc-app.js index 46fb855ec..3c879779d 100644 --- a/apps/astrocalc/astrocalc-app.js +++ b/apps/astrocalc/astrocalc-app.js @@ -11,8 +11,7 @@ const SunCalc = require("suncalc"); // from modules folder const storage = require("Storage"); -const LAST_GPS_FILE = "astrocalc.gps.json"; -let lastGPS = (storage.readJSON(LAST_GPS_FILE, 1) || null); +const BANGLEJS2 = process.env.HWVERSION == 2; // check for bangle 2 function drawMoon(phase, x, y) { const moonImgFiles = [ @@ -73,7 +72,7 @@ function drawTitle(key) { */ function drawPoint(angle, radius, color) { const pRad = Math.PI / 180; - const faceWidth = 80; // watch face radius + const faceWidth = g.getWidth()/3; // watch face radius const centerPx = g.getWidth() / 2; const a = angle * pRad; @@ -141,6 +140,7 @@ function drawData(title, obj, startX, startY) { function drawMoonPositionPage(gps, title) { const pos = SunCalc.getMoonPosition(new Date(), gps.lat, gps.lon); + const moonColor = g.theme.dark ? {r: 1, g: 1, b: 1} : {r: 0, g: 0, b: 0}; const pageData = { Azimuth: pos.azimuth.toFixed(2), @@ -150,13 +150,13 @@ function drawMoonPositionPage(gps, title) { }; const azimuthDegrees = parseInt(pos.azimuth * 180 / Math.PI); - drawData(title, pageData, null, 80); + drawData(title, pageData, null, g.getHeight()/2 - Object.keys(pageData).length/2*20); drawPoints(); - drawPoint(azimuthDegrees, 8, {r: 1, g: 1, b: 1}); + drawPoint(azimuthDegrees, 8, moonColor); let m = setWatch(() => { let m = moonIndexPageMenu(gps); - }, BTN3, {repeat: false, edge: "falling"}); + }, BANGLEJS2 ? BTN : BTN3, {repeat: false, edge: "falling"}); } function drawMoonIlluminationPage(gps, title) { @@ -166,43 +166,45 @@ function drawMoonIlluminationPage(gps, title) { ]; const phase = SunCalc.getMoonIllumination(new Date()); + const phaseIdx = Math.round(phase.phase*8), const pageData = { - Phase: phaseNames[phase.phase], + Phase: phaseNames[phaseIdx], }; drawData(title, pageData, null, 35); - drawMoon(phase.phase, g.getWidth() / 2, g.getHeight() / 2); + drawMoon(phaseIdx, g.getWidth() / 2, g.getHeight() / 2); let m = setWatch(() => { let m = moonIndexPageMenu(gps); - }, BTN3, {repease: false, edge: "falling"}); + }, BANGLEJS2 ? BTN : BTN3, {repease: false, edge: "falling"}); } function drawMoonTimesPage(gps, title) { const times = SunCalc.getMoonTimes(new Date(), gps.lat, gps.lon); + const moonColor = g.theme.dark ? {r: 1, g: 1, b: 1} : {r: 0, g: 0, b: 0}; const pageData = { Rise: dateToTimeString(times.rise), Set: dateToTimeString(times.set), }; - drawData(title, pageData, null, 105); + drawData(title, pageData, null, g.getHeight()/2 - Object.keys(pageData).length/2*20 + 5); drawPoints(); // Draw the moon rise position const risePos = SunCalc.getMoonPosition(times.rise, gps.lat, gps.lon); const riseAzimuthDegrees = parseInt(risePos.azimuth * 180 / Math.PI); - drawPoint(riseAzimuthDegrees, 8, {r: 1, g: 1, b: 1}); + drawPoint(riseAzimuthDegrees, 8, moonColor); // Draw the moon set position const setPos = SunCalc.getMoonPosition(times.set, gps.lat, gps.lon); const setAzimuthDegrees = parseInt(setPos.azimuth * 180 / Math.PI); - drawPoint(setAzimuthDegrees, 8, {r: 1, g: 1, b: 1}); + drawPoint(setAzimuthDegrees, 8, moonColor); let m = setWatch(() => { let m = moonIndexPageMenu(gps); - }, BTN3, {repease: false, edge: "falling"}); + }, BANGLEJS2 ? BTN : BTN3, {repease: false, edge: "falling"}); } function drawSunShowPage(gps, key, date) { @@ -224,7 +226,7 @@ function drawSunShowPage(gps, key, date) { Degrees: azimuthDegrees }; - drawData(key, pageData, null, 85); + drawData(key, pageData, null, g.getHeight()/2 - Object.keys(pageData).length/2*20 + 5); drawPoints(); @@ -233,7 +235,7 @@ function drawSunShowPage(gps, key, date) { m = setWatch(() => { m = sunIndexPageMenu(gps); - }, BTN3, {repeat: false, edge: "falling"}); + }, BANGLEJS2 ? BTN : BTN3, {repeat: false, edge: "falling"}); return null; } @@ -300,7 +302,7 @@ function indexPageMenu(gps) { "Moon": () => { m = moonIndexPageMenu(gps); }, - "< Exit": () => { load(); } + "< Back": () => { load(); } }; return E.showMenu(menu); @@ -310,78 +312,9 @@ function getCenterStringX(str) { return (g.getWidth() - g.stringWidth(str)) / 2; } -/** - * GPS wait page, shows GPS locating animation until it gets a lock, then moves to the Sun page - */ -function drawGPSWaitPage() { - const img = require("heatshrink").decompress(atob("mEwxH+AH4A/AH4AW43GF1wwsFwYwqFwowoFw4wmFxIwdE5YAPF/4vM5nN6YAE5vMF8YtHGIgvhFpQxKF7AuOGA4vXFyAwGF63MFyIABF6xeWMC4UDLwvNGpAJG5gwSdhIIDRBLyWCIgcJHAgJJDoouQF4vMQoICBBJoeGFx6GGACIfHL6YvaX6gvZeCIdFc4gAFXogvGFxgwFDwovQCAguOGAnMMBxeG5guTGAggGGAwNKFySREcA3N5vM5gDBdpQvXEY4AKXqovGGCKbFF7AwPZQwvZGJgtGF7vGdQItG5gSIF7gASF/44WEzgwRF0wwHF1AwFF1QwDF1gvwAH4A/AFAA==")); - const str1 = "Astrocalc v0.02"; - const str2 = "Locating GPS"; - const str3 = "Please wait..."; - - g.clear(); - g.drawImage(img, 100, 50); - g.setFont("6x8", 1); - g.drawString(str1, getCenterStringX(str1), 105); - g.drawString(str2, getCenterStringX(str2), 140); - g.drawString(str3, getCenterStringX(str3), 155); - - if (lastGPS) { - lastGPS = JSON.parse(lastGPS); - lastGPS.time = new Date(); - - const str4 = "Press Button 3 to use last GPS"; - g.setColor("#d32e29"); - g.fillRect(0, 190, g.getWidth(), 215); - g.setColor("#ffffff"); - g.drawString(str4, getCenterStringX(str4), 200); - - setWatch(() => { - clearWatch(); - Bangle.setGPSPower(0); - m = indexPageMenu(lastGPS); - }, BTN3, {repeat: false}); - } - - g.flip(); - - const DEBUG = false; - if (DEBUG) { - clearWatch(); - - const gps = { - "lat": 56.45783133333, - "lon": -3.02188583333, - "alt": 75.3, - "speed": 0.070376, - "course": NaN, - "time":new Date(), - "satellites": 4, - "fix": 1 - }; - - m = indexPageMenu(gps); - - return; - } - - Bangle.on('GPS', (gps) => { - if (gps.fix === 0) return; - clearWatch(); - - if (isNaN(gps.course)) gps.course = 0; - require("Storage").writeJSON(LAST_GPS_FILE, JSON.stringify(gps)); - Bangle.setGPSPower(0); - Bangle.buzz(); - Bangle.setLCDPower(true); - - m = indexPageMenu(gps); - }); -} - function init() { - Bangle.setGPSPower(1); - drawGPSWaitPage(); + let location = require("Storage").readJSON("mylocation.json",1)||{"lat":51.5072,"lon":0.1276,"location":"London"}; + indexPageMenu(location); } let m; diff --git a/apps/astrocalc/metadata.json b/apps/astrocalc/metadata.json index d77474700..1f238be12 100644 --- a/apps/astrocalc/metadata.json +++ b/apps/astrocalc/metadata.json @@ -1,12 +1,13 @@ { "id": "astrocalc", "name": "Astrocalc", - "version": "0.03", + "version": "0.04", "description": "Calculates interesting information on the sun and moon cycles for the current day based on your location.", "icon": "astrocalc.png", - "tags": "app,sun,moon,cycles,tool,outdoors", - "supports": ["BANGLEJS"], + "tags": "app,sun,moon,cycles,tool", + "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, + "dependencies": {"mylocation":"app"}, "storage": [ {"name":"astrocalc.app.js","url":"astrocalc-app.js"}, {"name":"astrocalc.img","url":"astrocalc-icon.js","evaluate":true}, diff --git a/modules/suncalc.js b/modules/suncalc.js index 0c22c6cb2..fe17148e1 100644 --- a/modules/suncalc.js +++ b/modules/suncalc.js @@ -279,7 +279,7 @@ function hoursLater(date, h) { // calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article SunCalc.getMoonTimes = function (date, lat, lng, inUTC) { - var t = new Date(date); + var t = typeof(date) === "object" ? date : new Date(date); if (inUTC) t.setUTCHours(0, 0, 0, 0); else t.setHours(0, 0, 0, 0); From 340fc0667831bf058d2023615f8d39ba0c23d8c1 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sun, 11 Dec 2022 22:16:39 +0100 Subject: [PATCH 12/30] astrocalc fix typo --- apps/astrocalc/astrocalc-app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/astrocalc/astrocalc-app.js b/apps/astrocalc/astrocalc-app.js index 3c879779d..7b41ad136 100644 --- a/apps/astrocalc/astrocalc-app.js +++ b/apps/astrocalc/astrocalc-app.js @@ -166,7 +166,7 @@ function drawMoonIlluminationPage(gps, title) { ]; const phase = SunCalc.getMoonIllumination(new Date()); - const phaseIdx = Math.round(phase.phase*8), + const phaseIdx = Math.round(phase.phase*8); const pageData = { Phase: phaseNames[phaseIdx], }; From f6ee8333c46ec812fb9291f8f577bb152ed73ee4 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sun, 11 Dec 2022 22:36:31 +0100 Subject: [PATCH 13/30] astrocalc translations --- apps/astrocalc/astrocalc-app.js | 16 ++++++++-------- lang/de_DE.json | 10 +++++++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/apps/astrocalc/astrocalc-app.js b/apps/astrocalc/astrocalc-app.js index 7b41ad136..6629842cf 100644 --- a/apps/astrocalc/astrocalc-app.js +++ b/apps/astrocalc/astrocalc-app.js @@ -161,8 +161,8 @@ function drawMoonPositionPage(gps, title) { function drawMoonIlluminationPage(gps, title) { const phaseNames = [ - "New Moon", "Waxing Crescent", "First Quarter", "Waxing Gibbous", - "Full Moon", "Waning Gibbous", "Last Quater", "Waning Crescent", + /*LANG*/"New Moon", /*LANG*/"Waxing Crescent", /*LANG*/"First Quarter", /*LANG*/"Waxing Gibbous", + /*LANG*/"Full Moon", /*LANG*/"Waning Gibbous", /*LANG*/"Last Quater", /*LANG*/"Waning Crescent", ]; const phase = SunCalc.getMoonIllumination(new Date()); @@ -275,15 +275,15 @@ function moonIndexPageMenu(gps) { }, "Times": () => { m = E.showMenu(); - drawMoonTimesPage(gps, "Times"); + drawMoonTimesPage(gps, /*LANG*/"Times"); }, "Position": () => { m = E.showMenu(); - drawMoonPositionPage(gps, "Position"); + drawMoonPositionPage(gps, /*LANG*/"Position"); }, "Illumination": () => { m = E.showMenu(); - drawMoonIlluminationPage(gps, "Illumination"); + drawMoonIlluminationPage(gps, /*LANG*/"Illumination"); }, "< Back": () => m = indexPageMenu(gps), }; @@ -294,12 +294,12 @@ function moonIndexPageMenu(gps) { function indexPageMenu(gps) { const menu = { "": { - "title": "Select", + "title": /*LANG*/"Select", }, - "Sun": () => { + /*LANG*/"Sun": () => { m = sunIndexPageMenu(gps); }, - "Moon": () => { + /*LANG*/"Moon": () => { m = moonIndexPageMenu(gps); }, "< Back": () => { load(); } diff --git a/lang/de_DE.json b/lang/de_DE.json index 84f29a6c2..5ae7e449f 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -193,7 +193,15 @@ "cyan": "Cyan", "orange": "Orange", "purple": "Violett", - "grey": "Grau" + "grey": "Grau", + "New Moon": "Neumond", + "Waxing Crescent": "Zunehmender Sichelmond ", + "First Quarter": "Zunehmender Halbmond", + "Waxing Gibbous": "Zunehmender Mond", + "Full Moon": "Vollmond,", + "Waning Gibbous": "Abnehmender Mond", + "Last Quater": "Abnehmender Halbmond", + "Waning Crescent": "Abnehmender Sichelmond" }, "alarm": { "//": "App-specific overrides", From 5fe0a7ad6a2c2158f4a42a099a9bd8c4a3deb1cc Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Mon, 12 Dec 2022 07:37:36 +0100 Subject: [PATCH 14/30] astrocalc: Update description --- apps/astrocalc/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/astrocalc/metadata.json b/apps/astrocalc/metadata.json index 1f238be12..653c097da 100644 --- a/apps/astrocalc/metadata.json +++ b/apps/astrocalc/metadata.json @@ -2,7 +2,7 @@ "id": "astrocalc", "name": "Astrocalc", "version": "0.04", - "description": "Calculates interesting information on the sun and moon cycles for the current day based on your location.", + "description": "Calculates interesting information on the sun like sunset and sunrise and moon cycles for the current day based on your location from MyLocation app", "icon": "astrocalc.png", "tags": "app,sun,moon,cycles,tool", "supports": ["BANGLEJS", "BANGLEJS2"], From 214a018843f08d3bb8da00ffba5f231ab5bdea3a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 12 Dec 2022 09:01:00 +0000 Subject: [PATCH 15/30] update shortnames --- apps/health/metadata.json | 1 + apps/simplestpp/metadata.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/health/metadata.json b/apps/health/metadata.json index d4eab1f38..12f6b617f 100644 --- a/apps/health/metadata.json +++ b/apps/health/metadata.json @@ -1,6 +1,7 @@ { "id": "health", "name": "Health Tracking", + "shortName": "Health", "version": "0.17", "description": "Logs health data and provides an app to view it", "icon": "app.png", diff --git a/apps/simplestpp/metadata.json b/apps/simplestpp/metadata.json index cf7648d85..d808b132b 100644 --- a/apps/simplestpp/metadata.json +++ b/apps/simplestpp/metadata.json @@ -1,6 +1,7 @@ { "id": "simplestpp", - "name": "Simplest++", + "name": "Simplest++ Clock", + "shortName": "Simplest++", "version": "0.01", "description": "The simplest working clock, with fast load and clock_info, acts as a tutorial piece", "readme": "README.md", From 6a434f35ccf3aa8fa2254c221dab731e238c426a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 12 Dec 2022 11:32:20 +0000 Subject: [PATCH 16/30] 0.03: Fix icons broken in 0v02 (#2386) + Store all icons in a separate binary file (much faster lookup) --- apps/messageicons/icons.img | Bin 0 -> 5168 bytes apps/messageicons/icons/bibel.png | Bin 0 -> 204 bytes apps/messageicons/icons/bring.png | Bin 0 -> 210 bytes apps/messageicons/icons/default.png | Bin 0 -> 207 bytes apps/messageicons/icons/etar.png | Bin 0 -> 182 bytes apps/messageicons/icons/generate.js | 143 +++++++++++++++++++++ apps/messageicons/icons/gmx.png | Bin 0 -> 227 bytes apps/messageicons/icons/home assistant.png | Bin 0 -> 269 bytes apps/messageicons/icons/icon_names.json | 111 ++++++++++++++++ apps/messageicons/icons/kalender.png | Bin 0 -> 249 bytes apps/messageicons/icons/music.png | Bin 0 -> 209 bytes apps/messageicons/icons/n26.png | Bin 0 -> 188 bytes apps/messageicons/icons/nextbike.png | Bin 0 -> 228 bytes apps/messageicons/icons/nina.png | Bin 0 -> 261 bytes apps/messageicons/icons/warnapp.png | Bin 0 -> 247 bytes apps/messageicons/icons/wordfeud.png | Bin 0 -> 213 bytes apps/messageicons/lib.js | 80 +----------- apps/messageicons/metadata.json | 5 +- 18 files changed, 262 insertions(+), 77 deletions(-) create mode 100644 apps/messageicons/icons.img create mode 100644 apps/messageicons/icons/bibel.png create mode 100644 apps/messageicons/icons/bring.png create mode 100644 apps/messageicons/icons/default.png create mode 100644 apps/messageicons/icons/etar.png create mode 100755 apps/messageicons/icons/generate.js create mode 100644 apps/messageicons/icons/gmx.png create mode 100644 apps/messageicons/icons/home assistant.png create mode 100644 apps/messageicons/icons/icon_names.json create mode 100644 apps/messageicons/icons/kalender.png create mode 100644 apps/messageicons/icons/music.png create mode 100644 apps/messageicons/icons/n26.png create mode 100644 apps/messageicons/icons/nextbike.png create mode 100644 apps/messageicons/icons/nina.png create mode 100644 apps/messageicons/icons/warnapp.png create mode 100644 apps/messageicons/icons/wordfeud.png diff --git a/apps/messageicons/icons.img b/apps/messageicons/icons.img new file mode 100644 index 0000000000000000000000000000000000000000..104168357f754ea3bd419eb544afd41ea7d297f9 GIT binary patch literal 5168 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 Cl2Dxh literal 0 HcmV?d00001 diff --git a/apps/messageicons/icons/bring.png b/apps/messageicons/icons/bring.png new file mode 100644 index 0000000000000000000000000000000000000000..673d1b7be024acf0f943766bca951af24b0536a4 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|dOTemLp;3S zP7UO1FyL^0`mg<1f|Jp6x78=)>t@dQx-lpqB((pKyHvxSr8+_r+xc!=NhLJ#eJW=Y zVhWqOUZ>L`nn6470Nb4$`Ppyf>o%WgefDn&L$S*Jb1Xg=Bkt-&u9U9eS$ty|W5)d{ z%!?A6Z5^)G&r7jBv4(rghZVWIcC{Xy_#-sszfmB^DP1c@=QGQ9sunD$0=kRA)78&q Iol`;+0E%=`3jhEB literal 0 HcmV?d00001 diff --git a/apps/messageicons/icons/default.png b/apps/messageicons/icons/default.png new file mode 100644 index 0000000000000000000000000000000000000000..1f85079df4e48ecf3280039a267fb380a4a05afc GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Iz3$+Lp;3S zPQA$2pupk!_`m%ux7mKaJCv?XJFPC?z$_k+lx8PqvxUE*V;a}gDeG0DST%1~F{%`( zv1w~QK4Hu3GGAlK*Zqu26XJ?u5Ae9Gj$y4(n6^eOfu*U6jZut+)qmerk<8i4Y{N71 z+q62?eCKa?m8&xGN|zhotBVqQe#=*E{(PhU|7CkdEA~S>JyuMx13HSq)78&qol`;+ E00LS_)Bpeg literal 0 HcmV?d00001 diff --git a/apps/messageicons/icons/etar.png b/apps/messageicons/icons/etar.png new file mode 100644 index 0000000000000000000000000000000000000000..24f0cc587b46848dc5c6507bdbfdfcf83d211947 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|3OrpLLp;2b z|NQ^|zn)Es>Da?`MrCDXSH?EEM;eYUD<2w6SB!4D%2f1N_Spf!1V-15XAT^2Fz9HT z&Z_W!(Q>{NJ3TWU5jHjX3pRWgno~_W9*FX7T**A!>Pdz4F-hJhzFx0c_K5N=eJMZt e-@^Ep%nTD6kM6wK-%$&+o59o7&t;ucLK6TUt3VY1 literal 0 HcmV?d00001 diff --git a/apps/messageicons/icons/generate.js b/apps/messageicons/icons/generate.js new file mode 100755 index 000000000..e857032af --- /dev/null +++ b/apps/messageicons/icons/generate.js @@ -0,0 +1,143 @@ +#!/usr/bin/node + +// Creates lib.js from icons +// npm install png-js + +// default icon must come first in icon_names + +var imageconverter = require("../../../webtools/imageconverter.js"); +var icons = JSON.parse(require("fs").readFileSync(__dirname+"/icon_names.json")); +const imgOptions = { + mode : "1bit", + inverted : true, + transparent : true, + output: "raw" +}; +var PNG = require('png-js'); +var IMAGE_BYTES = 76; + +var iconTests = []; +var iconImages = []; // array of converted icons +var iconIndices = {}; // maps filename -> index in iconImages + +var promises = []; + +icons.forEach(icon => { + var index = iconIndices[icon.icon]; + if (index===undefined) { // need a new icon + index = iconImages.length; + iconIndices[icon.icon] = index; + iconImages.push(""); // placeholder + // create image + console.log("Loading "+icon.icon); + var png = new PNG(require("fs").readFileSync(__dirname+"/"+icon.icon)); + if (png.width!=24 || png.height!=24) { + console.warn(icon.icon+" should be 24x24px"); + } + + promises.push(new Promise(r => { + png.decode(function (pixels) { + var rgba = new Uint8Array(pixels); + var isTransparent = false; + for (var i=0;i { + // Yay, more JS. Why is it so hard to get the bytes??? + iconData.set(Array.prototype.slice.call(Buffer.from(img,"binary")), idx*IMAGE_BYTES) + }); + + console.log("Saving images"); + require("fs").writeFileSync(__dirname+"/../icons.img", Buffer.from(iconData,"binary")); + + console.log("Saving library"); + require("fs").writeFileSync(__dirname+"/../lib.js", `exports.getImage = function(msg) { + if (msg.img) return atob(msg.img); + let s = (("string"=== typeof msg) ? msg : (msg.src || "")).toLowerCase(); + if (msg.id=="music") s="music"; + let match = ${JSON.stringify(","+icons.map(icon=>icon.app+"|"+icon.index).join(",")+",")}.match(new RegExp(\`,\${s}\\\\|(\\\\d+)\`)) + return require("Storage").read("messageicons.img", (match===null)?0:match[1]*${IMAGE_BYTES}, ${IMAGE_BYTES}); +}; + +exports.getColor = function(msg,options) { + options = options||{}; + var st = options.settings || require('Storage').readJSON("messages.settings.json", 1) || {}; + if (options.default===undefined) options.default=g.theme.fg; + if (st.iconColorMode == 'mono') return options.default; + 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": "#ff385c", // https://news.airbnb.com/media-assets/category/brand/ + "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": "#5865f2", // https://discord.com/branding + "etar": "#36a18b", + "facebook": "#1877f2", // https://www.facebook.com/brand/resources/facebookapp/logo + "gmail": "#ea4335", + "gmx": "#1c449b", + "google": "#4285F4", + "google home": "#fbbc05", +// "home assistant": "#41bdf5", // ha-blue is #41bdf5, but that's the background + "instagram": "#ff0069", // https://about.instagram.com/brand/gradient + "lieferando": "#ff8000", + "linkedin": "#0a66c2", // https://brand.linkedin.com/ + "messenger": "#0078ff", + "mastodon": "#563acc", // https://www.joinmastodon.org/branding + "mattermost": "#00f", + "n26": "#36a18b", + "nextbike": "#00f", + "newpipe": "#f00", + "nina": "#e57004", + "opentasks": "#409f8f", + "outlook mail": "#0078d4", // https://developer.microsoft.com/en-us/fluentui#/styles/web/colors/products + "paypal": "#003087", + "pocket": "#ef4154f", // https://blog.getpocket.com/press/ + "post & dhl": "#f2c101", + "reddit": "#ff4500", // https://www.redditinc.com/brand + "signal": "#3a76f0", // https://github.com/signalapp/Signal-Desktop/blob/main/images/signal-logo.svg + "skype": "#0078d4", // https://developer.microsoft.com/en-us/fluentui#/styles/web/colors/products + "slack": "#e51670", + "snapchat": "#ff0", + "steam": "#171a21", + "teams": "#6264a7", // https://developer.microsoft.com/en-us/fluentui#/styles/web/colors/products + "telegram": "#0088cc", + "telegram foss": "#0088cc", + "to do": "#3999e5", + "twitch": "#9146ff", // https://brand.twitch.tv/ + "twitter": "#1d9bf0", // https://about.twitter.com/en/who-we-are/brand-toolkit + "vlc": "#ff8800", + "whatsapp": "#4fce5d", + "wordfeud": "#e7d3c7", + "youtube": "#f00", // https://www.youtube.com/howyoutubeworks/resources/brand-resources/#logos-icons-and-colors + }[s]||options.default; +}; + `); +}); diff --git a/apps/messageicons/icons/gmx.png b/apps/messageicons/icons/gmx.png new file mode 100644 index 0000000000000000000000000000000000000000..185c90aa3195fcaeebc433838e2badfaac39fb6c GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|=6bp~hIn|t z4RPdaFyLtZZ!gs>cuA2Z_L1JX+0sjw@7q; z5|8bQCSC)R_nY2{I)Px#$4Nv%R7gv`mD>`4AP7X`|3BKsCLBaAOOEwcLmYu+rPf-z4nBkei0C;+^*j)O zlXIaJND9!&tB?@jC9gnSK$cuWWUOwV39yp$j~O@xc*&)TB1i~`2D%MEOGo2)M$Zg9 zom<1pzUgJ`>p59P@1fNWJ!CIVOL(ZrOR6mbjhkB3UqUSt4G-#Zi&9>nvb<`kKpJc2 zInlm^6(A7QqrwV2&-t`ysJ_uSxJ8TX#6Yc!(6tKmWN6&~6`Z>F(<^fqd>n8C0C)1a TN$tt&00000NkvXXu0mjfXbEl7 literal 0 HcmV?d00001 diff --git a/apps/messageicons/icons/icon_names.json b/apps/messageicons/icons/icon_names.json new file mode 100644 index 000000000..0085731cc --- /dev/null +++ b/apps/messageicons/icons/icon_names.json @@ -0,0 +1,111 @@ +[ + { "app":"default", "icon":"default.png" }, + { "app":"airbnb", "icon":"airbnb.png" }, + { "app":"alarm", "icon":"alarm.png" }, + { "app":"alarmclockreceiver", "icon":"alarm.png" }, + { "app":"amazon shopping", "icon":"amazon.png" }, + { "app":"bibel", "icon":"bibel.png" }, + { "app":"bitwarden", "icon":"security.png" }, + { "app":"1password", "icon":"security.png" }, + { "app":"lastpass", "icon":"security.png" }, + { "app":"dashlane", "icon":"security.png" }, + { "app":"bring", "icon":"bring.png" }, + { "app":"calendar", "icon":"etar.png" }, + { "app":"etar", "icon":"etar.png" }, + { "app":"chat", "icon":"google chat.png" }, + { "app":"chrome", "icon":"chrome.png" }, + { "app":"corona-warn", "icon":"coronavirus.png" }, + { "app":"bmo", "icon":"bank.png" }, + { "app":"desjardins", "icon":"bank.png" }, + { "app":"rbc mobile", "icon":"bank.png" }, + { "app":"nbc", "icon":"bank.png" }, + { "app":"rabobank", "icon":"bank.png" }, + { "app":"scotiabank", "icon":"bank.png" }, + { "app":"td (canada)", "icon":"bank.png" }, + { "app":"discord", "icon":"discord.png" }, + { "app":"drive", "icon":"google drive.png" }, + { "app":"element", "icon":"matrix element.png" }, + { "app":"facebook", "icon":"facebook.png" }, + { "app":"messenger", "icon":"facebook messenger.png" }, + { "app":"firefox", "icon":"firefox.png" }, + { "app":"firefox beta", "icon":"firefox.png" }, + { "app":"firefox nightly", "icon":"firefox.png" }, + { "app":"f-droid", "icon":"security.png" }, + { "app":"neo store", "icon":"security.png" }, + { "app":"aurora droid", "icon":"security.png" }, + { "app":"github", "icon":"github.png" }, + { "app":"gitlab", "icon":"gitlab.png" }, + { "app":"gmx", "icon":"gmx.png" }, + { "app":"google", "icon":"google.png" }, + { "app":"google home", "icon":"google home.png" }, + { "app":"google play store", "icon":"google play store.png" }, + { "app":"home assistant", "icon":"home assistant.png" }, + { "app":"instagram", "icon":"instagram.png" }, + { "app":"kalender", "icon":"kalender.png" }, + { "app":"keep notes", "icon":"google keep.png" }, + { "app":"lieferando", "icon":"lieferando.png" }, + { "app":"linkedin", "icon":"linkedin.png" }, + { "app":"maps", "icon":"map.png" }, + { "app":"organic maps", "icon":"map.png" }, + { "app":"osmand", "icon":"map.png" }, + { "app":"mastodon", "icon":"mastodon.png" }, + { "app":"fedilab", "icon":"mastodon.png" }, + { "app":"tooot", "icon":"mastodon.png" }, + { "app":"tusky", "icon":"mastodon.png" }, + { "app":"mattermost", "icon":"mattermost.png" }, + { "app":"n26", "icon":"n26.png" }, + { "app":"netflix", "icon":"netflix.png" }, + { "app":"news", "icon":"news.png" }, + { "app":"cbc news", "icon":"news.png" }, + { "app":"rc info", "icon":"news.png" }, + { "app":"reuters", "icon":"news.png" }, + { "app":"ap news", "icon":"news.png" }, + { "app":"la presse", "icon":"news.png" }, + { "app":"nbc news", "icon":"news.png" }, + { "app":"nextbike", "icon":"nextbike.png" }, + { "app":"nina", "icon":"nina.png" }, + { "app":"outlook mail", "icon":"outlook.png" }, + { "app":"paypal", "icon":"paypal.png" }, + { "app":"phone", "icon":"phone.png" }, + { "app":"plex", "icon":"plex.png" }, + { "app":"pocket", "icon":"pocket.png" }, + { "app":"post & dhl", "icon":"delivery.png" }, + { "app":"proton mail", "icon":"protonmail.png" }, + { "app":"reddit", "icon":"reddit.png" }, + { "app":"sync pro", "icon":"reddit.png" }, + { "app":"sync dev", "icon":"reddit.png" }, + { "app":"boost", "icon":"reddit.png" }, + { "app":"infinity", "icon":"reddit.png" }, + { "app":"slide", "icon":"reddit.png" }, + { "app":"signal", "icon":"signal.png" }, + { "app":"skype", "icon":"skype.png" }, + { "app":"slack", "icon":"slack.png" }, + { "app":"snapchat", "icon":"snapchat.png" }, + { "app":"starbucks", "icon":"cafe.png" }, + { "app":"steam", "icon":"steam.png" }, + { "app":"teams", "icon":"teams.png" }, + { "app":"telegram", "icon":"telegram.png" }, + { "app":"telegram foss", "icon":"telegram.png" }, + { "app":"threema", "icon":"threema.png" }, + { "app":"tiktok", "icon":"tiktok.png" }, + { "app":"to do", "icon":"task.png" }, + { "app":"opentasks", "icon":"task.png" }, + { "app":"tasks", "icon":"task.png" }, + { "app":"transit", "icon":"transit.png" }, + { "app":"twitch", "icon":"twitch.png" }, + { "app":"twitter", "icon":"twitter.png" }, + { "app":"uber", "icon":"taxi.png" }, + { "app":"lyft", "icon":"taxi.png" }, + { "app":"vlc", "icon":"vlc.png" }, + { "app":"warnapp", "icon":"warnapp.png" }, + { "app":"whatsapp", "icon":"whatsapp.png" }, + { "app":"wordfeud", "icon":"wordfeud.png" }, + { "app":"youtube", "icon":"youtube.png" }, + { "app":"newpipe", "icon":"youtube.png" }, + { "app":"zoom", "icon":"videoconf.png" }, + { "app":"meet", "icon":"videoconf.png" }, + { "app":"music", "icon":"music.png" }, + { "app":"sms message", "icon":"default.png" }, + { "app":"mail", "icon":"default.png" }, + { "app":"gmail", "icon":"default.png" } +] diff --git a/apps/messageicons/icons/kalender.png b/apps/messageicons/icons/kalender.png new file mode 100644 index 0000000000000000000000000000000000000000..dd807dd9e9241b33e305dc65c4756ff387b0afc3 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Hha1_hIn{i z4RhpcFyNT{-(JdCh{utOd$!cxlU%MD;+->p7Vryts#tsqs679ng~RRR#E6L+Y>BN7 z)*IexI^NjCt+eLI)B|NvrKzu#--x=ithV;xOgk2on8y<8^jzlMf?%CVzsgxA=A`e_ z3Q1B6E?ucsbv&xLa`9B7t*#SiPv=N;dt~@laOKN49h(YoUR)O5dY^GpQcL#Rgx8be x?;cdv`nBE1`t$#Pn{Hn$ee&kR`Xu$6oHDo4Pncbqb^+*o22WQ%mvv4FO#ptQWV!$V literal 0 HcmV?d00001 diff --git a/apps/messageicons/icons/music.png b/apps/messageicons/icons/music.png new file mode 100644 index 0000000000000000000000000000000000000000..62f7acfeef8108ce0f8c7018e3d11a361367301e GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|x;uZ`dLbqk@%!p4}%4DMW@CLJz m!k>Kys@J_wci7(Yfsg;e?43p}b1Q%@VDNPHb6Mw<&;$TQXi9Vd literal 0 HcmV?d00001 diff --git a/apps/messageicons/icons/nextbike.png b/apps/messageicons/icons/nextbike.png new file mode 100644 index 0000000000000000000000000000000000000000..467bed8ac11be9365381c81579f3cc3e89c3d23f GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|=6Sj}hIn|t zo$AeZK!L;M>A&`62V2-Q?QhSxv25MJ=RAv*9SK-OktR~E0tm9u1h?7+FmGS-Y&V)F1g{par2rxbN|L){{El+ ces}@H<{hW^GjqJV3Un!hr>mdKI;Vst0G$h4B>(^b literal 0 HcmV?d00001 diff --git a/apps/messageicons/icons/nina.png b/apps/messageicons/icons/nina.png new file mode 100644 index 0000000000000000000000000000000000000000..2669b640155d5e3b008316621bccd36f5d55e849 GIT binary patch literal 261 zcmV+g0s8)lP)Px#zez+vR7gwBmfH@%AP7U{|3BKrWiE(CE4%u(1bQr>PIAsUJ-7q`L?lJHD6a!V z#cL64{=0yyyGJe>2O6*n^KwrBD?S1vjU_-4s0&RQ1sFN;08scC_1(cJKsU~wNA03& zSgi)&HcFMogLs>S02@5JNvad;qI`b?C_BF69CQw}a1;QW>6qG*u)?AjV3ig)1H^sV6aaYbvsI^x(tCe$k`~J_TYg+ctZ4^(?KA`nAB=s#%WJ`o#tm)|n zkF#b9n^;4qYGp7-s8=37@p?sS_r7 Date: Mon, 12 Dec 2022 11:37:19 +0000 Subject: [PATCH 17/30] fix overzealous sanity check --- bin/sanitycheck.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index 6537f4389..838f99895 100644 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -245,7 +245,7 @@ apps.forEach((app,appIdx) => { if (!STORAGE_KEYS.includes(key)) ERROR(`App ${app.id} file ${file.name} has unknown key ${key}`, {file:appDirRelative+file.url}); } // warn if JS icon is the wrong size - if (file.name == app.id+".img") { + if (file.name == app.id+".img" && file.evaluate) { let icon; let match = fileContents.match(/^\s*E\.toArrayBuffer\(atob\(\"([^"]*)\"\)\)\s*$/); if (match==null) match = fileContents.match(/^\s*atob\(\"([^"]*)\"\)\s*$/); From 66e35d0d64f9ebc4fad5e32cdb57d8158a03806a Mon Sep 17 00:00:00 2001 From: Hank Date: Mon, 12 Dec 2022 17:14:27 +0100 Subject: [PATCH 18/30] 0.30: Another try on the swipe --- apps/hworldclock/ChangeLog | 1 + apps/hworldclock/README.md | 2 + apps/hworldclock/app.js | 151 +++++++++++++++++++++++---------- apps/hworldclock/metadata.json | 2 +- 4 files changed, 112 insertions(+), 44 deletions(-) diff --git a/apps/hworldclock/ChangeLog b/apps/hworldclock/ChangeLog index 13e3fa809..eef39a6ca 100644 --- a/apps/hworldclock/ChangeLog +++ b/apps/hworldclock/ChangeLog @@ -13,3 +13,4 @@ 0.27: BJS2: Changed swipe down to swipe up 0.28: Reverted changes to implementation of 0.25 0.29: Use 'modules/suncalc.js' to avoid it being copied 8 times for different apps +0.30: BJS2: swipe seems to be working now diff --git a/apps/hworldclock/README.md b/apps/hworldclock/README.md index 93780bc2d..905e9987b 100644 --- a/apps/hworldclock/README.md +++ b/apps/hworldclock/README.md @@ -14,6 +14,8 @@ Provide names and the UTC offsets for up to three other timezones in the app sto The clock does not handle summer time / daylight saving time changes automatically. If one of your three locations changes its UTC offset, you can simply change the setting in the app store and update. Currently the clock only supports 24 hour time format for the additional time zones. +BangleJS2: Swipe up to rotate screen. So you can show the time to a friend real quick. + ## Requests Please use [the Espruino Forum](http://forum.espruino.com/microcosms/1424/) if you have feature requests or notice bugs. diff --git a/apps/hworldclock/app.js b/apps/hworldclock/app.js index 6bd30be8e..38afa5572 100644 --- a/apps/hworldclock/app.js +++ b/apps/hworldclock/app.js @@ -7,6 +7,7 @@ var showSunInfo; var colorWhenDark; // ------- Settings file +const BANGLEJS2 = process.env.HWVERSION == 2; const big = g.getWidth()>200; // Font for primary time and date const primaryTimeFontSize = big?6:5; @@ -15,7 +16,7 @@ require("Font5x9Numeric7Seg").add(Graphics); require("FontTeletext10x18Ascii").add(Graphics); // Font for single secondary time -const secondaryTimeFontSize = 4; +const secondaryTimeFontSize = 4; const secondaryTimeZoneFontSize = 2; // Font / columns for multiple secondary times @@ -24,6 +25,7 @@ const xcol1 = 10; const xcol2 = g.getWidth() - xcol1; const font = "6x8"; +let drag; /* TODO: we could totally use 'Layout' here and avoid a whole bunch of hard-coded offsets */ @@ -39,7 +41,7 @@ const yposWorld = big ? 170 : 120; const OFFSET_TIME_ZONE = 0; const OFFSET_HOURS = 1; -var PosInterval = 0; +var PosInterval = 0; var offsets = require("Storage").readJSON("hworldclock.settings.json") || []; @@ -87,7 +89,7 @@ const mockOffsets = { //offsets = mockOffsets.fourOffsets; // should render in columns // END TESTING CODE - + // Load settings function loadMySettings() { @@ -141,9 +143,11 @@ function getCurrentTimeFromOffset(dt, offset) { function updatePos() { coord = require("Storage").readJSON(LOCATION_FILE,1)|| {"lat":0,"lon":0,"location":"-"}; //{"lat":53.3,"lon":10.1,"location":"Pattensen"}; if (coord.lat != 0 && coord.lon != 0) { + //pos = SunCalc.getPosition(Date.now(), coord.lat, coord.lon); times = SunCalc.getTimes(Date.now(), coord.lat, coord.lon); rise = "^" + times.sunrise.toString().split(" ")[4].substr(0,5); set = "v" + times.sunset.toString().split(" ")[4].substr(0,5); + //noonpos = SunCalc.getPosition(times.solarNoon, coord.lat, coord.lon); } else { rise = null; set = null; @@ -177,7 +181,7 @@ function drawSeconds() { //console.log(seconds); if (Bangle.isLocked() && secondsMode != "always") seconds = seconds.slice(0, -1) + ':::'; // we use :: as the font does not have an x //console.log(seconds); - g.drawString(`${seconds}`, xyCenterSeconds, yposTime+14, true); + g.drawString(`${seconds}`, xyCenterSeconds, yposTime+14, true); queueDrawSeconds(); } @@ -194,18 +198,18 @@ function draw() { let time = da[4].split(":"); let hours = time[0], minutes = time[1]; - - + + if (_12hour){ //do 12 hour stuff if (hours > 12) { ampm = "PM"; - hours = hours - 12; - if (hours < 10) hours = doublenum(hours); + hours = hours - 12; + if (hours < 10) hours = doublenum(hours); } else { - ampm = "AM"; - } - } + ampm = "AM"; + } + } //g.setFont(font, primaryTimeFontSize); g.setFont("5x9Numeric7Seg",primaryTimeFontSize); @@ -219,18 +223,18 @@ function draw() { g.setColor(g.theme.fg); } g.drawString(`${hours}:${minutes}`, xyCenter-10, yposTime, true); - + // am / PM ? if (_12hour){ //do 12 hour stuff //let ampm = require("locale").medidian(new Date()); Not working g.setFont("Vector", 17); g.drawString(ampm, xyCenterSeconds, yAmPm, true); - } + } if (secondsMode != "none") drawSeconds(); // To make sure... - - // draw Day, name of month, Date + + // draw Day, name of month, Date //DATE let localDate = require("locale").date(new Date(), 1); localDate = localDate.substring(0, localDate.length - 5); @@ -249,7 +253,7 @@ function draw() { if (offsets.length === 1) { - let date = [require("locale").dow(new Date(), 1), require("locale").date(new Date(), 1)]; + let date = [require("locale").dow(new Date(), 1), require("locale").date(new Date(), 1)]; // For a single secondary timezone, draw it bigger and drop time zone to second line const xOffset = 30; g.setFont(font, secondaryTimeFontSize).drawString(`${hours}:${minutes}`, xyCenter, yposTime2, true); @@ -275,7 +279,7 @@ function draw() { g.setFontAlign(-1, 0).setFont("Vector",12).drawString(`${rise}`, 10, 3 + yposWorld + 3 * 15, true); // draw rise g.setFontAlign(1, 0).drawString(`${set}`, xcol2, 3 + yposWorld + 3 * 15, true); // draw set } else { - g.setFontAlign(-1, 0).setFont("Vector",11).drawString("set city in \'my location\' app!", 10, 3 + yposWorld + 3 * 15, true); + g.setFontAlign(-1, 0).setFont("Vector",11).drawString("set city in \'my location\' app!", 10, 3 + yposWorld + 3 * 15, true); } } //debug settings @@ -285,7 +289,7 @@ function draw() { //g.drawString(colorWhenDark, xcol2, 3 + yposWorld + 3 * 15, true); queueDraw(); - + if (secondsMode != "none") queueDrawSeconds(); } @@ -295,26 +299,63 @@ g.clear(); // Init the settings of the app loadMySettings(); -// Show launcher when middle button pressed -Bangle.setUI({ - mode : "clock", - remove : function() { - // Called to unload all of the clock app - if (PosInterval) clearInterval(PosInterval); - PosInterval = undefined; - if (drawTimeoutSeconds) clearTimeout(drawTimeoutSeconds); - drawTimeoutSeconds = undefined; - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - }}); -Bangle.loadWidgets(); -Bangle.drawWidgets(); + // draw immediately at first, queue update draw(); + + + +//if (BANGLEJS2) { + //Bangle.on("drag", e => { + let onDrag = e => { + if (!drag) { // start dragging + drag = {x: e.x, y: e.y}; + } else if (!e.b) { // released + const dx = e.x-drag.x, dy = e.y-drag.y; + drag = null; + if (Math.abs(dx)>Math.abs(dy)+10) { + // horizontal + if (dx < dy) { + // for later purpose + } else { + // for later purpose + } + } else if (Math.abs(dy)>Math.abs(dx)+10) { + // vertical + if (dx < dy) { //down + g.clear().setRotation(0); + draw(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + } else { + g.clear().setRotation(2); + draw(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + } + } else { + //console.log("tap " + e.x + " " + e.y); + if (e.x > 145 && e.y > 145) { + // for later purpose + } + } + } + }; //); + Bangle.on("drag", onDrag); + //} else { + //setWatch(xxx, BTN1, { repeat: true, debounce:50 }); // maybe adding this later + //setWatch(xxx, BTN3, { repeat: true, debounce:50 }); + //setWatch(xxx, BTN4, { repeat: true, debounce:50 }); + //setWatch(xxx, BTN5, { repeat: true, debounce:50 }); + // } +//} + + + if (!Bangle.isLocked()) { // Initial state if (showSunInfo) { if (PosInterval != 0 && typeof PosInterval != 'undefined') clearInterval(PosInterval); @@ -326,15 +367,15 @@ if (!Bangle.isLocked()) { // Initial state if (secondsMode != "none") { if (drawTimeoutSeconds) clearTimeout(drawTimeoutSeconds); drawTimeoutSeconds = undefined; - } + } if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; draw(); // draw immediately, queue redraw - + }else{ if (secondsMode == "always") secondsTimeout = 1000; if (secondsMode == "when unlocked") secondsTimeout = 10 * 1000; - + if (secondsMode != "none") { if (drawTimeoutSeconds) clearTimeout(drawTimeoutSeconds); drawTimeoutSeconds = undefined; @@ -348,11 +389,11 @@ if (!Bangle.isLocked()) { // Initial state updatePos(); } draw(); // draw immediately, queue redraw - } + - -Bangle.on('lock',on=>{ +//Bangle.on('lock',on=>{ +let onLock = on => { if (!on) { // UNlocked if (showSunInfo) { if (PosInterval != 0) clearInterval(PosInterval); @@ -364,7 +405,7 @@ Bangle.on('lock',on=>{ if (secondsMode != "none") { if (drawTimeoutSeconds) clearTimeout(drawTimeoutSeconds); drawTimeoutSeconds = undefined; - } + } if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; @@ -373,7 +414,7 @@ Bangle.on('lock',on=>{ if (secondsMode == "always") secondsTimeout = 1000; if (secondsMode == "when unlocked") secondsTimeout = 10 * 1000; - + if (secondsMode != "none") { if (drawTimeoutSeconds) clearTimeout(drawTimeoutSeconds); drawTimeoutSeconds = undefined; @@ -386,7 +427,31 @@ Bangle.on('lock',on=>{ PosInterval = setInterval(updatePos, 60*60E3); // refesh every 60 mins updatePos(); } - draw(); // draw immediately, queue redraw + draw(); // draw immediately, queue redraw } - }); -} + }; +Bangle.on('lock', onLock); + +// Show launcher when middle button pressed +Bangle.setUI({ + mode : "custom",clock:true, + remove : function() { + // Called to unload all of the clock app + if (typeof PosInterval === "undefined") { + console.log("PosInterval is undefined"); + } else { + if (PosInterval) clearInterval(PosInterval); + } + PosInterval = undefined; + if (drawTimeoutSeconds) clearTimeout(drawTimeoutSeconds); + drawTimeoutSeconds = undefined; + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + if (BANGLEJS2) Bangle.removeListener("drag",onDrag); + Bangle.removeListener("onLock",onLock); + }}); +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +// ); +} \ No newline at end of file diff --git a/apps/hworldclock/metadata.json b/apps/hworldclock/metadata.json index 3b633ead7..401201f51 100644 --- a/apps/hworldclock/metadata.json +++ b/apps/hworldclock/metadata.json @@ -2,7 +2,7 @@ "id": "hworldclock", "name": "Hanks World Clock", "shortName": "Hanks World Clock", - "version": "0.29", + "version": "0.30", "description": "Current time zone plus up to three others", "allow_emulator":true, "icon": "app.png", From 8962c2527ee4080e445586634cc5d3f9ca249879 Mon Sep 17 00:00:00 2001 From: pebl-hank Date: Mon, 12 Dec 2022 17:17:47 +0100 Subject: [PATCH 19/30] Update ChangeLog --- apps/messageicons/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/messageicons/ChangeLog b/apps/messageicons/ChangeLog index fefc6ee6e..68494fccc 100644 --- a/apps/messageicons/ChangeLog +++ b/apps/messageicons/ChangeLog @@ -1,2 +1,3 @@ 0.01: Moved message icons from messages into standalone library 0.02: Added several new icons and colors +0.03: ? From 5836d7de6559119866cf6d863c8e74a2d6a43d5e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 12 Dec 2022 16:33:37 +0000 Subject: [PATCH 20/30] oops. didn't commit --- apps/messageicons/ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/messageicons/ChangeLog b/apps/messageicons/ChangeLog index fefc6ee6e..26683e38b 100644 --- a/apps/messageicons/ChangeLog +++ b/apps/messageicons/ChangeLog @@ -1,2 +1,4 @@ 0.01: Moved message icons from messages into standalone library 0.02: Added several new icons and colors +0.03: Fix icons broken in 0v02 (#2386) + Store all icons in a separate binary file (much faster lookup) From 186630f0c70f15c38605d031c1ba1cfa81104d4e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 13 Dec 2022 08:51:01 +0000 Subject: [PATCH 21/30] Show installs/favourites with percentage values --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 2a89ea64f..9246a2b35 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 2a89ea64f7874b9264572f68836fe8ecd0a6b191 +Subproject commit 9246a2b350b9b240fe20b2631eac9b92926a50d4 From 821205c63ba4f5f6578f7f00d7eb69cc720c2e36 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 13 Dec 2022 16:00:54 +0000 Subject: [PATCH 22/30] Check for potential clashes (eg installing 2 battery widgets) and prompt for a solution --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 9246a2b35..376824068 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 9246a2b350b9b240fe20b2631eac9b92926a50d4 +Subproject commit 376824068d90986c245b46970fd80ccdca44e431 From dcefe4b393ccc5e6308752514e7ef29c8d354f3c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 14 Dec 2022 09:33:03 +0000 Subject: [PATCH 23/30] Update clock_info's heart rate handling to ensure the HRM value is up to date --- modules/clock_info.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/clock_info.js b/modules/clock_info.js index 50968311e..6f37e5d3d 100644 --- a/modules/clock_info.js +++ b/modules/clock_info.js @@ -61,12 +61,15 @@ if (stepGoal == undefined) { exports.load = function() { // info used for drawing... - var hrm = "--"; + var hrm = 0; var alt = "--"; // callbacks (needed for easy removal of listeners) function batteryUpdateHandler() { bangleItems[0].emit("redraw"); } function stepUpdateHandler() { bangleItems[1].emit("redraw"); } - function hrmUpdateHandler() { bangleItems[2].emit("redraw"); } + function hrmUpdateHandler(e) { + if (e && e.confidence>60) hrm = Math.round(e.bpm); + bangleItems[2].emit("redraw"); + } function altUpdateHandler() { Bangle.getPressure().then(data=>{ if (!data) return; @@ -99,12 +102,12 @@ exports.load = function() { }, { name : "HRM", hasRange : true, - get : () => { let v = Math.round(Bangle.getHealthStatus("last").bpm); return { - text : v + " bpm", v : v, min : 40, max : 200, + get : () => { return { + text : (hrm||"--") + " bpm", v : hrm, min : 40, max : 200, img : atob("GBiBAAAAAAAAAAAAAAAAAAAAAADAAADAAAHAAAHjAAHjgAPngH9n/n82/gA+AAA8AAA8AAAcAAAYAAAYAAAAAAAAAAAAAAAAAAAAAA==") }}, - show : function() { Bangle.setHRMPower(1,"clkinfo"); Bangle.on("HRM", hrmUpdateHandler); hrm = Math.round(Bangle.getHealthStatus("last").bpm); hrmUpdateHandler(); }, - hide : function() { Bangle.setHRMPower(0,"clkinfo"); Bangle.removeListener("HRM", hrmUpdateHandler); hrm = "--"; }, + show : function() { Bangle.setHRMPower(1,"clkinfo"); Bangle.on("HRM", hrmUpdateHandler); hrm = Math.round(Bangle.getHealthStatus().bpm||Bangle.getHealthStatus("last").bpm); hrmUpdateHandler(); }, + hide : function() { Bangle.setHRMPower(0,"clkinfo"); Bangle.removeListener("HRM", hrmUpdateHandler); hrm = 0; }, } ], }]; From d0e67164d01d816500db831b560d1eda60543801 Mon Sep 17 00:00:00 2001 From: Hank Date: Wed, 14 Dec 2022 11:14:56 +0100 Subject: [PATCH 24/30] 0.31: Tweaking the swipe option; Added mylocation as a dependency. --- apps/hworldclock/ChangeLog | 1 + apps/hworldclock/README.md | 21 ++++-- apps/hworldclock/app.js | 133 +++++++++++++++++---------------- apps/hworldclock/metadata.json | 5 +- apps/hworldclock/settings.js | 3 +- 5 files changed, 89 insertions(+), 74 deletions(-) diff --git a/apps/hworldclock/ChangeLog b/apps/hworldclock/ChangeLog index eef39a6ca..df3965698 100644 --- a/apps/hworldclock/ChangeLog +++ b/apps/hworldclock/ChangeLog @@ -14,3 +14,4 @@ 0.28: Reverted changes to implementation of 0.25 0.29: Use 'modules/suncalc.js' to avoid it being copied 8 times for different apps 0.30: BJS2: swipe seems to be working now +0.31: Tweaking the swipe option; Added mylocation as a dependency. diff --git a/apps/hworldclock/README.md b/apps/hworldclock/README.md index 905e9987b..273389775 100644 --- a/apps/hworldclock/README.md +++ b/apps/hworldclock/README.md @@ -1,8 +1,16 @@ + # Hanks World Clock - See the time in four locations In addition to the main clock and date in your current location, you can add up to three other locations. Great for travel or remote working. -Additionally we show the sunset/sunrise and seconds for the current location and the day name is shown in your locale. -If watch is locked, seconds get refreshed every 10 seconds. +Additionally we show the sunset/sunrise and seconds for the current location. The day name is shown in your locale. +Also, you can swipe up to show the current time to a friend. + +All this is configurable: + + - Show seconds only when unlocked (saves battery) / always / do not show seconds + - Green color on dark mode (on/off) + - Show sun info (on/off) (set your location in the mylocation app) + - Rotation degree on swipe (off / 90 / 180 / 270) ![](hworldclock.png) @@ -10,11 +18,11 @@ If watch is locked, seconds get refreshed every 10 seconds. Location for sun set / rise set with mylocation app. -Provide names and the UTC offsets for up to three other timezones in the app store. These are stored in a json file on your watch. UTC offsets can be decimal (e.g., 5.5 for India). +Provide names and the UTC offsets for up to three other timezones in the App Loader before uploading. These are stored in a json file on your watch. UTC offsets can be decimal (e.g., 5.5 for India). -The clock does not handle summer time / daylight saving time changes automatically. If one of your three locations changes its UTC offset, you can simply change the setting in the app store and update. Currently the clock only supports 24 hour time format for the additional time zones. +The clock does not handle summer time / daylight saving time changes automatically. If one of your three locations changes its UTC offset, you can simply change the setting in the App Launcher and update. Currently the clock only supports 24 hour time format for the additional time zones. -BangleJS2: Swipe up to rotate screen. So you can show the time to a friend real quick. +BangleJS2: Swipe up to rotate screen (Target rotation can be set in the settings). Swipe up again to go back to the default rotation. So you can show the time to a friend real quick or temporarily change orientation for sports etc. ## Requests @@ -24,5 +32,4 @@ Please use [the Espruino Forum](http://forum.espruino.com/microcosms/1424/) if y Created by Hank. -Based on the great work of "World Clock - 4 time zones". Made by [Scott Hale](https://www.github.com/computermacgyver), based upon the [Simple Clock](https://github.com/espruino/BangleApps/tree/master/apps/sclock). -And Sun Clock [Sun Clock](https://github.com/espruino/BangleApps/tree/master/apps/sunclock) \ No newline at end of file +Based on the great work of "World Clock - 4 time zones". Made by [Scott Hale](https://www.github.com/computermacgyver) diff --git a/apps/hworldclock/app.js b/apps/hworldclock/app.js index 38afa5572..6b10fb4f0 100644 --- a/apps/hworldclock/app.js +++ b/apps/hworldclock/app.js @@ -2,18 +2,19 @@ // ------- Settings file const SETTINGSFILE = "hworldclock.json"; -var secondsMode; -var showSunInfo; -var colorWhenDark; +let secondsMode; +let showSunInfo; +let colorWhenDark; +let rotationTarget; // ------- Settings file -const BANGLEJS2 = process.env.HWVERSION == 2; +//const BANGLEJS2 = process.env.HWVERSION == 2; const big = g.getWidth()>200; // Font for primary time and date const primaryTimeFontSize = big?6:5; const primaryDateFontSize = big?3:2; -require("Font5x9Numeric7Seg").add(Graphics); -require("FontTeletext10x18Ascii").add(Graphics); +let font5x9 = require("Font5x9Numeric7Seg").add(Graphics); +let font10x18 = require("FontTeletext10x18Ascii").add(Graphics); // Font for single secondary time const secondaryTimeFontSize = 4; @@ -27,8 +28,6 @@ const xcol2 = g.getWidth() - xcol1; const font = "6x8"; let drag; -/* TODO: we could totally use 'Layout' here and -avoid a whole bunch of hard-coded offsets */ const xyCenter = g.getWidth() / 2; const xyCenterSeconds = xyCenter + (big ? 85 : 68); @@ -41,22 +40,27 @@ const yposWorld = big ? 170 : 120; const OFFSET_TIME_ZONE = 0; const OFFSET_HOURS = 1; -var PosInterval = 0; +let PosInterval = 0; -var offsets = require("Storage").readJSON("hworldclock.settings.json") || []; +let offsets = require("Storage").readJSON("hworldclock.settings.json") || []; //=======Sun -setting = require("Storage").readJSON("setting.json",1); +let setting = require("Storage").readJSON("setting.json",1); E.setTimeZone(setting.timezone); // timezone = 1 for MEZ, = 2 for MESZ -SunCalc = require("suncalc"); // from modules folder +//https://raw.githubusercontent.com/pebl-hank/BangleApps/master/modules/suncalc.js +let SunCalc = require("suncalc"); // from modules folder const LOCATION_FILE = "mylocation.json"; -var rise = "read"; -var set = "..."; +let rise = "read"; +let set = "..."; //var pos = {altitude: 20, azimuth: 135}; //var noonpos = {altitude: 37, azimuth: 180}; //=======Sun -var ampm = "AM"; +let ampm = "AM"; + +let defaultRotation = setting.rotate || 0; +let currentRotation = defaultRotation; + // TESTING CODE // Used to test offset array values during development. @@ -91,30 +95,36 @@ const mockOffsets = { // END TESTING CODE -// Load settings -function loadMySettings() { - // Helper function default setting - function def (value, def) {return value !== undefined ? value : def;} - - var settings = require('Storage').readJSON(SETTINGSFILE, true) || {}; - secondsMode = def(settings.secondsMode, "when unlocked"); - showSunInfo = def(settings.showSunInfo, true); - colorWhenDark = def(settings.colorWhenDark, "green"); +// ================ Load settings +// Helper function default setting +let def = function(value, def) { + return value !== undefined ? value : def; } +let settings = require('Storage').readJSON(SETTINGSFILE, true) || {}; +secondsMode = def(settings.secondsMode, "when unlocked"); +showSunInfo = def(settings.showSunInfo, true); +colorWhenDark = def(settings.colorWhenDark, "green"); +rotationTarget = def(settings.rotationTarget, "90"); +rotationTarget = parseInt(rotationTarget) || 0; +if (rotationTarget == 90) rotationTarget = 1; // very lame, but works for now. +if (rotationTarget == 180) rotationTarget = 2; +if (rotationTarget == 270) rotationTarget = 3; +// ================ Load settings + // Check settings for what type our clock should be -var _12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false; +let _12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false; // timeout used to update every minute -var drawTimeout; -var drawTimeoutSeconds; -var secondsTimeout; +let drawTimeout; +let drawTimeoutSeconds; +let secondsTimeout; g.setBgColor(g.theme.bg); // schedule a draw for the next minute -function queueDraw() { +let queueDraw = function() { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; @@ -123,7 +133,7 @@ function queueDraw() { } // schedule a draw for the next second -function queueDrawSeconds() { +let queueDrawSeconds = function() { if (drawTimeoutSeconds) clearTimeout(drawTimeoutSeconds); drawTimeoutSeconds = setTimeout(function() { drawTimeoutSeconds = undefined; @@ -132,16 +142,16 @@ function queueDrawSeconds() { }, secondsTimeout - (Date.now() % secondsTimeout)); } -function doublenum(x) { +let doublenum = function(x) { return x < 10 ? "0" + x : "" + x; } -function getCurrentTimeFromOffset(dt, offset) { +let getCurrentTimeFromOffset = function(dt, offset) { return new Date(dt.getTime() + offset * 60 * 60 * 1000); } -function updatePos() { - coord = require("Storage").readJSON(LOCATION_FILE,1)|| {"lat":0,"lon":0,"location":"-"}; //{"lat":53.3,"lon":10.1,"location":"Pattensen"}; +let updatePos = function() { + let coord = require("Storage").readJSON(LOCATION_FILE,1)|| {"lat":0,"lon":0,"location":"-"}; //{"lat":53.3,"lon":10.1,"location":"Pattensen"}; if (coord.lat != 0 && coord.lon != 0) { //pos = SunCalc.getPosition(Date.now(), coord.lat, coord.lon); times = SunCalc.getTimes(Date.now(), coord.lat, coord.lon); @@ -154,8 +164,7 @@ function updatePos() { } } - -function drawSeconds() { +let drawSeconds = function() { // get date let d = new Date(); let da = d.toString().split(" "); @@ -177,16 +186,13 @@ function drawSeconds() { } else { g.setColor(g.theme.fg); } - //console.log("---"); - //console.log(seconds); if (Bangle.isLocked() && secondsMode != "always") seconds = seconds.slice(0, -1) + ':::'; // we use :: as the font does not have an x - //console.log(seconds); g.drawString(`${seconds}`, xyCenterSeconds, yposTime+14, true); queueDrawSeconds(); } -function draw() { +let draw = function() { // get date let d = new Date(); let da = d.toString().split(" "); @@ -211,7 +217,6 @@ function draw() { } } - //g.setFont(font, primaryTimeFontSize); g.setFont("5x9Numeric7Seg",primaryTimeFontSize); if (g.theme.dark) { if (colorWhenDark == "green") { @@ -293,24 +298,10 @@ function draw() { if (secondsMode != "none") queueDrawSeconds(); } -// clean app screen -g.clear(); - -// Init the settings of the app -loadMySettings(); - - - - -// draw immediately at first, queue update -draw(); - - //if (BANGLEJS2) { - //Bangle.on("drag", e => { let onDrag = e => { if (!drag) { // start dragging drag = {x: e.x, y: e.y}; @@ -327,12 +318,20 @@ draw(); } else if (Math.abs(dy)>Math.abs(dx)+10) { // vertical if (dx < dy) { //down - g.clear().setRotation(0); - draw(); - Bangle.loadWidgets(); - Bangle.drawWidgets(); + //g.clear().setRotation(defaultRotation); + //currentRotation = defaultRotation; + //draw(); + //Bangle.loadWidgets(); + //Bangle.drawWidgets(); } else { - g.clear().setRotation(2); + if (currentRotation == rotationTarget) { + g.clear().setRotation(defaultRotation); + currentRotation = defaultRotation; + } else { + g.clear().setRotation(rotationTarget); + currentRotation = rotationTarget; + } + draw(); Bangle.loadWidgets(); Bangle.drawWidgets(); @@ -346,13 +345,12 @@ draw(); } }; //); Bangle.on("drag", onDrag); - //} else { + //} <-- BJS2 only } else { //setWatch(xxx, BTN1, { repeat: true, debounce:50 }); // maybe adding this later //setWatch(xxx, BTN3, { repeat: true, debounce:50 }); //setWatch(xxx, BTN4, { repeat: true, debounce:50 }); //setWatch(xxx, BTN5, { repeat: true, debounce:50 }); // } -//} @@ -392,7 +390,6 @@ if (!Bangle.isLocked()) { // Initial state } -//Bangle.on('lock',on=>{ let onLock = on => { if (!on) { // UNlocked if (showSunInfo) { @@ -432,11 +429,13 @@ let onLock = on => { }; Bangle.on('lock', onLock); + // Show launcher when middle button pressed Bangle.setUI({ mode : "custom",clock:true, remove : function() { // Called to unload all of the clock app + g.setRotation(defaultRotation); // bring back default rotation if (typeof PosInterval === "undefined") { console.log("PosInterval is undefined"); } else { @@ -447,9 +446,15 @@ Bangle.setUI({ drawTimeoutSeconds = undefined; if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; - if (BANGLEJS2) Bangle.removeListener("drag",onDrag); + //if (BANGLEJS2) + Bangle.removeListener("drag",onDrag); Bangle.removeListener("onLock",onLock); }}); + + +g.clear().setRotation(defaultRotation); // clean app screen and make sure the default rotation is set +draw(); // draw immediately at first, queue update + Bangle.loadWidgets(); Bangle.drawWidgets(); diff --git a/apps/hworldclock/metadata.json b/apps/hworldclock/metadata.json index 401201f51..590f1dc86 100644 --- a/apps/hworldclock/metadata.json +++ b/apps/hworldclock/metadata.json @@ -2,7 +2,7 @@ "id": "hworldclock", "name": "Hanks World Clock", "shortName": "Hanks World Clock", - "version": "0.30", + "version": "0.31", "description": "Current time zone plus up to three others", "allow_emulator":true, "icon": "app.png", @@ -12,6 +12,7 @@ "supports": ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "custom": "custom.html", + "dependencies": {"mylocation":"app"}, "storage": [ {"name":"hworldclock.app.js","url":"app.js"}, {"name":"hworldclock.img","url":"hworldclock-icon.js","evaluate":true}, @@ -19,6 +20,6 @@ ], "data": [ {"name":"hworldclock.settings.json"}, - {"name":"hworldclock.json"} + {"name":"hworldclock.json"} ] } diff --git a/apps/hworldclock/settings.js b/apps/hworldclock/settings.js index 26c946b5f..ad97c161a 100644 --- a/apps/hworldclock/settings.js +++ b/apps/hworldclock/settings.js @@ -42,7 +42,8 @@ settings.showSunInfo = v; writeSettings(); } - } + }, + "Rotation": stringInSettings("rotationTarget", ["off", "90", "180", "270"]), }; E.showMenu(mainmenu); From 51304530f681fb2f90eb3fcc4f2a6fc42194114d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 14 Dec 2022 10:23:22 +0000 Subject: [PATCH 25/30] 0.31: Remove calls to Bangle.loadWidgets as they are not needed and create warnings --- apps/hworldclock/ChangeLog | 1 + apps/hworldclock/app.js | 4 +--- apps/hworldclock/metadata.json | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/hworldclock/ChangeLog b/apps/hworldclock/ChangeLog index eef39a6ca..f571697b7 100644 --- a/apps/hworldclock/ChangeLog +++ b/apps/hworldclock/ChangeLog @@ -14,3 +14,4 @@ 0.28: Reverted changes to implementation of 0.25 0.29: Use 'modules/suncalc.js' to avoid it being copied 8 times for different apps 0.30: BJS2: swipe seems to be working now +0.31: Remove calls to Bangle.loadWidgets as they are not needed and create warnings diff --git a/apps/hworldclock/app.js b/apps/hworldclock/app.js index 38afa5572..3ec4b2c3d 100644 --- a/apps/hworldclock/app.js +++ b/apps/hworldclock/app.js @@ -329,12 +329,10 @@ draw(); if (dx < dy) { //down g.clear().setRotation(0); draw(); - Bangle.loadWidgets(); Bangle.drawWidgets(); } else { g.clear().setRotation(2); draw(); - Bangle.loadWidgets(); Bangle.drawWidgets(); } } else { @@ -454,4 +452,4 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); // ); -} \ No newline at end of file +} diff --git a/apps/hworldclock/metadata.json b/apps/hworldclock/metadata.json index 401201f51..eb0e72ddc 100644 --- a/apps/hworldclock/metadata.json +++ b/apps/hworldclock/metadata.json @@ -2,7 +2,7 @@ "id": "hworldclock", "name": "Hanks World Clock", "shortName": "Hanks World Clock", - "version": "0.30", + "version": "0.31", "description": "Current time zone plus up to three others", "allow_emulator":true, "icon": "app.png", From 69660b69aa6b00552873c2b0bd0eedcfdd995cea Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 14 Dec 2022 10:23:36 +0000 Subject: [PATCH 26/30] Add BTHome thermometer --- apps/bthometemp/ChangeLog | 1 + apps/bthometemp/README.md | 9 ++++++ apps/bthometemp/app-icon.js | 1 + apps/bthometemp/app.js | 58 ++++++++++++++++++++++++++++++++++ apps/bthometemp/app.png | Bin 0 -> 13318 bytes apps/bthometemp/metadata.json | 14 ++++++++ 6 files changed, 83 insertions(+) create mode 100644 apps/bthometemp/ChangeLog create mode 100644 apps/bthometemp/README.md create mode 100644 apps/bthometemp/app-icon.js create mode 100644 apps/bthometemp/app.js create mode 100644 apps/bthometemp/app.png create mode 100644 apps/bthometemp/metadata.json diff --git a/apps/bthometemp/ChangeLog b/apps/bthometemp/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/bthometemp/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/bthometemp/README.md b/apps/bthometemp/README.md new file mode 100644 index 000000000..1a8212ea4 --- /dev/null +++ b/apps/bthometemp/README.md @@ -0,0 +1,9 @@ +# BTHome Temperature and Pressure + +This app displays temperature and pressure and advertises them over bluetooth using BTHome.io standard (along with battery level) + +This can be used to integrate with [Home Assistant](https://www.home-assistant.io/), so you can use your Bangle as a wireless temperature/pressure sensor. + +More info on the standard at https://bthome.io + +And the data format used is https://bthome.io/format/ diff --git a/apps/bthometemp/app-icon.js b/apps/bthometemp/app-icon.js new file mode 100644 index 000000000..e2dff3eb9 --- /dev/null +++ b/apps/bthometemp/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4kA///1N6BIPf//1gMIwdE8sG2me+9Y/8C/2snXsoUNpdnzdt/xj/AH4AYgMRAAUQCyoYSCQNXs1muoFBFyHm1X//+qtwwPiMX1+YmczxP6uIwNFwN6yeDnGDmc504wNFwOpnGYC4OJweaGBsR9WTmYtBmc4GAOuC5ZGBt4SBAAQEBwf2JBcBiupnIuCmedxGTzVRC5cX1AuDnPZF4OKuIXLi3zIoedMgMzn9hC5uICQON5IDBxAXSznYC6RdDPQYXNO4JcB7pdCO56nBnGZ7p6DU5zXBXgSqDa5sAiPqIgOZd4c510RCxQXBi+pRQIXBxODzVxC5hIBvR1DnE505GMGAevzAvC/QuNGAfm1X//+qtwuOGAURq9ms11AoIWOGAQAEFw1EDBwWFggBCkUgAQMigUAAIIAJoABDCgIXQFwYXBCYYBDHAMCEAIkCFgcEAIIKCCoQFCkAhBAQIlCkAsBOoIXCBoIvEAwQTCAYI2BIwgXIF4YXDQwIVCC4YIBMIwfCAQRfGYBSPNC6TBFACgwBACouWAH4AiA=")) diff --git a/apps/bthometemp/app.js b/apps/bthometemp/app.js new file mode 100644 index 000000000..7b55777d1 --- /dev/null +++ b/apps/bthometemp/app.js @@ -0,0 +1,58 @@ +// history of temperature/pressure readings +var history = []; + +// When we get temperature... +function onTemperature(p) { + // Average the last 5 temperature readings + while (history.length>4) history.shift(); + history.push(p); + var avrTemp = history.reduce((i,h)=>h.temperature+i,0) / history.length; + var avrPressure = history.reduce((i,h)=>h.pressure+i,0) / history.length; + var t = require('locale').temp(avrTemp).replace("'","°"); + // Draw + var rect = Bangle.appRect; + g.reset(1).clearRect(rect.x, rect.y, rect.x2, rect.y2); + var x = (rect.x+rect.x2)/2; + var y = (rect.y+rect.y2)/2 + 10; + g.setFont("6x15").setFontAlign(0,0).drawString("Temperature:", x, y - 65); + g.setFontVector(50).setFontAlign(0,0).drawString(t, x, y-25); + g.setFont("6x15").setFontAlign(0,0).drawString("Pressure:", x, y+15 ); + g.setFont("12x20").setFontAlign(0,0).drawString(Math.round(avrPressure)+" hPa", x, y+40); + // Set Bluetooth Advertising + // https://bthome.io/format/ + var temp100 = Math.round(avrTemp*100); + var pressure100 = Math.round(avrPressure*100); + + Bangle.bleAdvert[0xFCD2] = [ 0x40, /* BTHome Device Information + bit 0: "Encryption flag" + bit 1-4: "Reserved for future use" + bit 5-7: "BTHome Version" */ + + 0x01, // Battery, 8 bit + E.getBattery(), + + 0x02, // Temperature, 16 bit + temp100&255,temp100>>8, + + 0x04, // Pressure, 16 bit + pressure100&255,(pressure100>>8)&255,pressure100>>16 + ]; + NRF.setAdvertising(Bangle.bleAdvert); +} + +// Gets the temperature in the most accurate way with pressure sensor +function drawTemperature() { + Bangle.getPressure().then(p =>{if (p) onTemperature(p);}); +} + +if (!Bangle.bleAdvert) Bangle.bleAdvert = {}; +setInterval(function() { + drawTemperature(); +}, 10000); // update every 10s +Bangle.loadWidgets(); +Bangle.setUI({ + mode : "custom", + back : function() {load();} +}); +E.showMessage("Reading temperature..."); +drawTemperature(); diff --git a/apps/bthometemp/app.png b/apps/bthometemp/app.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8eb3f14ce0f0ed83734d8a386e0283ce665781 GIT binary patch literal 13318 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 literal 0 HcmV?d00001 diff --git a/apps/bthometemp/metadata.json b/apps/bthometemp/metadata.json new file mode 100644 index 000000000..4bfd08c31 --- /dev/null +++ b/apps/bthometemp/metadata.json @@ -0,0 +1,14 @@ +{ "id": "bthometemp", + "name": "BTHome Temperature and Pressure", + "shortName":"BTHome T", + "version":"0.01", + "description": "Displays temperature and pressure, and advertises them over bluetooth using BTHome.io standard", + "icon": "app.png", + "tags": "bthome,bluetooth,temperature", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"bthometemp.app.js","url":"app.js"}, + {"name":"bthometemp.img","url":"app-icon.js","evaluate":true} + ] +} From f95ce3a84ead7a078216bf99bd3e538145ae100b Mon Sep 17 00:00:00 2001 From: glemco Date: Wed, 14 Dec 2022 12:58:42 +0100 Subject: [PATCH 27/30] circlesclock: fixed crash if item has no image and cutting long overflowing text --- apps/circlesclock/ChangeLog | 1 + apps/circlesclock/app.js | 3 +++ apps/circlesclock/metadata.json | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/circlesclock/ChangeLog b/apps/circlesclock/ChangeLog index cb5248e32..83abde6df 100644 --- a/apps/circlesclock/ChangeLog +++ b/apps/circlesclock/ChangeLog @@ -38,3 +38,4 @@ Add fast load capability 0.21: Remade all icons without a palette for dark theme Now re-adds widgets if they were hidden when fast-loading +0.22: Fixed crash if item has no image and cutting long overflowing text diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 444040ef0..30d6a48f4 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -183,9 +183,12 @@ let drawCircle = function(index, item, data) { if (txt.endsWith(" bpm")) txt=txt.slice(0,-4); // hack for heart rate - remove the 'bpm' text if(item.hasRange) percent = (data.v-data.min) / (data.max-data.min); if(data.short) txt = data.short; + //long text can overflow and we do not draw there anymore.. + if(txt.length>6) txt = txt.slice(0,5)+"\n"+txt.slice(5,10) drawGauge(w, h3, percent, color); drawInnerCircleAndTriangle(w); writeCircleText(w, txt); + if(!img) return; //or get it from the clkinfo? g.setColor(getCircleIconColor(index, color, percent)) .drawImage(img, w - iconOffset, h3 + radiusOuter - iconOffset, {scale: 16/24}); } diff --git a/apps/circlesclock/metadata.json b/apps/circlesclock/metadata.json index 7b4c25532..1b94c00b3 100644 --- a/apps/circlesclock/metadata.json +++ b/apps/circlesclock/metadata.json @@ -1,7 +1,7 @@ { "id": "circlesclock", "name": "Circles clock", "shortName":"Circles clock", - "version":"0.21", + "version":"0.22", "description": "A clock with three or four circles for different data at the bottom in a probably familiar style", "icon": "app.png", "screenshots": [{"url":"screenshot-dark.png"}, {"url":"screenshot-light.png"}, {"url":"screenshot-dark-4.png"}, {"url":"screenshot-light-4.png"}], From 99065debc71bb7ced9a13a5dc2e7caa3a940587c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 14 Dec 2022 14:52:04 +0000 Subject: [PATCH 28/30] Ensure Agenda supplies an image for clkinfo items (fix #2397) --- apps/agenda/ChangeLog | 1 + apps/agenda/agenda.clkinfo.js | 2 +- apps/agenda/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/agenda/ChangeLog b/apps/agenda/ChangeLog index 7f749ff25..cb928213e 100644 --- a/apps/agenda/ChangeLog +++ b/apps/agenda/ChangeLog @@ -7,3 +7,4 @@ 0.07: Clkinfo improvements. 0.08: Fix error in clkinfo (didn't require Storage & locale) Fix clkinfo icon +0.09: Ensure Agenda supplies an image for clkinfo items diff --git a/apps/agenda/agenda.clkinfo.js b/apps/agenda/agenda.clkinfo.js index baa8b9516..54677327b 100644 --- a/apps/agenda/agenda.clkinfo.js +++ b/apps/agenda/agenda.clkinfo.js @@ -19,7 +19,7 @@ agendaItems.items.push({ name: "Agenda "+i, - get: () => ({ text: title + "\n" + dateStr, img: null}), + get: () => ({ text: title + "\n" + dateStr, img: agendaItems.img }), show: function() { agendaItems.items[i].emit("redraw"); }, hide: function () {} }); diff --git a/apps/agenda/metadata.json b/apps/agenda/metadata.json index 7e49e3f96..58a5091cd 100644 --- a/apps/agenda/metadata.json +++ b/apps/agenda/metadata.json @@ -1,7 +1,7 @@ { "id": "agenda", "name": "Agenda", - "version": "0.08", + "version": "0.09", "description": "Simple agenda", "icon": "agenda.png", "screenshots": [{"url":"screenshot_agenda_overview.png"}, {"url":"screenshot_agenda_event1.png"}, {"url":"screenshot_agenda_event2.png"}], From 1dcf6085d5f284d630dae2556275d335a8446396 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 14 Dec 2022 15:00:29 +0000 Subject: [PATCH 29/30] Ensure Timer supplies an image for clkinfo items --- apps/smpltmr/ChangeLog | 3 ++- apps/smpltmr/clkinfo.js | 6 +++--- apps/smpltmr/metadata.json | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/smpltmr/ChangeLog b/apps/smpltmr/ChangeLog index 805e8546f..12b77aacd 100644 --- a/apps/smpltmr/ChangeLog +++ b/apps/smpltmr/ChangeLog @@ -2,4 +2,5 @@ 0.02: Rewrite with new interface 0.03: Added clock infos to expose timer functionality to clocks. 0.04: Improvements of clock infos. -0.05: Updated clkinfo icon. \ No newline at end of file +0.05: Updated clkinfo icon. +0.06: Ensure Timer supplies an image for clkinfo items diff --git a/apps/smpltmr/clkinfo.js b/apps/smpltmr/clkinfo.js index c16e6127e..270a14fc4 100644 --- a/apps/smpltmr/clkinfo.js +++ b/apps/smpltmr/clkinfo.js @@ -69,7 +69,7 @@ items: [ { name: null, - get: () => ({ text: getAlarmMinutesText() + (isAlarmEnabled() ? " min" : ""), img: null}), + get: () => ({ text: getAlarmMinutesText() + (isAlarmEnabled() ? " min" : ""), img: smpltmrItems.img }), show: function() { smpltmrItems.items[0].emit("redraw"); }, hide: function () {}, run: function() { } @@ -81,7 +81,7 @@ offsets.forEach((o, i) => { smpltmrItems.items = smpltmrItems.items.concat({ name: null, - get: () => ({ text: (o > 0 ? "+" : "") + o + " min.", img: null}), + get: () => ({ text: (o > 0 ? "+" : "") + o + " min.", img: smpltmrItems.img }), show: function() { smpltmrItems.items[i+1].emit("redraw"); }, hide: function () {}, run: function() { @@ -94,4 +94,4 @@ }); return smpltmrItems; -}) \ No newline at end of file +}) diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index 2191902de..71e793cc2 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -2,7 +2,7 @@ "id": "smpltmr", "name": "Simple Timer", "shortName": "Simple Timer", - "version": "0.05", + "version": "0.06", "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool,alarm,timer,clkinfo", From 487742f037f926f5a2e84fb5df0184b835e0b4a5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 14 Dec 2022 17:24:31 +0000 Subject: [PATCH 30/30] 0.61: Fix regression where loading into messages app stops back from working (#2398) --- apps/messagegui/ChangeLog | 1 + apps/messagegui/app.js | 1 + apps/messagegui/metadata.json | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/messagegui/ChangeLog b/apps/messagegui/ChangeLog index 36ec8191f..834d703ce 100644 --- a/apps/messagegui/ChangeLog +++ b/apps/messagegui/ChangeLog @@ -83,3 +83,4 @@ Don't write messages to flash until the app closes 0.59: Ensure we do write messages if messages app can't be fast loaded (see #2373) 0.60: Fix saving of removal messages if UI not open +0.61: Fix regression where loading into messages app stops back from working (#2398) diff --git a/apps/messagegui/app.js b/apps/messagegui/app.js index 0f3d90a9d..9f8a20219 100644 --- a/apps/messagegui/app.js +++ b/apps/messagegui/app.js @@ -370,6 +370,7 @@ function checkMessages(options) { } // If we have a new message, show it if ((toShow||options.showMsgIfUnread) && newMessages.length) { + delete newMessages[0].show; // stop us getting stuck here if we're called a second time showMessage(newMessages[0].id); // buzz after showMessage, so being busy during layout doesn't affect the buzz pattern if (global.BUZZ_ON_NEW_MESSAGE) { diff --git a/apps/messagegui/metadata.json b/apps/messagegui/metadata.json index 5b1cb60c6..811f9baff 100644 --- a/apps/messagegui/metadata.json +++ b/apps/messagegui/metadata.json @@ -2,7 +2,7 @@ "id": "messagegui", "name": "Message UI", "shortName": "Messages", - "version": "0.60", + "version": "0.61", "description": "Default app to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app",