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.base.VMBaseActivity
import io.legado.app.constant.AppConst
import io.legado.app.constant.AppConst.imagePathKey
import io.legado.app.databinding.ActivityWebViewBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.help.http.CookieStore
import io.legado.app.help.source.SourceVerificationHelp
import io.legado.app.lib.dialogs.SelectItem
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.model.Download
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 viewModel by viewModels<WebViewModel>()
private val imagePathKey = "imagePath"
private var customWebViewCallback: WebChromeClient.CustomViewCallback? = null
private var webPic: String? = null
private var isCloudflareChallenge = false
@@ -182,8 +183,18 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
if (hitTestResult.type == WebView.HitTestResult.IMAGE_TYPE ||
hitTestResult.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE
) {
hitTestResult.extra?.let {
saveImage(it)
hitTestResult.extra?.let { webPic ->
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
}
}
@@ -2,13 +2,12 @@ package io.legado.app.ui.browser
import android.app.Application
import android.content.Intent
import android.net.Uri
import android.util.Base64
import android.webkit.URLUtil
import android.webkit.WebView
import androidx.documentfile.provider.DocumentFile
import io.legado.app.base.BaseViewModel
import io.legado.app.constant.AppConst
import io.legado.app.constant.AppConst.imagePathKey
import io.legado.app.constant.SourceType
import io.legado.app.data.appDb
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.SourceVerificationHelp
import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.DocumentUtils
import io.legado.app.utils.FileUtils
import io.legado.app.utils.isContentScheme
import io.legado.app.utils.ACache
import io.legado.app.utils.FileDoc
import io.legado.app.utils.createFileIfNotExist
import io.legado.app.utils.openOutputStream
import io.legado.app.utils.printOnDebug
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.writeBytes
import org.apache.commons.text.StringEscapeUtils
import java.io.File
import java.util.Date
class WebViewModel(application: Application) : BaseViewModel(application) {
@@ -70,19 +68,15 @@ class WebViewModel(application: Application) : BaseViewModel(application) {
webPic ?: return
execute {
val fileName = "${AppConst.fileNameFormat.format(Date(System.currentTimeMillis()))}.jpg"
webData2bitmap(webPic)?.let { biteArray ->
if (path.isContentScheme()) {
val uri = Uri.parse(path)
DocumentFile.fromTreeUri(context, uri)?.let { doc ->
DocumentUtils.createFileIfNotExist(doc, fileName)
?.writeBytes(context, biteArray)
}
} else {
val file = FileUtils.createFileIfNotExist(File(path), fileName)
file.writeBytes(biteArray)
webData2bitmap(webPic)?.let { byteArray ->
val fileDoc = FileDoc.fromDir(path)
val picFile = fileDoc.createFileIfNotExist(fileName)
picFile.openOutputStream().getOrThrow().use {
it.write(byteArray)
}
} ?: throw Throwable("NULL")
}.onError {
ACache.get().remove(imagePathKey)
context.toastOnUi("保存图片失败:${it.localizedMessage}")
}.onSuccess {
context.toastOnUi("保存成功")
@@ -10,6 +10,7 @@ import androidx.lifecycle.viewModelScope
import com.script.rhino.runScriptWithContext
import io.legado.app.base.BaseViewModel
import io.legado.app.constant.AppConst
import io.legado.app.constant.AppConst.imagePathKey
import io.legado.app.data.appDb
import io.legado.app.data.entities.RssArticle
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.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.rss.Rss
import io.legado.app.utils.ACache
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.writeBytes
import kotlinx.coroutines.Dispatchers.IO
@@ -177,6 +179,7 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application) {
val byteArray = webData2bitmap(webPic) ?: throw NoStackTraceException("NULL")
uri.writeBytes(context, fileName, byteArray)
}.onError {
ACache.get().remove(imagePathKey)
context.toastOnUi("保存图片失败:${it.localizedMessage}")
}.onSuccess {
context.toastOnUi("保存成功")