pull/2121/head
kunfei 2 years ago
parent 1bcbae9de7
commit b8eedd2928
  1. 8
      app/src/main/java/io/legado/app/constant/AppConst.kt
  2. 28
      app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
  3. 5
      app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt
  4. 1
      app/src/main/java/io/legado/app/ui/document/HandleFileActivity.kt
  5. 11
      app/src/main/java/io/legado/app/ui/document/HandleFileContract.kt
  6. 30
      app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt

@ -50,15 +50,17 @@ object AppConst {
const val notificationIdDownload = -1122395 const val notificationIdDownload = -1122395
const val notificationIdCheckSource = -1122395 const val notificationIdCheckSource = -1122395
const val imagePathKey = "imagePath"
val menuViewNames = arrayOf( val menuViewNames = arrayOf(
"com.android.internal.view.menu.ListMenuItemView", "com.android.internal.view.menu.ListMenuItemView",
"androidx.appcompat.view.menu.ListMenuItemView" "androidx.appcompat.view.menu.ListMenuItemView"
) )
@SuppressLint("PrivateResource") @SuppressLint("PrivateResource")
val sysElevation = val sysElevation = appCtx.resources
appCtx.resources.getDimension(com.google.android.material.R.dimen.design_appbar_elevation) .getDimension(com.google.android.material.R.dimen.design_appbar_elevation)
.toInt() .toInt()
val androidId: String by lazy { val androidId: String by lazy {
Settings.System.getString(appCtx.contentResolver, Settings.Secure.ANDROID_ID) ?: "null" Settings.System.getString(appCtx.contentResolver, Settings.Secure.ANDROID_ID) ?: "null"

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.* import android.view.*
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
@ -14,10 +15,7 @@ import androidx.core.view.size
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
import io.legado.app.BuildConfig import io.legado.app.BuildConfig
import io.legado.app.R import io.legado.app.R
import io.legado.app.constant.BookType import io.legado.app.constant.*
import io.legado.app.constant.EventBus
import io.legado.app.constant.PreferKey
import io.legado.app.constant.Status
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookChapter
@ -58,6 +56,7 @@ import io.legado.app.ui.book.source.edit.BookSourceEditActivity
import io.legado.app.ui.book.toc.TocActivityResult import io.legado.app.ui.book.toc.TocActivityResult
import io.legado.app.ui.browser.WebViewActivity import io.legado.app.ui.browser.WebViewActivity
import io.legado.app.ui.dict.DictDialog import io.legado.app.ui.dict.DictDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.login.SourceLoginActivity import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.ui.replace.ReplaceRuleActivity import io.legado.app.ui.replace.ReplaceRuleActivity
import io.legado.app.ui.replace.edit.ReplaceEditActivity import io.legado.app.ui.replace.edit.ReplaceEditActivity
@ -129,6 +128,12 @@ class ReadBookActivity : BaseReadBookActivity(),
} }
} }
} }
private val selectImageDir = registerForActivityResult(HandleFileContract()) {
it.uri?.let { uri ->
ACache.get().put(AppConst.imagePathKey, uri.toString())
viewModel.saveImage(it.value, uri)
}
}
private var menu: Menu? = null private var menu: Menu? = null
private var autoPageJob: Job? = null private var autoPageJob: Job? = null
private var backupJob: Job? = null private var backupJob: Job? = null
@ -1001,13 +1006,26 @@ class ReadBookActivity : BaseReadBookActivity(),
popupAction.setItems( popupAction.setItems(
listOf( listOf(
SelectItem(getString(R.string.show), "show"), SelectItem(getString(R.string.show), "show"),
SelectItem(getString(R.string.refresh), "refresh") SelectItem(getString(R.string.refresh), "refresh"),
SelectItem(getString(R.string.action_save), "save"),
SelectItem(getString(R.string.select_folder), "selectFolder")
) )
) )
popupAction.onActionClick = { popupAction.onActionClick = {
when (it) { when (it) {
"show" -> showDialogFragment(PhotoDialog(src)) "show" -> showDialogFragment(PhotoDialog(src))
"refresh" -> viewModel.refreshImage(src) "refresh" -> viewModel.refreshImage(src)
"save" -> {
val path = ACache.get().getAsString(AppConst.imagePathKey)
if (path.isNullOrEmpty()) {
selectImageDir.launch {
value = src
}
} else {
viewModel.saveImage(src, Uri.parse(path))
}
}
"selectFolder" -> selectImageDir.launch()
} }
popupAction.dismiss() popupAction.dismiss()
} }

@ -2,6 +2,7 @@ package io.legado.app.ui.book.read
import android.app.Application import android.app.Application
import android.content.Intent import android.content.Intent
import android.net.Uri
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import io.legado.app.R import io.legado.app.R
@ -425,6 +426,10 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
} }
} }
fun saveImage(src: String?, uri: Uri) {
}
/** /**
* 替换规则变化 * 替换规则变化
*/ */

