From b8b5594d04ec24c04d6a1ece66546cdd4cffdaba Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Mon, 19 Oct 2026 04:57:33 +0000 Subject: [PATCH] ui: move artist actions back onto the meta row Keep the type and count on the same row as the star and more buttons, and move that row down to where it sat before the split. Give the Albums and Appears on headers the album and microphone icons alongside the disc-title styling. --- .../ui/library/ArtistDetailScreen.kt | 37 ++++++++++++------- .../ui/library/ArtistDetailScreenTest.kt | 1 - 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/app/src/main/kotlin/com/subtracks/ui/library/ArtistDetailScreen.kt b/app/src/main/kotlin/com/subtracks/ui/library/ArtistDetailScreen.kt index 547ea01c..8a28043a 100644 --- a/app/src/main/kotlin/com/subtracks/ui/library/ArtistDetailScreen.kt +++ b/app/src/main/kotlin/com/subtracks/ui/library/ArtistDetailScreen.kt @@ -33,6 +33,8 @@ import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.rounded.ArrowBack +import androidx.compose.material.icons.rounded.Album +import androidx.compose.material.icons.rounded.Mic import androidx.compose.material.icons.rounded.MoreHoriz import androidx.compose.material.icons.rounded.Shuffle import androidx.compose.material.icons.rounded.Star @@ -64,6 +66,7 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shadow import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.testTag @@ -256,8 +259,12 @@ fun ArtistDetailScreen( ) val albumCountText = pluralStringResource(R.plurals.resources_album_count, albumCount.toInt(), albumCount) val metaText = if (albumsLoaded) stringResource(R.string.artist_meta, artistType, albumCountText) else "" - val actionsInHeader = albums.albumCredits.isNotEmpty() || albums.appearances.isNotEmpty() - val actions: @Composable () -> Unit = { ArtistActions(artist, starred, onToggleStar, onMore) } + val metaTop = + TITLE_INSET + + with(density) { + MaterialTheme.typography.labelLarge.lineHeight + .toDp() + } var titleHeightPx by remember { mutableFloatStateOf(0f) } val titleHeight = if (titleHeightPx > 0f) with(density) { titleHeightPx.toDp() } else lineHeight val titleMaxLines = @@ -387,10 +394,10 @@ fun ArtistDetailScreen( } } Column( - modifier = Modifier.fillMaxWidth().padding(start = 16.dp, end = 8.dp, top = TITLE_INSET), + modifier = Modifier.fillMaxWidth().padding(start = 16.dp, end = 8.dp, top = metaTop), ) { Row( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().defaultMinSize(minHeight = 48.dp), verticalAlignment = Alignment.CenterVertically, ) { Text( @@ -399,14 +406,14 @@ fun ArtistDetailScreen( color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.weight(1f), ) - if (!actionsInHeader) actions() + ArtistActions(artist, starred, onToggleStar, onMore) } } } } if (albums.albumCredits.isNotEmpty()) { item(span = { GridItemSpan(maxLineSpan) }) { - ArtistSectionHeader(stringResource(R.string.artist_section_albums), trailing = actions) + ArtistSectionHeader(stringResource(R.string.artist_section_albums), Icons.Rounded.Album) } itemsIndexed(albums.albumCredits, key = { _, album -> album.id }) { index, album -> ArtistAlbumCard( @@ -424,10 +431,7 @@ fun ArtistDetailScreen( } if (albums.appearances.isNotEmpty()) { item(span = { GridItemSpan(maxLineSpan) }) { - ArtistSectionHeader( - stringResource(R.string.artist_section_appearances), - trailing = if (albums.albumCredits.isEmpty()) actions else null, - ) + ArtistSectionHeader(stringResource(R.string.artist_section_appearances), Icons.Rounded.Mic) } itemsIndexed(albums.appearances, key = { _, album -> album.id }) { index, album -> ArtistAlbumCard( @@ -488,21 +492,26 @@ fun ArtistDetailScreen( @Composable private fun ArtistSectionHeader( text: String, - trailing: (@Composable () -> Unit)? = null, + icon: ImageVector, ) { Row( - modifier = Modifier.fillMaxWidth().defaultMinSize(minHeight = 48.dp).padding(start = 16.dp, end = 8.dp), verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth().padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 4.dp), ) { + Icon( + imageVector = icon, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.size(18.dp), + ) + Spacer(Modifier.width(16.dp)) Text( text = text.uppercase(), style = MaterialTheme.typography.labelLarge, fontWeight = FontWeight.SemiBold, letterSpacing = 1.sp, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.weight(1f), ) - trailing?.invoke() } } diff --git a/app/src/test/kotlin/com/subtracks/ui/library/ArtistDetailScreenTest.kt b/app/src/test/kotlin/com/subtracks/ui/library/ArtistDetailScreenTest.kt index 2adc0743..6c73e01a 100644 --- a/app/src/test/kotlin/com/subtracks/ui/library/ArtistDetailScreenTest.kt +++ b/app/src/test/kotlin/com/subtracks/ui/library/ArtistDetailScreenTest.kt @@ -70,7 +70,6 @@ class ArtistDetailScreenTest { ) composeRule.onNodeWithText("Album artist ยท 1 album").assertExists() - composeRule.onNode(hasScrollAction()).performScrollToNode(hasText("ALBUMS")) composeRule.onNodeWithContentDescription("More options").assertExists() }