BangleApps/apps/kanagsec/app.js

153 lines
23 KiB
JavaScript
Raw Normal View History

2023-05-07 18:14:03 +00:00
function getKanagawa() {
return require("heatshrink").decompress(atob("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
}
2023-05-08 17:30:14 +00:00
Graphics.prototype.setFontDarumadropOneRegular = function () {
2023-05-07 18:14:03 +00:00
// Actual height 36 (42 - 7)
return this.setFontCustom(
E.toString(require('heatshrink').decompress(atob('ACHwAol+Aokf4AFDg4SEgP8CQl/AokPwASEJT1wAol8G4oxEv5KEn5KEn//CIn/DAYFF/4FJgILKDoQpDBY4FDj//TIcH//gDAilEn6rFAokAC4gAah/4AohLEAoIMDAoIMDKIP/UIUDAoP+QQgSDAoQfCOwISDOwOPCQQkBBwJgBEgOAIoZ8BgIYCn4PBcAQPCj4+BgYPBh7gBHoPAEIIYC+AICB4ISBVQQPB4F/GIf+JQoABN4i9DAoSxCCQR8CCQSPDOAJDBSoYFDGQTbEar4AJRgV8KAQwBn58CJwMPSokDJYS0BBAQeB8Z2DQQYYBQQauDR4jmCDDuAcAZQBJQYACSwgVBSs8DAQMwAQMBIIM/TwMBHYMPZ4RUBg7tCv/wgZjCj5UBMYTyBBwR8CwE/PgZvBPgfgCgJ8C/AUBDAX+AoIYD4auS/bgDDoIYCn///z5CCQT5CCQUBDARICv6CCOwMfPgKkeAoabCvBmBG4U/MwQCBVYUfAQMHB4ICCPgMH4BjC/+D+E/CQICB/kPYIJmBv+DLIJcBEYKxBDAOP/AYDQQIYDPgPDDAShCDAauN/75CAoRjD/1/EgISCFoKbC/+BAocDfIKncg4wCSwQqDKIStCAoRPCOwYLENAR8DfwR8CDAf/+YYE+AYDg/gn4YCgHAEAJEDZ4ITDHAImDHASJEVwYXCLAd/DAhLCDATIDGIQGBTYk/GwQZCJQYyBYwRlDAokfDAkDSoYAYIYpvBHoYFB/kBA4J1CgJFBMQXAv5ICDAMfH4KUB/kHPgJ7CgJ8BRwOfDAIzB/+HDAcf8P+DAQCBv/nGIIbBWoSnCw7HDDAK0Dg/wHIIeBJoI5BSwU/HIK6ChBMCVAiiFn6bbPwTBEG4Z3CBgYFCKAIFDHwYFCCQQFCCQV/AoIlCLYP1Z4SHB/EfY4J0BTYbHCFoI8Ev4rBv/H/E/SoMPTYMfSoXwGQIxCnC0EgjuDKIQSBDwIABHII9BAAISBKwQSCXQSuCBYgAXaQpJBIQY8HGwimEDwQYLJIaSCDAgXBgauBh4XBg52BgaMBh4aCXwLHE8CPDj/7AoIbBTQRMDAoTgEKQZKBAoYYCJYYFFPgK5Dg5pEgB7EADMD+EPFgQ+Bh4nCRIPvOQJdEPgZXEMYZ8CCQhQB//zOwIkBBQN/EoP/g/8HAU/wP/gYYBBAN/4AYBBAMf+E/DAN/JIMfDAMf84xGVAQxCJQ7gCMYSXC//xZoQlB/E/AoRJBgIFCgEMVDsPbIY+CAoowDWgJbBWgbnEfIpjBCQauC4FgKwP+R4N8DwUD/t/CQKxBCYKuC8AgBSoX4H4KVC/w/BJgV/4KVDcAZFBCASbEAohEDMYZdEv4FEZwIFDgF+VDsHZokH+KJDgf8PAKcDz57BTgXvUQcP+YYGJQkPKIcOgIkDABQ'))),
46,
atob("DBkiGhobHxkbHBsbDQ=="),
2023-05-08 17:30:14 +00:00
50 | 65536
2023-05-07 18:14:03 +00:00
);
};
2023-05-08 17:30:14 +00:00
Graphics.prototype.setFontDarumadropOneRegular_small = function () {
2023-05-07 18:14:03 +00:00
// Actual height 15 (16 - 2)
return this.setFontCustom(
E.toString(require('heatshrink').decompress(atob('AAcwgEHwAECAAkHgEB/EAv8An/Ag/wgP8gEfC4PgC4oVD8EP/8A//wj8PgPwAgWA/PwBwfgg4lCEAegkEOg+B8/4j//wP/Agf8F4JKBAAlwuEPx4xB/Eej4dHh/nwF4NoeAuEeg8B814jnnCYN4DAZUBJ4PzNwsD+BZBKwKBBAgMIAQM//ED/+AAgMAvCmHj/hgP+nEf8eB904jw2B9/wjiuBg42DgQCB/wsBSoQdBJQPHgff+EZHYMPDAN8QwqmC4DRCj0BgPhNARtDFgIBBhzzEA4J8DCYM4jnzXomABwMHxg2FvxCBQwUQj1/XoRtCd4MPRAITBUgu8NoPAAgQABA'))),
46,
atob("BQoNCgoLDAoLCwsLBQ=="),
2023-05-08 17:30:14 +00:00
20 | 65536
2023-05-07 18:14:03 +00:00
);
};
2023-05-08 17:30:14 +00:00
// returns the temperature from weather json, if weather is provided trough
//android/ios .. if no temperature is available, it wont be displayed.
//(returns empty string).
function getTemperature() {
try {
var weatherJson = storage.readJSON('weather.json');
var weather = weatherJson.weather;
return "Temp: " + Math.round(weather.temp - 273.15);
} catch (ex) {
return "";
}
}
2023-05-07 18:14:03 +00:00
const storage = require('Storage');
require("Font8x16").add(Graphics);
var IMAGEWIDTH = 176;
var IMAGEHEIGHT = 176;
var energySave = false;
2023-05-08 17:30:14 +00:00
var batteryLvl = E.getBattery() + "%";
var temperature = getTemperature();
2023-05-07 18:14:03 +00:00
// timeout used to update every minute
var drawTimeout;
// schedule a draw for the next minute
function queueDraw()
{
2023-05-07 18:14:03 +00:00
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function ()
{
2023-05-07 18:14:03 +00:00
drawTimeout = undefined;
draw();
2023-05-08 17:30:14 +00:00
}, (energySave == true ? 60000 : 1000) - (Date.now() % (energySave == true ? 60000 : 1000)));
2023-05-07 18:14:03 +00:00
}
2023-05-08 17:30:14 +00:00
function draw() {
// sometimes, when gadgetbridge sends a message, the locked event is not thrown after the messages was displayed.
// this checks the lock state manually and set the energysave.
if (!energySave && Bangle.isLocked()) { energySave=true; }
2023-05-07 18:14:03 +00:00
var date = new Date();
var x = 10;
var y = 2;
g.reset();
//draw main background image
2023-05-08 17:30:14 +00:00
g.drawImage(getKanagawa(), 0, 0);
2023-05-07 18:14:03 +00:00
// only update the batterylvl and temperature every 30 seconds or every minute if energysave is on
if (date.getSeconds() % 30 == 0)
{
2023-05-08 17:30:14 +00:00
batteryLvl = E.getBattery() + "%";
temperature = getTemperature();
2023-05-07 18:14:03 +00:00
}
g.setFont("8x16");
2023-05-08 17:30:14 +00:00
g.drawString(temperature, 4, g.getHeight() - 40);
g.drawString(batteryLvl, g.getWidth() - g.stringWidth(batteryLvl) - 2, y);
2023-05-07 18:14:03 +00:00
// work out locale-friendly date/time
var h = date.getHours();
var m = date.getMinutes();
var s = date.getSeconds();
2023-05-08 17:30:14 +00:00
var timeStr = h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0);
var timeStr2 = s.toString().padStart(2, 0);
2023-05-07 18:14:03 +00:00
var dateStr = require("locale").date(new Date(), 1);
dateStr = dateStr.replace(new RegExp('/', 'g'), '.');
2023-05-08 17:30:14 +00:00
var nameOfCurrentDay = require("locale").dow(date, 0).toUpperCase();
2023-05-07 18:14:03 +00:00
//---Hour and minute---
g.setColor("#000000");
g.setFont("DarumadropOneRegular");
2023-05-08 17:30:14 +00:00
g.drawString(timeStr, x, y);
2023-05-07 18:14:03 +00:00
// ---Seconds---
2023-05-08 17:30:14 +00:00
x += 2 + g.stringWidth(timeStr);
y += 24;
2023-05-07 18:14:03 +00:00
//only print seconds if screen is active and not locked
2023-05-08 17:30:14 +00:00
if (!energySave) {
2023-05-07 18:14:03 +00:00
g.setFont("DarumadropOneRegular_small");
2023-05-08 17:30:14 +00:00
g.drawString(timeStr2, x, y);
2023-05-07 18:14:03 +00:00
}
// ---draw date---
y += 45;
g.setColor("#000000");
g.setFont("8x16");
2023-05-08 17:30:14 +00:00
g.drawString(nameOfCurrentDay, 65, y);
y += 15;
g.drawString(dateStr, 65, y);
2023-05-07 18:14:03 +00:00
queueDraw();
}
// Stop updates when LCD is off, restart when on
2023-05-08 17:30:14 +00:00
Bangle.on('lock', on => {
if (on) {
energySave = true;
2023-05-07 18:14:03 +00:00
}
2023-05-08 17:30:14 +00:00
else {
energySave = false;
2023-05-07 18:14:03 +00:00
}
draw();
2023-05-07 18:14:03 +00:00
});
g.clear();
draw();
// Show launcher when middle button pressed
Bangle.setUI("clock");
Bangle.loadWidgets();
2023-05-08 17:30:14 +00:00
try {
2023-05-07 18:14:03 +00:00
require("widget_utils").swipeOn(); // hide widgets, make them visible with a swipe
}
2023-05-08 17:30:14 +00:00
catch (ex) {
2023-05-07 18:14:03 +00:00
require("widget_utils").hide();
}