From c918fb301e86dca89423068c58a8752747cdbda0 Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 15 Nov 2022 11:59:46 +0100 Subject: [PATCH 1/3] Initial version of Sleep Status Widget --- apps/widsleepstatus/ChangeLog | 1 + apps/widsleepstatus/metadata.json | 15 ++++++++++++ apps/widsleepstatus/settings.js | 32 ++++++++++++++++++++++++++ apps/widsleepstatus/widget.js | 37 ++++++++++++++++++++++++++++++ apps/widsleepstatus/widget.png | Bin 0 -> 698 bytes 5 files changed, 85 insertions(+) create mode 100644 apps/widsleepstatus/ChangeLog create mode 100644 apps/widsleepstatus/metadata.json create mode 100644 apps/widsleepstatus/settings.js create mode 100644 apps/widsleepstatus/widget.js create mode 100644 apps/widsleepstatus/widget.png diff --git a/apps/widsleepstatus/ChangeLog b/apps/widsleepstatus/ChangeLog new file mode 100644 index 000000000..7f837e50e --- /dev/null +++ b/apps/widsleepstatus/ChangeLog @@ -0,0 +1 @@ +0.01: First version diff --git a/apps/widsleepstatus/metadata.json b/apps/widsleepstatus/metadata.json new file mode 100644 index 000000000..10219e44c --- /dev/null +++ b/apps/widsleepstatus/metadata.json @@ -0,0 +1,15 @@ +{ + "id": "widsleepstatus", + "name": "Sleep Status Widget", + "version": "0.01", + "description": "Shows current status of sleep from sleeplog app.", + "icon": "widget.png", + "type": "widget", + "tags": "widget,sleep", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widsleepstatus.wid.js","url":"widget.js"}, + {"name":"widsleepstatus.settings.js","url":"settings.js"} + ], + "data": [{"name":"widsleepstatus.json"}] +} diff --git a/apps/widsleepstatus/settings.js b/apps/widsleepstatus/settings.js new file mode 100644 index 000000000..da402e08e --- /dev/null +++ b/apps/widsleepstatus/settings.js @@ -0,0 +1,32 @@ +/** + * @param {function} back Use back() to return to settings menu + */ +(function(back) { + const SETTINGS_FILE = "widsleepstatus.json"; + const storage = require("Storage"); + + let s = { + hidewhenawake: true + }; + const saved = storage.readJSON(SETTINGS_FILE, 1) || {}; + for(const key in saved) { + s[key] = saved[key]; + } + + function save(key) { + return function(value) { + s[key] = value; + storage.write(SETTINGS_FILE, s); + }; + } + + const menu = { + "": {"title": "Sleep Status Widget"}, + "< Back": back, + "Hide when awake": { + value: s.hidewhenawake, + onchange: save("hidewhenawake"), + }, + }; + E.showMenu(menu); +}); diff --git a/apps/widsleepstatus/widget.js b/apps/widsleepstatus/widget.js new file mode 100644 index 000000000..f3ed21238 --- /dev/null +++ b/apps/widsleepstatus/widget.js @@ -0,0 +1,37 @@ +(function(){ + if (!sleeplog) return; // sleeplog not installed + + const SETTINGS_FILE = 'widsleepstatus.json'; + let settings; + function loadSettings() { + settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}; + const DEFAULTS = { + 'hidewhenawake': true + }; + Object.keys(DEFAULTS).forEach(k=>{ + if (settings[k]===undefined) settings[k]=DEFAULTS[k]; + }); + } + + const status = sleeplog.status || 0; + WIDGETS["sleepstatus"]={area:"tr",width:status >= 2 ? 24 : 0,draw:function(w) { + g.reset(); + // Icons from https://icons8.com/icon/set/household/small + switch (status) { + case 0: // unknown + case 1: // not worn + // No icon here. Width is set to 0 + break; + case 2: // awake + loadSettings(); + if (settings && !settings["hidewhenawake"]) g.drawImage(atob("GBjBAP//AAAAAAAAAAAADAAAPgAAIwABIzABsmABnmAMwMAef4AePwAeIwAeIwAeIwAeIwAf//gb//gYNhgftvgftngeNngAAAAAAAAAAAA="), w.x, w.y); + break; + case 3: // light sleep + g.drawImage(atob("GBjBAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAABgAABgAABgAABnH/xnv/xlsARnsAZnMAZ///5gAAZgAAZgAAYAAAAAAAAAAAA="), w.x, w.y); + case 4: // deep sleep + g.drawImage(atob("GBjBAP//AAAAAAAAAAAAAeAD8OAD8cAA4fABwAADgABj8ABgAABgAABgAABnH/xnv/xlsARnsAZnMAZ///5gAAZgAAZgAAYAAAAAAAAAAAA="), w.x, w.y); + break; + } + }}; + Bangle.drawWidgets(); +})() diff --git a/apps/widsleepstatus/widget.png b/apps/widsleepstatus/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7f11f67bf96368c6c8994d43608a3c9ece108d GIT binary patch literal 698 zcmV;r0!96aP)>_62_vrVs7$x%)KEhY2bLH`8}|aP+4?loNZgNtQ$xdbF(5^0LHrv z*+n$Jo?TtG5znfDhWMwg>pnPhA64bntJ|$Z7122xCSpMsXp$@DCL257wkfKLqTb6Of7R0_aEmw-F2N`7O;DfXna3pU>Y z0M@gs%k^p^C2$Ye0)950Efu{>yq>Zp9zw{#ps}8TLDSP+NXwZdb@vg%IRJ!BR2F1v ztrChl1B^4EU9T=yX`_vGYC;HyCw zeu2ImiyxT3@-F?QwZq&%vuyl1->))54uWLrwWsTPj9&& zHGOc%+hA@$WdZo^)AJ3j-3%Zq5XJ^%YOO*nb_#d~{AfH&XzjFIc>XCYfq&KIZSXsZ zKc4t(wAhPlZ!AdKpR1K@o92-}iAUamQ3?G^crTVCpMl80uo-y+Mwhu^{gIh`P)0rj gk%5Sah=~82Kj4M5noGmPng9R*07*qoM6N<$f_3Oc+5i9m literal 0 HcmV?d00001 From 4c79602aeeb5cf313bc595aa5c93ff26de748b40 Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 15 Nov 2022 12:03:08 +0100 Subject: [PATCH 2/3] Missing break --- apps/widsleepstatus/widget.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/widsleepstatus/widget.js b/apps/widsleepstatus/widget.js index f3ed21238..f2ec28451 100644 --- a/apps/widsleepstatus/widget.js +++ b/apps/widsleepstatus/widget.js @@ -28,6 +28,7 @@ break; case 3: // light sleep g.drawImage(atob("GBjBAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAABgAABgAABgAABnH/xnv/xlsARnsAZnMAZ///5gAAZgAAZgAAYAAAAAAAAAAAA="), w.x, w.y); + break; case 4: // deep sleep g.drawImage(atob("GBjBAP//AAAAAAAAAAAAAeAD8OAD8cAA4fABwAADgABj8ABgAABgAABgAABnH/xnv/xlsARnsAZnMAZ///5gAAZgAAZgAAYAAAAAAAAAAAA="), w.x, w.y); break; From 7512fd97a6b6e2964de95a059f79c2d71cbf7a54 Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 15 Nov 2022 12:31:30 +0100 Subject: [PATCH 3/3] Add dependency --- apps/widsleepstatus/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/widsleepstatus/metadata.json b/apps/widsleepstatus/metadata.json index 10219e44c..3b4caa93f 100644 --- a/apps/widsleepstatus/metadata.json +++ b/apps/widsleepstatus/metadata.json @@ -7,6 +7,7 @@ "type": "widget", "tags": "widget,sleep", "supports": ["BANGLEJS","BANGLEJS2"], + "dependencies" : { "sleeplog":"app" }, "storage": [ {"name":"widsleepstatus.wid.js","url":"widget.js"}, {"name":"widsleepstatus.settings.js","url":"settings.js"}