[优化] 增加了部分 Sigma 版本的书源回调参数
This commit is contained in:
@@ -102,6 +102,7 @@ object AudioPlay : CoroutineScope by MainScope() {
|
|||||||
durPlayUrl = ""
|
durPlayUrl = ""
|
||||||
durAudioSize = 0
|
durAudioSize = 0
|
||||||
upDurChapter()
|
upDurChapter()
|
||||||
|
SourceCallBack.callBackBook(SourceCallBack.START_READ, bookSource, book, durChapter)
|
||||||
postEvent(EventBus.AUDIO_BUFFER_PROGRESS, 0)
|
postEvent(EventBus.AUDIO_BUFFER_PROGRESS, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -360,6 +361,7 @@ object AudioPlay : CoroutineScope by MainScope() {
|
|||||||
ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(),
|
ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(),
|
||||||
book.getUseReplaceRule()
|
book.getUseReplaceRule()
|
||||||
)
|
)
|
||||||
|
SourceCallBack.callBackBook(SourceCallBack.SAVE_READ, bookSource, book, it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
book.update()
|
book.update()
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ object SourceCallBack {
|
|||||||
}
|
}
|
||||||
activity.lifecycleScope.launch(IO) {
|
activity.lifecycleScope.launch(IO) {
|
||||||
val java = SourceLoginJsExtensions(activity, source)
|
val java = SourceLoginJsExtensions(activity, source)
|
||||||
runCatching {
|
kotlin.runCatching {
|
||||||
val result = runScriptWithContext {
|
val result = runScriptWithContext {
|
||||||
source.evalJS(jsStr) {
|
source.evalJS(jsStr) {
|
||||||
put("event", event)
|
put("event", event)
|
||||||
@@ -114,7 +114,7 @@ object SourceCallBack {
|
|||||||
val jsStr = source.getContentRule().callBackJs
|
val jsStr = source.getContentRule().callBackJs
|
||||||
if (jsStr.isNullOrEmpty()) return
|
if (jsStr.isNullOrEmpty()) return
|
||||||
scope.launch(IO) {
|
scope.launch(IO) {
|
||||||
runCatching {
|
kotlin.runCatching {
|
||||||
withTimeout(30000L) {
|
withTimeout(30000L) {
|
||||||
runScriptWithContext {
|
runScriptWithContext {
|
||||||
source.evalJS(jsStr) {
|
source.evalJS(jsStr) {
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ import io.legado.app.help.config.LocalConfig
|
|||||||
import io.legado.app.lib.dialogs.alert
|
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.BookCover
|
import io.legado.app.model.BookCover
|
||||||
|
import io.legado.app.model.SourceCallBack
|
||||||
import io.legado.app.model.remote.RemoteBookWebDav
|
import io.legado.app.model.remote.RemoteBookWebDav
|
||||||
import io.legado.app.ui.about.AppLogDialog
|
import io.legado.app.ui.about.AppLogDialog
|
||||||
import io.legado.app.ui.book.audio.AudioPlayActivity
|
import io.legado.app.ui.book.audio.AudioPlayActivity
|
||||||
@@ -828,18 +829,50 @@ class BookInfoActivity :
|
|||||||
}
|
}
|
||||||
tvAuthor.setOnClickListener {
|
tvAuthor.setOnClickListener {
|
||||||
viewModel.getBook(false)?.let { book ->
|
viewModel.getBook(false)?.let { book ->
|
||||||
|
SourceCallBack.callBackBtn(
|
||||||
|
this@BookInfoActivity,
|
||||||
|
SourceCallBack.CLICK_AUTHOR,
|
||||||
|
viewModel.bookSource,
|
||||||
|
book,
|
||||||
|
null
|
||||||
|
) {
|
||||||
startActivity<SearchActivity> {
|
startActivity<SearchActivity> {
|
||||||
putExtra("key", book.author)
|
putExtra("key", book.author)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
tvAuthor.setOnLongClickListener {
|
||||||
|
viewModel.getBook(false)?.let { book ->
|
||||||
|
SourceCallBack.callBackBtn(
|
||||||
|
this@BookInfoActivity,
|
||||||
|
SourceCallBack.LONG_CLICK_AUTHOR,
|
||||||
|
viewModel.bookSource,
|
||||||
|
book,
|
||||||
|
null
|
||||||
|
) {
|
||||||
|
startActivity<SearchActivity> {
|
||||||
|
putExtra("key", book.author)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
tvName.setOnClickListener {
|
tvName.setOnClickListener {
|
||||||
viewModel.getBook(false)?.let { book ->
|
viewModel.getBook(false)?.let { book ->
|
||||||
|
SourceCallBack.callBackBtn(
|
||||||
|
this@BookInfoActivity,
|
||||||
|
SourceCallBack.CLICK_BOOK_NAME,
|
||||||
|
viewModel.bookSource,
|
||||||
|
book,
|
||||||
|
null
|
||||||
|
) {
|
||||||
startActivity<SearchActivity> {
|
startActivity<SearchActivity> {
|
||||||
putExtra("key", book.name)
|
putExtra("key", book.name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
tvName.setOnLongClickListener {
|
tvName.setOnLongClickListener {
|
||||||
TransitionManager.beginDelayedTransition(scrollView)
|
TransitionManager.beginDelayedTransition(scrollView)
|
||||||
tvName.maxLines = if (tvName.maxLines == 3) 10 else 3
|
tvName.maxLines = if (tvName.maxLines == 3) 10 else 3
|
||||||
@@ -922,14 +955,14 @@ class BookInfoActivity :
|
|||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
private fun deleteBook() {
|
private fun deleteBook() {
|
||||||
viewModel.getBook()?.let {
|
viewModel.getBook()?.let { book ->
|
||||||
if (LocalConfig.bookInfoDeleteAlert) {
|
if (LocalConfig.bookInfoDeleteAlert) {
|
||||||
alert(
|
alert(
|
||||||
titleResource = R.string.draw,
|
titleResource = R.string.draw,
|
||||||
messageResource = R.string.sure_del
|
messageResource = R.string.sure_del
|
||||||
) {
|
) {
|
||||||
var checkBox: CheckBox? = null
|
var checkBox: CheckBox? = null
|
||||||
if (it.isLocal) {
|
if (book.isLocal) {
|
||||||
checkBox = CheckBox(this@BookInfoActivity).apply {
|
checkBox = CheckBox(this@BookInfoActivity).apply {
|
||||||
setText(R.string.delete_book_file)
|
setText(R.string.delete_book_file)
|
||||||
isChecked = LocalConfig.deleteBookOriginal
|
isChecked = LocalConfig.deleteBookOriginal
|
||||||
@@ -944,6 +977,11 @@ class BookInfoActivity :
|
|||||||
if (checkBox != null) {
|
if (checkBox != null) {
|
||||||
LocalConfig.deleteBookOriginal = checkBox.isChecked
|
LocalConfig.deleteBookOriginal = checkBox.isChecked
|
||||||
}
|
}
|
||||||
|
SourceCallBack.callBackBook(
|
||||||
|
SourceCallBack.DEL_BOOK_SHELF,
|
||||||
|
viewModel.bookSource,
|
||||||
|
book
|
||||||
|
) //确认后删除书架
|
||||||
viewModel.delBook(LocalConfig.deleteBookOriginal) {
|
viewModel.delBook(LocalConfig.deleteBookOriginal) {
|
||||||
setResult(RESULT_OK)
|
setResult(RESULT_OK)
|
||||||
finish()
|
finish()
|
||||||
@@ -952,6 +990,11 @@ class BookInfoActivity :
|
|||||||
noButton()
|
noButton()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
SourceCallBack.callBackBook(
|
||||||
|
SourceCallBack.DEL_BOOK_SHELF,
|
||||||
|
viewModel.bookSource,
|
||||||
|
book
|
||||||
|
) //点按钮直接删除书架
|
||||||
viewModel.delBook(LocalConfig.deleteBookOriginal) {
|
viewModel.delBook(LocalConfig.deleteBookOriginal) {
|
||||||
setResult(RESULT_OK)
|
setResult(RESULT_OK)
|
||||||
finish()
|
finish()
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import io.legado.app.help.book.sync
|
|||||||
import io.legado.app.help.config.AppConfig
|
import io.legado.app.help.config.AppConfig
|
||||||
import io.legado.app.model.CacheBook
|
import io.legado.app.model.CacheBook
|
||||||
import io.legado.app.model.ReadBook
|
import io.legado.app.model.ReadBook
|
||||||
|
import io.legado.app.model.SourceCallBack
|
||||||
import io.legado.app.model.webBook.WebBook
|
import io.legado.app.model.webBook.WebBook
|
||||||
import io.legado.app.service.CacheBookService
|
import io.legado.app.service.CacheBookService
|
||||||
import io.legado.app.utils.onEachParallel
|
import io.legado.app.utils.onEachParallel
|
||||||
@@ -53,6 +54,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
val onUpBooksLiveData = MutableLiveData<Int>()
|
val onUpBooksLiveData = MutableLiveData<Int>()
|
||||||
private var upTocJob: Job? = null
|
private var upTocJob: Job? = null
|
||||||
private var cacheBookJob: Job? = null
|
private var cacheBookJob: Job? = null
|
||||||
|
private val eventListenerSource = ConcurrentHashMap<BookSource, Boolean>()
|
||||||
val booksListRecycledViewPool = RecycledViewPool().apply {
|
val booksListRecycledViewPool = RecycledViewPool().apply {
|
||||||
setMaxRecycledViews(0, 30)
|
setMaxRecycledViews(0, 30)
|
||||||
}
|
}
|
||||||
@@ -156,6 +158,17 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (source.eventListener) {
|
||||||
|
// 使用 putIfAbsent 确保只添加一次
|
||||||
|
if (eventListenerSource.putIfAbsent(source, true) == null) {
|
||||||
|
// 通知监听事件的书源,书架刷新开始
|
||||||
|
SourceCallBack.callBackSource(
|
||||||
|
viewModelScope,
|
||||||
|
SourceCallBack.START_SHELF_REFRESH,
|
||||||
|
source
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
kotlin.runCatching {
|
kotlin.runCatching {
|
||||||
val oldBook = book.copy()
|
val oldBook = book.copy()
|
||||||
if (book.tocUrl.isBlank()) {
|
if (book.tocUrl.isBlank()) {
|
||||||
@@ -210,13 +223,24 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
* 缓存书籍
|
* 缓存书籍
|
||||||
*/
|
*/
|
||||||
private fun cacheBook() {
|
private fun cacheBook() {
|
||||||
|
//开始缓存前,通知监听事件的书源,书架刷新已完成
|
||||||
|
eventListenerSource.toList().forEach {
|
||||||
|
SourceCallBack.callBackSource(
|
||||||
|
viewModelScope,
|
||||||
|
SourceCallBack.END_SHELF_REFRESH,
|
||||||
|
it.first
|
||||||
|
)
|
||||||
|
}
|
||||||
|
eventListenerSource.clear()
|
||||||
if (AppConfig.preDownloadNum == 0) return
|
if (AppConfig.preDownloadNum == 0) return
|
||||||
cacheBookJob?.cancel()
|
cacheBookJob?.cancel()
|
||||||
cacheBookJob = viewModelScope.launch(upTocPool) {
|
cacheBookJob = viewModelScope.launch(upTocPool) {
|
||||||
launch {
|
launch {
|
||||||
while (isActive && CacheBook.isRun) {
|
while (isActive && CacheBook.isRun) {
|
||||||
|
val isOnUpTocBooksEmpty =
|
||||||
|
onUpTocBooks.isEmpty()
|
||||||
//有目录更新是不缓存,优先更新目录,现在更多网站限制并发
|
//有目录更新是不缓存,优先更新目录,现在更多网站限制并发
|
||||||
CacheBook.setWorkingState(waitUpTocBooks.isEmpty() && onUpTocBooks.isEmpty())
|
CacheBook.setWorkingState(waitUpTocBooks.isEmpty() && isOnUpTocBooksEmpty)
|
||||||
delay(1000)
|
delay(1000)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user