Merge remote-tracking branch 'origin/master'
This commit is contained in:
+1
-1
@@ -160,7 +160,7 @@ dependencies {
|
|||||||
implementation('androidx.core:core-ktx:1.10.1')
|
implementation('androidx.core:core-ktx:1.10.1')
|
||||||
implementation('androidx.appcompat:appcompat:1.6.1')
|
implementation('androidx.appcompat:appcompat:1.6.1')
|
||||||
implementation('androidx.activity:activity-ktx:1.7.2')
|
implementation('androidx.activity:activity-ktx:1.7.2')
|
||||||
implementation('androidx.fragment:fragment-ktx:1.5.7')
|
implementation('androidx.fragment:fragment-ktx:1.6.0')
|
||||||
implementation('androidx.preference:preference-ktx:1.2.0')
|
implementation('androidx.preference:preference-ktx:1.2.0')
|
||||||
implementation('androidx.constraintlayout:constraintlayout:2.1.4')
|
implementation('androidx.constraintlayout:constraintlayout:2.1.4')
|
||||||
implementation('androidx.swiperefreshlayout:swiperefreshlayout:1.1.0')
|
implementation('androidx.swiperefreshlayout:swiperefreshlayout:1.1.0')
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
{"x86":"86a6007bc94a30af4bc61789d28a8f00","armeabi-v7a":"309165f6aac13e01023448a22e9495f2","x86_64":"2ff1e1f490daf7ed535c081807661f7d","arm64-v8a":"722ae9a6b64c1643f5b9db41509342e5","version":"114.0.5735.57"}
|
{"x86":"46d237d466eddce29196b3f9a71aa23a","armeabi-v7a":"9507ec16a4a3141c4cfd50bec40cdb33","x86_64":"fad87777baadfee3cbc4bd6217519283","arm64-v8a":"68790ba327b8c180e206bd7c61f8254d","version":"114.0.5735.60"}
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
* 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
|
* 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
|
||||||
|
|
||||||
**2023/06/11**
|
**2023/06/11**
|
||||||
|
* 更新cronet: 114.0.5735.60
|
||||||
|
|
||||||
* 修复长按菜单全文搜索结果不全或无结果问题
|
* 修复长按菜单全文搜索结果不全或无结果问题
|
||||||
* 优化全文搜索速度
|
* 优化全文搜索速度
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ abstract class RecyclerAdapter<ITEM, VB : ViewBinding>(protected val context: Co
|
|||||||
onCurrentListChanged()
|
onCurrentListChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
handler.postDelayed(1000) {
|
handler.postDelayed(500) {
|
||||||
if (diffJob?.isCompleted == false) {
|
if (diffJob?.isCompleted == false) {
|
||||||
diffJob?.cancel()
|
diffJob?.cancel()
|
||||||
setItems(items)
|
setItems(items)
|
||||||
|
|||||||
@@ -727,15 +727,13 @@ interface JsExtensions : JsEncodeUtils {
|
|||||||
var qTTF = CacheManager.getQueryTTF(key)
|
var qTTF = CacheManager.getQueryTTF(key)
|
||||||
if (qTTF != null) return qTTF
|
if (qTTF != null) return qTTF
|
||||||
val font: ByteArray? = when {
|
val font: ByteArray? = when {
|
||||||
str.isAbsUrl() -> runBlocking {
|
str.isAbsUrl() -> {
|
||||||
var x = CacheManager.getByteArray(key)
|
var x = CacheManager.getByteArray(key)
|
||||||
if (x == null) {
|
if (x == null) {
|
||||||
x = AnalyzeUrl(str, source = getSource()).getByteArray()
|
x = AnalyzeUrl(str, source = getSource()).getByteArray()
|
||||||
x.let {
|
CacheManager.put(key, x)
|
||||||
CacheManager.put(key, it)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return@runBlocking x
|
x
|
||||||
}
|
}
|
||||||
|
|
||||||
str.isContentScheme() -> Uri.parse(str).readBytes(appCtx)
|
str.isContentScheme() -> Uri.parse(str).readBytes(appCtx)
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ val okHttpClient: OkHttpClient by lazy {
|
|||||||
})
|
})
|
||||||
.addNetworkInterceptor { chain ->
|
.addNetworkInterceptor { chain ->
|
||||||
var request = chain.request()
|
var request = chain.request()
|
||||||
val enableCookieJar = request.header(cookieJarHeader) != null
|
val enableCookieJar = request.header(cookieJarHeader) != null
|
||||||
|
|
||||||
if (enableCookieJar) {
|
if (enableCookieJar) {
|
||||||
val requestBuilder = request.newBuilder()
|
val requestBuilder = request.newBuilder()
|
||||||
|
|||||||
@@ -8,55 +8,73 @@ import io.legado.app.help.IntentData
|
|||||||
import io.legado.app.ui.association.VerificationCodeActivity
|
import io.legado.app.ui.association.VerificationCodeActivity
|
||||||
import io.legado.app.ui.browser.WebViewActivity
|
import io.legado.app.ui.browser.WebViewActivity
|
||||||
import io.legado.app.utils.startActivity
|
import io.legado.app.utils.startActivity
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
|
import java.util.concurrent.locks.LockSupport
|
||||||
|
import kotlin.time.Duration.Companion.minutes
|
||||||
|
|
||||||
|
|
||||||
object SourceVerificationHelp {
|
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 {
|
fun getVerificationResult(
|
||||||
source ?: throw NoStackTraceException("getVerificationResult parameter source cannot be null")
|
source: BaseSource?,
|
||||||
return runBlocking {
|
url: String,
|
||||||
key = "${source.getKey()}_verificationResult"
|
title: String,
|
||||||
CacheManager.delete(key)
|
useBrowser: Boolean
|
||||||
|
): String {
|
||||||
|
source
|
||||||
|
?: throw NoStackTraceException("getVerificationResult parameter source cannot be null")
|
||||||
|
|
||||||
if (!useBrowser) {
|
val key = getKey(source)
|
||||||
appCtx.startActivity<VerificationCodeActivity> {
|
CacheManager.delete(key)
|
||||||
putExtra("imageUrl", url)
|
|
||||||
putExtra("sourceOrigin", source.getKey())
|
|
||||||
putExtra("sourceName", source.getTag())
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
startBrowser(source, url, title, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
var waitUserInput = false
|
if (!useBrowser) {
|
||||||
while(CacheManager.get(key) == null) {
|
appCtx.startActivity<VerificationCodeActivity> {
|
||||||
if (!waitUserInput) {
|
putExtra("imageUrl", url)
|
||||||
AppLog.putDebug("等待返回验证结果...")
|
putExtra("sourceOrigin", source.getKey())
|
||||||
waitUserInput = true
|
putExtra("sourceName", source.getTag())
|
||||||
}
|
IntentData.put(key, Thread.currentThread())
|
||||||
}
|
}
|
||||||
CacheManager.get(key)!!.let {
|
} else {
|
||||||
it.ifBlank {
|
startBrowser(source, url, title, true)
|
||||||
throw NoStackTraceException("验证结果为空")
|
}
|
||||||
}
|
|
||||||
|
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")
|
source ?: throw NoStackTraceException("startBrowser parameter source cannot be null")
|
||||||
key = "${source.getKey()}_verificationResult"
|
val key = getKey(source)
|
||||||
appCtx.startActivity<WebViewActivity> {
|
appCtx.startActivity<WebViewActivity> {
|
||||||
putExtra("title", title)
|
putExtra("title", title)
|
||||||
putExtra("url", url)
|
putExtra("url", url)
|
||||||
@@ -64,10 +82,14 @@ object SourceVerificationHelp {
|
|||||||
putExtra("sourceName", source.getTag())
|
putExtra("sourceName", source.getTag())
|
||||||
putExtra("sourceVerificationEnable", saveResult)
|
putExtra("sourceVerificationEnable", saveResult)
|
||||||
IntentData.put(url, source.getHeaderMap(true))
|
IntentData.put(url, source.getHeaderMap(true))
|
||||||
|
IntentData.put(key, Thread.currentThread())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun checkResult() {
|
|
||||||
|
fun checkResult(key: String) {
|
||||||
CacheManager.get(key) ?: CacheManager.putMemory(key, "")
|
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)
|
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()
|
initMenu()
|
||||||
binding.run {
|
val arguments = arguments ?: return@run
|
||||||
toolBar.setBackgroundColor(primaryColor)
|
toolBar.setBackgroundColor(primaryColor)
|
||||||
arguments?.let { arguments ->
|
toolBar.subtitle = arguments.getString("sourceName")
|
||||||
toolBar.subtitle = arguments.getString("sourceName")
|
sourceOrigin = arguments.getString("sourceOrigin")
|
||||||
val sourceOrigin = arguments.getString("sourceOrigin")
|
key = SourceVerificationHelp.getKey(sourceOrigin!!)
|
||||||
arguments.getString("imageUrl")?.let { imageUrl ->
|
val imageUrl = arguments.getString("imageUrl") ?: return@run
|
||||||
loadImage(imageUrl, sourceOrigin)
|
loadImage(imageUrl, sourceOrigin)
|
||||||
verificationCodeImageView.setOnClickListener {
|
verificationCodeImageView.setOnClickListener {
|
||||||
showDialogFragment(PhotoDialog(imageUrl, sourceOrigin))
|
showDialogFragment(PhotoDialog(imageUrl, sourceOrigin))
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,20 +118,16 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification
|
|||||||
override fun onMenuItemClick(item: MenuItem): Boolean {
|
override fun onMenuItemClick(item: MenuItem): Boolean {
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.menu_ok -> {
|
R.id.menu_ok -> {
|
||||||
val sourceOrigin = arguments?.getString("sourceOrigin")
|
|
||||||
val key = "${sourceOrigin}_verificationResult"
|
|
||||||
val verificationCode = binding.verificationCode.text.toString()
|
val verificationCode = binding.verificationCode.text.toString()
|
||||||
verificationCode.let {
|
CacheManager.putMemory(key, verificationCode)
|
||||||
CacheManager.putMemory(key, it)
|
dismiss()
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
SourceVerificationHelp.checkResult()
|
SourceVerificationHelp.checkResult(key)
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
activity?.finish()
|
activity?.finish()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -172,8 +172,12 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
|
|||||||
return super.onKeyUp(keyCode, event)
|
return super.onKeyUp(keyCode, event)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun finish() {
|
||||||
|
SourceVerificationHelp.checkResult(viewModel.key)
|
||||||
|
super.finish()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
SourceVerificationHelp.checkResult()
|
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
binding.webView.destroy()
|
binding.webView.destroy()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import io.legado.app.help.CacheManager
|
|||||||
import io.legado.app.help.IntentData
|
import io.legado.app.help.IntentData
|
||||||
import io.legado.app.help.http.newCallResponseBody
|
import io.legado.app.help.http.newCallResponseBody
|
||||||
import io.legado.app.help.http.okHttpClient
|
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.model.analyzeRule.AnalyzeUrl
|
||||||
import io.legado.app.utils.DocumentUtils
|
import io.legado.app.utils.DocumentUtils
|
||||||
import io.legado.app.utils.FileUtils
|
import io.legado.app.utils.FileUtils
|
||||||
@@ -30,6 +31,7 @@ class WebViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
val headerMap: HashMap<String, String> = hashMapOf()
|
val headerMap: HashMap<String, String> = hashMapOf()
|
||||||
var sourceVerificationEnable: Boolean = false
|
var sourceVerificationEnable: Boolean = false
|
||||||
var sourceOrigin: String = ""
|
var sourceOrigin: String = ""
|
||||||
|
var key = ""
|
||||||
|
|
||||||
fun initData(
|
fun initData(
|
||||||
intent: Intent,
|
intent: Intent,
|
||||||
@@ -39,6 +41,7 @@ class WebViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
val url = intent.getStringExtra("url")
|
val url = intent.getStringExtra("url")
|
||||||
?: throw NoStackTraceException("url不能为空")
|
?: throw NoStackTraceException("url不能为空")
|
||||||
sourceOrigin = intent.getStringExtra("sourceOrigin") ?: ""
|
sourceOrigin = intent.getStringExtra("sourceOrigin") ?: ""
|
||||||
|
key = SourceVerificationHelp.getKey(sourceOrigin)
|
||||||
sourceVerificationEnable = intent.getBooleanExtra("sourceVerificationEnable", false)
|
sourceVerificationEnable = intent.getBooleanExtra("sourceVerificationEnable", false)
|
||||||
val headerMapF = IntentData.get<Map<String, String>>(url)
|
val headerMapF = IntentData.get<Map<String, String>>(url)
|
||||||
val analyzeUrl = AnalyzeUrl(url, headerMapF = headerMapF)
|
val analyzeUrl = AnalyzeUrl(url, headerMapF = headerMapF)
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ buildscript {
|
|||||||
ext{
|
ext{
|
||||||
compile_sdk_version = 33
|
compile_sdk_version = 33
|
||||||
build_tool_version = '33.0.1'
|
build_tool_version = '33.0.1'
|
||||||
kotlin_version = '1.8.21'
|
kotlin_version = '1.8.22'
|
||||||
agp_version = '8.0.2'
|
agp_version = '8.0.2'
|
||||||
//exoplayer_version = '2.18.6'
|
//exoplayer_version = '2.18.6'
|
||||||
media3_version = "1.0.2"
|
media3_version = "1.0.2"
|
||||||
|
|||||||
+1
-1
@@ -41,7 +41,7 @@ android.defaults.buildfeatures.shaders=false
|
|||||||
# and none from the library's dependencies, thereby reducing the size of the R class for that library.
|
# and none from the library's dependencies, thereby reducing the size of the R class for that library.
|
||||||
android.nonTransitiveRClass=true
|
android.nonTransitiveRClass=true
|
||||||
# https://chromiumdash.appspot.com/releases?platform=Android
|
# https://chromiumdash.appspot.com/releases?platform=Android
|
||||||
CronetVersion=114.0.5735.57
|
CronetVersion=114.0.5735.60
|
||||||
CronetMainVersion=114.0.0.0
|
CronetMainVersion=114.0.0.0
|
||||||
android.injected.testOnly=false
|
android.injected.testOnly=false
|
||||||
android.nonFinalResIds=true
|
android.nonFinalResIds=true
|
||||||
Reference in New Issue
Block a user