From 7cc1636e5aae66a9ec32e06b389ddb286890264e Mon Sep 17 00:00:00 2001 From: tomaThomas Date: Fri, 13 Dec 2024 23:48:18 +0100 Subject: [PATCH] Add sort for artist albums --- .../artists/AbsArtistDetailsFragment.kt | 62 +++++++++++++++++-- .../name/monkey/retromusic/model/Artist.kt | 34 ++++++++++ .../monkey/retromusic/util/PreferenceUtil.kt | 7 ++- .../res/layout/fragment_artist_content.xml | 18 +++++- .../res/menu/menu_artist_album_sort_order.xml | 17 +++++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 132 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/menu/menu_artist_album_sort_order.xml diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt index a2ef904b6..b8cc6174f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt @@ -66,6 +66,8 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm private val savedSongSortOrder: String get() = PreferenceUtil.artistDetailSongSortOrder + private val savedAlbumSortOrder: String + get() = PreferenceUtil.artistAlbumSortOrder override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -107,6 +109,7 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm } } setupSongSortButton() + setupAlbumSortButton() binding.appBarLayout?.statusBarForeground = MaterialShapeDrawable.createWithElevationOverlay(requireContext()) } @@ -161,12 +164,12 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm biography = null this.lang = lang detailsViewModel.getArtistInfo(name, lang, null).observe(viewLifecycleOwner) { result -> - when (result) { - is Result.Loading -> logD("Loading") - is Result.Error -> logE("Error") - is Result.Success -> artistInfo(result.data) - } + when (result) { + is Result.Loading -> logD("Loading") + is Result.Error -> logE("Error") + is Result.Success -> artistInfo(result.data) } + } } private fun artistInfo(lastFmArtist: LastFmArtist?) { @@ -305,6 +308,55 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm songAdapter.swapDataSet(artist.sortedSongs) } + private fun setupAlbumSortButton() { + binding.fragmentArtistContent.albumSortOrder.setOnClickListener { + PopupMenu(requireContext(), binding.fragmentArtistContent.albumSortOrder).apply { + inflate(R.menu.menu_artist_album_sort_order) + setUpAlbumSortOrderMenu(menu) + setOnMenuItemClickListener { item -> + val sortOrder = when (item.itemId) { + R.id.action_sort_order_title -> SortOrder.ArtistAlbumSortOrder.ALBUM_A_Z + R.id.action_sort_order_title_desc -> SortOrder.ArtistAlbumSortOrder.ALBUM_Z_A + R.id.action_sort_order_year -> SortOrder.ArtistAlbumSortOrder.ALBUM_YEAR_ASC + R.id.action_sort_order_year_desc -> SortOrder.ArtistAlbumSortOrder.ALBUM_YEAR + else -> { + throw IllegalArgumentException("invalid ${item.title}") + } + } + item.isChecked = true + setSaveAlbumSortOrder(sortOrder) + return@setOnMenuItemClickListener true + } + show() + } + } + } + + private fun setSaveAlbumSortOrder(sortOrder: String) { + PreferenceUtil.artistAlbumSortOrder = sortOrder + albumAdapter.swapDataSet(artist.sortedAlbums) + } + + private fun setUpAlbumSortOrderMenu(sortOrder: Menu) { + when (savedAlbumSortOrder) { + SortOrder.ArtistAlbumSortOrder.ALBUM_A_Z -> sortOrder.findItem(R.id.action_sort_order_title).isChecked = + true + + SortOrder.ArtistAlbumSortOrder.ALBUM_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked = + true + + SortOrder.ArtistAlbumSortOrder.ALBUM_YEAR_ASC -> sortOrder.findItem(R.id.action_sort_order_year).isChecked = + true + + SortOrder.ArtistAlbumSortOrder.ALBUM_YEAR -> sortOrder.findItem(R.id.action_sort_order_year_desc).isChecked = + true + + else -> { + throw IllegalArgumentException("invalid $savedAlbumSortOrder") + } + } + } + private fun setUpSortOrderMenu(sortOrder: Menu) { when (savedSongSortOrder) { SortOrder.ArtistSongSortOrder.SONG_A_Z -> sortOrder.findItem(R.id.action_sort_order_title).isChecked = diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt index e82aed2d8..65e7141ee 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt +++ b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt @@ -39,8 +39,10 @@ data class Artist( return when { MusicUtil.isVariousArtists(name) -> VARIOUS_ARTISTS_DISPLAY_NAME + MusicUtil.isArtistNameUnknown(name) -> UNKNOWN_ARTIST_DISPLAY_NAME + else -> name!! } } @@ -68,28 +70,60 @@ data class Artist( SortOrder.ArtistSongSortOrder.SONG_A_Z -> { o1, o2 -> collator.compare(o1.title, o2.title) } + SortOrder.ArtistSongSortOrder.SONG_Z_A -> { o1, o2 -> collator.compare(o2.title, o1.title) } + SortOrder.ArtistSongSortOrder.SONG_ALBUM -> { o1, o2 -> collator.compare(o1.albumName, o2.albumName) } + SortOrder.ArtistSongSortOrder.SONG_YEAR -> { o1, o2 -> o2.year.compareTo( o1.year ) } + SortOrder.ArtistSongSortOrder.SONG_DURATION -> { o1, o2 -> o1.duration.compareTo( o2.duration ) } + else -> { throw IllegalArgumentException("invalid ${PreferenceUtil.artistDetailSongSortOrder}") } }) } + val sortedAlbums: List + get() { + val collator = Collator.getInstance() + return albums.sortedWith( + when (PreferenceUtil.artistAlbumSortOrder) { + SortOrder.ArtistAlbumSortOrder.ALBUM_A_Z -> { o1, o2 -> + collator.compare(o1.title, o2.title) + } + + SortOrder.ArtistAlbumSortOrder.ALBUM_Z_A -> { o1, o2 -> + collator.compare(o2.title, o1.title) + } + + SortOrder.ArtistAlbumSortOrder.ALBUM_YEAR_ASC -> { o1, o2 -> + o1.year.compareTo(o2.year) + } + + SortOrder.ArtistAlbumSortOrder.ALBUM_YEAR -> { o1, o2 -> + o2.year.compareTo(o1.year) + } + + else -> { + throw IllegalArgumentException("invalid ${PreferenceUtil.artistAlbumSortOrder}") + } + }) + } + fun safeGetFirstAlbum(): Album { return albums.firstOrNull() ?: Album.empty } 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 f01bb0346..bcb8fcfa5 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 @@ -195,11 +195,14 @@ object PreferenceUtil { AlbumSongSortOrder.SONG_TRACK_LIST ) - val artistAlbumSortOrder + var artistAlbumSortOrder get() = sharedPreferences.getStringOrDefault( ARTIST_ALBUM_SORT_ORDER, - ArtistAlbumSortOrder.ALBUM_A_Z + ArtistAlbumSortOrder.ALBUM_YEAR ) + set(value) = sharedPreferences.edit { + putString(ARTIST_ALBUM_SORT_ORDER, value) + } var playlistSortOrder get() = sharedPreferences.getStringOrDefault( diff --git a/app/src/main/res/layout/fragment_artist_content.xml b/app/src/main/res/layout/fragment_artist_content.xml index adfbb49f4..b4bc62357 100644 --- a/app/src/main/res/layout/fragment_artist_content.xml +++ b/app/src/main/res/layout/fragment_artist_content.xml @@ -52,10 +52,26 @@ android:textColor="?android:attr/textColorPrimary" android:textStyle="bold" app:layout_constrainedWidth="true" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@id/album_sort_order" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/playAction" /> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 25ecde071..1f7c35fad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -511,6 +511,8 @@ Song count Song count desc Year + Year ascending + Year descending Descending Sorry! Your device doesn\'t support speech input Search your library