优化 #5386
This commit is contained in:
@@ -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("保存成功")
|
||||
|
||||
Reference in New Issue
Block a user