From b589d0bf1edcfa28f3b570ac42d3e7708801b3de Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Mon, 12 Jun 2023 15:52:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/help/source/SourceVerificationHelp.kt | 88 ++++++++++++------- .../ui/association/VerificationCodeDialog.kt | 36 ++++---- .../legado/app/ui/browser/WebViewActivity.kt | 6 +- .../io/legado/app/ui/browser/WebViewModel.kt | 3 + 4 files changed, 79 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt b/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt index 908ad1a1f..432fcd081 100644 --- a/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt +++ b/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt @@ -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 { - 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 { + 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 { 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(key) + LockSupport.unpark(thread) } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt b/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt index a8d9af42b..9d5de7641 100644 --- a/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt @@ -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() } diff --git a/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt b/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt index 40598e232..881ddc6ab 100644 --- a/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt +++ b/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt @@ -172,8 +172,12 @@ class WebViewActivity : VMBaseActivity() { return super.onKeyUp(keyCode, event) } + override fun finish() { + SourceVerificationHelp.checkResult(viewModel.key) + super.finish() + } + override fun onDestroy() { - SourceVerificationHelp.checkResult() super.onDestroy() binding.webView.destroy() } diff --git a/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt b/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt index 3ddec4f49..7c8f6f77b 100644 --- a/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt @@ -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 = 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>(url) val analyzeUrl = AnalyzeUrl(url, headerMapF = headerMapF)