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();
let idle = false;
let haveNewMessage = false;
let active;
let buzzing;
@ -55,14 +54,23 @@ let setActive = function(newActive) {
active = newActive;
}
let setBusy = function() {
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"]);
g.setColor(g.theme.fg).setFont("Vector:25").setFontAlign(0, -1);
if (Bangle.elapsedString) {
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.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();
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") {
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
}
if (active === "text" && !idle) {
haveNewMessage = true;
return;
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);
}
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);
//}

View File

@ -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 (!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
}
}
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);
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");
};
};