pull/1415/head
gedoor 4 years ago
parent 468c574c25
commit 92ec2d1057
  1. 34
      app/src/main/java/io/legado/app/ui/book/local/ImportBookActivity.kt
  2. 23
      app/src/main/java/io/legado/app/ui/book/local/ImportBookViewModel.kt
  3. 35
      app/src/main/java/io/legado/app/utils/DocumentExtensions.kt

@ -190,22 +190,26 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
adapter.selectedUris.clear() adapter.selectedUris.clear()
adapter.clearItems() adapter.clearItems()
launch(IO) { launch(IO) {
val docList = DocumentUtils.listFiles(lastDoc.uri) runCatching {
for (i in docList.lastIndex downTo 0) { val docList = DocumentUtils.listFiles(lastDoc.uri)
val item = docList[i] for (i in docList.lastIndex downTo 0) {
if (item.name.startsWith(".")) { val item = docList[i]
docList.removeAt(i) if (item.name.startsWith(".")) {
} else if (!item.isDir docList.removeAt(i)
&& !item.name.endsWith(".txt", true) } else if (!item.isDir
&& !item.name.endsWith(".epub", true) && !item.name.endsWith(".txt", true)
&& !item.name.endsWith(".umd", true) && !item.name.endsWith(".epub", true)
) { && !item.name.endsWith(".umd", true)
docList.removeAt(i) ) {
docList.removeAt(i)
}
} }
} docList.sortWith(compareBy({ !it.isDir }, { it.name }))
docList.sortWith(compareBy({ !it.isDir }, { it.name })) withContext(Main) {
withContext(Main) { adapter.setItems(docList)
adapter.setItems(docList) }
}.onFailure {
toastOnUi("获取文件列表出错\n${it.localizedMessage}")
} }
} }
} }

@ -8,6 +8,7 @@ import io.legado.app.model.localBook.LocalBook
import io.legado.app.utils.DocItem import io.legado.app.utils.DocItem
import io.legado.app.utils.DocumentUtils import io.legado.app.utils.DocumentUtils
import io.legado.app.utils.isContentScheme import io.legado.app.utils.isContentScheme
import io.legado.app.utils.toastOnUi
import java.io.File import java.io.File
import java.util.* import java.util.*
@ -47,17 +48,21 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application)
find: (docItem: DocItem) -> Unit, find: (docItem: DocItem) -> Unit,
finally: (() -> Unit)? = null finally: (() -> Unit)? = null
) { ) {
val docList = DocumentUtils.listFiles(documentFile.uri) kotlin.runCatching {
docList.forEach { docItem -> val docList = DocumentUtils.listFiles(documentFile.uri)
if (docItem.isDir) { docList.forEach { docItem ->
DocumentFile.fromSingleUri(context, docItem.uri)?.let { if (docItem.isDir) {
scanDoc(it, false, find) DocumentFile.fromSingleUri(context, docItem.uri)?.let {
scanDoc(it, false, find)
}
} else if (docItem.name.endsWith(".txt", true)
|| docItem.name.endsWith(".epub", true)
) {
find(docItem)
} }
} else if (docItem.name.endsWith(".txt", true)
|| docItem.name.endsWith(".epub", true)
) {
find(docItem)
} }
}.onFailure {
context.toastOnUi("扫描文件夹出错\n${it.localizedMessage}")
} }
if (isRoot) { if (isRoot) {
finally?.invoke() finally?.invoke()

@ -7,7 +7,6 @@ import android.provider.DocumentsContract
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import io.legado.app.model.NoStackTraceException import io.legado.app.model.NoStackTraceException
import splitties.init.appCtx import splitties.init.appCtx
import timber.log.Timber
import java.io.File import java.io.File
import java.nio.charset.Charset import java.nio.charset.Charset
import java.util.* import java.util.*
@ -95,6 +94,7 @@ object DocumentUtils {
} ?: throw NoStackTraceException("打开文件失败\n${uri}") } ?: throw NoStackTraceException("打开文件失败\n${uri}")
} }
@Throws(Exception::class)
fun listFiles(uri: Uri, regex: Regex? = null): ArrayList<DocItem> { fun listFiles(uri: Uri, regex: Regex? = null): ArrayList<DocItem> {
val docList = arrayListOf<DocItem>() val docList = arrayListOf<DocItem>()
var cursor: Cursor? = null var cursor: Cursor? = null
@ -133,33 +133,30 @@ object DocumentUtils {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} }
} catch (e: Exception) {
Timber.e(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
return docList return docList
} }
@Throws(Exception::class)
fun listFiles(path: String, regex: Regex? = null): ArrayList<DocItem> { fun listFiles(path: String, regex: Regex? = null): ArrayList<DocItem> {
val docItems = arrayListOf<DocItem>() val docItems = arrayListOf<DocItem>()
kotlin.runCatching { val file = File(path)
val file = File(path) file.listFiles { pathName ->
file.listFiles { pathName -> regex?.let {
regex?.let { pathName.name.matches(it)
pathName.name.matches(it) } ?: true
} ?: true }?.forEach {
}?.forEach { docItems.add(
docItems.add( DocItem(
DocItem( it.name,
it.name, it.extension,
it.extension, it.length(),
it.length(), Date(it.lastModified()),
Date(it.lastModified()), Uri.parse(it.absolutePath)
Uri.parse(it.absolutePath)
)
) )
} )
} }
return docItems return docItems
} }

Loading…
Cancel
Save