From 9ab4ed8a129686becbef21ba4bf4e9ffefeb196f Mon Sep 17 00:00:00 2001
From: June Bennison <june_github@bennisons.net>
Date: Sat, 25 Jan 2025 18:21:45 +1100
Subject: [PATCH 1/4] Add Dense Clock app

---
 apps/denseclock/app-icon.js   |   1 +
 apps/denseclock/app.js        | 157 ++++++++++++++++++++++++++++++++++
 apps/denseclock/app.png       | Bin 0 -> 1569 bytes
 apps/denseclock/metadata.json |  14 +++
 4 files changed, 172 insertions(+)
 create mode 100644 apps/denseclock/app-icon.js
 create mode 100644 apps/denseclock/app.js
 create mode 100644 apps/denseclock/app.png
 create mode 100644 apps/denseclock/metadata.json

diff --git a/apps/denseclock/app-icon.js b/apps/denseclock/app-icon.js
new file mode 100644
index 0000000000..380a7b4ff8
--- /dev/null
+++ b/apps/denseclock/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mElwMBwf/AAeAAomYAomcAov4/E/w/jzngnEPg+AzninGOn+IznnnPOn+cCIIFBh4RBAoPPC4Xn/PP8efAo3jAoWPwAdCC4OB+AjC4BGEAEnH/ADBx/BGoN//0PwPx8E/AoOP/HnAoPPAoPmn0/ApHkn//5+DDoQFBEYPhAoX48YFE4/jAogvBAoWP8QFBFAKDBn0+geBwHwvwFBwYA="))
diff --git a/apps/denseclock/app.js b/apps/denseclock/app.js
new file mode 100644
index 0000000000..62a40154e6
--- /dev/null
+++ b/apps/denseclock/app.js
@@ -0,0 +1,157 @@
+// FONTS
+
+/*
+    Share Tech Mono: https://fonts.google.com/specimen/Share+Tech+Mono
+    Converted with: https://www.espruino.com/Font+Converter
+*/
+
+Graphics.prototype.setFontShareTechMonoBig = function(scale) {
+  // Actual height 56 (55 - 0)
+  this.setFontCustom(
+    atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAHwAAAAAAAA/wAAAAAAAD/wAAAAAAAf/wAAAAAAB//gAAAAAAP/8AAAAAAA//wAAAAAAH/+AAAAAAA//4AAAAAAD//AAAAAAAf/8AAAAAAB//gAAAAAAP/8AAAAAAB//wAAAAAAH/+AAAAAAA//4AAAAAAD//AAAAAAAf/4AAAAAAB//gAAAAAAP/8AAAAAAA//wAAAAAAA/+AAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///4AAAAD/////AAAAP/////wAAAf/////4AAA//////8AAA//////8AAB/AAB/j+AAB+AAH/B+AAB8AAP8A+AAB8AA/4A+AAB8AB/gA+AAB8AH/AA+AAB8AP8AA+AAB8A/4AA+AAB8B/gAA+AAB+D/AAB+AAA//+AAP8AAA//////8AAAf/////4AAAP/////wAAAH/////gAAAB////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAeAAAfgAAAA+AAAfAAAAA+AAA/AAAAA+AAA+AAAAA+AAA+AAAAA+AAB+AAAAA+AAB8AAAAA+AAB//////+AAB//////+AAB//////+AAB//////+AAB//////+AAB//////+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAB8AAAAD+AAB8AAAAP+AAB8AAAAf+AAB8AAAB/+AAB8AAAD/+AAB8AAAH/+AAB8AAAf8+AAB8AAA/4+AAB8AAD/w+AAB8AAH/A+AAB+AAf+A+AAB+AA/4A+AAA////wA+AAA////gA+AAAf//+AA+AAAP//8AA+AAAH//wAA+AAAB/+AAA+AAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAA+AAB8AAAAA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AD8AA+AAB+AH+AB+AAA////gD+AAA//////8AAAf/////8AAAP//P//4AAAH/+H//wAAAA/4D//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP/wAAAAAAD//wAAAAAB///wAAAAAf///wAAAAH////wAAAB///+HwAAAB///gHwAAAB//wAHwAAAB/4AAHwAAAB+AAAHwAAABAAAAHwAAAAAAP///+AAAAAf///+AAAAAf///+AAAAAf///+AAAAAf///+AAAAAf///+AAAAAAAHwAAAAAAAAHwAAAAAAAAHwAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///wAA+AAB///wAA+AAB///wAA+AAB///wAA+AAB///wAA+AAB///wAA+AAB8AHwAA+AAB8AHwAA+AAB8AHwAA+AAB8AD4AA+AAB8AD4AA+AAB8AD4AB+AAB8AD+AD+AAB8AD///8AAB8AB///8AAB8AA///4AAB8AAf//wAAB4AAP//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAP/////gAAAf/////4AAAf/////4AAA//////8AAA/APgAD+AAB+APgAB+AAB8APgAA+AAB8APgAA+AAB8APgAA+AAB8APgAA+AAB8APgAA+AAB8APgAA+AAB8AHwAA+AAB8AHwAB+AAB8AH+AP8AAB8AH///8AAB8AD///4AAAAAB///wAAAAAA///gAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAB8AAAAAAAAB8AAAAAAAAB8AAAAAAAAB8AAAAAOAAB8AAAAD+AAB8AAAAf+AAB8AAAD/+AAB8AAA//+AAB8AAH//+AAB8AB///gAAB8AP//8AAAB8D///AAAAB8f//4AAAAB////AAAAAB///wAAAAAB//+AAAAAAB//gAAAAAAB/8AAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//AAAAD/8H//wAAAP//P//4AAAf/////8AAA//////8AAA//////+AAB/AP+AB+AAB8AD8AA+AAB8AD8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AD8AA+AAB+AH+AA+AAA////AD+AAA//////8AAAf/////8AAAP//P//4AAAH/+H//wAAAA/4D//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAP//+AAAAAAf///AAAAAAf///AA+AAA////gA+AAB/AAfgA+AAB+AAPgA+AAB8AAPwA+AAB8AAHwA+AAB8AAHwA+AAB8AAHwA+AAB8AAHwA+AAB8AAHwA+AAB8AAHwB+AAB+AAHwB+AAA//////8AAA//////8AAAf/////4AAAP/////wAAAH/////gAAAB////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAB+AAAAB+AAB+AAAAB+AAB+AAAAB+AAB+AAAAB+AAB+AAAAB+AAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'),
+    46,
+    32,
+    60+(scale<<8)+(1<<16)
+  );
+  return this;
+};
+
+Graphics.prototype.setFontShareTechMono = function(scale) {
+  // Actual height 38 (37 - 0)
+  this.setFontCustom(
+    atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAeAAAAAB4AAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAfAAAAAP8AAAAD/gAAAB/4AAAAf+AAAAP/AAAAH/gAAAB/4AAAA/8AAAAP/AAAAH/gAAAD/wAAAA/8AAAAP+AAAAA/gAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//4AAA///8AAP///8AA////wAHwAfvgAeAH4eABwA/A4AHAHwDgAcB+AOAB4PgB4AHj8AHgAf///+AA////wAB///+AAD///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAOAA8AAA4ADwAADgAeAAAOAB4AAA4AH////gAf///+AB////4AH////gAAAAAOAAAAAA4AAAAADgAAAAAOAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AHAAAfgAcAAD+ABwAA/4AHAAH/gAcAA/OABwAP44AHgB+DgAfAfwOAA//8A4AD//gDgAH/4AOAAH+AA4AAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAOABwBwA4AHAHADgAcAcAOABwBwA4AHAHADgAeA+AOAB8H4B4AD////gAP///8AAf+f/gAAPgf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAP+AAAAP/4AAAf//gAAf//OAAB//A4AAH+ADgAAcAAOAAAAH//4AAA///gAAD//+AAAP//4AAAAHgAAAAAOAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+ADgAf/4AOAB//gA4AH/+ADgAcA4AOABwDgA4AHAPADgAcA8AeABwD//4AHAH//AAcAP/4AAAAf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAH///4AA////wAH////gAeB4AeABwHgA4AHAeADgAcB4AOABwHgA4AHAeAHgAcA//+ABwD//wAAAH/+AAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAABwAAAAAHAAAAgAcAAAeABwAAf4AHAAP/gAcAH/+ABwH/+AAHD//AAAf//AAAB//gAAAH/gAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAP+f/gAD////AAP///+AB//8B4AHgPgDgAcAcAOABwBwA4AHAHADgAcAcAOAB4D4B4AH////gAP///8AAf/f/wAAfw/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAH/+AAAA//8A4AH4HwDgAeAHgOABwAeA4AHAB4DgAcAHgOABwAeB4AHgB4HgAf///+AA////wAB///+AAB///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AHgAAHgAeAAAeAB4AAB4AHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='),
+    46,
+    22,
+    40+(scale<<8)+(1<<16)
+  );
+  return this;
+};
+
+Graphics.prototype.setFontShareTechMonoSmall = function(scale) {
+  // Actual height 23 (22 - 0)
+  this.setFontCustom(
+    atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zgP/zgP/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAPwAAPwAAAAAAPwAAPwAAPAAAAAAAAAAAAAAAAAAAAAAAAwYAP//gP//gP//gAwYAP//gP//gP//gAwYAAAAAAAAAAAAAAAAAB4AAD+BgH/Bg+HB8+DB8+DB8GD/gGB/AAAcAAAAAAAAAABAAH7AAP7AAMLAAMbAAP7AAHzfAAG/gAGxgAGxgAG/gAGfAAGAAAAAAAAAADz/AH//gP+DgMOBgMMBgMMBgMP/gAP/gAMAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAPwAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wP//8/AA+4AAGgAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAC4AAG/AB+P//8D//wAAAAAAAAAAAAAAAAAAAAAAAADAAADuAAB+AAP4AAfwAAP8AAB+AADsAADAAAAAAAAAAAAAAAAAAAADgAADgAADgAAf8AAf8AAf8AADgAADgAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAD+AAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAADgAADgAADgAADgAADgAADgAADgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAADgAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAeAAD8AAfwAB+AAP4AA/AAH8AAfgAA8AAAwAAAAAAAAAAAAAAAD/+AH//APB/gMDxgMHBgMeBgP//gH//AD/+AAAAAAAAAAAAAAAAAGAAgGABgOABgOABgP//gP//gAABgAABgAABgAAAAAAAAAAAAAAAAAABgMAHgMAPgMA9gMB5gOHxgH/BgD+BgAABgAAAAAAAAAAAAAAAAAAAAMCBgMGBgMGBgMHBgP/DgH//gD5/AAAAAAAAAAAAAAAAAAAAAAD4AA/4AP/4APwYAMAYAAP/gAP/gAAcAAAYAAAAAAAAAAAAAAAAAAAAAP+BgP+BgMGBgMGBgMHDgMH/gMD/AAAAAAAAAAAAAAAAAAAAAD/+AH//AP//gMMBgMMBgMOBgMP/gMH/AAD+AAAAAAAAAAAAAAAAAMAAAMAAAMADgMAfgMH/AM/4AP/AAPwAAGAAAAAAAAAAAAAAAAAAAD5/AH//gP/DgMHBgMGBgMHBgP/jgH//gD5/AAAAAAAAAAAAAAAAAD+AAH/AgP/hgMBhgMBhgMBhgP//gH//AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcDgAcDgAcDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAcD+AcD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAHgAAPwAAMwAAc4AAY4AA4cAA4cABwMAAAAAAAAAAAAAAAAAAMYAAMYAAMYAAMYAAMYAAMYAAMYAAMYAAMYAAAAAAAAAAAAAAAAABwMAA4cAA4cAAY4AAc4AAMwAAPwAAHgAAHgAAAAAAAAAAAAAAAAAAAAAMAAAMABgMDzgMHzgOeAAH8AAD4AAAAAAAAAAAAAAB/8AH//AP//gMHhgMf5gM/9gMwNgM/5gM/8gMAMAP/8AH/8AA/wAAAAAAADgAA/gAP/gD/4AP8YAPAYAP8YAD/4AAP/gAA/gAADgAAAAAAAAAAAAP//gP//gMGBgMGBgMGBgMGBgP/DgH//gD5/AAAAAAAAAAAAAAAAAB/8AH//AP//gOABgMABgMABgMABgMABgMABgAAAAAAAAAAAAAAAAP//gP//gMABgMABgMABgMABgOADgH//gH//AAAAAAAAAAAAAAAAAP//gP//gP//gMGBgMGBgMGBgMGBgMGBgMABgAAAAAAAAAAAAAAAAP//gP//gP//gMHAAMHAAMHAAMHAAMHAAMAAAAAAAAAAAAAAAAAAAD/+AH//AP//gMABgMDBgMDBgMD/gMD/gAD/gAAAAAAAAAAAAAAAAP//gP//gAHAAAHAAAHAAAHAAAHAAP//gP//gAAAAAAAAAAAAAAAAAAAAMABgMABgP//gP//gP//gMABgMABgAAAAAAAAAAAAAAAAAAAAAAAAAABgMABgMABgMABgMAHgP//AP/+AAAAAAAAAAAAAAAAAAAAAP//gP//gAPAAAfgAB/4ADw+APAfgOAHgIABgAAAAAAAAAAAAAAAAAAAAP//gP//gAABgAABgAABgAABgAABgAAAAAAAAAAAAAAAAP//gP//gPgAAP+AAB/gAAHwAB/gAP8AAPgAAP//gP//gAAAAAAAAAAAAP//gP//gPwAAP/AAA/8AAD/gAAPgP//gP//gAAAAAAAAAAAAA/8AH//AH//gOADgMABgMABgMABgOADgH//gH//AA/4AAAAAAAAAAAAAP//gP//gMDgAMDgAMDgAMDgAP/AAH/AAD+AAAAAAAAAAAAAAA/8AH//AH//gOADgMABgMABgMABgOADgH//gH//wA/4wAAAAAAAAH//gP//gP//gMDAAMDAAMDgAOD8AP//AH+PgB4DgAAAgAAAAAAAAAAAAD4AAH+BgP+BgOGBgMHBgMHBgMH/gMD/AAA+AAAAAAAAAAAAAMAAAMAAAMAAAMAAAP//gP//gP//gMAAAMAAAMAAAMAAAAAAAAAAAAAAAP//AP//gAADgAABgAABgAABgAADgP//gP//AAAAAAAAAAAAAMAAAP4AAP/wAA//AAB/gAAHgAD/gB/+AP/AAPwAAIAAAAAAAAAAAP/gAP//gAP/gAAfgAH+AAHwAAD/gAAfgAf/gP//gP8AAAAAAAAAAAAAgOADgPgPgH4+AB/4AAfwAB/4AH4/APgPgOADgAAAgAAAAAAAAMAAAPAAAPwAAD8AAA//gAP/gAf/gD8AAPwAAPAAAIAAAAAAAAAAAAAAAMADgMAPgMA/gMD5gMPhgM+BgP4BgPgBgOABgAAAAAAAAAAAAAAAAAAAAAAAA///+///+wAAGwAAGwAAGAAAAAAAAAAAAAAAAAAAAwAAA+AAAfgAAH8AAA/AAAP4AAB+AAAPwAAD8AAAeAAAGAAAAAAAAAAAAAAAAAAAAwAAGwAAGwAAG///+///+AAAAAAAAAAAAAAAAAAAAAAAAA4AAD4AAPwAAeAAAYAAAeAAAPwAAD4AAAYAAAAAAAAAAAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAIAAAMAAAOAAAGAAACAAAAAAAAAAAAAAAAAAAAAAAAAOAAY/gAY/gAZxgAZxgAZxgAZxgAf/gAP/gAABgAAAgAAAAAAAAAAAAP//gP//gAcBgAYBgAYBgAYBgAcDgAf/gAP/AAAAAAAAAAAAAAAAAAAAAAP/AAf/gAYBgAYBgAYBgAYBgAYBgAAAAAAAAAAAAAAAAAAAAAP/AAf/gAcDgAYBgAYBgAYBgAYDgP//gP//gAAAAAAAAAAAAAAAAAP+AAf/gAf/gAYxgAYxgAYxgAfxgAPxgAHwAAAAAAAAAAAAAAAAAAYBgAYBgD//gP//gP//gMYBgMYBgMYBgMQAAAAAAAAAAAAAAAAAAAPwGAf/GAYfGAYfGAYfGAYfGAY7mAf7+Afx8AAAAAAAAAAAAAAAAP//gP//gAcAAAYAAAYAAAYAAAcAAAf/gAP/gAAAAAAAAAAAAAAAAAYAAAYAAAYAAMf/gOf/gMf/gAABgAABgAABgAAAAAAAAAAAAAAAAAAAAAAAGAYAGAYAGAYAGMf/+Of/+Mf/8AAAAAAAAAAAAAAAAAAAAP//gP//gP//gADwAAH8AAefAAcHgAYDgAQAgAAAAAAAAAAAAEAAAMAAAMAAAMAAAP//AP//gAADgAABgAABgAABgAAAgAAAAAAAAAf/gAf/gAYAAAYAAAf/gAf/gAf/gAYAAAYAAAf/gAP/gAAAAAAAAAAAAAf/gAf/gAcAAAYAAAYAAAYAAAcAAAf/gAP/gAAAAAAAAAAAAAAAAAP/AAf/gAcDgAYBgAYBgAYBgAcDgAf/gAP/AAAAAAAAAAAAAAAAAAf/+Af/+AcBgAYBgAYBgAYBgAcDgAf/gAP/AAAAAAAAAAAAAAAAAAP/AAf/gAcDgAYBgAYBgAYBgAYDgAf/+Af/+AAAAAAAAAAAAAAAAAYBgAYBgAf/gAf/gAcBgAYBgAYBgAYAAAYAAAAAAAAAAAAAAAAAAAAAAAPhgAfxgAZxgAYxgAYxgAY/gAYfAAAAAAAAAAAAAAAAAAAAAAYAAAYAAAYAAD//AD//gAYBgAYBgAYBgAYBgAAAAAAAAAAAAAAAAAf+AAf/gAf/gAABgAABgAABgAf/gAf/gAf/gAAAAAAAAAAAAAQAAAeAAAf4AAH/AAAfgAADgAAfgAH/AAf4AAeAAAQAAAAAAAAAAAfAAAf/AAD/gAAPgAD/gAH4AAH/gAAPgAD/gAf+AAfAAAAAAAAAAAAAAAYBgAcHgAfPAAH+AAD4AAH+AAfPgAcDgAQBgAAAAAAAAAAAAAQAAAeAAAfwGAH+GAA/uAAD+AAf8AH/AAf4AAeAAAQAAAAAAAAAAAAAAAABgAYHgAYPgAY/gAZ5gAfxgAfBgAeBgAYAAAAAAAAAAAAAAAAAAAAAAADgAADgAf//8/+/+4AAGwAAGwAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//+///+f//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAGwAAG4AAG/+/+f//8ADgAADgAAAAAAAAAAAAAAAAAAAAAADgAADAAADAAADAAADAAADgAABgAADgAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'),
+    32,
+    atob("DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0H"),
+    24+(scale<<8)+(1<<16)
+  );
+  return this;
+};
+
+{
+
+    // VARS
+
+    let FONT_NAME = "ShareTechMono";
+    let BIG_FONT_HEIGHT = 60;
+    //let NORMAL_FONT_HEIGHT = 40;
+    let SMALL_FONT_HEIGHT = 24;
+
+    let timeDrawTimeout;
+    let infoDrawTimeout;
+    let lockState = Bangle.isLocked();
+    let pressure;
+
+
+
+    // LISTENERS
+
+    Bangle.on('lock', function(isLocked) {
+        lockState = isLocked;
+        timeDraw();
+        infoDraw();
+    });
+
+
+
+    // DRAW FUNCTIONS
+
+    let timeDraw = function() {
+        g.reset();
+        g.clearRect(Bangle.appRect.x, Bangle.appRect.y, Bangle.appRect.x2, Bangle.appRect.y + BIG_FONT_HEIGHT);
+
+        var date = new Date();
+        var timeArray = [date.getHours().toString().padStart(2, "0"),
+                         date.getMinutes().toString().padStart(2, "0")];
+        if (!lockState) timeArray.push(date.getSeconds().toString().padStart(2, "0"));
+        var timeString = timeArray.join(":");
+        g.setFontAlign(0, 0).setColor(g.theme.fg).setFont(FONT_NAME + (lockState ? "Big" : ""));
+        g.drawString(timeString, Bangle.appRect.x2/2, Bangle.appRect.y + BIG_FONT_HEIGHT/2);
+
+        if (timeDrawTimeout) clearTimeout(timeDrawTimeout);
+        timeDrawTimeout = setTimeout(function() {
+            timeDrawTimeout = undefined;
+            timeDraw();
+        }, (lockState ? 10000 - (Date.now() % 10000) : 1000 - (Date.now() % 1000))); // if locked, every clock's 10s, otherwise every 1s
+    };
+
+    let infoDraw = function() {
+        g.reset();
+
+        var date = new Date();
+        var dateString = [date.getFullYear().toString().padStart(4,"0"),
+                          (date.getMonth()+1).toString().padStart(2,"0"),
+                          date.getDate().toString().padStart(2,"0")].join("-");
+
+        var tzOffset = -(date.getTimezoneOffset())/60;
+        var tzOffsetString = (tzOffset >= 0 ? "+" + tzOffset : tzOffset);
+
+        var batteryString = (Bangle.isCharging() ? "+" : "") + E.getBattery() + "%";
+
+        var pressureString = (pressure ? pressure + "hPa" : "(hPa)");
+
+        var powerString = (E.getPowerUsage().total / 1000) + "mA";
+
+        var stepsString = Bangle.getHealthStatus("day").steps + "ST";
+
+        var bluetoothStatus = NRF.getSecurityStatus();
+        var bluetoothString = (bluetoothStatus.connected ? bluetoothStatus.connected_addr.split(" ")[0].substr(-5) : "N/C");
+
+        var infoMatrix = [
+                          [dateString + tzOffsetString  ],
+                          [batteryString, pressureString],
+                          [powerString                  ],
+                          [stepsString, bluetoothString ]
+                         ];
+
+        g.clearRect(Bangle.appRect.x, Bangle.appRect.y + BIG_FONT_HEIGHT, Bangle.appRect.x2, Bangle.appRect.y2);
+        g.setFontAlign(0, -1).setColor(g.theme.fg2).setFont(FONT_NAME+"Small");
+
+        infoMatrix.forEach((lineArray, lineNumber) => {
+            g.drawString(lineArray.join(" "), Bangle.appRect.x2/2, Bangle.appRect.y + BIG_FONT_HEIGHT + SMALL_FONT_HEIGHT*lineNumber);
+        });
+
+        Bangle.getPressure().then(baroValue => { pressure=Math.round(baroValue.pressure); });
+
+        if (infoDrawTimeout) clearTimeout(infoDrawTimeout);
+        infoDrawTimeout = setTimeout(function() {
+            infoDrawTimeout = undefined;
+            infoDraw();
+        }, (lockState ? 60000 : 10000)); // if locked, a minute from now, otherwise in 10s
+    };
+
+
+
+    // DRAW CALLS
+
+    g.clear();
+
+    Bangle.setUI({
+      mode: "clock",
+      remove: function() {
+        if (timeDrawTimeout) clearTimeout(timeDrawTimeout);
+        timeDrawTimeout = undefined;
+        if (infoDrawTimeout) clearTimeout(infoDrawTimeout);
+        infoDrawTimeout = undefined;
+
+        delete Graphics.prototype.setFontShareTechMono;
+        delete Graphics.prototype.setFontShareTechMonoBig;
+        delete Graphics.prototype.setFontShareTechMonoSmall;
+    }});
+
+    Bangle.loadWidgets();
+    Bangle.drawWidgets();
+
+    timeDraw();
+    infoDraw();
+}
diff --git a/apps/denseclock/app.png b/apps/denseclock/app.png
new file mode 100644
index 0000000000000000000000000000000000000000..e395fcf8dab8c375e49b2d5a3ee61ab18999aa49
GIT binary patch
literal 1569
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
Tdy8}$00000NkvXXu0mjfaLv*}

