优化
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"UploadUrl": "http://sy.mgz6.cc/shuyuan,{\"method\":\"POST\",\"body\": {\"file\": \"fileRequest\"},\"type\": \"multipart/form-data\"}",
|
"uploadUrl": "http://sy.mgz6.cc/shuyuan,{\"method\":\"POST\",\"body\": {\"file\": \"fileRequest\"},\"type\": \"multipart/form-data\"}",
|
||||||
"DownloadUrlRule": "$.data@js:if (result == '') \n '' \n else \n 'http://shuyuan.mgz6.cc/shuyuan/' + result",
|
"downloadUrlRule": "$.data@js:if (result == '') \n '' \n else \n 'http://shuyuan.mgz6.cc/shuyuan/' + result",
|
||||||
"summary": "有效期2天"
|
"summary": "有效期2天"
|
||||||
}
|
}
|
||||||
@@ -10,7 +10,6 @@ import io.legado.app.help.SourceAnalyzer
|
|||||||
import io.legado.app.utils.*
|
import io.legado.app.utils.*
|
||||||
import kotlinx.parcelize.IgnoredOnParcel
|
import kotlinx.parcelize.IgnoredOnParcel
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
import splitties.init.appCtx
|
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@@ -98,7 +97,7 @@ data class BookSource(
|
|||||||
if (exploreUrl.startsWith("<js>", false)
|
if (exploreUrl.startsWith("<js>", false)
|
||||||
|| exploreUrl.startsWith("@js:", false)
|
|| exploreUrl.startsWith("@js:", false)
|
||||||
) {
|
) {
|
||||||
val aCache = ACache.get(appCtx, "explore")
|
val aCache = ACache.get("explore")
|
||||||
ruleStr = aCache.getAsString(bookSourceUrl) ?: ""
|
ruleStr = aCache.getAsString(bookSourceUrl) ?: ""
|
||||||
if (ruleStr.isBlank()) {
|
if (ruleStr.isBlank()) {
|
||||||
val jsStr = if (exploreUrl.startsWith("@")) {
|
val jsStr = if (exploreUrl.startsWith("@")) {
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import androidx.room.PrimaryKey
|
|||||||
import com.jayway.jsonpath.DocumentContext
|
import com.jayway.jsonpath.DocumentContext
|
||||||
import io.legado.app.utils.*
|
import io.legado.app.utils.*
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
import splitties.init.appCtx
|
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
@Entity(tableName = "rssSources", indices = [(Index(value = ["sourceUrl"], unique = false))])
|
@Entity(tableName = "rssSources", indices = [(Index(value = ["sourceUrl"], unique = false))])
|
||||||
@@ -121,7 +120,7 @@ data class RssSource(
|
|||||||
if (sortUrl?.startsWith("<js>", false) == true
|
if (sortUrl?.startsWith("<js>", false) == true
|
||||||
|| sortUrl?.startsWith("@js:", false) == true
|
|| sortUrl?.startsWith("@js:", false) == true
|
||||||
) {
|
) {
|
||||||
val aCache = ACache.get(appCtx, "rssSortUrl")
|
val aCache = ACache.get("rssSortUrl")
|
||||||
a = aCache.getAsString(sourceUrl) ?: ""
|
a = aCache.getAsString(sourceUrl) ?: ""
|
||||||
if (a.isBlank()) {
|
if (a.isBlank()) {
|
||||||
val jsStr = if (sortUrl!!.startsWith("@")) {
|
val jsStr = if (sortUrl!!.startsWith("@")) {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import io.legado.app.data.appDb
|
|||||||
import io.legado.app.data.entities.Cache
|
import io.legado.app.data.entities.Cache
|
||||||
import io.legado.app.model.analyzeRule.QueryTTF
|
import io.legado.app.model.analyzeRule.QueryTTF
|
||||||
import io.legado.app.utils.ACache
|
import io.legado.app.utils.ACache
|
||||||
import splitties.init.appCtx
|
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object CacheManager {
|
object CacheManager {
|
||||||
@@ -22,7 +21,7 @@ object CacheManager {
|
|||||||
if (saveTime == 0) 0 else System.currentTimeMillis() + saveTime * 1000
|
if (saveTime == 0) 0 else System.currentTimeMillis() + saveTime * 1000
|
||||||
when (value) {
|
when (value) {
|
||||||
is QueryTTF -> queryTTFMap[key] = Pair(deadline, value)
|
is QueryTTF -> queryTTFMap[key] = Pair(deadline, value)
|
||||||
is ByteArray -> ACache.get(appCtx).put(key, value, saveTime)
|
is ByteArray -> ACache.get().put(key, value, saveTime)
|
||||||
else -> {
|
else -> {
|
||||||
val cache = Cache(key, value.toString(), deadline)
|
val cache = Cache(key, value.toString(), deadline)
|
||||||
putMemory(key, value.toString())
|
putMemory(key, value.toString())
|
||||||
@@ -73,7 +72,7 @@ object CacheManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getByteArray(key: String): ByteArray? {
|
fun getByteArray(key: String): ByteArray? {
|
||||||
return ACache.get(appCtx).getAsBinary(key)
|
return ACache.get().getAsBinary(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getQueryTTF(key: String): QueryTTF? {
|
fun getQueryTTF(key: String): QueryTTF? {
|
||||||
@@ -87,16 +86,16 @@ object CacheManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun putFile(key: String, value: String, saveTime: Int = 0) {
|
fun putFile(key: String, value: String, saveTime: Int = 0) {
|
||||||
ACache.get(appCtx).put(key, value, saveTime)
|
ACache.get().put(key, value, saveTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getFile(key: String): String? {
|
fun getFile(key: String): String? {
|
||||||
return ACache.get(appCtx).getAsString(key)
|
return ACache.get().getAsString(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun delete(key: String) {
|
fun delete(key: String) {
|
||||||
appDb.cacheDao.delete(key)
|
appDb.cacheDao.delete(key)
|
||||||
deleteMemory(key)
|
deleteMemory(key)
|
||||||
ACache.get(appCtx).remove(key)
|
ACache.get().remove(key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,25 +3,27 @@ package io.legado.app.help
|
|||||||
import io.legado.app.exception.NoStackTraceException
|
import io.legado.app.exception.NoStackTraceException
|
||||||
import io.legado.app.model.analyzeRule.AnalyzeRule
|
import io.legado.app.model.analyzeRule.AnalyzeRule
|
||||||
import io.legado.app.model.analyzeRule.AnalyzeUrl
|
import io.legado.app.model.analyzeRule.AnalyzeUrl
|
||||||
import io.legado.app.utils.jsonPath
|
import io.legado.app.utils.ACache
|
||||||
import io.legado.app.utils.readString
|
import io.legado.app.utils.GSON
|
||||||
|
import io.legado.app.utils.fromJsonObject
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
|
@Suppress("MemberVisibilityCanBePrivate")
|
||||||
object DirectLinkUpload {
|
object DirectLinkUpload {
|
||||||
|
|
||||||
private const val uploadUrlKey = "directLinkUploadUrl"
|
const val ruleFileName = "directLinkUploadRule.json"
|
||||||
private const val downloadUrlRuleKey = "directLinkDownloadUrlRule"
|
|
||||||
private const val summaryKey = "directSummary"
|
|
||||||
|
|
||||||
@Throws(NoStackTraceException::class)
|
@Throws(NoStackTraceException::class)
|
||||||
suspend fun upLoad(fileName: String, file: Any, contentType: String): String {
|
suspend fun upLoad(fileName: String, file: Any, contentType: String): String {
|
||||||
val url = getUploadUrl()
|
val rule = defaultRule ?: getConfigRule()
|
||||||
if (url.isNullOrBlank()) {
|
rule ?: throw NoStackTraceException("直链上传规则未配置")
|
||||||
|
val url = rule.uploadUrl
|
||||||
|
if (url.isBlank()) {
|
||||||
throw NoStackTraceException("上传url未配置")
|
throw NoStackTraceException("上传url未配置")
|
||||||
}
|
}
|
||||||
val downloadUrlRule = getDownloadUrlRule()
|
val downloadUrlRule = rule.downloadUrlRule
|
||||||
if (downloadUrlRule.isNullOrBlank()) {
|
if (downloadUrlRule.isBlank()) {
|
||||||
throw NoStackTraceException("下载地址规则未配置")
|
throw NoStackTraceException("下载地址规则未配置")
|
||||||
}
|
}
|
||||||
val analyzeUrl = AnalyzeUrl(url)
|
val analyzeUrl = AnalyzeUrl(url)
|
||||||
@@ -34,49 +36,36 @@ object DirectLinkUpload {
|
|||||||
return downloadUrl
|
return downloadUrl
|
||||||
}
|
}
|
||||||
|
|
||||||
private val ruleDoc by lazy {
|
private val defaultRule: Rule? by lazy {
|
||||||
val json = String(
|
val json = String(
|
||||||
appCtx.assets.open("defaultData${File.separator}directLinkUpload.json")
|
appCtx.assets.open("defaultData${File.separator}directLinkUpload.json")
|
||||||
.readBytes()
|
.readBytes()
|
||||||
)
|
)
|
||||||
jsonPath.parse(json)
|
GSON.fromJsonObject<Rule>(json).getOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getUploadUrl(): String? {
|
fun getConfigRule(): Rule? {
|
||||||
return CacheManager.get(uploadUrlKey)
|
val json = ACache.get(cacheDir = false).getAsString(ruleFileName)
|
||||||
?: ruleDoc.readString("$.UploadUrl")
|
return GSON.fromJsonObject<Rule>(json).getOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun putUploadUrl(url: String) {
|
fun putConfigRule(uploadUrl: String, downloadUrlRule: String, summary: String?) {
|
||||||
CacheManager.put(uploadUrlKey, url)
|
val rule = Rule(uploadUrl, downloadUrlRule, summary)
|
||||||
|
ACache.get(cacheDir = false).put(ruleFileName, GSON.toJson(rule))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getDownloadUrlRule(): String? {
|
fun delConfigRule() {
|
||||||
return CacheManager.get(downloadUrlRuleKey)
|
ACache.get(cacheDir = false).remove(ruleFileName)
|
||||||
?: ruleDoc.readString("$.DownloadUrlRule")
|
|
||||||
}
|
|
||||||
|
|
||||||
fun putDownloadUrlRule(rule: String) {
|
|
||||||
CacheManager.put(downloadUrlRuleKey, rule)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getSummary(): String? {
|
fun getSummary(): String? {
|
||||||
return CacheManager.get(summaryKey)
|
return getConfigRule()?.summary
|
||||||
?: ruleDoc.readString("summary")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun putSummary(summary: String?) {
|
data class Rule(
|
||||||
if (summary != null) {
|
var uploadUrl: String,
|
||||||
CacheManager.put(summaryKey, summary)
|
var downloadUrlRule: String,
|
||||||
} else {
|
var summary: String?
|
||||||
CacheManager.delete(summaryKey)
|
)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun delete() {
|
|
||||||
CacheManager.delete(uploadUrlKey)
|
|
||||||
CacheManager.delete(downloadUrlRuleKey)
|
|
||||||
CacheManager.delete(summaryKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@ import io.legado.app.constant.AppLog
|
|||||||
import io.legado.app.constant.PreferKey
|
import io.legado.app.constant.PreferKey
|
||||||
import io.legado.app.data.appDb
|
import io.legado.app.data.appDb
|
||||||
import io.legado.app.help.AppWebDav
|
import io.legado.app.help.AppWebDav
|
||||||
|
import io.legado.app.help.DirectLinkUpload
|
||||||
import io.legado.app.help.config.LocalConfig
|
import io.legado.app.help.config.LocalConfig
|
||||||
import io.legado.app.help.config.ReadBookConfig
|
import io.legado.app.help.config.ReadBookConfig
|
||||||
import io.legado.app.help.config.ThemeConfig
|
import io.legado.app.help.config.ThemeConfig
|
||||||
@@ -41,6 +42,7 @@ object Backup {
|
|||||||
"txtTocRule.json",
|
"txtTocRule.json",
|
||||||
"httpTTS.json",
|
"httpTTS.json",
|
||||||
"keyboardAssists.json",
|
"keyboardAssists.json",
|
||||||
|
DirectLinkUpload.ruleFileName,
|
||||||
ReadBookConfig.configFileName,
|
ReadBookConfig.configFileName,
|
||||||
ReadBookConfig.shareConfigFileName,
|
ReadBookConfig.shareConfigFileName,
|
||||||
ThemeConfig.configFileName,
|
ThemeConfig.configFileName,
|
||||||
@@ -92,6 +94,10 @@ object Backup {
|
|||||||
FileUtils.createFileIfNotExist(backupPath + File.separator + ThemeConfig.configFileName)
|
FileUtils.createFileIfNotExist(backupPath + File.separator + ThemeConfig.configFileName)
|
||||||
.writeText(it)
|
.writeText(it)
|
||||||
}
|
}
|
||||||
|
DirectLinkUpload.getConfigRule()?.let {
|
||||||
|
FileUtils.createFileIfNotExist(backupPath + File.separator + DirectLinkUpload.ruleFileName)
|
||||||
|
.writeText(GSON.toJson(it))
|
||||||
|
}
|
||||||
Preferences.getSharedPreferences(appCtx, backupPath, "config")?.let { sp ->
|
Preferences.getSharedPreferences(appCtx, backupPath, "config")?.let { sp ->
|
||||||
val edit = sp.edit()
|
val edit = sp.edit()
|
||||||
appCtx.defaultSharedPreferences.all.forEach { (key, value) ->
|
appCtx.defaultSharedPreferences.all.forEach { (key, value) ->
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import io.legado.app.constant.EventBus
|
|||||||
import io.legado.app.constant.PreferKey
|
import io.legado.app.constant.PreferKey
|
||||||
import io.legado.app.data.appDb
|
import io.legado.app.data.appDb
|
||||||
import io.legado.app.data.entities.*
|
import io.legado.app.data.entities.*
|
||||||
|
import io.legado.app.help.DirectLinkUpload
|
||||||
import io.legado.app.help.LauncherIconHelp
|
import io.legado.app.help.LauncherIconHelp
|
||||||
import io.legado.app.help.config.LocalConfig
|
import io.legado.app.help.config.LocalConfig
|
||||||
import io.legado.app.help.config.ReadBookConfig
|
import io.legado.app.help.config.ReadBookConfig
|
||||||
@@ -118,6 +119,16 @@ object Restore {
|
|||||||
|
|
||||||
suspend fun restoreConfig(path: String = Backup.backupPath) {
|
suspend fun restoreConfig(path: String = Backup.backupPath) {
|
||||||
withContext(IO) {
|
withContext(IO) {
|
||||||
|
try {
|
||||||
|
val file =
|
||||||
|
FileUtils.createFileIfNotExist("$path${File.separator}${DirectLinkUpload.ruleFileName}")
|
||||||
|
if (file.exists()) {
|
||||||
|
val json = file.readText()
|
||||||
|
ACache.get(cacheDir = false).put(DirectLinkUpload.ruleFileName, json)
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
AppLog.put("直链上传出错\n${e.localizedMessage}", e)
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
val file =
|
val file =
|
||||||
FileUtils.createFileIfNotExist("$path${File.separator}${ThemeConfig.configFileName}")
|
FileUtils.createFileIfNotExist("$path${File.separator}${ThemeConfig.configFileName}")
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class DonateFragment : PreferenceFragmentCompat() {
|
|||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printOnDebug()
|
e.printOnDebug()
|
||||||
} finally {
|
} finally {
|
||||||
ACache.get(requireContext(), cacheDir = false)
|
ACache.get(cacheDir = false)
|
||||||
.put("proTime", System.currentTimeMillis())
|
.put("proTime", System.currentTimeMillis())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,11 +54,11 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
|
|||||||
private val exportDir = registerForActivityResult(HandleFileContract()) { result ->
|
private val exportDir = registerForActivityResult(HandleFileContract()) { result ->
|
||||||
result.uri?.let { uri ->
|
result.uri?.let { uri ->
|
||||||
if (uri.isContentScheme()) {
|
if (uri.isContentScheme()) {
|
||||||
ACache.get(this@CacheActivity).put(exportBookPathKey, uri.toString())
|
ACache.get().put(exportBookPathKey, uri.toString())
|
||||||
startExport(uri.toString(), result.requestCode)
|
startExport(uri.toString(), result.requestCode)
|
||||||
} else {
|
} else {
|
||||||
uri.path?.let { path ->
|
uri.path?.let { path ->
|
||||||
ACache.get(this@CacheActivity).put(exportBookPathKey, path)
|
ACache.get().put(exportBookPathKey, path)
|
||||||
startExport(path, result.requestCode)
|
startExport(path, result.requestCode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -244,7 +244,7 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun export(position: Int) {
|
override fun export(position: Int) {
|
||||||
val path = ACache.get(this@CacheActivity).getAsString(exportBookPathKey)
|
val path = ACache.get().getAsString(exportBookPathKey)
|
||||||
if (path.isNullOrEmpty()) {
|
if (path.isNullOrEmpty()) {
|
||||||
selectExportFolder(position)
|
selectExportFolder(position)
|
||||||
} else {
|
} else {
|
||||||
@@ -253,7 +253,7 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun exportAll() {
|
private fun exportAll() {
|
||||||
val path = ACache.get(this@CacheActivity).getAsString(exportBookPathKey)
|
val path = ACache.get().getAsString(exportBookPathKey)
|
||||||
if (path.isNullOrEmpty()) {
|
if (path.isNullOrEmpty()) {
|
||||||
selectExportFolder(-10)
|
selectExportFolder(-10)
|
||||||
} else {
|
} else {
|
||||||
@@ -263,7 +263,7 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
|
|||||||
|
|
||||||
private fun selectExportFolder(exportPosition: Int) {
|
private fun selectExportFolder(exportPosition: Int) {
|
||||||
val default = arrayListOf<SelectItem<Int>>()
|
val default = arrayListOf<SelectItem<Int>>()
|
||||||
val path = ACache.get(this@CacheActivity).getAsString(exportBookPathKey)
|
val path = ACache.get().getAsString(exportBookPathKey)
|
||||||
if (!path.isNullOrEmpty()) {
|
if (!path.isNullOrEmpty()) {
|
||||||
default.add(SelectItem(path, -1))
|
default.add(SelectItem(path, -1))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ class TxtTocRuleActivity : VMBaseActivity<ActivityTxtTocRuleBinding, TxtTocRuleV
|
|||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
private fun showImportDialog() {
|
private fun showImportDialog() {
|
||||||
val aCache = ACache.get(this, cacheDir = false)
|
val aCache = ACache.get(cacheDir = false)
|
||||||
val defaultUrl = "https://gitee.com/fisher52/YueDuJson/raw/master/myTxtChapterRule.json"
|
val defaultUrl = "https://gitee.com/fisher52/YueDuJson/raw/master/myTxtChapterRule.json"
|
||||||
val cacheUrls: MutableList<String> = aCache
|
val cacheUrls: MutableList<String> = aCache
|
||||||
.getAsString(importTocRuleKey)
|
.getAsString(importTocRuleKey)
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ class SpeakEngineDialog(val callBack: CallBack) : BaseDialogFragment(R.layout.di
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun importAlert() {
|
private fun importAlert() {
|
||||||
val aCache = ACache.get(requireContext(), cacheDir = false)
|
val aCache = ACache.get(cacheDir = false)
|
||||||
val cacheUrls: MutableList<String> = aCache
|
val cacheUrls: MutableList<String> = aCache
|
||||||
.getAsString(ttsUrlKey)
|
.getAsString(ttsUrlKey)
|
||||||
?.splitNotBlank(",")
|
?.splitNotBlank(",")
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ class TocRegexDialog() : BaseDialogFragment(R.layout.dialog_toc_regex),
|
|||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
private fun showImportDialog() {
|
private fun showImportDialog() {
|
||||||
val aCache = ACache.get(requireContext(), cacheDir = false)
|
val aCache = ACache.get(cacheDir = false)
|
||||||
val defaultUrl = "https://gitee.com/fisher52/YueDuJson/raw/master/myTxtChapterRule.json"
|
val defaultUrl = "https://gitee.com/fisher52/YueDuJson/raw/master/myTxtChapterRule.json"
|
||||||
val cacheUrls: MutableList<String> = aCache
|
val cacheUrls: MutableList<String> = aCache
|
||||||
.getAsString(importTocRuleKey)
|
.getAsString(importTocRuleKey)
|
||||||
|
|||||||
@@ -447,7 +447,7 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
|
|||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
private fun showImportDialog() {
|
private fun showImportDialog() {
|
||||||
val aCache = ACache.get(this, cacheDir = false)
|
val aCache = ACache.get(cacheDir = false)
|
||||||
val cacheUrls: MutableList<String> = aCache
|
val cacheUrls: MutableList<String> = aCache
|
||||||
.getAsString(importRecordKey)
|
.getAsString(importRecordKey)
|
||||||
?.splitNotBlank(",")
|
?.splitNotBlank(",")
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
|
|||||||
private var webPic: String? = null
|
private var webPic: String? = null
|
||||||
private val saveImage = registerForActivityResult(HandleFileContract()) {
|
private val saveImage = registerForActivityResult(HandleFileContract()) {
|
||||||
it.uri?.let { uri ->
|
it.uri?.let { uri ->
|
||||||
ACache.get(this).put(imagePathKey, uri.toString())
|
ACache.get().put(imagePathKey, uri.toString())
|
||||||
viewModel.saveImage(webPic, uri.toString())
|
viewModel.saveImage(webPic, uri.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,7 +140,7 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
|
|||||||
|
|
||||||
private fun saveImage(webPic: String) {
|
private fun saveImage(webPic: String) {
|
||||||
this.webPic = webPic
|
this.webPic = webPic
|
||||||
val path = ACache.get(this).getAsString(imagePathKey)
|
val path = ACache.get().getAsString(imagePathKey)
|
||||||
if (path.isNullOrEmpty()) {
|
if (path.isNullOrEmpty()) {
|
||||||
selectSaveFolder()
|
selectSaveFolder()
|
||||||
} else {
|
} else {
|
||||||
@@ -149,7 +149,7 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
|
|||||||
}
|
}
|
||||||
private fun selectSaveFolder() {
|
private fun selectSaveFolder() {
|
||||||
val default = arrayListOf<SelectItem<Int>>()
|
val default = arrayListOf<SelectItem<Int>>()
|
||||||
val path = ACache.get(this).getAsString(imagePathKey)
|
val path = ACache.get().getAsString(imagePathKey)
|
||||||
if (!path.isNullOrEmpty()) {
|
if (!path.isNullOrEmpty()) {
|
||||||
default.add(SelectItem(path, -1))
|
default.add(SelectItem(path, -1))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,14 +24,16 @@ class DirectLinkUploadConfig : BaseDialogFragment(R.layout.dialog_direct_link_up
|
|||||||
|
|
||||||
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
binding.toolBar.setBackgroundColor(primaryColor)
|
binding.toolBar.setBackgroundColor(primaryColor)
|
||||||
binding.editUploadUrl.setText(DirectLinkUpload.getUploadUrl())
|
DirectLinkUpload.getConfigRule()?.let {
|
||||||
binding.editDownloadUrlRule.setText(DirectLinkUpload.getDownloadUrlRule())
|
binding.editUploadUrl.setText(it.uploadUrl)
|
||||||
binding.editSummary.setText(DirectLinkUpload.getSummary())
|
binding.editDownloadUrlRule.setText(it.downloadUrlRule)
|
||||||
|
binding.editSummary.setText(it.summary)
|
||||||
|
}
|
||||||
binding.tvCancel.onClick {
|
binding.tvCancel.onClick {
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
binding.tvFooterLeft.onClick {
|
binding.tvFooterLeft.onClick {
|
||||||
DirectLinkUpload.delete()
|
DirectLinkUpload.delConfigRule()
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
binding.tvOk.onClick {
|
binding.tvOk.onClick {
|
||||||
@@ -46,9 +48,7 @@ class DirectLinkUploadConfig : BaseDialogFragment(R.layout.dialog_direct_link_up
|
|||||||
toastOnUi("下载Url规则不能为空")
|
toastOnUi("下载Url规则不能为空")
|
||||||
return@onClick
|
return@onClick
|
||||||
}
|
}
|
||||||
DirectLinkUpload.putUploadUrl(uploadUrl)
|
DirectLinkUpload.putConfigRule(uploadUrl, downloadUrlRule, summary)
|
||||||
DirectLinkUpload.putDownloadUrlRule(downloadUrlRule)
|
|
||||||
DirectLinkUpload.putSummary(summary)
|
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ class ExploreAdapter(context: Context, val callBack: CallBack) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun upKindList(flexbox: FlexboxLayout, sourceUrl: String, kinds: List<ExploreKind>) {
|
private fun upKindList(flexbox: FlexboxLayout, sourceUrl: String, kinds: List<ExploreKind>) {
|
||||||
if (!kinds.isNullOrEmpty()) kotlin.runCatching {
|
if (kinds.isNotEmpty()) kotlin.runCatching {
|
||||||
recyclerFlexbox(flexbox)
|
recyclerFlexbox(flexbox)
|
||||||
flexbox.visible()
|
flexbox.visible()
|
||||||
kinds.forEach { kind ->
|
kinds.forEach { kind ->
|
||||||
@@ -168,7 +168,7 @@ class ExploreAdapter(context: Context, val callBack: CallBack) :
|
|||||||
putExtra("key", source.bookSourceUrl)
|
putExtra("key", source.bookSourceUrl)
|
||||||
}
|
}
|
||||||
R.id.menu_refresh -> Coroutine.async(callBack.scope) {
|
R.id.menu_refresh -> Coroutine.async(callBack.scope) {
|
||||||
ACache.get(context, "explore").remove(source.bookSourceUrl)
|
ACache.get("explore").remove(source.bookSourceUrl)
|
||||||
}.onSuccess {
|
}.onSuccess {
|
||||||
callBack.refreshData()
|
callBack.refreshData()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -266,7 +266,7 @@ class ReplaceRuleActivity : VMBaseActivity<ActivityReplaceRuleBinding, ReplaceRu
|
|||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
private fun showImportDialog() {
|
private fun showImportDialog() {
|
||||||
val aCache = ACache.get(this, cacheDir = false)
|
val aCache = ACache.get(cacheDir = false)
|
||||||
val cacheUrls: MutableList<String> = aCache
|
val cacheUrls: MutableList<String> = aCache
|
||||||
.getAsString(importRecordKey)
|
.getAsString(importRecordKey)
|
||||||
?.splitNotBlank(",")
|
?.splitNotBlank(",")
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
|
|||||||
private var webPic: String? = null
|
private var webPic: String? = null
|
||||||
private val saveImage = registerForActivityResult(HandleFileContract()) {
|
private val saveImage = registerForActivityResult(HandleFileContract()) {
|
||||||
it.uri?.let { uri ->
|
it.uri?.let { uri ->
|
||||||
ACache.get(this).put(imagePathKey, uri.toString())
|
ACache.get().put(imagePathKey, uri.toString())
|
||||||
viewModel.saveImage(webPic, uri)
|
viewModel.saveImage(webPic, uri)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -154,7 +154,7 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
|
|||||||
|
|
||||||
private fun saveImage(webPic: String) {
|
private fun saveImage(webPic: String) {
|
||||||
this.webPic = webPic
|
this.webPic = webPic
|
||||||
val path = ACache.get(this@ReadRssActivity).getAsString(imagePathKey)
|
val path = ACache.get().getAsString(imagePathKey)
|
||||||
if (path.isNullOrEmpty()) {
|
if (path.isNullOrEmpty()) {
|
||||||
selectSaveFolder()
|
selectSaveFolder()
|
||||||
} else {
|
} else {
|
||||||
@@ -164,7 +164,7 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
|
|||||||
|
|
||||||
private fun selectSaveFolder() {
|
private fun selectSaveFolder() {
|
||||||
val default = arrayListOf<SelectItem<Int>>()
|
val default = arrayListOf<SelectItem<Int>>()
|
||||||
val path = ACache.get(this@ReadRssActivity).getAsString(imagePathKey)
|
val path = ACache.get().getAsString(imagePathKey)
|
||||||
if (!path.isNullOrEmpty()) {
|
if (!path.isNullOrEmpty()) {
|
||||||
default.add(SelectItem(path, -1))
|
default.add(SelectItem(path, -1))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ class RssSourceActivity : VMBaseActivity<ActivityRssSourceBinding, RssSourceView
|
|||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
private fun showImportDialog() {
|
private fun showImportDialog() {
|
||||||
val aCache = ACache.get(this, cacheDir = false)
|
val aCache = ACache.get(cacheDir = false)
|
||||||
val cacheUrls: MutableList<String> = aCache
|
val cacheUrls: MutableList<String> = aCache
|
||||||
.getAsString(importRecordKey)
|
.getAsString(importRecordKey)
|
||||||
?.splitNotBlank(",")
|
?.splitNotBlank(",")
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
//Copyright (c) 2017. 章钦豪. All rights reserved.
|
//Copyright (c) 2017. 章钦豪. All rights reserved.
|
||||||
package io.legado.app.utils
|
package io.legado.app.utils
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.graphics.Canvas
|
import android.graphics.Canvas
|
||||||
@@ -11,7 +10,6 @@ import android.graphics.drawable.Drawable
|
|||||||
import org.json.JSONArray
|
import org.json.JSONArray
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
|
|
||||||
import java.io.*
|
import java.io.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.atomic.AtomicInteger
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
@@ -34,13 +32,13 @@ class ACache private constructor(cacheDir: File, max_size: Long, max_count: Int)
|
|||||||
|
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
fun get(
|
fun get(
|
||||||
ctx: Context,
|
|
||||||
cacheName: String = "ACache",
|
cacheName: String = "ACache",
|
||||||
maxSize: Long = MAX_SIZE.toLong(),
|
maxSize: Long = MAX_SIZE.toLong(),
|
||||||
maxCount: Int = MAX_COUNT,
|
maxCount: Int = MAX_COUNT,
|
||||||
cacheDir: Boolean = true
|
cacheDir: Boolean = true
|
||||||
): ACache {
|
): ACache {
|
||||||
val f = if (cacheDir) File(ctx.cacheDir, cacheName) else File(ctx.filesDir, cacheName)
|
val f =
|
||||||
|
if (cacheDir) File(appCtx.cacheDir, cacheName) else File(appCtx.filesDir, cacheName)
|
||||||
return get(f, maxSize, maxCount)
|
return get(f, maxSize, maxCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user