music: implement album types in UI

Implement album type displays in the album detail, artist detail, and
album item views.

Resolves #158.
This commit is contained in:
OxygenCobalt 2022-07-18 11:15:56 -06:00
parent 5df8edf912
commit 4781d250bf
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
23 changed files with 101 additions and 50 deletions

View file

@ -241,8 +241,20 @@ class DetailViewModel(application: Application) :
private fun refreshArtistData(artist: Artist) {
logD("Refreshing artist data")
val data = mutableListOf<Item>(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()

View file

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

View file

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

View file

@ -45,8 +45,8 @@ fun <R> 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()

View file

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

View file

@ -6,7 +6,7 @@
android:title="@string/lbl_sort_name" />
<item
android:id="@+id/option_sort_album"
android:title="@string/lbl_sort_album" />
android:title="@string/lbl_album" />
<item
android:id="@+id/option_sort_year"
android:title="@string/lbl_sort_year" />

View file

@ -6,10 +6,10 @@
android:title="@string/lbl_sort_name" />
<item
android:id="@+id/option_sort_artist"
android:title="@string/lbl_sort_artist" />
android:title="@string/lbl_artist" />
<item
android:id="@+id/option_sort_album"
android:title="@string/lbl_sort_album" />
android:title="@string/lbl_album" />
<item
android:id="@+id/option_sort_year"
android:title="@string/lbl_sort_year" />

View file

@ -20,10 +20,10 @@
android:title="@string/lbl_sort_name" />
<item
android:id="@+id/option_sort_artist"
android:title="@string/lbl_sort_artist" />
android:title="@string/lbl_artist" />
<item
android:id="@+id/option_sort_album"
android:title="@string/lbl_sort_album" />
android:title="@string/lbl_album" />
<item
android:id="@+id/option_sort_year"
android:title="@string/lbl_sort_year" />

View file

@ -22,8 +22,8 @@
<string name="lbl_sort">فرز</string>
<string name="lbl_sort_name">اسم</string>
<string name="lbl_sort_artist">فنان</string>
<string name="lbl_sort_album">البوم</string>
<string name="lbl_artist">فنان</string>
<string name="lbl_album">البوم</string>
<string name="lbl_sort_year">سنة</string>
<string name="lbl_sort_asc">تصاعدي</string>

View file

@ -19,8 +19,8 @@
<string name="lbl_filter_all">Vše</string>
<string name="lbl_sort">Řadit</string>
<string name="lbl_sort_name">Název</string>
<string name="lbl_sort_artist">Umělec</string>
<string name="lbl_sort_album">Album</string>
<string name="lbl_artist">Umělec</string>
<string name="lbl_album">Album</string>
<string name="lbl_sort_year">Rok</string>
<string name="lbl_sort_duration">Trvání</string>
<string name="lbl_sort_count">Počet skladeb</string>

View file

@ -129,8 +129,8 @@
</plurals>
<string name="info_app_desc">Ein einfacher, rationaler Musikplayer für Android.</string>
<string name="info_widget_desc">Musikwiedergabe anzeigen und kontrollieren</string>
<string name="lbl_sort_artist">Künstler</string>
<string name="lbl_sort_album">Album</string>
<string name="lbl_artist">Künstler</string>
<string name="lbl_album">Album</string>
<string name="lbl_sort_year">Jahr</string>
<string name="set_black_mode">Schwarzes Farbschema</string>
<string name="set_black_mode_desc">Ein rein schwarzes dunkles Farbschema verwenden</string>

View file

@ -17,8 +17,8 @@
<string name="lbl_filter_all">Todo</string>
<string name="lbl_sort">Organizar</string>
<string name="lbl_sort_name">Nombre</string>
<string name="lbl_sort_artist">Artista</string>
<string name="lbl_sort_album">Álbum</string>
<string name="lbl_artist">Artista</string>
<string name="lbl_album">Álbum</string>
<string name="lbl_sort_year">Año</string>
<string name="lbl_sort_asc">Ascendente</string>
<string name="lbl_playback">En reproducción</string>

View file

@ -103,8 +103,8 @@
<string name="info_widget_desc">Afficher et contrôler la lecture de la musique</string>
<string name="lbl_indexing_desc">Chargement de votre bibliothèque musicale…</string>
<string name="lbl_sort_name">Nom</string>
<string name="lbl_sort_artist">Artiste</string>
<string name="lbl_sort_album">Album</string>
<string name="lbl_artist">Artiste</string>
<string name="lbl_album">Album</string>
<string name="lbl_sort_year">Année</string>
<string name="lbl_sort_duration">Durée</string>
<string name="lbl_sort_count">Nombre de chansons</string>

View file

@ -75,8 +75,8 @@
<string name="set_lib_tabs">Tab Pustaka</string>
<string name="lbl_indexing_desc">Memuat perpustakaan musik Anda…</string>
<string name="lbl_sort_name">Nama</string>
<string name="lbl_sort_artist">Artis</string>
<string name="lbl_sort_album">Album</string>
<string name="lbl_artist">Artis</string>
<string name="lbl_album">Album</string>
<string name="info_app_desc">Pemutar musik yang simpel dan rasional untuk android.</string>
<string name="info_playback_channel_name">Pemutaran Musik</string>
<string name="info_indexer_channel_name">Pemuatan Musik</string>

View file

@ -17,8 +17,8 @@
<string name="lbl_filter_all">Tutto</string>
<string name="lbl_sort">Ordine</string>
<string name="lbl_sort_name">Nome</string>
<string name="lbl_sort_artist">Artista</string>
<string name="lbl_sort_album">Disco</string>
<string name="lbl_artist">Artista</string>
<string name="lbl_album">Disco</string>
<string name="lbl_sort_year">Anno</string>
<string name="lbl_sort_asc">Ascendente</string>
<string name="lbl_playback">Ora in riproduzione</string>

View file

@ -21,8 +21,8 @@
<string name="lbl_sort">정렬</string>
<string name="lbl_sort_name">제목</string>
<string name="lbl_sort_artist">아티스트</string>
<string name="lbl_sort_album">앨범</string>
<string name="lbl_artist">아티스트</string>
<string name="lbl_album">앨범</string>
<string name="lbl_sort_year">연도</string>
<string name="lbl_sort_duration">길이</string>
<string name="lbl_sort_count">곡 수</string>

View file

@ -126,7 +126,7 @@
<string name="fmt_sample_rate">%d Hz</string>
<string name="lbl_song_detail">Bekijk eigenschappen</string>
<string name="lbl_sort_name">Naam</string>
<string name="lbl_sort_artist">Artiest</string>
<string name="lbl_artist">Artiest</string>
<string name="lbl_cancel">\@android:string/cancel</string>
<string name="set_lib_tabs">Bibliotheek tabbladen</string>
<string name="lbl_sort_year">Jaar</string>
@ -195,7 +195,7 @@
<string name="fmt_lib_artist_count">Artiesten geladen: %d</string>
<string name="fmt_lib_genre_count">Genres geladen: %d</string>
<string name="info_indexer_channel_name">Muziek aan het laden</string>
<string name="lbl_sort_album">Album</string>
<string name="lbl_album">Album</string>
<string name="lbl_sort_duration">Looptijd</string>
<string name="lbl_sort_count">Aantal Liedjes</string>
<string name="lbl_sort_disc">Disc</string>

View file

@ -108,8 +108,8 @@
<string name="lbl_sort_count">Contagem de Músicas</string>
<string name="lbl_sort_disc">Disco</string>
<string name="lbl_sort_name">Nome</string>
<string name="lbl_sort_artist">Artista</string>
<string name="lbl_sort_album">Álbum</string>
<string name="lbl_artist">Artista</string>
<string name="lbl_album">Álbum</string>
<string name="lbl_props">Propriedades da música</string>
<string name="lbl_file_name">Nome do arquivo</string>
<string name="lbl_format">Formato</string>

View file

@ -17,8 +17,8 @@
<string name="lbl_filter_all">Все</string>
<string name="lbl_sort">Сортировать</string>
<string name="lbl_sort_name">Название</string>
<string name="lbl_sort_artist">Исполнитель</string>
<string name="lbl_sort_album">Альбом</string>
<string name="lbl_artist">Исполнитель</string>
<string name="lbl_album">Альбом</string>
<string name="lbl_sort_year">Год</string>
<string name="lbl_sort_asc">По возрастанию</string>
<string name="lbl_playback">Сейчас играет</string>

View file

@ -78,8 +78,8 @@
<string name="info_indexer_channel_name">Müzik Yükleniyor</string>
<string name="lbl_indexing_desc">Müzik kitaplığınız yükleniyor…</string>
<string name="lbl_sort_name">İsim</string>
<string name="lbl_sort_artist">Sanatçı</string>
<string name="lbl_sort_album">Albüm</string>
<string name="lbl_artist">Sanatçı</string>
<string name="lbl_album">Albüm</string>
<string name="lbl_sort_year">Yıl</string>
<string name="lbl_sort_duration">Süre</string>
<string name="lbl_off">Kapalı</string>

View file

@ -17,8 +17,8 @@
<string name="lbl_filter_all">全部</string>
<string name="lbl_sort">排序方式</string>
<string name="lbl_sort_name">名称</string>
<string name="lbl_sort_artist">艺术家</string>
<string name="lbl_sort_album">专辑</string>
<string name="lbl_artist">艺术家</string>
<string name="lbl_album">专辑</string>
<string name="lbl_sort_year">年份</string>
<string name="lbl_sort_asc">首字符(正序)</string>
<string name="lbl_playback">正在播放</string>

View file

@ -6,6 +6,7 @@
<!-- Format Namespace | Value formatting/plurals -->
<string name="fmt_two" translatable="false">%1$s • %2$s</string>
<string name="fmt_three" translatable="false">%1$s • %2$s • %3$s</string>
<string name="fmt_four" translatable="false">%1$s • %2$s • %3$s • %4$s</string>
<string name="fmt_number" translatable="false">%d</string>
<string name="fmt_path">%1$s/%2$s</string>

View file

@ -14,20 +14,27 @@
<string name="lbl_observing">Monitoring music library</string>
<string name="lbl_observing_desc">Monitoring your music library for changes…</string>
<string name="lbl_genres">Genres</string>
<string name="lbl_artists">Artists</string>
<string name="lbl_albums">Albums</string>
<string name="lbl_songs">Songs</string>
<string name="lbl_all_songs">All Songs</string>
<string name="lbl_album">Album</string>
<string name="lbl_albums">Albums</string>
<string name="lbl_ep">EP</string>
<string name="lbl_eps">EPs</string>
<string name="lbl_single">Single</string>
<string name="lbl_singles">Singles</string>
<string name="lbl_artist">Artist</string>
<string name="lbl_artists">Artists</string>
<string name="lbl_genres">Genres</string>
<string name="lbl_search">Search</string>
<string name="lbl_filter">Filter</string>
<string name="lbl_filter_all">All</string>
<string name="lbl_sort">Sort</string>
<string name="lbl_sort_name">Name</string>
<string name="lbl_sort_artist">Artist</string>
<string name="lbl_sort_album">Album</string>
<string name="lbl_sort_year">Year</string>
<string name="lbl_sort_duration">Duration</string>
<string name="lbl_sort_count">Song count</string>