This commit is contained in:
gedoor 2021-10-23 00:55:14 +08:00
parent b594e7a24b
commit d5dad7065d
4 changed files with 44 additions and 36 deletions

View File

@ -190,7 +190,7 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
adapter.selectedUris.clear()
adapter.clearItems()
launch(IO) {
val docList = DocumentUtils.listFiles(this@ImportBookActivity, lastDoc.uri)
val docList = DocumentUtils.listFiles(lastDoc.uri)
for (i in docList.lastIndex downTo 0) {
val item = docList[i]
if (item.name.startsWith(".")) {

View File

@ -47,7 +47,7 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application)
find: (docItem: DocItem) -> Unit,
finally: (() -> Unit)? = null
) {
val docList = DocumentUtils.listFiles(context, documentFile.uri)
val docList = DocumentUtils.listFiles(documentFile.uri)
docList.forEach { docItem ->
if (docItem.isDir) {
DocumentFile.fromSingleUri(context, docItem.uri)?.let {

View File

@ -31,7 +31,7 @@ import kotlin.collections.ArrayList
class FontSelectDialog : BaseDialogFragment(R.layout.dialog_font_select),
Toolbar.OnMenuItemClickListener,
FontAdapter.CallBack {
private val fontRegex = Regex(".*\\.[ot]tf")
private val fontRegex = Regex("(?i).*\\.[ot]tf")
private val fontFolder by lazy {
FileUtils.createFolderIfNotExist(appCtx.filesDir, "Fonts")
}
@ -148,13 +148,7 @@ class FontSelectDialog : BaseDialogFragment(R.layout.dialog_font_select),
private fun loadFontFiles(doc: DocumentFile) {
execute {
val fontItems = arrayListOf<DocItem>()
val docItems = DocumentUtils.listFiles(appCtx, doc.uri)
docItems.forEach { item ->
if (item.name.lowercase(Locale.getDefault()).matches(fontRegex)) {
fontItems.add(item)
}
}
val fontItems = DocumentUtils.listFiles(doc.uri, fontRegex)
mergeFontItems(fontItems, getLocalFonts())
}.onSuccess {
adapter.setItems(it)
@ -175,21 +169,7 @@ class FontSelectDialog : BaseDialogFragment(R.layout.dialog_font_select),
private fun loadFontFiles(path: String) {
execute {
val fontItems = arrayListOf<DocItem>()
val file = File(path)
file.listFiles { pathName ->
pathName.name.lowercase(Locale.getDefault()).matches(fontRegex)
}?.forEach {
fontItems.add(
DocItem(
it.name,
it.extension,
it.length(),
Date(it.lastModified()),
Uri.parse(it.absolutePath)
)
)
}
val fontItems = DocumentUtils.listFiles(path, fontRegex)
mergeFontItems(fontItems, getLocalFonts())
}.onSuccess {
adapter.setItems(it)

View File

@ -6,7 +6,9 @@ import android.net.Uri
import android.provider.DocumentsContract
import androidx.documentfile.provider.DocumentFile
import io.legado.app.model.NoStackTraceException
import splitties.init.appCtx
import timber.log.Timber
import java.io.File
import java.nio.charset.Charset
import java.util.*
@ -93,13 +95,13 @@ object DocumentUtils {
} ?: throw NoStackTraceException("打开文件失败\n${uri}")
}
fun listFiles(context: Context, uri: Uri): ArrayList<DocItem> {
fun listFiles(uri: Uri, regex: Regex? = null): ArrayList<DocItem> {
val docList = arrayListOf<DocItem>()
var cursor: Cursor? = null
try {
val childrenUri = DocumentsContract
.buildChildDocumentsUriUsingTree(uri, DocumentsContract.getDocumentId(uri))
cursor = context.contentResolver.query(
cursor = appCtx.contentResolver.query(
childrenUri, arrayOf(
DocumentsContract.Document.COLUMN_DOCUMENT_ID,
DocumentsContract.Document.COLUMN_DISPLAY_NAME,
@ -116,15 +118,18 @@ object DocumentUtils {
val dci = cursor.getColumnIndex(DocumentsContract.Document.COLUMN_LAST_MODIFIED)
if (cursor.moveToFirst()) {
do {
val item = DocItem(
name = cursor.getString(nci),
attr = cursor.getString(mci),
size = cursor.getLong(sci),
date = Date(cursor.getLong(dci)),
uri = DocumentsContract
.buildDocumentUriUsingTree(uri, cursor.getString(ici))
)
docList.add(item)
val name = cursor.getString(nci)
if (regex == null || regex.matches(name)) {
val item = DocItem(
name = name,
attr = cursor.getString(mci),
size = cursor.getLong(sci),
date = Date(cursor.getLong(dci)),
uri = DocumentsContract
.buildDocumentUriUsingTree(uri, cursor.getString(ici))
)
docList.add(item)
}
} while (cursor.moveToNext())
}
}
@ -136,6 +141,29 @@ object DocumentUtils {
return docList
}
fun listFiles(path: String, regex: Regex? = null): ArrayList<DocItem> {
val docItems = arrayListOf<DocItem>()
kotlin.runCatching {
val file = File(path)
file.listFiles { pathName ->
regex?.let {
pathName.name.matches(it)
} ?: true
}?.forEach {
docItems.add(
DocItem(
it.name,
it.extension,
it.length(),
Date(it.lastModified()),
Uri.parse(it.absolutePath)
)
)
}
}
return docItems
}
}
data class DocItem(