Music notification: properly parse HH:MM:SS string duration

The DoggCatcher app will send an `com.android.music.metachanged` Intent
with a String extra "duration" formatted as "HH:MM:SS" or "MM:SS":

```
n.f.g.e.MusicPlaybackReceiver - duration 18:49 (java.lang.String)
n.f.g.e.MusicPlaybackReceiver - artist stripped (java.lang.String)
n.f.g.e.MusicPlaybackReceiver - package com.snoggdoggler.android.applications.doggcatcher.v1_0 (java.lang.String)
n.f.g.e.MusicPlaybackReceiver - playing true (java.lang.Boolean)
n.f.g.e.MusicPlaybackReceiver - album stripped (java.lang.String)
n.f.g.e.MusicPlaybackReceiver - track stripped (java.lang.String)
n.f.g.e.MusicPlaybackReceiver - position 533968 (java.lang.Integer)
n.f.g.e.MusicPlaybackReceiver - Got metadata changed intent, but nothing changed, ignoring.
```

This code will parse duration Strings as HH:MM:SS, MM:SS or, if it is a
single number, as milliseconds (which is the old default).
This commit is contained in:
Georg Lukas
2025-08-20 13:11:09 +02:00
committed by José Rebelo
parent 3b900f3aef
commit 42ae00cb6d
@@ -34,6 +34,19 @@ public class MusicPlaybackReceiver extends BroadcastReceiver {
private static MusicSpec lastMusicSpec = new MusicSpec();
private static MusicStateSpec lastStateSpec = new MusicStateSpec();
public int parseTime(String time) {
// will accept "23", "1:23", "03:07:23"
String[] segments = time.split(":");
int result = 0;
for (String element : segments) {
result = result*60 + Integer.parseInt(element, 10);
}
// single number must be milliseconds
if (segments.length == 1)
return result / 1000;
return result;
}
@Override
public void onReceive(Context context, Intent intent) {
/*
@@ -76,7 +89,7 @@ public class MusicPlaybackReceiver extends BroadcastReceiver {
stateSpec.state = (byte) (((Boolean) incoming) ? MusicStateSpec.STATE_PLAYING : MusicStateSpec.STATE_PAUSED);
stateSpec.playRate = (byte) (((Boolean) incoming) ? 100 : 0);
} else if (incoming instanceof String && "duration".equals(key)) {
musicSpec.duration = Integer.parseInt((String) incoming) / 1000;
musicSpec.duration = parseTime((String) incoming);
} else if (incoming instanceof String && "trackno".equals(key)) {
musicSpec.trackNr = Integer.parseInt((String) incoming);
} else if (incoming instanceof String && "totaltrack".equals(key)) {