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:
parent
259c370eb9
commit
adf02e53fd
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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())
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user