This commit is contained in:
Horis
2025-09-01 22:02:49 +08:00
parent 8c9edcfbda
commit b10ddc59f7
3 changed files with 28 additions and 20 deletions
@@ -22,12 +22,14 @@ import androidx.core.view.size
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.VMBaseActivity import io.legado.app.base.VMBaseActivity
import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst
import io.legado.app.constant.AppConst.imagePathKey
import io.legado.app.databinding.ActivityWebViewBinding import io.legado.app.databinding.ActivityWebViewBinding
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.help.http.CookieStore import io.legado.app.help.http.CookieStore
import io.legado.app.help.source.SourceVerificationHelp import io.legado.app.help.source.SourceVerificationHelp
import io.legado.app.lib.dialogs.SelectItem import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
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.Download import io.legado.app.model.Download
import io.legado.app.ui.association.OnLineImportActivity import io.legado.app.ui.association.OnLineImportActivity
@@ -51,7 +53,6 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
override val binding by viewBinding(ActivityWebViewBinding::inflate) override val binding by viewBinding(ActivityWebViewBinding::inflate)
override val viewModel by viewModels<WebViewModel>() override val viewModel by viewModels<WebViewModel>()
private val imagePathKey = "imagePath"
private var customWebViewCallback: WebChromeClient.CustomViewCallback? = null private var customWebViewCallback: WebChromeClient.CustomViewCallback? = null
private var webPic: String? = null private var webPic: String? = null
private var isCloudflareChallenge = false private var isCloudflareChallenge = false
@@ -182,8 +183,18 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
if (hitTestResult.type == WebView.HitTestResult.IMAGE_TYPE || if (hitTestResult.type == WebView.HitTestResult.IMAGE_TYPE ||
hitTestResult.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE hitTestResult.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE
) { ) {
hitTestResult.extra?.let { hitTestResult.extra?.let { webPic ->
saveImage(it) selector(
arrayListOf(
SelectItem(getString(R.string.action_save), "save"),
SelectItem(getString(R.string.select_folder), "selectFolder")
)
) { _, charSequence, _ ->
when (charSequence.value) {
"save" -> saveImage(webPic)
"selectFolder" -> selectSaveFolder()
}
}
return@setOnLongClickListener true return@setOnLongClickListener true
} }
} }
@@ -2,13 +2,12 @@ package io.legado.app.ui.browser
import android.app.Application import android.app.Application
import android.content.Intent import android.content.Intent
import android.net.Uri
import android.util.Base64 import android.util.Base64
import android.webkit.URLUtil import android.webkit.URLUtil
import android.webkit.WebView import android.webkit.WebView
import androidx.documentfile.provider.DocumentFile
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst
import io.legado.app.constant.AppConst.imagePathKey
import io.legado.app.constant.SourceType import io.legado.app.constant.SourceType
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
@@ -17,14 +16,13 @@ import io.legado.app.help.http.okHttpClient
import io.legado.app.help.source.SourceHelp import io.legado.app.help.source.SourceHelp
import io.legado.app.help.source.SourceVerificationHelp 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.ACache
import io.legado.app.utils.FileUtils import io.legado.app.utils.FileDoc
import io.legado.app.utils.isContentScheme import io.legado.app.utils.createFileIfNotExist
import io.legado.app.utils.openOutputStream
import io.legado.app.utils.printOnDebug import io.legado.app.utils.printOnDebug
import io.legado.app.utils.toastOnUi import io.legado.app.utils.toastOnUi
import io.legado.app.utils.writeBytes
import org.apache.commons.text.StringEscapeUtils import org.apache.commons.text.StringEscapeUtils
import java.io.File
import java.util.Date import java.util.Date
class WebViewModel(application: Application) : BaseViewModel(application) { class WebViewModel(application: Application) : BaseViewModel(application) {
@@ -70,19 +68,15 @@ class WebViewModel(application: Application) : BaseViewModel(application) {
webPic ?: return webPic ?: return
execute { execute {
val fileName = "${AppConst.fileNameFormat.format(Date(System.currentTimeMillis()))}.jpg" val fileName = "${AppConst.fileNameFormat.format(Date(System.currentTimeMillis()))}.jpg"
webData2bitmap(webPic)?.let { biteArray -> webData2bitmap(webPic)?.let { byteArray ->
if (path.isContentScheme()) { val fileDoc = FileDoc.fromDir(path)
val uri = Uri.parse(path) val picFile = fileDoc.createFileIfNotExist(fileName)
DocumentFile.fromTreeUri(context, uri)?.let { doc -> picFile.openOutputStream().getOrThrow().use {
DocumentUtils.createFileIfNotExist(doc, fileName) it.write(byteArray)
?.writeBytes(context, biteArray)
}
} else {
val file = FileUtils.createFileIfNotExist(File(path), fileName)
file.writeBytes(biteArray)
} }
} ?: throw Throwable("NULL") } ?: throw Throwable("NULL")
}.onError { }.onError {
ACache.get().remove(imagePathKey)
context.toastOnUi("保存图片失败:${it.localizedMessage}") context.toastOnUi("保存图片失败:${it.localizedMessage}")
}.onSuccess { }.onSuccess {
context.toastOnUi("保存成功") context.toastOnUi("保存成功")
@@ -10,6 +10,7 @@ import androidx.lifecycle.viewModelScope
import com.script.rhino.runScriptWithContext import com.script.rhino.runScriptWithContext
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst
import io.legado.app.constant.AppConst.imagePathKey
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.data.entities.RssArticle import io.legado.app.data.entities.RssArticle
import io.legado.app.data.entities.RssSource import io.legado.app.data.entities.RssSource
@@ -20,6 +21,7 @@ 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.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.rss.Rss import io.legado.app.model.rss.Rss
import io.legado.app.utils.ACache
import io.legado.app.utils.toastOnUi import io.legado.app.utils.toastOnUi
import io.legado.app.utils.writeBytes import io.legado.app.utils.writeBytes
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
@@ -177,6 +179,7 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application) {
val byteArray = webData2bitmap(webPic) ?: throw NoStackTraceException("NULL") val byteArray = webData2bitmap(webPic) ?: throw NoStackTraceException("NULL")
uri.writeBytes(context, fileName, byteArray) uri.writeBytes(context, fileName, byteArray)
}.onError { }.onError {
ACache.get().remove(imagePathKey)
context.toastOnUi("保存图片失败:${it.localizedMessage}") context.toastOnUi("保存图片失败:${it.localizedMessage}")
}.onSuccess { }.onSuccess {
context.toastOnUi("保存成功") context.toastOnUi("保存成功")