diff --git a/app/src/main/kotlin/com/subtracks/ui/components/Components.kt b/app/src/main/kotlin/com/subtracks/ui/components/Components.kt index 7147d781..95d1f9c4 100644 --- a/app/src/main/kotlin/com/subtracks/ui/components/Components.kt +++ b/app/src/main/kotlin/com/subtracks/ui/components/Components.kt @@ -17,8 +17,11 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Star import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -301,6 +304,22 @@ fun FilteredEmptyState( } } +@Composable +fun StarredBadge( + starred: Boolean, + modifier: Modifier = Modifier, + size: Dp = 14.dp, +) { + if (starred) { + Icon( + imageVector = Icons.Rounded.Star, + contentDescription = "Starred", + tint = MaterialTheme.colorScheme.primary, + modifier = modifier.size(size), + ) + } +} + @Composable fun Modifier.statusBarScrim(): Modifier { val top = with(LocalDensity.current) { WindowInsets.statusBars.getTop(this).toDp() } diff --git a/app/src/main/kotlin/com/subtracks/ui/library/AlbumsContent.kt b/app/src/main/kotlin/com/subtracks/ui/library/AlbumsContent.kt index 2a4b2066..f5ec6aa1 100644 --- a/app/src/main/kotlin/com/subtracks/ui/library/AlbumsContent.kt +++ b/app/src/main/kotlin/com/subtracks/ui/library/AlbumsContent.kt @@ -2,18 +2,21 @@ package com.subtracks.ui.library import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.foundation.shape.RoundedCornerShape 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.platform.testTag @@ -30,6 +33,7 @@ import com.subtracks.ui.components.FilteredEmptyState import com.subtracks.ui.components.LoadingState import com.subtracks.ui.components.MenuTarget import com.subtracks.ui.components.ResetScrollOnChange +import com.subtracks.ui.components.StarredBadge import com.subtracks.ui.components.rememberViewportFill import com.subtracks.ui.theme.PrefetchArtworkSeeds @@ -84,19 +88,26 @@ fun AlbumsContent( if (album != null) { val art = coverArt(album.coverArt, true) PrefetchArtworkSeeds(art) - CoverArt( - ref = art, - name = album.name, - modifier = - Modifier - .fillMaxWidth() - .aspectRatio(1f) - .clip(RoundedCornerShape(2.dp)) - .combinedClickable( - onClick = { onAlbumClick(album) }, - onLongClick = { onLongClick(MenuTarget.Album(album, art)) }, - ).testTag(ALBUM_COVER_TAG), - ) + Box { + CoverArt( + ref = art, + name = album.name, + modifier = + Modifier + .fillMaxWidth() + .aspectRatio(1f) + .clip(RoundedCornerShape(2.dp)) + .combinedClickable( + onClick = { onAlbumClick(album) }, + onLongClick = { onLongClick(MenuTarget.Album(album, art)) }, + ).testTag(ALBUM_COVER_TAG), + ) + StarredBadge( + starred = album.starred != null, + size = 16.dp, + modifier = Modifier.align(Alignment.TopEnd).padding(6.dp), + ) + } } } item(span = { GridItemSpan(maxLineSpan) }) { diff --git a/app/src/main/kotlin/com/subtracks/ui/library/ArtistsContent.kt b/app/src/main/kotlin/com/subtracks/ui/library/ArtistsContent.kt index 48c37126..87022872 100644 --- a/app/src/main/kotlin/com/subtracks/ui/library/ArtistsContent.kt +++ b/app/src/main/kotlin/com/subtracks/ui/library/ArtistsContent.kt @@ -1,7 +1,9 @@ package com.subtracks.ui.library import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height @@ -13,6 +15,7 @@ import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.Text 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.graphics.Color @@ -30,6 +33,7 @@ import com.subtracks.ui.components.FilteredEmptyState import com.subtracks.ui.components.LoadingState import com.subtracks.ui.components.MenuTarget import com.subtracks.ui.components.ResetScrollOnChange +import com.subtracks.ui.components.StarredBadge import com.subtracks.ui.components.rememberViewportFill import com.subtracks.ui.theme.PrefetchArtworkSeeds @@ -75,11 +79,18 @@ fun ArtistsContent( PrefetchArtworkSeeds(coverArt(artist.coverArt, true)) ListItem( headlineContent = { - Text( - text = artist.name, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + Text( + text = artist.name, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.weight(1f, fill = false), + ) + StarredBadge(artist.starred != null) + } }, supportingContent = { Text( diff --git a/app/src/main/kotlin/com/subtracks/ui/library/SongsContent.kt b/app/src/main/kotlin/com/subtracks/ui/library/SongsContent.kt index 98492e55..57647767 100644 --- a/app/src/main/kotlin/com/subtracks/ui/library/SongsContent.kt +++ b/app/src/main/kotlin/com/subtracks/ui/library/SongsContent.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.unit.dp import com.subtracks.data.model.CoverArtRef import com.subtracks.data.model.Song import com.subtracks.ui.components.CoverArt +import com.subtracks.ui.components.StarredBadge @Composable fun SongRow( @@ -80,6 +81,7 @@ fun SongRow( overflow = TextOverflow.Ellipsis, modifier = Modifier.weight(1f, fill = false), ) + StarredBadge(song.starred != null) } }, supportingContent = { diff --git a/app/src/main/kotlin/com/subtracks/ui/playback/NowPlayingScreen.kt b/app/src/main/kotlin/com/subtracks/ui/playback/NowPlayingScreen.kt index 4e7829ed..5cf05b6e 100644 --- a/app/src/main/kotlin/com/subtracks/ui/playback/NowPlayingScreen.kt +++ b/app/src/main/kotlin/com/subtracks/ui/playback/NowPlayingScreen.kt @@ -288,7 +288,7 @@ fun NowPlayingScreen( } Box(Modifier.height(subtitleHeight), contentAlignment = Alignment.Center) { Text( - text = listOfNotNull(state.item?.artist, state.item?.album).joinToString(" • "), + text = state.item?.artist.orEmpty(), style = subtitleStyle, color = MaterialTheme.colorScheme.onSurfaceVariant, maxLines = 1,