From dfb7245db8f633fd799871093a1405152a0d4ba6 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 29 May 2026 21:36:41 -0400 Subject: [PATCH] refactor(android): route remaining covers (TrackCoverThumb, mini, now-playing) through ServerImage --- .../fabledsword/minstrel/player/ui/MiniPlayer.kt | 16 ++++++---------- .../minstrel/player/ui/NowPlayingScreen.kt | 16 ++++++---------- .../minstrel/shared/widgets/TrackCoverThumb.kt | 15 +++++---------- 3 files changed, 17 insertions(+), 30 deletions(-) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/ui/MiniPlayer.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/ui/MiniPlayer.kt index 23e70d28..60e63e42 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/ui/MiniPlayer.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/ui/MiniPlayer.kt @@ -29,13 +29,11 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import coil3.compose.AsyncImage import com.composables.icons.lucide.Lucide import com.composables.icons.lucide.Music import com.composables.icons.lucide.Pause @@ -47,6 +45,7 @@ import com.fabledsword.minstrel.nav.HERO_KEY_NOW_PLAYING_COVER import com.fabledsword.minstrel.nav.LocalAnimatedContentScope import com.fabledsword.minstrel.nav.LocalSharedTransitionScope import com.fabledsword.minstrel.shared.widgets.LikeButton +import com.fabledsword.minstrel.shared.widgets.ServerImage import com.fabledsword.minstrel.shared.widgets.trackactions.TrackActionsButton import com.fabledsword.minstrel.shared.widgets.trackactions.TrackActionsViewModel import com.fabledsword.minstrel.theme.FabledSwordFlatTokens @@ -88,19 +87,16 @@ private fun MiniCover(coverUrl: String, contentDescription: String) { // Cross-fade the artwork when the track changes so the cover // dissolves into the next instead of hard-swapping. Crossfade(targetState = coverUrl, label = "mini-cover") { url -> - if (url.isEmpty()) { + ServerImage( + url = url, + contentDescription = contentDescription, + modifier = Modifier.size(COVER_SIZE_DP.dp), + ) { Icon( imageVector = Lucide.Music, contentDescription = null, tint = MaterialTheme.colorScheme.onSurfaceVariant, ) - } else { - AsyncImage( - model = url, - contentDescription = contentDescription, - modifier = Modifier.size(COVER_SIZE_DP.dp), - contentScale = ContentScale.Crop, - ) } } } diff --git a/android/app/src/main/java/com/fabledsword/minstrel/player/ui/NowPlayingScreen.kt b/android/app/src/main/java/com/fabledsword/minstrel/player/ui/NowPlayingScreen.kt index af6bef5c..42cbfa7c 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/player/ui/NowPlayingScreen.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/player/ui/NowPlayingScreen.kt @@ -42,14 +42,12 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavHostController -import coil3.compose.AsyncImage import com.composables.icons.lucide.ChevronDown import com.composables.icons.lucide.ListMusic import com.composables.icons.lucide.Lucide @@ -72,6 +70,7 @@ import com.fabledsword.minstrel.nav.Queue import com.fabledsword.minstrel.shared.formatDuration import com.fabledsword.minstrel.shared.millisToSeconds import com.fabledsword.minstrel.shared.widgets.LikeButton +import com.fabledsword.minstrel.shared.widgets.ServerImage import com.fabledsword.minstrel.shared.widgets.trackactions.TrackActionsButton import com.fabledsword.minstrel.shared.widgets.trackactions.TrackActionsViewModel import com.fabledsword.minstrel.theme.FabledSwordFlatTokens @@ -348,20 +347,17 @@ private fun NowPlayingCover(coverUrl: String, contentDescription: String) { .background(MaterialTheme.colorScheme.surfaceVariant), contentAlignment = Alignment.Center, ) { - if (coverUrl.isEmpty()) { + ServerImage( + url = coverUrl, + contentDescription = contentDescription, + modifier = Modifier.fillMaxSize(), + ) { Icon( imageVector = Lucide.Music, contentDescription = null, tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(96.dp), ) - } else { - AsyncImage( - model = coverUrl, - contentDescription = contentDescription, - modifier = Modifier.fillMaxSize(), - contentScale = ContentScale.Crop, - ) } } } diff --git a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/TrackCoverThumb.kt b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/TrackCoverThumb.kt index 4751f738..14fbfb67 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/TrackCoverThumb.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/TrackCoverThumb.kt @@ -11,10 +11,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import coil3.compose.AsyncImage import com.composables.icons.lucide.Lucide import com.composables.icons.lucide.Music @@ -45,20 +43,17 @@ fun TrackCoverThumb( .background(MaterialTheme.colorScheme.surfaceVariant), contentAlignment = Alignment.Center, ) { - if (coverUrl.isEmpty()) { + ServerImage( + url = coverUrl, + contentDescription = contentDescription, + modifier = Modifier.fillMaxSize(), + ) { Icon( imageVector = Lucide.Music, contentDescription = null, tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(size / 2), ) - } else { - AsyncImage( - model = coverUrl, - contentDescription = contentDescription, - modifier = Modifier.fillMaxSize(), - contentScale = ContentScale.Crop, - ) } } }