From b9d3ee6ddb092d09638059f510573d8adcba7607 Mon Sep 17 00:00:00 2001 From: tomaThomas Date: Fri, 11 Oct 2024 19:25:15 +0200 Subject: [PATCH] Add basic search in playlist --- .../song/OrderablePlaylistSongAdapter.kt | 38 ++++++++++++++++++- .../playlists/PlaylistDetailsFragment.kt | 19 ++++++++++ .../layout/fragment_playlist_detail_new.xml | 15 ++++++++ gradle/libs.versions.toml | 2 +- 4 files changed, 72 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt index bf85fe28b..a9f9c0c2d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt @@ -25,6 +25,7 @@ import code.name.monkey.retromusic.db.toSongEntity import code.name.monkey.retromusic.db.toSongsEntity import code.name.monkey.retromusic.dialogs.RemoveSongFromPlaylistDialog import code.name.monkey.retromusic.fragments.LibraryViewModel +import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.ViewUtil import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter @@ -43,9 +44,20 @@ class OrderablePlaylistSongAdapter( val libraryViewModel: LibraryViewModel by activity.viewModel() + private var filtered = false + private var filter: CharSequence? = null + private var fullDataSet: MutableList + init { this.setHasStableIds(true) this.setMultiSelectMenuRes(R.menu.menu_playlists_songs_selection) + fullDataSet = dataSet.toMutableList() + } + + override fun swapDataSet(dataSet: List) { + super.swapDataSet(dataSet) + fullDataSet = dataSet.toMutableList() + onFilter(filter) } override fun getItemId(position: Int): Long { @@ -90,13 +102,22 @@ class OrderablePlaylistSongAdapter( return super.onSongMenuItemClick(item) } + override fun onClick(v: View?) { + if (isInQuickSelectMode || !filtered) { + super.onClick(v) + } else { + val position = fullDataSet.indexOf(dataSet.get(layoutPosition)) + MusicPlayerRemote.openQueue(fullDataSet, position, true) + } + } + init { dragView?.isVisible = true } } override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean { - if (isInQuickSelectMode) { + if (isInQuickSelectMode || filtered) { return false } return ViewUtil.hitTest(holder.imageText!!, x, y) || ViewUtil.hitTest( @@ -127,8 +148,23 @@ class OrderablePlaylistSongAdapter( } fun saveSongs(playlistEntity: PlaylistEntity) { + onFilter(null) activity.lifecycleScope.launch(Dispatchers.IO) { libraryViewModel.insertSongs(dataSet.toSongsEntity(playlistEntity)) } } + + + fun onFilter(text: CharSequence?) { + filter = text + if (text.isNullOrEmpty()) { + filtered = false + dataSet = fullDataSet + } else { + filtered = true + dataSet = fullDataSet.filter { song -> song.title.contains(text, ignoreCase = true) } + .toMutableList() + } + notifyDataSetChanged() + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt index 352bf453b..c007c935b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt @@ -8,6 +8,8 @@ import android.view.MenuItem import android.view.View import androidx.core.view.doOnPreDraw import androidx.core.view.isVisible +import androidx.core.widget.addTextChangedListener +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager @@ -21,6 +23,7 @@ import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.elevatedAccentColor import code.name.monkey.retromusic.extensions.surfaceColor import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment +import code.name.monkey.retromusic.fragments.search.clearText import code.name.monkey.retromusic.glide.RetroGlideExtension.playlistOptions import code.name.monkey.retromusic.glide.playlistPreview.PlaylistPreview import code.name.monkey.retromusic.helper.MusicPlayerRemote @@ -35,6 +38,9 @@ import com.google.android.material.transition.MaterialContainerTransform import com.google.android.material.transition.MaterialSharedAxis import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.launch import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf @@ -51,6 +57,8 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli private lateinit var playlist: PlaylistWithSongs private lateinit var playlistSongAdapter: OrderablePlaylistSongAdapter + private val _searchFlow = MutableSharedFlow() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) sharedElementEnterTransition = MaterialContainerTransform(requireContext(), true).apply { @@ -119,6 +127,16 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli ArrayList(), R.layout.item_queue ) + binding.playlistSearchView.addTextChangedListener { text -> + lifecycleScope.launch { + _searchFlow.emit(text) + } + } + lifecycleScope.launch { + _searchFlow.debounce(300).collect { text -> + playlistSongAdapter.onFilter(text) + } + } val dragDropManager = RecyclerViewDragDropManager() @@ -160,6 +178,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli } override fun onPause() { + binding.playlistSearchView.clearText() playlistSongAdapter.saveSongs(playlist.playlistEntity) super.onPause() } diff --git a/app/src/main/res/layout/fragment_playlist_detail_new.xml b/app/src/main/res/layout/fragment_playlist_detail_new.xml index 1d2003ee4..3761902e3 100644 --- a/app/src/main/res/layout/fragment_playlist_detail_new.xml +++ b/app/src/main/res/layout/fragment_playlist_detail_new.xml @@ -30,6 +30,21 @@ android:paddingBottom="16dp" android:paddingHorizontal="16dp"> + + +