mirror of
https://github.com/gedoor/legado.git
synced 2024-07-17 00:58:29 +08:00
优化
This commit is contained in:
parent
864b2d4dd6
commit
b589d0bf1e
@ -8,55 +8,73 @@ import io.legado.app.help.IntentData
|
||||
import io.legado.app.ui.association.VerificationCodeActivity
|
||||
import io.legado.app.ui.browser.WebViewActivity
|
||||
import io.legado.app.utils.startActivity
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import splitties.init.appCtx
|
||||
import java.util.concurrent.locks.LockSupport
|
||||
import kotlin.time.Duration.Companion.minutes
|
||||
|
||||
|
||||
object SourceVerificationHelp {
|
||||
|
||||
private var key: String = ""
|
||||
/**
|
||||
private val waitTime = 1.minutes.inWholeNanoseconds
|
||||
|
||||
private fun getKey(source: BaseSource) = getKey(source.getKey())
|
||||
fun getKey(sourceKey: String) = "${sourceKey}_verificationResult"
|
||||
|
||||
/**
|
||||
* 获取书源验证结果
|
||||
* 图片验证码 防爬 滑动验证码 点击字符 等等
|
||||
*/
|
||||
fun getVerificationResult(source: BaseSource?, url: String, title: String, useBrowser: Boolean): String {
|
||||
source ?: throw NoStackTraceException("getVerificationResult parameter source cannot be null")
|
||||
return runBlocking {
|
||||
key = "${source.getKey()}_verificationResult"
|
||||
CacheManager.delete(key)
|
||||
fun getVerificationResult(
|
||||
source: BaseSource?,
|
||||
url: String,
|
||||
title: String,
|
||||
useBrowser: Boolean
|
||||
): String {
|
||||
source
|
||||
?: throw NoStackTraceException("getVerificationResult parameter source cannot be null")
|
||||
|
||||
if (!useBrowser) {
|
||||
appCtx.startActivity<VerificationCodeActivity> {
|
||||
putExtra("imageUrl", url)
|
||||
putExtra("sourceOrigin", source.getKey())
|
||||
putExtra("sourceName", source.getTag())
|
||||
}
|
||||
} else {
|
||||
startBrowser(source, url, title, true)
|
||||
}
|
||||
val key = getKey(source)
|
||||
CacheManager.delete(key)
|
||||
|
||||
var waitUserInput = false
|
||||
while(CacheManager.get(key) == null) {
|
||||
if (!waitUserInput) {
|
||||
AppLog.putDebug("等待返回验证结果...")
|
||||
waitUserInput = true
|
||||
}
|
||||
if (!useBrowser) {
|
||||
appCtx.startActivity<VerificationCodeActivity> {
|
||||
putExtra("imageUrl", url)
|
||||
putExtra("sourceOrigin", source.getKey())
|
||||
putExtra("sourceName", source.getTag())
|
||||
IntentData.put(key, Thread.currentThread())
|
||||
}
|
||||
CacheManager.get(key)!!.let {
|
||||
it.ifBlank {
|
||||
throw NoStackTraceException("验证结果为空")
|
||||
}
|
||||
} else {
|
||||
startBrowser(source, url, title, true)
|
||||
}
|
||||
|
||||
var waitUserInput = false
|
||||
while (CacheManager.get(key) == null) {
|
||||
if (!waitUserInput) {
|
||||
AppLog.putDebug("等待返回验证结果...")
|
||||
waitUserInput = true
|
||||
}
|
||||
}
|
||||
LockSupport.parkNanos(this, waitTime)
|
||||
}
|
||||
|
||||
return CacheManager.get(key)!!.let {
|
||||
it.ifBlank {
|
||||
throw NoStackTraceException("验证结果为空")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动内置浏览器
|
||||
@param saveResult 保存网页源代码到数据库
|
||||
* @param saveResult 保存网页源代码到数据库
|
||||
*/
|
||||
fun startBrowser(source: BaseSource?, url: String, title: String, saveResult: Boolean? = false) {
|
||||
fun startBrowser(
|
||||
source: BaseSource?,
|
||||
url: String,
|
||||
title: String,
|
||||
saveResult: Boolean? = false
|
||||
) {
|
||||
source ?: throw NoStackTraceException("startBrowser parameter source cannot be null")
|
||||
key = "${source.getKey()}_verificationResult"
|
||||
val key = getKey(source)
|
||||
appCtx.startActivity<WebViewActivity> {
|
||||
putExtra("title", title)
|
||||
putExtra("url", url)
|
||||
@ -64,10 +82,14 @@ object SourceVerificationHelp {
|
||||
putExtra("sourceName", source.getTag())
|
||||
putExtra("sourceVerificationEnable", saveResult)
|
||||
IntentData.put(url, source.getHeaderMap(true))
|
||||
IntentData.put(key, Thread.currentThread())
|
||||
}
|
||||
}
|
||||
|
||||
fun checkResult() {
|
||||
|
||||
fun checkResult(key: String) {
|
||||
CacheManager.get(key) ?: CacheManager.putMemory(key, "")
|
||||
val thread = IntentData.get<Thread>(key)
|
||||
LockSupport.unpark(thread)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -56,20 +56,20 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification
|
||||
setLayout(1f, ViewGroup.LayoutParams.WRAP_CONTENT)
|
||||
}
|
||||
|
||||
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
|
||||
private var sourceOrigin: String? = null
|
||||
private var key = ""
|
||||
|
||||
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?): Unit = binding.run {
|
||||
initMenu()
|
||||
binding.run {
|
||||
toolBar.setBackgroundColor(primaryColor)
|
||||
arguments?.let { arguments ->
|
||||
toolBar.subtitle = arguments.getString("sourceName")
|
||||
val sourceOrigin = arguments.getString("sourceOrigin")
|
||||
arguments.getString("imageUrl")?.let { imageUrl ->
|
||||
loadImage(imageUrl, sourceOrigin)
|
||||
verificationCodeImageView.setOnClickListener {
|
||||
showDialogFragment(PhotoDialog(imageUrl, sourceOrigin))
|
||||
}
|
||||
}
|
||||
}
|
||||
val arguments = arguments ?: return@run
|
||||
toolBar.setBackgroundColor(primaryColor)
|
||||
toolBar.subtitle = arguments.getString("sourceName")
|
||||
sourceOrigin = arguments.getString("sourceOrigin")
|
||||
key = SourceVerificationHelp.getKey(sourceOrigin!!)
|
||||
val imageUrl = arguments.getString("imageUrl") ?: return@run
|
||||
loadImage(imageUrl, sourceOrigin)
|
||||
verificationCodeImageView.setOnClickListener {
|
||||
showDialogFragment(PhotoDialog(imageUrl, sourceOrigin))
|
||||
}
|
||||
}
|
||||
|
||||
@ -118,20 +118,16 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification
|
||||
override fun onMenuItemClick(item: MenuItem): Boolean {
|
||||
when (item.itemId) {
|
||||
R.id.menu_ok -> {
|
||||
val sourceOrigin = arguments?.getString("sourceOrigin")
|
||||
val key = "${sourceOrigin}_verificationResult"
|
||||
val verificationCode = binding.verificationCode.text.toString()
|
||||
verificationCode.let {
|
||||
CacheManager.putMemory(key, it)
|
||||
dismiss()
|
||||
}
|
||||
CacheManager.putMemory(key, verificationCode)
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
SourceVerificationHelp.checkResult()
|
||||
SourceVerificationHelp.checkResult(key)
|
||||
super.onDestroy()
|
||||
activity?.finish()
|
||||
}
|
||||
|
@ -172,8 +172,12 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
|
||||
return super.onKeyUp(keyCode, event)
|
||||
}
|
||||
|
||||
override fun finish() {
|
||||
SourceVerificationHelp.checkResult(viewModel.key)
|
||||
super.finish()
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
SourceVerificationHelp.checkResult()
|
||||
super.onDestroy()
|
||||
binding.webView.destroy()
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ import io.legado.app.help.CacheManager
|
||||
import io.legado.app.help.IntentData
|
||||
import io.legado.app.help.http.newCallResponseBody
|
||||
import io.legado.app.help.http.okHttpClient
|
||||
import io.legado.app.help.source.SourceVerificationHelp
|
||||
import io.legado.app.model.analyzeRule.AnalyzeUrl
|
||||
import io.legado.app.utils.DocumentUtils
|
||||
import io.legado.app.utils.FileUtils
|
||||
@ -30,6 +31,7 @@ class WebViewModel(application: Application) : BaseViewModel(application) {
|
||||
val headerMap: HashMap<String, String> = hashMapOf()
|
||||
var sourceVerificationEnable: Boolean = false
|
||||
var sourceOrigin: String = ""
|
||||
var key = ""
|
||||
|
||||
fun initData(
|
||||
intent: Intent,
|
||||
@ -39,6 +41,7 @@ class WebViewModel(application: Application) : BaseViewModel(application) {
|
||||
val url = intent.getStringExtra("url")
|
||||
?: throw NoStackTraceException("url不能为空")
|
||||
sourceOrigin = intent.getStringExtra("sourceOrigin") ?: ""
|
||||
key = SourceVerificationHelp.getKey(sourceOrigin)
|
||||
sourceVerificationEnable = intent.getBooleanExtra("sourceVerificationEnable", false)
|
||||
val headerMapF = IntentData.get<Map<String, String>>(url)
|
||||
val analyzeUrl = AnalyzeUrl(url, headerMapF = headerMapF)
|
||||
|
Loading…
Reference in New Issue
Block a user