From 3ca3953fe33e1485a98c7be1667e5a19678f802a Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Wed, 1 Jul 2026 15:35:15 +0530 Subject: [PATCH] Fix Android dominant color extraction --- .../BackdropPaletteImage.android.kt | 9 +++++ .../app/features/details/MetaDetailsScreen.kt | 35 +++++++++++++++---- .../components/BackdropPaletteImage.kt | 6 ++++ .../features/details/components/DetailHero.kt | 10 ++++-- .../BackdropPaletteImage.desktop.kt | 6 ++++ .../components/BackdropPaletteImage.ios.kt | 6 ++++ 6 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 composeApp/src/androidMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.android.kt create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.kt create mode 100644 composeApp/src/desktopMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.desktop.kt create mode 100644 composeApp/src/iosMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.ios.kt diff --git a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.android.kt b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.android.kt new file mode 100644 index 000000000..a6e3b2568 --- /dev/null +++ b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.android.kt @@ -0,0 +1,9 @@ +package com.nuvio.app.features.details.components + +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.asImageBitmap +import coil3.request.SuccessResult +import coil3.toBitmap + +internal actual fun loadedBackdropImageBitmap(result: SuccessResult): ImageBitmap? = + runCatching { result.image.toBitmap().asImageBitmap() }.getOrNull() diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt index b7a52cad4..e811ad8b1 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt @@ -52,6 +52,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.blur import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.ContentScale @@ -113,6 +114,7 @@ import com.nuvio.app.features.watchprogress.buildPlaybackVideoId import com.nuvio.app.features.watchprogress.ContinueWatchingPreferencesRepository import com.nuvio.app.features.watching.application.WatchingActions import com.nuvio.app.features.watching.application.WatchingState +import com.kmpalette.rememberDominantColorState import com.kmpalette.extensions.painter.rememberPainterDominantColorState import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -772,18 +774,38 @@ fun MetaDetailsScreen( var dominantBackdropPainter by remember(meta.id, backdropUrl) { mutableStateOf(null) } - val dominantColorState = rememberPainterDominantColorState( + var dominantBackdropImageBitmap by remember(meta.id, backdropUrl) { + mutableStateOf(null) + } + val dominantImageBitmapColorState = rememberDominantColorState( defaultColor = colorScheme.background, defaultOnColor = colorScheme.onBackground, ) - LaunchedEffect(dominantColorEnabled, dominantBackdropPainter) { + val dominantPainterColorState = rememberPainterDominantColorState( + defaultColor = colorScheme.background, + defaultOnColor = colorScheme.onBackground, + ) + LaunchedEffect(dominantColorEnabled, dominantBackdropImageBitmap, dominantBackdropPainter) { + val imageBitmap = dominantBackdropImageBitmap val painter = dominantBackdropPainter - if (dominantColorEnabled && painter != null) { - runCatching { dominantColorState.updateFrom(painter) } + if (dominantColorEnabled) { + when { + imageBitmap != null -> runCatching { + dominantImageBitmapColorState.updateFrom(imageBitmap) + } + painter != null -> runCatching { + dominantPainterColorState.updateFrom(painter) + } + } } } + val extractedDominantColor = if (dominantBackdropImageBitmap != null) { + dominantImageBitmapColorState.color + } else { + dominantPainterColorState.color + } val dominantBackdropTargetColor = if (dominantColorEnabled) { - dominantBackdropBlendColor(dominantColorState.color, colorScheme.background) + dominantBackdropBlendColor(extractedDominantColor, colorScheme.background) } else { colorScheme.background } @@ -841,8 +863,9 @@ fun MetaDetailsScreen( heroTrailerPlayWhenReady = heroTrailerPlayWhenReady, heroTrailerMuted = heroTrailerMuted, heroGradientColor = dominantBackdropColor.takeIf { dominantColorEnabled }, - onBackdropLoaded = { painter -> + onBackdropLoaded = { painter, imageBitmap -> dominantBackdropPainter = painter + dominantBackdropImageBitmap = imageBitmap }, onHeroTrailerMuteToggle = { HeroTrailerAudioState.toggleMuted() diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.kt new file mode 100644 index 000000000..1fac58b2e --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.kt @@ -0,0 +1,6 @@ +package com.nuvio.app.features.details.components + +import androidx.compose.ui.graphics.ImageBitmap +import coil3.request.SuccessResult + +internal expect fun loadedBackdropImageBitmap(result: SuccessResult): ImageBitmap? diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailHero.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailHero.kt index 031e33887..32d6dd332 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailHero.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailHero.kt @@ -39,6 +39,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.graphics.painter.Painter @@ -64,7 +65,7 @@ fun DetailHero( heroTrailerPlayWhenReady: Boolean = false, heroTrailerMuted: Boolean = true, heroGradientColor: Color? = null, - onBackdropLoaded: (Painter) -> Unit = {}, + onBackdropLoaded: (Painter, ImageBitmap?) -> Unit = { _, _ -> }, onHeroTrailerMuteToggle: () -> Unit = {}, onHeroTrailerReady: () -> Unit = {}, onHeroTrailerEnded: () -> Unit = {}, @@ -118,7 +119,12 @@ fun DetailHero( }, alignment = if (isTablet) Alignment.TopCenter else Alignment.Center, contentScale = ContentScale.Crop, - onSuccess = { state -> onBackdropLoaded(state.painter) }, + onSuccess = { state -> + onBackdropLoaded( + state.painter, + loadedBackdropImageBitmap(state.result), + ) + }, ) } else { Box( diff --git a/composeApp/src/desktopMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.desktop.kt b/composeApp/src/desktopMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.desktop.kt new file mode 100644 index 000000000..f5231d891 --- /dev/null +++ b/composeApp/src/desktopMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.desktop.kt @@ -0,0 +1,6 @@ +package com.nuvio.app.features.details.components + +import androidx.compose.ui.graphics.ImageBitmap +import coil3.request.SuccessResult + +internal actual fun loadedBackdropImageBitmap(result: SuccessResult): ImageBitmap? = null diff --git a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.ios.kt b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.ios.kt new file mode 100644 index 000000000..f5231d891 --- /dev/null +++ b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/details/components/BackdropPaletteImage.ios.kt @@ -0,0 +1,6 @@ +package com.nuvio.app.features.details.components + +import androidx.compose.ui.graphics.ImageBitmap +import coil3.request.SuccessResult + +internal actual fun loadedBackdropImageBitmap(result: SuccessResult): ImageBitmap? = null