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