put the download indicator on the artist line, tight to its left

The glyph and the progress ring sat in the title row after the star, spaced 8dp;
they now lead the subtitle row, 4dp from the artist name, which is where the
artist line has room for them. `theDownloadedIndicatorSitsOnTheArtistLineToItsLeft`
measures the unmerged bounds and fails if the indicator moves back up to the
title line or to the artist's right.
This commit is contained in:
austinried
2026-10-04 00:30:01 +00:00
parent 9cdbc92975
commit b9e16d8377
2 changed files with 27 additions and 7 deletions
@@ -89,16 +89,21 @@ fun SongRow(
modifier = Modifier.weight(1f, fill = false), modifier = Modifier.weight(1f, fill = false),
) )
StarredBadge(song.starred != null) StarredBadge(song.starred != null)
DownloadBadge(download)
} }
}, },
supportingContent = { supportingContent = {
Text( Row(
text = song.artist.orEmpty().ifEmpty { "\u00A0" }, verticalAlignment = Alignment.CenterVertically,
color = if (isPlaying) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, horizontalArrangement = Arrangement.spacedBy(4.dp),
maxLines = 1, ) {
overflow = TextOverflow.Ellipsis, DownloadBadge(download)
) Text(
text = song.artist.orEmpty().ifEmpty { "\u00A0" },
color = if (isPlaying) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
}, },
colors = ListItemDefaults.colors(containerColor = Color.Transparent), colors = ListItemDefaults.colors(containerColor = Color.Transparent),
) )
@@ -5,15 +5,18 @@ import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.unit.dp
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import com.subtracks.data.model.DownloadStatus import com.subtracks.data.model.DownloadStatus
import com.subtracks.data.model.Song import com.subtracks.data.model.Song
import com.subtracks.data.model.SongDownload import com.subtracks.data.model.SongDownload
import com.subtracks.ui.theme.SubtracksTheme import com.subtracks.ui.theme.SubtracksTheme
import org.junit.Assert.assertTrue
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.annotation.GraphicsMode import org.robolectric.annotation.GraphicsMode
import kotlin.math.abs
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
@GraphicsMode(GraphicsMode.Mode.NATIVE) @GraphicsMode(GraphicsMode.Mode.NATIVE)
@@ -60,6 +63,18 @@ class SongRowDownloadTest {
composeRule.onNodeWithContentDescription("Downloaded").assertDoesNotExist() composeRule.onNodeWithContentDescription("Downloaded").assertDoesNotExist()
} }
@Test
fun theDownloadedIndicatorSitsOnTheArtistLineToItsLeft() {
render(download(DownloadStatus.Completed))
val badge = composeRule.onNodeWithContentDescription("Downloaded", useUnmergedTree = true).fetchSemanticsNode().boundsInRoot
val artist = composeRule.onNodeWithText("Artist", useUnmergedTree = true).fetchSemanticsNode().boundsInRoot
assertTrue("expected the indicator left of the artist name, badge=$badge artist=$artist", badge.right <= artist.left)
val offBy = abs(badge.center.y - artist.center.y)
assertTrue("expected the indicator on the artist's line, off by ${offBy}px", offBy <= with(composeRule.density) { 2.dp.toPx() })
}
private fun download(status: DownloadStatus) = private fun download(status: DownloadStatus) =
SongDownload(sourceId = 1, songId = "s1", status = status, engineId = 7, bytes = 40, total = 100) SongDownload(sourceId = 1, songId = "s1", status = status, engineId = 7, bytes = 40, total = 100)