Merge pull request #1700 from tomaThomas/sort-albums

Add sort for artist albums
This commit is contained in:
Daksh P. Jain 2025-01-06 16:28:10 +05:30 committed by GitHub
commit c03fd8d6aa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 132 additions and 8 deletions

View file

@ -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())
}
@ -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 =

View file

@ -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<Album>
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
}

View file

@ -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(

View file

@ -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" />
<com.google.android.material.button.MaterialButton
android:id="@+id/album_sort_order"
style="@style/Widget.Material3.Button.IconButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:background="?roundSelector"
app:icon="@drawable/ic_sort"
app:iconSize="24dp"
app:iconTint="?colorControlNormal"
app:layout_constraintBottom_toBottomOf="@+id/albumTitle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/albumTitle"
app:layout_constraintTop_toTopOf="@id/albumTitle" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/albumRecyclerView"
android:layout_width="match_parent"

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/action_sort_order_title"
android:title="@string/sort_order_a_z" />
<item
android:id="@+id/action_sort_order_title_desc"
android:title="@string/sort_order_z_a" />
<item
android:id="@+id/action_sort_order_year"
android:title="@string/sort_order_year_asc" />
<item
android:id="@+id/action_sort_order_year_desc"
android:title="@string/sort_order_year_desc" />
</group>
</menu>

View file

@ -511,6 +511,8 @@
<string name="sort_order_num_songs">Song count</string>
<string name="sort_order_num_songs_desc">Song count desc</string>
<string name="sort_order_year">Year</string>
<string name="sort_order_year_asc">Year ascending</string>
<string name="sort_order_year_desc">Year descending</string>
<string name="sort_order_z_a">Descending</string>
<string name="speech_not_supported">Sorry! Your device doesn\'t support speech input</string>
<string name="speech_prompt">Search your library</string>