summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2016-10-31 13:29:51 +0100
committerDanny Baumann <dannybaumann@web.de>2016-10-31 13:29:51 +0100
commita2325be37bd2eccc0af1423e0a641c2a69ebf665 (patch)
treeca84807bb55d86e922c2533ab3ff50ac7c64288a
parentf1daeeb7b9c7efe848d6859d3d17930e362c9048 (diff)
downloadandroid_packages_apps_Eleven-a2325be37bd2eccc0af1423e0a641c2a69ebf665.tar.gz
android_packages_apps_Eleven-a2325be37bd2eccc0af1423e0a641c2a69ebf665.tar.bz2
android_packages_apps_Eleven-a2325be37bd2eccc0af1423e0a641c2a69ebf665.zip
Fix MediaSession queue handling.
- Go back to using the queue position instead of the track ID as queue item ID, as the track ID can be present multiple times in the queue and the queue item ID is supposed to be unique in the whole queue - Make sure no null items are passed in Change-Id: I9390ab8c7a5a20f2a2bb1efad02e460ecf7dc2e5
-rw-r--r--src/com/cyanogenmod/eleven/MusicPlaybackService.java40
1 files changed, 16 insertions, 24 deletions
diff --git a/src/com/cyanogenmod/eleven/MusicPlaybackService.java b/src/com/cyanogenmod/eleven/MusicPlaybackService.java
index 81cd74b..0f38a20 100644
--- a/src/com/cyanogenmod/eleven/MusicPlaybackService.java
+++ b/src/com/cyanogenmod/eleven/MusicPlaybackService.java
@@ -58,6 +58,7 @@ import android.provider.MediaStore.Audio.AlbumColumns;
import android.provider.MediaStore.Audio.AudioColumns;
import android.text.TextUtils;
import android.util.Log;
+import android.util.LongSparseArray;
import android.view.KeyEvent;
import com.cyanogenmod.eleven.Config.IdType;
@@ -740,7 +741,7 @@ public class MusicPlaybackService extends Service {
}
@Override
public void onSkipToQueueItem(long id) {
- setQueueItem(id);
+ setQueuePosition((int) id);
}
@Override
public boolean onMediaButtonEvent(@NonNull Intent mediaButtonIntent) {
@@ -2751,18 +2752,6 @@ public class MusicPlaybackService extends Service {
}
}
- private void setQueueItem(final long id) {
- synchronized (this) {
- final int len = mPlaylist.size();
- for (int i = 0; i < len; i++) {
- if (id == mPlaylist.get(i).mId) {
- setQueuePosition(i);
- break;
- }
- }
- }
- }
-
/**
* Queues a new list for playback
*
@@ -3864,7 +3853,7 @@ public class MusicPlaybackService extends Service {
private long[] mQueue;
public QueueUpdateTask(long[] queue) {
- mQueue = queue;
+ mQueue = queue != null ? Arrays.copyOf(queue, queue.length) : null;
}
@Override
@@ -3892,7 +3881,7 @@ public class MusicPlaybackService extends Service {
}
try {
- final MediaSession.QueueItem[] items = new MediaSession.QueueItem[mQueue.length];
+ LongSparseArray<MediaDescription> descsById = new LongSparseArray<>();
final int idColumnIndex = c.getColumnIndexOrThrow(AudioColumns._ID);
final int titleColumnIndex = c.getColumnIndexOrThrow(AudioColumns.TITLE);
final int artistColumnIndex = c.getColumnIndexOrThrow(AudioColumns.ARTIST);
@@ -3902,18 +3891,21 @@ public class MusicPlaybackService extends Service {
.setTitle(c.getString(titleColumnIndex))
.setSubtitle(c.getString(artistColumnIndex))
.build();
-
final long id = c.getLong(idColumnIndex);
- int index = 0;
- for (int i = 0; i < mQueue.length; i++) {
- if (mQueue[i] == id) {
- index = i;
- break;
- }
+ descsById.put(id, desc);
+ }
+
+ List<MediaSession.QueueItem> items = new ArrayList<>();
+ for (int i = 0; i < mQueue.length; i++) {
+ MediaDescription desc = descsById.get(mQueue[i]);
+ if (desc == null) {
+ // shouldn't happen except in corner cases like
+ // music being deleted while we were processing
+ desc = new MediaDescription.Builder().build();
}
- items[index] = new MediaSession.QueueItem(desc, id);
+ items.add(new MediaSession.QueueItem(desc, i));
}
- return Arrays.asList(items);
+ return items;
} finally {
c.close();
}