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:
parent
5df8edf912
commit
4781d250bf
23 changed files with 101 additions and 50 deletions
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue