Add error image when a image fails to load

This commit is contained in:
Syer10
2022-05-06 23:57:08 -04:00
parent 8d57483833
commit 3ec944591e
2 changed files with 47 additions and 18 deletions

View File

@@ -14,11 +14,12 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
@@ -29,7 +30,6 @@ import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.Card import androidx.compose.material.Card
import androidx.compose.material.Checkbox import androidx.compose.material.Checkbox
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@@ -46,6 +46,7 @@ import ca.gosyer.jui.data.models.Manga
import ca.gosyer.jui.i18n.MR import ca.gosyer.jui.i18n.MR
import ca.gosyer.jui.ui.base.dialog.getMaterialDialogProperties import ca.gosyer.jui.ui.base.dialog.getMaterialDialogProperties
import ca.gosyer.jui.uicore.components.VerticalScrollbar import ca.gosyer.jui.uicore.components.VerticalScrollbar
import ca.gosyer.jui.uicore.components.mangaAspectRatio
import ca.gosyer.jui.uicore.components.rememberScrollbarAdapter import ca.gosyer.jui.uicore.components.rememberScrollbarAdapter
import ca.gosyer.jui.uicore.image.KamelImage import ca.gosyer.jui.uicore.image.KamelImage
import ca.gosyer.jui.uicore.resources.stringResource import ca.gosyer.jui.uicore.resources.stringResource
@@ -58,15 +59,18 @@ import io.kamel.image.lazyPainterResource
@Composable @Composable
fun MangaItem(manga: Manga) { fun MangaItem(manga: Manga) {
BoxWithConstraints(Modifier.padding(8.dp)) { BoxWithConstraints(Modifier.padding(8.dp)) {
if (maxWidth > 600.dp) { if (maxWidth > 720.dp) {
Row { Row {
Cover(manga, Modifier.width(300.dp)) Cover(manga, Modifier.width(300.dp))
Spacer(Modifier.width(16.dp)) Spacer(Modifier.width(16.dp))
MangaInfo(manga) MangaInfo(manga)
} }
} else { } else {
Column { Column(horizontalAlignment = Alignment.CenterHorizontally) {
Cover(manga, Modifier.align(Alignment.CenterHorizontally)) Cover(
manga,
Modifier.heightIn(120.dp, 300.dp)
)
Spacer(Modifier.height(16.dp)) Spacer(Modifier.height(16.dp))
MangaInfo(manga) MangaInfo(manga)
} }
@@ -76,17 +80,16 @@ fun MangaItem(manga: Manga) {
@Composable @Composable
private fun Cover(manga: Manga, modifier: Modifier = Modifier) { private fun Cover(manga: Manga, modifier: Modifier = Modifier) {
Surface( KamelImage(
modifier = modifier then Modifier resource = lazyPainterResource(manga, filterQuality = FilterQuality.Medium),
.padding(4.dp), contentDescription = manga.title,
shape = RoundedCornerShape(4.dp) modifier = modifier,
) { errorModifier = modifier then Modifier
KamelImage( .aspectRatio(
lazyPainterResource(manga, filterQuality = FilterQuality.Medium), ratio = mangaAspectRatio,
manga.title, matchHeightConstraintsFirst = true
Modifier.fillMaxSize() ),
) )
}
} }
@Composable @Composable

View File

@@ -8,24 +8,36 @@ package ca.gosyer.jui.uicore.image
import androidx.compose.animation.core.FiniteAnimationSpec import androidx.compose.animation.core.FiniteAnimationSpec
import androidx.compose.animation.core.tween import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.material.Icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.BrokenImage
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.DefaultAlpha import androidx.compose.ui.graphics.DefaultAlpha
import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import ca.gosyer.jui.uicore.components.ErrorScreen import androidx.compose.ui.unit.dp
import ca.gosyer.jui.uicore.components.LoadingScreen import ca.gosyer.jui.uicore.components.LoadingScreen
import io.kamel.core.Resource import io.kamel.core.Resource
import org.lighthousegames.logging.logging
import io.kamel.image.KamelImage as BaseKamelImage import io.kamel.image.KamelImage as BaseKamelImage
private val log = logging()
@Composable @Composable
fun KamelImage( fun KamelImage(
resource: Resource<Painter>, resource: Resource<Painter>,
contentDescription: String?, contentDescription: String?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
errorModifier: Modifier = modifier,
alignment: Alignment = Alignment.Center, alignment: Alignment = Alignment.Center,
contentScale: ContentScale = ContentScale.Fit, contentScale: ContentScale = ContentScale.Fit,
alpha: Float = DefaultAlpha, alpha: Float = DefaultAlpha,
@@ -34,7 +46,21 @@ fun KamelImage(
LoadingScreen(progress = it, modifier = modifier then Modifier.fillMaxSize()) LoadingScreen(progress = it, modifier = modifier then Modifier.fillMaxSize())
}, },
onFailure: @Composable (Throwable) -> Unit = { onFailure: @Composable (Throwable) -> Unit = {
ErrorScreen(it.message, modifier = modifier then Modifier.fillMaxSize()) LaunchedEffect(it) {
log.warn(it) { "Error loading image" }
}
Box(
modifier = errorModifier then Modifier.fillMaxSize()
.background(Color(0x1F888888)),
contentAlignment = Alignment.Center
) {
Icon(
Icons.Rounded.BrokenImage,
contentDescription = null,
tint = Color(0x1F888888),
modifier = Modifier.size(24.dp)
)
}
}, },
crossfade: Boolean = true, crossfade: Boolean = true,
animationSpec: FiniteAnimationSpec<Float> = tween() animationSpec: FiniteAnimationSpec<Float> = tween()