Added agenda

pull/2091/head
David Peer 2022-08-18 22:15:53 +02:00
parent 4bf3a5ff36
commit 65876bd323
4 changed files with 77 additions and 24 deletions

View File

@ -12,4 +12,5 @@
0.12: Implements a 2D menu. 0.12: Implements a 2D menu.
0.13: Clicks < 24px are for widgets, if fullscreen mode is disabled. 0.13: Clicks < 24px are for widgets, if fullscreen mode is disabled.
0.14: Adds humidity to weather data. 0.14: Adds humidity to weather data.
0.15: Added option for a dynamic mode to show widgets only if unlocked. 0.15: Added option for a dynamic mode to show widgets only if unlocked.
0.16: You can now show your agenda if your calendar is synced with Gadgetbridge.

View File

@ -7,6 +7,7 @@ A very minimalistic clock to mainly show date and time.
The BW clock provides many features and also 3rd party integrations: The BW clock provides many features and also 3rd party integrations:
- Bangle data such as steps, heart rate, battery or charging state. - Bangle data such as steps, heart rate, battery or charging state.
- A timer can be set directly. *Requirement: Scheduler library* - A timer can be set directly. *Requirement: Scheduler library*
- Show agenda entries. *Requirement: Gadgetbridge calendar sync enabled*
- Weather temperature as well as the wind speed can be shown. *Requirement: Weather app* - Weather temperature as well as the wind speed can be shown. *Requirement: Weather app*
- HomeAssistant triggers can be executed directly. *Requirement: HomeAssistant app* - HomeAssistant triggers can be executed directly. *Requirement: HomeAssistant app*
@ -28,11 +29,11 @@ to e.g. send a trigger via HomeAssistant once you selected it.
``` ```
+5min +5min
| |
Bangle -- Timer[Optional] -- Weather[Optional] -- HomeAssistant [Optional] Bangle -- Timer[Optional] -- Agenda 1[Optional] -- Weather[Optional] -- HomeAssistant [Optional]
| | | | | | | | |
Bpm -5min Temperature Trigger1 Bpm -5min Agenda 2 Temperature Trigger1
| | | | | | |
Steps ... ... Steps ... ... ...
| |
Battery Battery
``` ```

View File

