diff --git a/apps/messagegui/ChangeLog b/apps/messagegui/ChangeLog index 8df10755583..c6e7be674d8 100644 --- a/apps/messagegui/ChangeLog +++ b/apps/messagegui/ChangeLog @@ -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. diff --git a/apps/messagegui/app.js b/apps/messagegui/app.js index 21cd1c3e1a0..e355b607dd6 100644 --- a/apps/messagegui/app.js +++ b/apps/messagegui/app.js @@ -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") { @@ -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); @@ -105,8 +106,8 @@ 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")) { @@ -114,26 +115,26 @@ function showMapMessage(msg) { 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: [ @@ -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); @@ -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=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"+"-".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 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=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 { + 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=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"] = () => { @@ -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() { @@ -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}); @@ -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` @@ -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; @@ -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); diff --git a/apps/messagegui/metadata.json b/apps/messagegui/metadata.json index 3e0538d9e67..e0f47c6bc3c 100644 --- a/apps/messagegui/metadata.json +++ b/apps/messagegui/metadata.json @@ -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", diff --git a/core b/core index bf08b484830..08dee6d5842 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit bf08b484830ef4e811faf67ec663ebf839b5d09b +Subproject commit 08dee6d58420ab2d04f42bdd23d8255f74bdcf15