refactor so that messages are only handled in one place.
parent
5953a99ac6
commit
eedb486cce
|
|
@ -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) {
|
||||||
idle = false;
|
if (busy) {
|
||||||
if (timeouts["idleTimer"]) clearTimeout(timeouts["idleTimer"]);
|
idle = false;
|
||||||
timeouts["idleTimer"] = undefined;
|
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) {
|
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"]);
|
||||||
let elapsedString = Bangle.elapsedString;
|
g.setColor(g.theme.fg).setFont("Vector:25").setFontAlign(0, -1);
|
||||||
delete Bangle.elapsedString;
|
if (Bangle.elapsedString) {
|
||||||
g.setColor(g.theme.fg).setFont("6x15:2").setFontAlign(0, -1);
|
let elapsedString = Bangle.elapsedString;
|
||||||
g.setFont("Vector:25").setFontAlign(0, -1).drawString(elapsedString, mx, y+25);
|
delete Bangle.elapsedString;
|
||||||
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) => {
|
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 (type === "text" && msg.t === "remove") {
|
if (active === "text" && buzzing && msg.t === "remove" && msg.id === textId) require("messages").stopBuzz(); // if the message being viewed is removed stop buzzing
|
||||||
if (active === "text" && buzzing && 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);
|
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
|
if (textId === msg.id) msgId = 0; // just removed the message we were viewing
|
||||||
require("messages").write(Bangle.MESSAGES); // write removal to flash
|
}
|
||||||
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);
|
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);
|
||||||
//}
|
//}
|
||||||
|
|
|
||||||
|
|
@ -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 (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 (!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);
|
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");
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue