Просмотр исходного кода

feat(LocalBook): `Book.getLocalUri` return dynamic value

Xwite 4 лет назад
Родитель
Сommit
e4dd60f16e
1 измененных файлов с 22 добавлено и 3 удалено
  1. 22 3
      app/src/main/java/io/legado/app/help/book/BookExtensions.kt

+ 22 - 3
app/src/main/java/io/legado/app/help/book/BookExtensions.kt

@@ -1,13 +1,17 @@
 package io.legado.app.help.book
 
 import android.net.Uri
+import androidx.documentfile.provider.DocumentFile
 import io.legado.app.constant.BookSourceType
 import io.legado.app.constant.BookType
 import io.legado.app.data.entities.Book
 import io.legado.app.data.entities.BookSource
+import io.legado.app.help.config.AppConfig.defaultBookTreeUri
 import io.legado.app.exception.NoStackTraceException
 import io.legado.app.utils.isContentScheme
+import io.legado.app.utils.getFile
 import java.io.File
+import splitties.init.appCtx
 
 
 val Book.isAudio: Boolean
@@ -50,10 +54,25 @@ val Book.isOnLineTxt: Boolean
 
 fun Book.getLocalUri(): Uri {
     if (isLocal) {
-        if (bookUrl.isContentScheme()) {
-            return Uri.parse(bookUrl)
+         val originBookUri = if (bookUrl.isContentScheme()) {
+             Uri.parse(bookUrl)
+         } else {
+             Uri.fromFile(File(bookUrl))
+         }
+        //不同的设备书籍保存路径可能不一样 优先尝试寻找当前保存路径下的文件
+        defaultBookTreeUri ?: return originBookUri
+        val treeUri = Uri.parse(defaultBookTreeUri)
+        return if (treeUri.isContentScheme()) {
+            DocumentFile.fromTreeUri(appCtx, treeUri)?.run {
+                findFile(originName)?.let {
+                    if (it.exists()) it.uri else originBookUri
+                } ?: originBookUri
+            } ?: originBookUri
+        } else {
+            val treeFile = File(treeUri.path!!)
+            val file = treeFile.getFile(originName)
+            if (file.exists()) Uri.fromFile(file) else originBookUri
         }
-        return Uri.fromFile(File(bookUrl))
     }
     throw NoStackTraceException("不是本地书籍")
 }