From 85a5b60e29d14144204ebe8c4f67ff8f05bbb468 Mon Sep 17 00:00:00 2001 From: vfsfitvnm Date: Sun, 5 Jun 2022 15:29:36 +0200 Subject: [PATCH] Add thumbnail roundness selector in SettingsScreen --- .../vimusic/enums/ThumbnailRoundness.kt | 28 +++++++++++++++++++ .../vimusic/ui/screens/AlbumScreen.kt | 7 ++++- .../vimusic/ui/screens/SearchResultScreen.kt | 7 +++-- .../vimusic/ui/screens/SettingsScreen.kt | 16 +++++------ .../vfsfitvnm/vimusic/ui/views/PlayerView.kt | 7 ++++- .../vimusic/ui/views/PlaylistPreviewItem.kt | 2 +- .../it/vfsfitvnm/vimusic/ui/views/SongItem.kt | 8 ++++-- .../it/vfsfitvnm/vimusic/utils/Preferences.kt | 2 ++ 8 files changed, 61 insertions(+), 16 deletions(-) create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/ThumbnailRoundness.kt diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/ThumbnailRoundness.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/ThumbnailRoundness.kt new file mode 100644 index 0000000..787841a --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/ThumbnailRoundness.kt @@ -0,0 +1,28 @@ +package it.vfsfitvnm.vimusic.enums + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.unit.dp +import it.vfsfitvnm.vimusic.utils.LocalPreferences + +enum class ThumbnailRoundness { + None, + Light, + Medium, + Heavy; + + companion object { + val shape: Shape + @Composable + @ReadOnlyComposable + get() = when (LocalPreferences.current.thumbnailRoundness) { + None -> RectangleShape + Light -> RoundedCornerShape(2.dp) + Medium -> RoundedCornerShape(4.dp) + Heavy -> RoundedCornerShape(8.dp) + } + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt index 3c7324e..40d92cb 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt @@ -9,8 +9,10 @@ import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow @@ -31,6 +33,7 @@ import it.vfsfitvnm.vimusic.ui.styling.LocalTypography import it.vfsfitvnm.vimusic.ui.views.SongItem import it.vfsfitvnm.vimusic.utils.* import it.vfsfitvnm.route.RouteHandler +import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness import it.vfsfitvnm.vimusic.ui.components.themed.* import it.vfsfitvnm.youtubemusic.Outcome import it.vfsfitvnm.youtubemusic.YouTube @@ -190,7 +193,9 @@ fun AlbumScreen( AsyncImage( model = album.thumbnail.size(thumbnailSizePx), contentDescription = null, + contentScale = ContentScale.FillBounds, modifier = Modifier + .clip(ThumbnailRoundness.shape) .size(thumbnailSizeDp) ) @@ -309,7 +314,7 @@ private fun Loading() { ) { Spacer( modifier = Modifier - .background(color = colorPalette.darkGray) + .background(color = colorPalette.darkGray, shape = ThumbnailRoundness.shape) .size(128.dp) ) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt index 53a022b..56f0d03 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow @@ -31,6 +32,7 @@ import com.valentinilk.shimmer.rememberShimmer import com.valentinilk.shimmer.shimmer import it.vfsfitvnm.route.RouteHandler import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness import it.vfsfitvnm.vimusic.ui.components.* import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder @@ -292,7 +294,7 @@ fun SmallSongItemShimmer( ) { Spacer( modifier = Modifier - .background(colorPalette.darkGray) + .background(color = colorPalette.darkGray, shape = ThumbnailRoundness.shape) .size(thumbnailSizeDp) ) @@ -365,7 +367,6 @@ fun SmallItem( interactionSource = remember { MutableInteractionSource() }, onClick = onClick ) - .padding(vertical = 4.dp, horizontal = 16.dp) ) is YouTube.Item.Video -> SmallVideoItem( @@ -436,7 +437,9 @@ fun SmallAlbumItem( AsyncImage( model = album.thumbnail.size(thumbnailSizePx), contentDescription = null, + contentScale = ContentScale.FillBounds, modifier = Modifier + .clip(ThumbnailRoundness.shape) .size(thumbnailSizeDp) ) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SettingsScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SettingsScreen.kt index eaf522c..4b67dc3 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SettingsScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SettingsScreen.kt @@ -15,7 +15,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import it.vfsfitvnm.route.RouteHandler import it.vfsfitvnm.vimusic.R -import it.vfsfitvnm.vimusic.enums.ColorPaletteMode import it.vfsfitvnm.vimusic.ui.components.TopAppBar import it.vfsfitvnm.vimusic.ui.components.themed.EnumValueSelectorDialog import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette @@ -115,13 +114,14 @@ fun SettingsScreen() { selectedValue = preferences.colorPaletteMode, onValueSelected = { preferences.colorPaletteMode = it - }, - valueText = { - when (it) { - ColorPaletteMode.Light -> "Light" - ColorPaletteMode.Dark -> "Dark" - ColorPaletteMode.System -> "System" - } + } + ) + + EnumValueSelectorEntry( + title = "Thumbnail roundness", + selectedValue = preferences.thumbnailRoundness, + onValueSelected = { + preferences.thumbnailRoundness = it } ) } diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt index 7f5839a..cf2b161 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.text.BasicText import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.drawWithCache import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.ColorFilter @@ -30,6 +31,7 @@ import androidx.media3.ui.TimeBar import coil.compose.AsyncImage import it.vfsfitvnm.vimusic.Database import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness import it.vfsfitvnm.vimusic.ui.components.* import it.vfsfitvnm.vimusic.ui.components.themed.QueuedMediaItemMenu import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette @@ -113,8 +115,9 @@ fun PlayerView( AsyncImage( model = "${player.mediaMetadata.artworkUri}-w$smallThumbnailSize-h$smallThumbnailSize", contentDescription = null, - contentScale = ContentScale.Crop, + contentScale = ContentScale.FillBounds, modifier = Modifier + .clip(ThumbnailRoundness.shape) .size(64.dp) ) @@ -231,9 +234,11 @@ fun PlayerView( AsyncImage( model = "$artworkUri-w$thumbnailSizePx-h$thumbnailSizePx", contentDescription = null, + contentScale = ContentScale.FillBounds, modifier = Modifier .padding(bottom = 32.dp) .padding(horizontal = 32.dp) + .clip(ThumbnailRoundness.shape) .size(thumbnailSizeDp) ) } diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlaylistPreviewItem.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlaylistPreviewItem.kt index e50d2f0..47b284d 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlaylistPreviewItem.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlaylistPreviewItem.kt @@ -70,7 +70,7 @@ fun PlaylistPreviewItem( AsyncImage( model = "${thumbnails.getOrNull(index)}-w$thumbnailSizePx-h$thumbnailSizePx", contentDescription = null, - contentScale = ContentScale.Crop, + contentScale = ContentScale.FillBounds, modifier = Modifier .align(alignment) .size(thumbnailSize) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt index 70a15ac..fb4b02f 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt @@ -10,10 +10,10 @@ import androidx.compose.foundation.text.BasicText import androidx.compose.material.ripple.rememberRipple import androidx.compose.runtime.Composable import androidx.compose.runtime.NonRestartableComposable -import androidx.compose.runtime.ReadOnlyComposable 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.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.layout.ContentScale @@ -24,9 +24,10 @@ import androidx.compose.ui.unit.dp import androidx.media3.common.MediaItem import coil.compose.AsyncImage import coil.request.ImageRequest -import it.vfsfitvnm.vimusic.ui.components.LocalMenuState import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness import it.vfsfitvnm.vimusic.models.SongWithInfo +import it.vfsfitvnm.vimusic.ui.components.LocalMenuState import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette import it.vfsfitvnm.vimusic.ui.styling.LocalTypography import it.vfsfitvnm.vimusic.utils.secondary @@ -114,8 +115,9 @@ fun SongItem( AsyncImage( model = thumbnailModel, contentDescription = null, - contentScale = ContentScale.Crop, + contentScale = ContentScale.FillBounds, modifier = Modifier + .clip(ThumbnailRoundness.shape) .fillMaxSize() ) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Preferences.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Preferences.kt index d37207d..8077fd3 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Preferences.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Preferences.kt @@ -12,6 +12,7 @@ import androidx.core.content.edit import androidx.media3.common.Player import it.vfsfitvnm.vimusic.enums.ColorPaletteMode import it.vfsfitvnm.vimusic.enums.SongCollection +import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness import it.vfsfitvnm.youtubemusic.YouTube @Stable @@ -20,6 +21,7 @@ class Preferences(holder: SharedPreferences) : SharedPreferences by holder { var searchFilter by preference("searchFilter", YouTube.Item.Song.Filter.value) var repeatMode by preference("repeatMode", Player.REPEAT_MODE_OFF) var homePageSongCollection by preference("homePageSongCollection", SongCollection.MostPlayed) + var thumbnailRoundness by preference("thumbnailRoundness", ThumbnailRoundness.Light) } val LocalPreferences = staticCompositionLocalOf { TODO() }