Merge remote-tracking branch 'origin/master'

pull/2222/head
kunfei 2 years ago
commit b2bef3786a
  1. 3
      app/src/main/assets/help/ruleHelp.md
  2. 6
      app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceAdapter.kt
  3. 28
      app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt
  4. 55
      app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt

@ -152,5 +152,4 @@ let options = {
``` ```
* 购买操作 * 购买操作
> 返回购买链接,可直接填写链接或者JavaScript > 可直接填写链接或者JavaScript,如果执行结果是字符串链接将会自动打开浏览器
> 可用变量 book chapter java(不支持AnalyzeRule函数) source

@ -1,7 +1,6 @@
package io.legado.app.ui.book.changesource package io.legado.app.ui.book.changesource
import android.content.Context import android.content.Context
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@ -14,7 +13,10 @@ import io.legado.app.base.adapter.DiffRecyclerAdapter
import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.SearchBook
import io.legado.app.databinding.ItemChangeSourceBinding import io.legado.app.databinding.ItemChangeSourceBinding
import io.legado.app.utils.* import io.legado.app.utils.getCompatColor
import io.legado.app.utils.gone
import io.legado.app.utils.invisible
import io.legado.app.utils.visible
import splitties.init.appCtx import splitties.init.appCtx
import splitties.views.onLongClick import splitties.views.onLongClick

@ -83,27 +83,23 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a
searchCallback = null searchCallback = null
} }
}.map { }.map {
searchBooks.sortedWith(object : Comparator<SearchBook> { searchBooks.sortedWith { o1, o2 ->
override fun compare(o1: SearchBook, o2: SearchBook): Int { val o1bs = SourceConfig.getBookScore(o1.origin, o1.name, o1.author)
val o1bs = SourceConfig.getBookScore(o1.origin, o1.name, o1.author) val o2bs = SourceConfig.getBookScore(o2.origin, o2.name, o2.author)
val o2bs = SourceConfig.getBookScore(o2.origin, o2.name, o2.author) when {
if (o1bs - o2bs > 0) { o1bs - o2bs > 0 -> -1
return -1 o1bs - o2bs < 0 -> 1
} else if (o1bs - o2bs < 0) { else -> {
return 1
} else {
val o1ss = SourceConfig.getSourceScore(o1.origin) val o1ss = SourceConfig.getSourceScore(o1.origin)
val o2ss = SourceConfig.getSourceScore(o2.origin) val o2ss = SourceConfig.getSourceScore(o2.origin)
if (o1ss - o2ss > 0) { when {
return -1 o1ss - o2ss > 0 -> -1
} else if (o1ss - o2ss < 0) { o1ss - o2ss < 0 -> 1
return 1 else -> o1.originOrder - o2.originOrder
} else {
return o1.originOrder - o2.originOrder
} }
} }
} }
}) }
}.flowOn(IO) }.flowOn(IO)
@Volatile @Volatile

@ -36,6 +36,7 @@ import io.legado.app.lib.dialogs.selector
import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.accentColor
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.analyzeRule.AnalyzeRule
import io.legado.app.receiver.TimeBatteryReceiver import io.legado.app.receiver.TimeBatteryReceiver
import io.legado.app.service.BaseReadAloudService import io.legado.app.service.BaseReadAloudService
import io.legado.app.ui.about.AppLogDialog import io.legado.app.ui.about.AppLogDialog
@ -962,31 +963,41 @@ class ReadBookActivity : BaseReadBookActivity(),
} }
override fun payAction() { override fun payAction() {
Coroutine.async(this) { ReadBook.book?.let { book ->
val book = ReadBook.book ?: throw NoStackTraceException("no book") if (book.isLocalBook()) return
val chapter = appDb.bookChapterDao.getChapter(book.bookUrl, ReadBook.durChapterIndex) val chapter = appDb.bookChapterDao.getChapter(book.bookUrl, ReadBook.durChapterIndex)
?: throw NoStackTraceException("no chapter") if (chapter == null) {
val source = ReadBook.bookSource ?: throw NoStackTraceException("no book source") toastOnUi("no chapter")
val payAction = source.getContentRule().payAction return
if (payAction.isNullOrEmpty()) { }
throw NoStackTraceException("no pay action") alert(R.string.chapter_pay) {
} setMessage(chapter.title)
JsUtils.evalJs(payAction) { yesButton {
it["java"] = source Coroutine.async {
it["source"] = source val source = ReadBook.bookSource ?: throw NoStackTraceException("no book source")
it["book"] = book val payAction = source.getContentRule().payAction
it["chapter"] = chapter if (payAction.isNullOrEmpty()) {
} throw NoStackTraceException("no pay action")
}.onSuccess { }
if (it.isNotBlank()) { val analyzeRule = AnalyzeRule(book, source)
startActivity<WebViewActivity> { analyzeRule.setBaseUrl(chapter.url)
putExtra("title", getString(R.string.chapter_pay)) analyzeRule.chapter = chapter
putExtra("url", it) analyzeRule.evalJS(payAction).toString()
IntentData.put(it, ReadBook.bookSource?.getHeaderMap(true)) }.onSuccess {
if (it.isNotBlank()) {
startActivity<WebViewActivity> {
putExtra("title", R.string.chapter_pay)
putExtra("url", it)
IntentData.put(it, ReadBook.bookSource?.getHeaderMap(true))
}
}
}.onError {
AppLog.putDebug(it.localizedMessage)
toastOnUi(it.localizedMessage)
}
} }
noButton()
} }
}.onError {
toastOnUi(it.localizedMessage)
} }
} }

Loading…
Cancel
Save