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