let timeouts = {}; const goBack = function() {}; const cleanup = function() {}; 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; headerBox.draw(Bangle.appRect); g.reset(); const drawAcceptArrow = function(xOffset) { xOffset = xOffset??0; imgX = x + 2 + xOffset; g.setColor(0, 1, 0); g.drawImage(rightImg, imgX, y2-50); if (xOffset > 0) g.fillRect(imgX+3, y2-43, x, y2-9); }; const drawRejectArrow = function(xOffset) { xOffset = xOffset??0; let imgX = x2 - 50 - xOffset; g.setColor(1, 0.25, 0.25); g.drawImage(leftImg, imgX, y2-50); if (xOffset > 0) g.fillRect(imgX+45, y2-43, x2, y2-9); }; 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); timeouts["endTimeout"] = setTimeout(() => g.clear(), 3000); } if (cmd === "incoming") { drawRejectArrow(); drawAcceptArrow(); g.setColor(0,1,0); g.drawImage(ringingImg, mx-25, y+15); } if (cmd === "start" || cmd === "outgoing") { drawRejectArrow(); 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) leftHandler(dir); else if (dir > 0 && cmd === "incoming") rightHandler(); }; const leftHandler = function(dir) { let xOff = 0; const swipeAnimation = () => { xOff += 30; g.clearRect(x, y2-50, x2, y2); drawRejectArrow(xOff); if (xOff > 160) return; else setTimeout(swipeAnimation, 30); } swipeAnimation(); if (timeouts.timer) clearTimeout(timeouts.timer); return Bangle.messageResponse(msg, false); }; const rightHandler = function(dir) { let xOff = 0; const swipeAnimation = () => { xOff += 30; g.clearRect(x, y2-50, x2, y2); drawAcceptArrow(xOff); if (xOff > 160) return; else setTimeout(swipeAnimation, 30); } swipeAnimation(); if (timeouts.timer) clearTimeout(timeouts.timer); return Bangle.messageResponse(msg, true); }; Bangle.setUI({ mode: "custom", touch: () => {if (buzzing) return require("messages".stopBuzz())}, swipe: handler, btn: _e => goBack(), remove: cleanup }); }; let msg = {"t":"call","cmd":"incoming","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);