Add error state to MangaCover composable (#7022)

* Add error state to MangaCover

- Add error drawable when thumbnailUrl isn't able to be loaded
- Tweak usage of MangaCover

* Change `contentDescription` to be nullable

As the invoke function makes default nulls
This commit is contained in:
Andreas 2022-04-27 15:24:35 +02:00 committed by GitHub
parent 259c370eb9
commit adf02e53fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 24 deletions

View File

@ -11,29 +11,31 @@ import androidx.compose.ui.graphics.painter.ColorPainter
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage import coil.compose.AsyncImage
import eu.kanade.presentation.util.bitmapPainterResource
import eu.kanade.tachiyomi.R
enum class MangaCoverAspect(val ratio: Float) { enum class MangaCover(private val ratio: Float) {
SQUARE(1f / 1f), Square(1f / 1f),
COVER(2f / 3f) Book(2f / 3f);
}
@Composable @Composable
fun MangaCover( operator fun invoke(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
data: String?, data: String?,
aspect: MangaCoverAspect, contentDescription: String? = null,
contentDescription: String = "", shape: Shape? = null
shape: Shape = RoundedCornerShape(4.dp)
) { ) {
AsyncImage( AsyncImage(
model = data, model = data,
placeholder = ColorPainter(CoverPlaceholderColor), placeholder = ColorPainter(CoverPlaceholderColor),
error = bitmapPainterResource(id = R.drawable.cover_error),
contentDescription = contentDescription, contentDescription = contentDescription,
modifier = modifier modifier = modifier
.aspectRatio(aspect.ratio) .aspectRatio(ratio)
.clip(shape), .clip(shape ?: RoundedCornerShape(4.dp)),
contentScale = ContentScale.Crop contentScale = ContentScale.Crop,
) )
} }
}
private val CoverPlaceholderColor = Color(0x1F888888) private val CoverPlaceholderColor = Color(0x1F888888)

View File

@ -25,7 +25,6 @@ import androidx.paging.compose.items
import eu.kanade.domain.history.model.HistoryWithRelations import eu.kanade.domain.history.model.HistoryWithRelations
import eu.kanade.presentation.components.EmptyScreen import eu.kanade.presentation.components.EmptyScreen
import eu.kanade.presentation.components.MangaCover import eu.kanade.presentation.components.MangaCover
import eu.kanade.presentation.components.MangaCoverAspect
import eu.kanade.presentation.util.horizontalPadding import eu.kanade.presentation.util.horizontalPadding
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -168,12 +167,11 @@ fun HistoryItem(
.padding(horizontal = horizontalPadding, vertical = 8.dp), .padding(horizontal = horizontalPadding, vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
MangaCover( MangaCover.Book(
modifier = Modifier modifier = Modifier
.fillMaxHeight() .fillMaxHeight()
.clickable(onClick = onClickCover), .clickable(onClick = onClickCover),
data = history.thumbnailUrl, data = history.thumbnailUrl,
aspect = MangaCoverAspect.COVER
) )
Column( Column(
modifier = Modifier modifier = Modifier

View File

@ -1,8 +1,14 @@
package eu.kanade.presentation.util package eu.kanade.presentation.util
import android.content.res.Resources
import androidx.annotation.DrawableRes
import androidx.annotation.PluralsRes import androidx.annotation.PluralsRes
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toBitmap
/** /**
* Load a quantity string resource. * Load a quantity string resource.
@ -30,3 +36,19 @@ fun quantityStringResource(@PluralsRes id: Int, quantity: Int, vararg formatArgs
val context = LocalContext.current val context = LocalContext.current
return context.resources.getQuantityString(id, quantity, *formatArgs) return context.resources.getQuantityString(id, quantity, *formatArgs)
} }
/**
* Create a BitmapPainter from an drawable resource.
*
* > Only use this if [androidx.compose.ui.res.painterResource] doesn't work.
*
* @param id the resource identifier
* @return the bitmap associated with the resource
*/
@Composable
fun bitmapPainterResource(@DrawableRes id: Int): BitmapPainter {
val context = LocalContext.current
val drawable = ContextCompat.getDrawable(context, id)
?: throw Resources.NotFoundException()
return BitmapPainter(drawable.toBitmap().asImageBitmap())
}