diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 243037ce1..4c677f066 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -26,4 +26,4 @@ Add whitelist option (fix #78) 0.22: Move HID to BLE menu 0.23: Change max time offset to 13 for NZ summer daylight time (NZDT) -0.24: Add Quiet Mode setting +0.24: Add Quiet Mode settings diff --git a/apps/setting/boot.js b/apps/setting/boot.js index 5b556a25f..e61bed9ad 100644 --- a/apps/setting/boot.js +++ b/apps/setting/boot.js @@ -2,7 +2,13 @@ var settings = require('Storage').readJSON('setting.json', true); if (!settings) return; if (settings.options) Bangle.setOptions(settings.options); - if (settings.brightness && settings.brightness!=1) Bangle.setLCDBrightness(settings.brightness); + if (settings.quiet && settings.qmOptions) Bangle.setOptions(settings.qmOptions); + if (settings.quiet && settings.qmBrightness) { + if (settings.qmBrightness!=1) Bangle.setLCDBrightness(settings.qmBrightness); + } else { + if (settings.brightness && settings.brightness!=1) Bangle.setLCDBrightness(settings.brightness); + } + if (settings.quiet && settings.qmTimeout) Bangle.setLCDTimeout(s.qmTimeout); if (settings.passkey!==undefined && settings.passkey.length==6) NRF.setSecurity({passkey:settings.passkey, mitm:1, display:1}); if (settings.whitelist) NRF.on('connect', function(addr) { if (!settings.whitelist.includes(addr)) NRF.disconnect(); }); delete settings; diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 3373d764b..159575619 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -6,12 +6,17 @@ let settings; function updateSettings() { //storage.erase('setting.json'); // - not needed, just causes extra writes if settings were the same + if (Object.keys(settings.qmOptions).length === 0) delete settings.qmOptions; storage.write('setting.json', settings); + if (!('qmOptions' in settings)) settings.qmOptions = {}; // easier if this always exists in this file } function updateOptions() { updateSettings(); Bangle.setOptions(settings.options) + if (settings.quiet) { + Bangle.setOptions(settings.qmOptions) + } } function gToInternal(g) { @@ -49,20 +54,25 @@ function resetSettings() { twistThreshold: 819.2, twistMaxY: -800, twistTimeout: 1000 - } + }, + // Quiet Mode options: + // we only set these if we want to override the default value + // qmOptions: {}, + // qmBrightness: undefined, + // qmTimeout: undefined, }; updateSettings(); } settings = storage.readJSON('setting.json', 1); if (!settings) resetSettings(); +if (!('qmOptions' in settings)) settings.qmOptions = {}; // easier if this always exists in here const boolFormat = v => v ? "On" : "Off"; function showMainMenu() { var beepV = [false, true, "vib"]; var beepN = ["Off", "Piezo", "Vibrate"]; - var quietN = ["Off", "Alarms", "Silent"]; const mainmenu = { '': { 'title': 'Settings' }, 'Make Connectable': ()=>makeConnectable(), @@ -99,15 +109,7 @@ function showMainMenu() { } } }, - "Quiet Mode": { - value: settings.quiet | 0, - min: 0, max: 2, - format: v => quietN[v], - onchange: v => { - settings.quiet = v - updateSettings() - }, - }, + "Quiet Mode": ()=>showQuietModeMenu(), 'Locale': ()=>showLocaleMenu(), 'Select Clock': ()=>showClockMenu(), 'Set Time': ()=>showSetTimeMenu(), @@ -235,7 +237,9 @@ function showLCDMenu() { onchange: v => { settings.brightness = v || 1; updateSettings(); - Bangle.setLCDBrightness(settings.brightness); + if (!(settings.quiet && "qmBrightness" in settings)) { + Bangle.setLCDBrightness(settings.brightness); + } } }, 'LCD Timeout': { @@ -246,7 +250,9 @@ function showLCDMenu() { onchange: v => { settings.timeout = 0 | v; updateSettings(); - Bangle.setLCDTimeout(settings.timeout); + if (!(settings.quiet && "qmTimeout" in settings)) { + Bangle.setLCDTimeout(settings.timeout); + } } }, 'Wake on BTN1': { @@ -330,6 +336,104 @@ function showLCDMenu() { } return E.showMenu(lcdMenu) } +function showQuietModeMenu() { + // we always keep settings.quiet and settings.qmOptions + // other qm values are deleted when not set + const modes = ["Off", "Alarms", "Silent"]; + const qmDisabledFormat = v => v ? "Off" : "-"; + const qmMenu = { + "": {"title": "Quiet Mode"}, + "< Back": () => showMainMenu(), + "Quiet Mode": { + value: settings.quiet|0, + format: v => modes[v%3], + onchange: v => { + settings.quiet = v%3; + updateSettings(); + updateOptions(); + }, + }, + "LCD Brightness": { + value: settings.qmBrightness || 0, + min: 0, // 0 = use default + max: 1, + step: 0.1, + format: v => (v>0.05) ? v : "-", + onchange: v => { + if (v>0.05) { // prevent v=0.000000000000001 bugs + settings.qmBrightness = v; + } else { + delete settings.qmBrightness; + } + updateSettings(); + if (settings.qmBrightness) { // show result, even if not quiet right now + Bangle.setLCDBrightness(v); + } else { + Bangle.setLCDBrightness(settings.brightness); + } + }, + }, + "LCD Timeout": { + value: settings.qmTimeout || 0, + min: 0, // 0 = use default (no constant on for quiet mode) + max: 60, + step: 5, + format: v => v>1 ? v : "-", + onchange: v => { + if (v>1) { + settings.qmTimeout = v; + } else { + delete settings.qmTimeout; + } + updateSettings(); + if (settings.quiet && v>1) { + Bangle.setLCDTimeout(v); + } else { + Bangle.setLCDTimeout(settings.timeout); + } + }, + }, + // we disable wakeOn* events by overwriting them as false in qmOptions + // not disabled = not present in qmOptions at all + "Wake on FaceUp": { + value: "wakeOnFaceUp" in settings.qmOptions, + format: qmDisabledFormat, + onchange: () => { + if ("wakeOnFaceUp" in settings.qmOptions) { + delete settings.qmOptions.wakeOnFaceUp; + } else { + settings.qmOptions.wakeOnFaceUp = false; + } + updateOptions(); + }, + }, + "Wake on Touch": { + value: "wakeOnTouch" in settings.qmOptions, + format: qmDisabledFormat, + onchange: () => { + if ("wakeOnTouch" in settings.qmOptions) { + delete settings.qmOptions.wakeOnTouch; + } else { + settings.qmOptions.wakeOnTouch = false; + } + updateOptions(); + }, + }, + "Wake on Twist": { + value: "wakeOnTwist" in settings.qmOptions, + format: qmDisabledFormat, + onchange: () => { + if ("wakeOnTwist" in settings.qmOptions) { + delete settings.qmOptions.wakeOnTwist; + } else { + settings.qmOptions.wakeOnTwist = false; + } + updateOptions(); + }, + }, + }; + return E.showMenu(qmMenu); +} function showLocaleMenu() { const localemenu = {