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<ArtistOrIndex, ArtistRowBinder.ViewHolder>(), KoinComponent { +) : ItemViewBinder<ArtistOrIndex, ArtistRowBinder.ViewHolder>(), + 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<T : Identifiable> : MultiTypeAdapter() { +class BaseAdapter<T : Identifiable> : MultiTypeAdapter(), FastScrollRecyclerView.SectionedAdapter { // Update the BoundedTreeSet if selection type is changed internal var selectionType: SelectionType = SelectionType.MULTIPLE @@ -221,4 +222,15 @@ class BaseAdapter<T : Identifiable> : MultiTypeAdapter() { return oldItem.id == newItem.id } } + + override fun getSectionName(position: Int): String { + val type = getItemViewType(position) + val binder = types.getType<Any>(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<MusicDirectory.Child>() { 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 @@ <?xml version="1.0" encoding="utf-8"?> - -<LinearLayout - xmlns:a="http://schemas.android.com/apk/res/android" - a:orientation="vertical" +<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" a:layout_width="fill_parent" - a:layout_height="fill_parent"> + a:layout_height="fill_parent" + a:orientation="vertical"> <TextView a:id="@+id/playlist_empty" - a:text="@string/playlist.empty" a:layout_width="fill_parent" a:layout_height="wrap_content" - a:padding="10dip"/> + a:padding="10dip" + a:text="@string/playlist.empty" /> - <androidx.recyclerview.widget.RecyclerView + + <com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView a:id="@+id/playlist_view" a:layout_width="fill_parent" a:layout_height="0dip" a:layout_weight="1" - a:fastScrollEnabled="true" /> + 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" /> </LinearLayout> \ No newline at end of file