From 18daa53451d81b37c61d34abf3f1b126d0b2bad5 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 27 Apr 2025 18:20:42 +0800 Subject: [PATCH] =?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/proguard-rules.pro | 3 ++ .../java/io/legado/app/data/entities/Book.kt | 16 +--------- .../java/io/legado/app/help/JsExtensions.kt | 4 ++- .../app/ui/book/info/BookInfoActivity.kt | 31 ++++++++++++++----- .../io/legado/app/utils/FileDocExtensions.kt | 24 +++++++++----- 5 files changed, 47 insertions(+), 31 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index a8580481f..1f75a763b 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -100,6 +100,9 @@ cn.hutool.core.util.**{*;} *** mNavButtonView; } +# FileDocExtensions.kt TreeDocumentFileConstructor +-keep class androidx.documentfile.provider.TreeDocumentFile + # JsoupXpath -keep,allowobfuscation class * implements org.seimicrawler.xpath.core.AxisSelector{*;} -keep,allowobfuscation class * implements org.seimicrawler.xpath.core.NodeTest{*;} diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index c62c2d12b..3a05d2338 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -17,15 +17,12 @@ import io.legado.app.help.book.ContentProcessor import io.legado.app.help.book.getFolderNameNoCache import io.legado.app.help.book.isEpub import io.legado.app.help.book.isImage -import io.legado.app.help.book.isLocal import io.legado.app.help.book.simulatedTotalChapterNum import io.legado.app.help.config.AppConfig import io.legado.app.help.config.ReadBookConfig import io.legado.app.model.ReadBook -import io.legado.app.utils.ConvertUtils -import io.legado.app.utils.fromJsonObject -import io.legado.app.utils.FileUtils import io.legado.app.utils.GSON +import io.legado.app.utils.fromJsonObject import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize import java.nio.charset.Charset @@ -169,17 +166,6 @@ data class Book( fun getDisplayIntro() = if (customIntro.isNullOrEmpty()) intro else customIntro - override fun getKindList(): List { - val kindList = super.getKindList().toMutableList() - if (isLocal) { - // local book add filesize tag - val size = FileUtils.getLength(bookUrl) - if (size > 0) { - kindList.add(ConvertUtils.formatFileSize(size)) - } - } - return kindList - } //自定义简介有自动更新的需求时,可通过更新intro再调用upCustomIntro()完成 @Suppress("unused") fun upCustomIntro() { 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 a029f5697..2647398c4 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -862,6 +862,7 @@ interface JsExtensions : JsEncodeUtils { ): String { if (errorQueryTTF == null || correctQueryTTF == null) return text val contentArray = text.toStringArray() //这里不能用toCharArray,因为有些文字占多个字节 + val intArray = IntArray(1) contentArray.forEachIndexed { index, s -> val oldCode = s.codePointAt(0) // 忽略正常的空白字符 @@ -878,7 +879,8 @@ interface JsExtensions : JsEncodeUtils { // 使用轮廓数据反查Unicode val code = correctQueryTTF.getUnicodeByGlyf(glyf) if (code != 0) { - contentArray[index] = code.toChar().toString() + intArray[0] = code + contentArray[index] = String(intArray, 0, 1) } } return contentArray.joinToString("") diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 0b59d9f1a..ec2ac54ed 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -60,6 +60,8 @@ import io.legado.app.ui.widget.dialog.PhotoDialog import io.legado.app.ui.widget.dialog.VariableDialog import io.legado.app.ui.widget.dialog.WaitDialog import io.legado.app.utils.ColorUtils +import io.legado.app.utils.ConvertUtils +import io.legado.app.utils.FileDoc import io.legado.app.utils.GSON import io.legado.app.utils.StartActivityContract import io.legado.app.utils.applyNavigationBarPadding @@ -339,16 +341,31 @@ class BookInfoActivity : tvIntro.text = book.getDisplayIntro() llToc?.visible(!book.isWebFile) upTvBookshelf() - val kinds = book.getKindList() - if (kinds.isEmpty()) { - lbKind.gone() - } else { - lbKind.visible() - lbKind.setLabels(kinds) - } + upKinds(book) upGroup(book.group) } + private fun upKinds(book: Book) = binding.run { + lifecycleScope.launch { + var kinds = book.getKindList() + if (book.isLocal) { + withContext(IO) { + val size = FileDoc.fromFile(book.bookUrl).size + if (size > 0) { + kinds = kinds.toMutableList() + kinds.add(ConvertUtils.formatFileSize(size)) + } + } + } + if (kinds.isEmpty()) { + lbKind.gone() + } else { + lbKind.visible() + lbKind.setLabels(kinds) + } + } + } + private fun showCover(book: Book) { binding.ivCover.load(book.getDisplayCover(), book.name, book.author, false, book.origin) { if (!AppConfig.isEInkMode) { diff --git a/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt b/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt index 296df8b95..3751d92cc 100644 --- a/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt @@ -45,14 +45,7 @@ data class FileDoc( fun asDocumentFile(): DocumentFile? { if (isContentScheme) { return if (isDir) { - Class.forName("androidx.documentfile.provider.TreeDocumentFile") - .getDeclaredConstructor( - DocumentFile::class.java, - Context::class.java, - Uri::class.java - ).apply { - isAccessible = true - }.newInstance(null, appCtx, uri) as DocumentFile + TreeDocumentFileConstructor.newInstance(null, appCtx, uri) as DocumentFile } else { DocumentFile.fromSingleUri(appCtx, uri) } @@ -69,10 +62,25 @@ data class FileDoc( companion object { + private val TreeDocumentFileConstructor by lazy { + Class.forName("androidx.documentfile.provider.TreeDocumentFile") + .getDeclaredConstructor( + DocumentFile::class.java, + Context::class.java, + Uri::class.java + ).apply { + isAccessible = true + } + } + fun fromDir(path: String): FileDoc { return fromUri(path.toUri(), true) } + fun fromFile(path: String): FileDoc { + return fromUri(path.toUri(), false) + } + fun fromUri(uri: Uri, isDir: Boolean): FileDoc { if (uri.isContentScheme()) { val doc = if (isDir) {