@@ -37,8 +37,11 @@ exports.listener = function(type, msg) {
3737 const appSettings = require ( "Storage" ) . readJSON ( "messages.settings.json" , 1 ) || { } ;
3838 let loadMessages = ( Bangle . CLOCK || msg . important ) ; // should we load the messages app?
3939 if ( type === "music" ) {
40- if ( Bangle . CLOCK && msg . state && msg . title && appSettings . openMusic ) loadMessages = true ;
41- else return ;
40+ if ( Bangle . CLOCK && msg . state && msg . title && appSettings . openMusic ) {
41+ loadMessages = true ;
42+ } else {
43+ if ( persistMusicInfo ( msg ) ) return ; // handled
44+ }
4245 }
4346 // Write the message to Bangle.MESSAGES. We'll deal with it in messageTimeout below
4447 if ( ! Bangle . MESSAGES ) Bangle . MESSAGES = [ ] ;
@@ -48,7 +51,9 @@ exports.listener = function(type, msg) {
4851 // save messages from RAM to flash if we decide not to launch app
4952 // We apply all of Bangle.MESSAGES here in one write
5053 if ( ! Bangle . MESSAGES || ! Bangle . MESSAGES . length ) return ;
51- let messages = require ( "messages" ) . getMessages ( msg ) ;
54+ // Load saved messages without applying the current msg to avoid
55+ // applying it twice (getMessages(msg) would apply it already).
56+ let messages = require ( "messages" ) . getMessages ( ) ;
5257 ( Bangle . MESSAGES || [ ] ) . forEach ( m => require ( "messages" ) . apply ( m , messages ) ) ;
5358 require ( "messages" ) . write ( messages ) ;
5459 delete Bangle . MESSAGES ;
@@ -105,3 +110,39 @@ exports.open = function(msg) {
105110
106111 Bangle . load ( ( msg && msg . new && msg . id !== "music" ) ? "messagegui.new.js" : "messagegui.app.js" ) ;
107112} ;
113+
114+ /**
115+ * Persist info fields from music messages
116+ * @param {* } msg Music message
117+ * @returns true if the message was handled
118+ */
119+ function persistMusicInfo ( msg ) {
120+ msg . handled = true ;
121+ // if nothing to persist - return that it's handled
122+ if ( msg . artist === undefined && msg . track === undefined && msg . album === undefined && msg . dur === undefined ) return true ;
123+
124+ const a = msg . artist , t = msg . track , al = msg . album , d = msg . dur ;
125+
126+ // try to find the last music message
127+ const messagesMod = require ( "messages" ) ;
128+ const messages = messagesMod . getMessages ( ) ;
129+ const mIdx = messages . findIndex ( m => m . id === "music" ) ;
130+ const stored = mIdx >= 0 ? messages [ mIdx ] : null ;
131+
132+ if ( ! stored ) {
133+ // new msg, always write
134+ const newEntry = { id : "music" , artist : a , track : t , album : al , dur : d } ;
135+ messages . unshift ( Object . assign ( { } , newEntry ) ) ;
136+ messagesMod . write ( messages ) ;
137+ } else {
138+ // existing msg, only write if something changed
139+ if ( stored . artist !== a || stored . track !== t || stored . album !== al || stored . dur !== d ) {
140+ stored . artist = a ;
141+ stored . track = t ;
142+ stored . album = al ;
143+ stored . dur = d ;
144+ messagesMod . write ( messages ) ;
145+ }
146+ }
147+ return true ;
148+ }
0 commit comments