diff --git a/messagecenter.app.js b/messagecenter.app.js index 9958124..98c3109 100644 --- a/messagecenter.app.js +++ b/messagecenter.app.js @@ -16,7 +16,6 @@ // }; // setFont(); -let idle = false; let haveNewMessage = false; let active; let buzzing; @@ -55,14 +54,23 @@ let setActive = function(newActive) { active = newActive; } -let setBusy = function() { - idle = false; - if (timeouts["idleTimer"]) clearTimeout(timeouts["idleTimer"]); - timeouts["idleTimer"] = undefined; +let setBusy = function(busy) { + if (busy) { + idle = false; + if (timeouts["idleTimer"]) clearTimeout(timeouts["idleTimer"]); + timeouts["idleTimer"] = undefined; + } else { + const idleTime = 250; // how much time without interaction before we are considered idle + if (timeouts["idleTimer"]) clearTimeout(timeouts["idleTimer"]); + timeouts["idleTimer"] = setTimeout(() => { + idle = true; + Bangle.emit("idle"); + }, idleTime); + } }; let goBack = function(timedOut) { - idle = true; + setBusy(false); if (buzzing) require("messages").stopBuzz(); let backTo; if (previous && previous.length) { @@ -97,9 +105,9 @@ let filterMessages = 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)); + g.reset().clear() + .setFont("12x20").setFontAlign(0,0) + .drawString("No Messages!", Bangle.appRect.x + (Bangle.appRect.w / 2), Bangle.appRect.y + (Bangle.appRect.h / 2)); Bangle.setUI({ mode: "custom", @@ -180,43 +188,47 @@ let showCall = function() { let drawAcceptArrow = function(xOffset) { xOffset = xOffset??0; imgX = x + 2 + xOffset; - g.setColor(0, 1, 0); - g.drawImage(rightImg, imgX, y2-50); + g.setColor(0, 1, 0) + .drawImage(rightImg, imgX, y2-50); }; 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); + g.setColor(1, 0.25, 0.25) + .drawImage(leftImg, imgX, y2-50); }; if (cmd === "end") { - console.log("end"); if (timeouts["timer"]) clearTimeout(timeouts["timer"]); - let elapsedString = Bangle.elapsedString; - delete Bangle.elapsedString; - g.setColor(g.theme.fg).setFont("6x15:2").setFontAlign(0, -1); - g.setFont("Vector:25").setFontAlign(0, -1).drawString(elapsedString, mx, y+25); - g.drawString("Call Ended", mx, y); - + g.setColor(g.theme.fg).setFont("Vector:25").setFontAlign(0, -1); + if (Bangle.elapsedString) { + let elapsedString = Bangle.elapsedString; + delete Bangle.elapsedString; + g.drawString(elapsedString, mx, y+25) + .drawString("Call Ended", mx, y); + } else { + g.drawString("Missed Call", mx, y); + } let done = new Promise((resolve, _reject) => { setTimeout(() => {resolve();}, 5000); }); - done.then(goBack); + done.then(() => { + call = undefined; + goBack(); + }); } - if (cmd === "incoming") { drawRejectArrow(); drawAcceptArrow(); - g.setColor(0,1,0); - g.drawImage(ringingImg, mx-25, y+15); + g.setColor(0,1,0) + .drawImage(ringingImg, mx-25, y+15); } if (cmd === "start" || cmd === "outgoing") { drawRejectArrow(); startTime = parseInt(Date.now()/1000); - g.setColor(g.theme.fg); - g.drawImage(cmd === "start" ? incomingImg : outgoingImg, x+10, y+20); + g.setColor(g.theme.fg) + .drawImage(cmd === "start" ? incomingImg : outgoingImg, x+10, y+20); let timer = () => { g.clearRect(mx-45, y+20, mx+70, y+50); elapsed = parseInt(Date.now()/1000) - startTime; @@ -284,7 +296,7 @@ let showCall = function() { let showText = function(id) { if (!Bangle.MESSAGES.length) return goBack(); // no messages - setBusy(); // busy until everything is set up + setBusy(true); // busy until everything is set up if (!id) id = Bangle.MESSAGES[0].id; textId = id; // global text message index let messageNum = Bangle.MESSAGES.findIndex(m => m.id === id); @@ -525,8 +537,8 @@ let showText = function(id) { let dragHandler = function(e) { if (e.b === 0) { firstTouch = true; - idle = true; - checkForNewMessages(); + setBusy(false); + //checkForNewMessages(); } if (switching) return; // don't respond to touch while we are animating if (firstTouch && e.b === 1) { @@ -534,7 +546,7 @@ let showText = function(id) { require("messages").stopBuzz(); buzzing = false; } - setBusy(); + setBusy(true); let idx = Bangle.MESSAGES.findIndex(m => m.id === msgBoxes[messageNum].msg.id); // TODO maybe we don't to do this check every time if (idx >= 0) delete Bangle.MESSAGES[idx].new; msgBoxes[messageNum].clearNew(); @@ -613,8 +625,8 @@ let showText = function(id) { msgBoxes[messageNum].draw(); drawFooter(); - idle = true; - checkForNewMessages(); + setBusy(false); + //checkForNewMessages(); Bangle.setUI({ mode: "custom", drag: e => dragHandler(e), @@ -624,41 +636,34 @@ let showText = function(id) { }); }; // showText -// Check for new messages, wait until there is no interaction for `idleTime` ms -let checkForNewMessages = function(idleTime) { - idleTime = idleTime ?? 250; // how much time without interaction before we are considered idle - if (timeouts["idleTimer"]) clearTimeout(timeouts["idleTimer"]); - timeouts["idleTimer"] = setTimeout(() => { - if (haveNewMessage) { - haveNewMessage = false; - return showMessage(msgId); - } else { - return; - } - }, idleTime); -}; - let newMessage = (type, msg) => { - filterMessages(); - msgId = msg.id; - if (type === "call" && msg.t === "remove") require("messages").stopBuzz(); - 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 (textId === msg.id) msgId = 0; // just removed the message we were viewing + let handleMessage = () => { + msgId = msg.id; + if (type === "call" && msg.t === "remove") require("messages").stopBuzz(); + if (active === "text" && buzzing && msg.t === "remove" && msg.id === textId) require("messages").stopBuzz(); // if the message being viewed is removed stop buzzing + if (type === "text" && msg.t === "remove") { + 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; + if (textId === msg.id) msgId = 0; // just removed the message we were viewing + } + require("messagegui").handleMessage(type, msg); + filterMessages(); + showMessage(msgId); + }; + // Bangle.MESSAGES = Bangle.MESSAGES.filter(m => m.id != msg.id); // remove + // require("messages").write(Bangle.MESSAGES); // write removal to flash + if (idle) return handleMessage(); // we are idle so updated messages right away + else if (!idle) { + showMessageOnceIdle = () => { + handleMessage(msgId); + Bangle.removeAllListeners("idle"); + } + return setListener("idle", showMessageOnceIdle); } - if (active === "text" && !idle) { - haveNewMessage = true; - return; - } - showMessage(msgId); // we are idle so updated messages right away }; setListener("breakingnews", newMessage); @@ -687,5 +692,6 @@ if (Bangle.notify) { // notification arrived that opened the app. This is set in } msgId = Bangle.MESSAGES.length ? Bangle.MESSAGES[0].id : 0; filterMessages(); +setBusy(false); showMessage(msgId); //} diff --git a/messagegui.lib.js b/messagegui.lib.js index f9be381..054a59f 100644 --- a/messagegui.lib.js +++ b/messagegui.lib.js @@ -1,35 +1,36 @@ { const loadWillReset = () => Bangle.load === load || !Bangle.uiRemove; - exports.messageListener = function(type, msg) { - let inApp = false; - if (msg.handled) return; - if (global.__FILE__ === "messagecenter.app.js") inApp = true; + exports.handleMessage = function(type, msg) { if (!Bangle.MESSAGES || !Bangle.MESSAGES.length) Bangle.MESSAGES = require("messages").getMessages(msg); msg.show = true; msg.type = type; - if (msg.t === "add") { require("messages").apply(msg, Bangle.MESSAGES); } else if (msg.t === "modify" || type === "call") { 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 } + if (msg.t === "remove") { + Bangle.MESSAGES = Bangle.MESSAGES.filter(m => m.id != msg.id); + require("messages").write(Bangle.MESSAGES); // write removal to flash + } + } + + exports.messageListener = function(type, msg) { + let inApp = false; + if (msg.handled) return; + if (global.__FILE__ === "messagecenter.app.js") inApp = true; + exports.handleMessage(type, msg); if (!inApp) { - if (msg.t === "remove") { - Bangle.MESSAGES = Bangle.MESSAGES.filter(m => m.id != msg.id); - require("messages").write(Bangle.MESSAGES); // write removal to flash - return; // don't open app for removal - } if (loadWillReset()) require("messages").write(Bangle.MESSAGES); - Bangle.load("messagecenter.notify.js"); + if (msg.t !== "remove") Bangle.load("messagecenter.notify.js"); // don't load app if we are just removing a message } else { // in app Bangle.emit("breakingnews", type, msg); } }; // messageListener - - exports.open = function(msg) { + exports.open = function(_msg) { Bangle.load("messagecenter.app.js"); }; };