From 1a1563e6885cd1117f1e68db275ec334989341a2 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 10:28:24 -0500 Subject: [PATCH 1/8] Made pressing BTN1 stop an alarm --- apps/sched/sched.js | 88 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/apps/sched/sched.js b/apps/sched/sched.js index 04cd38718e..6c3d11f58b 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -1,5 +1,91 @@ // Chances are boot0.js got run already and scheduled *another* // 'load(sched.js)' - so let's remove it first! + +function showPromptBtnCancel(msg,options) { + if (!options) options={}; + if (!options.buttons) + options.buttons = {"Yes":true,"No":false}; + var btns = Object.keys(options.buttons); + var btnPos; + function draw(highlightedButton) { + g.reset().setFont("6x8:2").setFontAlign(0,-1); + var Y = Bangle.appRect.y; + var W = g.getWidth(), H = g.getHeight()-Y, FH=g.getFontHeight(); + var titleLines = g.wrapString(options.title, W-2); + var msgLines = g.wrapString(msg||"", W-2); + var y = Y + (H + (titleLines.length - msgLines.length)*FH )/2 - 24; + if (options.img) { + var im = g.imageMetrics(options.img); + g.drawImage(options.img,(W-im.width)/2,y - im.height/2); + y += 4+im.height/2; + } + if (titleLines) + g.setColor(g.theme.fgH).setBgColor(g.theme.bgH). + clearRect(0,Y,W-1,Y+4+titleLines.length*FH). + drawString(titleLines.join("\n"),W/2,Y+2); + g.setColor(g.theme.fg).setBgColor(g.theme.bg). + drawString(msgLines.join("\n"),W/2,y); + y += msgLines.length*FH+32; + + var buttonWidths = 0; + var buttonPadding = 24; + g.setFontAlign(0,0); + btns.forEach(btn=>buttonWidths += buttonPadding+g.stringWidth(btn)); + if (buttonWidths>W) { // if they don't fit, use smaller font + g.setFont("6x8"); + buttonWidths = 0; + btns.forEach(btn=>buttonWidths += buttonPadding+g.stringWidth(btn)); + } + var x = (W-buttonWidths)/2; + btnPos = []; + btns.forEach((btn,idx)=>{ + var w = g.stringWidth(btn); + x += (buttonPadding+w)/2; + var bw = 6+w/2; + var poly = [x-bw,y-16, + x+bw,y-16, + x+bw+4,y-12, + x+bw+4,y+12, + x+bw,y+16, + x-bw,y+16, + x-bw-4,y+12, + x-bw-4,y-12, + x-bw,y-16]; + btnPos.push({x1:x-bw-buttonPadding/2, x2:x+bw+buttonPadding/2, + y1:y-30, y2:y+30, + poly: poly}); + g.setColor(idx===highlightedButton ? g.theme.bgH : g.theme.bg2).fillPoly(poly). + setColor(idx===highlightedButton ? g.theme.fgH : g.theme.fg2).drawPoly(poly).drawString(btn,x,y+1); + x += (buttonPadding+w)/2; + }); + Bangle.setLCDPower(1); // ensure screen is on + } + g.reset().clearRect(Bangle.appRect); // clear screen + if (!msg) { + Bangle.setUI(); // remove watches + return Promise.resolve(); + } + draw(); + return new Promise(resolve=>{ + Bangle.setUI({mode:"custom", remove: options.remove, redraw: draw, back:options.back, + btn: () => { // Handle physical buttons explicitly + showPromptBtnCancel(); + resolve(options.buttons.No); + }, + touch:(_,e)=>{ + btnPos.forEach((b,i)=>{ + if (e.x > b.x1 && e.x < b.x2 && + e.y > b.y1 && e.y < b.y2) { + draw(i); // highlighted button + g.flip(); // write to screen + showPromptBtnCancel(); // remove + resolve(options.buttons[btns[i]]); + } + }); + }}); + }); +} + if (Bangle.SCHED) { clearInterval(Bangle.SCHED); delete Bangle.SCHED; @@ -25,7 +111,7 @@ function showAlarm(alarm) { let buzzCount = settings.buzzCount; - E.showPrompt(message, { + showPromptBtnCancel(message, { title: alarm.timer ? /*LANG*/"TIMER!" : /*LANG*/"ALARM!", buttons: { /*LANG*/"Snooze": true, /*LANG*/"Stop": false } // default is sleep so it'll come back in some mins }).then(function (sleep) { From 8a0e67ffec002213d00505c3b224ca99c793a6ca Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 10:30:00 -0500 Subject: [PATCH 2/8] Added setting to allow default functionality to remain --- apps/sched/lib.js | 3 ++- apps/sched/sched.js | 12 ++++++++++-- apps/sched/settings.js | 10 +++++++++- typescript/types/sched.d.ts | 1 + 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/apps/sched/lib.js b/apps/sched/lib.js index e11448a184..bb45a1f725 100644 --- a/apps/sched/lib.js +++ b/apps/sched/lib.js @@ -112,7 +112,8 @@ exports.getSettings = function () { buzzCount: 10, buzzIntervalMillis: 3000, // 3 seconds defaultAlarmPattern: "::", - defaultTimerPattern: "::" + defaultTimerPattern: "::", + btnToStop: true }, require("Storage").readJSON("sched.settings.json", true) || {} ); diff --git a/apps/sched/sched.js b/apps/sched/sched.js index 6c3d11f58b..9691c0ccca 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -86,6 +86,14 @@ function showPromptBtnCancel(msg,options) { }); } +function showCustomPrompt(message, options, btnToStop) { + if (btnToStop) { + return showPromptBtnCancel(message, options); + } else { + return E.showPrompt(message, options); + } +} + if (Bangle.SCHED) { clearInterval(Bangle.SCHED); delete Bangle.SCHED; @@ -111,10 +119,10 @@ function showAlarm(alarm) { let buzzCount = settings.buzzCount; - showPromptBtnCancel(message, { + showCustomPrompt(message, { title: alarm.timer ? /*LANG*/"TIMER!" : /*LANG*/"ALARM!", buttons: { /*LANG*/"Snooze": true, /*LANG*/"Stop": false } // default is sleep so it'll come back in some mins - }).then(function (sleep) { + }, settings.btnToStop).then(function (sleep) { buzzCount = 0; if (sleep) { diff --git a/apps/sched/settings.js b/apps/sched/settings.js index c03cd6679e..c97edfcbad 100644 --- a/apps/sched/settings.js +++ b/apps/sched/settings.js @@ -74,6 +74,14 @@ /*LANG*/"Default Timer Pattern": require("buzz_menu").pattern(settings.defaultTimerPattern, v => { settings.defaultTimerPattern = v; require("sched").setSettings(settings); - }) + }), + + /*LANG*/"BTN1 to Stop": { + value: settings.btnToStop, + onchange: v => { + settings.btnToStop = v; + require("sched").setSettings(settings); + } + } }); }) diff --git a/typescript/types/sched.d.ts b/typescript/types/sched.d.ts index 1bcffb6325..5d9ab2d064 100644 --- a/typescript/types/sched.d.ts +++ b/typescript/types/sched.d.ts @@ -93,6 +93,7 @@ declare module Sched { buzzIntervalMillis: number, defaultAlarmPattern: string, defaultTimerPattern: string, + btnToStop: boolean, }; function getAlarms(): Sched[]; From 85da7863a152458237477b3b5bb59e40d88f3903 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 10:30:16 -0500 Subject: [PATCH 3/8] Upped changelog and version number --- apps/sched/ChangeLog | 1 + apps/sched/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/sched/ChangeLog b/apps/sched/ChangeLog index eab8dd3053..019ec8467a 100644 --- a/apps/sched/ChangeLog +++ b/apps/sched/ChangeLog @@ -31,3 +31,4 @@ 0.28: Added an icon for disabled events 0.29: Improve clkinfo startup time by 10ms 0.30: Fix possible bug in toggling an alarm to on, from clkinfo +0.31: Pressing BTN1 behaves the same as pressing Stop diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json index 7e3458ae6c..8a52068c1c 100644 --- a/apps/sched/metadata.json +++ b/apps/sched/metadata.json @@ -1,7 +1,7 @@ { "id": "sched", "name": "Scheduler", - "version": "0.30", + "version": "0.31", "description": "Scheduling library for alarms and timers", "icon": "app.png", "type": "scheduler", From b9906ad0bb8398dcdf41577ffc205165b1666351 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 10:51:28 -0500 Subject: [PATCH 4/8] Checks if it's the Bangle 2 to avoid calling JS2 code on the Bangle 1 --- apps/sched/sched.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/sched/sched.js b/apps/sched/sched.js index 9691c0ccca..cdba60495a 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -87,7 +87,8 @@ function showPromptBtnCancel(msg,options) { } function showCustomPrompt(message, options, btnToStop) { - if (btnToStop) { + const BANGLEJS2 = process.env.HWVERSION==2; + if (BANGLEJS2 && btnToStop) { return showPromptBtnCancel(message, options); } else { return E.showPrompt(message, options); From 9d1cdbabc0eba026dd5f6b5f0ab6aa7f53698892 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 11:45:57 -0500 Subject: [PATCH 5/8] Hide btnToStop in non-Bangle2 settings --- apps/sched/settings.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/sched/settings.js b/apps/sched/settings.js index c97edfcbad..66d5754c07 100644 --- a/apps/sched/settings.js +++ b/apps/sched/settings.js @@ -1,7 +1,8 @@ (function (back) { let settings = require("sched").getSettings(); + const BANGLEJS2 = process.env.HWVERSION == 2; - E.showMenu({ + let menu = { "": { "title": /*LANG*/"Scheduler" }, "< Back": () => back(), @@ -70,18 +71,21 @@ settings.defaultAlarmPattern = v; require("sched").setSettings(settings); }), - /*LANG*/"Default Timer Pattern": require("buzz_menu").pattern(settings.defaultTimerPattern, v => { settings.defaultTimerPattern = v; require("sched").setSettings(settings); - }), + }) + }; - /*LANG*/"BTN1 to Stop": { + if (BANGLEJS2) { + menu[/*LANG*/"BTN1 to Stop"] = { value: settings.btnToStop, onchange: v => { settings.btnToStop = v; require("sched").setSettings(settings); } - } - }); -}) + }; + } + + E.showMenu(menu); +}); From ac54ea6b8012992e5ded07ad2111cd983ce461a5 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 11:48:31 -0500 Subject: [PATCH 6/8] btnToStop defaults to disabled This makes it so, by default, the E.showPrompt function will run. So if showPrompt ever changes, the default functionality will not break. --- apps/sched/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sched/lib.js b/apps/sched/lib.js index bb45a1f725..387e8306bb 100644 --- a/apps/sched/lib.js +++ b/apps/sched/lib.js @@ -113,7 +113,7 @@ exports.getSettings = function () { buzzIntervalMillis: 3000, // 3 seconds defaultAlarmPattern: "::", defaultTimerPattern: "::", - btnToStop: true + btnToStop: false }, require("Storage").readJSON("sched.settings.json", true) || {} ); From 8c4e9b0ab5bfb0881e4fe2c6ebd4e16831aacd84 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 11:55:51 -0500 Subject: [PATCH 7/8] Change for build failure. Change due to the error: App sched file sched.settings.js should be evaluated as a function but doesn't end in ')' --- apps/sched/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sched/settings.js b/apps/sched/settings.js index 66d5754c07..b734c26c62 100644 --- a/apps/sched/settings.js +++ b/apps/sched/settings.js @@ -88,4 +88,4 @@ } E.showMenu(menu); -}); +}) From 9a5e2b2d75f1b27b757d9f3f88d532c54b313ff8 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 22 Feb 2025 12:09:17 -0500 Subject: [PATCH 8/8] Added info of the new setting in the readme. --- apps/sched/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/sched/README.md b/apps/sched/README.md index 1216a1a11f..5546b138d1 100644 --- a/apps/sched/README.md +++ b/apps/sched/README.md @@ -20,6 +20,7 @@ Global Settings - `Buzz Count` - The number of buzzes before the watch goes silent, or "forever" to buzz until stopped. - `Buzz Interval` - The interval between one buzz and the next - `Default Alarm/Timer Pattern` - Default vibration pattern for newly created alarms/timers +- `BTN1 to Stop` - If `Yes` a button press will register the same as pressing `Stop`. Internals / Library -------------------