mirror of
https://github.com/cmclark00/RetroMusicPlayer.git
synced 2025-05-17 15:45:21 +01:00
Merge pull request #1700 from tomaThomas/sort-albums
Add sort for artist albums
This commit is contained in:
commit
c03fd8d6aa
6 changed files with 132 additions and 8 deletions
|
@ -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 =
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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"
|
||||
|
|
17
app/src/main/res/menu/menu_artist_album_sort_order.xml
Normal file
17
app/src/main/res/menu/menu_artist_album_sort_order.xml
Normal 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>
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue