Use sticky broadcast for sending status changes, so apps can find
out the current state of things without waiting for a state change.
b/3116574

Change-Id: Icaff13959d931068898ae0ee132ee94d43bcb048
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ec43a3f..90e0c5b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -25,6 +25,7 @@
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
 
     <application android:icon="@drawable/app_music"
         android:label="@string/musicbrowserlabel"
diff --git a/src/com/android/music/MediaAppWidgetProvider.java b/src/com/android/music/MediaAppWidgetProvider.java
index 159aace..543f60d 100644
--- a/src/com/android/music/MediaAppWidgetProvider.java
+++ b/src/com/android/music/MediaAppWidgetProvider.java
@@ -99,8 +99,7 @@
      */
     void notifyChange(MediaPlaybackService service, String what) {
         if (hasInstances(service)) {
-            if (MediaPlaybackService.PLAYBACK_COMPLETE.equals(what) ||
-                    MediaPlaybackService.META_CHANGED.equals(what) ||
+            if (MediaPlaybackService.META_CHANGED.equals(what) ||
                     MediaPlaybackService.PLAYSTATE_CHANGED.equals(what)) {
                 performUpdate(service, null);
             }
diff --git a/src/com/android/music/MediaPlaybackActivity.java b/src/com/android/music/MediaPlaybackActivity.java
index 8e1d6a0..1367c5a 100644
--- a/src/com/android/music/MediaPlaybackActivity.java
+++ b/src/com/android/music/MediaPlaybackActivity.java
@@ -482,7 +482,6 @@
         IntentFilter f = new IntentFilter();
         f.addAction(MediaPlaybackService.PLAYSTATE_CHANGED);
         f.addAction(MediaPlaybackService.META_CHANGED);
-        f.addAction(MediaPlaybackService.PLAYBACK_COMPLETE);
         registerReceiver(mStatusListener, new IntentFilter(f));
         updateTrackInfo();
         long next = refreshNow();
@@ -1243,8 +1242,7 @@
                 updateTrackInfo();
                 setPauseButtonImage();
                 queueNextRefresh(1);
-            } else if (action.equals(MediaPlaybackService.PLAYBACK_COMPLETE) ||
-                    action.equals(MediaPlaybackService.PLAYSTATE_CHANGED)) {
+            } else if (action.equals(MediaPlaybackService.PLAYSTATE_CHANGED)) {
                 setPauseButtonImage();
             }
         }
diff --git a/src/com/android/music/MediaPlaybackService.java b/src/com/android/music/MediaPlaybackService.java
index e4432be..7c0bbed 100644
--- a/src/com/android/music/MediaPlaybackService.java
+++ b/src/com/android/music/MediaPlaybackService.java
@@ -80,7 +80,6 @@
     public static final String PLAYSTATE_CHANGED = "com.android.music.playstatechanged";
     public static final String META_CHANGED = "com.android.music.metachanged";
     public static final String QUEUE_CHANGED = "com.android.music.queuechanged";
-    public static final String PLAYBACK_COMPLETE = "com.android.music.playbackcomplete";
 
     public static final String SERVICECMD = "com.android.music.musicservicecommand";
     public static final String CMDNAME = "command";
@@ -738,7 +737,8 @@
         i.putExtra("artist", getArtistName());
         i.putExtra("album",getAlbumName());
         i.putExtra("track", getTrackName());
-        sendBroadcast(i);
+        i.putExtra("playing", isPlaying());
+        sendStickyBroadcast(i);
         
         if (what.equals(QUEUE_CHANGED)) {
             saveQueue(true);
@@ -1268,8 +1268,8 @@
                     if (mRepeatMode == REPEAT_NONE && !force) {
                         // all done
                         gotoIdleState();
-                        notifyChange(PLAYBACK_COMPLETE);
                         mIsSupposedToBePlaying = false;
+                        notifyChange(PLAYSTATE_CHANGED);
                         return;
                     } else if (mRepeatMode == REPEAT_ALL || force) {
                         mPlayPos = 0;