refactor so that messages are only handled in one place.
parent
5953a99ac6
commit
eedb486cce
|
|
@ -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);
|
||||
//}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
};
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue