1
0
Fork 0

messages: move buzz from widget to library

master
Richard de Boer 2022-09-24 16:46:59 +02:00
parent dc6839a67b
commit 29fc8f4d1a
No known key found for this signature in database
4 changed files with 50 additions and 38 deletions

View File

@ -69,4 +69,5 @@
messages widget buzz now returns a promise messages widget buzz now returns a promise
0.51: Emit "message events" 0.51: Emit "message events"
Setting to hide widget Setting to hide widget
Add custom event handlers to prevent default app form loading Add custom event handlers to prevent default app form loading
Move WIDGETS.messages.buzz() to require("messages").buzz()

View File

@ -54,8 +54,7 @@ var onMessagesModified = function(msg) {
// TODO: if new, show this new one // TODO: if new, show this new one
if (msg && msg.id!=="music" && msg.new && active!="map" && if (msg && msg.id!=="music" && msg.new && active!="map" &&
!((require('Storage').readJSON('setting.json', 1) || {}).quiet)) { !((require('Storage').readJSON('setting.json', 1) || {}).quiet)) {
if (WIDGETS["messages"]) WIDGETS["messages"].buzz(msg.src); require("messages").buzz(msg.src);
else Bangle.buzz();
} }
if (msg && msg.id=="music") { if (msg && msg.id=="music") {
if (msg.state && msg.state!="play") openMusic = false; // no longer playing music to go back to if (msg.state && msg.state!="play") openMusic = false; // no longer playing music to go back to
@ -356,13 +355,13 @@ function checkMessages(options) {
// If we have a new message, show it // If we have a new message, show it
if (options.showMsgIfUnread && newMessages.length) { if (options.showMsgIfUnread && newMessages.length) {
showMessage(newMessages[0].id); showMessage(newMessages[0].id);
// buzz after showMessage, so beingbusy during layout doesn't affect the buzz pattern // buzz after showMessage, so being busy during layout doesn't affect the buzz pattern
if (global.BUZZ_ON_NEW_MESSAGE) { if (global.BUZZ_ON_NEW_MESSAGE) {
// this is set if we entered the messages app by loading `messages.new.js` // this is set if we entered the messages app by loading `messages.new.js`
// ... but only buzz the first time we view a new message // ... but only buzz the first time we view a new message
global.BUZZ_ON_NEW_MESSAGE = false; global.BUZZ_ON_NEW_MESSAGE = false;
// messages.buzz respects quiet mode - no need to check here // messages.buzz respects quiet mode - no need to check here
WIDGETS.messages.buzz(newMessages[0].src); require("messages").buzz(newMessages[0].src);
} }
return; return;
} }

View File

@ -83,8 +83,8 @@ exports.pushMessage = function(event) {
// we will buzz when we enter the messages app // we will buzz when we enter the messages app
return load("messages.new.js"); return load("messages.new.js");
} }
if (!quiet && (!global.WIDGETS || !WIDGETS.messages)) return Bangle.buzz(); // no widgets - just buzz once to let someone know
if (global.WIDGETS && WIDGETS.messages) WIDGETS.messages.update(messages); if (global.WIDGETS && WIDGETS.messages) WIDGETS.messages.update(messages);
exports.buzz(message.src);
}, 500); }, 500);
}; };
setTimeout(()=>{ setTimeout(()=>{
@ -134,6 +134,45 @@ exports.getMessages = function() {
} }
}; };
/**
* Start buzzing for new message
* @param {string} msgSrc Message src to buzz for
* @return {Promise} Resolves when initial buzz finishes (there might be repeat buzzes later)
*/
exports.buzz = function(msgSrc) {
exports.stopBuzz(); // cancel any previous buzz timeouts
if ((require('Storage').readJSON('setting.json',1)||{}).quiet) return Promise.resolve(); // never buzz during Quiet Mode
var pattern;
if (msgSrc && msgSrc.toLowerCase() === "phone") {
// special vibration pattern for incoming calls
pattern = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrateCalls;
} else {
pattern = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrate;
}
if (pattern === undefined) { pattern = ":"; } // pattern may be "", so we can't use || ":" here
if (!pattern) return Promise.resolve();
var repeat = (require('Storage').readJSON("messages.settings.json", true) || {}).repeat;
if (repeat===undefined) repeat=4; // repeat may be zero
if (repeat) {
exports.buzzTimeout = setTimeout(()=>require("buzz").pattern(pattern), repeat*1000);
var vibrateTimeout = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrateTimeout;
if (vibrateTimeout===undefined) vibrateTimeout=60;
if (vibrateTimeout && !exports.stopTimeout) exports.stopTimeout = setTimeout(exports.stopTimeout, vibrateTimeout*1000);
}
return require("buzz").pattern(pattern);
};
/**
* Stop buzzing
*/
exports.stopBuzz = function() {
if (exports.buzzTimeout) clearTimeout(exports.buzzTimeout);
delete exports.buzzTimeout;
if (exports.stopTimeout) clearTimeout(exports.stopTimeout);
delete exports.stopTimeout;
};
exports.getMessageImage = function(msg) { exports.getMessageImage = function(msg) {
/* /*
* icons should be 24x24px or less with 1bpp colors and 'Transparency to Color' * icons should be 24x24px or less with 1bpp colors and 'Transparency to Color'

View File

@ -15,15 +15,14 @@ WIDGETS["messages"]={area:"tl", width:0, draw:function(recall) {
} }
Bangle.removeListener('touch', this.touch); Bangle.removeListener('touch', this.touch);
if (!this.width) return; if (!this.width) return;
var c = (Date.now()-this.t)/1000; let settings = Object.assign({flash:true, maxMessages:3},require('Storage').readJSON("messages.settings.json", true) || {});
let settings = Object.assign({flash:true, maxMessages:3, repeat:4, vibrateTimeout:60},require('Storage').readJSON("messages.settings.json", true) || {});
if (recall !== true || settings.flash) { if (recall !== true || settings.flash) {
var msgsShown = E.clip(this.msgs.length, 0, settings.maxMessages); var msgsShown = E.clip(this.msgs.length, 0, settings.maxMessages);
g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+23); g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+23);
for(let i = 0;i < msgsShown;i++) { for(let i = 0;i < msgsShown;i++) {
const msg = this.msgs[i]; const msg = this.msgs[i];
const colors = [g.theme.bg, g.setColor(require("messages").getMessageImageCol(msg)).getColor()]; const colors = [g.theme.bg, g.setColor(require("messages").getMessageImageCol(msg)).getColor()];
if (settings.flash && (c&1)) { if (settings.flash && ((Date.now()/1000)&1)) {
if (colors[1] == g.theme.fg) { if (colors[1] == g.theme.fg) {
colors.reverse(); colors.reverse();
} else { } else {
@ -36,38 +35,13 @@ WIDGETS["messages"]={area:"tl", width:0, draw:function(recall) {
this.x + 12 + i * 24, this.y + 12, {rotate:0/*force centering*/}); this.x + 12 + i * 24, this.y + 12, {rotate:0/*force centering*/});
} }
} }
if (c<settings.vibrateTimeout && // not going on too long...
(settings.repeat || c<1) && // repeated, or no repeat and first attempt
(Date.now()-this.l)>settings.repeat*1000) { // the period between vibrations
this.l = Date.now();
WIDGETS["messages"].buzz(); // buzz every 4 seconds
}
WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(true), 1000); WIDGETS["messages"].i=setTimeout(()=>WIDGETS["messages"].draw(true), 1000);
if (process.env.HWVERSION>1) Bangle.on('touch', this.touch); if (process.env.HWVERSION>1) Bangle.on('touch', this.touch);
},update:function(rawMsgs, quiet) { },update:function(rawMsgs) {
const settings = Object.assign({maxMessages:3},require('Storage').readJSON("messages.settings.json", true) || {}); const settings = Object.assign({maxMessages:3},require('Storage').readJSON("messages.settings.json", true) || {});
this.msgs = filterMessages(rawMsgs); this.msgs = filterMessages(rawMsgs);
if (this.msgs.length === 0) {
delete this.t;
delete this.l;
} else {
this.t=Date.now(); // first time
this.l=Date.now()-10000; // last buzz
if (quiet) this.t -= 500000; // if quiet, set last time in the past so there is no buzzing
}
this.width = 24 * E.clip(this.msgs.length, 0, settings.maxMessages); this.width = 24 * E.clip(this.msgs.length, 0, settings.maxMessages);
Bangle.drawWidgets(); Bangle.drawWidgets();
},buzz:function(msgSrc) { // return a promise
if ((require('Storage').readJSON('setting.json',1)||{}).quiet) return Promise.resolve(); // never buzz during Quiet Mode
var pattern;
if (msgSrc != undefined && msgSrc.toLowerCase() == "phone") {
// special vibration pattern for incoming calls
pattern = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrateCalls;
} else {
pattern = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrate;
}
if (pattern === undefined) { pattern = ":"; } // pattern may be "", so we can't use || ":" here
return require("buzz").pattern(pattern);
},touch:function(b,c) { },touch:function(b,c) {
var w=WIDGETS["messages"]; var w=WIDGETS["messages"];
if (!w||!w.width||c.x<w.x||c.x>w.x+w.width||c.y<w.y||c.y>w.y+24) return; if (!w||!w.width||c.x<w.x||c.x>w.x+w.width||c.y<w.y||c.y>w.y+24) return;
@ -75,8 +49,7 @@ WIDGETS["messages"]={area:"tl", width:0, draw:function(recall) {
}}; }};
/* We might have returned here if we were in the Messages app for a /* We might have returned here if we were in the Messages app for a
message but then the watch was never viewed. In that case we don't message but then the watch was never viewed. */
want to buzz but should still show that there are unread messages. */
if (global.MESSAGES===undefined) if (global.MESSAGES===undefined)
WIDGETS["messages"].update(require("messages").getMessages(), true); WIDGETS["messages"].update(require("messages").getMessages());
})(); })();