fix: 修复换源加载字数配置不生效

- loadBookWordCount 中 book.toSearchBook().apply 创建临时对象后被丢弃,
  字数信息未传递到搜索结果。改为返回 SearchBook 并在 searchSource 中使用。
- loadInfo/loadToc 切换后不重启搜索(与参考实现一致,仅保存设置)。
This commit is contained in:
HapeLee committed 2026-06-14 20:20:11 +08:00
1 parent 2097c0201c
commit 67a25c7cfe
4 files changed
+12 -17

No files matched your search

@@ -154,7 +154,7 @@ class ChangeSourceSearchUseCase(
loadInfo || loadToc || loadWordCount -> { loadInfo || loadToc || loadWordCount -> {
val book = searchBook.toBook() val book = searchBook.toBook()
try { try {
loadBookInfo( val wordCountSearchBook = loadBookInfo(
source, source,
book, book,
loadToc, loadToc,
@@ -163,8 +163,7 @@ class ChangeSourceSearchUseCase(
fromReadBookActivity, fromReadBookActivity,
contentProcessor contentProcessor
) )
val processedSearchBook = book.toSearchBook() processedBooks.add(wordCountSearchBook ?: book.toSearchBook())
processedBooks.add(processedSearchBook)
} catch (e: Throwable) { } catch (e: Throwable) {
if (e is CancellationException) throw e if (e is CancellationException) throw e
processedBooks.add(searchBook) processedBooks.add(searchBook)
@@ -187,12 +186,12 @@ class ChangeSourceSearchUseCase(
oldBook: Book, oldBook: Book,
fromReadBookActivity: Boolean, fromReadBookActivity: Boolean,
contentProcessor: ContentProcessor, contentProcessor: ContentProcessor,
) { ): SearchBook? {
if (book.tocUrl.isEmpty()) { if (book.tocUrl.isEmpty()) {
WebBook.getBookInfoAwait(source, book) WebBook.getBookInfoAwait(source, book)
} }
if (loadToc || loadWordCount) { if (loadToc || loadWordCount) {
loadBookToc( return loadBookToc(
source, source,
book, book,
loadWordCount, loadWordCount,
@@ -201,6 +200,7 @@ class ChangeSourceSearchUseCase(
contentProcessor contentProcessor
) )
} }
return null
} }
private suspend fun loadBookToc( private suspend fun loadBookToc(
@@ -210,7 +210,7 @@ class ChangeSourceSearchUseCase(
oldBook: Book, oldBook: Book,
fromReadBookActivity: Boolean, fromReadBookActivity: Boolean,
contentProcessor: ContentProcessor, contentProcessor: ContentProcessor,
) { ): SearchBook? {
val chapters = WebBook.getChapterListAwait(source, book).getOrThrow() val chapters = WebBook.getChapterListAwait(source, book).getOrThrow()
for (chapter in chapters) { for (chapter in chapters) {
chapter.internString() chapter.internString()
@@ -222,7 +222,7 @@ class ChangeSourceSearchUseCase(
bookMap[book.primaryStr()] = book bookMap[book.primaryStr()] = book
book.releaseHtmlData() book.releaseHtmlData()
if (loadWordCount) { if (loadWordCount) {
loadBookWordCount( return loadBookWordCount(
source, source,
book, book,
chapters, chapters,
@@ -231,6 +231,7 @@ class ChangeSourceSearchUseCase(
contentProcessor contentProcessor
) )
} }
return null
} }
private suspend fun loadBookWordCount( private suspend fun loadBookWordCount(
@@ -240,21 +241,21 @@ class ChangeSourceSearchUseCase(
oldBook: Book, oldBook: Book,
fromReadBookActivity: Boolean, fromReadBookActivity: Boolean,
contentProcessor: ContentProcessor, contentProcessor: ContentProcessor,
) { ): SearchBook? {
if (chapters.isEmpty()) return if (chapters.isEmpty()) return null
val chapterIndex = if (fromReadBookActivity) { val chapterIndex = if (fromReadBookActivity) {
BookHelp.getDurChapter(oldBook, chapters) BookHelp.getDurChapter(oldBook, chapters)
} else { } else {
chapters.lastIndex chapters.lastIndex
} }
if (chapterIndex !in chapters.indices) return if (chapterIndex !in chapters.indices) return null
val bookChapter = chapters[chapterIndex] val bookChapter = chapters[chapterIndex]
var title = bookChapter.title.trim() var title = bookChapter.title.trim()
if (title.length > 20) { if (title.length > 20) {
title = title.substring(0, 20) + "…" title = title.substring(0, 20) + "…"
} }
val startTime = System.currentTimeMillis() val startTime = System.currentTimeMillis()
try { return try {
val nextChapterUrl = chapters.getOrNull(chapterIndex + 1)?.url val nextChapterUrl = chapters.getOrNull(chapterIndex + 1)?.url
var content = WebBook.getContentAwait(source, book, bookChapter, nextChapterUrl, false) var content = WebBook.getContentAwait(source, book, bookChapter, nextChapterUrl, false)
content = contentProcessor.getContent(oldBook, bookChapter, content, false).toString() content = contentProcessor.getContent(oldBook, bookChapter, content, false).toString()
@@ -227,13 +227,11 @@ class ChangeBookSourceComposeViewModel(
fun onLoadInfoChange(enabled: Boolean) { fun onLoadInfoChange(enabled: Boolean) {
if (ChangeSourceConfig.loadInfo == enabled) return if (ChangeSourceConfig.loadInfo == enabled) return
ChangeSourceConfig.loadInfo = enabled ChangeSourceConfig.loadInfo = enabled
refresh()
} }
fun onLoadTocChange(enabled: Boolean) { fun onLoadTocChange(enabled: Boolean) {
if (ChangeSourceConfig.loadToc == enabled) return if (ChangeSourceConfig.loadToc == enabled) return
ChangeSourceConfig.loadToc = enabled ChangeSourceConfig.loadToc = enabled
refresh()
} }
fun onLoadWordCountChange(enabled: Boolean) { fun onLoadWordCountChange(enabled: Boolean) {
@@ -323,13 +323,11 @@ class ChangeBookSourceDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_b
R.id.menu_load_info -> { R.id.menu_load_info -> {
ChangeSourceConfig.loadInfo = !item.isChecked ChangeSourceConfig.loadInfo = !item.isChecked
item.isChecked = !item.isChecked item.isChecked = !item.isChecked
viewModel.refresh()
} }
R.id.menu_load_toc -> { R.id.menu_load_toc -> {
ChangeSourceConfig.loadToc = !item.isChecked ChangeSourceConfig.loadToc = !item.isChecked
item.isChecked = !item.isChecked item.isChecked = !item.isChecked
viewModel.refresh()
} }
R.id.menu_load_word_count -> { R.id.menu_load_word_count -> {
@@ -133,13 +133,11 @@ class ChangeChapterSourceViewModel(
is ChangeChapterSourceIntent.SetLoadInfo -> { is ChangeChapterSourceIntent.SetLoadInfo -> {
ChangeSourceConfig.loadInfo = intent.enabled ChangeSourceConfig.loadInfo = intent.enabled
_uiState.update { it.copy(loadInfo = intent.enabled) } _uiState.update { it.copy(loadInfo = intent.enabled) }
refreshResults()
} }
is ChangeChapterSourceIntent.SetLoadToc -> { is ChangeChapterSourceIntent.SetLoadToc -> {
ChangeSourceConfig.loadToc = intent.enabled ChangeSourceConfig.loadToc = intent.enabled
_uiState.update { it.copy(loadToc = intent.enabled) } _uiState.update { it.copy(loadToc = intent.enabled) }
refreshResults()
} }
is ChangeChapterSourceIntent.SetLoadWordCount -> { is ChangeChapterSourceIntent.SetLoadWordCount -> {