diff --git a/CHANGELOG.md b/CHANGELOG.md index 5173006d5..b4cac8eb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ - Added ability to rewind/skip tracks by swiping back/forward - Added support for demo release type +#### What's Changed +- Albums linked to an artist only as a collaborator are no longer included +in an artist's album count + ## 3.2.1 #### What's Improved diff --git a/app/src/main/java/org/oxycblt/auxio/detail/header/ArtistDetailHeaderAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/header/ArtistDetailHeaderAdapter.kt index cb2343219..e85c892e7 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/header/ArtistDetailHeaderAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/header/ArtistDetailHeaderAdapter.kt @@ -71,7 +71,11 @@ private constructor(private val binding: ItemDetailHeaderBinding) : binding.detailInfo.text = binding.context.getString( R.string.fmt_two, - binding.context.getPlural(R.plurals.fmt_album_count, artist.albums.size), + if (artist.explicitAlbums.isNotEmpty()) { + binding.context.getPlural(R.plurals.fmt_album_count, artist.explicitAlbums.size) + } else { + binding.context.getString(R.string.def_album_count) + }, if (artist.songs.isNotEmpty()) { binding.context.getPlural(R.plurals.fmt_song_count, artist.songs.size) } else { diff --git a/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt b/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt index a7eef2392..a7fadce1f 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt @@ -178,7 +178,11 @@ class ArtistMenuDialogFragment : MenuDialogFragment() { binding.menuInfo.text = getString( R.string.fmt_two, - context.getPlural(R.plurals.fmt_album_count, menu.artist.albums.size), + if (menu.artist.explicitAlbums.isNotEmpty()) { + context.getPlural(R.plurals.fmt_album_count, menu.artist.explicitAlbums.size) + } else { + context.getString(R.string.def_album_count) + }, if (menu.artist.songs.isNotEmpty()) { context.getPlural(R.plurals.fmt_song_count, menu.artist.songs.size) } else { diff --git a/app/src/main/java/org/oxycblt/auxio/list/recycler/ViewHolders.kt b/app/src/main/java/org/oxycblt/auxio/list/recycler/ViewHolders.kt index c829248e5..36565b63f 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/recycler/ViewHolders.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/recycler/ViewHolders.kt @@ -164,7 +164,11 @@ class ArtistViewHolder private constructor(private val binding: ItemParentBindin binding.parentInfo.text = binding.context.getString( R.string.fmt_two, - binding.context.getPlural(R.plurals.fmt_album_count, artist.albums.size), + if (artist.explicitAlbums.isNotEmpty()) { + binding.context.getPlural(R.plurals.fmt_album_count, artist.explicitAlbums.size) + } else { + binding.context.getString(R.string.def_album_count) + }, if (artist.songs.isNotEmpty()) { binding.context.getPlural(R.plurals.fmt_song_count, artist.songs.size) } else { @@ -199,7 +203,7 @@ class ArtistViewHolder private constructor(private val binding: ItemParentBindin object : SimpleDiffCallback() { override fun areContentsTheSame(oldItem: Artist, newItem: Artist) = oldItem.name == newItem.name && - oldItem.albums.size == newItem.albums.size && + oldItem.explicitAlbums.size == newItem.explicitAlbums.size && oldItem.songs.size == newItem.songs.size } } diff --git a/app/src/main/java/org/oxycblt/auxio/music/device/DeviceMusicImpl.kt b/app/src/main/java/org/oxycblt/auxio/music/device/DeviceMusicImpl.kt index 91a4e1702..bc5418677 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/device/DeviceMusicImpl.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/device/DeviceMusicImpl.kt @@ -432,7 +432,7 @@ class ArtistImpl( ?: Name.Unknown(R.string.def_artist) override val songs: Set - override val albums: Set + override val albums: Set = emptySet() override val explicitAlbums: Set override val implicitAlbums: Set override val durationMs: Long? @@ -463,7 +463,7 @@ class ArtistImpl( } songs = distinctSongs - albums = albumMap.keys + val albums = albumMap.keys explicitAlbums = albums.filterTo(mutableSetOf()) { albumMap[it] == true } implicitAlbums = albums.filterNotTo(mutableSetOf()) { albumMap[it] == true } durationMs = songs.sumOf { it.durationMs }.positiveOrNull() @@ -506,7 +506,16 @@ class ArtistImpl( * @return This instance upcasted to [Artist]. */ fun finalize(): Artist { - check(songs.isNotEmpty() || albums.isNotEmpty()) { "Malformed artist $name: Empty" } + // There are valid artist configurations: + // 1. No songs, no implicit albums, some explicit albums + // 2. Some songs, no implicit albums, some explicit albums + // 3. Some songs, some implicit albums, no implicit albums + // 4. Some songs, some implicit albums, some explicit albums + // I'm pretty sure the latter check could be reduced to just explicitAlbums.isNotEmpty, + // but I can't be 100% certain. + check(songs.isNotEmpty() || (implicitAlbums.size + explicitAlbums.size) > 0) { + "Malformed artist $name: Empty" + } genres = Sort(Sort.Mode.ByName, Sort.Direction.ASCENDING) .genres(songs.flatMapTo(mutableSetOf()) { it.genres }) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5f8eed478..c7866d184 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -357,6 +357,7 @@ No disc No track No songs + No albums No music playing