Skip to content

Commit 2bae3d1

Browse files
committed
Fix music message handling to avoid stale metadata and ensure proper merging
1 parent 53599f2 commit 2bae3d1

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

apps/messagegui/lib.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ exports.listener = function(type, msg) {
4545
// messages app later shows active track & controls.
4646
// Mark as handled and save immediately (no buzzing / auto-open).
4747
msg.handled = true;
48-
// Ensure music message ends up first (consistent with open())
49-
let messages = require("messages").getMessages(msg);
48+
let messages = require("messages").getMessages();
5049
// Apply current music state (will unshift if not present)
5150
require("messages").apply(msg, messages);
5251
require("messages").write(messages);
@@ -61,7 +60,9 @@ exports.listener = function(type, msg) {
6160
// save messages from RAM to flash if we decide not to launch app
6261
// We apply all of Bangle.MESSAGES here in one write
6362
if (!Bangle.MESSAGES || !Bangle.MESSAGES.length) return;
64-
let messages = require("messages").getMessages(msg);
63+
// Load saved messages without applying the current msg to avoid
64+
// applying it twice (getMessages(msg) would apply it already).
65+
let messages = require("messages").getMessages();
6566
(Bangle.MESSAGES || []).forEach(m => require("messages").apply(m, messages));
6667
require("messages").write(messages);
6768
delete Bangle.MESSAGES;

apps/messages/lib.js

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,19 @@ exports.pushMessage = function(event) {
2424
if (event.t==="add") {
2525
if (event.new===undefined) event.new = true; // Assume it should be new
2626
} else if (event.t==="modify") {
27-
const old = exports.getMessages().find(m => m.id===event.id);
28-
if (old) event = Object.assign(old, event);
27+
// For music messages, don't merge with old stored message to avoid stale metadata
28+
if (event.id !== "music") {
29+
const old = exports.getMessages().find(m => m.id===event.id);
30+
if (old) event = Object.assign(old, event);
31+
}
2932
}
3033

3134
// combine musicinfo and musicstate events
3235
if (event.id==="music") {
3336
if (event.state==="play") event.new = true; // new track, or playback (re)started
37+
// Always merge new event into current music state to preserve metadata
3438
exports.music = Object.assign({}, exports.music, event);
35-
event = exports.music;
39+
event = exports.music; //Object.assign({}, exports.music); // emit a copy
3640
}
3741
}
3842
// reset state (just in case)
@@ -75,8 +79,16 @@ exports.apply = function(event, messages) {
7579
if (mIdx>=0) messages.splice(mIdx, 1); // duplicate ID! erase previous version
7680
messages.unshift(event); // add at the beginning
7781
} else if (event.t==="modify") {
78-
if (mIdx>=0) messages[mIdx] = Object.assign(messages[mIdx], event);
79-
else messages.unshift(event);
82+
if (mIdx>=0) {
83+
// For music messages, completely replace instead of merging to avoid stale metadata
84+
if (event.id === "music") {
85+
messages[mIdx] = event;
86+
} else {
87+
messages[mIdx] = Object.assign(messages[mIdx], event);
88+
}
89+
} else {
90+
messages.unshift(event);
91+
}
8092
}
8193
return messages;
8294
};
@@ -139,7 +151,7 @@ exports.toggleWidget = function(show) {
139151
exports.write = function(messages) {
140152
if (!messages.length) require("Storage").erase("messages.json");
141153
else require("Storage").writeJSON("messages.json", messages.map(m => {
142-
// we never want to save saved/handled status to file;
154+
// we never want to save saved/handled status to file
143155
delete m.saved;
144156
delete m.handled;
145157
return m;

0 commit comments

Comments
 (0)