|
|
@@ -1,5 +1,6 @@
|
|
|
package io.legado.app.utils
|
|
|
|
|
|
+import android.app.DownloadManager
|
|
|
import android.content.Context
|
|
|
import android.database.Cursor
|
|
|
import android.net.Uri
|
|
|
@@ -7,6 +8,7 @@ import android.provider.DocumentsContract
|
|
|
import androidx.documentfile.provider.DocumentFile
|
|
|
import io.legado.app.exception.NoStackTraceException
|
|
|
import splitties.init.appCtx
|
|
|
+import splitties.systemservices.downloadManager
|
|
|
import java.io.File
|
|
|
import java.nio.charset.Charset
|
|
|
|
|
|
@@ -63,6 +65,9 @@ object DocumentUtils {
|
|
|
)
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * DocumentFile 的 listFiles() 非常的慢,所以这里直接从数据库查询
|
|
|
+ */
|
|
|
@Throws(Exception::class)
|
|
|
fun listFiles(uri: Uri, filter: ((file: FileDoc) -> Boolean)? = null): ArrayList<FileDoc> {
|
|
|
if (!uri.isContentScheme()) {
|
|
|
@@ -149,6 +154,18 @@ data class FileDoc(
|
|
|
if (uri.isContentScheme()) {
|
|
|
val doc = if (isDir) {
|
|
|
DocumentFile.fromTreeUri(appCtx, uri)!!
|
|
|
+ } else if (uri.host == "downloads") {
|
|
|
+ val query = DownloadManager.Query()
|
|
|
+ query.setFilterById(uri.lastPathSegment!!.toLong())
|
|
|
+ downloadManager.query(query).use {
|
|
|
+ if (it.moveToFirst()) {
|
|
|
+ val lUriColum = it.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)
|
|
|
+ val lUri = it.getString(lUriColum)
|
|
|
+ DocumentFile.fromSingleUri(appCtx, Uri.parse(lUri))!!
|
|
|
+ } else {
|
|
|
+ DocumentFile.fromSingleUri(appCtx, uri)!!
|
|
|
+ }
|
|
|
+ }
|
|
|
} else {
|
|
|
DocumentFile.fromSingleUri(appCtx, uri)!!
|
|
|
}
|