From b90cc983776d575dfa3cc7bdde7e3c9f1efb8248 Mon Sep 17 00:00:00 2001 From: Adrian Ulrich Date: Mon, 4 Dec 2017 19:53:16 +0100 Subject: [PATCH] fix possible endless loop We were hanging there if a user selected the previous album if: * He already was at the first album * And FINISH_RANDOM was enabled The new code is somewhat simpler to read and handles the case where we hit song 0 in random mode. --- .../android/vanilla/SongTimeline.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/ch/blinkenlights/android/vanilla/SongTimeline.java b/src/ch/blinkenlights/android/vanilla/SongTimeline.java index 97a8a559..a5778cba 100644 --- a/src/ch/blinkenlights/android/vanilla/SongTimeline.java +++ b/src/ch/blinkenlights/android/vanilla/SongTimeline.java @@ -691,14 +691,22 @@ public final class SongTimeline { else if (delta == SHIFT_PREVIOUS_SONG || delta == SHIFT_NEXT_SONG) { shiftCurrentSongInternal(delta); } else { - Song song = getSong(0); - long currentAlbum = song.albumId; - long currentSong = song.id; + Song currentSong = getSong(0); + Song song = currentSong; delta = delta > 0 ? 1 : -1; - do { + for (;;) { shiftCurrentSongInternal(delta); song = getSong(0); - } while (currentAlbum == song.albumId && currentSong != song.id); + + if (currentSong == null || song == null) + break; + if (currentSong.albumId != song.albumId) // found a new album + break; + if (currentSong.id == song.id) // probably looping? (= only one album in queue) + break; + if (getPosition() == 0 && getFinishAction() == FINISH_RANDOM) // dead end: FINISH_RANDOM won't wrap around. + break; + } } }