Browse Source

Fix shuffle issues in the file browser

Fixes #3227
merge-requests/2298/head
Nicolas Pomepuy 9 months ago
committed by Duncan McNamara
parent
commit
c707384d99
  1. 15
      application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt
  2. 4
      application/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt
  3. 9
      application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt

15
application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt

@ -307,6 +307,11 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
viewModel.refresh()
}
}
lifecycleScope.launch {
PlaylistManager.shuffling.collect {
setupFab()
}
}
}
override fun onDisplaySettingChanged(key: String, value: Any) {
@ -397,12 +402,16 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
it?.addCallback(this)
}.launchIn(startedScope)
setupFab()
(activity as? AudioPlayerContainerActivity)?.expandAppBar()
}
private fun setupFab() {
fabPlay?.run {
setImageResource(R.drawable.ic_fab_play)
setImageResource(if (PlaylistManager.shuffling.value) R.drawable.ic_fab_shuffle else R.drawable.ic_fab_play)
updateFab()
fabPlay?.contentDescription = getString(R.string.play)
}
(activity as? AudioPlayerContainerActivity)?.expandAppBar()
}
@ -579,7 +588,7 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
}
}
scheduler.startAction(MSG_HIDE_ENQUEUING)
activity?.let { MediaUtils.openList(it, mediaLocations, positionInPlaylist) }
activity?.let { MediaUtils.openList(it, mediaLocations, positionInPlaylist, shuffle = PlaylistManager.shuffling.value) }
}
}

4
application/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt

@ -294,7 +294,9 @@ object MediaUtils {
fun openList(context: Context?, list: List<MediaWrapper>, position: Int, shuffle: Boolean = false) {
if (list.isEmpty() || context == null) return
SuspendDialogCallback(context) { service ->
service.load(list, position)
val realPos = if (shuffle) SecureRandom().nextInt(list.size)
else position
service.load(list, realPos)
if (shuffle && !service.isShuffling) service.shuffle()
}
}

9
application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt

@ -122,6 +122,7 @@ class PlaylistManager(val service: PlaybackService) : MediaWrapperList.EventList
private val mediaList = MediaWrapperList()
fun hasMedia() = mediaList.size() != 0
val repeating = MutableStateFlow(PlaybackStateCompat.REPEAT_MODE_NONE)
val shuffling = MutableStateFlow(false)
var playingAsAudio = false
}
@ -138,7 +139,13 @@ class PlaylistManager(val service: PlaybackService) : MediaWrapperList.EventList
private var prevIndex = -1
private var previous = Stack<Int>()
var stopAfter = -1
var shuffling = false
var shuffling: Boolean = false
set(value) {
field = value
AppScope.launch {
PlaylistManager.shuffling.emit(value)
}
}
var videoBackground = false
private set
var isBenchmark = false

Loading…
Cancel
Save