refactor so that messages are only handled in one place.

master
Bryan 2024-08-15 00:27:53 -06:00
parent 5953a99ac6
commit eedb486cce
2 changed files with 85 additions and 78 deletions

View File

@ -16,7 +16,6 @@
// }; // };
// setFont(); // setFont();
let idle = false;
let haveNewMessage = false; let haveNewMessage = false;
let active; let active;
let buzzing; let buzzing;
@ -55,14 +54,23 @@ let setActive = function(newActive) {
active = newActive; active = newActive;
} }
let setBusy = function() { let setBusy = function(busy) {
if (busy) {
idle = false; idle = false;
if (timeouts["idleTimer"]) clearTimeout(timeouts["idleTimer"]); if (timeouts["idleTimer"]) clearTimeout(timeouts["idleTimer"]);
timeouts["idleTimer"] = undefined; 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) { let goBack = function(timedOut) {
idle = true; setBusy(false);
if (buzzing) require("messages").stopBuzz(); if (buzzing) require("messages").stopBuzz();
let backTo; let backTo;
if (previous && previous.length) { if (previous && previous.length) {
@ -97,9 +105,9 @@ let filterMessages = function() {
}; };
let showNoMessages = function() { let showNoMessages = function() {
g.reset().clear(); g.reset().clear()
g.setFont("12x20").setFontAlign(0,0); .setFont("12x20").setFontAlign(0,0)
g.drawString("No Messages!", Bangle.appRect.x + (Bangle.appRect.w / 2), Bangle.appRect.y + (Bangle.appRect.h / 2)); .drawString("No Messages!", Bangle.appRect.x + (Bangle.appRect.w / 2), Bangle.appRect.y + (Bangle.appRect.h / 2));
Bangle.setUI({ Bangle.setUI({
mode: "custom", mode: "custom",
@ -180,43 +188,47 @@ let showCall = function() {
let drawAcceptArrow = function(xOffset) { let drawAcceptArrow = function(xOffset) {
xOffset = xOffset??0; xOffset = xOffset??0;
imgX = x + 2 + xOffset; imgX = x + 2 + xOffset;
g.setColor(0, 1, 0); g.setColor(0, 1, 0)
g.drawImage(rightImg, imgX, y2-50); .drawImage(rightImg, imgX, y2-50);
}; };
let drawRejectArrow = function(xOffset) { let drawRejectArrow = function(xOffset) {
xOffset = xOffset??0; xOffset = xOffset??0;
let imgX = x2 - 50 - xOffset; let imgX = x2 - 50 - xOffset;
g.setColor(1, 0.25, 0.25); g.setColor(1, 0.25, 0.25)
g.drawImage(leftImg, imgX, y2-50); .drawImage(leftImg, imgX, y2-50);
}; };
if (cmd === "end") { if (cmd === "end") {
console.log("end");
if (timeouts["timer"]) clearTimeout(timeouts["timer"]); if (timeouts["timer"]) clearTimeout(timeouts["timer"]);
g.setColor(g.theme.fg).setFont("Vector:25").setFontAlign(0, -1);
if (Bangle.elapsedString) {
let elapsedString = Bangle.elapsedString; let elapsedString = Bangle.elapsedString;
delete Bangle.elapsedString; delete Bangle.elapsedString;
g.setColor(g.theme.fg).setFont("6x15:2").setFontAlign(0, -1); g.drawString(elapsedString, mx, y+25)
g.setFont("Vector:25").setFontAlign(0, -1).drawString(elapsedString, mx, y+25); .drawString("Call Ended", mx, y);
g.drawString("Call Ended", mx, y); } else {
g.drawString("Missed Call", mx, y);
}
let done = new Promise((resolve, _reject) => { let done = new Promise((resolve, _reject) => {
setTimeout(() => {resolve();}, 5000); setTimeout(() => {resolve();}, 5000);
}); });
done.then(goBack); done.then(() => {
call = undefined;
goBack();
});
} }
if (cmd === "incoming") { if (cmd === "incoming") {
drawRejectArrow(); drawRejectArrow();
drawAcceptArrow(); drawAcceptArrow();
g.setColor(0,1,0); g.setColor(0,1,0)
g.drawImage(ringingImg, mx-25, y+15); .drawImage(ringingImg, mx-25, y+15);
} }
if (cmd === "start" || cmd === "outgoing") { if (cmd === "start" || cmd === "outgoing") {
drawRejectArrow(); drawRejectArrow();
startTime = parseInt(Date.now()/1000); startTime = parseInt(Date.now()/1000);
g.setColor(g.theme.fg); g.setColor(g.theme.fg)
g.drawImage(cmd === "start" ? incomingImg : outgoingImg, x+10, y+20); .drawImage(cmd === "start" ? incomingImg : outgoingImg, x+10, y+20);
let timer = () => { let timer = () => {
g.clearRect(mx-45, y+20, mx+70, y+50); g.clearRect(mx-45, y+20, mx+70, y+50);
elapsed = parseInt(Date.now()/1000) - startTime; elapsed = parseInt(Date.now()/1000) - startTime;
@ -284,7 +296,7 @@ let showCall = function() {
let showText = function(id) { let showText = function(id) {
if (!Bangle.MESSAGES.length) return goBack(); // no messages 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; if (!id) id = Bangle.MESSAGES[0].id;
textId = id; // global text message index textId = id; // global text message index
let messageNum = Bangle.MESSAGES.findIndex(m => m.id === id); let messageNum = Bangle.MESSAGES.findIndex(m => m.id === id);
@ -525,8 +537,8 @@ let showText = function(id) {
let dragHandler = function(e) { let dragHandler = function(e) {
if (e.b === 0) { if (e.b === 0) {
firstTouch = true; firstTouch = true;
idle = true; setBusy(false);
checkForNewMessages(); //checkForNewMessages();
} }
if (switching) return; // don't respond to touch while we are animating if (switching) return; // don't respond to touch while we are animating
if (firstTouch && e.b === 1) { if (firstTouch && e.b === 1) {
@ -534,7 +546,7 @@ let showText = function(id) {
require("messages").stopBuzz(); require("messages").stopBuzz();
buzzing = false; 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 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; if (idx >= 0) delete Bangle.MESSAGES[idx].new;
msgBoxes[messageNum].clearNew(); msgBoxes[messageNum].clearNew();
@ -613,8 +625,8 @@ let showText = function(id) {
msgBoxes[messageNum].draw(); msgBoxes[messageNum].draw();
drawFooter(); drawFooter();
idle = true; setBusy(false);
checkForNewMessages(); //checkForNewMessages();
Bangle.setUI({ Bangle.setUI({
mode: "custom", mode: "custom",
drag: e => dragHandler(e), drag: e => dragHandler(e),
@ -624,41 +636,34 @@ let showText = function(id) {
}); });
}; // showText }; // 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) => { let newMessage = (type, msg) => {
filterMessages(); let handleMessage = () => {
msgId = msg.id; msgId = msg.id;
if (type === "call" && msg.t === "remove") require("messages").stopBuzz(); 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") { 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); let msgIdx = Bangle.MESSAGES.findIndex(m => m.id === msg.id);
if (Bangle.MESSAGES.length > 1 && msg.id === msgId) { if (Bangle.MESSAGES.length > 1 && msg.id === msgId) {
if (msgIdx === 0) msgId = Bangle.MESSAGES[msgIdx+1].id; if (msgIdx === 0) msgId = Bangle.MESSAGES[msgIdx+1].id;
else if (msgIdx === Bangle.MESSAGES.length - 1) msgId = Bangle.MESSAGES[msgIdx-1].id; else if (msgIdx === Bangle.MESSAGES.length - 1) msgId = Bangle.MESSAGES[msgIdx-1].id;
else msgId = textId; else msgId = textId;
} else if (Bangle.MESSAGES.length === 1) msgId = 0; } 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 if (textId === msg.id) msgId = 0; // just removed the message we were viewing
} }
if (active === "text" && !idle) { require("messagegui").handleMessage(type, msg);
haveNewMessage = true; filterMessages();
return; 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);
} }
showMessage(msgId); // we are idle so updated messages right away
}; };
setListener("breakingnews", newMessage); 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; msgId = Bangle.MESSAGES.length ? Bangle.MESSAGES[0].id : 0;
filterMessages(); filterMessages();
setBusy(false);
showMessage(msgId); showMessage(msgId);
//} //}

View File

@ -1,35 +1,36 @@
{ {
const loadWillReset = () => Bangle.load === load || !Bangle.uiRemove; const loadWillReset = () => Bangle.load === load || !Bangle.uiRemove;
exports.messageListener = function(type, msg) { exports.handleMessage = function(type, msg) {
let inApp = false;
if (msg.handled) return;
if (global.__FILE__ === "messagecenter.app.js") inApp = true;
if (!Bangle.MESSAGES || !Bangle.MESSAGES.length) Bangle.MESSAGES = require("messages").getMessages(msg); if (!Bangle.MESSAGES || !Bangle.MESSAGES.length) Bangle.MESSAGES = require("messages").getMessages(msg);
msg.show = true; msg.show = true;
msg.type = type; msg.type = type;
if (msg.t === "add") { if (msg.t === "add") {
require("messages").apply(msg, Bangle.MESSAGES); require("messages").apply(msg, Bangle.MESSAGES);
} else if (msg.t === "modify" || type === "call") { } else if (msg.t === "modify" || type === "call") {
Bangle.MESSAGES = Bangle.MESSAGES.filter(m => m.id != msg.id); // remove old version of message 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 Bangle.MESSAGES.unshift(msg); // put modified message at start of list
} }
if (!inApp) {
if (msg.t === "remove") { if (msg.t === "remove") {
Bangle.MESSAGES = Bangle.MESSAGES.filter(m => m.id != msg.id); Bangle.MESSAGES = Bangle.MESSAGES.filter(m => m.id != msg.id);
require("messages").write(Bangle.MESSAGES); // write removal to flash require("messages").write(Bangle.MESSAGES); // write removal to flash
return; // don't open app for removal
} }
}
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 (loadWillReset()) require("messages").write(Bangle.MESSAGES); 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 } else { // in app
Bangle.emit("breakingnews", type, msg); Bangle.emit("breakingnews", type, msg);
} }
}; // messageListener }; // messageListener
exports.open = function(_msg) {
exports.open = function(msg) {
Bangle.load("messagecenter.app.js"); Bangle.load("messagecenter.app.js");
}; };
}; };