Add entire album to queue when in album shuffle mode. (#704)
* When in Album Shuffle mode, enqueue all tracks from the same album at once. * Replaced getRandomSong() with getRandomSongs(). Queue shrink can always be 20, without issue. * Updated comment text. * Grab the first song, not the last. * Use a do-while loop for adding all the album songs.
This commit is contained in:
parent
9c6c18912f
commit
3c62628a42
@ -408,13 +408,15 @@ public class MediaUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a song randomly selected from all the songs in the Android
|
* Returns a list of songs randomly selected from all the songs in the Android
|
||||||
* MediaStore.
|
* MediaStore. When albumShuffle is specified, the returned list may contain all the songs
|
||||||
|
* for that album, in order. Otherwise, only one song will be returned. If no songs are
|
||||||
|
* available, the list will be empty.
|
||||||
*
|
*
|
||||||
* @param context The Context to use
|
* @param context The Context to use
|
||||||
* @param albumShuffle Whether or not we should shuffle by album
|
* @param albumShuffle Whether or not we should shuffle by album
|
||||||
*/
|
*/
|
||||||
public static Song getRandomSong(Context context, boolean albumShuffle) {
|
public static List<Song> getRandomSongs(Context context, boolean albumShuffle) {
|
||||||
ArrayList<Song> songs = sAllSongs;
|
ArrayList<Song> songs = sAllSongs;
|
||||||
|
|
||||||
if (songs.size() == 0 || sAllSongsAS != albumShuffle) {
|
if (songs.size() == 0 || sAllSongsAS != albumShuffle) {
|
||||||
@ -426,12 +428,31 @@ public class MediaUtils {
|
|||||||
sSongCount = songs.size();
|
sSongCount = songs.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
Song result = null;
|
final List<Song> results = new ArrayList<>();
|
||||||
|
|
||||||
if (songs.size() > 0) {
|
if (songs.size() > 0) {
|
||||||
result = songs.remove(0);
|
|
||||||
result.flags |= Song.FLAG_RANDOM;
|
long firstAlbumId = songs.get(0).albumId;
|
||||||
|
|
||||||
|
// if we're in album shuffle mode, we'll want to add in the entire album in one go,
|
||||||
|
// so loop through the upcoming songs and add all those that have the same album id
|
||||||
|
// as the song we initially got
|
||||||
|
boolean addMore;
|
||||||
|
do {
|
||||||
|
final Song song = songs.remove(0);
|
||||||
|
|
||||||
|
// when in album shuffle mode, we don't want to flag any of the added songs
|
||||||
|
// as random, since manually enqueuing or changing random mode will remove every album track.
|
||||||
|
if (!albumShuffle) {
|
||||||
|
song.flags |= Song.FLAG_RANDOM;
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
|
results.add(song);
|
||||||
|
addMore = albumShuffle && songs.size() > 0 && songs.get(0).albumId == firstAlbumId;
|
||||||
|
} while (addMore);
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -605,5 +626,4 @@ public class MediaUtils {
|
|||||||
return TYPE_INVALID;
|
return TYPE_INVALID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,9 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
|
|
||||||
import junit.framework.Assert;
|
import junit.framework.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -580,10 +582,18 @@ public final class SongTimeline {
|
|||||||
return null;
|
return null;
|
||||||
} else if (pos == size) {
|
} else if (pos == size) {
|
||||||
if (mFinishAction == FINISH_RANDOM) {
|
if (mFinishAction == FINISH_RANDOM) {
|
||||||
song = MediaUtils.getRandomSong(mContext, mShuffleMode == SHUFFLE_ALBUMS);
|
|
||||||
if (song == null)
|
final List<Song> songs = MediaUtils.getRandomSongs(mContext, mShuffleMode == SHUFFLE_ALBUMS);
|
||||||
|
if (songs.size() == 0) {
|
||||||
return null;
|
return null;
|
||||||
timeline.add(song);
|
}
|
||||||
|
|
||||||
|
for (Song newSong : songs) {
|
||||||
|
timeline.add(newSong);
|
||||||
|
}
|
||||||
|
|
||||||
|
song = songs.get(0);
|
||||||
|
|
||||||
mLastRandomSong = song;
|
mLastRandomSong = song;
|
||||||
// Keep the queue at 20 items to avoid growing forever
|
// Keep the queue at 20 items to avoid growing forever
|
||||||
// Note that we do not broadcast the addition of this song, as it
|
// Note that we do not broadcast the addition of this song, as it
|
||||||
|
Loading…
x
Reference in New Issue
Block a user