优化
This commit is contained in:
@@ -2,16 +2,11 @@ package io.legado.app.ui.association
|
|||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.documentfile.provider.DocumentFile
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import io.legado.app.constant.AppLog
|
import io.legado.app.constant.AppLog
|
||||||
import io.legado.app.constant.AppPattern.bookFileRegex
|
import io.legado.app.constant.AppPattern.bookFileRegex
|
||||||
import io.legado.app.exception.NoStackTraceException
|
|
||||||
import io.legado.app.model.localBook.LocalBook
|
import io.legado.app.model.localBook.LocalBook
|
||||||
import io.legado.app.utils.inputStream
|
import io.legado.app.utils.*
|
||||||
import io.legado.app.utils.isJson
|
|
||||||
import io.legado.app.utils.printOnDebug
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
class FileAssociationViewModel(application: Application) : BaseAssociationViewModel(application) {
|
class FileAssociationViewModel(application: Application) : BaseAssociationViewModel(application) {
|
||||||
val importBookLiveData = MutableLiveData<Uri>()
|
val importBookLiveData = MutableLiveData<Uri>()
|
||||||
@@ -24,15 +19,9 @@ class FileAssociationViewModel(application: Application) : BaseAssociationViewMo
|
|||||||
execute {
|
execute {
|
||||||
lateinit var fileName: String
|
lateinit var fileName: String
|
||||||
//如果是普通的url,需要根据返回的内容判断是什么
|
//如果是普通的url,需要根据返回的内容判断是什么
|
||||||
if (uri.scheme == "file" || uri.scheme == "content") {
|
if (uri.isContentScheme() || uri.isFileScheme()) {
|
||||||
fileName = if (uri.scheme == "file") {
|
val fileDoc = FileDoc.fromUri(uri, false)
|
||||||
val file = File(uri.path.toString())
|
fileName = fileDoc.name
|
||||||
file.name
|
|
||||||
} else {
|
|
||||||
val file = DocumentFile.fromSingleUri(context, uri)
|
|
||||||
if (file?.exists() != true) throw NoStackTraceException("文件不存在")
|
|
||||||
file.name ?: ""
|
|
||||||
}
|
|
||||||
kotlin.runCatching {
|
kotlin.runCatching {
|
||||||
if (uri.inputStream(context).isJson()) {
|
if (uri.inputStream(context).isJson()) {
|
||||||
importJson(uri)
|
importJson(uri)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package io.legado.app.utils
|
package io.legado.app.utils
|
||||||
|
|
||||||
|
import android.app.DownloadManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
@@ -7,6 +8,7 @@ import android.provider.DocumentsContract
|
|||||||
import androidx.documentfile.provider.DocumentFile
|
import androidx.documentfile.provider.DocumentFile
|
||||||
import io.legado.app.exception.NoStackTraceException
|
import io.legado.app.exception.NoStackTraceException
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
|
import splitties.systemservices.downloadManager
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.nio.charset.Charset
|
import java.nio.charset.Charset
|
||||||
|
|
||||||
@@ -63,6 +65,9 @@ object DocumentUtils {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DocumentFile 的 listFiles() 非常的慢,所以这里直接从数据库查询
|
||||||
|
*/
|
||||||
@Throws(Exception::class)
|
@Throws(Exception::class)
|
||||||
fun listFiles(uri: Uri, filter: ((file: FileDoc) -> Boolean)? = null): ArrayList<FileDoc> {
|
fun listFiles(uri: Uri, filter: ((file: FileDoc) -> Boolean)? = null): ArrayList<FileDoc> {
|
||||||
if (!uri.isContentScheme()) {
|
if (!uri.isContentScheme()) {
|
||||||
@@ -149,6 +154,18 @@ data class FileDoc(
|
|||||||
if (uri.isContentScheme()) {
|
if (uri.isContentScheme()) {
|
||||||
val doc = if (isDir) {
|
val doc = if (isDir) {
|
||||||
DocumentFile.fromTreeUri(appCtx, uri)!!
|
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 {
|
} else {
|
||||||
DocumentFile.fromSingleUri(appCtx, uri)!!
|
DocumentFile.fromSingleUri(appCtx, uri)!!
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ import java.nio.charset.Charset
|
|||||||
|
|
||||||
fun Uri.isContentScheme() = this.scheme == "content"
|
fun Uri.isContentScheme() = this.scheme == "content"
|
||||||
|
|
||||||
|
fun Uri.isFileScheme() = this.scheme == "file"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取URI
|
* 读取URI
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user