[Android] Audio player prevent reordering when in filter mode
Nicolas Pomepuy
git at videolan.org
Tue Mar 25 14:59:34 UTC 2025
vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Wed Mar 19 12:07:15 2025 +0100| [50256a48330c3cff31ab5ec91ae0c22ae2e1ffe7] | committer: Duncan McNamara
Audio player prevent reordering when in filter mode
> https://code.videolan.org/videolan/vlc-android/commit/50256a48330c3cff31ab5ec91ae0c22ae2e1ffe7
---
application/vlc-android/res/layout/playlist_item.xml | 6 ++++++
.../vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt | 11 ++++++++++-
.../src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt | 4 ++--
.../vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt | 2 +-
.../src/org/videolan/vlc/viewmodels/PlaylistModel.kt | 11 ++++++++++-
5 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/application/vlc-android/res/layout/playlist_item.xml b/application/vlc-android/res/layout/playlist_item.xml
index 4ce37114e2..5f7afb290a 100644
--- a/application/vlc-android/res/layout/playlist_item.xml
+++ b/application/vlc-android/res/layout/playlist_item.xml
@@ -39,6 +39,10 @@
name="showTrackNumbers"
type="java.lang.Boolean" />
+ <variable
+ name="showReorderButtons"
+ type="java.lang.Boolean" />
+
<variable
name="masked"
type="java.lang.Boolean" />
@@ -214,6 +218,7 @@
android:layout_gravity="center"
android:layout_marginEnd="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
+ android:visibility="@{showReorderButtons ? View.VISIBLE : View.GONE}"
android:clickable="true"
android:focusable="true"
android:onClick="@{holder::onMoveDownClick}"
@@ -236,6 +241,7 @@
android:clickable="true"
android:focusable="true"
android:onClick="@{holder::onMoveUpClick}"
+ android:visibility="@{showReorderButtons ? View.VISIBLE : View.GONE}"
android:padding="8dp"
android:scaleType="center"
app:layout_constraintBottom_toBottomOf="parent"
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt b/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt
index c56dcc147e..1c70ccb3d1 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt
@@ -68,6 +68,7 @@ import org.videolan.medialibrary.Tools
import org.videolan.medialibrary.interfaces.media.Bookmark
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
+import org.videolan.resources.AndroidDevices
import org.videolan.resources.AppContextProvider
import org.videolan.resources.TAG_ITEM
import org.videolan.resources.util.parcelable
@@ -164,6 +165,7 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, IAudioPlay
private var lastEndsAt = -1L
private var isDragging = false
private var currentChapters: Pair<MediaWrapper, List<MediaPlayer.Chapter>?>? = null
+ private lateinit var callback: SwipeDragItemTouchHelperCallback
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -177,6 +179,13 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, IAudioPlay
playlistModel = PlaylistModel.get(this)
playlistModel.progress.observe(this at AudioPlayer) { it?.let { updateProgress(it) } }
playlistModel.speed.observe(this at AudioPlayer) { showChips() }
+ playlistModel.filteringState.observe(this at AudioPlayer) {
+ callback.longPressDragEnable = !it
+ if (isTablet() || AndroidDevices.isTv) {
+ playlistAdapter.showReorderButtons = !it
+ playlistAdapter.notifyDataSetChanged()
+ }
+ }
playlistAdapter.setModel(playlistModel)
playlistModel.dataset.asFlow().conflate().onEach {
doUpdate()
@@ -232,7 +241,7 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, IAudioPlay
coverMediaSwitcherListener.onChapterSwitching(false)
}
- val callback = SwipeDragItemTouchHelperCallback(playlistAdapter, true)
+ callback = SwipeDragItemTouchHelperCallback(playlistAdapter, true)
val touchHelper = ItemTouchHelper(callback)
touchHelper.attachToRecyclerView(binding.songsList)
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt b/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt
index 7d341f3a20..820fd19421 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt
@@ -72,6 +72,7 @@ private const val ACTION_MOVED = "action_moved"
class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<MediaWrapper, PlaylistAdapter.ViewHolder>(), SwipeDragHelperAdapter, SchedulerCallback {
var showTrackNumbers: Boolean = false
+ var showReorderButtons: Boolean = true
private var defaultCoverVideo: BitmapDrawable
private var defaultCoverAudio: BitmapDrawable
private var model: PlaylistModel? = null
@@ -156,8 +157,7 @@ class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<MediaWrappe
val tablet = holder.binding.itemDelete.context.isTablet() || AndroidDevices.isTv
if (tablet) holder.binding.itemDelete.setVisible() else holder.binding.itemDelete.setGone()
- if (tablet) holder.binding.itemMoveDown.setVisible() else holder.binding.itemMoveDown.setGone()
- if (tablet) holder.binding.itemMoveUp.setVisible() else holder.binding.itemMoveUp.setGone()
+ holder.binding.showReorderButtons = showReorderButtons && tablet
holder.binding.executePendingBindings()
}
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt b/application/vlc-android/src/org/videolan/vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt
index 6fc4601cff..5c1f2f7fe5 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt
@@ -28,7 +28,7 @@ import androidx.recyclerview.widget.RecyclerView
import org.videolan.vlc.gui.helpers.hf.PinCodeDelegate
import org.videolan.vlc.interfaces.SwipeDragHelperAdapter
-class SwipeDragItemTouchHelperCallback(private val mAdapter: SwipeDragHelperAdapter, private val longPressDragEnable: Boolean = false, private val lockedInSafeMode: Boolean = false) : ItemTouchHelper.Callback() {
+class SwipeDragItemTouchHelperCallback(private val mAdapter: SwipeDragHelperAdapter, var longPressDragEnable: Boolean = false, private val lockedInSafeMode: Boolean = false) : ItemTouchHelper.Callback() {
private var dragFrom = -1
private var dragTo = -1
var swipeEnabled = true
diff --git a/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt b/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
index ca046bb7fa..4943e43508 100644
--- a/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
+++ b/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
@@ -24,7 +24,11 @@ import android.support.v4.media.session.PlaybackStateCompat
import androidx.annotation.MainThread
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.*
+import androidx.lifecycle.MediatorLiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.channels.actor
@@ -48,6 +52,11 @@ class PlaylistModel : ViewModel(), PlaybackService.Callback by EmptyPBSCallback
val selection : Int
get() = if (filtering) -1 else service?.playlistManager?.currentIndex ?: -1
private var filtering = false
+ set(value) {
+ field = value
+ filteringState.value = value
+ }
+ val filteringState = MutableLiveData<Boolean>()
val progress = MediatorLiveData<PlaybackProgress>()
val speed = MediatorLiveData<Float>()
val playerState = MutableLiveData<PlayerState>()
More information about the Android
mailing list