From df67d082fa102c87c5d5bfe37390e4aadacec517 Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 9 Aug 2024 23:23:14 -0600 Subject: [PATCH] add call functionality --- icons8-double-left-48.png | Bin 0 -> 335 bytes icons8-double-right-48.png | Bin 0 -> 341 bytes icons8-incoming-call-30.png | Bin 0 -> 394 bytes icons8-outgoing-call-30.png | Bin 0 -> 385 bytes icons8-phone-ringing-50.png | Bin 0 -> 732 bytes icons8-phone-ringing-outline-50.png | Bin 0 -> 917 bytes messagebox.lib.js | 68 ++++++++------- messagecenter.app.js | 124 ++++++++++++++++++++-------- messagecenter_call.js | 82 ++++++++++++++++++ messagegui.lib.js | 7 +- 10 files changed, 218 insertions(+), 63 deletions(-) create mode 100644 icons8-double-left-48.png create mode 100644 icons8-double-right-48.png create mode 100644 icons8-incoming-call-30.png create mode 100644 icons8-outgoing-call-30.png create mode 100644 icons8-phone-ringing-50.png create mode 100644 icons8-phone-ringing-outline-50.png create mode 100644 messagecenter_call.js diff --git a/icons8-double-left-48.png b/icons8-double-left-48.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd63af41fa5e2de9c2534d332bd549a962a4456 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?3oVGw3ym^DX&fq{|H z)5S5QV$Rze`?Zf0${hcAe7{1sk5MdVv!kcashot3KR^3@EH{WTGd!teKS{%D$CcPx zvBOV4PkX=o`{KN6zV+*Nzpu4(_tIQC<V zqmBj}K9l+^`a9rsg~qWv3&MfwJ9a0X(G>%#uUcH5Z}UvfTl9Cq@}o1{*Mz(~JlDq} zb9<+`|AovyO5{FjU(>nRMYw&ZTHj^gn2cFFg8r3w+J|lbFFf~ObZU-xZBEC_ fV34E#ToRb9b39$`xnL78gcv+s{an^LB{Ts5t{{_g literal 0 HcmV?d00001 diff --git a/icons8-double-right-48.png b/icons8-double-right-48.png new file mode 100644 index 0000000000000000000000000000000000000000..e5aee7bd7cb60b3b1d809f699f20110688c249c5 GIT binary patch literal 341 zcmV-b0jmCqP)(^9I^zB~~I<0nt(rY=x9DMLJ(EMSKm# zPHaN35-kE+L?Iz+5H>K_2{Qu&^MTzdE~2~pFQk-GN-4SN1Fyiys5kcxT!1q$Ht5a0 z6@#vy6Y!$kn=1iRG3pn1R_tArfw>s<13W7BE-Ju6jQR$KioJ^}uoRg2c;q|BDDAkEp9GuQvHQOr~W{3Df9<~ zet@{^tY07w3Z+;}q1B3RB04xp5eMl~lt3Ol(j=1CykMaR?sjiZUdX+9uwV|!0ezqy zTKWY10JpO&v;rIhUqI7AdJk+Ql`aF2DU^{K8pb?WsaRX$S=1!Aqi#8S>4MkN= z?!ZypvWdS9Meo2`nn(R+*>PQy?@fMc5myW~ad|hXxMYx;E|@w%L|$SpHR3%2umy}2 zahX6IDB@4Kp&*Od>weue0d?3laZ}f*9@7N*aV&x`AA;4ec3|s z30M82^_<8%J_m`O+y^9 o3!DJ2@;_}TTWcvz>4N{wFAmSShN%o9kN^Mx07*qoM6N<$g2x?|U;qFB literal 0 HcmV?d00001 diff --git a/icons8-outgoing-call-30.png b/icons8-outgoing-call-30.png new file mode 100644 index 0000000000000000000000000000000000000000..d05bbcad58872ad570ef25cc73290ea619250909 GIT binary patch literal 385 zcmV-{0e=38P)o79n^9#m>e~)GGv%CKnK!fEN%v zfY@uTClCvT1PmC#5U~uw6sbheLefaW!hBek-6b3TE+Tm_-41X6Ff;pM!9So0JOicF z;wNANyoShEfD7OoIGa;k66wtHW#B;)RQv)vDdZ=bG>b=|U^&~eob^S=Cw_Az)nki) z97!W!jfkZldT!i^B~@H`#8qae6FN@&4ymibT(sv|Aa@q=0SVX!#)h~;B90C5ms}_b zH->xwlv9XTrAc)8ODg%gHjnz3Z)#^$x7TFOLzj$~4WMtxKc(RgjjD`fy@rgQ7ggSF z;9lM($FjErmj;BPYphU2+)THtLb00000NkvXXu0mjfr~{eO literal 0 HcmV?d00001 diff --git a/icons8-phone-ringing-50.png b/icons8-phone-ringing-50.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7a444477222ef3631bbb2e3bf67a43ce86b8af GIT binary patch literal 732 zcmV<20wev2P)%NcC?W4J8_*6+!GUWr z5$9@9$oZJ>RWi~5{D=jT>*gvJ(rog7*BQ#hLnEZCiiLC;-v>BQGQoy{xm74+4)E3Z z%6pO-naVyB@JJO3Icoe~1CwxMj|ut-n2}>4(}A+_+l{9sc+dpio6z@V%%?Y@&pwmu z127Fw95liEbyfQt8+5E#Yl86&IyRn5a(iPIFk}*}z(1=@j?chs-$_oHBujiJ0G65@ zlG8hrb#1>7bdn#Pn&XV-3_(bE5{1`Y%FDs-lKSQ)qr9MZNWa|jid>HA`!N7X=U+CA8vpsQSPr!4;aVdwQ&+%xy>8TdEjqSCeFq#h^rI(uE!x!`eOx6JMzvBz(zq0ChB>^5e1W0?RJr-vjbjV@*$kLU? z`5Um~i(GD}MV_!}mH{0|vNvlUXa~A5$@~1(vkGKt-05$>h$)5$lX5b`n z$Lwn=z37WZ9oGWSfR8{oa9Y1d$fHw7?Wt2OCDqog+l!~#+6MxG|ApTf(bCo9sN5<5 O0000OOYlBSGN3Dc5d3H`}UlBsq-gi zu=m~nzt-C4+_l%*5FkK+03P8EP(v?3NY6iy(BBY9A0Qt{jbk9G^1=8LHCD-q$~Xp6 zDZcR~YD|&HCm=lzfuzfJNWSz47bLVP4uNbI_dFh8y2RcA{bCqMU!YOkTs%UJ1Xsr} zkTv4n#X}TI^f{0mgFupiXW}iuLnH!^CA>HWfh-ZHR<=FGGKt>@5*&Cpfg29%6J#SK zo1ViQObs$H3;!@%HX8MZ_XX=@|xwP`7?F*9C4^*hhYPOv7>uFXqRUzB1 z755(`s-8L)v8&;y3AhLx0=5CAKpv0{j0Q4+K@sh7y5=&qCR?0RX;ewGsRMhh@+Ggk z)o_X$nx_#$4|NGp0A%1lMga4Hy;l1We(H1)VSMcnxvKv|Rui>eyBBYa0X6_HEdQPW z(;^p|SNlT?9s%?GXlOh@qTW>aEg7G;gnwMA$)Cy|E`O|H>KOL`C)7aIs&6shb(^(= zZJKM)ZeAB>H?T-r-G%XSmwYzb%gyAqC@&U_*jo=XmCmX)#WYtBAa=E~CAVsXP8k`qNz2q^|WXprV8QYM~Bn>|I9w8|WL1I05j@KpoX z*IF%J2|Y)Nw5lC>DdK%IgU=caaLgX>#q*-12!A3ij@dHJx|`;W2E!c$vc)lVlUFcW zu9wvr;+PnCpur>uf#c#F#5))*qj}VUGg%xH17|fbhhRq-3d{v|0Ozb)$b6UM@eUJ# z@79I6@oTH@xrTJYDbRYemYvp43OR=!JI0u}=MR4shz!oPN%OTRHk6|c!ew}Ab?Qed3pJ+EI# r0wyR;9{_Hv+^JJD79c=?{{_DQ$Mrw$FVE9V00000NkvXXu0mjfE5wX_ literal 0 HcmV?d00001 diff --git a/messagebox.lib.js b/messagebox.lib.js index 75d7c60..a71529e 100644 --- a/messagebox.lib.js +++ b/messagebox.lib.js @@ -1,3 +1,5 @@ + + let options = { srcFont: "6x8", titleFont: "12x20", @@ -70,11 +72,12 @@ HeaderBox.prototype.draw = function(messageRect) { let y2 = messageRect.y + this.h - 1; exports.setClipRect(x, y, x2, y2); g.setBgColor(options.headerBgColor).clearRect(x, y, x2, y2); + g.setBgColor(g.theme.bg2).clearRect(x+3, y+3, x2-3, y2-3); if (this.new) g.setColor(options.headerHlColor).fillPoly([x, y, x + 20, y, x, y + 20]); g.setColor(options.headerFgColor); g.setFont(options.titleFont); if (this.h > this.minH) { // multi-line title - let titleY = y; + let titleY = y + 3; if (this.titleLines) { for (let line of this.titleLines) { centerString(line, x, titleY, this.titleW); @@ -87,14 +90,13 @@ HeaderBox.prototype.draw = function(messageRect) { } g.setFont(options.srcFont); if (this.h == this.maxH) { - let srcY = y; + let srcY = y+4; for (let line of this.srcLines) { centerString(line, x2 - this.iconW, srcY, this.iconW); srcY += this.srcLineH; } } g.setColor(this.color).drawImage(this.icon, x + this.imgX, y + getImgY()); - g.setColor(g.theme.bg).fillRect(x, y2 - 6, x2, y2); // bar at bottom of header }; const TextBox = function(msg, messageRect) { @@ -227,33 +229,43 @@ MessageBox.prototype.scroll = function(dy) { }; -SwipeBox = function(msg, screenRect) { - this.screenRect = screenRect; - console.log("screenRect = ", screenRect); - console.log("this.screenRect = ", this.screenRect); - this.headerBox = new HeaderBox(msg, screenRect); - //this.bodyRect = {x: screenRect.x, y: screenRect.y + headerBox.h, x2: screenRect.x2, y2: screenRect.y2}; - -}; - -SwipeBox.prototype.draw = function(xOffset) { - const x = this.screenRect.x, y = this.screenRect.y + this.headerBox.h, x2 = this.screenRect.x2, y2 = this.screenRect.y2; - const w = x2 - x + 1; - const yOff = 120 - this.headerBox.h; - this.headerBox.draw(this.screenRect); - g.reset(); - const drawArrows = function (xOffset) { - g.setColor(1, 0, 0); - g.fillPoly([x-w+xOffset, y+yOff, x+50+xOffset, y+yOff, x+60+xOffset, y+yOff+25, x+50+xOffset, y+yOff+50, x-w+xOffset, y+yOff+50]); - g.setColor(0, 1, 0); - g.fillPoly([x2+w+xOffset, y+yOff, x2-50+xOffset, y+yOff, x2-60+xOffset, y+yOff+25, x2-50+xOffset, y+yOff+50, x2+w+xOffset, y+yOff+50]); - - }; - drawArrows(xOffset); -}; +// SwipeBox = function(msg, screenRect) { +// this.msg = msg; +// this.screenRect = screenRect; +// +// console.log("screenRect = ", screenRect); +// console.log("this.screenRect = ", this.screenRect); +// this.headerBox = new HeaderBox(msg, screenRect); +// //this.bodyRect = {x: screenRect.x, y: screenRect.y + headerBox.h, x2: screenRect.x2, y2: screenRect.y2}; +// +// }; +// +// SwipeBox.prototype.draw = function(xOffset) { +// const x = this.screenRect.x, y = this.screenRect.y + this.headerBox.h, x2 = this.screenRect.x2, y2 = this.screenRect.y2; +// //const w = x2 - x + 1; +// const mx = (x + x2) / 2; +// //const yOff = 127 - this.headerBox.h; +// this.headerBox.draw(this.screenRect); +// g.reset(); +// +// // g.setFont("6x15:2").setFontAlign(0,-1); +// // g.drawString(this.msg.body, mx, y); +// g.setColor(0,1,0); +// g.drawImage(incomingImg, mx-25, y+20); +// +// const drawArrows = function(xOffset) { +// g.setColor(1 ,0.25, 0.25); +// g.drawImage(leftImg, x+2, y2-50); +// g.setColor(0, 1, 0); +// g.drawImage(rightImg, x2-50, y2-50); +// +// } +// +// drawArrows(xOffset); +// }; module.exports.HeaderBox = HeaderBox; module.exports.MessageBox = MessageBox; -module.exports.SwipeBox = SwipeBox; +//module.exports.SwipeBox = SwipeBox; module.exports.setOptions = setOptions; module.exports.setClipRect = setClipRect; diff --git a/messagecenter.app.js b/messagecenter.app.js index 8cb9edd..76039c3 100644 --- a/messagecenter.app.js +++ b/messagecenter.app.js @@ -47,6 +47,7 @@ const _cleanup = function() { for (let e in events) if (e) Bangle.removeListener(e, events[e]); for (let t in timeouts) if (timeouts[t]) clearTimeout(timeouts[t]); require("messages").stopBuzz(); + require("widget_utils").show(); }; const clearTimeouts = function() { @@ -61,7 +62,7 @@ const showNoMessages = function() { Bangle.setUI({ mode: "custom", - btn: goBack(), + btn: _e => goBack(), remove: cleanup }); }; @@ -71,7 +72,7 @@ const showMusic = function(music) { Bangle.setUI({ mode: "custom", - btn: goBack(), + btn: _e => goBack() remove: cleanup }); }; @@ -81,7 +82,7 @@ const showMap = function(map) { Bangle.setUI({ mode: "custom", - btn: goBack(), + btn: _e => goBack() remove: cleanup }); }; @@ -91,34 +92,85 @@ const showAlarm = function(alarm) { Bangle.setUI({ mode: "custom", - btn: goBack(), + btn: _e => goBack() remove: cleanup }); }; const showCall = function(call) { + const incomingImg = require("heatshrink").decompress(atob("j0ewIQNgwDCnEAh0B4EAvEOgEB+F//kP4P/+E/weAgH+g8Agf4CQMH8EYgEfEYU8AYV4AQIhBAYMD8ADBg4vBgEPzwDBj/+AYM/AYV//ADCC4X/EwQiCABo=")); + const outgoingImg = require("heatshrink").decompress(atob("j0ewIRO4ACBgeAh0Ag8AvEAh0B+F//kP4P/+E/wASB/0AjkD/EA8EH8EDgEfEwU8AYQhBgAhBFwXgAYMHGwUPzwDBj4mBgE/AYV/FQIDBC4X/EwQiCABoA==")); + const ringingImg = require("heatshrink").decompress(atob("mUywIlimAFEhgFEgYSF4AWEAIYWBAIYWBAIcAsAYBgOAgEYCwQJBBwIWBHIXAA4YSC4EGAoICCDwQ8DAQUgAQMQVtsD///AoU/AoIGCv5BBh/4gF+B4UfwF4Dgd4nAFDg8cB4P/8EA9gFC/wgBBwIzBwEDSQaOB+BzCRAM8SQSQBDAKSCTAPADwMAGoPwh4eBg+An0/SQX/jv/TwUH/wlBAAQkBADwA=")); + const leftImg = require("heatshrink").decompress(atob("mEwwJC/AAkBgEQAoUDwE4AoUHwF4AoUPgHwAoUegPgAoU8gfAAoV4DAIFC+AYBFwXgjwuD4E8FygFFCIodFFIo1FIIpNGLIowSRIiVFAH4A=")); + const rightImg = require("heatshrink").decompress(atob("mEwwJC/AAcIgGAAoUcgPAAoUegPgAoUPgHwAoUHwF4AoUD4E8AoQWBjwqD+AZBAAV4DIIFCngZBGCgFFCIodFFIo1FIIhNFLIouRRIqVFAH8AA==")); Bangle.setUI(); // clear from previous - // const HeaderBox = new require("messagebox").HeaderBox; - // let header = new HeaderBox(call, Bangle.appRect); - g.reset().clear().setFont("12x20") - // header.draw(Bangle.appRect); - //let str = g.wrapString(JSON.stringify(call),g.getWidth()).join("\n"); - //g.drawString(str, 0, 60); - const SwipeBox = require("messagebox").SwipeBox; - const swipeBox = new SwipeBox(call, Bangle.appRect); - let xOff = 0; - swipeBox.draw(xOff); - const handler = function(e) { - xOff += e.dx; - console.log(e, xOff); - g.clear(); - swipeBox.draw(xOff); + g.reset().clear(); + msg = call; + delete msg.new; + if (!msg.name) { + let pn = msg.number.replaceAll(/\D/, ""); // remove any non digit characters + msg.title = `${pn.slice(-10, -7)}-${pn.slice(-7,-4)}-${pn.slice(-4)}`; + } + const cmd = msg.cmd; + + const HeaderBox = require("messagebox").HeaderBox; + const headerBox = new HeaderBox(msg, Bangle.appRect); + const x = Bangle.appRect.x, y = Bangle.appRect.y + headerBox.h, x2 = Bangle.appRect.x2, y2 = Bangle.appRect.y2; + const mx = (x + x2) / 2; + headerBox.draw(Bangle.appRect); + g.reset(); + + const drawLeftArrow = function(imgX) { + imgX = imgX ?? x+2; + g.setColor(1 ,0.25, 0.25); + g.drawImage(leftImg, imgX, y2-50); + }; + const drawRightArrow = function(imgX) { + imgX = imgX ?? x2-50; + g.setColor(0, 1, 0); + g.drawImage(rightImg, imgX, y2-50); + }; + if (cmd === "end") { + if (timeouts.timer) clearTimeout(timeouts.timer); + g.setColor(g.theme.fg).setFont("6x15:2").setFontAlign(0, -1); + g.drawString("Call Ended", mx, y+25); + endTimeout = setTimeout(() => g.clear(), 3000); + } + + if (cmd === "incoming") { + drawLeftArrow(); + drawRightArrow(); + g.setColor(0,1,0); + g.drawImage(ringingImg, mx-25, y+15); + } + if (cmd === "start" || cmd === "outgoing") { + drawLeftArrow(x2 - 52); + startTime = parseInt(Date.now()/1000); + g.setColor(g.theme.fg); + g.drawImage(cmd === "start" ? incomingImg : outgoingImg, x+10, y+20); + const timer = () => { + g.clearRect(mx-45, y+20, mx+70, y+50); + elapsed = parseInt(Date.now()/1000) - startTime; + const h = ("0" + Math.floor((elapsed/3600)%60)).slice(-2); + const m = ("0" + Math.floor((elapsed/60)%60)).slice(-2); + const s = ("0" + Math.floor(elapsed%60)).slice(-2); + g.setFont("Vector:25").setFontAlign(0, -1).drawString(`${h}:${m}:${s}`, mx + 15, y+25); + timeouts.timer = setTimeout(timer, 1000); + }; + timer(); + } + + const handler = function(dir) { + if (cmd === "end") return; + if (dir < 0) return Bangle.messageResponse(msg, false); + else if (dir > 0 && cmd === "incoming") return Bangle.messageResponse(msg, true); }; Bangle.setUI({ mode: "custom", - drag: handler, - btn: goBack, + touch: () => {if (buzzing) return require("messages".stopBuzz())}, + swipe: handler, + btn: _e => goBack(), remove: cleanup }); }; @@ -496,6 +548,7 @@ const showText = function(messageNum) { msgBoxes[messageNum].draw(); drawFooter(); + idle = true; checkForNewMessages(); }; // function showText @@ -608,17 +661,22 @@ const filterMessages = function() { map = Bangle.MESSAGES.find(m => m.type === "map"); music = Bangle.MESSAGES.find(m => m.type === "music"); Bangle.MESSAGES = Bangle.MESSAGES.filter(m => m.type === "text"); + let newUnhandledTexts = Bangle.MESSAGES.filter(m => m.new && !m.handled); + let newHandledTexts = Bangle.MESSAGES.filter(m => m.new && m.handled); + let otherTexts = Bangle.MESSAGES.filter(m => !m.new && !m.handled); + Bangle.MESSAGES = [].concat(newUnhandledTexts, newHandledTexts, otherTexts); }; const showMessage = function() { if (call) {setActive("call"); return showCall(call);} - else if (alarm && !alarm.handled) {setActive("alarm"); return showAlarm(alarm);} - else if (map && !map.handled) {setActive("map"); return showMap(map);} - else if (music && !music.handled) {setActive("music"); return showMusic(music);} + else if (alarm) {setActive("alarm"); return showAlarm(alarm);} + else if (map) {setActive("map"); return showMap(map);} + else if (music) {setActive("music"); return showMusic(music);} else { idx = Bangle.MESSAGES.findIndex(m => !m.handled); if (idx >= 0) { - for (let m of Bangle.MESSAGES) m.handled = true; // set all text messages as handled + Bangle.MESSAGES.every(m => m.handled = true); // set all text messages as handled + //for (let m of Bangle.MESSAGES) m.handled = true; // set all text messages as handled setActive("text"); return showText(idx); } @@ -627,10 +685,11 @@ const showMessage = function() { }; // entry point -events.saveMessages = function() { +saveMessages = function() { require("messages").write(Bangle.MESSAGES); }; -E.on("kill", events.saveMessages); +//E.on("kill", events.saveMessages); +setListener("kill", saveMessages); Bangle.loadWidgets(); require("widget_utils").hide(); @@ -639,16 +698,13 @@ if (!Bangle.MESSAGES || !Bangle.MESSAGES.length) { Bangle.MESSAGES = require("messages").getMessages(); } +if (!Bangle.MESSAGES.length) showNoMessages(); + if (Bangle.notify) { // notification arrived that opened the app. This is set in messagecenter.notify.js buzzing = true; require("messages").buzz(Bangle.MESSAGES[0].src); delete Bangle.notify; - filterMessages(); - showMessage(); -} else { // user opened the app - if (!Bangle.MESSAGES.length) showNoMessages(); - else { - showText(); // show all messages - } } +filterMessages(); +showMessage(); //} diff --git a/messagecenter_call.js b/messagecenter_call.js new file mode 100644 index 0000000..4621ab6 --- /dev/null +++ b/messagecenter_call.js @@ -0,0 +1,82 @@ +const showCall = function(call) { + const incomingImg = require("heatshrink").decompress(atob("j0ewIQNgwDCnEAh0B4EAvEOgEB+F//kP4P/+E/weAgH+g8Agf4CQMH8EYgEfEYU8AYV4AQIhBAYMD8ADBg4vBgEPzwDBj/+AYM/AYV//ADCC4X/EwQiCABo=")); + const outgoingImg = require("heatshrink").decompress(atob("j0ewIRO4ACBgeAh0Ag8AvEAh0B+F//kP4P/+E/wASB/0AjkD/EA8EH8EDgEfEwU8AYQhBgAhBFwXgAYMHGwUPzwDBj4mBgE/AYV/FQIDBC4X/EwQiCABoA==")); + const ringingImg = require("heatshrink").decompress(atob("mUywIlimAFEhgFEgYSF4AWEAIYWBAIYWBAIcAsAYBgOAgEYCwQJBBwIWBHIXAA4YSC4EGAoICCDwQ8DAQUgAQMQVtsD///AoU/AoIGCv5BBh/4gF+B4UfwF4Dgd4nAFDg8cB4P/8EA9gFC/wgBBwIzBwEDSQaOB+BzCRAM8SQSQBDAKSCTAPADwMAGoPwh4eBg+An0/SQX/jv/TwUH/wlBAAQkBADwA=")); + const leftImg = require("heatshrink").decompress(atob("mEwwJC/AAkBgEQAoUDwE4AoUHwF4AoUPgHwAoUegPgAoU8gfAAoV4DAIFC+AYBFwXgjwuD4E8FygFFCIodFFIo1FIIpNGLIowSRIiVFAH4A=")); + const rightImg = require("heatshrink").decompress(atob("mEwwJC/AAcIgGAAoUcgPAAoUegPgAoUPgHwAoUHwF4AoUD4E8AoQWBjwqD+AZBAAV4DIIFCngZBGCgFFCIodFFIo1FIIhNFLIouRRIqVFAH8AA==")); + Bangle.setUI(); // clear from previous + g.reset().clear(); + msg = call; + delete msg.new; + if (!msg.name) { + let pn = msg.number.replaceAll(/\D/, ""); // remove any non digit characters + msg.title = `${pn.slice(-10, -7)}-${pn.slice(-7,-4)}-${pn.slice(-4)}`; + } + const cmd = msg.cmd; + + const HeaderBox = require("messagebox").HeaderBox; + const headerBox = new HeaderBox(msg, Bangle.appRect); + const x = Bangle.appRect.x, y = Bangle.appRect.y + headerBox.h, x2 = Bangle.appRect.x2, y2 = Bangle.appRect.y2; + const mx = (x + x2) / 2; + let timerInt; //TODO deal with this + headerBox.draw(Bangle.appRect); + g.reset(); + + const drawLeftArrow = function(imgX) { + imgX = imgX ?? x+2; + g.setColor(1 ,0.25, 0.25); + g.drawImage(leftImg, imgX, y2-50); + }; + const drawRightArrow = function(imgX) { + imgX = imgX ?? x2-50; + g.setColor(0, 1, 0); + g.drawImage(rightImg, imgX, y2-50); + }; + if (cmd === "end") { + if (timerInt) clearTimeout(timerInt); //TODO change timerInt variable + g.setColor(g.theme.fg).setFont("6x15:2").setFontAlign(0, -1); + g.drawString("Call Ended", mx, y+25); + endTimeout = setTimeout(() => g.clear(), 3000); + } + + if (cmd === "incoming") { + drawLeftArrow(); + drawRightArrow(); + g.setColor(0,1,0); + g.drawImage(ringingImg, mx-25, y+15); + } + if (cmd === "start" || cmd === "outgoing") { + drawLeftArrow(x2 - 52); + startTime = parseInt(Date.now()/1000); + g.setColor(g.theme.fg); + g.drawImage(cmd === "start" ? incomingImg : outgoingImg, x+10, y+20); + const timer = () => { + g.clearRect(mx-45, y+20, mx+70, y+50); + elapsed = parseInt(Date.now()/1000) - startTime; + const h = ("0" + Math.floor((elapsed/3600)%60)).slice(-2); + const m = ("0" + Math.floor((elapsed/60)%60)).slice(-2); + const s = ("0" + Math.floor(elapsed%60)).slice(-2); + g.setFont("Vector:25").setFontAlign(0, -1).drawString(`${h}:${m}:${s}`, mx + 15, y+25); + timerInt = setTimeout(timer, 1000); //TODO put into intervals object + }; + timer(); + } + + const handler = function(dir) { + + } + + Bangle.setUI({ + mode: "custom", + swipe: handler, + btn: () => {clearInterval(timerInt)} + }); +}; + + + +let msg = {"t":"call","cmd":"start","name":"","number":"1306-7740297","id":"call","src":"Phone","positive":true,"negative":true,"title":"Hayley Thiessen, Wifey","body":"Incoming call\n13067740297","new":true,"show":true,"type":"call"} + +g.reset(); +showCall(msg); + diff --git a/messagegui.lib.js b/messagegui.lib.js index d34176a..0f15b39 100644 --- a/messagegui.lib.js +++ b/messagegui.lib.js @@ -32,4 +32,9 @@ exports.messageListener = function(type, msg) { } else { Bangle.emit("breakingnews", type, msg); } -} +}; // messageListener + + +exports.open = function(msg) { + Bangle.load("messagecenter.app.js"); +};