From b3f40e868d14d9b4d764f2d846e959d5a0a967ce Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Sat, 27 Aug 2022 22:25:28 +0100 Subject: [PATCH 01/25] Works - except that date_utils is gone?! --- apps/bigdclock/ChangeLog | 1 + apps/bigdclock/bigdclock.app.js | 12 ++++++++---- apps/bigdclock/metadata.json | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/bigdclock/ChangeLog b/apps/bigdclock/ChangeLog index 09cc978fb..60a8f703f 100644 --- a/apps/bigdclock/ChangeLog +++ b/apps/bigdclock/ChangeLog @@ -3,3 +3,4 @@ 0.03: Internationalisation; bug fix - battery icon responds promptly to charging state 0.04: bug fix 0.05: proper fix for the race condition in queueDraw() +0.06: Better battery graphic - now has green, yellow and red sections diff --git a/apps/bigdclock/bigdclock.app.js b/apps/bigdclock/bigdclock.app.js index c013c6188..dba60183c 100644 --- a/apps/bigdclock/bigdclock.app.js +++ b/apps/bigdclock/bigdclock.app.js @@ -29,7 +29,8 @@ function draw() { const level = E.getBattery(); const width = level + (level/2); var is12Hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"]; - var dows = require("date_utils").dows(0,1); +// var dows = require("date_utils").dows(0,1); + var dows = ["SU","MO","TU","WE","TH","FR","SA"]; g.reset(); g.clear(); @@ -53,12 +54,15 @@ function draw() { g.fillRect(167,163,170,167); if (Bangle.isCharging()) { g.setColor(1,1,0); - } else if (level > 40) { - g.setColor(0,1,0); + g.fillRect(12,162,12+width,168); } else { g.setColor(1,0,0); + g.fillRect(12,162,57,168); + g.setColor(1,1,0); + g.fillRect(58,162,72,168); + g.setColor(0,1,0); + g.fillRect(73,162,162,168); } - g.fillRect(12,162,12+width,168); if (level < 100) { g.setColor(g.theme.bg); g.fillRect(12+width+1,162,162,168); diff --git a/apps/bigdclock/metadata.json b/apps/bigdclock/metadata.json index 7359bcf20..ce91d921e 100644 --- a/apps/bigdclock/metadata.json +++ b/apps/bigdclock/metadata.json @@ -1,7 +1,7 @@ { "id": "bigdclock", "name": "Big digit clock containing just the essentials", "shortName":"Big digit clk", - "version":"0.05", + "version":"0.06", "description": "A clock containing just the essentials, made as easy to read as possible for those of us that need glasses. It contains the time, the day-of-week, the day-of-month, and the current battery state-of-charge.", "icon": "bigdclock.png", "type": "clock", From 91cfd487a325ea701258f4b80bc8481c744a57ab Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Thu, 22 Sep 2022 23:36:08 +0100 Subject: [PATCH 02/25] Now only checks battery every 15 minutes --- apps/bigdclock/bigdclock.app.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/bigdclock/bigdclock.app.js b/apps/bigdclock/bigdclock.app.js index dba60183c..a3691539b 100644 --- a/apps/bigdclock/bigdclock.app.js +++ b/apps/bigdclock/bigdclock.app.js @@ -11,6 +11,8 @@ Graphics.prototype.setFontOpenSans = function(scale) { }; var drawTimeout; +var lastBattCheck = 0; +var width = 0; function queueDraw(millis_now) { if (drawTimeout) clearTimeout(drawTimeout); @@ -26,12 +28,16 @@ function draw() { m = date.getMinutes(); var d = date.getDate(), w = date.getDay(); // d=1..31; w=0..6 - const level = E.getBattery(); - const width = level + (level/2); var is12Hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"]; // var dows = require("date_utils").dows(0,1); var dows = ["SU","MO","TU","WE","TH","FR","SA"]; + if (date.getTime() >= lastBattCheck + 15*60000) { + lastBattcheck = date.getTime(); + width = E.getBattery(); + width += width/2; + } + g.reset(); g.clear(); @@ -63,7 +69,7 @@ function draw() { g.setColor(0,1,0); g.fillRect(73,162,162,168); } - if (level < 100) { + if (width < 150) { g.setColor(g.theme.bg); g.fillRect(12+width+1,162,162,168); } From 1963eea12c97b33d1a91c29e642b43f173e2dce4 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Thu, 22 Sep 2022 23:47:11 +0100 Subject: [PATCH 03/25] Bar across the middle of the screen colour The bar across the middle of the screen will now also indicate the battery state of charge. BUT NOTE that the "date_utils" library seems to be missing from my watch! --- apps/bigdclock/bigdclock.app.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/bigdclock/bigdclock.app.js b/apps/bigdclock/bigdclock.app.js index a3691539b..b71a6b0a3 100644 --- a/apps/bigdclock/bigdclock.app.js +++ b/apps/bigdclock/bigdclock.app.js @@ -32,7 +32,7 @@ function draw() { // var dows = require("date_utils").dows(0,1); var dows = ["SU","MO","TU","WE","TH","FR","SA"]; - if (date.getTime() >= lastBattCheck + 15*60000) { + if ((date.getTime() >= lastBattCheck + 15*60000) || Bangle.isCharging()) { lastBattcheck = date.getTime(); width = E.getBattery(); width += width/2; @@ -74,7 +74,15 @@ function draw() { g.fillRect(12+width+1,162,162,168); } - g.setColor(0, 1, 0); + if (Bangle.isCharging()) { + g.setColor(1,1,0); + } else if (width <= 45) { + g.setColor(1,0,0); + } else if (width <= 60) { + g.setColor(1,1,0); + } else { + g.setColor(0, 1, 0); + } g.fillRect(0, 90, g.getWidth(), 94); // widget redraw From 013685b01d34d3ef68ed771e75c048533b7869de Mon Sep 17 00:00:00 2001 From: Spencer Churchill Date: Fri, 23 Sep 2022 08:12:39 -0700 Subject: [PATCH 04/25] convert Twenties to boot code instead of widget --- apps/twenties/ChangeLog | 4 +++ apps/twenties/README.md | 17 +++++++++++++ .../widget.png => twenties/app.png} | Bin apps/twenties/boot.js | 18 +++++++++++++ apps/{widtwenties => twenties}/metadata.json | 12 ++++----- apps/widtwenties/ChangeLog | 2 -- apps/widtwenties/README.md | 15 ----------- apps/widtwenties/widget.js | 24 ------------------ 8 files changed, 45 insertions(+), 47 deletions(-) create mode 100644 apps/twenties/ChangeLog create mode 100644 apps/twenties/README.md rename apps/{widtwenties/widget.png => twenties/app.png} (100%) create mode 100644 apps/twenties/boot.js rename apps/{widtwenties => twenties}/metadata.json (52%) delete mode 100644 apps/widtwenties/ChangeLog delete mode 100644 apps/widtwenties/README.md delete mode 100644 apps/widtwenties/widget.js diff --git a/apps/twenties/ChangeLog b/apps/twenties/ChangeLog new file mode 100644 index 000000000..89eb9547f --- /dev/null +++ b/apps/twenties/ChangeLog @@ -0,0 +1,4 @@ +0.01: New Widget! +0.02: Fix calling null on draw +0.03: Only vibrate during work +0.04: Convert to boot code \ No newline at end of file diff --git a/apps/twenties/README.md b/apps/twenties/README.md new file mode 100644 index 000000000..8ee917b0e --- /dev/null +++ b/apps/twenties/README.md @@ -0,0 +1,17 @@ +# Twenties + +Follow the [20-20-20 rule](https://www.aoa.org/AOA/Images/Patients/Eye%20Conditions/20-20-20-rule.pdf) with discrete reminders. Your Bangle will buzz every 20 minutes for you to look away from your screen, and then buzz 20 seconds later to look back. Additionally, alternate between standing and sitting every 20 minutes to be standing for [more than 30 minutes](https://uwaterloo.ca/kinesiology-health-sciences/how-long-should-you-stand-rather-sit-your-work-station) per hour. + +## Usage + +Download this app and it will automatically run in the background. + +## Features + +Vibrates to remind you to stand up and look away for healthy living. + +Only vibrates during work days and hours. + +## Creator + +[@splch](https://github.com/splch/) diff --git a/apps/widtwenties/widget.png b/apps/twenties/app.png similarity index 100% rename from apps/widtwenties/widget.png rename to apps/twenties/app.png diff --git a/apps/twenties/boot.js b/apps/twenties/boot.js new file mode 100644 index 000000000..180f4cbb7 --- /dev/null +++ b/apps/twenties/boot.js @@ -0,0 +1,18 @@ +(() => { + const move = 20 * 60 * 1000; // 20 minutes + const look = 20 * 1000; // 20 seconds + + buzz = _ => { + const date = new Date(); + const day = date.getDay(); + const hour = date.getHours(); + // buzz at work + if (day <= 5 && hour >= 8 && hour <= 17) { + Bangle.buzz().then(_ => { + setTimeout(Bangle.buzz, look); + }); + } + }; + + setInterval(buzz, move); // buzz to stand / sit +})(); \ No newline at end of file diff --git a/apps/widtwenties/metadata.json b/apps/twenties/metadata.json similarity index 52% rename from apps/widtwenties/metadata.json rename to apps/twenties/metadata.json index 2e51457ac..b1dfe2134 100644 --- a/apps/widtwenties/metadata.json +++ b/apps/twenties/metadata.json @@ -1,13 +1,13 @@ { - "id": "widtwenties", + "id": "twenties", "name": "Twenties", "shortName": "twenties", - "version": "0.02", + "version": "0.04", "description": "Buzzes every 20m to stand / sit and look 20ft away for 20s.", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tools", + "icon": "app.png", + "type": "bootloader", + "tags": "alarm,tool", "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", - "storage": [{ "name": "widtwenties.wid.js", "url": "widget.js" }] + "storage": [{ "name": "twenties.boot.js", "url": "boot.js" }] } diff --git a/apps/widtwenties/ChangeLog b/apps/widtwenties/ChangeLog deleted file mode 100644 index 87935d810..000000000 --- a/apps/widtwenties/ChangeLog +++ /dev/null @@ -1,2 +0,0 @@ -0.01: New Widget! -0.02: Fix calling null on draw \ No newline at end of file diff --git a/apps/widtwenties/README.md b/apps/widtwenties/README.md deleted file mode 100644 index 1dea18b8e..000000000 --- a/apps/widtwenties/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Twenties - -Follow the [20-20-20 rule](https://www.aoa.org/AOA/Images/Patients/Eye%20Conditions/20-20-20-rule.pdf) with discrete reminders. Your BangleJS will buzz every 20 minutes for you to look away from your screen, and then buzz 20 seconds later to look back. Additionally, alternate between standing and sitting every 20 minutes to be standing for [more than 30 minutes](https://uwaterloo.ca/kinesiology-health-sciences/how-long-should-you-stand-rather-sit-your-work-station) per hour. - -## Usage - -Download this widget and, as long as your watch-face supports widgets, it will automatically run in the background. - -## Features - -Vibrate to remind you to stand up and look away for healthy living. - -## Creator - -[@splch](https://github.com/splch/) diff --git a/apps/widtwenties/widget.js b/apps/widtwenties/widget.js deleted file mode 100644 index 58bc622eb..000000000 --- a/apps/widtwenties/widget.js +++ /dev/null @@ -1,24 +0,0 @@ -// WIDGETS = {}; // <-- for development only - -/* run widgets in their own function scope so -they don't interfere with currently-running apps */ -(() => { - const move = 20 * 60 * 1000; // 20 minutes - const look = 20 * 1000; // 20 seconds - - buzz = _ => { - Bangle.buzz().then(_ => { - setTimeout(Bangle.buzz, look); - }); - }; - - // add widget - WIDGETS.twenties = { - buzz: buzz, - draw: _ => { return null; }, - }; - - setInterval(WIDGETS.twenties.buzz, move); // buzz to stand / sit -})(); - -// Bangle.drawWidgets(); // <-- for development only \ No newline at end of file From b239fa69b5a0a06aad20451892d08d96ee595d39 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Fri, 23 Sep 2022 20:14:51 +0100 Subject: [PATCH 05/25] Fix for various locale methods Someone may or may not have a locale set up, and also it seems that date_utils aren't available when a locale is set??? --- apps/bigdclock/bigdclock.app.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/bigdclock/bigdclock.app.js b/apps/bigdclock/bigdclock.app.js index b71a6b0a3..75e66397c 100644 --- a/apps/bigdclock/bigdclock.app.js +++ b/apps/bigdclock/bigdclock.app.js @@ -26,12 +26,19 @@ function draw() { var date = new Date(); var h = date.getHours(), m = date.getMinutes(); - var d = date.getDate(), - w = date.getDay(); // d=1..31; w=0..6 + var d = date.getDate(); var is12Hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"]; -// var dows = require("date_utils").dows(0,1); - var dows = ["SU","MO","TU","WE","TH","FR","SA"]; - + var dow; + + try { + dow = require("locale").dow(date,1); + } catch (e) { + try { + dow = require("date_utils").dows(0,1)[date.getDay()]; + } catch (e) { + dow = ["SU","MO","TU","WE","TH","FR","SA"][date.getDay()]; + } + } if ((date.getTime() >= lastBattCheck + 15*60000) || Bangle.isCharging()) { lastBattcheck = date.getTime(); width = E.getBattery(); @@ -54,7 +61,7 @@ function draw() { g.drawString(d, g.getWidth() -6, 98); g.setFont('Vector', 52); g.setFontAlign(-1, -1); - g.drawString(dows[w].slice(0,2).toUpperCase(), 6, 103); + g.drawString(dow.slice(0,2).toUpperCase(), 6, 103); g.fillRect(9,159,166,171); g.fillRect(167,163,170,167); From b952599c6e73bcaf986917934094b7bbb1828e9f Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Fri, 23 Sep 2022 20:20:37 +0100 Subject: [PATCH 06/25] Update screenshot.png --- apps/bigdclock/screenshot.png | Bin 3180 -> 3053 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/bigdclock/screenshot.png b/apps/bigdclock/screenshot.png index 8a12b266e71005631235cacc50750f08c59e247d..acac53ea90176de276c693e957cc44a8d0da134f 100644 GIT binary patch delta 3035 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 delta 3163 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 From bb823639d59c08cda1c7d1a590807824f894d430 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Fri, 23 Sep 2022 20:22:22 +0100 Subject: [PATCH 07/25] Update ChangeLog --- apps/bigdclock/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bigdclock/ChangeLog b/apps/bigdclock/ChangeLog index 60a8f703f..a5441d6d1 100644 --- a/apps/bigdclock/ChangeLog +++ b/apps/bigdclock/ChangeLog @@ -3,4 +3,4 @@ 0.03: Internationalisation; bug fix - battery icon responds promptly to charging state 0.04: bug fix 0.05: proper fix for the race condition in queueDraw() -0.06: Better battery graphic - now has green, yellow and red sections +0.06: Better battery graphic - now has green, yellow and red sections; battery status reflected in the bar across the middle of the screen; better handling of locale From 181157eedf1f2d50b86f203885694651fea9f232 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Fri, 23 Sep 2022 20:36:32 +0100 Subject: [PATCH 08/25] Incorporate @thyttan commit Incorporate https://github.com/espruino/BangleApps/commit/5b1b3553c5a028c595845434762147b28de317a6 --- apps/bigdclock/ChangeLog | 3 ++- apps/bigdclock/bigdclock.app.js | 3 ++- apps/bigdclock/metadata.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/bigdclock/ChangeLog b/apps/bigdclock/ChangeLog index a5441d6d1..e9791dab8 100644 --- a/apps/bigdclock/ChangeLog +++ b/apps/bigdclock/ChangeLog @@ -3,4 +3,5 @@ 0.03: Internationalisation; bug fix - battery icon responds promptly to charging state 0.04: bug fix 0.05: proper fix for the race condition in queueDraw() -0.06: Better battery graphic - now has green, yellow and red sections; battery status reflected in the bar across the middle of the screen; better handling of locale +0.06: Tell clock widgets to hide. +0.07: Better battery graphic - now has green, yellow and red sections; battery status reflected in the bar across the middle of the screen; better handling of locale diff --git a/apps/bigdclock/bigdclock.app.js b/apps/bigdclock/bigdclock.app.js index 75e66397c..2f8b7cd4d 100644 --- a/apps/bigdclock/bigdclock.app.js +++ b/apps/bigdclock/bigdclock.app.js @@ -110,7 +110,8 @@ Bangle.on('charging', (charging) => { draw(); }); +Bangle.setUI("clock"); + Bangle.loadWidgets(); draw(); -Bangle.setUI("clock"); diff --git a/apps/bigdclock/metadata.json b/apps/bigdclock/metadata.json index ce91d921e..30352ca1a 100644 --- a/apps/bigdclock/metadata.json +++ b/apps/bigdclock/metadata.json @@ -1,7 +1,7 @@ { "id": "bigdclock", "name": "Big digit clock containing just the essentials", "shortName":"Big digit clk", - "version":"0.06", + "version":"0.07", "description": "A clock containing just the essentials, made as easy to read as possible for those of us that need glasses. It contains the time, the day-of-week, the day-of-month, and the current battery state-of-charge.", "icon": "bigdclock.png", "type": "clock", From d3a5f4cdb21ec914973afc56acc90832ce46ef47 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sat, 24 Sep 2022 14:24:49 +0200 Subject: [PATCH 09/25] messages: minor library refactor --- apps/messages/lib.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/messages/lib.js b/apps/messages/lib.js index d8599c93d..50e14a07b 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -12,11 +12,7 @@ function openMusic() { {t:"modify",id:int, title:string} // modified */ exports.pushMessage = function(event) { - var messages, inApp = "undefined"!=typeof MESSAGES; - if (inApp) - messages = MESSAGES; // we're in an app that has already loaded messages - else // no app - load messages - messages = require("Storage").readJSON("messages.json",1)||[]; + var messages = exports.getMessages(); // now modify/delete as appropriate var mIdx = messages.findIndex(m=>m.id==event.id); if (event.t=="remove") { @@ -39,7 +35,7 @@ exports.pushMessage = function(event) { } require("Storage").writeJSON("messages.json",messages); // if in app, process immediately - if (inApp) return onMessagesModified(mIdx<0 ? {id:event.id} : messages[mIdx]); + if ("undefined"!= typeof MESSAGES) return onMessagesModified(mIdx<0 ? {id:event.id} : messages[mIdx]); // update the widget icons shown if (global.WIDGETS && WIDGETS.messages) WIDGETS.messages.update(messages,true); // if no new messages now, make sure we don't load the messages app From fb10f8125e847a7cc15ba5737b8296fd05885f6d Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sat, 24 Sep 2022 14:48:59 +0200 Subject: [PATCH 10/25] messages: emit "message" events --- apps/messages/ChangeLog | 3 ++- apps/messages/README.md | 13 +++++++++++++ apps/messages/lib.js | 11 +++++++++-- apps/messages/metadata.json | 2 +- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 262cba1fa..0b3cb276d 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -66,4 +66,5 @@ 0.50: Add `getMessages` and `status` functions to library Option to disable auto-open of messages Option to make message icons monochrome (not colored) - messages widget buzz now returns a promise \ No newline at end of file + messages widget buzz now returns a promise +0.51: Emit "message events" \ No newline at end of file diff --git a/apps/messages/README.md b/apps/messages/README.md index 2e583d1c2..0ef783188 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -56,6 +56,19 @@ _2. What the notify icon looks like (it's touchable on Bangle.js2!)_ ![](screenshot-notify.gif) +## Events (for app/widget developers) + +When a new message arrives, a `"message"` event is emitted, you can listen for +it like this: + +```js +myMessageListener = Bangle.on("message", (type, message)=>{ + // is one of "text", "call", "alarm", "map", or "music" + // see `messages/lib.js` for possible formats + E.showMessage(`${message.title}\n${message.body}`, `${message.t} ${type} message`); +}); +``` + ## Requests diff --git a/apps/messages/lib.js b/apps/messages/lib.js index 50e14a07b..3e8ff64dd 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -8,7 +8,7 @@ function openMusic() { /* Push a new message onto messages queue, event is: {t:"add",id:int, src,title,subject,body,sender,tel, important:bool, new:bool} {t:"add",id:int, id:"music", state, artist, track, etc} // add new - {t:"remove-",id:int} // remove + {t:"remove",id:int} // remove {t:"modify",id:int, title:string} // modified */ exports.pushMessage = function(event) { @@ -31,11 +31,18 @@ exports.pushMessage = function(event) { else Object.assign(messages[mIdx], event); if (event.id=="music" && messages[mIdx].state=="play") { messages[mIdx].new = true; // new track, or playback (re)started + type = 'music'; } } require("Storage").writeJSON("messages.json",messages); + var message = mIdx<0 ? {id:event.id, t:'remove'} : messages[mIdx]; // if in app, process immediately - if ("undefined"!= typeof MESSAGES) return onMessagesModified(mIdx<0 ? {id:event.id} : messages[mIdx]); + if ("undefined"!=typeof MESSAGES) return onMessagesModified(message); + // emit message event + var type = 'text'; + if (["call", "music", "map"].includes(message.id)) type = message.id; + if (message.src && message.src.toLowerCase().startsWith("alarm")) type = "alarm"; + Bangle.emit("message", type, message); // update the widget icons shown if (global.WIDGETS && WIDGETS.messages) WIDGETS.messages.update(messages,true); // if no new messages now, make sure we don't load the messages app diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index da2e0945a..057a95026 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.50", + "version": "0.51", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", From 3994869df132d09198390522b575121f4bab9a79 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sat, 24 Sep 2022 15:50:20 +0200 Subject: [PATCH 11/25] messages: setting to hide widget In case users want to use a custom widget --- apps/messages/ChangeLog | 3 ++- apps/messages/README.md | 2 +- apps/messages/settings.js | 3 ++- apps/messages/widget.js | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 0b3cb276d..06704d22f 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -67,4 +67,5 @@ Option to disable auto-open of messages Option to make message icons monochrome (not colored) messages widget buzz now returns a promise -0.51: Emit "message events" \ No newline at end of file +0.51: Emit "message events" + Setting to hide widget \ No newline at end of file diff --git a/apps/messages/README.md b/apps/messages/README.md index 0ef783188..1ae53e63c 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -25,7 +25,7 @@ it starts getting clipped. * `Auto-Open Music` - Should the app automatically open when the phone starts playing music? * `Unlock Watch` - Should the app unlock the watch when a new message arrives, so you can touch the buttons at the bottom of the app? * `Flash Icon` - Toggle flashing of the widget icon. -* `Widget messages` - The maximum amount of message icons to show on the widget. +* `Widget messages` - The maximum amount of message icons to show on the widget, or `Hide` the widget completely. ## New Messages diff --git a/apps/messages/settings.js b/apps/messages/settings.js index 0edb17797..09c9db455 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -73,7 +73,8 @@ }, /*LANG*/'Widget messages': { value:0|settings().maxMessages, - min: 1, max: 5, + min: 0, max: 5, + format: v => v ? v :/*LANG*/"Hide", onchange: v => updateSetting("maxMessages", v) }, /*LANG*/'Icon color mode': { diff --git a/apps/messages/widget.js b/apps/messages/widget.js index a5e1f8b6c..f871918d3 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,4 +1,5 @@ (() => { +if ((require('Storage').readJSON("messages.settings.json", true) || {}).maxMessages===0) return; function filterMessages(msgs) { return msgs.filter(msg => msg.new && msg.id != "music") From dc6839a67b927e407fc37be4b6481af8ba087849 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sat, 24 Sep 2022 16:17:21 +0200 Subject: [PATCH 12/25] messages: allow event handlers to prevent default app from loading --- apps/messages/ChangeLog | 3 +- apps/messages/README.md | 3 ++ apps/messages/lib.js | 81 ++++++++++++++++++++++------------------- 3 files changed, 48 insertions(+), 39 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 06704d22f..4a81c3237 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -68,4 +68,5 @@ Option to make message icons monochrome (not colored) messages widget buzz now returns a promise 0.51: Emit "message events" - Setting to hide widget \ No newline at end of file + Setting to hide widget + Add custom event handlers to prevent default app form loading \ No newline at end of file diff --git a/apps/messages/README.md b/apps/messages/README.md index 1ae53e63c..0ccef2998 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -63,9 +63,12 @@ it like this: ```js myMessageListener = Bangle.on("message", (type, message)=>{ + if (message.handled) return; // another app already handled this message // is one of "text", "call", "alarm", "map", or "music" // see `messages/lib.js` for possible formats E.showMessage(`${message.title}\n${message.body}`, `${message.t} ${type} message`); + // You can prevent the default `message` app from loading by setting `message.handled = true`: + message.handled = true; }); ``` diff --git a/apps/messages/lib.js b/apps/messages/lib.js index 3e8ff64dd..b842e7459 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -45,46 +45,51 @@ exports.pushMessage = function(event) { Bangle.emit("message", type, message); // update the widget icons shown if (global.WIDGETS && WIDGETS.messages) WIDGETS.messages.update(messages,true); + var handleMessage = () => { // if no new messages now, make sure we don't load the messages app - if (event.t=="remove" && exports.messageTimeout && !messages.some(m=>m.new)) { - clearTimeout(exports.messageTimeout); - delete exports.messageTimeout; - } - // ok, saved now - if (event.id=="music" && Bangle.CLOCK && messages[mIdx].new && openMusic()) { - // just load the app to display music: no buzzing - load("messages.app.js"); - } else if (event.t!="add") { - // we only care if it's new - return; - } else if(event.new == false) { - return; - } - // otherwise load messages/show widget - var loadMessages = Bangle.CLOCK || event.important; - var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; - var appSettings = require('Storage').readJSON('messages.settings.json',1)||{}; - var unlockWatch = appSettings.unlockWatch; - // don't auto-open messages in quiet mode if quietNoAutOpn is true - if((quiet && appSettings.quietNoAutOpn) || appSettings.noAutOpn) - loadMessages = false; - delete appSettings; - // after a delay load the app, to ensure we have all the messages - if (exports.messageTimeout) clearTimeout(exports.messageTimeout); - exports.messageTimeout = setTimeout(function() { - exports.messageTimeout = undefined; - // if we're in a clock or it's important, go straight to messages app - if (loadMessages){ - if(!quiet && unlockWatch){ - Bangle.setLocked(false); - Bangle.setLCDPower(1); // turn screen on - } - // we will buzz when we enter the messages app - return load("messages.new.js"); + if (event.t=="remove" && exports.messageTimeout && !messages.some(m => m.new)) { + clearTimeout(exports.messageTimeout); + delete exports.messageTimeout; } - if (!quiet && (!global.WIDGETS || !WIDGETS.messages)) return Bangle.buzz(); // no widgets - just buzz once to let someone know - if (global.WIDGETS && WIDGETS.messages) WIDGETS.messages.update(messages); - }, 500); + // ok, saved now + if (event.id=="music" && Bangle.CLOCK && messages[mIdx].new && openMusic()) { + // just load the app to display music: no buzzing + load("messages.app.js"); + } else if (event.t!="add") { + // we only care if it's new + return; + } else if (event.new==false) { + return; + } + // otherwise load messages/show widget + var loadMessages = Bangle.CLOCK || event.important; + var quiet = (require('Storage').readJSON('setting.json', 1) || {}).quiet; + var appSettings = require('Storage').readJSON('messages.settings.json', 1) || {}; + var unlockWatch = appSettings.unlockWatch; + // don't auto-open messages in quiet mode if quietNoAutOpn is true + if ((quiet && appSettings.quietNoAutOpn) || appSettings.noAutOpn) + loadMessages = false; + delete appSettings; + // after a delay load the app, to ensure we have all the messages + if (exports.messageTimeout) clearTimeout(exports.messageTimeout); + exports.messageTimeout = setTimeout(function() { + exports.messageTimeout = undefined; + // if we're in a clock or it's important, go straight to messages app + if (loadMessages) { + if (!quiet && unlockWatch) { + Bangle.setLocked(false); + Bangle.setLCDPower(1); // turn screen on + } + // we will buzz when we enter the messages app + return load("messages.new.js"); + } + if (!quiet && (!global.WIDGETS || !WIDGETS.messages)) return Bangle.buzz(); // no widgets - just buzz once to let someone know + if (global.WIDGETS && WIDGETS.messages) WIDGETS.messages.update(messages); + }, 500); + }; + setTimeout(()=>{ + if (!message.handled) handleMessage(); + },0); } /// Remove all messages exports.clearAll = function(event) { From 29fc8f4d1a5fde9938f633dd06d6516217d1043b Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sat, 24 Sep 2022 16:46:59 +0200 Subject: [PATCH 13/25] messages: move buzz from widget to library --- apps/messages/ChangeLog | 3 ++- apps/messages/app.js | 7 +++---- apps/messages/lib.js | 41 ++++++++++++++++++++++++++++++++++++++++- apps/messages/widget.js | 37 +++++-------------------------------- 4 files changed, 50 insertions(+), 38 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 4a81c3237..da3b3ab5c 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -69,4 +69,5 @@ messages widget buzz now returns a promise 0.51: Emit "message events" Setting to hide widget - Add custom event handlers to prevent default app form loading \ No newline at end of file + Add custom event handlers to prevent default app form loading + Move WIDGETS.messages.buzz() to require("messages").buzz() \ No newline at end of file diff --git a/apps/messages/app.js b/apps/messages/app.js index 40dff9635..20fa8aaa3 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -54,8 +54,7 @@ var onMessagesModified = function(msg) { // TODO: if new, show this new one if (msg && msg.id!=="music" && msg.new && active!="map" && !((require('Storage').readJSON('setting.json', 1) || {}).quiet)) { - if (WIDGETS["messages"]) WIDGETS["messages"].buzz(msg.src); - else Bangle.buzz(); + require("messages").buzz(msg.src); } if (msg && msg.id=="music") { if (msg.state && msg.state!="play") openMusic = false; // no longer playing music to go back to @@ -356,13 +355,13 @@ function checkMessages(options) { // If we have a new message, show it if (options.showMsgIfUnread && newMessages.length) { showMessage(newMessages[0].id); - // buzz after showMessage, so beingbusy during layout doesn't affect the buzz pattern + // buzz after showMessage, so being busy during layout doesn't affect the buzz pattern if (global.BUZZ_ON_NEW_MESSAGE) { // this is set if we entered the messages app by loading `messages.new.js` // ... but only buzz the first time we view a new message global.BUZZ_ON_NEW_MESSAGE = false; // messages.buzz respects quiet mode - no need to check here - WIDGETS.messages.buzz(newMessages[0].src); + require("messages").buzz(newMessages[0].src); } return; } diff --git a/apps/messages/lib.js b/apps/messages/lib.js index b842e7459..42d6c8586 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -83,8 +83,8 @@ exports.pushMessage = function(event) { // we will buzz when we enter the messages app return load("messages.new.js"); } - if (!quiet && (!global.WIDGETS || !WIDGETS.messages)) return Bangle.buzz(); // no widgets - just buzz once to let someone know if (global.WIDGETS && WIDGETS.messages) WIDGETS.messages.update(messages); + exports.buzz(message.src); }, 500); }; setTimeout(()=>{ @@ -134,6 +134,45 @@ exports.getMessages = function() { } }; +/** + * Start buzzing for new message + * @param {string} msgSrc Message src to buzz for + * @return {Promise} Resolves when initial buzz finishes (there might be repeat buzzes later) + */ +exports.buzz = function(msgSrc) { + exports.stopBuzz(); // cancel any previous buzz timeouts + if ((require('Storage').readJSON('setting.json',1)||{}).quiet) return Promise.resolve(); // never buzz during Quiet Mode + + var pattern; + if (msgSrc && msgSrc.toLowerCase() === "phone") { + // special vibration pattern for incoming calls + pattern = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrateCalls; + } else { + pattern = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrate; + } + if (pattern === undefined) { pattern = ":"; } // pattern may be "", so we can't use || ":" here + if (!pattern) return Promise.resolve(); + + var repeat = (require('Storage').readJSON("messages.settings.json", true) || {}).repeat; + if (repeat===undefined) repeat=4; // repeat may be zero + if (repeat) { + exports.buzzTimeout = setTimeout(()=>require("buzz").pattern(pattern), repeat*1000); + var vibrateTimeout = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrateTimeout; + if (vibrateTimeout===undefined) vibrateTimeout=60; + if (vibrateTimeout && !exports.stopTimeout) exports.stopTimeout = setTimeout(exports.stopTimeout, vibrateTimeout*1000); + } + return require("buzz").pattern(pattern); +}; +/** + * Stop buzzing + */ +exports.stopBuzz = function() { + if (exports.buzzTimeout) clearTimeout(exports.buzzTimeout); + delete exports.buzzTimeout; + if (exports.stopTimeout) clearTimeout(exports.stopTimeout); + delete exports.stopTimeout; +}; + exports.getMessageImage = function(msg) { /* * icons should be 24x24px or less with 1bpp colors and 'Transparency to Color' diff --git a/apps/messages/widget.js b/apps/messages/widget.js index f871918d3..c8d132f82 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -15,15 +15,14 @@ WIDGETS["messages"]={area:"tl", width:0, draw:function(recall) { } Bangle.removeListener('touch', this.touch); if (!this.width) return; - var c = (Date.now()-this.t)/1000; - let settings = Object.assign({flash:true, maxMessages:3, repeat:4, vibrateTimeout:60},require('Storage').readJSON("messages.settings.json", true) || {}); + let settings = Object.assign({flash:true, maxMessages:3},require('Storage').readJSON("messages.settings.json", true) || {}); if (recall !== true || settings.flash) { var msgsShown = E.clip(this.msgs.length, 0, settings.maxMessages); g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+23); for(let i = 0;i < msgsShown;i++) { const msg = this.msgs[i]; const colors = [g.theme.bg, g.setColor(require("messages").getMessageImageCol(msg)).getColor()]; - if (settings.flash && (c&1)) { + if (settings.flash && ((Date.now()/1000)&1)) { if (colors[1] == g.theme.fg) { colors.reverse(); } else { @@ -36,38 +35,13 @@ WIDGETS["messages"]={area:"tl", width:0, draw:function(recall) { this.x + 12 + i * 24, this.y + 12, {rotate:0/*force centering*/}); } } - if (csettings.repeat*1000) { // the period between vibrations - this.l = Date.now(); - WIDGETS["messages"].buzz(); // buzz every 4 seconds - } WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(true), 1000); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); -},update:function(rawMsgs, quiet) { +},update:function(rawMsgs) { const settings = Object.assign({maxMessages:3},require('Storage').readJSON("messages.settings.json", true) || {}); this.msgs = filterMessages(rawMsgs); - if (this.msgs.length === 0) { - delete this.t; - delete this.l; - } else { - this.t=Date.now(); // first time - this.l=Date.now()-10000; // last buzz - if (quiet) this.t -= 500000; // if quiet, set last time in the past so there is no buzzing - } this.width = 24 * E.clip(this.msgs.length, 0, settings.maxMessages); Bangle.drawWidgets(); -},buzz:function(msgSrc) { // return a promise - if ((require('Storage').readJSON('setting.json',1)||{}).quiet) return Promise.resolve(); // never buzz during Quiet Mode - var pattern; - if (msgSrc != undefined && msgSrc.toLowerCase() == "phone") { - // special vibration pattern for incoming calls - pattern = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrateCalls; - } else { - pattern = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrate; - } - if (pattern === undefined) { pattern = ":"; } // pattern may be "", so we can't use || ":" here - return require("buzz").pattern(pattern); },touch:function(b,c) { var w=WIDGETS["messages"]; if (!w||!w.width||c.xw.x+w.width||c.yw.y+24) return; @@ -75,8 +49,7 @@ WIDGETS["messages"]={area:"tl", width:0, draw:function(recall) { }}; /* We might have returned here if we were in the Messages app for a -message but then the watch was never viewed. In that case we don't -want to buzz but should still show that there are unread messages. */ +message but then the watch was never viewed. */ if (global.MESSAGES===undefined) - WIDGETS["messages"].update(require("messages").getMessages(), true); + WIDGETS["messages"].update(require("messages").getMessages()); })(); From 6f27a65143c70dd522e0ad84e97c379d650ba5a9 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sat, 24 Sep 2022 17:08:58 +0200 Subject: [PATCH 14/25] messages: also emit "clearAll" message events --- apps/messages/README.md | 6 ++++-- apps/messages/lib.js | 22 +++++++++++----------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/apps/messages/README.md b/apps/messages/README.md index 0ccef2998..72a989146 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -64,8 +64,10 @@ it like this: ```js myMessageListener = Bangle.on("message", (type, message)=>{ if (message.handled) return; // another app already handled this message - // is one of "text", "call", "alarm", "map", or "music" - // see `messages/lib.js` for possible formats + // is one of "text", "call", "alarm", "map", "music", or "clearAll" + if (type === "clearAll") return; // not a message + // see `messages/lib.js` for possible formats + // message.t could be "add", "modify" or "remove" E.showMessage(`${message.title}\n${message.body}`, `${message.t} ${type} message`); // You can prevent the default `message` app from loading by setting `message.handled = true`: message.handled = true; diff --git a/apps/messages/lib.js b/apps/messages/lib.js index 42d6c8586..ed71ec04b 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -92,20 +92,20 @@ exports.pushMessage = function(event) { },0); } /// Remove all messages -exports.clearAll = function(event) { - var messages, inApp = "undefined"!=typeof MESSAGES; - if (inApp) { +exports.clearAll = function() { + if ("undefined"!= typeof MESSAGES) { // we're in a messages app, clear that as well MESSAGES = []; - messages = MESSAGES; // we're in an app that has already loaded messages - } else // no app - empty messages - messages = []; - // Save all messages - require("Storage").writeJSON("messages.json",messages); - // update app if in app - if (inApp) return onMessagesModified(); + } + // Clear all messages + require("Storage").writeJSON("messages.json", []); // if we have a widget, update it if (global.WIDGETS && WIDGETS.messages) - WIDGETS.messages.update(messages); + WIDGETS.messages.update([]); + // let message listeners know + Bangle.emit("message", "clearAll", {}); // guarantee listeners an object as `message` + // clearAll cannot be marked as "handled" + // update app if in app + if ("function"== typeof onMessagesModified) onMessagesModified(); } /** From b114677e5e0c4e7fd9155d0d3680f13759386158 Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Sat, 24 Sep 2022 17:08:57 -0400 Subject: [PATCH 15/25] Add Power Save --- apps/powersave/README.md | 27 +++++++++++++++++++++++++++ apps/powersave/boot.js | 15 +++++++++++++++ apps/powersave/metadata.json | 15 +++++++++++++++ apps/powersave/screen.js | 7 +++++++ 4 files changed, 64 insertions(+) create mode 100644 apps/powersave/README.md create mode 100644 apps/powersave/boot.js create mode 100644 apps/powersave/metadata.json create mode 100644 apps/powersave/screen.js diff --git a/apps/powersave/README.md b/apps/powersave/README.md new file mode 100644 index 000000000..5be5e32b5 --- /dev/null +++ b/apps/powersave/README.md @@ -0,0 +1,27 @@ +# Power Saver + +Save your watch's battery power by halting foreground app execution while the screen is off. + +## Features +- Stops foreground app processes +- Background processes still run +- Clears screen +- Decreases accelerometer polls +- Foreground app is returned to when screen is turned back on (app state is not preserved) + +## Controls +- Automatically activates when screen times out, timing can be adjusted using normal timeout settings +- Deactivates when screen is turned back on + +## Warnings +- Due to an Espruino bug, this does not take affect immediately when installed. Switch apps for these features to take affect. +- This is not compatible with apps that need to run in the foreground even while the screen is off, such as most stopwatch apps and some health trackers. +- If you check your watch super often (like multiple times per minute), this may end of costing you more power than it saves since the app you are using will have to restart everytime you check it. + +## Requests + +[Contact information is on my website](https://kyleplo.com/#contact) + +## Creator + +[kyleplo](https://kyleplo.com) \ No newline at end of file diff --git a/apps/powersave/boot.js b/apps/powersave/boot.js new file mode 100644 index 000000000..d170e9d59 --- /dev/null +++ b/apps/powersave/boot.js @@ -0,0 +1,15 @@ +var Storage = Storage || require("Storage"); +Bangle.on("lock", locked => { + if(locked){ + g.clear().reset(); + Bangle.setLCDBrightness(0); + Bangle.setPollInterval(1000); + load("powersave.screen.js"); + }else{ + load(Storage.read("resumeaftersleep") || JSON.parse(Storage.read("setting.json")).clock); + } +}); +E.on("init", () => { + if(__FILE__ && __FILE__ !== "powersave.screen.js") + Storage.write("resumeaftersleep", __FILE__); +}); \ No newline at end of file diff --git a/apps/powersave/metadata.json b/apps/powersave/metadata.json new file mode 100644 index 000000000..50603b2c2 --- /dev/null +++ b/apps/powersave/metadata.json @@ -0,0 +1,15 @@ +{ + "id": "powersave", + "name": "Power Save", + "version": "0.01", + "description": "Halts foreground app execution while screen is off while still allowing background processes.", + "readme": "README.md", + "icon": "powersave.png", + "type": "bootloader", + "tags": "tool", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"powersave.boot.js","url":"boot.js"}, + {"name":"powersave.screen.js","url":"boot.js"} + ] +} \ No newline at end of file diff --git a/apps/powersave/screen.js b/apps/powersave/screen.js new file mode 100644 index 000000000..f987f0bbb --- /dev/null +++ b/apps/powersave/screen.js @@ -0,0 +1,7 @@ +var Storage = Storage || require("Storage"); +g.clear(); +Bangle.setLCDBrightness(0); +Bangle.setPollInterval(1000); +if(!Bangle.isLocked()){ + load(Storage.read("resumeaftersleep") || JSON.parse(Storage.read("setting.json")).clock); +} \ No newline at end of file From a65e1d7bcc9b40c6b37d635e97d5d29244df3d01 Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Sat, 24 Sep 2022 17:14:00 -0400 Subject: [PATCH 16/25] Whoops - Add icon --- apps/powersave/powersave.png | Bin 0 -> 1429 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/powersave/powersave.png diff --git a/apps/powersave/powersave.png b/apps/powersave/powersave.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0399b7304b895a18550bc00f5e8ff47ebe2051 GIT binary patch literal 1429 zcmV;G1#0?S(!3U%9 z3K302Vzl95ySrsOGu;*yN_S=oEuj}{E$wXS&P-`JerMY*)Bl`l_srC!CjOIuww*oS zcYbGP&YbVe*3|s3aVaLdLNV-jQ!VUr{BF*x!E_!_4X0Bz-8b>OIjxo!HeWHEodnNR z-Ra49vrDnfoR!vAx>hrsrZPOY>AZq%=BzYhBu4OE6?nt3vnSY9*ltcr)9rNxT=c+` z?QgMNSXsGMi&)FD`FMO*q_o*<33zxayu%s|=N@buB$iKJSgc=hiYh{zq4`vb{ z6f=qMtxTesJV0hvI<^$!BCD}bT1~L05uQ(8#@Kn-9#zaHekf*=C(D2{_|$>ql^7pM zYQesNVEcUV61NYX>CX@}z%Ir{5?`PQ^oSpP+%zY)VvI<11@0HX`aGCUbYg5Isk-|m zLVKNSb8f;IkyvWY#RNEnz&@vwhcGs@6y1Fsfx$x3oQwfi|687+;MDGzZ`##dLBrpX7X=VEd}|9b*>| zSho)}z>491jyXhPxmA}?-Sg65Hu)*RHj!;S^L(AaIB88(nm*7V)77fS96=(;4utl) zKec=b#z;%i?Hvd?gL^SYkgRlkCqjEYa4;6b7-`YMr3oOXb*_ai!aO1k)Fsy zT8A-Gnz;XM1f0p5>2APWBGElQ&&tI65xg>hbmB3Lky74tZbZ0hO!d-Nm@7zBsC|Lp z6{iy~V0$UaPT+HP|K?W@^NBfMa_f<&PE1n}Iuv8|LQ-mW27)mC)pKFldnF&lqc0MC5@+e&F- z)9wSS)>N7P!Qa$jUKD@hK(J>g!OL$Xvhj^WsTH?jTPZ1KX$eAw@OzkdQUtq;Jc?(Y zs?P_pZDu-Rg7YD{!j*uC7!&i@p~QQlmK%rw#`YAgcA>_m&6H+wdg+e^}L> zU+D8iwbi*986t~zT+1l=351B^e4&@NkSke_veoyUI{xz&-M;oW<+;e$CbD9BAvPIh=rMz_zy)oxWoiP!%8jRbZ0lPdc0 zuL>VITsQf5uV&c06~o@b%NgwJUl$(?U!>@gzsg@X5>STRP9F3CpXJ90Ql-!R Date: Sun, 25 Sep 2022 14:36:53 -0700 Subject: [PATCH 17/25] dont buzz on sunday --- apps/twenties/boot.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/twenties/boot.js b/apps/twenties/boot.js index 180f4cbb7..722af43bc 100644 --- a/apps/twenties/boot.js +++ b/apps/twenties/boot.js @@ -2,12 +2,13 @@ const move = 20 * 60 * 1000; // 20 minutes const look = 20 * 1000; // 20 seconds - buzz = _ => { + const buzz = _ => { const date = new Date(); const day = date.getDay(); const hour = date.getHours(); // buzz at work - if (day <= 5 && hour >= 8 && hour <= 17) { + if (day >= 1 && day <= 5 && + hour >= 8 && hour <= 17) { Bangle.buzz().then(_ => { setTimeout(Bangle.buzz, look); }); @@ -15,4 +16,4 @@ }; setInterval(buzz, move); // buzz to stand / sit -})(); \ No newline at end of file +})(); From a90b58bc0d67e0b6729d037cde07ee21f175bf31 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Mon, 26 Sep 2022 16:01:23 +0100 Subject: [PATCH 18/25] Implementing locale fix --- apps/bigdclock/ChangeLog | 2 +- apps/bigdclock/bigdclock.app.js | 13 ++----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/apps/bigdclock/ChangeLog b/apps/bigdclock/ChangeLog index e9791dab8..98b232467 100644 --- a/apps/bigdclock/ChangeLog +++ b/apps/bigdclock/ChangeLog @@ -4,4 +4,4 @@ 0.04: bug fix 0.05: proper fix for the race condition in queueDraw() 0.06: Tell clock widgets to hide. -0.07: Better battery graphic - now has green, yellow and red sections; battery status reflected in the bar across the middle of the screen; better handling of locale +0.07: Better battery graphic - now has green, yellow and red sections; battery status reflected in the bar across the middle of the screen; better handling of locale; current battery state checked only once every 15 minutes, leading to longer-lasting battery charge diff --git a/apps/bigdclock/bigdclock.app.js b/apps/bigdclock/bigdclock.app.js index 2f8b7cd4d..a8e2b38df 100644 --- a/apps/bigdclock/bigdclock.app.js +++ b/apps/bigdclock/bigdclock.app.js @@ -28,17 +28,8 @@ function draw() { m = date.getMinutes(); var d = date.getDate(); var is12Hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"]; - var dow; - - try { - dow = require("locale").dow(date,1); - } catch (e) { - try { - dow = require("date_utils").dows(0,1)[date.getDay()]; - } catch (e) { - dow = ["SU","MO","TU","WE","TH","FR","SA"][date.getDay()]; - } - } + var dow = require("date_utils").dows(0,1)[date.getDay()]; + if ((date.getTime() >= lastBattCheck + 15*60000) || Bangle.isCharging()) { lastBattcheck = date.getTime(); width = E.getBattery(); From 43c522565e0bf1cf7cac1985714a92a7268abbce Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Mon, 26 Sep 2022 16:18:46 +0100 Subject: [PATCH 19/25] Update ChangeLog Removing unnecessary note about locale! --- apps/bigdclock/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bigdclock/ChangeLog b/apps/bigdclock/ChangeLog index 98b232467..c92d139bb 100644 --- a/apps/bigdclock/ChangeLog +++ b/apps/bigdclock/ChangeLog @@ -4,4 +4,4 @@ 0.04: bug fix 0.05: proper fix for the race condition in queueDraw() 0.06: Tell clock widgets to hide. -0.07: Better battery graphic - now has green, yellow and red sections; battery status reflected in the bar across the middle of the screen; better handling of locale; current battery state checked only once every 15 minutes, leading to longer-lasting battery charge +0.07: Better battery graphic - now has green, yellow and red sections; battery status reflected in the bar across the middle of the screen; current battery state checked only once every 15 minutes, leading to longer-lasting battery charge From 397908afcd060ee7d22f0991d20934f72719a4b7 Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Mon, 26 Sep 2022 19:13:42 -0400 Subject: [PATCH 20/25] [Power Saver] Remove accelerometer interval adjustment, fix bugs --- apps/powersave/ChangeLog | 2 ++ apps/powersave/README.md | 2 -- apps/powersave/boot.js | 12 ++++++------ apps/powersave/metadata.json | 5 ++++- apps/powersave/screen.js | 6 +++--- 5 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 apps/powersave/ChangeLog diff --git a/apps/powersave/ChangeLog b/apps/powersave/ChangeLog new file mode 100644 index 000000000..a0e6da646 --- /dev/null +++ b/apps/powersave/ChangeLog @@ -0,0 +1,2 @@ +0.01: Initial release +0.02: Removed accelerometer poll interval adjustment, fixed a few issues with detecting the current app \ No newline at end of file diff --git a/apps/powersave/README.md b/apps/powersave/README.md index 5be5e32b5..51ba044e1 100644 --- a/apps/powersave/README.md +++ b/apps/powersave/README.md @@ -6,7 +6,6 @@ Save your watch's battery power by halting foreground app execution while the sc - Stops foreground app processes - Background processes still run - Clears screen -- Decreases accelerometer polls - Foreground app is returned to when screen is turned back on (app state is not preserved) ## Controls @@ -14,7 +13,6 @@ Save your watch's battery power by halting foreground app execution while the sc - Deactivates when screen is turned back on ## Warnings -- Due to an Espruino bug, this does not take affect immediately when installed. Switch apps for these features to take affect. - This is not compatible with apps that need to run in the foreground even while the screen is off, such as most stopwatch apps and some health trackers. - If you check your watch super often (like multiple times per minute), this may end of costing you more power than it saves since the app you are using will have to restart everytime you check it. diff --git a/apps/powersave/boot.js b/apps/powersave/boot.js index d170e9d59..b8c2c3f78 100644 --- a/apps/powersave/boot.js +++ b/apps/powersave/boot.js @@ -1,15 +1,15 @@ var Storage = Storage || require("Storage"); Bangle.on("lock", locked => { if(locked){ - g.clear().reset(); - Bangle.setLCDBrightness(0); - Bangle.setPollInterval(1000); load("powersave.screen.js"); }else{ - load(Storage.read("resumeaftersleep") || JSON.parse(Storage.read("setting.json")).clock); + const data = JSON.parse(Storage.read("powersave.json") || Storage.read("setting.json")); + load(data.app || data.clock); } }); E.on("init", () => { - if(__FILE__ && __FILE__ !== "powersave.screen.js") - Storage.write("resumeaftersleep", __FILE__); + if("__FILE__" in global && __FILE__ !== "powersave.screen.js") + Storage.write("powersave.json", { + app: __FILE__ + }); }); \ No newline at end of file diff --git a/apps/powersave/metadata.json b/apps/powersave/metadata.json index 50603b2c2..cb2ad9456 100644 --- a/apps/powersave/metadata.json +++ b/apps/powersave/metadata.json @@ -1,7 +1,7 @@ { "id": "powersave", "name": "Power Save", - "version": "0.01", + "version": "0.02", "description": "Halts foreground app execution while screen is off while still allowing background processes.", "readme": "README.md", "icon": "powersave.png", @@ -11,5 +11,8 @@ "storage": [ {"name":"powersave.boot.js","url":"boot.js"}, {"name":"powersave.screen.js","url":"boot.js"} + ], + "data": [ + {"name": "powersave.json"} ] } \ No newline at end of file diff --git a/apps/powersave/screen.js b/apps/powersave/screen.js index f987f0bbb..c920b205d 100644 --- a/apps/powersave/screen.js +++ b/apps/powersave/screen.js @@ -1,7 +1,7 @@ -var Storage = Storage || require("Storage"); g.clear(); Bangle.setLCDBrightness(0); -Bangle.setPollInterval(1000); if(!Bangle.isLocked()){ - load(Storage.read("resumeaftersleep") || JSON.parse(Storage.read("setting.json")).clock); + var Storage = Storage || require("Storage"); + const data = JSON.parse(Storage.read("powersave.json") || Storage.read("setting.json")); + load(data.app || data.clock); } \ No newline at end of file From b1f0b9af1bbe60cd4a792f3fa3bc460146a76c17 Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 27 Sep 2022 08:44:14 +0200 Subject: [PATCH 21/25] Do not load AGPS data on boot Increase minimum interval to 12 hours --- apps/agpsdata/ChangeLog | 2 ++ apps/agpsdata/boot.js | 7 ------- apps/agpsdata/metadata.json | 2 +- apps/agpsdata/settings.js | 2 +- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/apps/agpsdata/ChangeLog b/apps/agpsdata/ChangeLog index ae26512de..c9f074b60 100644 --- a/apps/agpsdata/ChangeLog +++ b/apps/agpsdata/ChangeLog @@ -1,2 +1,4 @@ 0.01: First, proof of concept 0.02: Load AGPS data on app start and automatically in background +0.03: Do not load AGPS data on boot + Increase minimum interval to 12 hours diff --git a/apps/agpsdata/boot.js b/apps/agpsdata/boot.js index 6415f0b52..2b1e6819c 100644 --- a/apps/agpsdata/boot.js +++ b/apps/agpsdata/boot.js @@ -16,13 +16,6 @@ } if (settings.enabled) { - let lastUpdate = settings.lastUpdate; - if (!lastUpdate || lastUpdate + settings.refresh * 1000 * 60 < Date.now()){ - if (!waiting){ - waiting = true; - require("agpsdata").pull(successCallback, errorCallback); - } - } setInterval(() => { if (!waiting && NRF.getSecurityStatus().connected){ waiting = true; diff --git a/apps/agpsdata/metadata.json b/apps/agpsdata/metadata.json index e2f818d97..1ce299532 100644 --- a/apps/agpsdata/metadata.json +++ b/apps/agpsdata/metadata.json @@ -2,7 +2,7 @@ "name": "A-GPS Data Downloader App", "shortName":"A-GPS Data", "icon": "agpsdata.png", - "version":"0.02", + "version":"0.03", "description": "Once installed, this app allows you to download assisted GPS (A-GPS) data directly to your Bangle.js **via Gadgetbridge on an Android phone** when you run the app. If you just want to upload the latest AGPS data from this app loader, please use the `Assisted GPS Update (AGPS)` app.", "tags": "boot,tool,assisted,gps,agps,http", "allow_emulator":true, diff --git a/apps/agpsdata/settings.js b/apps/agpsdata/settings.js index 80a2f3956..fc87f1bc0 100644 --- a/apps/agpsdata/settings.js +++ b/apps/agpsdata/settings.js @@ -35,7 +35,7 @@ function buildMainMenu() { }, "Refresh every" : { value : settings.refresh / 60, - min : 1, + min : 12, max : 168, step : 1, format : v => v + "h", From 83e5f681c2ac2bbfbeb8609313a4da46b95c9a01 Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Tue, 27 Sep 2022 11:19:40 -0400 Subject: [PATCH 22/25] Default to clock --- apps/powersave/boot.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/powersave/boot.js b/apps/powersave/boot.js index b8c2c3f78..5c37dcc56 100644 --- a/apps/powersave/boot.js +++ b/apps/powersave/boot.js @@ -8,8 +8,13 @@ Bangle.on("lock", locked => { } }); E.on("init", () => { - if("__FILE__" in global && __FILE__ !== "powersave.screen.js") - Storage.write("powersave.json", { - app: __FILE__ - }); + if("__FILE__" in global && __FILE__ !== "powersave.screen.js"){ + Storage.write("powersave.json", { + app: __FILE__ + }); + }else{ + Storage.write("powersave.json", { + app: null + }); + } }); \ No newline at end of file From aa6885b3156dc405e54c23a30856fdcc7f214463 Mon Sep 17 00:00:00 2001 From: Marco H Date: Wed, 28 Sep 2022 09:41:32 +0200 Subject: [PATCH 23/25] Set minimum to 6 hours --- apps/agpsdata/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/agpsdata/settings.js b/apps/agpsdata/settings.js index fc87f1bc0..64fa25330 100644 --- a/apps/agpsdata/settings.js +++ b/apps/agpsdata/settings.js @@ -35,7 +35,7 @@ function buildMainMenu() { }, "Refresh every" : { value : settings.refresh / 60, - min : 12, + min : 6, max : 168, step : 1, format : v => v + "h", From c5349441384364aa6416c5a3256b99fb16bb7d8c Mon Sep 17 00:00:00 2001 From: Marco H Date: Wed, 28 Sep 2022 09:43:34 +0200 Subject: [PATCH 24/25] Update changelog --- apps/agpsdata/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/agpsdata/ChangeLog b/apps/agpsdata/ChangeLog index c9f074b60..89844a132 100644 --- a/apps/agpsdata/ChangeLog +++ b/apps/agpsdata/ChangeLog @@ -1,4 +1,4 @@ 0.01: First, proof of concept 0.02: Load AGPS data on app start and automatically in background 0.03: Do not load AGPS data on boot - Increase minimum interval to 12 hours + Increase minimum interval to 6 hours From 1b20bb6af88b2fa4591c1f81bbb6cd996a1a32a1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 28 Sep 2022 09:15:04 +0100 Subject: [PATCH 25/25] 0.16: Bangle.http now fails immediately if there is no Bluetooth connection (fix #2152) --- apps/android/ChangeLog | 1 + apps/android/boot.js | 2 ++ apps/android/metadata.json | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/android/ChangeLog b/apps/android/ChangeLog index 0cc7aedd4..a65326941 100644 --- a/apps/android/ChangeLog +++ b/apps/android/ChangeLog @@ -13,3 +13,4 @@ 0.13: Added Bangle.http function (see Readme file for more info) 0.14: Fix timeout of http function not being cleaned up 0.15: Allow method/body/headers to be specified for `http` (needs Gadgetbridge 0.68.0b or later) +0.16: Bangle.http now fails immediately if there is no Bluetooth connection (fix #2152) diff --git a/apps/android/boot.js b/apps/android/boot.js index bc8e3032d..0d1edae99 100644 --- a/apps/android/boot.js +++ b/apps/android/boot.js @@ -139,6 +139,8 @@ // options = {id,timeout,xpath} Bangle.http = (url,options)=>{ options = options||{}; + if (!NRF.getSecurityStatus().connected) + return Promise.reject("Not connected to Bluetooth"); if (Bangle.httpRequest === undefined) Bangle.httpRequest={}; if (options.id === undefined) { diff --git a/apps/android/metadata.json b/apps/android/metadata.json index 5d1b2f561..ab340340c 100644 --- a/apps/android/metadata.json +++ b/apps/android/metadata.json @@ -2,7 +2,7 @@ "id": "android", "name": "Android Integration", "shortName": "Android", - "version": "0.15", + "version": "0.16", "description": "Display notifications/music/etc sent from the Gadgetbridge app on Android. This replaces the old 'Gadgetbridge' Bangle.js widget.", "icon": "app.png", "tags": "tool,system,messages,notifications,gadgetbridge",