Browse Source

Fix the audio player UI when swiping an item while filtering

Fixes #3174
merge-requests/1594/merge
Nicolas Pomepuy 1 year ago
committed by Duncan McNamara
parent
commit
67e6e2a341
  1. 5
      application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt
  2. 6
      application/vlc-android/src/org/videolan/vlc/util/FilterDelegate.kt
  3. 20
      application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt

5
application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt

@ -206,13 +206,14 @@ class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<MediaWrappe
model?.let {
val media = getItem(position)
val message = String.format(AppContextProvider.appResources.getString(R.string.remove_playlist_item), media.title)
val originalPosition = it.getOriginalPosition(position)
if (player is Fragment) {
UiTools.snackerWithCancel(player.requireActivity(), message, overAudioPlayer = true, action = {}) {
model?.run { insertMedia(it.getOriginalPosition(position), media) }
model?.run { insertMedia(originalPosition, media) }
}
} else if (player is Activity) {
UiTools.snackerWithCancel(player, message, action = {}) {
model?.run { insertMedia(it.getOriginalPosition(position), media) }
model?.run { insertMedia(originalPosition, media) }
}
}
remove(position)

6
application/vlc-android/src/org/videolan/vlc/util/FilterDelegate.kt

@ -7,10 +7,10 @@ import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.AppContextProvider
import org.videolan.vlc.media.MediaUtils
import java.util.*
import java.util.Locale
open class FilterDelegate<T : MediaLibraryItem>(protected val dataset: MutableLiveData<out List<T>>) {
private var sourceSet: List<T>? = null
open class FilterDelegate<T : MediaLibraryItem>(val dataset: MutableLiveData<out List<T>>) {
var sourceSet: List<T>? = null
protected fun initSource() : List<T>? {
if (sourceSet === null) sourceSet = (dataset.value)

20
application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt

@ -62,6 +62,7 @@ class PlaylistModel : ViewModel(), PlaybackService.Callback by EmptyPBSCallback
val playerState = MutableLiveData<PlayerState>()
val connected : Boolean
get() = service !== null
var lastQuery: CharSequence? = null
private val filter by lazy(LazyThreadSafetyMode.NONE) { PlaylistFilterDelegate(dataset) }
@ -85,7 +86,13 @@ class PlaylistModel : ViewModel(), PlaybackService.Callback by EmptyPBSCallback
override fun update() {
service?.run {
dataset.value = media.toMutableList()
if (filtering) {
originalDataset = media.toMutableList()
filter.sourceSet = originalDataset
dataset.value = filter.dataset.value?.toMutableList() ?: media.toMutableList()
filterActor.trySend(lastQuery)
} else
dataset.value = media.toMutableList()
playerState.value = PlayerState(isPlaying, title, artist)
}
}
@ -93,7 +100,15 @@ class PlaylistModel : ViewModel(), PlaybackService.Callback by EmptyPBSCallback
val hasMedia
get() = service?.hasMedia() ?: false
fun insertMedia(position: Int, media: MediaWrapper) = service?.insertItem(position, media)
fun insertMedia(position: Int, media: MediaWrapper) {
service?.insertItem(position, media)
if (filtering) {
service?.let {
originalDataset = it.media.toMutableList()
filter.sourceSet = originalDataset
}
}
}
/**
* Get original position even if current list is filtered
@ -111,6 +126,7 @@ class PlaylistModel : ViewModel(), PlaybackService.Callback by EmptyPBSCallback
@MainThread
fun filter(query: CharSequence?) {
lastQuery = query
val filtering = query != null
if (this.filtering != filtering) {
this.filtering = filtering

Loading…
Cancel
Save