From d93e26be6b29d8a15974753d1325223ad8b350c4 Mon Sep 17 00:00:00 2001 From: Bryan Date: Tue, 13 Aug 2024 08:09:47 -0600 Subject: [PATCH] Refactor --- messagecenter.app.js | 329 ++++++++++++++++--------------------------- messagegui.lib.js | 8 +- 2 files changed, 127 insertions(+), 210 deletions(-) diff --git a/messagecenter.app.js b/messagecenter.app.js index a3be8ab..c5afeaa 100644 --- a/messagecenter.app.js +++ b/messagecenter.app.js @@ -1,12 +1,12 @@ //{ // let settings = require('Storage').readJSON("messages.settings.json", true) || {}; - // const settings = () => require("messagegui").settings(); + // let settings = () => require("messagegui").settings(); // let fontTiny = "6x8"; // fixed size, don't use this for important things // let fontNormal; // setFont() is also called after we close the settings screen - // const setFont = function() { - // const fontSize = settings().fontSize; + // let setFont = function() { + // let fontSize = settings().fontSize; // if (fontSize===0) // small // fontNormal = g.getFonts().includes("6x15") ? "6x15" : "6x8:2"; // else if (fontSize===2) // large @@ -24,39 +24,38 @@ let events = {}; let timeouts = {}; let cleanup = function() {}; // we don't want cleanup function to do anything until we actually need it let previous = []; -let msgIdx; +let textId; +let msgId; let call; let alarm; let map; let music; -const setActive = function(newActive) { +let setActive = function(newActive) { if (!newActive) return; if (active && !previous.includes(active) && newActive !== active) previous.push(active); active = newActive; - //console.log(previous); } -const setListener = function(event, callback) { +let setListener = function(event, callback) { if (!event || !callback) return; events[event] = callback; Bangle.on(event, events[event]); }; -const _cleanup = function() { +let _cleanup = function() { for (let e in events) if (e) Bangle.removeListener(e, events[e]); console.log(timeouts); for (let t in timeouts) clearTimeout(timeouts[t]); require("messages").stopBuzz(); require("widget_utils").show(); - Bangle.drawWidgets(); }; -const clearTimeouts = function() { +let clearTimeouts = function() { for (let t in timeouts) clearTimeout(timeouts[t]); }; -const showNoMessages = function() { +let showNoMessages = function() { g.reset().clear(); g.setFont("12x20").setFontAlign(0,0); g.drawString("No Messages!", Bangle.appRect.x + (Bangle.appRect.w / 2), Bangle.appRect.y + (Bangle.appRect.h / 2)); @@ -70,7 +69,7 @@ const showNoMessages = function() { goBack(); }; -const showMusic = function() { +let showMusic = function() { active = "music"; Bangle.setUI({ @@ -80,7 +79,7 @@ const showMusic = function() { }); }; -const showMap = function() { +let showMap = function() { active = "map"; Bangle.setUI({ @@ -90,7 +89,7 @@ const showMap = function() { }); }; -const showAlarm = function() { +let showAlarm = function() { active = "alarm"; Bangle.setUI({ @@ -100,13 +99,13 @@ const showAlarm = function() { }); }; -const showCall = function() { +let showCall = function() { if (!call) return goBack(); - const incomingImg = require("heatshrink").decompress(atob("j0ewIQNgwDCnEAh0B4EAvEOgEB+F//kP4P/+E/weAgH+g8Agf4CQMH8EYgEfEYU8AYV4AQIhBAYMD8ADBg4vBgEPzwDBj/+AYM/AYV//ADCC4X/EwQiCABo=")); - const outgoingImg = require("heatshrink").decompress(atob("j0ewIRO4ACBgeAh0Ag8AvEAh0B+F//kP4P/+E/wASB/0AjkD/EA8EH8EDgEfEwU8AYQhBgAhBFwXgAYMHGwUPzwDBj4mBgE/AYV/FQIDBC4X/EwQiCABoA==")); - const ringingImg = require("heatshrink").decompress(atob("mUywIlimAFEhgFEgYSF4AWEAIYWBAIYWBAIcAsAYBgOAgEYCwQJBBwIWBHIXAA4YSC4EGAoICCDwQ8DAQUgAQMQVtsD///AoU/AoIGCv5BBh/4gF+B4UfwF4Dgd4nAFDg8cB4P/8EA9gFC/wgBBwIzBwEDSQaOB+BzCRAM8SQSQBDAKSCTAPADwMAGoPwh4eBg+An0/SQX/jv/TwUH/wlBAAQkBADwA=")); - const leftImg = require("heatshrink").decompress(atob("mEwwJC/AAkBgEQAoUDwE4AoUHwF4AoUPgHwAoUegPgAoU8gfAAoV4DAIFC+AYBFwXgjwuD4E8FygFFCIodFFIo1FIIpNGLIowSRIiVFAH4A=")); - const rightImg = require("heatshrink").decompress(atob("mEwwJC/AAcIgGAAoUcgPAAoUegPgAoUPgHwAoUHwF4AoUD4E8AoQWBjwqD+AZBAAV4DIIFCngZBGCgFFCIodFFIo1FIIhNFLIouRRIqVFAH8AA==")); + let incomingImg = require("heatshrink").decompress(atob("j0ewIQNgwDCnEAh0B4EAvEOgEB+F//kP4P/+E/weAgH+g8Agf4CQMH8EYgEfEYU8AYV4AQIhBAYMD8ADBg4vBgEPzwDBj/+AYM/AYV//ADCC4X/EwQiCABo=")); + let outgoingImg = require("heatshrink").decompress(atob("j0ewIRO4ACBgeAh0Ag8AvEAh0B+F//kP4P/+E/wASB/0AjkD/EA8EH8EDgEfEwU8AYQhBgAhBFwXgAYMHGwUPzwDBj4mBgE/AYV/FQIDBC4X/EwQiCABoA==")); + let ringingImg = require("heatshrink").decompress(atob("mUywIlimAFEhgFEgYSF4AWEAIYWBAIYWBAIcAsAYBgOAgEYCwQJBBwIWBHIXAA4YSC4EGAoICCDwQ8DAQUgAQMQVtsD///AoU/AoIGCv5BBh/4gF+B4UfwF4Dgd4nAFDg8cB4P/8EA9gFC/wgBBwIzBwEDSQaOB+BzCRAM8SQSQBDAKSCTAPADwMAGoPwh4eBg+An0/SQX/jv/TwUH/wlBAAQkBADwA=")); + let leftImg = require("heatshrink").decompress(atob("mEwwJC/AAkBgEQAoUDwE4AoUHwF4AoUPgHwAoUegPgAoU8gfAAoV4DAIFC+AYBFwXgjwuD4E8FygFFCIodFFIo1FIIpNGLIowSRIiVFAH4A=")); + let rightImg = require("heatshrink").decompress(atob("mEwwJC/AAcIgGAAoUcgPAAoUegPgAoUPgHwAoUHwF4AoUD4E8AoQWBjwqD+AZBAAV4DIIFCngZBGCgFFCIodFFIo1FIIhNFLIouRRIqVFAH8AA==")); Bangle.setUI(); // clear from previous g.reset().clear(); msg = call; @@ -115,28 +114,27 @@ const showCall = function() { let pn = msg.number.replaceAll(/\D/, ""); // remove any non digit characters msg.title = `${pn.slice(-10, -7)}-${pn.slice(-7,-4)}-${pn.slice(-4)}`; } - const cmd = msg.cmd; + let cmd = msg.cmd; - const HeaderBox = require("messagebox").HeaderBox; - const headerBox = new HeaderBox(msg, Bangle.appRect); - const x = Bangle.appRect.x, y = Bangle.appRect.y + headerBox.h, x2 = Bangle.appRect.x2, y2 = Bangle.appRect.y2; - const mx = (x + x2) / 2; + let HeaderBox = require("messagebox").HeaderBox; + let headerBox = new HeaderBox(msg, Bangle.appRect); + let x = Bangle.appRect.x, y = Bangle.appRect.y + headerBox.h, x2 = Bangle.appRect.x2, y2 = Bangle.appRect.y2; + let mx = (x + x2) / 2; headerBox.draw(Bangle.appRect); g.reset(); - const drawAcceptArrow = function(xOffset) { + let drawAcceptArrow = function(xOffset) { xOffset = xOffset??0; imgX = x + 2 + xOffset; g.setColor(0, 1, 0); g.drawImage(rightImg, imgX, y2-50); - //if (xOffset > 0) g.fillRect(imgX+3, y2-43, x, y2-9); }; - const drawRejectArrow = function(xOffset) { + + let drawRejectArrow = function(xOffset) { xOffset = xOffset??0; let imgX = x2 - 50 - xOffset; g.setColor(1, 0.25, 0.25); g.drawImage(leftImg, imgX, y2-50); - //if (xOffset > 0) g.fillRect(imgX+45, y2-43, x2, y2-9); }; if (cmd === "end") { @@ -148,7 +146,7 @@ const showCall = function() { g.setFont("Vector:25").setFontAlign(0, -1).drawString(elapsedString, mx, y+25); g.drawString("Call Ended", mx, y); - const done = new Promise((resolve, _reject) => { + let done = new Promise((resolve, _reject) => { setTimeout(() => {resolve();}, 5000); }); done.then(goBack); @@ -165,12 +163,12 @@ const showCall = function() { startTime = parseInt(Date.now()/1000); g.setColor(g.theme.fg); g.drawImage(cmd === "start" ? incomingImg : outgoingImg, x+10, y+20); - const timer = () => { + let timer = () => { g.clearRect(mx-45, y+20, mx+70, y+50); elapsed = parseInt(Date.now()/1000) - startTime; - const h = ("0" + Math.floor((elapsed/3600)%60)).slice(-2); - const m = ("0" + Math.floor((elapsed/60)%60)).slice(-2); - const s = ("0" + Math.floor(elapsed%60)).slice(-2); + let h = ("0" + Math.floor((elapsed/3600)%60)).slice(-2); + let m = ("0" + Math.floor((elapsed/60)%60)).slice(-2); + let s = ("0" + Math.floor(elapsed%60)).slice(-2); Bangle.elapsedString = `${h}:${m}:${s}`; g.setFont("Vector:25").setFontAlign(0, -1).drawString(Bangle.elapsedString, mx + 15, y+25); timeouts["timer"] = setTimeout(timer, 1000); @@ -178,16 +176,16 @@ const showCall = function() { timer(); } - const handler = function(dir) { + let handler = function(dir) { if (cmd === "end") return; if (dir < 0) leftHandler(dir); else if (dir > 0 && cmd === "incoming") rightHandler(); }; - const leftHandler = function(dir) { + let leftHandler = function(dir) { let xOff = 0; - const animate = new Promise((resolve, _reject) => { - const swipeAnimation = () => { + let animate = new Promise((resolve, _reject) => { + let swipeAnimation = () => { xOff += 30; g.clearRect(x, y2-50, x2, y2); drawRejectArrow(xOff); @@ -203,10 +201,10 @@ const showCall = function() { }); }; - const rightHandler = function(dir) { + let rightHandler = function(dir) { let xOff = 0; - const animate = new Promise((resolve, _reject) => { - const swipeAnimation = () => { + let animate = new Promise((resolve, _reject) => { + let swipeAnimation = () => { xOff += 30; g.clearRect(x, y2-50, x2, y2); drawAcceptArrow(xOff); @@ -225,34 +223,27 @@ const showCall = function() { mode: "custom", touch: () => {if (buzzing) return require("messages").stopBuzz()}, swipe: handler, - btn: _e => goBack, + btn: goBack, remove: cleanup }); }; -const showText = function(messageNum) { +let showText = function(id) { if (!Bangle.MESSAGES.length) return goBack(); // no messages - g.reset().clear(); setBusy(); // busy until everything is set up - //let showAll = false; - if (messageNum === undefined) {messageNum = 0;} //showAll = true;} - else if (messageNum >= Bangle.MESSAGES.length - 1) messageNum = Bangle.MESSAGES.length - 1; + if (!id) id = Bangle.MESSAGES[0].id; + textId = id; // global text message index + let messageNum = Bangle.MESSAGES.findIndex(m => m.id === id); + g.reset().clear(); Bangle.setUI(); // make sure to clear setUI from anything previous let switching = false; - const MessageBox = require("messagebox").MessageBox; + let MessageBox = require("messagebox").MessageBox; require("messagebox").setOptions({fh: 20}); - const step = 42; - const delay = 30; - //const swipeThreshold = 20; + let step = 42; + let delay = 30; let mode = "scroll"; // one of "scroll", "next", "prev" (switch to next/prev message), "swipe" (swipe to delete or archive) - msgIdx = messageNum; // global message index - // TODO we might have to append array of (m.show && !m.new) to array of m.new so that all new messages are at the beginning of list - //let messageList = showAll ? Bangle.MESSAGES : Bangle.MESSAGES.filter(m => m.new || m.show || !m.handled); - //if (!messageList.length) return goBack(); - // Bangle.setLocked(false); // TODO make as option // Bangle.setLCDPower(true); // TODO make as option - let msgBoxes = []; let i = 0; for (let msg of Bangle.MESSAGES) { @@ -266,7 +257,7 @@ const showText = function(messageNum) { i++; } - const drawFooter = function() { + let drawFooter = function() { let fh = 20; // footer height // left hint: swipe from left for main menu g.reset().setBgColor(g.theme.bg).clearRect(Bangle.appRect.x, Bangle.appRect.y2-fh, Bangle.appRect.x2, Bangle.appRect.y2) @@ -275,8 +266,8 @@ const showText = function(messageNum) { .setFontAlign(-1, 1).setColor(0, 1, 0) //bottom left .drawString(">>", Bangle.appRect.x + 1, Bangle.appRect.y2); // center message count+hints: swipe up/down for next/prev message - const footer = ` ${messageNum + 1}/${msgBoxes.length} `; - const fw = g.stringWidth(footer); + let footer = ` ${messageNum + 1}/${msgBoxes.length} `; + let fw = g.stringWidth(footer); g.setFontAlign(0, 1).setColor(g.theme.fg) // bottom center .drawString(footer, Bangle.appRect.x+Bangle.appRect.w/2, Bangle.appRect.y2); if (messageNum < Bangle.MESSAGES.length - 1 && msgBoxes[messageNum].bottom) @@ -289,7 +280,7 @@ const showText = function(messageNum) { .setColor(g.theme.fg); }; - const refresh = function() { + let refresh = function() { if (messageNum >= 0 && messageNum < msgBoxes.length) { msgBoxes[messageNum].reset(); if (messageNum > 0) msgBoxes[messageNum - 1].reset(MessageBox.prototype.prevOffset); @@ -297,10 +288,10 @@ const showText = function(messageNum) { } }; - const removeMessage = function() { - const removeAndReset = () => { - const id = msgBoxes[messageNum].msg.id; - const idx = Bangle.MESSAGES.findIndex(m => m.id === id); + let removeMessage = function() { + let removeAndReset = () => { + let id = msgBoxes[messageNum].msg.id; + let idx = Bangle.MESSAGES.findIndex(m => m.id === id); Bangle.MESSAGES.splice(idx, 1); // remove from Bangle.MESSAGES msgBoxes.splice(messageNum, 1); // remove from msgBoxes if (!msgBoxes.length) { @@ -309,13 +300,14 @@ const showText = function(messageNum) { } if (messageNum === msgBoxes.length) { messageNum--; // we removed the last message, go to previous message - msgIdx = messageNum; // update global message index } // otherwise messageNum is automatically the index of the next message now + textId = Bangle.MESSAGES[messageNum].id; // update global current message id refresh(); msgBoxes[messageNum].draw(); drawFooter(); }; + if (messageNum < msgBoxes.length - 1) { require("messagebox").setClipRect(Bangle.appRect.x, Bangle.appRect.y, Bangle.appRect.x2, Bangle.appRect.y2); g.setBgColor(g.theme.bg).clear(); @@ -335,11 +327,11 @@ const showText = function(messageNum) { } }; - const dismissOnPhone = function() { + let dismissOnPhone = function() { return Bangle.messageResponse(msgBoxes[messageNum].msg, false); // false to dismiss, true to open on phone }; - const toNext = function(removeCurrent) { + let toNext = function(removeCurrent) { if (removeCurrent == undefined) removeCurrent = false; if (timeouts["animID"]){ clearTimeout(timeouts["animID"]); @@ -355,7 +347,7 @@ const showText = function(messageNum) { if (!removeCurrent) { if (messageNum < msgBoxes.length) { messageNum++; - msgIdx = messageNum; // update global message index + textId = Bangle.MESSAGES[messageNum].id; // update global message index refresh(); } } @@ -374,7 +366,7 @@ const showText = function(messageNum) { }); }; - const toPrev = function(removeCurrent) { + let toPrev = function(removeCurrent) { if (removeCurrent == undefined) removeCurrent = false; if (timeouts["animID"]){ clearTimeout(timeouts["animID"]); @@ -390,7 +382,7 @@ const showText = function(messageNum) { if (!removeCurrent) { if (messageNum > 0) { messageNum--; - msgIdx = messageNum; // update global message index + textId = Bangle.MESSAGES[messageNum].id; // update global message index refresh(); } } @@ -409,7 +401,7 @@ const showText = function(messageNum) { }); }; - const drawLeftBackground = function() { + let drawLeftBackground = function() { //g.setBgColor(1, 0.5, 0); // red g.setBgColor(g.theme.bg) .setClipRect(Bangle.appRect.x, Bangle.appRect.y, Bangle.appRect.x2, Bangle.appRect.y2) @@ -417,7 +409,7 @@ const showText = function(messageNum) { .setBgColor(g.theme.bg); }; - const drawRightBackground = function() { + let drawRightBackground = function() { //g.setBgColor(0, 0.5, 1); // red g.setBgColor(g.theme.bg) .setClipRect(Bangle.appRect.x, Bangle.appRect.y, Bangle.appRect.x2, Bangle.appRect.y2) @@ -425,14 +417,14 @@ const showText = function(messageNum) { .setBgColor(g.theme.bg); }; - const animateToLeft = function() { + let animateToLeft = function() { if (timeouts["animID"]) { clearTimeout(timeouts["animID"]); timeouts["animID"] = undefined; } let multiplier = 1; - const endX = Bangle.appRect.x - Bangle.appRect.w; //+ (Bangle.appRect.w / 2); - const msgBox = msgBoxes[messageNum]; + let endX = Bangle.appRect.x - Bangle.appRect.w; //+ (Bangle.appRect.w / 2); + let msgBox = msgBoxes[messageNum]; return new Promise((resolve, _reject) => { let animate = () => { msgBox.xOffset -= step * multiplier; @@ -450,14 +442,14 @@ const showText = function(messageNum) { }); }; - const animateToRight = function() { + let animateToRight = function() { if (timeouts["animID"]) { clearTimeout(timeouts["animID"]); timeouts["animID"] = undefined; } let multiplier = 1; - const endX = Bangle.appRect.x2; // - (Bangle.appRect.w / 2); - const msgBox = msgBoxes[messageNum]; + let endX = Bangle.appRect.x2; // - (Bangle.appRect.w / 2); + let msgBox = msgBoxes[messageNum]; return new Promise((resolve, _reject) => { let animate = () => { msgBox.xOffset += step * multiplier; @@ -476,9 +468,10 @@ const showText = function(messageNum) { }; let firstTouch = true; - const dragHandler = function(e) { + let dragHandler = function(e) { if (e.b === 0) { firstTouch = true; + idle = true; checkForNewMessages(); } if (switching) return; // don't respond to touch while we are animating @@ -501,27 +494,17 @@ const showText = function(messageNum) { mode = "scroll"; } } - // } else if (Math.abs(e.dx) > Math.abs(e.dy)) { - // firstTouch = false; - // if (e.dx < 0) { - // mode = "left"; - // } else { - // mode = "right"; - // } - // } else { else { mode = undefined; return; } } if (mode == "scroll") scrollHandler(e); - //else if (mode == "left") leftHandler(e); // remove from phone and watch - //else if (mode == "right") rightHandler(e); // remove from watch only else if (mode == "next") nextHandler(e); else if (mode == "prev") prevHandler(e); }; - const nextHandler = function(e) { + let nextHandler = function(e) { if (e.b == 0) { } if (messageNum == msgBoxes.length - 1) return; // already on last message @@ -531,7 +514,7 @@ const showText = function(messageNum) { }); }; - const prevHandler = function(e) { + let prevHandler = function(e) { if (e.b == 0) { } if (messageNum == 0) return; // already on first message @@ -541,20 +524,14 @@ const showText = function(messageNum) { }); }; - const swipeHandler = function(dir) { + let swipeHandler = function(dir) { if (dir > 0) return rightHandler(); else if (dir < 0) return leftHandler(); else return; }; - const leftHandler = function(e) { - const msgBox = msgBoxes[messageNum]; - // if (e.b == 0) { - // if (msgBox.xOffset > -swipeThreshold) { - // msgBox.xOffset = 0; - // msgBox.draw(); - // drawFooter(); - // } else { + let leftHandler = function(e) { + let msgBox = msgBoxes[messageNum]; switching = true; animateToLeft().then(() => { g.setBgColor(g.theme.bg); @@ -562,41 +539,19 @@ const showText = function(messageNum) { removeMessage(); switching = false; }); - // } - // return; - // } - // msgBox.xOffset += e.dx; - // if (msgBox.xOffset > 0) msgBox.xOffset = 0; - // drawLeftBackground(); - // msgBox.draw(); - // drawFooter(); }; - const rightHandler = function(e) { - const msgBox = msgBoxes[messageNum]; - // if (e.b == 0) { - // if (msgBox.xOffset < swipeThreshold) { - // msgBox.xOffset = 0; - // msgBox.draw(); - // drawFooter(); - // } else { + let rightHandler = function(e) { + let msgBox = msgBoxes[messageNum]; switching = true; animateToRight().then(() => { g.setBgColor(g.theme.bg); removeMessage(); switching = false; }); - // } - // return; - // } - // msgBox.xOffset += e.dx; - // if (msgBox.xOffset < 0) msgBox.xOffset = 0; - // drawRightBackground(); - // msgBox.draw(); - // drawFooter(); }; - const scrollHandler = function(e) { + let scrollHandler = function(e) { if (e.b === 0) { } msgBoxes[messageNum].scroll(e.dy); @@ -616,36 +571,26 @@ const showText = function(messageNum) { }; // showText // Check for new messages, wait until there is no interaction for `idleTime` ms -const checkForNewMessages = function(idleTime) { +let checkForNewMessages = function(idleTime) { idleTime = idleTime ?? 250; // how much time without interaction before we are considered idle - idle = false; if (timeouts["idleTimer"]) clearTimeout(timeouts["idleTimer"]); timeouts["idleTimer"] = setTimeout(() => { if (haveNewMessage) { - if (!Bangle.MESSAGES.length) return goBack(); haveNewMessage = false; - let idx = Bangle.MESSAGES.findIndex(m => !m.handled); - if (idx >= 0) { - for (let m of Bangle.MESSAGES) m.handled = true; // set all text messages as handled - setActive("text"); - return showText(idx); - } else { - setActive("text"); - return showText(msgIdx); - } + return showMessage(msgId); + } else { + return; } - idle = true; }, idleTime); }; -const setBusy = function() { +let setBusy = function() { idle = false; if (timeouts["idleTimer"]) clearTimeout(timeouts["idleTimer"]); timeouts["idleTimer"] = undefined; }; -const goBack = function(timedOut) { - console.log("goBack()"); +let goBack = function(timedOut) { idle = true; if (buzzing) require("messages").stopBuzz(); let backTo; @@ -659,70 +604,41 @@ const goBack = function(timedOut) { cleanup(); Bangle.showClock(); } - //console.log("backTo = ", backTo); switch (backTo) { - case "call": return showCall(call); - case "map": return showMap(map); - case "music": return showMusic(music); - case "alarm": return showAlarm(alarm); - case "text": - if (Bangle.MESSAGES.length) { - if (msgIdx < Bangle.MESSAGES.length) return showText(msgIdx); - else return showText(0); - } + case "call": return showCall(); + case "map": return showMap(); + case "music": return showMusic(); + case "alarm": return showAlarm(); + case "text": return showText(textId); } }; // goBack -const newMessage = (type, msg) => { +let newMessage = (type, msg) => { filterMessages(); - switch (type) { - case "text": - if (msg.t === "remove") { - let idx = Bangle.MESSAGES.findIndex(m => m.id === msg.id); - // if (idx >= 0) Bangle.MESSAGES.splice(idx, 1); // remove 'remove' from Bangle.MESSAGES - // idx = Bangle.MESSAGES.findIndex(m => m.id === msg.id && m.t !== "remove"); - Bangle.MESSAGES = Bangle.MESSAGES.filter(m => m.id != msg.id); - if (active === "text" && buzzing && idx === msgIdx) require("messages").stopBuzz(); // if the message being viewed is removed stop buzzing + msgId = msg.id; + if (type === "text" && msg.t === "remove") { + if (active === "text" && buzzing && msg.id === textId) require("messages").stopBuzz(); // if the message being viewed is removed stop buzzing + + let msgIdx = Bangle.MESSAGES.findIndex(m => m.id === msg.id); + if (Bangle.MESSAGES.length > 1 && msg.id === msgId) { + if (msgIdx === 0) msgId = Bangle.MESSAGES[msgIdx+1].id; + else if (msgIdx === Bangle.MESSAGES.length - 1) msgId = Bangle.MESSAGES[msgIdx-1].id; + else msgId = textId; + + } else if (Bangle.MESSAGES.length === 1) msgId = 0; + Bangle.MESSAGES = Bangle.MESSAGES.filter(m => m.id != msg.id); // remove require("messages").write(Bangle.MESSAGES); // write removal to flash - if (active === "text") { - //if (!Bangle.MESSAGES.length) goBack(); - if (idle) showText(msgIdx); // we are idle so updated messages right away - else haveNewMessage = true; // otherwise set new message flag and wait until idle - } + if (textId === msg.id) textId = 0; // just removed the message we were viewing + } + if (active === "text" && !idle) { + haveNewMessage = true; return; } - let idx = Bangle.MESSAGES.findIndex(m => !m.handled); - if (idle) { // idle so show message right away - if (idx >= 0) { - for (let m of Bangle.MESSAGES) m.handled = true; // set all text messages as handled - setActive("text"); - return showText(idx); - } else { - setActive("text") - return showText(msgIdx); - } - } - else haveNewMessage = true; // otherwise set new message flag and wait until idle - break; - - case "call": - //if (call && call.t === "remove") {call = undefined; goBack();} - if (call) {setActive("call"); showCall(call);} - break; - case "alarm": - if (alarm.new) {setActive("alarm"); showAlarm(alarm);} - break; - case "map": - if (map.new) {setActive("map"); showMap(map);} - break; - case "music": - if (music.new) {setActive("music"); showMusic(music);} - break; - } + showMessage(msgId); // we are idle so updated messages right away }; setListener("breakingnews", newMessage); -const filterMessages = function() { +let filterMessages = function() { call = Bangle.MESSAGES.find(m => m.type === "call"); alarm = Bangle.MESSAGES.find(m => m.type === "alarm"); map = Bangle.MESSAGES.find(m => m.type === "map"); @@ -734,20 +650,17 @@ const filterMessages = function() { Bangle.MESSAGES = [].concat(newUnhandledTexts, newHandledTexts, otherTexts); }; -const showMessage = function() { +let showMessage = function(id) { if (call) {setActive("call"); return showCall();} else if (alarm) {setActive("alarm"); return showAlarm();} else if (map) {setActive("map"); return showMap();} else if (music) {setActive("music"); return showMusic();} - else { - idx = Bangle.MESSAGES.findIndex(m => !m.handled); - if (idx >= 0) { + else if (Bangle.MESSAGES.length){ Bangle.MESSAGES.every(m => m.handled = true); // set all text messages as handled setActive("text"); - return showText(idx); - } + return showText(id); } - goBack(); + else goBack(); }; // entry point @@ -766,10 +679,14 @@ if (!Bangle.MESSAGES || !Bangle.MESSAGES.length) { if (!Bangle.MESSAGES.length) showNoMessages(); if (Bangle.notify) { // notification arrived that opened the app. This is set in messagecenter.notify.js - buzzing = true; - require("messages").buzz(Bangle.MESSAGES[0].src); - delete Bangle.notify; + let msg = Bangle.MESSAGES[0]; + if (msg.id !== "call" && msg.t !== "modify") { + buzzing = true; + require("messages").buzz(msg.src); + delete Bangle.notify; + } } filterMessages(); -showMessage(); +textId = Bangle.MESSAGES.length ? Bangle.MESSAGES[0].id : 0; +showMessage(textId); //} diff --git a/messagegui.lib.js b/messagegui.lib.js index a85ef52..43af8da 100644 --- a/messagegui.lib.js +++ b/messagegui.lib.js @@ -17,9 +17,9 @@ exports.messageListener = function(type, msg) { } else if (msg.t === "modify") { Bangle.MESSAGES = Bangle.MESSAGES.filter(m => m.id != msg.id); // remove old version of message Bangle.MESSAGES.unshift(msg); // put modified message at start of list - } else { - Bangle.MESSAGES.unshift(msg); // add new message to start of list - } + } // else { + // Bangle.MESSAGES.unshift(msg); // add new message to start of list + // } if (!inApp) { if (msg.t === "remove") { @@ -29,7 +29,7 @@ exports.messageListener = function(type, msg) { } if (loadWillReset()) require("messages").write(Bangle.MESSAGES); Bangle.load("messagecenter.notify.js"); - } else { + } else { // in app Bangle.emit("breakingnews", type, msg); } }; // messageListener