literal 0
HcmV?d00001

diff --git a/apps/denseclock/metadata.json b/apps/denseclock/metadata.json
new file mode 100644
index 0000000000..fa8c620a29
--- /dev/null
+++ b/apps/denseclock/metadata.json
@@ -0,0 +1,14 @@
+{ "id": "denseclock",
+  "name": "Dense Clock",
+  "shortName":"Dense Clock",
+  "version":"0.01",
+  "description": "A clockface dense with text-only information. Switches between showing seconds and minutes when unlocked/locked, in the interest of saving power.",
+  "icon": "app.png",
+  "type": "clock",
+  "tags": "clock",
+  "supports" : ["BANGLEJS2"],
+  "storage": [
+    {"name":"denseclock.app.js","url":"app.js"},
+    {"name":"denseclock.img","url":"app-icon.js","evaluate":true}
+  ]
+}

From d6c08245ee7256f0caee2c2991ca8d1f0249e596 Mon Sep 17 00:00:00 2001
From: June Bennison <june_github@bennisons.net>
Date: Sat, 25 Jan 2025 18:32:11 +1100
Subject: [PATCH 2/4] denseclock: add screenshots

---
 apps/denseclock/metadata.json           |   4 ++++
 apps/denseclock/screenshot_locked.png   | Bin 0 -> 3535 bytes
 apps/denseclock/screenshot_unlocked.png | Bin 0 -> 3590 bytes
 3 files changed, 4 insertions(+)
 create mode 100644 apps/denseclock/screenshot_locked.png
 create mode 100644 apps/denseclock/screenshot_unlocked.png

