Skip to content

Commit

Permalink
Merge branch 'messagegui' into app-loader
Browse files Browse the repository at this point in the history
  • Loading branch information
thyttan committed Jan 2, 2025
2 parents d47d0b0 + 2be6ae4 commit 583c6bf
Show file tree
Hide file tree
Showing 4 changed files with 180 additions and 52 deletions.
1 change: 1 addition & 0 deletions apps/messagegui/ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,4 @@
0.82: Stop buzzing when a message is removed (e.g. call answered)
0.83: Add option to not open the first unread message
0.84: Fix: Assign show message entry to the settings menu and not the message itself.
0.85: (WIP) refactor to display a scroller with three messages loaded. When scrolling to the top or end new/older messages are loaded in.
227 changes: 177 additions & 50 deletions apps/messagegui/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ var onMessagesModified = function(type,msg) {
require("messages").apply(msg, MESSAGES);
// TODO: if new, show this new one
if (msg && msg.id!=="music" && msg.id!=="nav" && msg.new &&
!((require('Storage').readJSON('setting.json', 1) || {}).quiet)) {
!((require('Storage').readJSON('setting.json', 1) || {}).quiet)) {
require("messages").buzz(msg.src);
}
if (msg && msg.id=="music") {
Expand All @@ -90,7 +90,8 @@ var onMessagesModified = function(type,msg) {
}
if (msg && msg.id=="nav" && msg.t=="modify" && active!="map")
return; // don't show an updated nav message if we're just in the menu
showMessage(msg&&msg.id, false);
//showMessage(msg&&msg.id, false);
showMessagesScroller(msg, false)
};
Bangle.on("message", onMessagesModified);

Expand All @@ -105,35 +106,35 @@ function showMapMessage(msg) {
var m, distance, street, target, img;
if ("string"==typeof msg.distance) // new gadgetbridge
distance = msg.distance;
else if ("number"==typeof msg.distance) // 0.74 gadgetbridge
distance = require("locale").distance(msg.distance);
else if ("number"==typeof msg.distance) // 0.74 gadgetbridge
distance = require("locale").distance(msg.distance);
if (msg.instr) {
var instr = msg.instr.replace(/\s*\/\s*/g," \/\n"); // convert slashes to newlines
if (instr.includes("towards") || instr.includes("toward")) {
m = instr.split(/towards|toward/);
target = m[0].trim();
street = m[1].trim();
}else
target = instr;
target = instr;
}
var carIsRHD = !!settings.carIsRHD;
switch (msg.action) {
case "continue": img = "EBgBAIABwAPgD/Af+D/8f/773/PPY8cDwAPAA8ADwAPAA8AAAAPAA8ADwAAAA8ADwAPA";break;
case "left": img = "GhcBAYAAAPAAAHwAAD4AAB8AAA+AAAf//8P///x///+PAAPx4AA8fAAHD4ABwfAAcDwAHAIABwAAAcAAAHAAABwAAAcAAAHAAABwAAAc";break;
case "right": img = "GhcBAABgAAA8AAAPgAAB8AAAPgAAB8D///j///9///+/AAPPAAHjgAD44AB8OAA+DgAPA4ABAOAAADgAAA4AAAOAAADgAAA4AAAOAAAA";break;
case "left_slight": img = "ERgB//B/+D/8H4AP4Af4A74Bz4Dj4HD4OD4cD4AD4ADwADwADgAHgAPAAOAAcAA4ABwADgAH";break;
case "right_slight": img = "ERgBB/+D/8H/4APwA/gD/APuA+cD44Phw+Dj4HPgAeAB4ADgAPAAeAA4ABwADgAHAAOAAcAA";break;
case "left_sharp": img = "GBaBAAAA+AAB/AAH/gAPjgAeBwA8BwB4B+DwB+HgB+PAB+eAB+8AB+4AB/wAB/gAB//gB//gB//gBwAABwAABwAABwAABw=="; break;
case "right_sharp": img = "GBaBAB8AAD+AAH/gAHHwAOB4AOA8AOAeAOAPB+AHh+ADx+AB5+AA9+AAd+AAP+AAH+AH/+AH/+AH/+AAAOAAAOAAAOAAAA==";break;
case "keep_left": img = "ERmBAACAAOAB+AD+AP+B/+H3+PO+8c8w4wBwADgAHgAPAAfAAfAAfAAfAAeAAeAAcAA8AA4ABwADgA==";break;
case "keep_right": img = "ERmBAACAAOAA/AD+AP+A//D/fPueeceY4YBwADgAPAAeAB8AHwAfAB8ADwAPAAcAB4ADgAHAAOAAAA==";break;
case "uturn_left": img = "GRiBAAAH4AAP/AAP/wAPj8APAfAPAHgHgB4DgA8BwAOA4AHAcADsOMB/HPA7zvgd9/gOf/gHH/gDh/gBwfgA4DgAcBgAOAAAHAAADgAABw==";break;
case "uturn_right": img = "GRiBAAPwAAf+AAf/gAfj4AfAeAPAHgPADwHgA4DgAcBwAOA4AHAcBjhuB5x/A+57gP99wD/84A/8cAP8OAD8HAA4DgAMBwAAA4AAAcAAAA==";break;
case "finish": img = "HhsBAcAAAD/AAAH/wAAPB4AAeA4AAcAcAAYIcAA4cMAA48MAA4cMAAYAcAAcAcAAcA4AAOA4AAOBxjwHBzjwHjj/4Dnn/4B3P/4B+Pj4A8fj8Acfj8AI//8AA//+AA/j+AB/j+AB/j/A";break;
case "roundabout_left": img = carIsRHD ? "HBaCAAADwAAAAAAAD/AAAVUAAD/wABVVUAD/wABVVVQD/wAAVABUD/wAAVAAFT/////wABX/////8AAF//////AABT/////wABUP/AAD/AAVA/8AA/8AVAD/wAD//VQAP/AAP/1QAA/wAA/9AAADwAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AA=" : "HRYCAAPAAAAAAAAD/AAD//AAA/8AD///AAP/AA////AD/wAD/wP/A/8AA/wAP8P/////AAP//////8AA///////AAD/P////8AAP8P/AABUAD/AP/AAFUA/8AP/AAFX//AAP/AAFf/wAAP8AAB/8AAAPAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAA==";break;
case "roundabout_right": img = carIsRHD ? "HRaCAAAAAAAA8AAAP/8AAP8AAD///AA/8AA////AA/8AP/A/8AA/8A/wAP8AA/8P8AA/////8/wAD///////AAD//////8AAP////8P8ABUAAP/A/8AVQAD/wA//1UAA/8AA//VAAP/AAA/9AAA/wAAAPwAAA8AAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAA=" : "HBYCAAAAAAPAAABVQAAP8AAFVVQAD/wAFVVVAAP/ABUAFQAA/8BUAAVAAD/wVAAP/////FAAD/////9QAA//////VAAP/////FQAP8AAP/AVAP/AAP/AFX//AAP/AAV//AAP/AAAf/AAD/AAAD/AAAPAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAA==";break;
case "roundabout_straight": img = carIsRHD ? "EBuCAAADwAAAD/AAAD/8AAD//wAD///AD///8D/P8/z/D/D//A/wPzAP8AwA//UAA//1QA//9VA/8AFUP8AAVD8AAFQ/AABUPwAAVD8AAFQ/wABUP/ABVA//9VAD//VAAP/1AAAP8AAAD/AAAA/wAA==" : "EBsCAAPAAAAP8AAAP/wAAP//AAP//8AP///wP8/z/P8P8P/8D/A/MA/wDABf/wABX//ABV//8BVAD/wVAAP8FQAA/BUAAPwVAAD8FQAA/BUAA/wVQA/8BV//8AFf/8AAX/8AAA/wAAAP8AAAD/AA";break;
case "roundabout_uturn": img = carIsRHD ? "ICCBAAAAAAAAAAAAAAAAAAAP4AAAH/AAAD/4AAB4fAAA8DwAAPAcAADgHgAA4B4AAPAcAADwPAAAeHwAADz4AAAc8AAABPAAAADwAAAY8YAAPPPAAD73gAAf/4AAD/8AABf8AAAb+AAAHfAAABzwAAAcYAAAAAAAAAAAAAAAAAAAAAAA" : "ICABAAAAAAAAAAAAAAAAAAfwAAAP+AAAH/wAAD4eAAA8DwAAOA8AAHgHAAB4BwAAOA8AADwPAAA+HgAAHzwAAA84AAAPIAAADwAAAY8YAAPPPAAB73wAAf/4AAD/8AAAP+gAAB/YAAAPuAAADzgAAAY4AAAAAAAAAAAAAAAAAAAAAAA=";break;
case "continue": img = "EBgBAIABwAPgD/Af+D/8f/773/PPY8cDwAPAA8ADwAPAA8AAAAPAA8ADwAAAA8ADwAPA";break;
case "left": img = "GhcBAYAAAPAAAHwAAD4AAB8AAA+AAAf//8P///x///+PAAPx4AA8fAAHD4ABwfAAcDwAHAIABwAAAcAAAHAAABwAAAcAAAHAAABwAAAc";break;
case "right": img = "GhcBAABgAAA8AAAPgAAB8AAAPgAAB8D///j///9///+/AAPPAAHjgAD44AB8OAA+DgAPA4ABAOAAADgAAA4AAAOAAADgAAA4AAAOAAAA";break;
case "left_slight": img = "ERgB//B/+D/8H4AP4Af4A74Bz4Dj4HD4OD4cD4AD4ADwADwADgAHgAPAAOAAcAA4ABwADgAH";break;
case "right_slight": img = "ERgBB/+D/8H/4APwA/gD/APuA+cD44Phw+Dj4HPgAeAB4ADgAPAAeAA4ABwADgAHAAOAAcAA";break;
case "left_sharp": img = "GBaBAAAA+AAB/AAH/gAPjgAeBwA8BwB4B+DwB+HgB+PAB+eAB+8AB+4AB/wAB/gAB//gB//gB//gBwAABwAABwAABwAABw=="; break;
case "right_sharp": img = "GBaBAB8AAD+AAH/gAHHwAOB4AOA8AOAeAOAPB+AHh+ADx+AB5+AA9+AAd+AAP+AAH+AH/+AH/+AH/+AAAOAAAOAAAOAAAA==";break;
case "keep_left": img = "ERmBAACAAOAB+AD+AP+B/+H3+PO+8c8w4wBwADgAHgAPAAfAAfAAfAAfAAeAAeAAcAA8AA4ABwADgA==";break;
case "keep_right": img = "ERmBAACAAOAA/AD+AP+A//D/fPueeceY4YBwADgAPAAeAB8AHwAfAB8ADwAPAAcAB4ADgAHAAOAAAA==";break;
case "uturn_left": img = "GRiBAAAH4AAP/AAP/wAPj8APAfAPAHgHgB4DgA8BwAOA4AHAcADsOMB/HPA7zvgd9/gOf/gHH/gDh/gBwfgA4DgAcBgAOAAAHAAADgAABw==";break;
case "uturn_right": img = "GRiBAAPwAAf+AAf/gAfj4AfAeAPAHgPADwHgA4DgAcBwAOA4AHAcBjhuB5x/A+57gP99wD/84A/8cAP8OAD8HAA4DgAMBwAAA4AAAcAAAA==";break;
case "finish": img = "HhsBAcAAAD/AAAH/wAAPB4AAeA4AAcAcAAYIcAA4cMAA48MAA4cMAAYAcAAcAcAAcA4AAOA4AAOBxjwHBzjwHjj/4Dnn/4B3P/4B+Pj4A8fj8Acfj8AI//8AA//+AA/j+AB/j+AB/j/A";break;
case "roundabout_left": img = carIsRHD ? "HBaCAAADwAAAAAAAD/AAAVUAAD/wABVVUAD/wABVVVQD/wAAVABUD/wAAVAAFT/////wABX/////8AAF//////AABT/////wABUP/AAD/AAVA/8AA/8AVAD/wAD//VQAP/AAP/1QAA/wAA/9AAADwAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AA=" : "HRYCAAPAAAAAAAAD/AAD//AAA/8AD///AAP/AA////AD/wAD/wP/A/8AA/wAP8P/////AAP//////8AA///////AAD/P////8AAP8P/AABUAD/AP/AAFUA/8AP/AAFX//AAP/AAFf/wAAP8AAB/8AAAPAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAA==";break;
case "roundabout_right": img = carIsRHD ? "HRaCAAAAAAAA8AAAP/8AAP8AAD///AA/8AA////AA/8AP/A/8AA/8A/wAP8AA/8P8AA/////8/wAD///////AAD//////8AAP////8P8ABUAAP/A/8AVQAD/wA//1UAA/8AA//VAAP/AAA/9AAA/wAAAPwAAA8AAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAA=" : "HBYCAAAAAAPAAABVQAAP8AAFVVQAD/wAFVVVAAP/ABUAFQAA/8BUAAVAAD/wVAAP/////FAAD/////9QAA//////VAAP/////FQAP8AAP/AVAP/AAP/AFX//AAP/AAV//AAP/AAAf/AAD/AAAD/AAAPAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAA==";break;
case "roundabout_straight": img = carIsRHD ? "EBuCAAADwAAAD/AAAD/8AAD//wAD///AD///8D/P8/z/D/D//A/wPzAP8AwA//UAA//1QA//9VA/8AFUP8AAVD8AAFQ/AABUPwAAVD8AAFQ/wABUP/ABVA//9VAD//VAAP/1AAAP8AAAD/AAAA/wAA==" : "EBsCAAPAAAAP8AAAP/wAAP//AAP//8AP///wP8/z/P8P8P/8D/A/MA/wDABf/wABX//ABV//8BVAD/wVAAP8FQAA/BUAAPwVAAD8FQAA/BUAA/wVQA/8BV//8AFf/8AAX/8AAA/wAAAP8AAAD/AA";break;
case "roundabout_uturn": img = carIsRHD ? "ICCBAAAAAAAAAAAAAAAAAAAP4AAAH/AAAD/4AAB4fAAA8DwAAPAcAADgHgAA4B4AAPAcAADwPAAAeHwAADz4AAAc8AAABPAAAADwAAAY8YAAPPPAAD73gAAf/4AAD/8AABf8AAAb+AAAHfAAABzwAAAcYAAAAAAAAAAAAAAAAAAAAAAA" : "ICABAAAAAAAAAAAAAAAAAAfwAAAP+AAAH/wAAD4eAAA8DwAAOA8AAHgHAAB4BwAAOA8AADwPAAA+HgAAHzwAAA84AAAPIAAADwAAAY8YAAPPPAAB73wAAf/4AAD/8AAAP+gAAB/YAAAPuAAADzgAAAY4AAAAAAAAAAAAAAAAAAAAAAA=";break;
}

layout = new Layout({ type:"v", c: [
Expand Down Expand Up @@ -196,7 +197,7 @@ function showMusicMessage(msg) {
msg.new = false;
layout = undefined;
if (wasNew) checkMessages({clockIfNoMsg:1,clockIfAllRead:1,ignoreUnread:1,openMusic:0});
else returnToMain();
else returnToMain();
}
function updateLabels() {
trackName = reduceStringAndPad(msg.track, trackScrollOffset, 13);
Expand Down Expand Up @@ -246,44 +247,169 @@ function showMusicMessage(msg) {
}, 400);
}

function showMessageScroller(msg) {
cancelReloadTimeout();
function showMessagesScroller(msg, persist, alreadyProcessed) {
if (persist===undefined) {persist = true;}
const MSG_IDX = msg ? MESSAGES.findIndex((m)=>m.id==msg.id) : 0;
const INITIATED_FROM = (
alreadyProcessed===undefined ? "other function" :
(MSG_IDX<=alreadyProcessed.idxSpan.start ? "scrolling up" :
(MSG_IDX >= alreadyProcessed.idxSpan.stop-1 ? "scrolling down" :
undefined))
);
if (!alreadyProcessed) {alreadyProcessed = {idxSpan:{}};} // So `alreadyProcessed.idxSpan.start/stop` can be looked for on first run.

const WU = require("widget_utils");
WU.hide();

if (replying) { return; }
if (persist) {cancelReloadTimeout();} else {resetReloadTimeout();}

let idxSpan = (
INITIATED_FROM==="other function" ?
{start : Math.max(MSG_IDX-1, 0), stop : Math.min(MSG_IDX+2, MESSAGES.length)} :
(INITIATED_FROM==="scrolling up" ?
{start : MSG_IDX, stop : alreadyProcessed.idxSpan.start } :
(INITIATED_FROM==="scrolling down" ?
{ start : alreadyProcessed.idxSpan.stop, stop : Math.min(MSG_IDX+1, MESSAGES.length) } :
undefined))
);

active = "scroller";
var bodyFont = fontBig;
g.setFont(bodyFont);
var lines = [];
if (msg.title) lines = g.wrapString(msg.title, g.getWidth()-10);
var titleCnt = lines.length;
if (titleCnt) lines.push(""); // add blank line after title
lines = lines.concat(g.wrapString(msg.body, g.getWidth()-10),["",/*LANG*/"< Back"]);
var titleLines = [];
var messagesWrapped = [];
for (let i=idxSpan.start ; i<idxSpan.stop ; i++) {
let msgLocal = MESSAGES[i];
msgLocal.new = false;

if (msgLocal.id=="music" || msgLocal.source=="maps" || msgLocal.id =="call") {
idxSpan.stop++
if (idxSpan.stop>=MESSAGES.length) {break;}
continue;
}

var lines = [];
const TITLE_STRING = msgLocal.title||msgLocal.sender||msgLocal.subject||msgLocal.src||"No Title";
//const TITLE_STRING = "".concat(msgLocal.title, msgLocal.title&&"\n",
// msgLocal.sender, msgLocal.sender&&"\n",
// msgLocal.subject, msgLocal.subject&&"\n", msgLocal.src) || "No Title";
lines = g.wrapString(TITLE_STRING, g.getWidth()-10);
for (let i=0; i<lines.length; i++) {
titleLines.push(i + (messagesWrapped[0]?messagesWrapped[0].length:0) +
(messagesWrapped[1]?messagesWrapped[1].length:0));
}
var titleCnt = lines.length;
if (titleCnt) {lines.push("");} // add blank line after title
//const PAD_LEN = (MESSAGES.length-i)/2;
//const END_LINE = "-".repeat(PAD_LEN)+"<"+"=".repeat(i)+">"+"-".repeat(PAD_LEN);
const END_LINE = "-".repeat(12);
lines = lines.concat(g.wrapString(msgLocal.body, g.getWidth()-10),
[END_LINE]);
messagesWrapped.push(lines);
}

let allLines = [];
for (let i=0 ; i<messagesWrapped.length ; i++) {
allLines = allLines.concat(messagesWrapped[i]);
}

var initScroll = messagesWrapped[0].length;
if (INITIATED_FROM === "other function") {
if (MSG_IDX==0) {initScroll = 0;}
} else if (INITIATED_FROM === "scrolling up") {
titleLines = titleLines.concat(alreadyProcessed.titleLines.
map((x) => x + allLines.length));
allLines = allLines.concat(alreadyProcessed.lines);
} else if (INITIATED_FROM === "scrolling down") {
initScroll = alreadyProcessed.lines.length-(g.getHeight()/g.getFontHeight());
titleLines = alreadyProcessed.titleLines.concat(titleLines.
map((x) => x + alreadyProcessed.lines.length));
allLines = alreadyProcessed.lines.concat(allLines);
}

if (allLines.length == 0 && alreadyProcessed.lines.length == 0) {
cancelReloadTimeout();
returnToClockIfEmpty();
}

alreadyProcessed = { // Update with the newly processed messages.
lines : allLines,
titleLines : titleLines,
idxSpan: {
start : Math.min(idxSpan.start,
(alreadyProcessed.idxSpan.start===undefined) ?
MESSAGES.length : alreadyProcessed.idxSpan.start),
stop : Math.max(idxSpan.stop, alreadyProcessed.idxSpan.stop||0)}
};

let prevScrollIdx; // Used for stopping repeated triggering of next message by the scroller.

E.showScroller({
scroll : initScroll*g.getFontHeight(),
h : g.getFontHeight(), // height of each menu item in pixels
c : lines.length, // number of menu items
c : allLines.length, // number of menu items
// a function to draw a menu item
draw : function(idx, r) {
// FIXME: in 2v13 onwards, clearRect(r) will work fine. There's a bug in 2v12
g.setBgColor(idx<titleCnt ? g.theme.bg2 : g.theme.bg).
setColor(idx<titleCnt ? g.theme.fg2 : g.theme.fg).
clearRect(r.x,r.y,r.x+r.w, r.y+r.h);
g.setFont(bodyFont).setFontAlign(0,-1).drawString(lines[idx], r.x+r.w/2, r.y);
}, select : function(idx) {
if (idx>=lines.length-2)
showMessage(msg.id, true);
draw : function(scrollIdx, r) {
"ram";
g.setBgColor(titleLines.find(e=>e==scrollIdx)!==undefined ? g.theme.bg2 : g.theme.bg).
setColor(titleLines.find(e=>e==scrollIdx)!==undefined ? g.theme.fg2 : g.theme.fg).
clearRect(r);
g.setFont(bodyFont).setFontAlign(0,-1).drawString(allLines[scrollIdx], r.x+r.w/2, r.y);
// Load in next/previous message on demand by reinitializing showMessagesScroller while passing on the processed messages.
if (scrollIdx>=allLines.length-1 && scrollIdx!=prevScrollIdx &&
alreadyProcessed.idxSpan.stop<MESSAGES.length) {
setTimeout(() => {
E.showScroller();
showMessagesScroller(MESSAGES[alreadyProcessed.idxSpan.stop],
true, alreadyProcessed);
}, 40);
}
if (scrollIdx==0 && scrollIdx!=prevScrollIdx && alreadyProcessed.idxSpan.start>0) {
setTimeout(() => {
E.showScroller();
showMessagesScroller(MESSAGES[alreadyProcessed.idxSpan.start-1],
true, alreadyProcessed);
}, 40);
}
prevScrollIdx = scrollIdx;
},
back : () => showMessage(msg.id, true)
select : function(scrollIdx, touch) {
let msgSelect;
let firstTitleLinePerMsg = [titleLines[0]];
for (let i=1; i<titleLines.length; i++) {
if (titleLines[i]-titleLines[i-1] === 1) {continue;}
firstTitleLinePerMsg.push(titleLines[i]);
}
for (let i=titleLines.length-1; i>=0 ; i--) {
if (scrollIdx>=firstTitleLinePerMsg[i]) {
msgSelect = MESSAGES[i + alreadyProcessed.idxSpan.start];
break;
}
}
if (touch.type == 0) {
WU.show();
showMessage(msgSelect.id, true)
}
if (touch.type == 2) {
WU.show();
showMessageSettings(msgSelect)
}
},
//back : () => showMessage(messages[idx].id, true)
});
}

function showMessageSettings(msg) {
active = "settings";
var menu = {"":{
"title":/*LANG*/"Message",
back:() => showMessage(msg.id, true)
},
"title":/*LANG*/"Message",
back:() => showMessage(msg.id, true)
},
};

if (msg.id!="music")
menu[/*LANG*/"View Message"] = () => showMessageScroller(msg);
menu[/*LANG*/"View Message"] = () => showMessagesScroller(msg);

if (msg.reply && reply) {
menu[/*LANG*/"Reply"] = () => {
Expand Down Expand Up @@ -392,7 +518,7 @@ function showMessage(msgid, persist) {
var maxLines = Math.floor(h / g.getFontHeight());
if (lines.length>maxLines) // if too long, wrap with a bit less spae so we have room for '...'
body = g.setFont(bodyFont).wrapString(body, w-10).slice(0,maxLines).join("\n")+"...";
else
else
body = lines.join("\n");
}
function goBack() {
Expand Down Expand Up @@ -456,7 +582,7 @@ function showMessage(msgid, persist) {
]},
{type:"txt", font:bodyFont, label:body, fillx:1, filly:1, pad:2, cb:()=>{
// allow tapping to show a larger version
showMessageScroller(msg);
showMessagesScroller(msg);
} },
{type:"h",fillx:1, c: footer}
]},{back:goBack});
Expand Down Expand Up @@ -502,7 +628,8 @@ function checkMessages(options) {
// If we have a new message, show it
if (!options.ignoreUnread && newMessages.length) {
delete newMessages[0].show; // stop us getting stuck here if we're called a second time
showMessage(newMessages[0].id, false);
//showMessage(newMessages[0].id, false);
showMessagesScroller(newMessages[0], false);
// buzz after showMessage, so being busy during layout doesn't affect the buzz pattern
if (global.BUZZ_ON_NEW_MESSAGE) {
// this is set if we entered the messages app by loading `messagegui.new.js`
Expand All @@ -527,7 +654,7 @@ function checkMessages(options) {
draw : function(idx, r) {"ram"
var msg = MESSAGES[idx];
if (msg && msg.new) g.setBgColor(g.theme.bgH).setColor(g.theme.fgH);
else g.setBgColor(g.theme.bg).setColor(g.theme.fg);
else g.setBgColor(g.theme.bg).setColor(g.theme.fg);
g.clearRect(r.x,r.y,r.x+r.w, r.y+r.h);
if (!msg) return;
var x = r.x+2, title = msg.title, body = msg.body;
Expand All @@ -538,9 +665,9 @@ function checkMessages(options) {
}
if (img) {
var fg = g.getColor(),
col = require("messageicons").getColor(msg, {settings, default:fg});
col = require("messageicons").getColor(msg, {settings, default:fg});
g.setColor(col).drawImage(img, x+24, r.y+24, {rotate:0}) // force centering
.setColor(fg); // only color the icon
.setColor(fg); // only color the icon
x += 50;
}
if (title) g.setFontAlign(-1,-1).setFont(fontBig).drawString(title, x,r.y+2);
Expand Down
2 changes: 1 addition & 1 deletion apps/messagegui/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"id": "messagegui",
"name": "Message UI",
"shortName": "Messages",
"version": "0.84",
"version": "0.85",
"description": "Default app to display notifications from iOS and Gadgetbridge/Android",
"icon": "app.png",
"type": "app",
Expand Down
2 changes: 1 addition & 1 deletion core
Submodule core updated 2 files
+1 −1 js/comms.js
+16 −16 js/index.js

0 comments on commit 583c6bf

Please sign in to comment.