diff --git a/app/src/main/java/code/name/monkey/retromusic/Constants.kt b/app/src/main/java/code/name/monkey/retromusic/Constants.kt
index 4cb587575..400b1c473 100644
--- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt
@@ -161,4 +161,5 @@ const val CIRCLE_PLAY_BUTTON = "circle_play_button"
const val SWIPE_ANYWHERE_NOW_PLAYING = "swipe_anywhere_now_playing"
const val PAUSE_HISTORY = "pause_history"
const val MANAGE_AUDIO_FOCUS = "manage_audio_focus"
-const val SWIPE_DOWN_DISMISS = "swipe_to_dismiss"
\ No newline at end of file
+const val SWIPE_DOWN_DISMISS = "swipe_to_dismiss"
+const val ENABLE_SEARCH_PLAYLIST= "enable_search_playlist"
\ No newline at end of file
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 a9f9c0c2d..78f2f53f6 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
@@ -107,7 +107,7 @@ class OrderablePlaylistSongAdapter(
super.onClick(v)
} else {
val position = fullDataSet.indexOf(dataSet.get(layoutPosition))
- MusicPlayerRemote.openQueue(fullDataSet, position, true)
+ MusicPlayerRemote.openQueueKeepShuffleMode(fullDataSet, position, true)
}
}
@@ -167,4 +167,8 @@ class OrderablePlaylistSongAdapter(
}
notifyDataSetChanged()
}
+
+ fun hasSongs(): Boolean {
+ return itemCount > 0 || (filtered && fullDataSet.size > 0)
+ }
}
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 c007c935b..a02cb3dde 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
@@ -30,6 +30,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
+import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.ThemedFastScroller
import com.bumptech.glide.Glide
import com.google.android.material.shape.MaterialShapeDrawable
@@ -79,6 +80,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
// binding.container.transitionName = playlist.playlistEntity.playlistName
setUpRecyclerView()
+ setUpSearch()
setupButtons()
viewModel.getPlaylist().observe(viewLifecycleOwner) { playlistWithSongs ->
playlist = playlistWithSongs
@@ -120,6 +122,33 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
}
}
+ private fun setUpSearch() {
+ if (!PreferenceUtil.enableSearchPlaylist) {
+ binding.playlistSearchView.visibility = View.GONE
+ } else {
+ binding.playlistSearchView.visibility = View.VISIBLE
+ }
+ binding.playlistSearchView.addTextChangedListener { text ->
+ lifecycleScope.launch {
+ _searchFlow.emit(text)
+ binding.clearSearch.visibility =
+ if (text.isNullOrBlank()) View.GONE else View.VISIBLE
+ }
+ }
+ binding.clearSearch.setOnClickListener {
+ lifecycleScope.launch {
+ _searchFlow.emit(null)
+ binding.playlistSearchView.clearText()
+ binding.clearSearch.visibility = View.GONE
+ }
+ }
+ lifecycleScope.launch {
+ _searchFlow.debounce(300).collect { text ->
+ playlistSongAdapter.onFilter(text)
+ }
+ }
+ }
+
private fun setUpRecyclerView() {
playlistSongAdapter = OrderablePlaylistSongAdapter(
arguments.extraPlaylistId,
@@ -127,16 +156,6 @@ 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()
@@ -168,8 +187,18 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
}
private fun checkIsEmpty() {
- binding.empty.isVisible = playlistSongAdapter.itemCount == 0
- binding.emptyText.isVisible = playlistSongAdapter.itemCount == 0
+ if (_binding != null) {
+ if (playlistSongAdapter.itemCount != 0) {
+ binding.empty.isVisible = false
+ } else {
+ binding.empty.isVisible = true
+ if (playlistSongAdapter.hasSongs()) {
+ binding.emptyText.text = getString(R.string.no_search_results)
+ } else {
+ binding.emptyText.text = getString(R.string.no_songs)
+ }
+ }
+ }
}
override fun onDestroy() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
index 6613c22ab..f01bb0346 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
@@ -680,6 +680,9 @@ object PreferenceUtil {
val rememberLastTab: Boolean
get() = sharedPreferences.getBoolean(REMEMBER_LAST_TAB, true)
+ val enableSearchPlaylist: Boolean
+ get() = sharedPreferences.getBoolean(ENABLE_SEARCH_PLAYLIST, true)
+
var lastTab: Int
get() = sharedPreferences
.getInt(LAST_USED_TAB, 0)
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 3761902e3..a968a6989 100644
--- a/app/src/main/res/layout/fragment_playlist_detail_new.xml
+++ b/app/src/main/res/layout/fragment_playlist_detail_new.xml
@@ -35,16 +35,28 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/play_button"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toLeftOf="@id/clear_search"
android:background="@null"
android:hint="@string/action_search"
android:inputType="text|textAutoComplete"
- android:paddingStart="16dp"
- android:paddingEnd="16dp"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
+ android:padding="12dp"
android:textAppearance="@style/TextViewSubtitle1">
+
+
No purchase found.
No results
You have no songs
+ No search results
Normal
Normal lyrics
%s is not listed in the media store.]]>
@@ -365,6 +366,7 @@
License details for open source software
When enabled, newly played songs won\'t show in history
Navigate to the last used tab on start
+ Show a search field in a playlist
Display synced lyrics over album cover
Show New Music Mix on homescreen
Enables changing song by swiping anywhere on the now playing screen
@@ -412,6 +414,7 @@
Open source licences
Pause history
Remember last tab
+ Enable search in playlist
Show lyrics
Show suggestions
Swipe anywhere to change song
diff --git a/app/src/main/res/xml/pref_ui.xml b/app/src/main/res/xml/pref_ui.xml
index 3517e949b..58020fa24 100644
--- a/app/src/main/res/xml/pref_ui.xml
+++ b/app/src/main/res/xml/pref_ui.xml
@@ -67,6 +67,13 @@
android:summary="@string/pref_summary_remember_tab"
android:title="@string/pref_title_remember_tab" />
+
+