From 80e587c1aa0c3dd39d55bd12b9cd99731ef0de57 Mon Sep 17 00:00:00 2001 From: tzugen Date: Wed, 8 Dec 2021 17:51:31 +0100 Subject: [PATCH] Add scrollbar to playlist view, implement SectionedAdapter for Artists --- .../ultrasonic/adapters/ArtistRowBinder.kt | 16 ++++++++-- .../moire/ultrasonic/adapters/BaseAdapter.kt | 14 ++++++++- .../org/moire/ultrasonic/adapters/Utils.kt | 5 ++++ .../fragment/TrackCollectionFragment.kt | 2 +- .../src/main/res/layout/current_playlist.xml | 29 +++++++++++++------ 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/ArtistRowBinder.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/ArtistRowBinder.kt index 4a38f667..d83385ab 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/ArtistRowBinder.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/ArtistRowBinder.kt @@ -20,6 +20,7 @@ import com.drakeet.multitype.ItemViewBinder import org.koin.core.component.KoinComponent import org.moire.ultrasonic.R import org.moire.ultrasonic.domain.ArtistOrIndex +import org.moire.ultrasonic.domain.Identifiable import org.moire.ultrasonic.imageloader.ImageLoader import org.moire.ultrasonic.util.FileUtil import org.moire.ultrasonic.util.Settings @@ -32,14 +33,16 @@ class ArtistRowBinder( val onContextMenuClick: (MenuItem, ArtistOrIndex) -> Boolean, private val imageLoader: ImageLoader, private val enableSections: Boolean = true -) : ItemViewBinder(), KoinComponent { +) : ItemViewBinder(), + KoinComponent, + Utils.SectionedBinder { val layout = R.layout.list_item_artist val contextMenuLayout = R.menu.context_menu_artist override fun onBindViewHolder(holder: ViewHolder, item: ArtistOrIndex) { holder.textView.text = item.name - holder.section.text = getSectionForArtist(item) + holder.section.text = getSectionForDisplay(item) holder.section.isVisible = enableSections holder.layout.setOnClickListener { onItemClick(item) } holder.layout.setOnLongClickListener { @@ -70,7 +73,14 @@ class ArtistRowBinder( } } - private fun getSectionForArtist(item: ArtistOrIndex): String { + override fun getSectionName(item: Identifiable): String { + val index = adapter.items.indexOf(item) + if (index == -1 || item !is ArtistOrIndex) return "" + + return getSectionFromName(item.name ?: "") + } + + private fun getSectionForDisplay(item: ArtistOrIndex): String { val index = adapter.items.indexOf(item) if (index == -1) return " " diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/BaseAdapter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/BaseAdapter.kt index d4e9da09..55f17f0c 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/BaseAdapter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/BaseAdapter.kt @@ -15,6 +15,7 @@ import androidx.recyclerview.widget.AsyncListDiffer import androidx.recyclerview.widget.AsyncListDiffer.ListListener import androidx.recyclerview.widget.DiffUtil import com.drakeet.multitype.MultiTypeAdapter +import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView import org.moire.ultrasonic.domain.Identifiable import org.moire.ultrasonic.util.BoundedTreeSet import timber.log.Timber @@ -26,7 +27,7 @@ import timber.log.Timber * It should be kept generic enough that it can be used a Base for all lists in the app. */ @Suppress("unused", "UNUSED_PARAMETER") -class BaseAdapter : MultiTypeAdapter() { +class BaseAdapter : MultiTypeAdapter(), FastScrollRecyclerView.SectionedAdapter { // Update the BoundedTreeSet if selection type is changed internal var selectionType: SelectionType = SelectionType.MULTIPLE @@ -221,4 +222,15 @@ class BaseAdapter : MultiTypeAdapter() { return oldItem.id == newItem.id } } + + override fun getSectionName(position: Int): String { + val type = getItemViewType(position) + val binder = types.getType(type).delegate + + if (binder is Utils.SectionedBinder) { + return binder.getSectionName(items[position] as Identifiable) + } + + return "" + } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/Utils.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/Utils.kt index e1ea9093..991ae445 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/Utils.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/adapters/Utils.kt @@ -7,6 +7,7 @@ import android.view.View import android.widget.PopupMenu import org.moire.ultrasonic.R import org.moire.ultrasonic.data.ActiveServerProvider +import org.moire.ultrasonic.domain.Identifiable import org.moire.ultrasonic.util.Settings import org.moire.ultrasonic.util.Util @@ -69,4 +70,8 @@ object Utils { playingImage = Util.getDrawableFromAttribute(context, R.attr.media_play_small) } } + + interface SectionedBinder { + fun getSectionName(item: Identifiable): String + } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt index ca9b099e..e9f398e2 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt @@ -517,7 +517,7 @@ open class TrackCollectionFragment : MultiListFragment() { private fun moreRandomTracks() { val listSize = arguments?.getInt(Constants.INTENT_ALBUM_LIST_SIZE, 0) ?: 0 - moreButton!!.setOnClickListener { it: View? -> + moreButton!!.setOnClickListener { val offset = requireArguments().getInt( Constants.INTENT_ALBUM_LIST_OFFSET, 0 ) + listSize diff --git a/ultrasonic/src/main/res/layout/current_playlist.xml b/ultrasonic/src/main/res/layout/current_playlist.xml index 3e6eeafb..bad74a52 100644 --- a/ultrasonic/src/main/res/layout/current_playlist.xml +++ b/ultrasonic/src/main/res/layout/current_playlist.xml @@ -1,23 +1,34 @@ - - + a:layout_height="fill_parent" + a:orientation="vertical"> + a:padding="10dip" + a:text="@string/playlist.empty" /> - + a:clipToPadding="false" + a:paddingTop="8dp" + a:paddingBottom="8dp" + app:fastScrollAutoHide="true" + app:fastScrollAutoHideDelay="2000" + app:fastScrollPopupBackgroundSize="42dp" + app:fastScrollPopupBgColor="@color/cyan" + app:fastScrollPopupPosition="adjacent" + app:fastScrollPopupTextColor="@android:color/primary_text_dark" + app:fastScrollPopupTextSize="28sp" + app:fastScrollThumbColor="@color/cyan" + app:fastScrollTrackColor="@color/dividerColor" /> \ No newline at end of file