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 b88cbdb25..a5ba4d1c1 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -241,8 +241,20 @@ class DetailViewModel(application: Application) : private fun refreshArtistData(artist: Artist) { logD("Refreshing artist data") val data = mutableListOf(artist) - data.add(Header(-2, R.string.lbl_albums)) - data.addAll(Sort(Sort.Mode.ByYear, false).albums(artist.albums)) + val albums = Sort(Sort.Mode.ByYear, false).albums(artist.albums) + val byType = albums.groupBy { it.type ?: Album.Type.Album } + byType.keys.sorted().forEachIndexed { index, type -> + val typeString = + when (type) { + Album.Type.Album -> R.string.lbl_albums + Album.Type.EP -> R.string.lbl_eps + Album.Type.Single -> R.string.lbl_singles + } + + data.add(Header(-2L - index, typeString)) + data.addAll(unlikelyToBeNull(byType[type])) + } + data.add(SortHeader(-3, R.string.lbl_songs)) data.addAll(artistSort.songs(artist.songs)) _artistData.value = data.toList() 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 336003fe4..2e396971a 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 @@ -123,13 +123,25 @@ private class AlbumDetailViewHolder private constructor(private val binding: Ite } binding.detailInfo.apply { + val date = + item.date?.let { context.getString(R.string.fmt_number, it.year) } + ?: context.getString(R.string.def_date) + + val songCount = context.getPluralSafe(R.plurals.fmt_song_count, item.songs.size) + + val duration = item.durationSecs.formatDuration(false) + text = - context.getString( - R.string.fmt_three, - item.date?.let { context.getString(R.string.fmt_number, it.year) } - ?: context.getString(R.string.def_date), - context.getPluralSafe(R.plurals.fmt_song_count, item.songs.size), - item.durationSecs.formatDuration(false)) + if (item.type != null) { + context.getString( + R.string.fmt_four, + context.getString(item.type.string), + date, + songCount, + duration) + } else { + context.getString(R.string.fmt_three, date, songCount, duration) + } } binding.detailPlayButton.setOnClickListener { listener.onPlayParent() } @@ -153,7 +165,8 @@ private class AlbumDetailViewHolder private constructor(private val binding: Ite oldItem.artist.rawName == newItem.artist.rawName && oldItem.date == newItem.date && oldItem.songs.size == newItem.songs.size && - oldItem.durationSecs == newItem.durationSecs + oldItem.durationSecs == newItem.durationSecs && + oldItem.type == newItem.type } } } diff --git a/app/src/main/java/org/oxycblt/auxio/music/Music.kt b/app/src/main/java/org/oxycblt/auxio/music/Music.kt index 0d812bbcd..efead07c8 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Music.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Music.kt @@ -258,7 +258,15 @@ data class Album( enum class Type { Album, EP, - Single + Single; + + val string: Int + get() = + when (this) { + Album -> R.string.lbl_album + EP -> R.string.lbl_ep + Single -> R.string.lbl_single + } } } diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt index e3866633c..94a6b6777 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt @@ -45,8 +45,8 @@ fun ContentResolver.useQuery( ): R? = queryCursor(uri, projection, selector, args)?.use(block) /** - * For some reason the album cover URI namespace does not have a member in [MediaStore], but it still - * works since at least API 21. + * For some reason the album cover URI namespace does not have a member in [MediaStore], but it + * still works since at least API 21. */ private val EXTERNAL_ALBUM_ART_URI = Uri.parse("content://media/external/audio/albumart") @@ -100,6 +100,7 @@ fun String.parseSortName() = else -> this } +/** Parse a release type from this string into an [Album.Type]. Handles MusicBrainz separators. */ fun String.parseReleaseType() = parseReleaseTypeImpl() ?: split("+", limit = 2)[0].trim().parseReleaseTypeImpl() diff --git a/app/src/main/java/org/oxycblt/auxio/ui/recycler/ViewHolders.kt b/app/src/main/java/org/oxycblt/auxio/ui/recycler/ViewHolders.kt index 45b348395..27ad4e414 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/recycler/ViewHolders.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/recycler/ViewHolders.kt @@ -82,7 +82,15 @@ private constructor( override fun bind(item: Album, listener: MenuItemListener) { binding.parentImage.bind(item) binding.parentName.textSafe = item.resolveName(binding.context) - binding.parentInfo.textSafe = item.artist.resolveName(binding.context) + + val artistName = item.artist.resolveName(binding.context) + binding.parentInfo.textSafe = + if (item.type != null) { + binding.context.getString( + R.string.fmt_two, binding.context.getString(item.type.string), artistName) + } else { + artistName + } binding.root.apply { setOnClickListener { listener.onItemClick(item) } setOnLongClickListener { view -> @@ -106,7 +114,8 @@ private constructor( object : SimpleItemCallback() { override fun areItemsTheSame(oldItem: Album, newItem: Album) = oldItem.rawName == newItem.rawName && - oldItem.artist.rawName == newItem.artist.rawName + oldItem.artist.rawName == newItem.artist.rawName && + oldItem.type == newItem.type } } } diff --git a/app/src/main/res/menu/menu_artist_sort.xml b/app/src/main/res/menu/menu_artist_sort.xml index a5e073b61..73b951bf5 100644 --- a/app/src/main/res/menu/menu_artist_sort.xml +++ b/app/src/main/res/menu/menu_artist_sort.xml @@ -6,7 +6,7 @@ android:title="@string/lbl_sort_name" /> + android:title="@string/lbl_album" /> diff --git a/app/src/main/res/menu/menu_genre_sort.xml b/app/src/main/res/menu/menu_genre_sort.xml index 07847918e..90b71638a 100644 --- a/app/src/main/res/menu/menu_genre_sort.xml +++ b/app/src/main/res/menu/menu_genre_sort.xml @@ -6,10 +6,10 @@ android:title="@string/lbl_sort_name" /> + android:title="@string/lbl_artist" /> + android:title="@string/lbl_album" /> diff --git a/app/src/main/res/menu/menu_home.xml b/app/src/main/res/menu/menu_home.xml index 273f558de..ec67076cc 100644 --- a/app/src/main/res/menu/menu_home.xml +++ b/app/src/main/res/menu/menu_home.xml @@ -20,10 +20,10 @@ android:title="@string/lbl_sort_name" /> + android:title="@string/lbl_artist" /> + android:title="@string/lbl_album" /> diff --git a/app/src/main/res/values-ar-rIQ/strings.xml b/app/src/main/res/values-ar-rIQ/strings.xml index 1e66668b8..8fafde271 100644 --- a/app/src/main/res/values-ar-rIQ/strings.xml +++ b/app/src/main/res/values-ar-rIQ/strings.xml @@ -22,8 +22,8 @@ فرز اسم - فنان - البوم + فنان + البوم سنة تصاعدي diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 81bc0ee75..882fd49d1 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -19,8 +19,8 @@ Vše Řadit Název - Umělec - Album + Umělec + Album Rok Trvání Počet skladeb diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 88fd91674..13e88d91d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -129,8 +129,8 @@ Ein einfacher, rationaler Musikplayer für Android. Musikwiedergabe anzeigen und kontrollieren - Künstler - Album + Künstler + Album Jahr Schwarzes Farbschema Ein rein schwarzes dunkles Farbschema verwenden diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 40c68affb..3c8726db3 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -17,8 +17,8 @@ Todo Organizar Nombre - Artista - Álbum + Artista + Álbum Año Ascendente En reproducción diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5b03f7864..670409715 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -103,8 +103,8 @@ Afficher et contrôler la lecture de la musique Chargement de votre bibliothèque musicale… Nom - Artiste - Album + Artiste + Album Année Durée Nombre de chansons diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index e4d207268..8fa809ca5 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -75,8 +75,8 @@ Tab Pustaka Memuat perpustakaan musik Anda… Nama - Artis - Album + Artis + Album Pemutar musik yang simpel dan rasional untuk android. Pemutaran Musik Pemuatan Musik diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1d393889f..5a93a9dc3 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -17,8 +17,8 @@ Tutto Ordine Nome - Artista - Disco + Artista + Disco Anno Ascendente Ora in riproduzione diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index b5a4e5f5e..aa9c33405 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -21,8 +21,8 @@ 정렬 제목 - 아티스트 - 앨범 + 아티스트 + 앨범 연도 길이 곡 수 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index d56e5e613..6b3749ded 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -126,7 +126,7 @@ %d Hz Bekijk eigenschappen Naam - Artiest + Artiest \@android:string/cancel Bibliotheek tabbladen Jaar @@ -195,7 +195,7 @@ Artiesten geladen: %d Genres geladen: %d Muziek aan het laden - Album + Album Looptijd Aantal Liedjes Disc diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 520b5405a..b5cf323aa 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -108,8 +108,8 @@ Contagem de Músicas Disco Nome - Artista - Álbum + Artista + Álbum Propriedades da música Nome do arquivo Formato diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 327f6791e..b4d8c0779 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -17,8 +17,8 @@ Все Сортировать Название - Исполнитель - Альбом + Исполнитель + Альбом Год По возрастанию Сейчас играет diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 5eb94b061..e43e66330 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -78,8 +78,8 @@ Müzik Yükleniyor Müzik kitaplığınız yükleniyor… İsim - Sanatçı - Albüm + Sanatçı + Albüm Yıl Süre Kapalı diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 984eceab1..bd4b877aa 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -17,8 +17,8 @@ 全部 排序方式 名称 - 艺术家 - 专辑 + 艺术家 + 专辑 年份 首字符(正序) 正在播放 diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index aca5a0088..1816caaec 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -6,6 +6,7 @@ %1$s • %2$s %1$s • %2$s • %3$s + %1$s • %2$s • %3$s • %4$s %d %1$s/%2$s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6e9f7c2c8..255c56fe0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,20 +14,27 @@ Monitoring music library Monitoring your music library for changes… - Genres - Artists - Albums Songs All Songs + Album + Albums + EP + EPs + Single + Singles + + Artist + Artists + + Genres + Search Filter All Sort Name - Artist - Album Year Duration Song count