From 35e186d8a94e7021bd0753f3e01be20fff967412 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Thu, 24 Sep 2020 15:29:32 -0600 Subject: [PATCH] Remove sorting modes Remove the sorting modes from the detail fragments. They are somewhat useless there and would be better suited for LibraryFragment. --- .../java/org/oxycblt/auxio/MainFragment.kt | 21 ++++++++++++++----- .../auxio/detail/AlbumDetailFragment.kt | 12 ++++++----- .../auxio/detail/ArtistDetailFragment.kt | 20 +----------------- .../oxycblt/auxio/detail/DetailViewModel.kt | 15 ------------- .../detail/adapters/DetailAlbumAdapter.kt | 9 ++++---- .../auxio/music/processing/MusicSorter.kt | 12 +++++++---- .../oxycblt/auxio/recycler/RecyclerUtils.kt | 21 +++++++++++++++++-- .../res/layout/fragment_artist_detail.xml | 21 ------------------- 8 files changed, 56 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index 8de267f57..d7ba48875 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -21,8 +21,8 @@ import org.oxycblt.auxio.theme.toColor class MainFragment : Fragment() { private val shownFragments = listOf(0, 1) - private val libraryFragment: LibraryFragment by lazy { LibraryFragment() } - private val songsFragment: SongsFragment by lazy { SongsFragment() } + private lateinit var libraryFragment: LibraryFragment + private lateinit var songsFragment: SongsFragment private val tabIcons = listOf( R.drawable.ic_library, @@ -81,10 +81,21 @@ class MainFragment : Fragment() { private fun fragmentAt(position: Int): Fragment { return when (position) { - 0 -> libraryFragment - 1 -> songsFragment + 0 -> { + if (!::libraryFragment.isInitialized) { + libraryFragment = LibraryFragment() + } - else -> libraryFragment + libraryFragment + } + + else -> { + if (!::songsFragment.isInitialized) { + songsFragment = SongsFragment() + } + + songsFragment + } } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt index 7e9f0cdc6..b2dd8847f 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -38,16 +38,18 @@ class AlbumDetailFragment : Fragment() { }!! } - binding.lifecycleOwner = this - binding.detailModel = detailModel - binding.album = detailModel.currentAlbum - - binding.songRecycler.adapter = DetailSongAdapter( + val songAdapter = DetailSongAdapter( detailModel.currentAlbum!!.songs, ClickListener { Log.d(this::class.simpleName, it.name) } ) + + binding.lifecycleOwner = this + binding.detailModel = detailModel + binding.album = detailModel.currentAlbum + + binding.songRecycler.adapter = songAdapter binding.songRecycler.applyDivider() binding.songRecycler.setHasFixedSize(true) diff --git a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt index f2c0c1706..478812fc1 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -14,7 +14,6 @@ import org.oxycblt.auxio.detail.adapters.DetailAlbumAdapter import org.oxycblt.auxio.music.MusicViewModel import org.oxycblt.auxio.music.models.Album import org.oxycblt.auxio.recycler.ClickListener -import org.oxycblt.auxio.recycler.SortMode import org.oxycblt.auxio.theme.applyDivider class ArtistDetailFragment : Fragment() { @@ -39,36 +38,19 @@ class ArtistDetailFragment : Fragment() { } val albumAdapter = DetailAlbumAdapter( + detailModel.currentArtist!!.albums, ClickListener { navToAlbum(it) } ) binding.lifecycleOwner = this - binding.detailModel = detailModel binding.artist = detailModel.currentArtist!! binding.albumRecycler.adapter = albumAdapter binding.albumRecycler.applyDivider() binding.albumRecycler.setHasFixedSize(true) - detailModel.artistSortMode.observe(viewLifecycleOwner) { mode -> - // Update the current sort icon - binding.sortButton.setImageResource(mode.iconRes) - - // Then update the sort mode of the album adapter. - albumAdapter.submitList( - detailModel.currentArtist!!.albums.sortedWith( - SortMode.albumSortComparators.getOrDefault( - mode, - - // If any invalid value is given, just default to the normal sort order. - compareByDescending { it.year } - ) - ) - ) - } - Log.d(this::class.simpleName, "Fragment created.") return binding.root 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 a0927f6ea..cbf21235e 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.oxycblt.auxio.music.models.Album import org.oxycblt.auxio.music.models.Artist -import org.oxycblt.auxio.recycler.SortMode class DetailViewModel : ViewModel() { var isAlreadyNavigating = false @@ -13,9 +12,6 @@ class DetailViewModel : ViewModel() { private val mNavToParentArtist = MutableLiveData() val navToParentArtist: LiveData get() = mNavToParentArtist - private val mArtistSortMode = MutableLiveData(SortMode.NUMERIC_DOWN) - val artistSortMode: LiveData get() = mArtistSortMode - var currentArtist: Artist? = null var currentAlbum: Album? = null @@ -26,15 +22,4 @@ class DetailViewModel : ViewModel() { fun doneWithNavToParent() { mNavToParentArtist.value = false } - - fun incrementArtistSortMode() { - mArtistSortMode.value = when (mArtistSortMode.value) { - SortMode.NUMERIC_DOWN -> SortMode.NUMERIC_UP - SortMode.NUMERIC_UP -> SortMode.ALPHA_DOWN - SortMode.ALPHA_DOWN -> SortMode.ALPHA_UP - SortMode.ALPHA_UP -> SortMode.NUMERIC_DOWN - - else -> SortMode.NUMERIC_DOWN - } - } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt index d00eb7310..7f56f09f8 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt @@ -2,16 +2,17 @@ package org.oxycblt.auxio.detail.adapters import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.oxycblt.auxio.databinding.ItemAlbumBinding import org.oxycblt.auxio.music.models.Album import org.oxycblt.auxio.recycler.ClickListener -import org.oxycblt.auxio.recycler.DiffCallback class DetailAlbumAdapter( + private val data: List, private val listener: ClickListener -) : ListAdapter(DiffCallback()) { +) : RecyclerView.Adapter() { + + override fun getItemCount(): Int = data.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { return ViewHolder( @@ -20,7 +21,7 @@ class DetailAlbumAdapter( } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(getItem(position)) + holder.bind(data[position]) } // Generic ViewHolder for an album diff --git a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt index a87f1c7b8..3ea7dc3e8 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt @@ -31,8 +31,10 @@ class MusicSorter( for (album in albums) { // Find all songs that match the current album ID to prevent any bugs w/comparing names. - // This cant be done with artists/genres sadly. - val albumSongs = songs.filter { it.albumId == album.id } + // Also sort them by their track number. + val albumSongs = songs.filter { + it.albumId == album.id + }.sortedBy { it.track } // Then add them to the album for (song in albumSongs) { @@ -72,8 +74,10 @@ class MusicSorter( val unknownAlbums = albums.toMutableList() for (artist in artists) { - // Find all albums that match the current artist name - val artistAlbums = albums.filter { it.artistName == artist.name } + // Find all albums that match the current artist name, and then sort them by year + val artistAlbums = albums.filter { + it.artistName == artist.name + }.sortedByDescending { it.year } // Then add them to the artist, along with refreshing the amount of albums for (album in artistAlbums) { diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt b/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt index 3def47cc5..206cc79c0 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt @@ -3,12 +3,13 @@ package org.oxycblt.auxio.recycler import androidx.recyclerview.widget.DiffUtil import org.oxycblt.auxio.R import org.oxycblt.auxio.music.models.Album +import org.oxycblt.auxio.music.models.Song // RecyclerView click listener class ClickListener(val onClick: (T) -> Unit) -// Diff callback -class DiffCallback : DiffUtil.ItemCallback() { +// Diff callback for albums +class AlbumDiffCallback : DiffUtil.ItemCallback() { override fun areContentsTheSame(oldItem: Album, newItem: Album): Boolean { return oldItem.id == newItem.id } @@ -18,6 +19,17 @@ class DiffCallback : DiffUtil.ItemCallback() { } } +// Diff callback for songs +class SongDiffCallback : DiffUtil.ItemCallback() { + override fun areContentsTheSame(oldItem: Song, newItem: Song): Boolean { + return oldItem.id == newItem.id + } + + override fun areItemsTheSame(oldItem: Song, newItem: Song): Boolean { + return oldItem == newItem + } +} + // Sorting modes enum class SortMode(val iconRes: Int) { // Icons for each mode are assigned to the enums themselves @@ -42,5 +54,10 @@ enum class SortMode(val iconRes: Int) { String.CASE_INSENSITIVE_ORDER ) { it.name }, ) + + val songSortComparators = mapOf>( + NUMERIC_DOWN to compareBy { it.track }, + NUMERIC_UP to compareByDescending { it.track } + ) } } diff --git a/app/src/main/res/layout/fragment_artist_detail.xml b/app/src/main/res/layout/fragment_artist_detail.xml index d692a1ed3..2a03a6a4e 100644 --- a/app/src/main/res/layout/fragment_artist_detail.xml +++ b/app/src/main/res/layout/fragment_artist_detail.xml @@ -8,10 +8,6 @@ - - - -