@ -33,17 +33,6 @@ for (const key in saved_settings) {
* Assets * Assets
*/ */
// Manrope font // Manrope font
Graphics.prototype.setXLargeFont = function(scale) {
// Actual height 53 (55 - 3)
this.setFontCustom(
E.toString(require('heatshrink').decompress(atob('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'))),
46,
atob("FR4uHyopKyksJSssGA=="),
70+(scale<<8)+(1<<16)
);
};
Graphics.prototype.setLargeFont = function(scale) { Graphics.prototype.setLargeFont = function(scale) {
// Actual height 47 (48 - 2) // Actual height 47 (48 - 2)
this.setFontCustom( this.setFontCustom(
@ -75,6 +64,19 @@ Graphics.prototype.setSmallFont = function(scale) {
}; };
Graphics.prototype.setMiniFont = function(scale) {
// Actual height 18 (17 - 0)
this.setFontCustom(
atob('AAAAAAAAAAAAAAAAAAf+wf+QAAAAAAAAAcAAcAAAAAcAAAAAAAAAAAAEACEADEADHwD/gP8AfEATHwDfwH+AfEAbEADEADAACAAAAAAAADhwHwwMYY8Yc8YeMIYMMYHHwDHgAAAAAAPAAfgwYhwYjgZnAPuAGcAA5AB3gDswHMwOMwcMwIHgAAAAAACPgP/gZwwY4wYYwYMwYGwMDgAfgAAwAAAAAAcAAcAAAAAAAAAAAAPAD/8PgPcADQAAAAAAAAYABOAHHw+B/4AAAAAAAAAEAAEgAHgAfAAXgAFgAEAAAAAAAAAQAAQAAQAD/AD/AAQAAQAAQAAQAAAAAA0AA4AAAAAAAAAAIAAIAAIAAIAAIAAIAAAAAAAAAwAAwAAAAAAAAAABwAPwD+AfgAYAAAAAAAAH/AP/gYAwYAwYAwYAwYAwP/gH/AAAAAAAMAAYAAf/wf/wAAAAAAAAAGAwOBwYDwYHwYOwYMwc4wPwwDAQAAAQBgYBwZgwbgwfgwewwc/gYPAAAAAAAAOAA+ADyAPCAcCAQCAA/wAfwACAAAAAAAfjAfxgZgwZgwZgwZgwZxgQ/gAOAAAAH/AP/gZhwZgwZAwZgwZgwI/gAfAAAAQAAYAAYAwYDwYfAZ4AfgAcAAAAAAAAGPAP/gZwwYwwYwwZwwf5wPfgAGAAAAHgAPxgYYwYIwYIwYIwYYwP/gH/AAAAAAAAAAAxgAxgAAAAAAAAADA0DA4AAAAAAAAAAAAAcAA+ABnADDgABAAAAAAAAAAAAAAAABIABIABIABIABIABIABIABIABIABIAAAAAAAAAAAAAAAAAAADDgBnAA+AAcAAIAAAAAAAAAAOAAcAAYAAYOwYcAYwAPgAHAAAAAAPAA/wDg4DAYGOMGfEEREEREGfEGfMGBADBAB/AA+AAAAAAQADwAfAD+AfiAcCAfCAHyAA/AAHwAAwAAAf/wf/wQQwQQwQQwYQwY4wf4wHvgAHAA4AH/AODgcBwYAwYAwYAwYAwYAwcBwODgHHAAAAAAAf/wf/wYAwYAwYAwYAwYAwcBwPHgH/AAQAAAAf/wf/wYQwYQwYQwYQwYQwYQwQAQAAAf/wf/wYQAYQAYQAYQAYQAQAAA4AH/AODgcBwYAwYAwYAwYQwYQwMRgOfgAeAAAAAAAf/wf/wAQAAQAAQAAQAAQAAQAA4Af/wAAAAAAf/wf/wAAAABgABwAAwAAwAAwf/wf/gAAAAAAf/wf/wA4AB8ADOAGHAMDgYBwQAwAAAAAAf/wf/wAAwAAwAAwAAwAAwAAQAAAf/wf/wHgAB4AAeAAHgABwAHgAeAB4AHgAf/wf/wAAAAAAf/wf/wOAAHgABwAA8AAOAAHgf/wf/wAAAA4AH/AODgcBwYAwYAwYAwYAwYAwcBwODgH/AA4AAAAf/wf/wYIAYIAYIAYIAYYAc4APwADAAA4AH/AODgcBwYAwYAwYAwYAwYCwcDwODgH/wA4AAAAf/wf/wYIAYIAYIAYMAYeAc/gPxwDAQAAAHDgPhgYgwYwwYwwYQwYYwMZwOPgAHAQAAYAAYAAYAAf/wf/wYAAYAAYAAYAAQAAAAAf+Af/gABwAAwAAwAAwAAwAAwADgf/Af8AAAAYAAfAAH4AA/AAHwABwAHwA+AHwAeAAQAAYAAfAAH8AAfgADwAPwD+AfgAeAAPwAB+AAHwADwA/AP4AeAAQAAQAQYAwODgHHAB8AA4AD8AHHAcDgYAwQAQQAAcAAPAADwAA/wA/wDwAPAAcAAQAAAAAYAwYBwYHwYOwY4wbwwfAwcAwYAwAAAAAAAAAf//f//QAAQAAAAAAAAcAAfgAD+AAPwAAwAAAAAAQAAQAAf//f//AAAAAAAAAAAADAAGAAMAAYAAYAAMAAGAADAAAAAAAAAAEAAEAAEAAEAAEAAEAAEAAEAAEAAEAAEAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABngDuwDMQDMQDIwDIwD/wB/wAAAAAAf/wf/wDAwDAwDAwDAwDAwB/gA/AAAAAAAA/ABzgDAwDAwDAwDAwDhwBhgAAAAAAA/ABzgDAwDAwDAwDAwBhgf/wf/wAAAAAAA/AB/gDIwDIwDIwDIwDIwB5gA5AAAACAACAAP/wf/wSAASAAAAAA/CBzmDAzDAzDAzDAzBhnD/+D/4AAAAAAf/wf/wDAADAADAADAADgAB/wAfwAAAAAAb/wb/wAAAAADAADb//AAAAAAAAAf/wf/wAMAA+ABzADhgDAwCAQAAAf/wf/wAAAAAAD/wD/wDAADAADAADAAB/wB/wDAACAADAADgAB/wAAAAAAD/wD/wDAADAADAADAADgAB/wAfwAAAAAAA/ABzgDAwDAwDAwDAwDAwB/gA/AAAAAAAD//D//DAwDAwDAwDAwDAwB/gA/AAAAAAAA/ABzgDAwDAwDAwDAwBhgD//D//AAAAAAD/wD/wDAADAADAAAAABxgD5wDIwCMwDMwDMwBnwAjgCAACAAf/gf/wCAwCAQCAQAAAD/AD/gAAwAAwAAwAAwABgD/wD/wAAACAADwAA+AAPwABwAHwA+ADwACAACAAD4AA/AAHwAHwA+ADwAD4AAfAADwAHwB+ADwACAACAQDAwBhgA/AAeAAeABzgDhwCAQCAADwAB8AAPHAD+AD4AfAD4ADgAAAQCAwCDwCHQCMQC4QDwQDAQCAQAAAAAAAAAACAP//f//YAAQAAAAAAAAf/wf/wAAAAAAAAAQAAf4ff//ADAAAAAAAAAAAAAAAAAcAAcAAYAAYAAMAAMAAcAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'),
32,
atob("BAYHEQsQDAQICAgKBQgFBwsHCgoLCgsJCgsFBQsOCwkQCwsNDAoJDQwECAsJDwwNCw0LCwsNCxELCgsHBwcMDAkKCwoLCwYLCwQFCQQPCwsLCwYJBwsJDgkJCggFCAwS"),
18+(scale<<8)+(1<<16)
);
return this;
};
function imgLock(){ function imgLock(){
return { return {
width : 16, height : 16, bpp : 1, width : 16, height : 16, bpp : 1,
@ -204,6 +206,47 @@ try{
// If sched is not installed, we hide this menu item // If sched is not installed, we hide this menu item
} }
/*
* AGENDA MENU
*/
var agendaIdx = 0;
var agenda = storage.readJSON("android.calendar.json");
if(agenda !== undefined){
agenda = agenda.sort((a,b)=>a.timestamp - b.timestamp);
function nextAgendaEntry(){
agendaIdx += 1;
}
function previousAgendaEntry(){
agendaIdx -= 1;
}
function firstAgendaEntry(){
agendaIdx = 0;
}
menu.push([
function(){
var now = new Date();
agenda = agenda.filter(ev=>ev.timestamp + ev.durationInSeconds > now/1000);
agendaIdx = agendaIdx < 0 ? 0 : agendaIdx;
agendaIdx = agendaIdx >= agenda.length ? agendaIdx -1 : agendaIdx;
var entry = agenda[agendaIdx];
var title = entry.title.slice(0,15);
var date = new Date(entry.timestamp*1000);
var dateStr = locale.date(date).replace(/\d\d\d\d/,"");
dateStr += entry.durationInSeconds < 86400 ? " | " + locale.time(date,1) : "";
return [title + "\n" + dateStr, undefined, () => nextAgendaEntry(), () => previousAgendaEntry(), () => firstAgendaEntry()]
},
]);
}
/* /*
* WEATHER MENU * WEATHER MENU
*/ */
@ -443,11 +486,7 @@ function drawTime(){
// Show large or small time depending on info entry // Show large or small time depending on info entry
if(menuName == null){ if(menuName == null){
if(settings.hideColon){ g.setLargeFont();
g.setXLargeFont();
} else {
g.setLargeFont();
}
} else { } else {
y -= 15; y -= 15;
g.setMediumFont(); g.setMediumFont();
@ -461,7 +500,13 @@ function drawTime(){
y += 35; y += 35;
g.setFontAlign(0,0); g.setFontAlign(0,0);
g.setSmallFont();
if(menuName.split('\n').length > 1){
g.setMiniFont();
} else {
g.setSmallFont();
}
var imgWidth = 0; var imgWidth = 0;
if(menuImg !== undefined){ if(menuImg !== undefined){
imgWidth = 24.0; imgWidth = 24.0;
@ -590,6 +635,9 @@ Bangle.on('touch', function(btn, e){
} }
if(is_right){ if(is_right){
// A bit hacky but we ensure that always the first agenda entry is shown...
agendaIdx = 0;
Bangle.buzz(40, 0.6); Bangle.buzz(40, 0.6);
settings.menuPosX = (settings.menuPosX+1) % menu.length; settings.menuPosX = (settings.menuPosX+1) % menu.length;
settings.menuPosY = 0; settings.menuPosY = 0;
@ -597,6 +645,9 @@ Bangle.on('touch', function(btn, e){
} }
if(is_left){ if(is_left){
// A bit hacky but we ensure that always the first agenda entry is shown...
agendaIdx = 0;
Bangle.buzz(40, 0.6); Bangle.buzz(40, 0.6);
settings.menuPosY = 0; settings.menuPosY = 0;
settings.menuPosX = settings.menuPosX-1; settings.menuPosX = settings.menuPosX-1;

View File

@ -1,7 +1,7 @@
{ {
"id": "bwclk", "id": "bwclk",
"name": "BW Clock", "name": "BW Clock",
"version": "0.15", "version": "0.16",
"description": "A very minimalistic clock to mainly show date and time.", "description": "A very minimalistic clock to mainly show date and time.",
"readme": "README.md", "readme": "README.md",
"icon": "app.png", "icon": "app.png",