Ver Fonte

fix: 完善书籍详情封面背景与共享缓存

HapeLee há 4 meses atrás
pai
commit
f5565ca1dd

+ 61 - 52
app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt

@@ -71,6 +71,7 @@ import coil.size.Size
 import io.legado.app.R
 import io.legado.app.R
 import io.legado.app.constant.BookType
 import io.legado.app.constant.BookType
 import io.legado.app.data.entities.SearchBook
 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.coverConfig.CoverConfig
 import io.legado.app.ui.config.themeConfig.ThemeConfig
 import io.legado.app.ui.config.themeConfig.ThemeConfig
 import io.legado.app.ui.main.homepage.modules.BannerModule
 import io.legado.app.ui.main.homepage.modules.BannerModule
@@ -147,12 +148,9 @@ fun BookInfoScreen(
             canApplyCoverTheme = true
             canApplyCoverTheme = true
         }
         }
     }
     }
-    val bookColorTheme = rememberBookInfoColorTheme(
-        book = state.book,
-        enabled = canApplyCoverTheme,
-    )
+    val bookColorTheme = rememberBookInfoColorTheme(state.book)
 
 
-    BookInfoColorTheme(theme = bookColorTheme) {
+    BookInfoColorTheme(theme = bookColorTheme.takeIf { canApplyCoverTheme }) {
         BookInfoScreenContent(
         BookInfoScreenContent(
             state = state,
             state = state,
             onIntent = onIntent,
             onIntent = onIntent,
@@ -479,20 +477,38 @@ private fun BookInfoTransparentTopAppBar(
 @Composable
 @Composable
 private fun rememberBookInfoColorTheme(
 private fun rememberBookInfoColorTheme(
     book: BookInfoBookUi?,
     book: BookInfoBookUi?,
-    enabled: Boolean,
 ): ThemeOverrideState? {
 ): ThemeOverrideState? {
     if (
     if (
-        !enabled ||
-        !ThemeConfig.bookInfoFollowCoverColor ||
-        usesDefaultBookCover(book?.coverPath)
+        book == null ||
+        !ThemeConfig.bookInfoFollowCoverColor
     ) {
     ) {
         return null
         return null
     }
     }
 
 
     val imageLoader = koinInject<ImageLoader>()
     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) {
     val requestKey = remember(coverPath, sourceOrigin, loadOnlyWifi) {
         listOf(coverPath, sourceOrigin, loadOnlyWifi)
         listOf(coverPath, sourceOrigin, loadOnlyWifi)
     }
     }
@@ -548,18 +564,10 @@ private fun BookInfoTopBarActions(
 private fun BookInfoBackdrop(
 private fun BookInfoBackdrop(
     book: BookInfoBookUi,
     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(
     val backdropState = remember(
         book.name,
         book.name,
@@ -580,34 +588,35 @@ private fun BookInfoBackdrop(
         0.42f
         0.42f
     )
     )
     Box(modifier = Modifier.fillMaxSize()) {
     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(
         Box(
             modifier = Modifier
             modifier = Modifier

+ 1 - 1
app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfig.kt

@@ -37,7 +37,7 @@ object ThemeConfig {
 
 
     const val BOOK_INFO_BACKGROUND_BLUR_OFF = "off"
     const val BOOK_INFO_BACKGROUND_BLUR_OFF = "off"
     const val BOOK_INFO_BACKGROUND_BLUR_ON = "on"
     const val BOOK_INFO_BACKGROUND_BLUR_ON = "on"
-    const val BOOK_INFO_BACKGROUND_BLUR_OFF_FOR_DEFAULT = "off_for_default"
+    const val BOOK_INFO_BACKGROUND_COVER_HIDDEN = "off_for_default"
 
 
     var containerOpacity by prefDelegate(PreferKey.containerOpacity, 100)
     var containerOpacity by prefDelegate(PreferKey.containerOpacity, 100)
 
 

+ 5 - 5
app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt

@@ -322,11 +322,6 @@ fun ThemeConfigScreen(
                             }
                             }
                         )
                         )
                     }
                     }
-                    ClickableSettingItem(
-                        title = stringResource(R.string.theme_pack),
-                        description = stringResource(R.string.theme_pack_s),
-                        onClick = onNavigateToThemeManage
-                    )
                 }
                 }
 
 
                 SplicedColumnGroup {
                 SplicedColumnGroup {
@@ -378,6 +373,11 @@ fun ThemeConfigScreen(
                             ThemeConfig.fontScale = value.toInt()
                             ThemeConfig.fontScale = value.toInt()
                         }
                         }
                     )
                     )
+                    ClickableSettingItem(
+                        title = stringResource(R.string.theme_pack),
+                        description = stringResource(R.string.theme_pack_s),
+                        onClick = onNavigateToThemeManage
+                    )
                 }
                 }
 
 
                 SplicedColumnGroup(title = stringResource(R.string.main_activity)) {
                 SplicedColumnGroup(title = stringResource(R.string.main_activity)) {

+ 10 - 9
app/src/main/java/io/legado/app/ui/widget/components/image/cover/CoilBookCover.kt

@@ -71,7 +71,6 @@ fun BookCoverImage(
     onLoadFinish: (() -> Unit)? = null,
     onLoadFinish: (() -> Unit)? = null,
     onSuccess: (() -> Unit)? = null,
     onSuccess: (() -> Unit)? = null,
     onError: (() -> Unit)? = null,
     onError: (() -> Unit)? = null,
-    onDefaultCoverVisibilityChange: ((Boolean) -> Unit)? = null,
     sharedCoverKey: String? = null,
     sharedCoverKey: String? = null,
     requestBuilder: ImageRequest.Builder.() -> Unit = {},
     requestBuilder: ImageRequest.Builder.() -> Unit = {},
 ) {
 ) {
@@ -93,6 +92,12 @@ fun BookCoverImage(
     }
     }
 
 
     val hasCustomDefault = !randomPath.isNullOrBlank()
     val hasCustomDefault = !randomPath.isNullOrBlank()
+    val customDefaultMemoryCacheKey =
+        if (finalPath == null && sharedCoverKey != null) {
+            "$sharedCoverKey:default:$randomPath"
+        } else {
+            randomPath
+        }
     var isOnlineCoverLoaded by remember(finalPath) { mutableStateOf(false) }
     var isOnlineCoverLoaded by remember(finalPath) { mutableStateOf(false) }
     var onlineCoverLoadFailed by remember(finalPath) { mutableStateOf(false) }
     var onlineCoverLoadFailed by remember(finalPath) { mutableStateOf(false) }
 
 
@@ -113,12 +118,6 @@ fun BookCoverImage(
             isUsingDefaultCover ||
             isUsingDefaultCover ||
                 (showLoadingPlaceholder && showLoadingDefault)
                 (showLoadingPlaceholder && showLoadingDefault)
         )
         )
-    val isDefaultCoverVisible =
-        showCustomDefault || showDefaultIcon
-    LaunchedEffect(isDefaultCoverVisible) {
-        onDefaultCoverVisibilityChange?.invoke(isDefaultCoverVisible)
-    }
-
     Box(modifier = modifier) {
     Box(modifier = modifier) {
         if (showCustomDefault) {
         if (showCustomDefault) {
             AsyncImage(
             AsyncImage(
@@ -128,7 +127,7 @@ fun BookCoverImage(
                     sourceOrigin = null,
                     sourceOrigin = null,
                     loadOnlyWifi = false,
                     loadOnlyWifi = false,
                     crossfade = showLoadingPlaceholder,
                     crossfade = showLoadingPlaceholder,
-                    memoryCacheKey = randomPath,
+                    memoryCacheKey = customDefaultMemoryCacheKey,
                 ),
                 ),
                 contentDescription = null,
                 contentDescription = null,
                 imageLoader = koinInject(),
                 imageLoader = koinInject(),
@@ -156,7 +155,9 @@ fun BookCoverImage(
                     sourceOrigin = sourceOrigin,
                     sourceOrigin = sourceOrigin,
                     loadOnlyWifi = CoverConfig.loadCoverOnlyWifi,
                     loadOnlyWifi = CoverConfig.loadCoverOnlyWifi,
                     crossfade = showLoadingPlaceholder,
                     crossfade = showLoadingPlaceholder,
-                    memoryCacheKey = memoryCacheKey ?: finalPath,
+                    memoryCacheKey = sharedCoverKey?.let {
+                        "$it:cover:${memoryCacheKey ?: finalPath}"
+                    } ?: memoryCacheKey ?: finalPath,
                     configure = requestBuilder,
                     configure = requestBuilder,
                 ),
                 ),
                 contentDescription = null,
                 contentDescription = null,

+ 4 - 4
app/src/main/res/values-zh-rCN/strings.xml

@@ -1478,10 +1478,10 @@
     <string name="book_info_page">书籍详情页</string>
     <string name="book_info_page">书籍详情页</string>
     <string name="book_info_follow_cover_color">界面颜色跟随封面取色</string>
     <string name="book_info_follow_cover_color">界面颜色跟随封面取色</string>
     <string name="book_info_follow_cover_color_summary">从书籍封面提取详情页配色</string>
     <string name="book_info_follow_cover_color_summary">从书籍封面提取详情页配色</string>
-    <string name="book_info_background_blur">背景模糊</string>
-    <string name="book_info_background_blur_off">关闭</string>
-    <string name="book_info_background_blur_on">开启</string>
-    <string name="book_info_background_blur_off_for_default">显示默认封面时关闭</string>
+    <string name="book_info_background_blur">背景设置</string>
+    <string name="book_info_background_blur_off">关闭模糊封面</string>
+    <string name="book_info_background_blur_on">开启模糊封面</string>
+    <string name="book_info_background_blur_off_for_default">不显示背景封面</string>
     <string name="theme_manage_top_bar_blur_radius">顶栏模糊半径</string>
     <string name="theme_manage_top_bar_blur_radius">顶栏模糊半径</string>
     <string name="theme_manage_bottom_bar_blur_radius">底栏模糊半径</string>
     <string name="theme_manage_bottom_bar_blur_radius">底栏模糊半径</string>
     <string name="theme_manage_top_bar_blur_opacity">顶栏模糊不透明度</string>
     <string name="theme_manage_top_bar_blur_opacity">顶栏模糊不透明度</string>

+ 4 - 4
app/src/main/res/values-zh-rHK/strings.xml

@@ -2142,10 +2142,10 @@
     <string name="book_info_page">書籍詳情頁</string>
     <string name="book_info_page">書籍詳情頁</string>
     <string name="book_info_follow_cover_color">介面顏色跟隨封面取色</string>
     <string name="book_info_follow_cover_color">介面顏色跟隨封面取色</string>
     <string name="book_info_follow_cover_color_summary">從書籍封面擷取詳情頁配色</string>
     <string name="book_info_follow_cover_color_summary">從書籍封面擷取詳情頁配色</string>
-    <string name="book_info_background_blur">背景模糊</string>
-    <string name="book_info_background_blur_off">關閉</string>
-    <string name="book_info_background_blur_on">開啟</string>
-    <string name="book_info_background_blur_off_for_default">顯示預設封面時關閉</string>
+    <string name="book_info_background_blur">背景設定</string>
+    <string name="book_info_background_blur_off">關閉模糊封面</string>
+    <string name="book_info_background_blur_on">開啟模糊封面</string>
+    <string name="book_info_background_blur_off_for_default">不顯示背景封面</string>
     <string name="theme_manage_section_colors">顏色</string>
     <string name="theme_manage_section_colors">顏色</string>
     <string name="theme_manage_section_container">容器</string>
     <string name="theme_manage_section_container">容器</string>
     <string name="theme_manage_section_layout">介面佈局</string>
     <string name="theme_manage_section_layout">介面佈局</string>

+ 4 - 4
app/src/main/res/values-zh-rTW/strings.xml

@@ -1625,10 +1625,10 @@
     <string name="book_info_page">書籍詳情頁</string>
     <string name="book_info_page">書籍詳情頁</string>
     <string name="book_info_follow_cover_color">介面顏色跟隨封面取色</string>
     <string name="book_info_follow_cover_color">介面顏色跟隨封面取色</string>
     <string name="book_info_follow_cover_color_summary">從書籍封面擷取詳情頁配色</string>
     <string name="book_info_follow_cover_color_summary">從書籍封面擷取詳情頁配色</string>
-    <string name="book_info_background_blur">背景模糊</string>
-    <string name="book_info_background_blur_off">關閉</string>
-    <string name="book_info_background_blur_on">開啟</string>
-    <string name="book_info_background_blur_off_for_default">顯示預設封面時關閉</string>
+    <string name="book_info_background_blur">背景設定</string>
+    <string name="book_info_background_blur_off">關閉模糊封面</string>
+    <string name="book_info_background_blur_on">開啟模糊封面</string>
+    <string name="book_info_background_blur_off_for_default">不顯示背景封面</string>
     <string name="theme_manage_top_bar_blur_radius">頂部工具列模糊半徑</string>
     <string name="theme_manage_top_bar_blur_radius">頂部工具列模糊半徑</string>
     <string name="theme_manage_bottom_bar_blur_radius">底部工具列模糊半徑</string>
     <string name="theme_manage_bottom_bar_blur_radius">底部工具列模糊半徑</string>
     <string name="theme_manage_top_bar_blur_opacity">頂部工具列模糊不透明度</string>
     <string name="theme_manage_top_bar_blur_opacity">頂部工具列模糊不透明度</string>

+ 4 - 4
app/src/main/res/values/strings.xml

@@ -1513,10 +1513,10 @@
     <string name="book_info_page">Book details</string>
     <string name="book_info_page">Book details</string>
     <string name="book_info_follow_cover_color">Use colors from book cover</string>
     <string name="book_info_follow_cover_color">Use colors from book cover</string>
     <string name="book_info_follow_cover_color_summary">Generate the book details color scheme from the cover</string>
     <string name="book_info_follow_cover_color_summary">Generate the book details color scheme from the cover</string>
-    <string name="book_info_background_blur">Blurred cover background</string>
-    <string name="book_info_background_blur_off">Off</string>
-    <string name="book_info_background_blur_on">On</string>
-    <string name="book_info_background_blur_off_for_default">Off when showing the default cover</string>
+    <string name="book_info_background_blur">Background setting</string>
+    <string name="book_info_background_blur_off">Show cover without blur</string>
+    <string name="book_info_background_blur_on">Show blurred cover</string>
+    <string name="book_info_background_blur_off_for_default">Hide background cover</string>
     <string name="theme_manage_top_bar_blur_radius">Top Bar Blur Radius</string>
     <string name="theme_manage_top_bar_blur_radius">Top Bar Blur Radius</string>
     <string name="theme_manage_bottom_bar_blur_radius">Bottom Bar Blur Radius</string>
     <string name="theme_manage_bottom_bar_blur_radius">Bottom Bar Blur Radius</string>
     <string name="theme_manage_top_bar_blur_opacity">Top Bar Blur Opacity</string>
     <string name="theme_manage_top_bar_blur_opacity">Top Bar Blur Opacity</string>