Fix concurrent modification

This commit is contained in:
FooIbar committed 2024-01-03 17:17:19 +08:00
1 parent c994890f28
commit 60dc59adbc
2 files changed
+27 -12

No files matched your search

@@ -28,9 +28,9 @@ import java.io.File
import java.util.Locale
class RawFile(parent: UniFile?, private var file: File) : UniFile(parent) {
val parent = parent as? RawFile
private val parent = parent as? RawFile
var cachePresent = false
private var cachePresent = false
private val allChildren by lazy {
val current = this
cachePresent = true
@@ -41,9 +41,12 @@ class RawFile(parent: UniFile?, private var file: File) : UniFile(parent) {
}
}
private fun popParentCacheIfPresent() = apply {
val present = parent?.cachePresent ?: false
if (present) parent?.allChildren?.add(this)
private fun popCacheIfPresent(file: RawFile) = apply {
if (cachePresent) {
synchronized(allChildren) {
allChildren.add(file)
}
}
}
override fun createFile(displayName: String): UniFile? {
@@ -88,7 +91,7 @@ class RawFile(parent: UniFile?, private var file: File) : UniFile(parent) {
override fun ensureDir(): Boolean {
if (file.isDirectory) return true
if (file.mkdirs()) {
popParentCacheIfPresent()
parent?.popCacheIfPresent(this)
return true
}
return false
@@ -98,7 +101,7 @@ class RawFile(parent: UniFile?, private var file: File) : UniFile(parent) {
if (file.exists()) return file.isFile
parent?.ensureDir()
val success = file.createNewFile()
if (success) popParentCacheIfPresent()
if (success) parent?.popCacheIfPresent(this)
return success
}
@@ -108,9 +111,13 @@ class RawFile(parent: UniFile?, private var file: File) : UniFile(parent) {
override fun exists() = file.exists()
override fun listFiles() = allChildren
override fun listFiles() = synchronized(allChildren) {
allChildren.toList()
}
override fun findFirst(filter: (String) -> Boolean) = allChildren.firstOrNull { filter(it.name) }
override fun findFirst(filter: (String) -> Boolean) = synchronized(allChildren) {
allChildren.firstOrNull { filter(it.name) }
}
override fun renameTo(displayName: String): Boolean {
val target = File(file.parentFile, displayName)
@@ -36,7 +36,11 @@ class TreeDocumentFile(
}
private fun popCacheIfPresent(file: TreeDocumentFile) = apply {
if (cachePresent) allChildren.add(file)
if (cachePresent) {
synchronized(allChildren) {
allChildren.add(file)
}
}
}
constructor(parent: UniFile?, uri: Uri) : this(parent, uri, getFilenameForUri(uri))
@@ -135,9 +139,13 @@ class TreeDocumentFile(
override fun exists() = DocumentsContractApi19.exists(uri)
override fun listFiles() = allChildren
override fun listFiles() = synchronized(allChildren) {
allChildren.toList()
}
override fun findFirst(filter: (String) -> Boolean) = allChildren.firstOrNull { filter(it.filename) }
override fun findFirst(filter: (String) -> Boolean) = synchronized(allChildren) {
allChildren.firstOrNull { filter(it.filename) }
}
override fun renameTo(displayName: String): Boolean {
val result = DocumentsContractApi21.renameTo(appCtx, uri, displayName)