diff --git a/res/values/strings.xml b/res/values/strings.xml
index 70698eea..f481cf48 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -164,4 +164,6 @@ THE SOFTWARE.
Double-tapping the 1x1 widget will open the player. Incurs a 400ms delay before the widget responds to actions.
Use ScrobbleDroid API
Scrobble to Last.FM through ScrobbleDroid or Simple Last.FM Scrobbler
+ Emulate Stock Broadcasts
+ Send broadcasts emulating those sent by the stock music player to work with 3rd party lockscreen controls, widgets, etc.
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index 75d877b1..5fc57e36 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -147,5 +147,10 @@ THE SOFTWARE.
android:title="@string/scrobble_title"
android:defaultValue="true"
android:summary="@string/scrobble_summary" />
+
diff --git a/src/org/kreed/vanilla/PlaybackService.java b/src/org/kreed/vanilla/PlaybackService.java
index ed11635a..49c12eeb 100644
--- a/src/org/kreed/vanilla/PlaybackService.java
+++ b/src/org/kreed/vanilla/PlaybackService.java
@@ -166,6 +166,11 @@ public final class PlaybackService extends Service implements Handler.Callback,
boolean mHeadsetPause;
private boolean mScrobble;
+ /**
+ * If true, emulate the music status broadcasts sent by the stock android
+ * music player.
+ */
+ private boolean mStockBroadcast;
private int mNotificationMode;
/**
* If true, audio will not be played through the speaker.
@@ -234,6 +239,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
mIdleTimeout = settings.getBoolean("use_idle_timeout", false) ? settings.getInt("idle_timeout", 3600) : 0;
Song.mDisableCoverArt = settings.getBoolean("disable_cover_art", false);
mHeadsetOnly = settings.getBoolean("headset_only", false);
+ mStockBroadcast = settings.getBoolean("stock_broadcast", false);
PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "VanillaMusicLock");
@@ -380,6 +386,8 @@ public final class PlaybackService extends Service implements Handler.Callback,
mHeadsetOnly = settings.getBoolean(key, false);
if (mHeadsetOnly && isSpeakerOn())
unsetFlag(FLAG_PLAYING);
+ } else if ("stock_broadcast".equals(key)) {
+ mStockBroadcast = settings.getBoolean(key, false);
}
}
@@ -497,6 +505,8 @@ public final class PlaybackService extends Service implements Handler.Callback,
updateWidgets();
+ if (mStockBroadcast)
+ stockMusicBroadcast();
if (mScrobble)
scrobble();
}
@@ -525,15 +535,29 @@ public final class PlaybackService extends Service implements Handler.Callback,
FourSquareWidget.updateWidget(this, manager, song, state);
}
+ /**
+ * Send a broadcast emulating that of the stock music player.
+ */
+ private void stockMusicBroadcast()
+ {
+ Song song = mCurrentSong;
+ Intent intent = new Intent("com.android.music.playstatechanged");
+ intent.putExtra("playing", (mState & FLAG_PLAYING) != 0);
+ if (song != null) {
+ intent.putExtra("track", song.title);
+ intent.putExtra("album", song.album);
+ intent.putExtra("artist", song.artist);
+ intent.putExtra("songid", song.id);
+ intent.putExtra("albumid", song.albumId);
+ }
+ sendBroadcast(intent);
+ }
+
private void scrobble()
{
- assert(mScrobble == true);
-
Song song = mCurrentSong;
- int state = mState;
-
Intent intent = new Intent("net.jjc1138.android.scrobbler.action.MUSIC_STATUS");
- intent.putExtra("playing", (state & FLAG_PLAYING) != 0);
+ intent.putExtra("playing", (mState & FLAG_PLAYING) != 0);
if (song != null)
intent.putExtra("id", (int)song.id);
sendBroadcast(intent);