diff --git a/apps/denseclock/metadata.json b/apps/denseclock/metadata.json
index fa8c620a29..d5bcd3cd53 100644
--- a/apps/denseclock/metadata.json
+++ b/apps/denseclock/metadata.json
@@ -10,5 +10,9 @@
   "storage": [
     {"name":"denseclock.app.js","url":"app.js"},
     {"name":"denseclock.img","url":"app-icon.js","evaluate":true}
+  ],
+  "screenshots": [
+    {"url":"screenshot_locked.png"},
+    {"url":"screenshot_unlocked.png"}
   ]
 }
diff --git a/apps/denseclock/screenshot_locked.png b/apps/denseclock/screenshot_locked.png
new file mode 100644
index 0000000000000000000000000000000000000000..61a05ca446c9a44b1d72c6c66739fa70e1149029
GIT binary patch
literal 3535
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

literal 0
HcmV?d00001

diff --git a/apps/denseclock/screenshot_unlocked.png b/apps/denseclock/screenshot_unlocked.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1af09cbacbe67306b90ec6c26ff191aa57ff786
GIT binary patch
literal 3590
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
H{O$h(BRQD5

literal 0
HcmV?d00001


From f47af9fe0fb422ab432f3b914aadb0a01611f5aa Mon Sep 17 00:00:00 2001
From: June Bennison <june_github@bennisons.net>
Date: Sat, 25 Jan 2025 18:51:37 +1100
Subject: [PATCH 3/4] denseclock: bump version

---
 apps/denseclock/metadata.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/denseclock/metadata.json b/apps/denseclock/metadata.json
index d5bcd3cd53..515e4661c2 100644
--- a/apps/denseclock/metadata.json
+++ b/apps/denseclock/metadata.json
@@ -1,7 +1,7 @@
 { "id": "denseclock",
   "name": "Dense Clock",
   "shortName":"Dense Clock",
-  "version":"0.01",
+  "version":"0.02",
   "description": "A clockface dense with text-only information. Switches between showing seconds and minutes when unlocked/locked, in the interest of saving power.",
   "icon": "app.png",
   "type": "clock",

From 5a8f9328d1e7b0936d0ef184a14d8b5dbef67845 Mon Sep 17 00:00:00 2001
From: June Bennison <june_github@bennisons.net>
Date: Sat, 25 Jan 2025 19:22:29 +1100
Subject: [PATCH 4/4] denseclock: (retroactive) changelog

---
 apps/denseclock/ChangeLog | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 apps/denseclock/ChangeLog

diff --git a/apps/denseclock/ChangeLog b/apps/denseclock/ChangeLog
new file mode 100644
index 0000000000..2e09e5bb28
--- /dev/null
+++ b/apps/denseclock/ChangeLog
@@ -0,0 +1,2 @@
+0.01: Begin rewrite from old code.
+0.02: Changed visuals: uA > mA, info order, battery state indication