[优化] 增加 阅读Sigma 的书源回调 (@Luoyacheng)

This commit is contained in:
HapeLee
2026-03-10 00:12:27 +08:00
parent b8003e9175
commit 64efff6f41
8 changed files with 134 additions and 28 deletions
@@ -184,12 +184,6 @@ object ReadBook : CoroutineScope by MainScope(), KoinComponent {
} else { } else {
appDb.bookSourceDao.getBookSource(book.origin)?.let { appDb.bookSourceDao.getBookSource(book.origin)?.let {
bookSource = it bookSource = it
SourceCallBack.callBackBook(
SourceCallBack.START_READ,
it,
book,
curTextChapter?.chapter
)
if (book.getImageStyle().isNullOrBlank()) { if (book.getImageStyle().isNullOrBlank()) {
var imageStyle = it.getContentRule().imageStyle var imageStyle = it.getContentRule().imageStyle
if (imageStyle.isNullOrBlank() && (book.isImage || book.isPdf)) { if (imageStyle.isNullOrBlank() && (book.isImage || book.isPdf)) {
@@ -639,9 +633,11 @@ object ReadBook : CoroutineScope by MainScope(), KoinComponent {
loadContent(durChapterIndex - 1, resetPageOffset = resetPageOffset) loadContent(durChapterIndex - 1, resetPageOffset = resetPageOffset)
} }
fun loadOrUpContent() { fun loadOrUpContent(success: (() -> Unit)? = null) {
if (curTextChapter == null) { if (curTextChapter == null) {
loadContent(durChapterIndex) loadContent(durChapterIndex) {
success?.invoke()
}
} else { } else {
callBack?.upContent() callBack?.upContent()
} }
@@ -43,6 +43,7 @@ object SourceCallBack {
source: BookSource?, source: BookSource?,
book: Book, book: Book,
chapter: BookChapter?, chapter: BookChapter?,
bookType: Int = 0,
noCall: (() -> Unit)? = null noCall: (() -> Unit)? = null
) { ) {
if (source == null || !source.eventListener) { if (source == null || !source.eventListener) {
@@ -55,7 +56,7 @@ object SourceCallBack {
return return
} }
activity.lifecycleScope.launch(IO) { activity.lifecycleScope.launch(IO) {
val java = SourceLoginJsExtensions(activity, source) val java = SourceLoginJsExtensions(activity, source, bookType)
kotlin.runCatching { kotlin.runCatching {
val result = runScriptWithContext { val result = runScriptWithContext {
source.evalJS(jsStr) { source.evalJS(jsStr) {
@@ -45,6 +45,7 @@ import io.legado.app.help.book.removeType
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.model.AudioPlay import io.legado.app.model.AudioPlay
import io.legado.app.model.BookCover import io.legado.app.model.BookCover
import io.legado.app.model.SourceCallBack
import io.legado.app.service.AudioPlayService import io.legado.app.service.AudioPlayService
import io.legado.app.ui.about.AppLogDialog import io.legado.app.ui.about.AppLogDialog
import io.legado.app.ui.book.changesource.ChangeBookSourceDialog import io.legado.app.ui.book.changesource.ChangeBookSourceDialog
@@ -164,6 +165,13 @@ class AudioPlayActivity :
} }
} }
override fun finish() {
if (AudioPlay.inBookshelf) {
callBackBookEnd()
return super.finish()
}
}
override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.audio_play, menu) menuInflater.inflate(R.menu.audio_play, menu)
return super.onCompatCreateOptionsMenu(menu) return super.onCompatCreateOptionsMenu(menu)
@@ -190,7 +198,20 @@ class AudioPlayActivity :
} }
R.id.menu_media_control -> AppConfig.systemMediaControlCompatibilityChange = !AppConfig.systemMediaControlCompatibilityChange R.id.menu_media_control -> AppConfig.systemMediaControlCompatibilityChange = !AppConfig.systemMediaControlCompatibilityChange
R.id.menu_wake_lock -> AppConfig.audioPlayUseWakeLock = !AppConfig.audioPlayUseWakeLock R.id.menu_wake_lock -> AppConfig.audioPlayUseWakeLock = !AppConfig.audioPlayUseWakeLock
R.id.menu_copy_audio_url -> sendToClip(AudioPlayService.url) R.id.menu_copy_audio_url -> {
AudioPlay.book?.let {
SourceCallBack.callBackBtn(
this,
SourceCallBack.CLICK_COPY_PLAY_URL,
AudioPlay.bookSource,
it,
AudioPlay.durChapter,
BookType.audio
) {
sendToClip(AudioPlayService.url)
}
}
}
R.id.menu_edit_source -> AudioPlay.bookSource?.let { R.id.menu_edit_source -> AudioPlay.bookSource?.let {
sourceEditResult.launch { sourceEditResult.launch {
putExtra("sourceUrl", it.bookSourceUrl) putExtra("sourceUrl", it.bookSourceUrl)
@@ -202,6 +223,15 @@ class AudioPlayActivity :
return super.onCompatOptionsItemSelected(item) return super.onCompatOptionsItemSelected(item)
} }
private fun callBackBookEnd() {
SourceCallBack.callBackBook(
SourceCallBack.END_READ,
AudioPlay.bookSource,
AudioPlay.book,
AudioPlay.durChapter
)
}
private fun initView() { private fun initView() {
binding.ivTimer.isEnabled = false binding.ivTimer.isEnabled = false
binding.ivFastForward.isEnabled = false binding.ivFastForward.isEnabled = false
@@ -84,7 +84,6 @@ import io.legado.app.utils.gone
import io.legado.app.utils.longToastOnUi import io.legado.app.utils.longToastOnUi
import io.legado.app.utils.openFileUri import io.legado.app.utils.openFileUri
import io.legado.app.utils.sendToClip import io.legado.app.utils.sendToClip
import io.legado.app.utils.shareWithQr
import io.legado.app.utils.showDialogFragment import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.startActivity import io.legado.app.utils.startActivity
import io.legado.app.utils.toastOnUi import io.legado.app.utils.toastOnUi
@@ -270,9 +269,21 @@ class BookInfoActivity :
R.id.menu_share_it -> { R.id.menu_share_it -> {
viewModel.getBook()?.let { viewModel.getBook()?.let {
val bookJson = GSON.toJson(it) SourceCallBack.callBackBtn(
val shareStr = "${it.bookUrl}#$bookJson" this,
shareWithQr(shareStr, it.name) SourceCallBack.CLICK_SHARE_BOOK,
viewModel.bookSource,
it,
null
) {
val bookJson = GSON.toJson(it)
val shareStr = "${it.bookUrl}#$bookJson"
val intent = Intent(Intent.ACTION_SEND)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.putExtra(Intent.EXTRA_TEXT, shareStr)
intent.type = "text/plain"
startActivity(Intent.createChooser(intent, it.name))
}
} }
} }
@@ -294,12 +305,28 @@ class BookInfoActivity :
R.id.menu_top -> viewModel.topBook() R.id.menu_top -> viewModel.topBook()
R.id.menu_set_source_variable -> setSourceVariable() R.id.menu_set_source_variable -> setSourceVariable()
R.id.menu_set_book_variable -> setBookVariable() R.id.menu_set_book_variable -> setBookVariable()
R.id.menu_copy_book_url -> viewModel.getBook()?.bookUrl?.let { R.id.menu_copy_book_url -> viewModel.getBook()?.let {
sendToClip(it) SourceCallBack.callBackBtn(
this,
SourceCallBack.CLICK_COPY_BOOK_URL,
viewModel.bookSource,
it,
null
) {
sendToClip(it.bookUrl)
}
} }
R.id.menu_copy_toc_url -> viewModel.getBook()?.tocUrl?.let { R.id.menu_copy_toc_url -> viewModel.getBook()?.let {
sendToClip(it) SourceCallBack.callBackBtn(
this,
SourceCallBack.CLICK_COPY_TOC_URL,
viewModel.bookSource,
it,
null
) {
sendToClip(it.tocUrl)
}
} }
R.id.menu_can_update -> { R.id.menu_can_update -> {
@@ -314,7 +341,18 @@ class BookInfoActivity :
} }
} }
R.id.menu_clear_cache -> viewModel.clearCache() R.id.menu_clear_cache -> viewModel.getBook()?.let {
SourceCallBack.callBackBtn(
this,
SourceCallBack.CLICK_CLEAR_CACHE,
viewModel.bookSource,
it,
null
) {
viewModel.clearCache(it)
}
}
R.id.menu_log -> showDialogFragment<AppLogDialog>() R.id.menu_log -> showDialogFragment<AppLogDialog>()
R.id.menu_split_long_chapter -> { R.id.menu_split_long_chapter -> {
upLoading(true) upLoading(true)
@@ -32,6 +32,7 @@ import io.legado.app.model.AudioPlay
import io.legado.app.model.BookCover import io.legado.app.model.BookCover
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.model.ReadManga import io.legado.app.model.ReadManga
import io.legado.app.model.SourceCallBack
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.localBook.LocalBook import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.webBook.WebBook import io.legado.app.model.webBook.WebBook
@@ -446,7 +447,7 @@ class BookInfoViewModel(
} }
} }
fun addToBookshelf(success: (() -> Unit)?) { fun addToBookshelf(success: (() -> Unit)?) { //点击书架按钮或在加分组时触发
execute { execute {
bookData.value?.let { book -> bookData.value?.let { book ->
book.removeType(BookType.notShelf) book.removeType(BookType.notShelf)
@@ -464,6 +465,7 @@ class BookInfoViewModel(
AudioPlay.book = book AudioPlay.book = book
} }
book.save() book.save()
SourceCallBack.callBackBook(SourceCallBack.ADD_BOOK_SHELF, bookSource, book)
} }
chapterListData.value?.let { chapterListData.value?.let {
appDb.bookChapterDao.insert(*it.toTypedArray()) appDb.bookChapterDao.insert(*it.toTypedArray())
@@ -496,13 +498,13 @@ class BookInfoViewModel(
} }
} }
fun clearCache() { fun clearCache(book: Book) {
execute { execute {
BookHelp.clearCache(bookData.value!!) BookHelp.clearCache(book)
if (ReadBook.book?.bookUrl == bookData.value!!.bookUrl) { if (ReadBook.book?.bookUrl == book.bookUrl) {
ReadBook.clearTextChapter() ReadBook.clearTextChapter()
} }
if (ReadManga.book?.bookUrl == bookData.value!!.bookUrl) { if (ReadManga.book?.bookUrl == book.bookUrl) {
ReadManga.clearMangaChapter() ReadManga.clearMangaChapter()
} }
}.onSuccess { }.onSuccess {
@@ -512,7 +514,6 @@ class BookInfoViewModel(
} }
} }
fun addToBookshelf(book: Book, toc: List<BookChapter>, success: (() -> Unit)? = null) { fun addToBookshelf(book: Book, toc: List<BookChapter>, success: (() -> Unit)? = null) {
execute { execute {
book.removeType(BookType.notShelf) book.removeType(BookType.notShelf)
@@ -14,6 +14,7 @@ import io.legado.app.help.book.isLocal
import io.legado.app.help.book.removeType import io.legado.app.help.book.removeType
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.model.SourceCallBack
import io.legado.app.model.localBook.LocalBook import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.webBook.WebBook import io.legado.app.model.webBook.WebBook
import io.legado.app.utils.FileUtils import io.legado.app.utils.FileUtils
@@ -57,6 +58,9 @@ class BookshelfManageViewModel(application: Application) : BaseViewModel(applica
books.forEach { books.forEach {
if (it.isLocal) { if (it.isLocal) {
LocalBook.deleteBook(it, deleteOriginal) LocalBook.deleteBook(it, deleteOriginal)
} else {
val source = appDb.bookSourceDao.getBookSource(it.origin)
SourceCallBack.callBackBook(SourceCallBack.DEL_BOOK_SHELF, source, it)
} }
} }
} }
@@ -62,6 +62,7 @@ import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.selector import io.legado.app.lib.dialogs.selector
import io.legado.app.model.ReadAloud import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.model.SourceCallBack
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setChapter import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setChapter
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
@@ -1864,6 +1865,22 @@ class ReadBookActivity : BaseReadBookActivity(),
} }
} }
override fun finish() {
if (ReadBook.inBookshelf) {
callBackBookEnd()
return super.finish()
}
}
private fun callBackBookEnd() {
SourceCallBack.callBackBook(
SourceCallBack.END_READ,
ReadBook.bookSource,
ReadBook.book,
ReadBook.curTextChapter?.chapter
)
}
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
tts?.clearTts() tts?.clearTts()
@@ -25,6 +25,7 @@ import io.legado.app.help.coroutine.Coroutine
import io.legado.app.model.ImageProvider import io.legado.app.model.ImageProvider
import io.legado.app.model.ReadAloud import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.model.SourceCallBack
import io.legado.app.model.localBook.LocalBook import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.webBook.WebBook import io.legado.app.model.webBook.WebBook
import io.legado.app.service.BaseReadAloudService import io.legado.app.service.BaseReadAloudService
@@ -117,14 +118,32 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
} }
ReadBook.upMsg(null) ReadBook.upMsg(null)
if (!isSameBook) { if (!isSameBook) {
ReadBook.loadContent(resetPageOffset = true) ReadBook.loadContent(resetPageOffset = true) {
ReadBook.bookSource?.let {
SourceCallBack.callBackBook(
SourceCallBack.START_READ,
it,
book,
ReadBook.curTextChapter?.chapter
)
}
}
} else { } else {
ReadBook.loadOrUpContent() ReadBook.loadOrUpContent {
ReadBook.bookSource?.let {
SourceCallBack.callBackBook(
SourceCallBack.START_READ,
it,
book,
ReadBook.curTextChapter?.chapter
)
}
}
} }
if (ReadBook.chapterChanged) { if (ReadBook.chapterChanged) {
// 有章节跳转不同步阅读进度 // 有章节跳转不同步阅读进度
ReadBook.chapterChanged = false ReadBook.chapterChanged = false
} else if (!isSameBook || !BaseReadAloudService.isRun) { } else if (!(isSameBook && BaseReadAloudService.isRun) && ReadBook.inBookshelf) {
if (AppConfig.syncBookProgressPlus) { if (AppConfig.syncBookProgressPlus) {
ReadBook.syncProgress({ progress -> ReadBook.callBack?.sureNewProgress(progress) }) ReadBook.syncProgress({ progress -> ReadBook.callBack?.sureNewProgress(progress) })
} else { } else {