feat:添加验证码对话框

This commit is contained in:
Xwite
2022-05-04 15:46:37 +08:00
parent 229509bab5
commit 4249898c31
14 changed files with 238 additions and 0 deletions
@@ -15,11 +15,13 @@ import io.legado.app.help.http.*
import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.analyzeRule.QueryTTF
import io.legado.app.ui.association.VerificationCodeActivity
import io.legado.app.ui.browser.WebViewActivity
import io.legado.app.utils.*
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import org.jsoup.Connection
import org.jsoup.Jsoup
import splitties.init.appCtx
@@ -145,6 +147,34 @@ interface JsExtensions {
}
}
/**
* 打开验证码对话框,等待输入验证码
*/
fun getVerificationCode(imageUrl: String): String {
return runBlocking {
val key = "${getSource()?.getKey() ?: ""}_verificationCode"
CacheManager.delete(key)
appCtx.startActivity<VerificationCodeActivity> {
putExtra("imageUrl", imageUrl)
putExtra("sourceOrigin", getSource()?.getKey())
}
var waitUserInput: Boolean = false
while(CacheManager.get(key) == null) {
if (!waitUserInput) {
log("等待输入验证码...")
waitUserInput = true
}
}
CacheManager.get(key)!!.let {
if (it.isBlank()) {
throw NoStackTraceException("未输入验证码或者验证码为空")
} else {
it
}
}
}
}
/**
* 可从网络,本地文件(阅读私有缓存目录和书籍保存位置支持相对路径)导入JavaScript脚本
*/
@@ -0,0 +1,26 @@
package io.legado.app.ui.association
import android.os.Bundle
import io.legado.app.base.BaseActivity
import io.legado.app.databinding.ActivityTranslucenceBinding
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.viewbindingdelegate.viewBinding
/**
* 验证码
*/
class VerificationCodeActivity :
BaseActivity<ActivityTranslucenceBinding>() {
override val binding by viewBinding(ActivityTranslucenceBinding::inflate)
override fun onActivityCreated(savedInstanceState: Bundle?) {
intent.getStringExtra("imageUrl")?.let {
val sourceOrigin = intent.getStringExtra("sourceOrigin")
showDialogFragment(
VerificationCodeDialog(it, sourceOrigin)
)
} ?: finish()
}
}
@@ -0,0 +1,83 @@
package io.legado.app.ui.association
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.net.Uri
import com.bumptech.glide.request.RequestOptions
import io.legado.app.R
import io.legado.app.base.BaseDialogFragment
import io.legado.app.databinding.DialogVerificationCodeViewBinding
import io.legado.app.help.CacheManager
import io.legado.app.help.glide.ImageLoader
import io.legado.app.help.glide.OkHttpModelLoader
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.widget.dialog.PhotoDialog
import io.legado.app.utils.setLayout
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.viewbindingdelegate.viewBinding
//图片验证码输入对话框
class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification_code_view) {
constructor(imageUrl: String, sourceOrigin: String? = null) : this() {
arguments = Bundle().apply {
putString("sourceOrigin", sourceOrigin)
putString("imageUrl", imageUrl)
}
}
val binding by viewBinding(DialogVerificationCodeViewBinding::bind)
override fun onStart() {
super.onStart()
setLayout(1f, ViewGroup.LayoutParams.WRAP_CONTENT)
}
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
binding.run {
toolBar.setBackgroundColor(primaryColor)
val sourceOrigin = arguments?.getString("sourceOrigin")
val key = "${sourceOrigin ?: ""}_verificationCode"
arguments?.getString("imageUrl")?.let { imageUrl ->
ImageLoader.load(requireContext(), imageUrl).apply {
sourceOrigin?.let {
apply(
RequestOptions().set(
OkHttpModelLoader.sourceOriginOption,
it
)
)
}
}.error(R.drawable.image_loading_error)
.into(ivImage)
ivImage.setOnClickListener {
showDialogFragment(PhotoDialog(imageUrl, sourceOrigin))
}
ivImage.setOnLongClickListener {
showDialogFragment(PhotoDialog(imageUrl, sourceOrigin))
true
}
}
tvOk.setOnClickListener {
val verificationCode = binding.verificationCode.text.toString()
verificationCode?.let {
CacheManager.put(key, it)
dismiss()
}
}
tvCancel.setOnClickListener {
dismiss()
}
}
}
override fun onDestroy() {
val sourceOrigin = arguments?.getString("sourceOrigin")
val key = "${sourceOrigin ?: ""}_verificationCode"
CacheManager.get(key) ?: CacheManager.put(key, "")
super.onDestroy()
activity?.finish()
}
}