diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 9994d33d9..bb8a292a0 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -37,3 +37,4 @@ 0.34: Add "Confirm" option to alarm/timer edit menus 0.35: Add automatic translation of more strings 0.36: alarm widget moved out of app +0.37: add message input and dated Events diff --git a/apps/alarm/README.md b/apps/alarm/README.md index 741946b0c..0298e0836 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -1,15 +1,18 @@ # Alarms & Timers -This app allows you to add/modify any alarms and timers. +This app allows you to add/modify any alarms, timers and events. + +Optional: When a keyboard app is detected, you can add a message to display when any of these is triggered. It uses the [`sched` library](https://github.com/espruino/BangleApps/blob/master/apps/sched) to handle the alarm scheduling in an efficient way that can work alongside other apps. ## Menu overview - `New...` - - `New Alarm` → Configure a new alarm + - `New Alarm` → Configure a new alarm (triggered based on time and day of week) - `Repeat` → Select when the alarm will fire. You can select a predefined option (_Once_, _Every Day_, _Workdays_ or _Weekends_ or you can configure the days freely) - - `New Timer` → Configure a new timer + - `New Timer` → Configure a new timer (triggered based on amount of time elapsed in hours/minutes/seconds) + - `New Event` → Configure a new event (triggered based on time and date) - `Advanced` - `Scheduler settings` → Open the [Scheduler](https://github.com/espruino/BangleApps/tree/master/apps/sched) settings page, see its [README](https://github.com/espruino/BangleApps/blob/master/apps/sched/README.md) for details - `Enable All` → Enable _all_ disabled alarms & timers diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 1414c0b90..74007d04b 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -48,9 +48,10 @@ function showMainMenu() { }; alarms.forEach((e, index) => { - var label = e.timer + var label = (e.timer ? require("time_utils").formatDuration(e.timer) - : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeDOW(e)}` : ""); + : (e.date ? `${e.date.substring(5,10)} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeDOW(e)}` : "")) + ) + (e.msg ? " " + e.msg : ""); menu[label] = { value: e.on ? (e.timer ? iconTimerOn : iconAlarmOn) : (e.timer ? iconTimerOff : iconAlarmOff), onchange: () => setTimeout(e.timer ? showEditTimerMenu : showEditAlarmMenu, 10, e, index) @@ -67,11 +68,12 @@ function showNewMenu() { "": { "title": /*LANG*/"New..." }, "< Back": () => showMainMenu(), /*LANG*/"Alarm": () => showEditAlarmMenu(undefined, undefined), - /*LANG*/"Timer": () => showEditTimerMenu(undefined, undefined) + /*LANG*/"Timer": () => showEditTimerMenu(undefined, undefined), + /*LANG*/"Event": () => showEditAlarmMenu(undefined, undefined, true) }); } -function showEditAlarmMenu(selectedAlarm, alarmIndex) { +function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { var isNew = alarmIndex === undefined; var alarm = require("sched").newDefaultAlarm(); @@ -82,11 +84,16 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) { } var time = require("time_utils").decodeTime(alarm.t); + if (withDate && !alarm.date) alarm.date = new Date().toLocalISOString().slice(0,10); + var date = alarm.date ? new Date(alarm.date) : undefined; + var title = date ? (isNew ? /*LANG*/"New Event" : /*LANG*/"Edit Event") : (isNew ? /*LANG*/"New Alarm" : /*LANG*/"Edit Alarm"); + var keyboard = "textinput"; + try {keyboard = require(keyboard);} catch(e) {keyboard = null;} const menu = { - "": { "title": isNew ? /*LANG*/"New Alarm" : /*LANG*/"Edit Alarm" }, + "": { "title": title }, "< Back": () => { - prepareAlarmForSave(alarm, alarmIndex, time); + prepareAlarmForSave(alarm, alarmIndex, time, date); saveAndReload(); showMainMenu(); }, @@ -106,6 +113,36 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) { wrap: true, onchange: v => time.m = v }, + /*LANG*/"Day": { + value: date ? date.getDate() : null, + min: 1, + max: 31, + wrap: true, + onchange: v => date.setDate(v) + }, + /*LANG*/"Month": { + value: date ? date.getMonth() + 1 : null, + format: v => require("date_utils").month(v), + onchange: v => date.setMonth((v+11)%12) + }, + /*LANG*/"Year": { + value: date ? date.getFullYear() : null, + min: new Date().getFullYear(), + max: 2100, + onchange: v => date.setFullYear(v) + }, + /*LANG*/"Message": { + value: alarm.msg, + onchange: () => { + setTimeout(() => { + keyboard.input({text:alarm.msg}).then(result => { + alarm.msg = result; + prepareAlarmForSave(alarm, alarmIndex, time, date, true); + setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex, withDate); + }); + }, 100); + } + }, /*LANG*/"Enabled": { value: alarm.on, onchange: v => alarm.on = v @@ -115,8 +152,8 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) { onchange: () => setTimeout(showEditRepeatMenu, 100, alarm.rp, alarm.dow, (repeat, dow) => { alarm.rp = repeat; alarm.dow = dow; - alarm.t = require("time_utils").encodeTime(time); - setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex); + prepareAlarmForSave(alarm, alarmIndex, time, date, true); + setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex, withDate); }) }, /*LANG*/"Vibrate": require("buzz_menu").pattern(alarm.vibrate, v => alarm.vibrate = v), @@ -136,6 +173,15 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) { } }; + if (!keyboard) delete menu[/*LANG*/"Message"]; + if (alarm.date || withDate) { + delete menu[/*LANG*/"Repeat"]; + } else { + delete menu[/*LANG*/"Day"]; + delete menu[/*LANG*/"Month"]; + delete menu[/*LANG*/"Year"]; + } + if (!isNew) { menu[/*LANG*/"Delete"] = () => { E.showPrompt(/*LANG*/"Are you sure?", { title: /*LANG*/"Delete Alarm" }).then((confirm) => { @@ -145,7 +191,7 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) { showMainMenu(); } else { alarm.t = require("time_utils").encodeTime(time); - setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex); + setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex, withDate); } }); }; @@ -154,14 +200,17 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) { E.showMenu(menu); } -function prepareAlarmForSave(alarm, alarmIndex, time) { +function prepareAlarmForSave(alarm, alarmIndex, time, date, temp) { alarm.t = require("time_utils").encodeTime(time); alarm.last = alarm.t < require("time_utils").getCurrentTimeMillis() ? new Date().getDate() : 0; + if(date) alarm.date = date.toLocalISOString().slice(0,10); - if (alarmIndex === undefined) { - alarms.push(alarm); - } else { - alarms[alarmIndex] = alarm; + if(!temp) { + if (alarmIndex === undefined) { + alarms.push(alarm); + } else { + alarms[alarmIndex] = alarm; + } } } @@ -255,6 +304,8 @@ function showEditTimerMenu(selectedTimer, timerIndex) { } var time = require("time_utils").decodeTime(timer.timer); + var keyboard = "textinput"; + try {keyboard = require(keyboard);} catch(e) {keyboard = null;} const menu = { "": { "title": isNew ? /*LANG*/"New Timer" : /*LANG*/"Edit Timer" }, @@ -285,6 +336,18 @@ function showEditTimerMenu(selectedTimer, timerIndex) { wrap: true, onchange: v => time.s = v }, + /*LANG*/"Message": { + value: timer.msg, + onchange: () => { + setTimeout(() => { + keyboard.input({text:timer.msg}).then(result => { + timer.msg = result; + prepareTimerForSave(timer, timerIndex, time, true); + setTimeout(showEditTimerMenu, 10, timer, timerIndex); + }); + }, 100); + } + }, /*LANG*/"Enabled": { value: timer.on, onchange: v => timer.on = v @@ -306,6 +369,7 @@ function showEditTimerMenu(selectedTimer, timerIndex) { } }; + if (!keyboard) delete menu[/*LANG*/"Message"]; if (!isNew) { menu[/*LANG*/"Delete"] = () => { E.showPrompt(/*LANG*/"Are you sure?", { title: /*LANG*/"Delete Timer" }).then((confirm) => { @@ -324,15 +388,17 @@ function showEditTimerMenu(selectedTimer, timerIndex) { E.showMenu(menu); } -function prepareTimerForSave(timer, timerIndex, time) { +function prepareTimerForSave(timer, timerIndex, time, temp) { timer.timer = require("time_utils").encodeTime(time); timer.t = require("time_utils").getCurrentTimeMillis() + timer.timer; timer.last = 0; - if (timerIndex === undefined) { - alarms.push(timer); - } else { - alarms[timerIndex] = timer; + if (!temp) { + if (timerIndex === undefined) { + alarms.push(timer); + } else { + alarms[timerIndex] = timer; + } } } diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index dbf090774..29e71b3d9 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.36", + "version": "0.37", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm",