From f812fb1b1f4eef52118909dfe3f16e19f0bed079 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sat, 11 Jun 2016 23:37:03 +0200 Subject: [PATCH] Improvements to MusicPlayback receiver - Also send duration if "duration" extra is present - If "playing" and "postion" extras are present send a music state update treat previous state and current state as equal if position delta is <=2 seconds (Neccessary for some players which update every second - the pebble however counts by itself) --- .../externalevents/MusicPlaybackReceiver.java | 25 +++++++++++++++++++ .../externalevents/NotificationListener.java | 3 +-- .../gadgetbridge/model/MusicStateSpec.java | 17 +++++++++++++ .../devices/pebble/PebbleProtocol.java | 2 +- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/MusicPlaybackReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/MusicPlaybackReceiver.java index 2036b4c27..3edfb8815 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/MusicPlaybackReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/MusicPlaybackReceiver.java @@ -9,17 +9,29 @@ import org.slf4j.LoggerFactory; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec; +import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec; public class MusicPlaybackReceiver extends BroadcastReceiver { private static final Logger LOG = LoggerFactory.getLogger(MusicPlaybackReceiver.class); private static MusicSpec lastMusicSpec = new MusicSpec(); + private static MusicStateSpec lastStatecSpec = new MusicStateSpec(); @Override public void onReceive(Context context, Intent intent) { + /* + Bundle bundle = intent.getExtras(); + for (String key : bundle.keySet()) { + Object value = bundle.get(key); + LOG.info(String.format("%s %s (%s)", key, + value != null ? value.toString() : "null", value != null ? value.getClass().getName() : "no class")); + } + */ MusicSpec musicSpec = new MusicSpec(); musicSpec.artist = intent.getStringExtra("artist"); musicSpec.album = intent.getStringExtra("album"); musicSpec.track = intent.getStringExtra("track"); + musicSpec.duration = intent.getIntExtra("duration", 0) / 1000; + if (!lastMusicSpec.equals(musicSpec)) { lastMusicSpec = musicSpec; LOG.info("Update Music Info: " + musicSpec.artist + " / " + musicSpec.album + " / " + musicSpec.track); @@ -27,5 +39,18 @@ public class MusicPlaybackReceiver extends BroadcastReceiver { } else { LOG.info("got metadata changed intent, but nothing changed, ignoring."); } + + if (intent.hasExtra("position") && intent.hasExtra("playing")) { + MusicStateSpec stateSpec = new MusicStateSpec(); + stateSpec.position = intent.getIntExtra("position", 0) / 1000; + stateSpec.state = (byte) (intent.getBooleanExtra("playing", true) ? MusicStateSpec.STATE_PLAYING : MusicStateSpec.STATE_PAUSED); + if (!lastStatecSpec.equals(stateSpec)) { + LOG.info("Update Music State: state=" + stateSpec.state + ", position= " + stateSpec.position); + GBApplication.deviceService().onSetMusicState(stateSpec); + } else { + LOG.info("got state changed intent, but not enough has changed, ignoring."); + } + lastStatecSpec = stateSpec; + } } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java index 1d39d552b..cf74be6a4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java @@ -18,7 +18,6 @@ import android.media.session.PlaybackState; import android.os.Build; import android.os.Bundle; import android.os.PowerManager; -import android.provider.MediaStore; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.support.v4.app.NotificationCompat; @@ -354,7 +353,7 @@ public class NotificationListener extends NotificationListenerService { } PlaybackState s = c.getPlaybackState(); - stateSpec.position = (int)s.getPosition(); + stateSpec.position = (int) (s.getPosition() / 1000); stateSpec.playRate = Math.round(100 * s.getPlaybackSpeed()); stateSpec.repeat = 1; stateSpec.shuffle = 1; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/MusicStateSpec.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/MusicStateSpec.java index ee5510fbd..fb15948d7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/MusicStateSpec.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/MusicStateSpec.java @@ -14,4 +14,21 @@ public class MusicStateSpec { public int playRate; public byte shuffle; public byte repeat; + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof MusicStateSpec)) { + return false; + } + MusicStateSpec stateSpec = (MusicStateSpec) obj; + + return this.state == stateSpec.state && + Math.abs(this.position - stateSpec.position)<=2 && + this.playRate == stateSpec.playRate && + this.shuffle == stateSpec.shuffle && + this.repeat == stateSpec.repeat; + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java index 7672c5fbd..1862f3c1f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java @@ -1128,7 +1128,7 @@ public class PebbleProtocol extends GBDeviceProtocol { buf.order(ByteOrder.LITTLE_ENDIAN); buf.put(MUSICCONTROL_SETPLAYSTATE); buf.put(playState); - buf.putInt(position); + buf.putInt(position * 1000); buf.putInt(playRate); buf.put(shuffle); buf.put(repeat);