automatically remove last appended random song from queue if we are going out of RANDOM mode

This commit is contained in:
Adrian Ulrich 2016-10-30 15:51:03 +01:00
parent 0729e4d96a
commit bcd64a46d4

View File

@ -238,6 +238,10 @@ public final class SongTimeline {
* Hash code of mSongs while mShuffleCache was generated * Hash code of mSongs while mShuffleCache was generated
*/ */
private int mShuffleTicket; private int mShuffleTicket;
/**
* The last song we added randomly by calling MediaUtils.getRandomSong()
*/
private Song mLastRandomSong;
// for saveActiveSongs() // for saveActiveSongs()
private Song mSavedPrevious; private Song mSavedPrevious;
@ -485,11 +489,29 @@ public final class SongTimeline {
*/ */
public void setFinishAction(int action) public void setFinishAction(int action)
{ {
synchronized (this) {
saveActiveSongs(); saveActiveSongs();
if (mFinishAction == FINISH_RANDOM) {
// Remove the last song if we are going out of RANDOM mode and we
// are currently playing the 2nd last one.
int lastSongPos = getLength() - 1;
if (getPosition()+1 == lastSongPos) {
Song lastSong = mSongs.get(lastSongPos);
if (lastSong.isRandom() && lastSong.equals(mLastRandomSong)) {
mSongs.remove(lastSongPos);
}
}
// forget about the last random song, even if it survived (eg: was switching modes while not playing
// the 2nd last song -> the last song is now considered to be part of the queue)
mLastRandomSong = null;
}
mFinishAction = action; mFinishAction = action;
broadcastChangedSongs(); broadcastChangedSongs();
changed(); changed();
} }
}
/** /**
* Returns a shuffled (according to mShuffleMode) version * Returns a shuffled (according to mShuffleMode) version
@ -558,6 +580,7 @@ public final class SongTimeline {
if (song == null) if (song == null)
return null; return null;
timeline.add(song); timeline.add(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
// was virtually 'always there' // was virtually 'always there'