diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 1be0dcdd5..79379fb1c 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -31,3 +31,4 @@ 0.29: Fix wrong 'dow' handling in new timer if first day of week is Monday 0.30: Fix "Enable All" 0.31: Add seconds to timers +0.32: Add option for auto-delete a timer after it expires diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 0a7bb8f24..bc0b2cf0e 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -280,6 +280,10 @@ function showEditTimerMenu(selectedTimer, timerIndex) { value: timer.on, onchange: v => timer.on = v }, + /*LANG*/"Delete After Expiration": { + value: timer.del, + onchange: v => timer.del = v + }, /*LANG*/"Vibrate": require("buzz_menu").pattern(timer.vibrate, v => timer.vibrate = v), /*LANG*/"Cancel": () => showMainMenu() }; diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 54472a12c..b2d25b77c 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.31", + "version": "0.32", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm,widget", diff --git a/apps/sched/ChangeLog b/apps/sched/ChangeLog index 5728bf734..f23cf93cb 100644 --- a/apps/sched/ChangeLog +++ b/apps/sched/ChangeLog @@ -13,3 +13,4 @@ 0.12: Update default buzz patterns to new values Improve timer message using formatDuration Fix wrong fallback for buzz pattern +0.13: Ask to delete a timer after stopping it diff --git a/apps/sched/README.md b/apps/sched/README.md index 57acdc0b7..8a7d1fc21 100644 --- a/apps/sched/README.md +++ b/apps/sched/README.md @@ -50,6 +50,7 @@ Alarms are stored in an array in `sched.json`, and take the form: hidden : false, // OPTIONAL if false, the widget should not show an icon for this alarm as : false, // auto snooze timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms + del : false, // OPTIONAL - if true, delete the timer after expiration js : "load('myapp.js')" // OPTIONAL - a JS command to execute when the alarm activates (*instead* of loading 'sched.js') // when this code is run, you're responsible for setting alarm.on=false (or removing the alarm) data : { ... } // OPTIONAL - your app can store custom data in here if needed (don't store a lot of data here) diff --git a/apps/sched/lib.js b/apps/sched/lib.js index 5089ed46c..74018dcde 100644 --- a/apps/sched/lib.js +++ b/apps/sched/lib.js @@ -66,8 +66,9 @@ exports.newDefaultAlarm = function () { var alarm = { t: 12 * 3600000, // Default to 12:00 + del: false, // Never delete an alarm when it expires on: true, - rp: settings.defaultRepeat, + rp: false, as: settings.defaultAutoSnooze, dow: 0b1111111, last: 0, @@ -84,6 +85,7 @@ exports.newDefaultTimer = function () { var timer = { timer: 5 * 60 * 1000, // 5 minutes + del: settings.defaultDeleteExpiredTimers, on: true, rp: false, as: false, @@ -103,7 +105,7 @@ exports.getSettings = function () { unlockAtBuzz: false, defaultSnoozeMillis: 600000, // 10 minutes defaultAutoSnooze: false, - defaultRepeat: false, + defaultDeleteExpiredTimers: true, // Always buzzCount: 10, buzzIntervalMillis: 3000, // 3 seconds defaultAlarmPattern: "::", diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json index c8ed3acb8..163d2f552 100644 --- a/apps/sched/metadata.json +++ b/apps/sched/metadata.json @@ -1,7 +1,7 @@ { "id": "sched", "name": "Scheduler", - "version": "0.12", + "version": "0.13", "description": "Scheduling library for alarms and timers", "icon": "app.png", "type": "scheduler", diff --git a/apps/sched/sched.js b/apps/sched/sched.js index 012e8ed35..b0fe21d91 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -6,17 +6,18 @@ if (Bangle.SCHED) { } function showAlarm(alarm) { + const alarmIndex = alarms.indexOf(alarm); const settings = require("sched").getSettings(); - let msg = ""; - msg += alarm.timer ? require("time_utils").formatDuration(alarm.timer) : require("time_utils").formatTime(alarm.t); + let message = ""; + message += alarm.timer ? require("time_utils").formatDuration(alarm.timer) : require("time_utils").formatTime(alarm.t); if (alarm.msg) { - msg += "\n"+alarm.msg; + message += "\n" + alarm.msg; } else { - if (alarm.timer) - msg = atob("ACQswgD//33vRcGHIQAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAAAP/wAAAAAAAAAP/wAAAAAAAAAqqoAPAAAAAAqqqqoP8AAAAKqqqqqv/AAACqqqqqqq/wAAKqqqlWqqvwAAqqqqlVaqrAACqqqqlVVqqAAKqqqqlVVaqgAKqaqqlVVWqgAqpWqqlVVVqoAqlWqqlVVVaoCqlV6qlVVVaqCqVVfqlVVVWqCqVVf6lVVVWqKpVVX/lVVVVqqpVVV/+VVVVqqpVVV//lVVVqqpVVVfr1VVVqqpVVVfr1VVVqqpVVVb/lVVVqqpVVVW+VVVVqqpVVVVVVVVVqiqVVVVVVVVWqCqVVVVVVVVWqCqlVVVVVVVaqAqlVVVVVVVaoAqpVVVVVVVqoAKqVVVVVVWqgAKqlVVVVVaqgACqpVVVVVqqAAAqqlVVVaqoAAAKqqVVWqqgAAACqqqqqqqAAAAAKqqqqqgAAAAAAqqqqoAAAAAAAAqqoAAAAA==")+" "+msg; - else - msg = atob("AC0swgF97///RcEpMlVVVVVVf9VVVVVVVVX/9VVf9VVf/1VVV///1Vf9VX///VVX///VWqqlV///1Vf//9aqqqqpf//9V///2qqqqqqn///V///6qqqqqqr///X//+qqoAAKqqv//3//6qoAAAAKqr//3//qqAAAAAAqq//3/+qoAADwAAKqv/3/+qgAADwAACqv/3/aqAAADwAAAqp/19qoAAADwAAAKqfV1qgAAADwAAACqXVWqgAAADwAAACqlVWqAAAADwAAAAqlVWqAAAADwAAAAqlVWqAAAADwAAAAqlVaoAAAADwAAAAKpVaoAAAADwAAAAKpVaoAAAADwAAAAKpVaoAAAAOsAAAAKpVaoAAAAOsAAAAKpVaoAAAAL/AAAAKpVaoAAAAgPwAAAKpVaoAAACAD8AAAKpVWqAAAIAA/AAAqlVWqAAAgAAPwAAqlVWqAACAAADwAAqlVWqgAIAAAAAACqlVVqgAgAAAAAACqVVVqoAAAAAAAAKqVVVaqAAAAAAAAqpVVVWqgAAAAAACqlVVVWqoAAAAAAKqlVVVVqqAAAAAAqqVVVVVaqoAAAAKqpVVVVVeqqoAAKqqtVVVVV/6qqqqqqr/VVVVX/2qqqqqqn/1VVVf/VaqqqqpV/9VVVf9VVWqqlVVf9VVVf1VVVVVVVVX9VQ==")+" "+msg; + message = (alarm.timer + ? atob("ACQswgD//33vRcGHIQAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAABVVVAAAAAAAAAP/wAAAAAAAAAP/wAAAAAAAAAqqoAPAAAAAAqqqqoP8AAAAKqqqqqv/AAACqqqqqqq/wAAKqqqlWqqvwAAqqqqlVaqrAACqqqqlVVqqAAKqqqqlVVaqgAKqaqqlVVWqgAqpWqqlVVVqoAqlWqqlVVVaoCqlV6qlVVVaqCqVVfqlVVVWqCqVVf6lVVVWqKpVVX/lVVVVqqpVVV/+VVVVqqpVVV//lVVVqqpVVVfr1VVVqqpVVVfr1VVVqqpVVVb/lVVVqqpVVVW+VVVVqqpVVVVVVVVVqiqVVVVVVVVWqCqVVVVVVVVWqCqlVVVVVVVaqAqlVVVVVVVaoAqpVVVVVVVqoAKqVVVVVVWqgAKqlVVVVVaqgACqpVVVVVqqAAAqqlVVVaqoAAAKqqVVWqqgAAACqqqqqqqAAAAAKqqqqqgAAAAAAqqqqoAAAAAAAAqqoAAAAA==") + : atob("AC0swgF97///RcEpMlVVVVVVf9VVVVVVVVX/9VVf9VVf/1VVV///1Vf9VX///VVX///VWqqlV///1Vf//9aqqqqpf//9V///2qqqqqqn///V///6qqqqqqr///X//+qqoAAKqqv//3//6qoAAAAKqr//3//qqAAAAAAqq//3/+qoAADwAAKqv/3/+qgAADwAACqv/3/aqAAADwAAAqp/19qoAAADwAAAKqfV1qgAAADwAAACqXVWqgAAADwAAACqlVWqAAAADwAAAAqlVWqAAAADwAAAAqlVWqAAAADwAAAAqlVaoAAAADwAAAAKpVaoAAAADwAAAAKpVaoAAAADwAAAAKpVaoAAAAOsAAAAKpVaoAAAAOsAAAAKpVaoAAAAL/AAAAKpVaoAAAAgPwAAAKpVaoAAACAD8AAAKpVWqAAAIAA/AAAqlVWqAAAgAAPwAAqlVWqAACAAADwAAqlVWqgAIAAAAAACqlVVqgAgAAAAAACqVVVqoAAAAAAAAKqVVVaqAAAAAAAAqpVVVWqgAAAAAACqlVVVWqoAAAAAAKqlVVVVqqAAAAAAqqVVVVVaqoAAAAKqpVVVVVeqqoAAKqqtVVVVV/6qqqqqqr/VVVVX/2qqqqqqn/1VVVf/VaqqqqpV/9VVVf9VVWqqlVVf9VVVf1VVVVVVVVX9VQ==") + ) + " " + message } Bangle.loadWidgets(); @@ -24,23 +25,37 @@ function showAlarm(alarm) { let buzzCount = settings.buzzCount; - E.showPrompt(msg,{ - title:alarm.timer ? /*LANG*/"TIMER!" : /*LANG*/"ALARM!", - buttons : {/*LANG*/"Snooze":true,/*LANG*/"Stop":false} // default is sleep so it'll come back in 10 mins - }).then(function(sleep) { + E.showPrompt(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) { buzzCount = 0; + if (sleep) { - if(alarm.ot===undefined) alarm.ot = alarm.t; + if (alarm.ot === undefined) { + alarm.ot = alarm.t; + } alarm.t += settings.defaultSnoozeMillis; } else { - if (!alarm.timer) alarm.last = (new Date()).getDate(); - if (alarm.ot!==undefined) { + let del = alarm.del === undefined ? settings.defaultDeleteExpiredTimers : alarm.del; + if (del) { + alarms.splice(alarmIndex, 1); + } else { + if (!alarm.timer) { + alarm.last = new Date().getDate(); + } + if (alarm.ot !== undefined) { alarm.t = alarm.ot; delete alarm.ot; + } + if (!alarm.rp) { + alarm.on = false; + } } - if (!alarm.rp) alarm.on = false; } - // alarm is still a member of 'alarms', so writing to array writes changes back directly + + // The updated alarm is still a member of 'alarms' + // so writing to array writes changes back directly require("sched").setAlarms(alarms); load(); }); @@ -67,7 +82,6 @@ function showAlarm(alarm) { buzz(); } -// Check for alarms let alarms = require("sched").getAlarms(); let active = require("sched").getActiveAlarms(alarms); if (active.length) { diff --git a/apps/sched/settings.js b/apps/sched/settings.js index b73cd41d1..83e4289f2 100644 --- a/apps/sched/settings.js +++ b/apps/sched/settings.js @@ -14,6 +14,14 @@ } }, + /*LANG*/"Delete Expired Timers": { + value: settings.defaultDeleteExpiredTimers, + onchange: v => { + settings.defaultDeleteExpiredTimers = v; + require("sched").setSettings(settings); + } + }, + /*LANG*/"Default Auto Snooze": { value: settings.defaultAutoSnooze, onchange: v => { @@ -34,14 +42,6 @@ } }, - /*LANG*/"Default Repeat": { - value: settings.defaultRepeat, - onchange: v => { - settings.defaultRepeat = v; - require("sched").setSettings(settings); - } - }, - /*LANG*/"Buzz Count": { value: settings.buzzCount, min: 5,