music: improve field management
Cache some music fields and make other fields more coherent given recent changes.
This commit is contained in:
parent
75e80a7253
commit
bcc16fb88c
5 changed files with 23 additions and 25 deletions
|
@ -241,10 +241,6 @@ class DetailViewModel(application: Application) :
|
||||||
|
|
||||||
val byReleaseGroup =
|
val byReleaseGroup =
|
||||||
albums.groupBy {
|
albums.groupBy {
|
||||||
if (it.releaseType == null) {
|
|
||||||
return@groupBy R.string.lbl_albums
|
|
||||||
}
|
|
||||||
|
|
||||||
when (it.releaseType.refinement) {
|
when (it.releaseType.refinement) {
|
||||||
ReleaseType.Refinement.LIVE -> R.string.lbl_live_group
|
ReleaseType.Refinement.LIVE -> R.string.lbl_live_group
|
||||||
ReleaseType.Refinement.REMIX -> R.string.lbl_remix_group
|
ReleaseType.Refinement.REMIX -> R.string.lbl_remix_group
|
||||||
|
|
|
@ -115,8 +115,7 @@ private class AlbumDetailViewHolder private constructor(private val binding: Ite
|
||||||
|
|
||||||
override fun bind(item: Album, listener: AlbumDetailAdapter.Listener) {
|
override fun bind(item: Album, listener: AlbumDetailAdapter.Listener) {
|
||||||
binding.detailCover.bind(item)
|
binding.detailCover.bind(item)
|
||||||
binding.detailType.text =
|
binding.detailType.text = binding.context.getString(item.releaseType.stringRes)
|
||||||
binding.context.getString(item.releaseType?.stringRes ?: R.string.lbl_album)
|
|
||||||
|
|
||||||
binding.detailName.text = item.resolveName(binding.context)
|
binding.detailName.text = item.resolveName(binding.context)
|
||||||
|
|
||||||
|
|
|
@ -123,8 +123,7 @@ data class Song(
|
||||||
override fun resolveName(context: Context) = rawName
|
override fun resolveName(context: Context) = rawName
|
||||||
|
|
||||||
/** The duration of this song, in seconds (rounded down) */
|
/** The duration of this song, in seconds (rounded down) */
|
||||||
val durationSecs: Long
|
val durationSecs = durationMs / 1000
|
||||||
get() = durationMs / 1000
|
|
||||||
|
|
||||||
private var _album: Album? = null
|
private var _album: Album? = null
|
||||||
/** The album of this song. */
|
/** The album of this song. */
|
||||||
|
@ -202,11 +201,8 @@ data class Album(
|
||||||
override val rawSortName: String?,
|
override val rawSortName: String?,
|
||||||
/** The date this album was released. */
|
/** The date this album was released. */
|
||||||
val date: Date?,
|
val date: Date?,
|
||||||
/**
|
/** The type of release this album has. */
|
||||||
* The type of release this album represents. Null if release types were not applicable to this
|
val releaseType: ReleaseType,
|
||||||
* library.
|
|
||||||
*/
|
|
||||||
val releaseType: ReleaseType?,
|
|
||||||
/** The URI for the cover image corresponding to this album. */
|
/** The URI for the cover image corresponding to this album. */
|
||||||
val coverUri: Uri,
|
val coverUri: Uri,
|
||||||
/** The songs of this album. */
|
/** The songs of this album. */
|
||||||
|
@ -237,6 +233,9 @@ data class Album(
|
||||||
val artist: Artist
|
val artist: Artist
|
||||||
get() = unlikelyToBeNull(_artist)
|
get() = unlikelyToBeNull(_artist)
|
||||||
|
|
||||||
|
/** The earliest date a song in this album was added. */
|
||||||
|
val dateAdded = songs.minOf { it.dateAdded }
|
||||||
|
|
||||||
/** Internal field. Do not use. */
|
/** Internal field. Do not use. */
|
||||||
val _artistGroupingId: Long
|
val _artistGroupingId: Long
|
||||||
get() = _artistGroupingName.toMusicId()
|
get() = _artistGroupingName.toMusicId()
|
||||||
|
@ -437,6 +436,15 @@ class Date private constructor(private val tokens: List<Int>) : Comparable<Date>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the type of release a particular album is.
|
||||||
|
*
|
||||||
|
* This can be used to differentiate between album sub-types like Singles, EPs, Compilations, and
|
||||||
|
* others. Internally, it operates on a reduced version of the MusicBrainz release type
|
||||||
|
* specification. It can be extended if there is demand.
|
||||||
|
*
|
||||||
|
* @author OxygenCobalt
|
||||||
|
*/
|
||||||
sealed class ReleaseType {
|
sealed class ReleaseType {
|
||||||
abstract val refinement: Refinement?
|
abstract val refinement: Refinement?
|
||||||
abstract val stringRes: Int
|
abstract val stringRes: Int
|
||||||
|
@ -495,6 +503,11 @@ sealed class ReleaseType {
|
||||||
get() = R.string.lbl_mixtape
|
get() = R.string.lbl_mixtape
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Roughly analogous to the MusicBrainz "live" and "remix" secondary types. Unlike the main
|
||||||
|
* types, these only modify an existing, primary type. They are not implemented for secondary
|
||||||
|
* types, however they may be expanded to compilations in the future.
|
||||||
|
*/
|
||||||
enum class Refinement {
|
enum class Refinement {
|
||||||
LIVE,
|
LIVE,
|
||||||
REMIX
|
REMIX
|
||||||
|
|
|
@ -296,13 +296,6 @@ class Indexer {
|
||||||
val albums = mutableListOf<Album>()
|
val albums = mutableListOf<Album>()
|
||||||
val songsByAlbum = songs.groupBy { it._albumGroupingId }
|
val songsByAlbum = songs.groupBy { it._albumGroupingId }
|
||||||
|
|
||||||
// If album types aren't used by the music library (Represented by all songs having
|
|
||||||
// no album type), there is no point in displaying them.
|
|
||||||
val enableAlbumTypes = songs.any { it._albumReleaseType != null }
|
|
||||||
if (!enableAlbumTypes) {
|
|
||||||
logD("No distinct album types detected, ignoring them")
|
|
||||||
}
|
|
||||||
|
|
||||||
for (entry in songsByAlbum) {
|
for (entry in songsByAlbum) {
|
||||||
val albumSongs = entry.value
|
val albumSongs = entry.value
|
||||||
|
|
||||||
|
@ -317,10 +310,7 @@ class Indexer {
|
||||||
rawName = templateSong._albumName,
|
rawName = templateSong._albumName,
|
||||||
rawSortName = templateSong._albumSortName,
|
rawSortName = templateSong._albumSortName,
|
||||||
date = templateSong._date,
|
date = templateSong._date,
|
||||||
releaseType =
|
releaseType = templateSong._albumReleaseType ?: ReleaseType.Album(null),
|
||||||
if (enableAlbumTypes)
|
|
||||||
(templateSong._albumReleaseType ?: ReleaseType.Album(null))
|
|
||||||
else null,
|
|
||||||
coverUri = templateSong._albumCoverUri,
|
coverUri = templateSong._albumCoverUri,
|
||||||
songs = entry.value,
|
songs = entry.value,
|
||||||
_artistGroupingName = templateSong._artistGroupingName,
|
_artistGroupingName = templateSong._artistGroupingName,
|
||||||
|
|
|
@ -350,7 +350,7 @@ data class Sort(val mode: Mode, val isAscending: Boolean) {
|
||||||
}
|
}
|
||||||
|
|
||||||
private class BasicComparator<T : Music> private constructor() : Comparator<T> {
|
private class BasicComparator<T : Music> private constructor() : Comparator<T> {
|
||||||
// TODO: Use Collator for sorting?
|
// TODO: Perhaps I should leverage collator?
|
||||||
|
|
||||||
override fun compare(a: T, b: T): Int {
|
override fun compare(a: T, b: T): Int {
|
||||||
val aSortName = a.sortName
|
val aSortName = a.sortName
|
||||||
|
|
Loading…
Reference in a new issue