diff --git a/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt b/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt index fa41ef92c..8969e8aaf 100644 --- a/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt +++ b/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt @@ -46,9 +46,11 @@ object IntegerTable { const val ITEM_TYPE_GENRE_DETAIL = 0xA00B /** GenreSongViewHolder */ const val ITEM_TYPE_GENRE_SONG = 0xA00C + /** DiscHeaderViewHolder */ + const val ITEM_TYPE_DISC_HEADER = 0xA00D /** QueueSongViewHolder */ - const val ITEM_TYPE_QUEUE_SONG = 0xA00D + const val ITEM_TYPE_QUEUE_SONG = 0xA00E /** "Music playback" Notification code */ const val NOTIFICATION_CODE = 0xA0A0 diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt index 4642f06eb..bd307a00c 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.oxycblt.auxio.R +import org.oxycblt.auxio.detail.recycler.DiscHeader import org.oxycblt.auxio.detail.recycler.SortHeader import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Artist @@ -137,7 +138,7 @@ class DetailViewModel : ViewModel() { logD("Refreshing album data") val data = mutableListOf(album) data.add(SortHeader(id = -2, R.string.lbl_songs)) - data.addAll(albumSort.album(album)) + data.add(DiscHeader(id = -3, 1)) _albumData.value = data } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt index 17025ba53..27e615aec 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt @@ -25,6 +25,7 @@ import org.oxycblt.auxio.R import org.oxycblt.auxio.coil.bindAlbumCover import org.oxycblt.auxio.databinding.ItemAlbumSongBinding import org.oxycblt.auxio.databinding.ItemDetailBinding +import org.oxycblt.auxio.databinding.ItemDiscHeaderBinding import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.ui.BindingViewHolder @@ -50,6 +51,7 @@ class AlbumDetailAdapter(listener: Listener) : super.getCreatorFromItem(item) ?: when (item) { is Album -> AlbumDetailViewHolder.CREATOR + is DiscHeader -> DiscHeaderViewHolder.CREATOR is Song -> AlbumSongViewHolder.CREATOR else -> null } @@ -58,6 +60,7 @@ class AlbumDetailAdapter(listener: Listener) : super.getCreatorFromViewType(viewType) ?: when (viewType) { AlbumDetailViewHolder.CREATOR.viewType -> AlbumDetailViewHolder.CREATOR + DiscHeaderViewHolder.CREATOR.viewType -> DiscHeaderViewHolder.CREATOR AlbumSongViewHolder.CREATOR.viewType -> AlbumSongViewHolder.CREATOR else -> null } @@ -67,6 +70,7 @@ class AlbumDetailAdapter(listener: Listener) : when (item) { is Album -> (viewHolder as AlbumDetailViewHolder).bind(item, listener) + is DiscHeader -> (viewHolder as DiscHeaderViewHolder).bind(item, Unit) is Song -> (viewHolder as AlbumSongViewHolder).bind(item, listener) } } @@ -100,8 +104,8 @@ class AlbumDetailAdapter(listener: Listener) : return when { oldItem is Album && newItem is Album -> AlbumDetailViewHolder.DIFFER.areItemsTheSame(oldItem, newItem) - oldItem is SortHeader && newItem is SortHeader -> - SortHeaderViewHolder.DIFFER.areItemsTheSame(oldItem, newItem) + oldItem is DiscHeader && newItem is DiscHeader -> + DiscHeaderViewHolder.DIFFER.areItemsTheSame(oldItem, newItem) oldItem is Song && newItem is Song -> AlbumSongViewHolder.DIFFER.areItemsTheSame(oldItem, newItem) else -> DetailAdapter.DIFFER.areItemsTheSame(oldItem, newItem) @@ -162,6 +166,32 @@ private class AlbumDetailViewHolder private constructor(private val binding: Ite } } +data class DiscHeader(override val id: Long, val disc: Int) : Item() + +class DiscHeaderViewHolder(private val binding: ItemDiscHeaderBinding) : + BindingViewHolder(binding.root) { + override fun bind(item: DiscHeader, listener: Unit) { + binding.discNo.textSafe = "Disc 1" + } + + companion object { + val CREATOR = + object : Creator { + override val viewType: Int + get() = IntegerTable.ITEM_TYPE_DISC_HEADER + + override fun create(context: Context) = + DiscHeaderViewHolder(ItemDiscHeaderBinding.inflate(context.inflater)) + } + + val DIFFER = + object : SimpleItemCallback() { + override fun areItemsTheSame(oldItem: DiscHeader, newItem: DiscHeader) = + oldItem.disc == newItem.disc + } + } +} + private class AlbumSongViewHolder private constructor(private val binding: ItemAlbumSongBinding) : BindingViewHolder(binding.root), Highlightable { override fun bind(item: Song, listener: MenuItemListener) { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/MediaSessionComponent.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/MediaSessionComponent.kt index f13405ac7..c4e9f7563 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/MediaSessionComponent.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/MediaSessionComponent.kt @@ -224,7 +224,7 @@ class MediaSessionComponent(private val context: Context, private val player: Pl // Position updates arrive faster when you upload a state that is different, as it // forces the system to re-poll the position. // FIXME: For some reason however, positions just DON'T UPDATE AT ALL when you - // change from FROM THE APP ONLY WHEN THE PLAYER IS PAUSED. AAAAAAAAAAAAAAAAAAAAAAAAAA + // change from FROM THE APP ONLY WHEN THE PLAYER IS PAUSED. val state = PlaybackStateCompat.Builder() .setActions(ACTIONS) diff --git a/app/src/main/res/layout/item_disc_header.xml b/app/src/main/res/layout/item_disc_header.xml new file mode 100644 index 000000000..77f7d3889 --- /dev/null +++ b/app/src/main/res/layout/item_disc_header.xml @@ -0,0 +1,31 @@ + + + + + + + +