Skip to content

Commit

Permalink
fix theme loading on android and simplified cover image
Browse files Browse the repository at this point in the history
  • Loading branch information
DatL4g committed Dec 13, 2023
1 parent be92268 commit 17ee60d
Show file tree
Hide file tree
Showing 9 changed files with 92 additions and 147 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ package dev.datlag.burningseries.shared.module
import android.content.Context
import android.os.Build
import coil3.ImageLoader
import coil3.PlatformContext
import coil3.annotation.ExperimentalCoilApi
import coil3.decode.GifDecoder
import coil3.decode.ImageDecoderDecoder
import coil3.decode.SvgDecoder
import coil3.disk.DiskCache
import coil3.fetch.NetworkFetcher
import coil3.memory.MemoryCache
import coil3.request.allowHardware
import coil3.request.crossfade
import dev.datlag.burningseries.database.DriverFactory
import dev.datlag.burningseries.shared.Sekret
Expand Down Expand Up @@ -97,6 +97,7 @@ actual object PlatformModule {
.maxSizeBytes(512L * 1024 * 1024) // 512MB
.build()
}
.allowHardware(false)
.crossfade(true)
.build()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,6 @@ package dev.datlag.burningseries.shared.ui.theme

import androidx.compose.material3.ColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.toPixelMap
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import dev.datlag.burningseries.shared.ui.theme.image.PainterImage

