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);