|
|
@@ -71,6 +71,7 @@ import coil.size.Size
|
|
|
import io.legado.app.R
|
|
|
import io.legado.app.constant.BookType
|
|
|
import io.legado.app.data.entities.SearchBook
|
|
|
+import io.legado.app.model.BookCover as BookCoverModel
|
|
|
import io.legado.app.ui.config.coverConfig.CoverConfig
|
|
|
import io.legado.app.ui.config.themeConfig.ThemeConfig
|
|
|
import io.legado.app.ui.main.homepage.modules.BannerModule
|
|
|
@@ -147,12 +148,9 @@ fun BookInfoScreen(
|
|
|
canApplyCoverTheme = true
|
|
|
}
|
|
|
}
|
|
|
- val bookColorTheme = rememberBookInfoColorTheme(
|
|
|
- book = state.book,
|
|
|
- enabled = canApplyCoverTheme,
|
|
|
- )
|
|
|
+ val bookColorTheme = rememberBookInfoColorTheme(state.book)
|
|
|
|
|
|
- BookInfoColorTheme(theme = bookColorTheme) {
|
|
|
+ BookInfoColorTheme(theme = bookColorTheme.takeIf { canApplyCoverTheme }) {
|
|
|
BookInfoScreenContent(
|
|
|
state = state,
|
|
|
onIntent = onIntent,
|
|
|
@@ -479,20 +477,38 @@ private fun BookInfoTransparentTopAppBar(
|
|
|
@Composable
|
|
|
private fun rememberBookInfoColorTheme(
|
|
|
book: BookInfoBookUi?,
|
|
|
- enabled: Boolean,
|
|
|
): ThemeOverrideState? {
|
|
|
if (
|
|
|
- !enabled ||
|
|
|
- !ThemeConfig.bookInfoFollowCoverColor ||
|
|
|
- usesDefaultBookCover(book?.coverPath)
|
|
|
+ book == null ||
|
|
|
+ !ThemeConfig.bookInfoFollowCoverColor
|
|
|
) {
|
|
|
return null
|
|
|
}
|
|
|
|
|
|
val imageLoader = koinInject<ImageLoader>()
|
|
|
- val coverPath = book?.coverPath
|
|
|
- val sourceOrigin = book?.origin
|
|
|
- val loadOnlyWifi = CoverConfig.loadCoverOnlyWifi
|
|
|
+ val isNight = LegadoTheme.isDark
|
|
|
+ val useDefaultCover = usesDefaultBookCover(book.coverPath)
|
|
|
+ val defaultCoverPaths =
|
|
|
+ if (isNight) CoverConfig.defaultCoverDark else CoverConfig.defaultCover
|
|
|
+ val coverPath = remember(
|
|
|
+ book.name,
|
|
|
+ book.author,
|
|
|
+ book.coverPath,
|
|
|
+ useDefaultCover,
|
|
|
+ isNight,
|
|
|
+ defaultCoverPaths,
|
|
|
+ ) {
|
|
|
+ if (useDefaultCover) {
|
|
|
+ BookCoverModel.getRandomDefaultPath(
|
|
|
+ seed = book.name,
|
|
|
+ isNight = isNight,
|
|
|
+ )
|
|
|
+ } else {
|
|
|
+ book.coverPath
|
|
|
+ }
|
|
|
+ } ?: return null
|
|
|
+ val sourceOrigin = if (useDefaultCover) null else book.origin
|
|
|
+ val loadOnlyWifi = !useDefaultCover && CoverConfig.loadCoverOnlyWifi
|
|
|
val requestKey = remember(coverPath, sourceOrigin, loadOnlyWifi) {
|
|
|
listOf(coverPath, sourceOrigin, loadOnlyWifi)
|
|
|
}
|
|
|
@@ -548,18 +564,10 @@ private fun BookInfoTopBarActions(
|
|
|
private fun BookInfoBackdrop(
|
|
|
book: BookInfoBookUi,
|
|
|
) {
|
|
|
- val initiallyUsesDefaultCover = usesDefaultBookCover(book.coverPath)
|
|
|
- var usesDefaultCover by remember(
|
|
|
- book.coverPath,
|
|
|
- initiallyUsesDefaultCover,
|
|
|
- ) {
|
|
|
- mutableStateOf(initiallyUsesDefaultCover)
|
|
|
- }
|
|
|
- val blurBackground = when (ThemeConfig.bookInfoBackgroundBlur) {
|
|
|
- ThemeConfig.BOOK_INFO_BACKGROUND_BLUR_OFF -> false
|
|
|
- ThemeConfig.BOOK_INFO_BACKGROUND_BLUR_OFF_FOR_DEFAULT -> !usesDefaultCover
|
|
|
- else -> true
|
|
|
- }
|
|
|
+ val backgroundMode = ThemeConfig.bookInfoBackgroundBlur
|
|
|
+ val showBackgroundCover =
|
|
|
+ backgroundMode != ThemeConfig.BOOK_INFO_BACKGROUND_COVER_HIDDEN
|
|
|
+ val blurBackground = backgroundMode != ThemeConfig.BOOK_INFO_BACKGROUND_BLUR_OFF
|
|
|
|
|
|
val backdropState = remember(
|
|
|
book.name,
|
|
|
@@ -580,34 +588,35 @@ private fun BookInfoBackdrop(
|
|
|
0.42f
|
|
|
)
|
|
|
Box(modifier = Modifier.fillMaxSize()) {
|
|
|
- Crossfade(
|
|
|
- targetState = backdropState,
|
|
|
- animationSpec = tween(800),
|
|
|
- label = "BackdropCrossfade"
|
|
|
- ) { currentBook ->
|
|
|
- BookCoverImage(
|
|
|
- name = currentBook.name,
|
|
|
- author = currentBook.author,
|
|
|
- path = currentBook.coverPath,
|
|
|
- sourceOrigin = currentBook.sourceOrigin,
|
|
|
- memoryCacheKey = currentBook.coverPath?.let { "$it#book-info-backdrop" },
|
|
|
- modifier = Modifier
|
|
|
- .fillMaxWidth()
|
|
|
- .height(480.dp)
|
|
|
- .then(
|
|
|
- if (blurBackground) {
|
|
|
- Modifier.blur(24.dp)
|
|
|
- } else {
|
|
|
- Modifier
|
|
|
- }
|
|
|
- ),
|
|
|
- contentScale = ContentScale.Crop,
|
|
|
- showLoadingPlaceholder = false,
|
|
|
- onDefaultCoverVisibilityChange = { usesDefaultCover = it },
|
|
|
- requestBuilder = {
|
|
|
- size(Size(384, 384))
|
|
|
- }
|
|
|
- )
|
|
|
+ if (showBackgroundCover) {
|
|
|
+ Crossfade(
|
|
|
+ targetState = backdropState,
|
|
|
+ animationSpec = tween(800),
|
|
|
+ label = "BackdropCrossfade"
|
|
|
+ ) { currentBook ->
|
|
|
+ BookCoverImage(
|
|
|
+ name = currentBook.name,
|
|
|
+ author = currentBook.author,
|
|
|
+ path = currentBook.coverPath,
|
|
|
+ sourceOrigin = currentBook.sourceOrigin,
|
|
|
+ memoryCacheKey = currentBook.coverPath?.let { "$it#book-info-backdrop" },
|
|
|
+ modifier = Modifier
|
|
|
+ .fillMaxWidth()
|
|
|
+ .height(480.dp)
|
|
|
+ .then(
|
|
|
+ if (blurBackground) {
|
|
|
+ Modifier.blur(24.dp)
|
|
|
+ } else {
|
|
|
+ Modifier
|
|
|
+ }
|
|
|
+ ),
|
|
|
+ contentScale = ContentScale.Crop,
|
|
|
+ showLoadingPlaceholder = false,
|
|
|
+ requestBuilder = {
|
|
|
+ size(Size(384, 384))
|
|
|
+ }
|
|
|
+ )
|
|
|
+ }
|
|
|
}
|
|
|
Box(
|
|
|
modifier = Modifier
|