diff --git a/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt b/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt index 1b96bb2a8..a271f4ae7 100644 --- a/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt +++ b/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt @@ -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() { override val binding by viewBinding(ActivityWebViewBinding::inflate) override val viewModel by viewModels() - 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() { 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 } } diff --git a/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt b/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt index e7a359ddc..202707c05 100644 --- a/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt @@ -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("保存成功") diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt index aa4e70f31..0521afdc4 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt @@ -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("保存成功")