@Composable
actual fun SchemeThemeSystemProvider(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package dev.datlag.burningseries.shared.ui.custom

import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.NoPhotography
import androidx.compose.material3.LocalContentColor
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.layout.ContentScale
import coil3.ImageLoader
import coil3.PlatformContext
import coil3.compose.AsyncImage
import coil3.compose.AsyncImagePainter
import coil3.request.ImageRequest
import dev.datlag.burningseries.shared.LocalDI
import org.kodein.di.instance

@Composable
fun Cover(
key: String?,
data: Any?,
contentDescription: String?,
contentScale: ContentScale = ContentScale.FillWidth,
modifier: Modifier = Modifier,
errorPainter: Painter = rememberVectorPainter(Icons.Default.NoPhotography),
errorColorFilter: ColorFilter? = ColorFilter.tint(LocalContentColor.current),
errorScale: ContentScale = ContentScale.Inside,
onSuccess: (AsyncImagePainter.State.Success) -> Unit = {}
) {
val platformContext: PlatformContext by LocalDI.current.instance()
val imageLoader: ImageLoader by LocalDI.current.instance()
var scale by remember { mutableStateOf<ContentScale>(contentScale) }
var filter by remember { mutableStateOf<ColorFilter?>(null) }

AsyncImage(
model = ImageRequest.Builder(platformContext)
.data(data)
.placeholderMemoryCacheKey(key)
.build(),
error = errorPainter,
imageLoader = imageLoader,
contentDescription = contentDescription,
contentScale = scale,
modifier = modifier,
onLoading = {
scale = contentScale
filter = null
},
onError = {
scale = errorScale
filter = errorColorFilter
},
onSuccess = {
scale = contentScale
filter = null
onSuccess(it)
},
colorFilter = filter
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,18 @@ 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.graphics.ColorFilter
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import coil3.ImageLoader
import coil3.PlatformContext
import coil3.compose.AsyncImage
import coil3.request.ImageRequest
import dev.datlag.burningseries.model.BSUtil
import dev.datlag.burningseries.model.Home
import dev.datlag.burningseries.shared.LocalDI
import dev.datlag.burningseries.shared.common.bounceClick
import dev.datlag.burningseries.shared.common.focusScale
import dev.datlag.burningseries.shared.common.onClick
import dev.datlag.burningseries.shared.ui.custom.AutoSizeText
import dev.datlag.burningseries.shared.ui.custom.CountryImage
import org.kodein.di.instance
import dev.datlag.burningseries.shared.ui.custom.Cover

@OptIn(ExperimentalFoundationApi::class)
@Composable
Expand All @@ -42,21 +37,15 @@ fun LazyGridItemScope.EpisodeItem(episode: Home.Episode, onclick: () -> Unit) {
Surface(
shape = CardDefaults.elevatedShape
) {
val platformContext: PlatformContext by LocalDI.current.instance()
val imageLoader: ImageLoader by LocalDI.current.instance()

AsyncImage(
model = ImageRequest.Builder(platformContext)
.data(episode.coverHref?.let { BSUtil.getBurningSeriesLink(it) })
.placeholderMemoryCacheKey(episode.coverHref)
.build(),
imageLoader = imageLoader,
Cover(
key = episode.coverHref,
data = episode.coverHref?.let { BSUtil.getBurningSeriesLink(it) },
contentDescription = episode.bestTitle,
contentScale = ContentScale.FillWidth,
modifier = Modifier
.aspectRatio(1F, true)
.clip(CardDefaults.elevatedShape)
.background(MaterialTheme.colorScheme.tertiaryContainer)
.background(MaterialTheme.colorScheme.tertiaryContainer),
errorColorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onTertiaryContainer)
)
}
Column(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,16 @@ import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import coil3.ImageLoader
import coil3.PlatformContext
import coil3.compose.AsyncImage
import coil3.request.ImageRequest
import dev.datlag.burningseries.database.common.bestTitle
import dev.datlag.burningseries.model.BSUtil
import dev.datlag.burningseries.model.Home
import dev.datlag.burningseries.shared.LocalDI
import dev.datlag.burningseries.shared.common.bounceClick
import dev.datlag.burningseries.shared.common.focusScale
import dev.datlag.burningseries.shared.common.onClick
import org.kodein.di.instance
import dev.datlag.burningseries.shared.ui.custom.Cover
import dev.datlag.burningseries.database.Series as DBSeries

@OptIn(ExperimentalFoundationApi::class)
Expand Down Expand Up @@ -72,21 +67,15 @@ private fun SeriesItem(title: String, coverHref: String?, modifier: Modifier = M
Surface(
shape = CardDefaults.elevatedShape
) {
val platformContext: PlatformContext by LocalDI.current.instance()
val imageLoader: ImageLoader by LocalDI.current.instance()

AsyncImage(
model = ImageRequest.Builder(platformContext)
.data(coverHref?.let { BSUtil.getBurningSeriesLink(it) })
.placeholderMemoryCacheKey(coverHref)
.build(),
imageLoader = imageLoader,
Cover(
key = coverHref,
data = coverHref?.let { BSUtil.getBurningSeriesLink(it) },
contentDescription = title,
contentScale = ContentScale.FillWidth,
modifier = Modifier
.aspectRatio(1F, true)
.clip(CardDefaults.elevatedShape)
.background(MaterialTheme.colorScheme.tertiaryContainer)
.background(MaterialTheme.colorScheme.tertiaryContainer),
errorColorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onTertiaryContainer)
)
}
Column(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,18 @@ 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.layout.ContentScale
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import coil3.ImageLoader
import coil3.PlatformContext
import coil3.compose.AsyncImage
import coil3.request.ImageRequest
import com.arkivanov.decompose.extensions.compose.jetbrains.subscribeAsState
import dev.datlag.burningseries.database.Episode
import dev.datlag.burningseries.model.BSUtil
import dev.datlag.burningseries.model.Series
import dev.datlag.burningseries.model.state.SeriesState
import dev.datlag.burningseries.shared.LocalDI
import dev.datlag.burningseries.shared.SharedRes
import dev.datlag.burningseries.shared.common.diagonalShape
import dev.datlag.burningseries.shared.common.lifecycle.collectAsStateWithLifecycle
import dev.datlag.burningseries.shared.other.StateSaver
import dev.datlag.burningseries.shared.ui.custom.Cover
import dev.datlag.burningseries.shared.ui.custom.DefaultCollapsingToolbar
import dev.datlag.burningseries.shared.ui.custom.VerticalScrollbar
import dev.datlag.burningseries.shared.ui.custom.rememberScrollbarAdapter
Expand All @@ -48,7 +43,6 @@ import dev.datlag.burningseries.shared.ui.screen.initial.series.component.Season
import dev.datlag.burningseries.shared.ui.theme.SchemeTheme
import dev.datlag.burningseries.shared.ui.theme.shape.DiagonalShape
import dev.icerock.moko.resources.compose.stringResource
import org.kodein.di.instance
import kotlin.math.abs

@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
Expand Down Expand Up @@ -94,18 +88,12 @@ private fun CompactScreen(component: SeriesComponent) {

DefaultCollapsingToolbar(
expandedBody = { state ->
val platformContext: PlatformContext by LocalDI.current.instance()
val imageLoader: ImageLoader by LocalDI.current.instance()
val scope = rememberCoroutineScope()

AsyncImage(
model = ImageRequest.Builder(platformContext)
.data(coverHref?.let { BSUtil.getBurningSeriesLink(it) })
.placeholderMemoryCacheKey(coverHref)
.build(),
imageLoader = imageLoader,
Cover(
key = coverHref,
data = coverHref?.let { BSUtil.getBurningSeriesLink(it) },
contentDescription = title,
contentScale = ContentScale.FillWidth,
modifier = Modifier
.fillMaxWidth()
.defaultMinSize(minHeight = 320.dp)
Expand All @@ -115,7 +103,6 @@ private fun CompactScreen(component: SeriesComponent) {
SchemeTheme.update(commonHref, success.painter, scope)
}
)

Text(
text = title,
modifier = Modifier.road(Alignment.TopStart, Alignment.BottomStart).padding(16.dp).background(
Expand Down Expand Up @@ -318,8 +305,6 @@ private fun DefaultScreen(component: SeriesComponent) {
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
val platformContext: PlatformContext by LocalDI.current.instance()
val imageLoader: ImageLoader by LocalDI.current.instance()
val scope = rememberCoroutineScope()

Column(
Expand Down Expand Up @@ -384,14 +369,10 @@ private fun DefaultScreen(component: SeriesComponent) {
)
}

AsyncImage(
model = ImageRequest.Builder(platformContext)
.data(coverHref?.let { BSUtil.getBurningSeriesLink(it) })
.placeholderMemoryCacheKey(coverHref)
.build(),
imageLoader = imageLoader,
Cover(
key = coverHref,
data = coverHref?.let { BSUtil.getBurningSeriesLink(it) },
contentDescription = title,
contentScale = ContentScale.FillWidth,
modifier = Modifier
.width(200.dp)
.clip(MaterialTheme.shapes.medium)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,19 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.LayoutDirection
import androidx.palette.graphics.Palette
import com.kmpalette.DominantColorState
import com.kmpalette.loader.ImageBitmapLoader
import com.kmpalette.rememberDominantColorState
import com.kmpalette.rememberPainterDominantColorState
import com.materialkolor.AnimatedDynamicMaterialTheme
import dev.datlag.burningseries.shared.LocalDarkMode
import dev.datlag.burningseries.shared.common.launchIO
import dev.datlag.burningseries.shared.common.lifecycle.collectAsStateWithLifecycle
import dev.datlag.burningseries.shared.common.withIOContext
import dev.datlag.burningseries.shared.ui.theme.image.PainterImage
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.getAndUpdate
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.update
import kotlin.coroutines.CoroutineContext

data object SchemeTheme {

Expand Down Expand Up @@ -78,35 +68,6 @@ data object SchemeTheme {
}
}

internal data class PainterLoader(
private val density: Density,
private val layoutDirection: LayoutDirection
) : ImageBitmapLoader<Painter> {
override suspend fun load(input: Painter): ImageBitmap {
return PainterImage(input, density, layoutDirection).asBitmap()
}
}

@Composable
public fun rememberPainterDominantColorState(
defaultColor: Color = MaterialTheme.colorScheme.primary,
defaultOnColor: Color = MaterialTheme.colorScheme.onPrimary,
density: Density = LocalDensity.current,
layoutDirection: LayoutDirection = LocalLayoutDirection.current,
cacheSize: Int = 0,
coroutineContext: CoroutineContext = Dispatchers.Default,
isSwatchValid: (Palette.Swatch) -> Boolean = { true },
builder: Palette.Builder.() -> Unit = {},
): DominantColorState<Painter> = rememberDominantColorState(
loader = PainterLoader(density, layoutDirection),
defaultColor = defaultColor,
defaultOnColor = defaultOnColor,
cacheSize = cacheSize,
coroutineContext = coroutineContext,
isSwatchValid = isSwatchValid,
builder = builder
)

@Composable
fun SchemeTheme(key: Any?, content: @Composable () -> Unit) {
if (SchemeTheme._state == null) {
Expand All @@ -121,7 +82,11 @@ fun SchemeTheme(key: Any?, content: @Composable () -> Unit) {
seedColor = color ?: MaterialTheme.colorScheme.primary,
useDarkTheme = LocalDarkMode.current
) {
content()
androidx.compose.material.MaterialTheme(
colors = MaterialTheme.colorScheme.toLegacyColors(LocalDarkMode.current)
) {
content()
}
}
}

Expand Down
Loading

0 comments on commit 17ee60d

Please sign in to comment.