[优化] 增加 阅读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 {
appDb.bookSourceDao.getBookSource(book.origin)?.let {
bookSource = it
SourceCallBack.callBackBook(
SourceCallBack.START_READ,
it,
book,
curTextChapter?.chapter
)
if (book.getImageStyle().isNullOrBlank()) {
var imageStyle = it.getContentRule().imageStyle
if (imageStyle.isNullOrBlank() && (book.isImage || book.isPdf)) {
@@ -639,9 +633,11 @@ object ReadBook : CoroutineScope by MainScope(), KoinComponent {
loadContent(durChapterIndex - 1, resetPageOffset = resetPageOffset)
}
fun loadOrUpContent() {
fun loadOrUpContent(success: (() -> Unit)? = null) {
if (curTextChapter == null) {
loadContent(durChapterIndex)
loadContent(durChapterIndex) {
success?.invoke()
}
} else {
callBack?.upContent()
}
@@ -43,6 +43,7 @@ object SourceCallBack {
source: BookSource?,
book: Book,
chapter: BookChapter?,
bookType: Int = 0,
noCall: (() -> Unit)? = null
) {
if (source == null || !source.eventListener) {
@@ -55,7 +56,7 @@ object SourceCallBack {
return
}
activity.lifecycleScope.launch(IO) {
val java = SourceLoginJsExtensions(activity, source)
val java = SourceLoginJsExtensions(activity, source, bookType)
kotlin.runCatching {
val result = runScriptWithContext {
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.model.AudioPlay
import io.legado.app.model.BookCover
import io.legado.app.model.SourceCallBack
import io.legado.app.service.AudioPlayService
import io.legado.app.ui.about.AppLogDialog
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 {
menuInflater.inflate(R.menu.audio_play, menu)
return super.onCompatCreateOptionsMenu(menu)
@@ -190,7 +198,20 @@ class AudioPlayActivity :
}
R.id.menu_media_control -> AppConfig.systemMediaControlCompatibilityChange = !AppConfig.systemMediaControlCompatibilityChange
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 {
sourceEditResult.launch {
putExtra("sourceUrl", it.bookSourceUrl)
@@ -202,6 +223,15 @@ class AudioPlayActivity :
return super.onCompatOptionsItemSelected(item)
}
private fun callBackBookEnd() {
SourceCallBack.callBackBook(
SourceCallBack.END_READ,
AudioPlay.bookSource,
AudioPlay.book,
AudioPlay.durChapter
)
}
private fun initView() {
binding.ivTimer.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.openFileUri
import io.legado.app.utils.sendToClip
import io.legado.app.utils.shareWithQr
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.startActivity
import io.legado.app.utils.toastOnUi
@@ -270,9 +269,21 @@ class BookInfoActivity :
R.id.menu_share_it -> {
viewModel.getBook()?.let {
val bookJson = GSON.toJson(it)
val shareStr = "${it.bookUrl}#$bookJson"
shareWithQr(shareStr, it.name)
SourceCallBack.callBackBtn(
this,
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_set_source_variable -> setSourceVariable()
R.id.menu_set_book_variable -> setBookVariable()
R.id.menu_copy_book_url -> viewModel.getBook()?.bookUrl?.let {
sendToClip(it)
R.id.menu_copy_book_url -> viewModel.getBook()?.let {
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 {
sendToClip(it)
R.id.menu_copy_toc_url -> viewModel.getBook()?.let {
SourceCallBack.callBackBtn(
this,
SourceCallBack.CLICK_COPY_TOC_URL,
viewModel.bookSource,
it,
null
) {
sendToClip(it.tocUrl)
}
}
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_split_long_chapter -> {
upLoading(true)
@@ -32,6 +32,7 @@ import io.legado.app.model.AudioPlay
import io.legado.app.model.BookCover
import io.legado.app.model.ReadBook
import io.legado.app.model.ReadManga
import io.legado.app.model.SourceCallBack
import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.webBook.WebBook
@@ -446,7 +447,7 @@ class BookInfoViewModel(
}
}
fun addToBookshelf(success: (() -> Unit)?) {
fun addToBookshelf(success: (() -> Unit)?) { //点击书架按钮或在加分组时触发
execute {
bookData.value?.let { book ->
book.removeType(BookType.notShelf)
@@ -464,6 +465,7 @@ class BookInfoViewModel(
AudioPlay.book = book
}
book.save()
SourceCallBack.callBackBook(SourceCallBack.ADD_BOOK_SHELF, bookSource, book)
}
chapterListData.value?.let {
appDb.bookChapterDao.insert(*it.toTypedArray())
@@ -496,13 +498,13 @@ class BookInfoViewModel(
}
}
fun clearCache() {
fun clearCache(book: Book) {
execute {
BookHelp.clearCache(bookData.value!!)
if (ReadBook.book?.bookUrl == bookData.value!!.bookUrl) {
BookHelp.clearCache(book)
if (ReadBook.book?.bookUrl == book.bookUrl) {
ReadBook.clearTextChapter()
}
if (ReadManga.book?.bookUrl == bookData.value!!.bookUrl) {
if (ReadManga.book?.bookUrl == book.bookUrl) {
ReadManga.clearMangaChapter()
}
}.onSuccess {
@@ -512,7 +514,6 @@ class BookInfoViewModel(
}
}
fun addToBookshelf(book: Book, toc: List<BookChapter>, success: (() -> Unit)? = null) {
execute {
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.config.AppConfig
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.webBook.WebBook
import io.legado.app.utils.FileUtils
@@ -57,6 +58,9 @@ class BookshelfManageViewModel(application: Application) : BaseViewModel(applica
books.forEach {
if (it.isLocal) {
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.model.ReadAloud
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.Companion.setChapter
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() {
super.onDestroy()
tts?.clearTts()
@@ -25,6 +25,7 @@ import io.legado.app.help.coroutine.Coroutine
import io.legado.app.model.ImageProvider
import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook
import io.legado.app.model.SourceCallBack
import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.webBook.WebBook
import io.legado.app.service.BaseReadAloudService
@@ -117,14 +118,32 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
}
ReadBook.upMsg(null)
if (!isSameBook) {
ReadBook.loadContent(resetPageOffset = true)
ReadBook.loadContent(resetPageOffset = true) {
ReadBook.bookSource?.let {
SourceCallBack.callBackBook(
SourceCallBack.START_READ,
it,
book,
ReadBook.curTextChapter?.chapter
)
}
}
} else {
ReadBook.loadOrUpContent()
ReadBook.loadOrUpContent {
ReadBook.bookSource?.let {
SourceCallBack.callBackBook(
SourceCallBack.START_READ,
it,
book,
ReadBook.curTextChapter?.chapter
)
}
}
}
if (ReadBook.chapterChanged) {
// 有章节跳转不同步阅读进度
ReadBook.chapterChanged = false
} else if (!isSameBook || !BaseReadAloudService.isRun) {
} else if (!(isSameBook && BaseReadAloudService.isRun) && ReadBook.inBookshelf) {
if (AppConfig.syncBookProgressPlus) {
ReadBook.syncProgress({ progress -> ReadBook.callBack?.sureNewProgress(progress) })
} else {