From 6e73c904528d9c4fe2836aee79142413e1198b03 Mon Sep 17 00:00:00 2001 From: ag2s20150909 Date: Thu, 15 Jul 2021 22:38:15 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Cronet=20=E6=B7=B7?= =?UTF-8?q?=E6=B7=86=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index add8ff815..6d8529cd8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -123,7 +123,7 @@ kapt { dependencies { implementation project(path: ':epublib') coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' - implementation fileTree(dir: 'libs', include: ['*.jar','*.aar']) + implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test:runner:1.4.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' @@ -186,7 +186,7 @@ dependencies { //网络 implementation 'com.squareup.okhttp3:okhttp:4.9.1' - def cronet_version='92.0.4509.1' + def cronet_version = '92.0.4509.1' compileOnly "org.microg:cronet-api:$cronet_version" cronetImplementation "org.microg:cronet-native:$cronet_version" cronetImplementation "org.microg:cronet-api:$cronet_version" From 2131984f6c69537fe38998b6eddecc070946af8b Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 15 Jul 2021 23:02:54 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 4 ++ .../java/io/legado/app/help/JsExtensions.kt | 51 ++++++++++++++++--- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 00a06a045..ac1946a60 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -8,6 +8,10 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则出现问题。先关闭替换净化并刷新,再观察是否正常。如果正常说明净化规则存在误杀,如果关闭后仍然出现相关问题,请点击源链接查看原文与正文是否相同,如果不同,再进行反馈。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! +**2021/07/16** +1. js扩展函数添加删除本地文件方法 +2. js扩展函数对于文件的读写删操作都是相对路径,只能操作阅读缓存内的文件,/android/data/{package}/cache/... + **2021/07/15** 1. 添加js函数来修复开启js沙箱后某些书源失效。by ag2s20150909 ```kotlin diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 1f464db47..084058044 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -23,6 +23,11 @@ import java.util.* import java.util.zip.ZipEntry import java.util.zip.ZipInputStream +/** + * js扩展类, 在js中通过java变量调用 + * 所有对于文件的读写删操作都是相对路径,只能操作阅读缓存内的文件 + * /android/data/{package}/cache/... + */ @Keep @Suppress("unused") interface JsExtensions { @@ -253,20 +258,51 @@ interface JsExtensions { } /** - * 读取本地文件 + * 获取本地文件 + * @param path 相对路径 + * @return File */ - fun readFile(path: String): ByteArray { - return File(path).readBytes() + fun getFile(path: String): File { + val cachePath = appCtx.eCacheDir.path + val aPath = if (path.startsWith(File.separator)) { + cachePath + path + } else { + cachePath + File.separator + path + } + return File(aPath) + } + + fun readFile(path: String): ByteArray? { + val file = getFile(path) + if (file.exists()) { + return file.readBytes() + } + return null } fun readTxtFile(path: String): String { - val f = File(path) - val charsetName = EncodingDetect.getEncode(f) - return String(f.readBytes(), charset(charsetName)) + val file = getFile(path) + if (file.exists()) { + val charsetName = EncodingDetect.getEncode(file) + return String(file.readBytes(), charset(charsetName)) + } + return "" } fun readTxtFile(path: String, charsetName: String): String { - return String(File(path).readBytes(), charset(charsetName)) + val file = getFile(path) + if (file.exists()) { + return String(file.readBytes(), charset(charsetName)) + } + return "" + } + + /** + * 删除本地文件 + */ + fun deleteFile(path: String) { + val file = getFile(path) + FileUtils.delete(file) } /** @@ -405,7 +441,6 @@ interface JsExtensions { transformation: String, iv: String ): ByteArray? { - return EncoderUtils.decryptAES( data = str.encodeToByteArray(), key = key.encodeToByteArray(), From cddd809503a92119246b779fe464d3c778945a44 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 16 Jul 2021 09:29:55 +0800 Subject: [PATCH 3/7] =?UTF-8?q?js=E5=8F=AA=E8=83=BD=E8=AE=BF=E9=97=AEcache?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E4=B8=8B=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/BookHelp.kt | 2 +- .../java/io/legado/app/help/JsExtensions.kt | 93 ++++++++++--------- .../io/legado/app/model/localBook/EpubFile.kt | 4 +- .../legado/app/model/localBook/LocalBook.kt | 2 +- .../io/legado/app/model/localBook/UmdFile.kt | 7 +- .../ui/book/info/edit/BookInfoEditActivity.kt | 4 +- .../ui/book/read/config/BgTextConfigDialog.kt | 18 ++-- .../app/ui/config/OtherConfigFragment.kt | 4 +- .../app/ui/config/ThemeConfigFragment.kt | 4 +- .../app/ui/widget/font/FontSelectDialog.kt | 2 +- .../io/legado/app/utils/ContextExtensions.kt | 4 +- .../java/io/legado/app/utils/FileUtils.kt | 3 +- 12 files changed, 74 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index 41dc7376e..1cf95b2f2 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -23,7 +23,7 @@ import kotlin.math.min object BookHelp { private const val cacheFolderName = "book_cache" private const val cacheImageFolderName = "images" - private val downloadDir: File = appCtx.externalFilesDir + private val downloadDir: File = appCtx.externalFiles private val downloadImages = CopyOnWriteArraySet() fun clearCache() { diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 084058044..04915cf77 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -85,6 +85,7 @@ interface JsExtensions { /** * 实现16进制字符串转文件 + * @return 相对路径 */ fun downloadFile(content: String, url: String): String { val type = AnalyzeUrl(url).type ?: return "" @@ -99,45 +100,7 @@ interface JsExtensions { zipFile.writeBytes(it) } } - return zipPath - } - - /** - * js实现压缩文件解压 - */ - fun unzipFile(zipPath: String): String { - if (zipPath.isEmpty()) return "" - val unzipPath = FileUtils.getPath( - FileUtils.createFolderIfNotExist(FileUtils.getCachePath()), - FileUtils.getNameExcludeExtension(zipPath) - ) - FileUtils.deleteFile(unzipPath) - val zipFile = FileUtils.createFileIfNotExist(zipPath) - val unzipFolder = FileUtils.createFolderIfNotExist(unzipPath) - ZipUtils.unzipFile(zipFile, unzipFolder) - FileUtils.deleteFile(zipPath) - return unzipPath - } - - /** - * js实现文件夹内所有文件读取 - */ - fun getTxtInFolder(unzipPath: String): String { - if (unzipPath.isEmpty()) return "" - val unzipFolder = FileUtils.createFolderIfNotExist(unzipPath) - val contents = StringBuilder() - unzipFolder.listFiles().let { - if (it != null) { - for (f in it) { - val charsetName = EncodingDetect.getEncode(f) - contents.append(String(f.readBytes(), charset(charsetName))) - .append("\n") - } - contents.deleteCharAt(contents.length - 1) - } - } - FileUtils.deleteFile(unzipPath) - return contents.toString() + return zipPath.substring(FileUtils.getCachePath().length) } /** @@ -263,7 +226,7 @@ interface JsExtensions { * @return File */ fun getFile(path: String): File { - val cachePath = appCtx.eCacheDir.path + val cachePath = appCtx.externalCache.absolutePath val aPath = if (path.startsWith(File.separator)) { cachePath + path } else { @@ -306,13 +269,43 @@ interface JsExtensions { } /** - * 解析字体,返回字体解析类 + * js实现压缩文件解压 + * @param zipPath 相对路径 + * @return 相对路径 */ - fun queryBase64TTF(base64: String?): QueryTTF? { - base64DecodeToByteArray(base64)?.let { - return QueryTTF(it) + fun unzipFile(zipPath: String): String { + if (zipPath.isEmpty()) return "" + val unzipPath = FileUtils.getPath( + FileUtils.createFolderIfNotExist(FileUtils.getCachePath()), + FileUtils.getNameExcludeExtension(zipPath) + ) + FileUtils.deleteFile(unzipPath) + val zipFile = getFile(zipPath) + val unzipFolder = FileUtils.createFolderIfNotExist(unzipPath) + ZipUtils.unzipFile(zipFile, unzipFolder) + FileUtils.deleteFile(zipPath) + return unzipPath.substring(FileUtils.getCachePath().length) + } + + /** + * js实现文件夹内所有文件读取 + */ + fun getTxtInFolder(unzipPath: String): String { + if (unzipPath.isEmpty()) return "" + val unzipFolder = getFile(unzipPath) + val contents = StringBuilder() + unzipFolder.listFiles().let { + if (it != null) { + for (f in it) { + val charsetName = EncodingDetect.getEncode(f) + contents.append(String(f.readBytes(), charset(charsetName))) + .append("\n") + } + contents.deleteCharAt(contents.length - 1) + } } - return null + FileUtils.deleteFile(unzipPath) + return contents.toString() } /** @@ -368,6 +361,16 @@ interface JsExtensions { return null } + /** + * 解析字体,返回字体解析类 + */ + fun queryBase64TTF(base64: String?): QueryTTF? { + base64DecodeToByteArray(base64)?.let { + return QueryTTF(it) + } + return null + } + /** * 返回字体解析类 * @param str 支持url,本地文件,base64,自动判断,自动缓存 diff --git a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt index 5365be900..93f96132f 100644 --- a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt @@ -9,7 +9,7 @@ import io.legado.app.help.BookHelp import io.legado.app.utils.FileUtils import io.legado.app.utils.HtmlFormatter import io.legado.app.utils.MD5Utils -import io.legado.app.utils.externalFilesDir +import io.legado.app.utils.externalFiles import me.ag2s.epublib.domain.EpubBook import me.ag2s.epublib.epub.EpubReader import org.jsoup.Jsoup @@ -80,7 +80,7 @@ class EpubFile(var book: Book) { epubBook?.let { if (book.coverUrl.isNullOrEmpty()) { book.coverUrl = FileUtils.getPath( - appCtx.externalFilesDir, + appCtx.externalFiles, "covers", "${MD5Utils.md5Encode16(book.bookUrl)}.jpg" ) diff --git a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt index 30c9f65db..46d7ba187 100644 --- a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt +++ b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt @@ -119,7 +119,7 @@ object LocalBook { author = author, originName = fileName, coverUrl = FileUtils.getPath( - appCtx.externalFilesDir, + appCtx.externalFiles, "covers", "${MD5Utils.md5Encode16(path)}.jpg" ) diff --git a/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt b/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt index de6c1586f..0451b44ca 100644 --- a/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt @@ -4,17 +4,16 @@ import android.net.Uri import android.util.Log import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter - import io.legado.app.utils.FileUtils import io.legado.app.utils.MD5Utils -import io.legado.app.utils.externalFilesDir +import io.legado.app.utils.externalFiles import io.legado.app.utils.isContentScheme import me.ag2s.umdlib.domain.UmdBook import me.ag2s.umdlib.umd.UmdReader import splitties.init.appCtx import java.io.File import java.io.InputStream -import java.util.ArrayList +import java.util.* class UmdFile(var book: Book) { companion object { @@ -74,7 +73,7 @@ class UmdFile(var book: Book) { umdBook?.let { if (book.coverUrl.isNullOrEmpty()) { book.coverUrl = FileUtils.getPath( - appCtx.externalFilesDir, + appCtx.externalFiles, "covers", "${MD5Utils.md5Encode16(book.bookUrl)}.jpg" ) diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt index c8e645b11..805edfe5f 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt @@ -108,7 +108,7 @@ class BookInfoEditActivity : if (uri.isContentScheme()) { val doc = DocumentFile.fromSingleUri(this, uri) doc?.name?.let { - var file = this.externalFilesDir + var file = this.externalFiles file = FileUtils.createFileIfNotExist(file, "covers", it) kotlin.runCatching { DocumentUtils.readBytes(this, doc.uri) @@ -128,7 +128,7 @@ class BookInfoEditActivity : RealPathUtil.getPath(this, uri)?.let { path -> val imgFile = File(path) if (imgFile.exists()) { - var file = this.externalFilesDir + var file = this.externalFiles file = FileUtils.createFileIfNotExist(file, "covers", imgFile.name) file.writeBytes(imgFile.readBytes()) coverChangeTo(file.absolutePath) diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt index 224d4b93d..3837b6c22 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt @@ -224,7 +224,7 @@ class BgTextConfigDialog : BaseDialogFragment() { } execute { val exportFiles = arrayListOf() - val configDirPath = FileUtils.getPath(requireContext().eCacheDir, "readConfig") + val configDirPath = FileUtils.getPath(requireContext().externalCache, "readConfig") FileUtils.deleteFile(configDirPath) val configDir = FileUtils.createFolderIfNotExist(configDirPath) val configExportPath = FileUtils.getPath(configDir, "readConfig.json") @@ -269,7 +269,7 @@ class BgTextConfigDialog : BaseDialogFragment() { exportFiles.add(bgExportFile) } } - val configZipPath = FileUtils.getPath(requireContext().eCacheDir, configFileName) + val configZipPath = FileUtils.getPath(requireContext().externalCache, configFileName) if (ZipUtils.zipFiles(exportFiles, File(configZipPath))) { if (uri.isContentScheme()) { DocumentFile.fromTreeUri(requireContext(), uri)?.let { treeDoc -> @@ -331,11 +331,11 @@ class BgTextConfigDialog : BaseDialogFragment() { @Suppress("BlockingMethodInNonBlockingContext") private fun importConfig(byteArray: ByteArray) { execute { - val configZipPath = FileUtils.getPath(requireContext().eCacheDir, configFileName) + val configZipPath = FileUtils.getPath(requireContext().externalCache, configFileName) FileUtils.deleteFile(configZipPath) val zipFile = FileUtils.createFileIfNotExist(configZipPath) zipFile.writeBytes(byteArray) - val configDirPath = FileUtils.getPath(requireContext().eCacheDir, "readConfig") + val configDirPath = FileUtils.getPath(requireContext().externalCache, "readConfig") FileUtils.deleteFile(configDirPath) ZipUtils.unzipFile(zipFile, FileUtils.createFolderIfNotExist(configDirPath)) val configDir = FileUtils.createFolderIfNotExist(configDirPath) @@ -344,7 +344,7 @@ class BgTextConfigDialog : BaseDialogFragment() { if (config.textFont.isNotEmpty()) { val fontName = FileUtils.getName(config.textFont) val fontPath = - FileUtils.getPath(requireContext().externalFilesDir, "font", fontName) + FileUtils.getPath(requireContext().externalFiles, "font", fontName) if (!FileUtils.exist(fontPath)) { FileUtils.getFile(configDir, fontName).copyTo(File(fontPath)) } @@ -352,7 +352,7 @@ class BgTextConfigDialog : BaseDialogFragment() { } if (config.bgType == 2) { val bgName = FileUtils.getName(config.bgStr) - val bgPath = FileUtils.getPath(requireContext().externalFilesDir, "bg", bgName) + val bgPath = FileUtils.getPath(requireContext().externalFiles, "bg", bgName) if (!FileUtils.exist(bgPath)) { val bgFile = FileUtils.getFile(configDir, bgName) if (bgFile.exists()) { @@ -362,7 +362,7 @@ class BgTextConfigDialog : BaseDialogFragment() { } if (config.bgTypeNight == 2) { val bgName = FileUtils.getName(config.bgStrNight) - val bgPath = FileUtils.getPath(requireContext().externalFilesDir, "bg", bgName) + val bgPath = FileUtils.getPath(requireContext().externalFiles, "bg", bgName) if (!FileUtils.exist(bgPath)) { val bgFile = FileUtils.getFile(configDir, bgName) if (bgFile.exists()) { @@ -372,7 +372,7 @@ class BgTextConfigDialog : BaseDialogFragment() { } if (config.bgTypeEInk == 2) { val bgName = FileUtils.getName(config.bgStrEInk) - val bgPath = FileUtils.getPath(requireContext().externalFilesDir, "bg", bgName) + val bgPath = FileUtils.getPath(requireContext().externalFiles, "bg", bgName) if (!FileUtils.exist(bgPath)) { val bgFile = FileUtils.getFile(configDir, bgName) if (bgFile.exists()) { @@ -395,7 +395,7 @@ class BgTextConfigDialog : BaseDialogFragment() { val doc = DocumentFile.fromSingleUri(requireContext(), uri) doc?.name?.let { val file = - FileUtils.createFileIfNotExist(requireContext().externalFilesDir, "bg", it) + FileUtils.createFileIfNotExist(requireContext().externalFiles, "bg", it) kotlin.runCatching { DocumentUtils.readBytes(requireContext(), doc.uri) }.getOrNull()?.let { byteArray -> diff --git a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt index 9a9d7b9bd..5547b76db 100644 --- a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt @@ -226,7 +226,7 @@ class OtherConfigFragment : BasePreferenceFragment(), if (uri.isContentScheme()) { val doc = DocumentFile.fromSingleUri(requireContext(), uri) doc?.name?.let { - var file = requireContext().externalFilesDir + var file = requireContext().externalFiles file = FileUtils.createFileIfNotExist(file, "covers", it) kotlin.runCatching { DocumentUtils.readBytes(requireContext(), doc.uri) @@ -247,7 +247,7 @@ class OtherConfigFragment : BasePreferenceFragment(), RealPathUtil.getPath(requireContext(), uri)?.let { path -> val imgFile = File(path) if (imgFile.exists()) { - var file = requireContext().externalFilesDir + var file = requireContext().externalFiles file = FileUtils.createFileIfNotExist(file, "covers", imgFile.name) file.writeBytes(imgFile.readBytes()) putPrefString(PreferKey.defaultCover, file.absolutePath) diff --git a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt index 2a5e414ee..94eb8987b 100644 --- a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt @@ -225,7 +225,7 @@ class ThemeConfigFragment : BasePreferenceFragment(), if (uri.isContentScheme()) { val doc = DocumentFile.fromSingleUri(requireContext(), uri) doc?.name?.let { - var file = requireContext().externalFilesDir + var file = requireContext().externalFiles file = FileUtils.createFileIfNotExist(file, preferenceKey, it) kotlin.runCatching { DocumentUtils.readBytes(requireContext(), doc.uri) @@ -247,7 +247,7 @@ class ThemeConfigFragment : BasePreferenceFragment(), RealPathUtil.getPath(requireContext(), uri)?.let { path -> val imgFile = File(path) if (imgFile.exists()) { - var file = requireContext().externalFilesDir + var file = requireContext().externalFiles file = FileUtils.createFileIfNotExist(file, preferenceKey, imgFile.name) file.writeBytes(imgFile.readBytes()) putPrefString(preferenceKey, file.absolutePath) diff --git a/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt b/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt index c070e4361..22f205101 100644 --- a/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt @@ -139,7 +139,7 @@ class FontSelectDialog : BaseDialogFragment(), private fun getLocalFonts(): ArrayList { val fontItems = arrayListOf() val fontDir = - FileUtils.createFolderIfNotExist(requireContext().externalFilesDir, "font") + FileUtils.createFolderIfNotExist(requireContext().externalFiles, "font") fontDir.listFiles { pathName -> pathName.name.lowercase(Locale.getDefault()).matches(fontRegex) }?.forEach { diff --git a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt index f11a7f890..315c76c67 100644 --- a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt @@ -224,10 +224,10 @@ val Context.sysBattery: Int return batteryStatus?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) ?: -1 } -val Context.externalFilesDir: File +val Context.externalFiles: File get() = this.getExternalFilesDir(null) ?: this.filesDir -val Context.eCacheDir: File +val Context.externalCache: File get() = this.externalCacheDir ?: this.cacheDir fun Context.openUrl(url: String) { diff --git a/app/src/main/java/io/legado/app/utils/FileUtils.kt b/app/src/main/java/io/legado/app/utils/FileUtils.kt index 1e8c8b502..c0f8e0dda 100644 --- a/app/src/main/java/io/legado/app/utils/FileUtils.kt +++ b/app/src/main/java/io/legado/app/utils/FileUtils.kt @@ -105,8 +105,7 @@ object FileUtils { } fun getCachePath(): String { - return appCtx.externalCacheDir?.absolutePath - ?: appCtx.cacheDir.absolutePath + return appCtx.externalCache.absolutePath } fun getSdCardPath(): String { From 6df464a7088d71ff014ce873ee783cd899374b97 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 16 Jul 2021 09:34:04 +0800 Subject: [PATCH 4/7] =?UTF-8?q?js=E5=8F=AA=E8=83=BD=E8=AE=BF=E9=97=AEcache?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E4=B8=8B=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/JsExtensions.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 04915cf77..deccf818f 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -220,6 +220,8 @@ interface JsExtensions { return HtmlFormatter.formatKeepImg(str) } + //****************文件操作******************// + /** * 获取本地文件 * @param path 相对路径 @@ -361,6 +363,8 @@ interface JsExtensions { return null } + //******************文件操作************************// + /** * 解析字体,返回字体解析类 */ From c8305b4a535681ecabf309c285aaef801cf6a8f5 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 16 Jul 2021 11:06:14 +0800 Subject: [PATCH 5/7] =?UTF-8?q?web=E5=A4=87=E4=BB=BD=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E6=94=B9=E5=88=B0file=E4=B8=8B?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/storage/BookWebDav.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/help/storage/BookWebDav.kt b/app/src/main/java/io/legado/app/help/storage/BookWebDav.kt index 5af0231f0..6147ff1db 100644 --- a/app/src/main/java/io/legado/app/help/storage/BookWebDav.kt +++ b/app/src/main/java/io/legado/app/help/storage/BookWebDav.kt @@ -23,7 +23,7 @@ import java.util.* object BookWebDav { private const val defaultWebDavUrl = "https://dav.jianguoyun.com/dav/" private val bookProgressUrl = "${rootWebDavUrl}bookProgress/" - private val zipFilePath = "${FileUtils.getCachePath()}${File.separator}backup.zip" + private val zipFilePath = "${appCtx.externalFiles.absolutePath}${File.separator}backup.zip" private val rootWebDavUrl: String get() { From b4fc4e2e586021ea1cc7d7ab8dc5cfa588faa077 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 16 Jul 2021 12:26:05 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/JsExtensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index deccf818f..802b450c6 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -267,7 +267,7 @@ interface JsExtensions { */ fun deleteFile(path: String) { val file = getFile(path) - FileUtils.delete(file) + FileUtils.delete(file, true) } /** From 749431068ad5505f67f006f54320fba4b3b71b93 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 16 Jul 2021 13:18:40 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=B0=81=E9=9D=A2api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/api/controller/BookController.kt | 20 +++++++++++++++---- .../app/api/controller/SourceController.kt | 2 +- .../java/io/legado/app/help/ImageLoader.kt | 13 ++++++++++++ .../java/io/legado/app/help/JsExtensions.kt | 2 +- .../main/java/io/legado/app/web/HttpServer.kt | 1 + 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/api/controller/BookController.kt b/app/src/main/java/io/legado/app/api/controller/BookController.kt index daccc43a7..496b24ae2 100644 --- a/app/src/main/java/io/legado/app/api/controller/BookController.kt +++ b/app/src/main/java/io/legado/app/api/controller/BookController.kt @@ -6,9 +6,11 @@ import io.legado.app.constant.PreferKey import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.help.BookHelp +import io.legado.app.help.ImageLoader import io.legado.app.model.localBook.LocalBook import io.legado.app.model.webBook.WebBook import io.legado.app.service.help.ReadBook +import io.legado.app.ui.widget.image.CoverImageView import io.legado.app.utils.GSON import io.legado.app.utils.cnCompare import io.legado.app.utils.fromJsonObject @@ -40,13 +42,23 @@ object BookController { } } + fun getCover(parameters: Map>): ReturnData { + val returnData = ReturnData() + val coverPath = parameters["path"]?.firstOrNull() + val ftBitmap = ImageLoader.loadBitmap(appCtx, coverPath) + .placeholder(CoverImageView.defaultDrawable) + .error(CoverImageView.defaultDrawable) + .submit() + return returnData.setData(ftBitmap.get()) + } + /** * 更新目录 */ fun refreshToc(parameters: Map>): ReturnData { val returnData = ReturnData() try { - val bookUrl = parameters["url"]?.getOrNull(0) + val bookUrl = parameters["url"]?.firstOrNull() if (bookUrl.isNullOrEmpty()) { return returnData.setErrorMsg("参数url不能为空,请指定书籍地址") } @@ -90,7 +102,7 @@ object BookController { * 获取目录 */ fun getChapterList(parameters: Map>): ReturnData { - val bookUrl = parameters["url"]?.getOrNull(0) + val bookUrl = parameters["url"]?.firstOrNull() val returnData = ReturnData() if (bookUrl.isNullOrEmpty()) { return returnData.setErrorMsg("参数url不能为空,请指定书籍地址") @@ -103,8 +115,8 @@ object BookController { * 获取正文 */ fun getBookContent(parameters: Map>): ReturnData { - val bookUrl = parameters["url"]?.getOrNull(0) - val index = parameters["index"]?.getOrNull(0)?.toInt() + val bookUrl = parameters["url"]?.firstOrNull() + val index = parameters["index"]?.firstOrNull()?.toInt() val returnData = ReturnData() if (bookUrl.isNullOrEmpty()) { return returnData.setErrorMsg("参数url不能为空,请指定书籍地址") diff --git a/app/src/main/java/io/legado/app/api/controller/SourceController.kt b/app/src/main/java/io/legado/app/api/controller/SourceController.kt index 3972295e5..f4a92cd6d 100644 --- a/app/src/main/java/io/legado/app/api/controller/SourceController.kt +++ b/app/src/main/java/io/legado/app/api/controller/SourceController.kt @@ -59,7 +59,7 @@ object SourceController { } fun getSource(parameters: Map>): ReturnData { - val url = parameters["url"]?.getOrNull(0) + val url = parameters["url"]?.firstOrNull() val returnData = ReturnData() if (url.isNullOrEmpty()) { return returnData.setErrorMsg("参数url不能为空,请指定书源地址") diff --git a/app/src/main/java/io/legado/app/help/ImageLoader.kt b/app/src/main/java/io/legado/app/help/ImageLoader.kt index cc702ff0f..fa2411d38 100644 --- a/app/src/main/java/io/legado/app/help/ImageLoader.kt +++ b/app/src/main/java/io/legado/app/help/ImageLoader.kt @@ -30,6 +30,19 @@ object ImageLoader { } } + fun loadBitmap(context: Context, path: String?): RequestBuilder { + return when { + path.isNullOrEmpty() -> Glide.with(context).asBitmap().load(path) + path.isAbsUrl() -> Glide.with(context).asBitmap().load(AnalyzeUrl(path).getGlideUrl()) + path.isContentScheme() -> Glide.with(context).asBitmap().load(Uri.parse(path)) + else -> kotlin.runCatching { + Glide.with(context).asBitmap().load(File(path)) + }.getOrElse { + Glide.with(context).asBitmap().load(path) + } + } + } + fun load(context: Context, @DrawableRes resId: Int?): RequestBuilder { return Glide.with(context).load(resId) } diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 802b450c6..ab02185b1 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -285,7 +285,7 @@ interface JsExtensions { val zipFile = getFile(zipPath) val unzipFolder = FileUtils.createFolderIfNotExist(unzipPath) ZipUtils.unzipFile(zipFile, unzipFolder) - FileUtils.deleteFile(zipPath) + FileUtils.deleteFile(zipFile.absolutePath) return unzipPath.substring(FileUtils.getCachePath().length) } diff --git a/app/src/main/java/io/legado/app/web/HttpServer.kt b/app/src/main/java/io/legado/app/web/HttpServer.kt index 9b0d09e0e..687383179 100644 --- a/app/src/main/java/io/legado/app/web/HttpServer.kt +++ b/app/src/main/java/io/legado/app/web/HttpServer.kt @@ -51,6 +51,7 @@ class HttpServer(port: Int) : NanoHTTPD(port) { "/getChapterList" -> BookController.getChapterList(parameters) "/refreshToc" -> BookController.refreshToc(parameters) "/getBookContent" -> BookController.getBookContent(parameters) + "/cover" -> BookController.getCover(parameters) else -> null } }