@ -223,6 +223,7 @@ class HandleFileActivity :
} }
} }
} else { } else {
data.putExtra("value", intent.getStringExtra("value"))
setResult(RESULT_OK, data) setResult(RESULT_OK, data)
finish() finish()
} }

@ -32,15 +32,16 @@ class HandleFileContract :
intent.putExtra("fileKey", IntentData.put(fileData.second)) intent.putExtra("fileKey", IntentData.put(fileData.second))
intent.putExtra("contentType", fileData.third) intent.putExtra("contentType", fileData.third)
} }
intent.putExtra("value", it.value)
} }
return intent return intent
} }
override fun parseResult(resultCode: Int, intent: Intent?): Result { override fun parseResult(resultCode: Int, intent: Intent?): Result {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
return Result(intent?.data, requestCode) return Result(intent?.data, requestCode, intent?.getStringExtra("value"))
} }
return Result(null, requestCode) return Result(null, requestCode, intent?.getStringExtra("value"))
} }
companion object { companion object {
@ -57,12 +58,14 @@ class HandleFileContract :
var allowExtensions: Array<String> = arrayOf(), var allowExtensions: Array<String> = arrayOf(),
var otherActions: ArrayList<SelectItem<Int>>? = null, var otherActions: ArrayList<SelectItem<Int>>? = null,
var fileData: Triple<String, Any, String>? = null, var fileData: Triple<String, Any, String>? = null,
var requestCode: Int = 0 var requestCode: Int = 0,
var value: String? = null
) )
data class Result( data class Result(
val uri: Uri?, val uri: Uri?,
val requestCode: Int val requestCode: Int,
val value: String?
) )
} }

@ -14,9 +14,11 @@ import androidx.webkit.WebViewFeature
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.ActivityRssReadBinding import io.legado.app.databinding.ActivityRssReadBinding
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.lib.dialogs.SelectItem import io.legado.app.lib.dialogs.SelectItem
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.lib.theme.primaryTextColor import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.model.Download import io.legado.app.model.Download
@ -38,15 +40,13 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
override val binding by viewBinding(ActivityRssReadBinding::inflate) override val binding by viewBinding(ActivityRssReadBinding::inflate)
override val viewModel by viewModels<ReadRssViewModel>() override val viewModel by viewModels<ReadRssViewModel>()
private val imagePathKey = "imagePath"
private var starMenuItem: MenuItem? = null private var starMenuItem: MenuItem? = null
private var ttsMenuItem: MenuItem? = null private var ttsMenuItem: MenuItem? = null
private var customWebViewCallback: WebChromeClient.CustomViewCallback? = null private var customWebViewCallback: WebChromeClient.CustomViewCallback? = null
private var webPic: String? = null private val selectImageDir = registerForActivityResult(HandleFileContract()) {
private val saveImage = registerForActivityResult(HandleFileContract()) {
it.uri?.let { uri -> it.uri?.let { uri ->
ACache.get().put(imagePathKey, uri.toString()) ACache.get().put(imagePathKey, uri.toString())
viewModel.saveImage(webPic, uri) viewModel.saveImage(it.value, uri)
} }
} }
@ -135,8 +135,18 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
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, i ->
when (charSequence.value) {
"save" -> saveImage(webPic)
"selectFolder" -> selectSaveFolder(null)
}
}
return@setOnLongClickListener true return@setOnLongClickListener true
} }
} }
@ -153,23 +163,23 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
} }
private fun saveImage(webPic: String) { private fun saveImage(webPic: String) {
this.webPic = webPic
val path = ACache.get().getAsString(imagePathKey) val path = ACache.get().getAsString(imagePathKey)
if (path.isNullOrEmpty()) { if (path.isNullOrEmpty()) {
selectSaveFolder() selectSaveFolder(webPic)
} else { } else {
viewModel.saveImage(webPic, Uri.parse(path)) viewModel.saveImage(webPic, Uri.parse(path))
} }
} }
private fun selectSaveFolder() { private fun selectSaveFolder(webPic: String?) {
val default = arrayListOf<SelectItem<Int>>() val default = arrayListOf<SelectItem<Int>>()
val path = ACache.get().getAsString(imagePathKey) val path = ACache.get().getAsString(imagePathKey)
if (!path.isNullOrEmpty()) { if (!path.isNullOrEmpty()) {
default.add(SelectItem(path, -1)) default.add(SelectItem(path, -1))
} }
saveImage.launch { selectImageDir.launch {
otherActions = default otherActions = default
value = webPic
} }
} }

Loading…
Cancel
Save