From 46e3cb9d13226d712232b3b26818aea041c26b7c Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Mon, 17 Oct 2022 16:05:39 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/help/book/BookExtensions.kt | 73 ++++++++++++------- .../io/legado/app/help/config/AppConfig.kt | 2 + .../io/legado/app/utils/FileDocExtensions.kt | 8 ++ 3 files changed, 58 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt index 45c441521..763fc645e 100644 --- a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt +++ b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt @@ -66,42 +66,65 @@ private val localUriCache by lazy { } fun Book.getLocalUri(): Uri { - if (isLocal) { - var uri = localUriCache[bookUrl] - if (uri != null) { - return uri - } - uri = if (bookUrl.isUri()) { - Uri.parse(bookUrl) + if (!isLocal) { + throw NoStackTraceException("不是本地书籍") + } + var uri = localUriCache[bookUrl] + if (uri != null) { + return uri + } + uri = if (bookUrl.isUri()) { + Uri.parse(bookUrl) + } else { + Uri.fromFile(File(bookUrl)) + } + //先检测uri是否有效,这个比较快 + uri.inputStream(appCtx).getOrNull()?.use { + localUriCache[bookUrl] = uri + }?.let { + return uri + } + //不同的设备书籍保存路径可能不一样, uri无效时尝试寻找当前保存路径下的文件 + val defaultBookDir = AppConfig.defaultBookTreeUri + val importBookDir = AppConfig.importBookPath + + // 查找书籍保存目录 + if (!defaultBookDir.isNullOrBlank()) { + val treeUri = Uri.parse(defaultBookDir) + val treeFileDoc = FileDoc.fromUri(treeUri, true) + if (!treeFileDoc.exists()) { + appCtx.toastOnUi("书籍保存目录失效,请重新设置!") } else { - Uri.fromFile(File(bookUrl)) - } - //先检测uri是否有效,这个比较快 - uri.inputStream(appCtx).getOrNull()?.use { - localUriCache[bookUrl] = uri - }?.let { - return uri + val fileDoc = treeFileDoc.find(originName, 5) + if (fileDoc != null) { + localUriCache[bookUrl] = fileDoc.uri + //更新bookUrl 重启不用再找一遍 + bookUrl = fileDoc.toString() + save() + return fileDoc.uri + } } - //不同的设备书籍保存路径可能不一样, uri无效时尝试寻找当前保存路径下的文件 - val defaultBookDir = AppConfig.defaultBookTreeUri - if (defaultBookDir.isNullOrBlank()) { - localUriCache[bookUrl] = uri - return uri + } + + // 查找添加本地选择的目录 + if (!importBookDir.isNullOrBlank()) { + val treeUri = if (importBookDir.isUri()) { + Uri.parse(importBookDir) + } else { + Uri.fromFile(File(importBookDir)) } - val treeUri = Uri.parse(defaultBookDir) val treeFileDoc = FileDoc.fromUri(treeUri, true) - val fileDoc = treeFileDoc.find(originName, 3) + val fileDoc = treeFileDoc.find(originName, 5) if (fileDoc != null) { localUriCache[bookUrl] = fileDoc.uri - //更新bookUrl 重启不用再找一遍 bookUrl = fileDoc.toString() save() return fileDoc.uri } - localUriCache[bookUrl] = uri - return uri } - throw NoStackTraceException("不是本地书籍") + + localUriCache[bookUrl] = uri + return uri } fun Book.cacheLocalUri(uri: Uri) { diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index 3e719344e..46f3f9134 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -135,6 +135,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } } + // 书籍保存位置 var defaultBookTreeUri: String? get() = appCtx.getPrefString(PreferKey.defaultBookTreeUri) set(value) { @@ -166,6 +167,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { appCtx.putPrefInt(PreferKey.threadCount, value) } + // 添加本地选择的目录 var importBookPath: String? get() = appCtx.getPrefString("importBookPath") set(value) { 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 798262602..6debc91e0 100644 --- a/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt @@ -221,6 +221,14 @@ fun FileDoc.exists( } } +fun FileDoc.exists(): Boolean { + return if (uri.isContentScheme()) { + DocumentFile.fromTreeUri(appCtx, uri)!!.exists() + } else { + FileUtils.exist(uri.path!!) + } +} + /** * DocumentFile 的 listFiles() 非常的慢,尽量不要使用 */ From 6058c4a3ee1f809b18b0adbc9c3001b3173361d5 Mon Sep 17 00:00:00 2001 From: Xwite <82232510+Xwite@users.noreply.github.com> Date: Mon, 17 Oct 2022 16:12:25 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=9A=82=E6=97=B6=E4=B8=8D=E6=B7=B7?= =?UTF-8?q?=E6=B7=86ExoPlayer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/proguard-rules.pro | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 7dd9cb948..b95cf1226 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -232,10 +232,12 @@ public static ** valueOf(java.lang.String); } -## 保证该私有变量不被混淆 +## ExoPlayer 反射设置ua 保证该私有变量不被混淆 -keepclassmembers class com.google.android.exoplayer2.upstream.cache.CacheDataSource$Factory { *** upstreamDataSourceFactory; } +## ExoPlayer 暂时不混淆 +-keep class com.google.android.exoplayer.** {*;} ## 对外提供api -keep class io.legado.app.api.ReturnData{*;} From d647ccf4eabfd95eb92e6616e99c00c19ede4724 Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Mon, 17 Oct 2022 16:14:32 +0800 Subject: [PATCH 3/5] =?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/book/BookExtensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt index 763fc645e..635f8a166 100644 --- a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt +++ b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt @@ -107,7 +107,7 @@ fun Book.getLocalUri(): Uri { } // 查找添加本地选择的目录 - if (!importBookDir.isNullOrBlank()) { + if (!importBookDir.isNullOrBlank() && defaultBookDir != importBookDir) { val treeUri = if (importBookDir.isUri()) { Uri.parse(importBookDir) } else { From afc1b4ad2884191d8e65b3c4c62b7ccffbacb962 Mon Sep 17 00:00:00 2001 From: Xwite <82232510+Xwite@users.noreply.github.com> Date: Mon, 17 Oct 2022 16:17:19 +0800 Subject: [PATCH 4/5] Update proguard-rules.pro --- app/proguard-rules.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index b95cf1226..d0c63cd04 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -237,7 +237,7 @@ *** upstreamDataSourceFactory; } ## ExoPlayer 暂时不混淆 --keep class com.google.android.exoplayer.** {*;} +-keep class com.google.android.exoplayer2.** {*;} ## 对外提供api -keep class io.legado.app.api.ReturnData{*;} From ad5911476233e595c97f19d651b5ca176987dc21 Mon Sep 17 00:00:00 2001 From: Xwite <82232510+Xwite@users.noreply.github.com> Date: Mon, 17 Oct 2022 16:27:00 +0800 Subject: [PATCH 5/5] Update proguard-rules.pro --- app/proguard-rules.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index d0c63cd04..5e1d25757 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -236,8 +236,8 @@ -keepclassmembers class com.google.android.exoplayer2.upstream.cache.CacheDataSource$Factory { *** upstreamDataSourceFactory; } -## ExoPlayer 暂时不混淆 --keep class com.google.android.exoplayer2.** {*;} +## ExoPlayer 如果还不能播放就取消注释这个 +# -keep class com.google.android.exoplayer2.** {*;} ## 对外提供api -keep class io.legado.app.api.ReturnData{*;}