2021-10-22 10:47:23 +00:00
/ * M E S S A G E S i s a l i s t o f :
{ id : int ,
src ,
title ,
subject ,
body ,
sender ,
tel : string ,
new : true // not read yet
}
* /
/ * F o r e x a m p l e f o r m a p s :
2021-11-04 17:16:02 +00:00
// a message
2023-05-22 14:11:21 +00:00
require ( "messages" ) . pushMessage ( { "t" : "add" , "id" : 1575479849 , "src" : "Skype" , "title" : "My Friend" , "body" : "Hey! How's everything going?" , positive : 1 , negative : 1 } )
2021-11-04 17:16:02 +00:00
// maps
2023-06-12 11:32:23 +00:00
GB ( { t : "nav" , src : "maps" , title : "Navigation" , instr : "High St towards Tollgate Rd" , distance : "966yd" , action : "continue" , eta : "08:39" } )
GB ( { t : "nav" , src : "maps" , title : "Navigation" , instr : "High St" , distance : "12km" , action : "left_slight" , eta : "08:39" } )
2023-06-09 13:16:27 +00:00
GB ( { t : "nav" , src : "maps" , title : "Navigation" , instr : "Main St / I-29 ALT / Centerpoint Dr" , distance : 12345 , action : "left_slight" , eta : "08:39" } )
2021-11-23 16:28:34 +00:00
// call
2022-04-01 08:49:57 +00:00
require ( "messages" ) . pushMessage ( { "t" : "add" , "id" : "call" , "src" : "Phone" , "title" : "Bob" , "body" : "12421312" , positive : true , negative : true } )
2021-10-22 10:47:23 +00:00
* /
var Layout = require ( "Layout" ) ;
2024-03-15 16:15:33 +00:00
var layout ; // global var containing the layout for the currently displayed message
2022-02-23 10:44:48 +00:00
var settings = require ( 'Storage' ) . readJSON ( "messages.settings.json" , true ) || { } ;
2024-07-24 21:36:40 +00:00
var reply ;
try { reply = require ( "reply" ) ; } catch ( e ) { }
2021-12-06 11:08:26 +00:00
var fontSmall = "6x8" ;
2021-11-10 13:41:58 +00:00
var fontMedium = g . getFonts ( ) . includes ( "6x15" ) ? "6x15" : "6x8:2" ;
var fontBig = g . getFonts ( ) . includes ( "12x20" ) ? "12x20" : "6x8:2" ;
var fontLarge = g . getFonts ( ) . includes ( "6x15" ) ? "6x15:2" : "6x8:4" ;
2023-05-22 14:11:21 +00:00
var fontVLarge = g . getFonts ( ) . includes ( "6x15" ) ? "12x20:2" : "6x8:5" ;
2024-03-15 16:15:33 +00:00
// If a font library is installed, just switch to using that for everything in messages
if ( Graphics . prototype . setFontIntl ) {
fontSmall = "Intl" ;
fontMedium = "Intl" ;
fontBig = "Intl" ;
/ * 2 v 2 1 a n d b e f o r e h a v e a b u g w h e r e t h e s c a l e f a c t o r f o r P B F f o n t s w a s n ' t
taken into account in metrics , so we can ' t have big fonts on those firmwares .
Having 'PBF' listed as a font was a bug fixed at the same time so we check for that . * /
let noScale = g . getFonts ( ) . includes ( "PBF" ) ;
fontLarge = noScale ? "Intl" : "Intl:2" ;
fontVLarge = noScale ? "Intl" : "Intl:3" ;
}
2023-06-12 13:16:27 +00:00
var active ; // active screen (undefined/"list"/"music"/"map"/"message"/"scroller"/"settings")
2022-03-07 21:46:57 +00:00
var openMusic = false ; // go back to music screen after we handle something else?
2024-07-15 21:57:29 +00:00
var replying = false ; // If we're replying to a message, don't interrupt
2021-11-10 13:41:58 +00:00
// hack for 2v10 firmware's lack of ':size' font handling
try {
g . setFont ( "6x8:2" ) ;
} catch ( e ) {
g . _setFont = g . setFont ;
g . setFont = function ( f , s ) {
if ( f . includes ( ":" ) ) {
f = f . split ( ":" ) ;
return g . _setFont ( f [ 0 ] , f [ 1 ] ) ;
}
return g . _setFont ( f , s ) ;
} ;
}
2021-12-06 14:27:11 +00:00
/ * * t h i s i s a t i m e o u t i f t h e a p p h a s s t a r t e d a n d i s s h o w i n g a s i n g l e m e s s a g e
but the user hasn ' t seen it ( eg no user input ) - in which case
we should start a timeout for settings . unreadTimeout to return
to the clock . * /
var unreadTimeout ;
/// List of all our messages
2022-08-09 13:48:04 +00:00
var MESSAGES = require ( "messages" ) . getMessages ( ) ;
2022-12-07 20:56:07 +00:00
if ( Bangle . MESSAGES ) {
// fast loading messages
Bangle . MESSAGES . forEach ( m => require ( "messages" ) . apply ( m , MESSAGES ) ) ;
delete Bangle . MESSAGES ;
}
2022-11-20 14:41:02 +00:00
var onMessagesModified = function ( type , msg ) {
if ( msg . handled ) return ;
msg . handled = true ;
require ( "messages" ) . apply ( msg , MESSAGES ) ;
2021-10-22 10:47:23 +00:00
// TODO: if new, show this new one
2023-06-19 18:14:12 +00:00
if ( msg && msg . id !== "music" && msg . id !== "nav" && msg . new &&
2022-04-21 09:29:10 +00:00
! ( ( require ( 'Storage' ) . readJSON ( 'setting.json' , 1 ) || { } ) . quiet ) ) {
2022-09-24 14:46:59 +00:00
require ( "messages" ) . buzz ( msg . src ) ;
2021-11-25 15:50:07 +00:00
}
2022-03-07 21:46:57 +00:00
if ( msg && msg . id == "music" ) {
if ( msg . state && msg . state != "play" ) openMusic = false ; // no longer playing music to go back to
2023-06-12 13:16:27 +00:00
if ( ( active != undefined ) && ( active != "list" ) && ( active != "music" ) ) return ; // don't open music over other screens (but do if we're in the main menu)
2022-03-07 21:46:57 +00:00
}
2023-06-22 09:04:46 +00:00
if ( msg && msg . id == "nav" && msg . t == "modify" && active != "map" )
return ; // don't show an updated nav message if we're just in the menu
2024-04-13 11:40:57 +00:00
showMessage ( msg && msg . id , false ) ;
2021-10-22 10:47:23 +00:00
} ;
2022-11-20 14:41:02 +00:00
Bangle . on ( "message" , onMessagesModified ) ;
2021-10-22 10:47:23 +00:00
function saveMessages ( ) {
2022-12-15 10:34:40 +00:00
require ( "messages" ) . write ( MESSAGES ) ;
2021-10-22 10:47:23 +00:00
}
2022-11-20 14:41:02 +00:00
E . on ( "kill" , saveMessages ) ;
2021-10-22 10:47:23 +00:00
function showMapMessage ( msg ) {
2022-03-07 21:46:57 +00:00
active = "map" ;
2023-06-19 18:14:12 +00:00
require ( "messages" ) . stopBuzz ( ) ; // stop repeated buzzing while the map is showing
2023-05-19 10:09:16 +00:00
var m , distance , street , target , img ;
2023-06-12 11:32:23 +00:00
if ( "string" == typeof msg . distance ) // new gadgetbridge
distance = msg . distance ;
else if ( "number" == typeof msg . distance ) // 0.74 gadgetbridge
2023-05-19 10:09:16 +00:00
distance = require ( "locale" ) . distance ( msg . distance ) ;
if ( msg . instr ) {
2023-06-09 13:16:27 +00:00
var instr = msg . instr . replace ( /\s*\/\s*/g , " \/\n" ) ; // convert slashes to newlines
if ( instr . includes ( "towards" ) || instr . includes ( "toward" ) ) {
m = instr . split ( /towards|toward/ ) ;
2023-05-19 10:09:16 +00:00
target = m [ 0 ] . trim ( ) ;
street = m [ 1 ] . trim ( ) ;
} else
2023-06-09 13:16:27 +00:00
target = instr ;
2023-05-19 10:09:16 +00:00
}
2023-09-14 09:40:37 +00:00
var carIsRHD = ! ! settings . carIsRHD ;
2023-06-06 18:48:11 +00:00
switch ( msg . action ) {
case "continue" : img = "EBgBAIABwAPgD/Af+D/8f/773/PPY8cDwAPAA8ADwAPAA8AAAAPAA8ADwAAAA8ADwAPA" ; break ;
case "left" : img = "GhcBAYAAAPAAAHwAAD4AAB8AAA+AAAf//8P///x///+PAAPx4AA8fAAHD4ABwfAAcDwAHAIABwAAAcAAAHAAABwAAAcAAAHAAABwAAAc" ; break ;
case "right" : img = "GhcBAABgAAA8AAAPgAAB8AAAPgAAB8D///j///9///+/AAPPAAHjgAD44AB8OAA+DgAPA4ABAOAAADgAAA4AAAOAAADgAAA4AAAOAAAA" ; break ;
case "left_slight" : img = "ERgB//B/+D/8H4AP4Af4A74Bz4Dj4HD4OD4cD4AD4ADwADwADgAHgAPAAOAAcAA4ABwADgAH" ; break ;
case "right_slight" : img = "ERgBB/+D/8H/4APwA/gD/APuA+cD44Phw+Dj4HPgAeAB4ADgAPAAeAA4ABwADgAHAAOAAcAA" ; break ;
2023-06-29 14:02:35 +00:00
case "left_sharp" : img = "GBaBAAAA+AAB/AAH/gAPjgAeBwA8BwB4B+DwB+HgB+PAB+eAB+8AB+4AB/wAB/gAB//gB//gB//gBwAABwAABwAABwAABw==" ; break ;
case "right_sharp" : img = "GBaBAB8AAD+AAH/gAHHwAOB4AOA8AOAeAOAPB+AHh+ADx+AB5+AA9+AAd+AAP+AAH+AH/+AH/+AH/+AAAOAAAOAAAOAAAA==" ; break ;
2023-06-09 13:10:02 +00:00
case "keep_left" : img = "ERmBAACAAOAB+AD+AP+B/+H3+PO+8c8w4wBwADgAHgAPAAfAAfAAfAAfAAeAAeAAcAA8AA4ABwADgA==" ; break ;
case "keep_right" : img = "ERmBAACAAOAA/AD+AP+A//D/fPueeceY4YBwADgAPAAeAB8AHwAfAB8ADwAPAAcAB4ADgAHAAOAAAA==" ; break ;
case "uturn_left" : img = "GRiBAAAH4AAP/AAP/wAPj8APAfAPAHgHgB4DgA8BwAOA4AHAcADsOMB/HPA7zvgd9/gOf/gHH/gDh/gBwfgA4DgAcBgAOAAAHAAADgAABw==" ; break ;
case "uturn_right" : img = "GRiBAAPwAAf+AAf/gAfj4AfAeAPAHgPADwHgA4DgAcBwAOA4AHAcBjhuB5x/A+57gP99wD/84A/8cAP8OAD8HAA4DgAMBwAAA4AAAcAAAA==" ; break ;
2023-06-06 18:48:11 +00:00
case "finish" : img = "HhsBAcAAAD/AAAH/wAAPB4AAeA4AAcAcAAYIcAA4cMAA48MAA4cMAAYAcAAcAcAAcA4AAOA4AAOBxjwHBzjwHjj/4Dnn/4B3P/4B+Pj4A8fj8Acfj8AI//8AA//+AA/j+AB/j+AB/j/A" ; break ;
2023-09-14 09:40:37 +00:00
case "roundabout_left" : img = carIsRHD ? "HBaCAAADwAAAAAAAD/AAAVUAAD/wABVVUAD/wABVVVQD/wAAVABUD/wAAVAAFT/////wABX/////8AAF//////AABT/////wABUP/AAD/AAVA/8AA/8AVAD/wAD//VQAP/AAP/1QAA/wAA/9AAADwAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AA=" : "HRYCAAPAAAAAAAAD/AAD//AAA/8AD///AAP/AA////AD/wAD/wP/A/8AA/wAP8P/////AAP//////8AA///////AAD/P////8AAP8P/AABUAD/AP/AAFUA/8AP/AAFX//AAP/AAFf/wAAP8AAB/8AAAPAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAA==" ; break ;
case "roundabout_right" : img = carIsRHD ? "HRaCAAAAAAAA8AAAP/8AAP8AAD///AA/8AA////AA/8AP/A/8AA/8A/wAP8AA/8P8AA/////8/wAD///////AAD//////8AAP////8P8ABUAAP/A/8AVQAD/wA//1UAA/8AA//VAAP/AAA/9AAA/wAAAPwAAA8AAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAA=" : "HBYCAAAAAAPAAABVQAAP8AAFVVQAD/wAFVVVAAP/ABUAFQAA/8BUAAVAAD/wVAAP/////FAAD/////9QAA//////VAAP/////FQAP8AAP/AVAP/AAP/AFX//AAP/AAV//AAP/AAAf/AAD/AAAD/AAAPAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAA==" ; break ;
case "roundabout_straight" : img = carIsRHD ? "EBuCAAADwAAAD/AAAD/8AAD//wAD///AD///8D/P8/z/D/D//A/wPzAP8AwA//UAA//1QA//9VA/8AFUP8AAVD8AAFQ/AABUPwAAVD8AAFQ/wABUP/ABVA//9VAD//VAAP/1AAAP8AAAD/AAAA/wAA==" : "EBsCAAPAAAAP8AAAP/wAAP//AAP//8AP///wP8/z/P8P8P/8D/A/MA/wDABf/wABX//ABV//8BVAD/wVAAP8FQAA/BUAAPwVAAD8FQAA/BUAA/wVQA/8BV//8AFf/8AAX/8AAA/wAAAP8AAAD/AA" ; break ;
case "roundabout_uturn" : img = carIsRHD ? "ICCBAAAAAAAAAAAAAAAAAAAP4AAAH/AAAD/4AAB4fAAA8DwAAPAcAADgHgAA4B4AAPAcAADwPAAAeHwAADz4AAAc8AAABPAAAADwAAAY8YAAPPPAAD73gAAf/4AAD/8AABf8AAAb+AAAHfAAABzwAAAcYAAAAAAAAAAAAAAAAAAAAAAA" : "ICABAAAAAAAAAAAAAAAAAAfwAAAP+AAAH/wAAD4eAAA8DwAAOA8AAHgHAAB4BwAAOA8AADwPAAA+HgAAHzwAAA84AAAPIAAADwAAAY8YAAPPPAAB73wAAf/4AAD/8AAAP+gAAB/YAAAPuAAADzgAAAY4AAAAAAAAAAAAAAAAAAAAAAA=" ; break ;
2023-06-06 18:48:11 +00:00
}
2023-05-22 14:11:21 +00:00
2021-11-04 17:16:02 +00:00
layout = new Layout ( { type : "v" , c : [
2023-05-22 14:11:21 +00:00
{ type : "txt" , font : street ? fontMedium : fontLarge , label : target , bgCol : g . theme . bg2 , col : g . theme . fg2 , fillx : 1 , pad : 3 } ,
2023-05-19 10:09:16 +00:00
street ? { type : "h" , bgCol : g . theme . bg2 , col : g . theme . fg2 , fillx : 1 , c : [
2021-11-04 17:16:02 +00:00
{ type : "txt" , font : "6x8" , label : "Towards" } ,
2021-11-10 13:41:58 +00:00
{ type : "txt" , font : fontLarge , label : street }
2023-05-19 10:09:16 +00:00
] } : { } ,
2021-11-04 17:16:02 +00:00
{ type : "h" , fillx : 1 , filly : 1 , c : [
2023-05-19 10:09:16 +00:00
img ? { type : "img" , src : atob ( img ) , scale : 2 , pad : 6 } : { } ,
2021-11-04 17:16:02 +00:00
{ type : "v" , fillx : 1 , c : [
2023-05-22 14:11:21 +00:00
{ type : "txt" , font : fontVLarge , label : distance || "" }
2021-10-22 10:47:23 +00:00
] } ,
2021-11-04 17:16:02 +00:00
] } ,
2023-05-22 14:11:21 +00:00
{ type : "txt" , font : "6x8:2" , label : msg . eta ? ` ETA ${ msg . eta } ` : "" }
2021-11-04 17:16:02 +00:00
] } ) ;
2022-04-26 08:42:41 +00:00
g . reset ( ) . clearRect ( Bangle . appRect ) ;
2021-10-22 10:47:23 +00:00
layout . render ( ) ;
2022-04-01 08:49:57 +00:00
function back ( ) { // mark as not new and return to menu
2021-10-22 10:47:23 +00:00
msg . new = false ;
2021-11-04 17:16:02 +00:00
layout = undefined ;
2024-11-07 17:40:23 +00:00
checkMessages ( { clockIfNoMsg : 1 , clockIfAllRead : 1 , ignoreUnread : settings . ignoreUnread , openMusic : 0 } ) ;
2022-04-01 08:49:57 +00:00
}
Bangle . setUI ( { mode : "updown" , back : back } , back ) ; // any input takes us back
2021-10-22 10:47:23 +00:00
}
2022-12-15 10:34:40 +00:00
let updateLabelsInterval ;
2021-11-04 17:16:02 +00:00
function showMusicMessage ( msg ) {
2022-03-07 21:46:57 +00:00
active = "music" ;
2022-12-15 10:34:40 +00:00
// defaults, so e.g. msg.xyz.length doesn't error. `msg` should contain up to date info
2024-10-08 10:21:29 +00:00
msg . artist = msg . artist || "" ;
msg . album = msg . album || "" ;
msg . track = msg . track || "Music" ;
2022-03-07 21:46:57 +00:00
openMusic = msg . state == "play" ;
2022-02-19 22:18:21 +00:00
var trackScrollOffset = 0 ;
var artistScrollOffset = 0 ;
var albumScrollOffset = 0 ;
var trackName = '' ;
var artistName = '' ;
var albumName = '' ;
2022-02-24 14:24:06 +00:00
2021-11-04 17:16:02 +00:00
function fmtTime ( s ) {
var m = Math . floor ( s / 60 ) ;
2021-12-14 11:02:48 +00:00
s = ( parseInt ( s % 60 ) ) . toString ( ) . padStart ( 2 , 0 ) ;
2021-11-04 17:16:02 +00:00
return m + ":" + s ;
}
2022-02-24 14:24:06 +00:00
function reduceStringAndPad ( text , offset , maxLen ) {
var sliceLength = offset + maxLen > text . length ? text . length - offset : maxLen ;
return text . substr ( offset , sliceLength ) . padEnd ( maxLen , " " ) ;
}
2024-10-08 10:21:29 +00:00
function unload ( ) {
2022-02-19 22:18:21 +00:00
clearInterval ( updateLabelsInterval ) ;
2022-03-07 21:46:57 +00:00
updateLabelsInterval = undefined ;
2024-10-08 10:21:29 +00:00
}
function back ( ) {
unload ( ) ;
2022-03-07 21:46:57 +00:00
openMusic = false ;
var wasNew = msg . new ;
2021-11-04 17:16:02 +00:00
msg . new = false ;
layout = undefined ;
2024-11-07 17:40:23 +00:00
if ( wasNew ) checkMessages ( { clockIfNoMsg : 1 , clockIfAllRead : 1 , ignoreUnread : 1 , openMusic : 0 } ) ;
2024-10-23 21:05:21 +00:00
else returnToMain ( ) ;
2021-11-04 17:16:02 +00:00
}
2022-02-19 22:18:21 +00:00
function updateLabels ( ) {
trackName = reduceStringAndPad ( msg . track , trackScrollOffset , 13 ) ;
artistName = reduceStringAndPad ( msg . artist , artistScrollOffset , 21 ) ;
albumName = reduceStringAndPad ( msg . album , albumScrollOffset , 21 ) ;
2022-02-24 14:24:06 +00:00
2022-02-19 22:18:21 +00:00
trackScrollOffset ++ ;
artistScrollOffset ++ ;
albumScrollOffset ++ ;
2022-02-24 14:24:06 +00:00
2022-02-19 22:31:29 +00:00
if ( ( trackScrollOffset + 13 ) > msg . track . length ) trackScrollOffset = 0 ;
if ( ( artistScrollOffset + 21 ) > msg . artist . length ) artistScrollOffset = 0 ;
if ( ( albumScrollOffset + 21 ) > msg . album . length ) albumScrollOffset = 0 ;
2022-02-19 22:18:21 +00:00
}
2022-02-24 14:24:06 +00:00
updateLabels ( ) ;
2021-11-04 17:16:02 +00:00
layout = new Layout ( { type : "v" , c : [
2022-02-24 14:24:06 +00:00
{ type : "h" , fillx : 1 , bgCol : g . theme . bg2 , col : g . theme . fg2 , c : [
2021-11-04 17:16:02 +00:00
{ type : "v" , fillx : 1 , c : [
2022-02-24 14:24:06 +00:00
{ type : "txt" , font : fontMedium , bgCol : g . theme . bg2 , label : artistName , pad : 2 , id : "artist" } ,
{ type : "txt" , font : fontMedium , bgCol : g . theme . bg2 , label : albumName , pad : 2 , id : "album" }
2024-10-08 10:21:29 +00:00
] } ,
{ type : "img" , pad : 4 , src : require ( "messageicons" ) . getImage ( msg ) ,
cb : ( ) => {
unload ( ) ;
showMessageSettings ( msg ) ;
}
}
2021-11-04 17:16:02 +00:00
] } ,
2022-02-24 14:24:06 +00:00
{ type : "txt" , font : fontLarge , bgCol : g . theme . bg , label : trackName , fillx : 1 , filly : 1 , pad : 2 , id : "track" } ,
2021-11-04 17:16:02 +00:00
Bangle . musicControl ? { type : "h" , fillx : 1 , c : [
2024-10-08 10:21:29 +00:00
{ type : "btn" , pad : 8 , label : atob ( "ABYYgQDAAAPAAA/AAD/AAP+AA/+AD/+AP/+A//+D//+P//8//////////8///j//4P/+A//gD/4AP+AA/wAD8AAPAAAwAAA=" ) , cb : ( ) => Bangle . musicControl ( "play" ) } , // play
{ type : "btn" , pad : 8 , label : atob ( "ABIWgQB4B78D/8D/8D/8D/8D/8D/8D/8D/8D/8D/8D/8D/8D/8D/8D/8D/8D/8D/8D/8D94B4A==" ) , cb : ( ) => Bangle . musicControl ( "pause" ) } , // pause
{ type : "btn" , pad : 8 , label : atob ( "ABISgQDAAfgAf4Af8Af/Af/gf/wf/8f/+f/+f/8f/wf/gf/Af8Af4AfgAfAAcA==" ) , cb : ( ) => Bangle . musicControl ( "next" ) } , // next
2021-11-04 17:16:02 +00:00
] } : { } ,
{ type : "txt" , font : "6x8:2" , label : msg . dur ? fmtTime ( msg . dur ) : "--:--" }
2022-04-01 08:49:57 +00:00
] } , { back : back } ) ;
2022-04-26 08:42:41 +00:00
g . reset ( ) . clearRect ( Bangle . appRect ) ;
2021-11-04 17:16:02 +00:00
layout . render ( ) ;
2022-02-24 14:24:06 +00:00
updateLabelsInterval = setInterval ( function ( ) {
updateLabels ( ) ;
layout . artist . label = artistName ;
layout . album . label = albumName ;
layout . track . label = trackName ;
layout . render ( ) ;
} , 400 ) ;
2021-11-04 17:16:02 +00:00
}
2022-02-08 10:41:56 +00:00
function showMessageScroller ( msg ) {
2024-04-01 00:47:49 +00:00
cancelReloadTimeout ( ) ;
2022-03-07 21:46:57 +00:00
active = "scroller" ;
2022-02-08 10:41:56 +00:00
var bodyFont = fontBig ;
g . setFont ( bodyFont ) ;
var lines = [ ] ;
2023-06-09 09:39:47 +00:00
if ( msg . title ) lines = g . wrapString ( msg . title , g . getWidth ( ) - 10 ) ;
2022-02-08 10:41:56 +00:00
var titleCnt = lines . length ;
2022-02-08 10:49:13 +00:00
if ( titleCnt ) lines . push ( "" ) ; // add blank line after title
2022-02-08 10:41:56 +00:00
lines = lines . concat ( g . wrapString ( msg . body , g . getWidth ( ) - 10 ) , [ "" , /*LANG*/ "< Back" ] ) ;
E . showScroller ( {
h : g . getFontHeight ( ) , // height of each menu item in pixels
c : lines . length , // number of menu items
// a function to draw a menu item
draw : function ( idx , r ) {
2022-02-08 11:27:01 +00:00
// FIXME: in 2v13 onwards, clearRect(r) will work fine. There's a bug in 2v12
2022-02-23 16:22:54 +00:00
g . setBgColor ( idx < titleCnt ? g . theme . bg2 : g . theme . bg ) .
setColor ( idx < titleCnt ? g . theme . fg2 : g . theme . fg ) .
2022-02-23 10:44:48 +00:00
clearRect ( r . x , r . y , r . x + r . w , r . y + r . h ) ;
2023-05-22 14:11:21 +00:00
g . setFont ( bodyFont ) . setFontAlign ( 0 , - 1 ) . drawString ( lines [ idx ] , r . x + r . w / 2 , r . y ) ;
2022-02-08 10:41:56 +00:00
} , select : function ( idx ) {
if ( idx >= lines . length - 2 )
2024-04-13 11:40:57 +00:00
showMessage ( msg . id , true ) ;
2022-04-01 08:49:57 +00:00
} ,
2024-04-13 11:40:57 +00:00
back : ( ) => showMessage ( msg . id , true )
2022-02-08 10:41:56 +00:00
} ) ;
}
2021-11-25 15:12:04 +00:00
function showMessageSettings ( msg ) {
2022-03-07 21:46:57 +00:00
active = "settings" ;
2024-10-08 10:21:29 +00:00
var menu = { "" : {
"title" : /*LANG*/ "Message" ,
back : ( ) => showMessage ( msg . id , true )
2022-02-08 10:41:56 +00:00
} ,
2024-07-24 21:36:40 +00:00
} ;
2024-10-08 10:21:29 +00:00
if ( msg . id != "music" )
2024-11-29 21:00:51 +00:00
menu [ /*LANG*/ "View Message" ] = ( ) => showMessageScroller ( msg ) ;
2024-10-08 10:21:29 +00:00
2024-07-24 21:36:40 +00:00
if ( msg . reply && reply ) {
menu [ /*LANG*/ "Reply" ] = ( ) => {
2024-07-15 21:57:29 +00:00
replying = true ;
reply . reply ( { msg : msg } )
. then ( result => {
Bluetooth . println ( JSON . stringify ( result ) ) ;
replying = false ;
showMessage ( msg . id ) ;
} )
. catch ( ( ) => {
replying = false ;
showMessage ( msg . id ) ;
} ) ;
2024-07-24 21:36:40 +00:00
} ;
}
menu = Object . assign ( menu , {
2021-12-15 09:09:27 +00:00
/*LANG*/ "Delete" : ( ) => {
2021-11-25 15:12:04 +00:00
MESSAGES = MESSAGES . filter ( m => m . id != msg . id ) ;
2024-10-23 21:05:21 +00:00
returnToMain ( ) ;
2021-11-25 15:12:04 +00:00
} ,
2024-07-24 21:36:40 +00:00
} ) ;
2024-07-15 21:57:29 +00:00
2023-05-22 14:11:21 +00:00
if ( Bangle . messageIgnore && msg . src )
menu [ /*LANG*/ "Ignore" ] = ( ) => {
E . showPrompt ( /*LANG*/ "Ignore all messages from " + E . toJS ( msg . src ) + "?" , { title : /*LANG*/ "Ignore" } ) . then ( isYes => {
if ( isYes ) {
Bangle . messageIgnore ( msg ) ;
MESSAGES = MESSAGES . filter ( m => m . id != msg . id ) ;
}
2024-10-23 21:05:21 +00:00
returnToMain ( ) ;
2023-05-22 14:11:21 +00:00
} ) ;
} ;
menu = Object . assign ( menu , {
2021-12-15 09:09:27 +00:00
/*LANG*/ "Mark Unread" : ( ) => {
2021-11-25 15:12:04 +00:00
msg . new = true ;
2024-10-23 21:05:21 +00:00
returnToMain ( ) ;
2021-11-25 15:12:04 +00:00
} ,
2022-03-28 09:30:26 +00:00
/*LANG*/ "Mark all read" : ( ) => {
MESSAGES . forEach ( msg => msg . new = false ) ;
2024-10-23 21:05:21 +00:00
returnToMain ( ) ;
2022-03-28 09:30:26 +00:00
} ,
2021-12-15 09:09:27 +00:00
/*LANG*/ "Delete all messages" : ( ) => {
E . showPrompt ( /*LANG*/ "Are you sure?" , { title : /*LANG*/ "Delete All Messages" } ) . then ( isYes => {
if ( isYes ) {
MESSAGES = [ ] ;
}
2024-10-23 21:05:21 +00:00
returnToMain ( ) ;
2021-12-15 09:09:27 +00:00
} ) ;
} ,
2021-11-25 15:12:04 +00:00
} ) ;
2023-05-22 14:11:21 +00:00
E . showMenu ( menu ) ;
2021-11-25 15:12:04 +00:00
}
2024-04-13 11:40:57 +00:00
function showMessage ( msgid , persist ) {
2024-07-15 22:02:34 +00:00
if ( replying ) { return ; }
2024-04-13 11:40:57 +00:00
if ( ! persist ) resetReloadTimeout ( ) ;
2024-02-26 20:51:54 +00:00
let idx = MESSAGES . findIndex ( m => m . id == msgid ) ;
var msg = MESSAGES [ idx ] ;
2022-03-07 21:46:57 +00:00
if ( updateLabelsInterval ) {
clearInterval ( updateLabelsInterval ) ;
updateLabelsInterval = undefined ;
2021-12-06 14:27:11 +00:00
}
2024-10-23 21:05:21 +00:00
if ( ! msg ) return returnToClockIfEmpty ( ) ; // go home if no message found
2021-12-06 14:27:11 +00:00
if ( msg . id == "music" ) {
cancelReloadTimeout ( ) ; // don't auto-reload to clock now
return showMusicMessage ( msg ) ;
}
2023-05-19 10:09:16 +00:00
if ( msg . id == "nav" ) {
2022-03-07 21:46:57 +00:00
cancelReloadTimeout ( ) ; // don't auto-reload to clock now
return showMapMessage ( msg ) ;
}
active = "message" ;
2021-11-04 17:16:02 +00:00
// Normal text message display
2021-12-06 11:08:26 +00:00
var title = msg . title , titleFont = fontLarge , lines ;
2023-01-11 13:50:21 +00:00
var body = msg . body , bodyFont = fontLarge ;
// If no body, use the title text instead...
if ( body === undefined ) {
body = title ;
title = undefined ;
}
2021-11-04 17:16:02 +00:00
if ( title ) {
2021-12-06 11:08:26 +00:00
var w = g . getWidth ( ) - 48 ;
2022-02-23 10:44:48 +00:00
if ( g . setFont ( titleFont ) . stringWidth ( title ) > w ) {
titleFont = fontBig ;
if ( settings . fontSize != 1 && g . setFont ( titleFont ) . stringWidth ( title ) > w )
titleFont = fontMedium ;
}
2021-12-06 11:08:26 +00:00
if ( g . setFont ( titleFont ) . stringWidth ( title ) > w ) {
lines = g . wrapString ( title , w ) ;
title = ( lines . length > 2 ) ? lines . slice ( 0 , 2 ) . join ( "\n" ) + "..." : lines . join ( "\n" ) ;
}
2021-11-04 17:16:02 +00:00
}
2023-05-22 14:11:21 +00:00
if ( body ) { // Try and find a font that fits...
var w = g . getWidth ( ) - 2 , h = Bangle . appRect . h - 60 ;
if ( g . setFont ( bodyFont ) . wrapString ( body , w ) . length * g . getFontHeight ( ) > h ) {
2022-02-23 10:44:48 +00:00
bodyFont = fontBig ;
2023-05-22 14:11:21 +00:00
if ( settings . fontSize != 1 && g . setFont ( bodyFont ) . wrapString ( body , w ) . length * g . getFontHeight ( ) > h ) {
2022-02-23 10:44:48 +00:00
bodyFont = fontMedium ;
2023-05-22 14:11:21 +00:00
}
2022-02-23 10:44:48 +00:00
}
2023-05-22 14:11:21 +00:00
// Now crop, given whatever font we have available
lines = g . setFont ( bodyFont ) . wrapString ( body , w ) ;
var maxLines = Math . floor ( h / g . getFontHeight ( ) ) ;
if ( lines . length > maxLines ) // if too long, wrap with a bit less spae so we have room for '...'
body = g . setFont ( bodyFont ) . wrapString ( body , w - 10 ) . slice ( 0 , maxLines ) . join ( "\n" ) + "..." ;
else
body = lines . join ( "\n" ) ;
2022-02-23 10:44:48 +00:00
}
2022-02-08 10:41:56 +00:00
function goBack ( ) {
2022-07-27 18:04:11 +00:00
layout = undefined ;
2022-12-07 20:56:07 +00:00
msg . new = false ; // read mail
2022-02-08 10:41:56 +00:00
cancelReloadTimeout ( ) ; // don't auto-reload to clock now
2024-10-23 21:05:21 +00:00
returnToClockIfEmpty ( ) ;
2022-02-08 10:41:56 +00:00
}
2023-05-22 14:11:21 +00:00
var negHandler , posHandler , footer = [ ] ;
if ( msg . negative ) {
negHandler = ( ) => {
2022-12-07 20:56:07 +00:00
msg . new = false ;
2021-12-06 14:27:11 +00:00
cancelReloadTimeout ( ) ; // don't auto-reload to clock now
2023-05-22 14:11:21 +00:00
Bangle . messageResponse ( msg , false ) ;
2024-10-23 21:05:21 +00:00
returnToCheckMessages ( ) ;
2023-05-22 14:11:21 +00:00
} ; footer . push ( { type : "img" , src : atob ( "PhAB4A8AAAAAAAPAfAMAAAAAD4PwHAAAAAA/H4DwAAAAAH78B8AAAAAA/+A/AAAAAAH/Af//////w/gP//////8P4D///////H/Af//////z/4D8AAAAAB+/AfAAAAAA/H4DwAAAAAPg/AcAAAAADwHwDAAAAAA4A8AAAAAAAA==" ) , col : "#f00" , cb : negHandler } ) ;
2021-11-23 20:20:37 +00:00
}
2023-05-22 14:11:21 +00:00
footer . push ( { fillx : 1 } ) ; // push images to left/right
2024-07-24 21:36:40 +00:00
if ( msg . reply && reply ) {
posHandler = ( ) => {
replying = true ;
msg . new = false ;
cancelReloadTimeout ( ) ; // don't auto-reload to clock now
reply . reply ( { msg : msg } )
. then ( result => {
Bluetooth . println ( JSON . stringify ( result ) ) ;
replying = false ;
layout . render ( ) ;
2024-10-23 21:05:21 +00:00
returnToCheckMessages ( ) ;
2024-07-24 21:36:40 +00:00
} )
. catch ( ( ) => {
replying = false ;
layout . render ( ) ;
showMessage ( msg . id ) ;
} ) ;
} ; footer . push ( { type : "img" , src : atob ( "QRABAAAAAAAH//+AAAAABgP//8AAAAADgf//4AAAAAHg4ABwAAAAAPh8APgAAAAAfj+B////////geHv///////hf+f///////GPw///////8cGBwAAAAAPx/gDgAAAAAfD/gHAAAAAA8DngOAAAAABwDHP8AAAAADACGf4AAAAAAAAM/w==" ) , col : "#0f0" , cb : posHandler } ) ;
}
else if ( msg . positive ) {
2023-05-22 14:11:21 +00:00
posHandler = ( ) => {
2022-12-07 20:56:07 +00:00
msg . new = false ;
2021-12-06 14:27:11 +00:00
cancelReloadTimeout ( ) ; // don't auto-reload to clock now
2023-05-22 14:11:21 +00:00
Bangle . messageResponse ( msg , true ) ;
2024-10-23 21:05:21 +00:00
returnToCheckMessages ( ) ;
2024-07-24 21:36:40 +00:00
} ; footer . push ( { type : "img" , src : atob ( "QRABAAAAAAAAAAOAAAAABgAAA8AAAAADgAAD4AAAAAHgAAPgAAAAAPgAA+AAAAAAfgAD4///////gAPh///////gA+D///////AD4H//////8cPgAAAAAAPw8+AAAAAAAfB/4AAAAAAA8B/gAAAAAABwB+AAAAAAADAB4AAAAAAAAABgAA==" ) , col : "#0f0" , cb : posHandler } ) ;
2023-05-22 14:11:21 +00:00
}
2022-02-08 10:41:56 +00:00
2021-11-04 17:16:02 +00:00
layout = new Layout ( { type : "v" , c : [
2022-02-23 16:22:54 +00:00
{ type : "h" , fillx : 1 , bgCol : g . theme . bg2 , col : g . theme . fg2 , c : [
2021-11-04 17:16:02 +00:00
{ type : "v" , fillx : 1 , c : [
2022-02-23 16:22:54 +00:00
{ type : "txt" , font : fontSmall , label : msg . src || /*LANG*/ "Message" , bgCol : g . theme . bg2 , col : g . theme . fg2 , fillx : 1 , pad : 2 , halign : 1 } ,
title ? { type : "txt" , font : titleFont , label : title , bgCol : g . theme . bg2 , col : g . theme . fg2 , fillx : 1 , pad : 2 } : { } ,
2021-11-04 17:16:02 +00:00
] } ,
2022-11-16 15:17:28 +00:00
{ type : "btn" ,
src : require ( "messageicons" ) . getImage ( msg ) ,
2024-10-15 21:18:10 +00:00
col : require ( "messageicons" ) . getColor ( msg , { settings , default : g . theme . fg2 } ) ,
2022-11-16 15:17:28 +00:00
pad : 3 , cb : ( ) => {
cancelReloadTimeout ( ) ; // don't auto-reload to clock now
showMessageSettings ( msg ) ;
}
} ,
2021-11-04 17:16:02 +00:00
] } ,
2022-02-08 10:41:56 +00:00
{ type : "txt" , font : bodyFont , label : body , fillx : 1 , filly : 1 , pad : 2 , cb : ( ) => {
2022-02-08 10:49:13 +00:00
// allow tapping to show a larger version
showMessageScroller ( msg ) ;
2022-02-08 10:41:56 +00:00
} } ,
2023-05-22 14:11:21 +00:00
{ type : "h" , fillx : 1 , c : footer }
2022-04-01 08:49:57 +00:00
] } , { back : goBack } ) ;
2023-05-22 14:11:21 +00:00
2024-02-26 20:51:54 +00:00
Bangle . swipeHandler = ( lr , ud ) => {
2023-05-22 14:11:21 +00:00
if ( lr > 0 && posHandler ) posHandler ( ) ;
if ( lr < 0 && negHandler ) negHandler ( ) ;
2024-04-13 11:40:57 +00:00
if ( ud > 0 && idx < MESSAGES . length - 1 ) showMessage ( MESSAGES [ idx + 1 ] . id , true ) ;
if ( ud < 0 && idx > 0 ) showMessage ( MESSAGES [ idx - 1 ] . id , true ) ;
2023-05-22 14:11:21 +00:00
} ;
Bangle . on ( "swipe" , Bangle . swipeHandler ) ;
2022-04-26 08:42:41 +00:00
g . reset ( ) . clearRect ( Bangle . appRect ) ;
2021-11-04 17:16:02 +00:00
layout . render ( ) ;
2021-10-22 10:47:23 +00:00
}
2021-11-25 15:12:04 +00:00
/ * o p t i o n s = {
clockIfNoMsg : bool
clockIfAllRead : bool
2024-11-07 17:40:23 +00:00
ignoreUnread : bool // don't automatically navigate to the first unread message
2022-12-15 10:34:40 +00:00
openMusic : bool // open music if it's playing
2023-06-19 18:14:12 +00:00
dontStopBuzz : bool // don't stuf buzzing (any time other than the first this is undefined/false)
2021-11-25 15:12:04 +00:00
}
* /
function checkMessages ( options ) {
options = options || { } ;
2023-06-19 18:14:12 +00:00
// If there's been some user interaction, it's time to stop repeated buzzing
if ( ! options . dontStopBuzz )
require ( "messages" ) . stopBuzz ( ) ;
2021-10-22 10:47:23 +00:00
// If no messages, just show 'no messages' and return
2021-11-23 20:20:37 +00:00
if ( ! MESSAGES . length ) {
2023-06-12 13:16:27 +00:00
active = undefined ; // no messages
2021-12-15 09:09:27 +00:00
if ( ! options . clockIfNoMsg ) return E . showPrompt ( /*LANG*/ "No Messages" , {
title : /*LANG*/ "Messages" ,
2021-12-14 11:02:48 +00:00
img : require ( "heatshrink" ) . decompress ( atob ( "kkk4UBrkc/4AC/tEqtACQkBqtUDg0VqAIGgoZFDYQIIM1sD1QAD4AIBhnqA4WrmAIBhc6BAWs8AIBhXOBAWz0AIC2YIC5wID1gkB1c6BAYFBEQPqBAYXBEQOqBAnDAIQaEnkAngaEEAPDFgo+IKA5iIOhCGIAFb7RqAIGgtUBA0VqobFgNVA" ) ) ,
2023-06-21 09:08:59 +00:00
buttons : { /*LANG*/ "Ok" : 1 } ,
back : ( ) => load ( )
} ) . then ( ( ) => load ( ) ) ;
2021-11-25 15:12:04 +00:00
return load ( ) ;
2021-11-23 20:20:37 +00:00
}
2021-10-22 10:47:23 +00:00
// we have >0 messages
2022-03-07 21:46:57 +00:00
var newMessages = MESSAGES . filter ( m => m . new && m . id != "music" ) ;
2021-10-25 13:35:00 +00:00
// If we have a new message, show it
2024-11-07 17:40:23 +00:00
if ( ! options . ignoreUnread && newMessages . length ) {
2022-12-14 17:24:31 +00:00
delete newMessages [ 0 ] . show ; // stop us getting stuck here if we're called a second time
2024-04-13 11:52:15 +00:00
showMessage ( newMessages [ 0 ] . id , false ) ;
2022-09-24 14:46:59 +00:00
// buzz after showMessage, so being busy during layout doesn't affect the buzz pattern
2023-05-22 14:11:21 +00:00
if ( global . BUZZ _ON _NEW _MESSAGE ) {
2022-11-20 14:41:02 +00:00
// this is set if we entered the messages app by loading `messagegui.new.js`
2022-07-22 10:23:21 +00:00
// ... but only buzz the first time we view a new message
global . BUZZ _ON _NEW _MESSAGE = false ;
// messages.buzz respects quiet mode - no need to check here
2022-09-24 14:46:59 +00:00
require ( "messages" ) . buzz ( newMessages [ 0 ] . src ) ;
2022-07-22 10:23:21 +00:00
}
return ;
}
2022-12-15 10:34:40 +00:00
// no new messages: show playing music? Only if we have playing music, or state=="show" (set by messagesmusic)
if ( options . openMusic && MESSAGES . some ( m => m . id == "music" && ( ( m . track && m . state == "play" ) || m . state == "show" ) ) )
2024-04-13 11:40:57 +00:00
return showMessage ( 'music' , true ) ;
2021-11-25 15:12:04 +00:00
// no new messages - go to clock?
if ( options . clockIfAllRead && newMessages . length == 0 )
return load ( ) ;
2023-06-12 13:16:27 +00:00
active = "list" ;
2023-11-17 16:18:53 +00:00
// Otherwise show a list of messages
2021-10-25 13:35:00 +00:00
E . showScroller ( {
2021-10-22 10:47:23 +00:00
h : 48 ,
2022-04-01 08:49:57 +00:00
c : Math . max ( MESSAGES . length , 3 ) , // workaround for 2v10.219 firmware (min 3 not needed for 2v11)
2021-10-25 13:35:00 +00:00
draw : function ( idx , r ) { "ram"
2022-04-01 08:49:57 +00:00
var msg = MESSAGES [ idx ] ;
2022-02-23 10:44:48 +00:00
if ( msg && msg . new ) g . setBgColor ( g . theme . bgH ) . setColor ( g . theme . fgH ) ;
2022-10-21 10:35:03 +00:00
else g . setBgColor ( g . theme . bg ) . setColor ( g . theme . fg ) ;
2022-04-01 08:54:25 +00:00
g . clearRect ( r . x , r . y , r . x + r . w , r . y + r . h ) ;
2021-11-04 17:16:02 +00:00
if ( ! msg ) return ;
var x = r . x + 2 , title = msg . title , body = msg . body ;
2022-11-16 15:17:28 +00:00
var img = require ( "messageicons" ) . getImage ( msg ) ;
2021-11-04 17:16:02 +00:00
if ( msg . id == "music" ) {
2021-12-15 09:09:27 +00:00
title = msg . artist || /*LANG*/ "Music" ;
2021-11-04 17:16:02 +00:00
body = msg . track ;
}
if ( img ) {
2022-11-16 15:17:28 +00:00
var fg = g . getColor ( ) ,
2024-10-15 21:18:10 +00:00
col = require ( "messageicons" ) . getColor ( msg , { settings , default : fg } ) ;
2022-11-16 15:17:28 +00:00
g . setColor ( col ) . drawImage ( img , x + 24 , r . y + 24 , { rotate : 0 } ) // force centering
2022-01-11 18:16:05 +00:00
. setColor ( fg ) ; // only color the icon
2021-11-04 17:16:02 +00:00
x += 50 ;
}
2021-11-10 13:41:58 +00:00
if ( title ) g . setFontAlign ( - 1 , - 1 ) . setFont ( fontBig ) . drawString ( title , x , r . y + 2 ) ;
2023-11-17 16:18:53 +00:00
var longBody = false ;
2021-11-04 17:16:02 +00:00
if ( body ) {
2024-03-15 16:15:33 +00:00
g . setFontAlign ( - 1 , - 1 ) . setFont ( fontSmall ) ;
2023-11-17 16:18:53 +00:00
// if the body includes an image, it probably won't be small enough to allow>1 line
2024-03-15 16:15:33 +00:00
let maxLines = Math . floor ( 34 / g . getFontHeight ( ) ) , pady = 0 ;
2023-11-17 17:05:46 +00:00
if ( body . includes ( "\0" ) ) { maxLines = 1 ; pady = 4 ; }
2022-02-23 10:44:48 +00:00
var l = g . wrapString ( body , r . w - ( x + 14 ) ) ;
2023-11-17 16:18:53 +00:00
if ( l . length > maxLines ) {
l = l . slice ( 0 , maxLines ) ;
2021-10-25 13:35:00 +00:00
l [ l . length - 1 ] += "..." ;
}
2022-02-23 10:44:48 +00:00
longBody = l . length > 2 ;
2023-11-17 16:18:53 +00:00
// draw the body
2023-11-17 17:05:46 +00:00
g . drawString ( l . join ( "\n" ) , x + 10 , r . y + 20 + pady ) ;
2021-10-25 13:35:00 +00:00
}
2022-02-23 10:44:48 +00:00
if ( ! longBody && msg . src ) g . setFontAlign ( 1 , 1 ) . setFont ( "6x8" ) . drawString ( msg . src , r . x + r . w - 2 , r . y + r . h - 2 ) ;
g . setColor ( "#888" ) . fillRect ( r . x , r . y + r . h - 1 , r . x + r . w - 1 , r . y + r . h - 1 ) ; // dividing line between items
2021-10-25 13:35:00 +00:00
} ,
2023-06-19 18:14:12 +00:00
select : idx => {
if ( idx < MESSAGES . length )
2024-04-13 11:40:57 +00:00
showMessage ( MESSAGES [ idx ] . id , true ) ;
2023-06-19 18:14:12 +00:00
} ,
2022-04-01 08:49:57 +00:00
back : ( ) => load ( )
2021-10-22 10:47:23 +00:00
} ) ;
}
2024-10-23 21:05:21 +00:00
function returnToCheckMessages ( clock ) {
2024-11-07 17:40:23 +00:00
checkMessages ( { clockIfNoMsg : 1 , clockIfAllRead : 1 , ignoreUnread : settings . ignoreUnread , openMusic } ) ;
2024-10-23 21:05:21 +00:00
}
function returnToMain ( ) {
2024-11-07 17:40:23 +00:00
checkMessages ( { clockIfNoMsg : 0 , clockIfAllRead : 0 , ignoreUnread : 1 , openMusic : 0 } ) ;
2024-10-23 21:05:21 +00:00
}
function returnToClockIfEmpty ( ) {
2024-11-07 17:40:23 +00:00
checkMessages ( { clockIfNoMsg : 1 , clockIfAllRead : 0 , ignoreUnread : 1 , openMusic } ) ;
2024-10-23 21:05:21 +00:00
}
2022-04-01 08:49:57 +00:00
2021-12-06 14:27:11 +00:00
function cancelReloadTimeout ( ) {
if ( ! unreadTimeout ) return ;
clearTimeout ( unreadTimeout ) ;
unreadTimeout = undefined ;
}
2024-04-13 11:03:01 +00:00
function resetReloadTimeout ( ) {
cancelReloadTimeout ( ) ;
if ( ! isFinite ( settings . unreadTimeout ) ) settings . unreadTimeout = 60 ;
if ( settings . unreadTimeout )
unreadTimeout = setTimeout ( load , settings . unreadTimeout * 1000 ) ;
}
2021-11-10 13:41:58 +00:00
g . clear ( ) ;
2022-05-27 06:44:25 +00:00
2021-10-22 10:47:23 +00:00
Bangle . loadWidgets ( ) ;
2022-11-20 14:41:02 +00:00
require ( "messages" ) . toggleWidget ( false ) ;
2021-10-22 10:47:23 +00:00
Bangle . drawWidgets ( ) ;
2022-05-27 06:44:25 +00:00
2021-11-25 15:12:04 +00:00
setTimeout ( ( ) => {
2022-12-15 10:34:40 +00:00
// only openMusic on launch if music is new, or state=="show" (set by messagesmusic)
var musicMsg = MESSAGES . find ( m => m . id === "music" ) ;
checkMessages ( {
2024-11-07 17:40:23 +00:00
clockIfNoMsg : 0 , clockIfAllRead : 0 , ignoreUnread : settings . ignoreUnread ,
2023-06-19 18:14:12 +00:00
openMusic : ( ( musicMsg && musicMsg . new ) && settings . openMusic ) || ( musicMsg && musicMsg . state == "show" ) ,
dontStopBuzz : 1 } ) ;
2022-05-27 06:44:25 +00:00
} , 10 ) ; // if checkMessages wants to 'load', do that
2023-05-22 14:11:21 +00:00
2023-06-19 18:14:12 +00:00
/ * I f t h e B a n g l e i s u n l o c k e d b y t h e u s e r , t r e a t t h a t
as a queue to stop repeated buzzing * /
Bangle . on ( 'lock' , locked => {
if ( ! locked )
require ( "messages" ) . stopBuzz ( ) ;
} ) ;