Fix concurrent modification
This commit is contained in:
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)
|
||||
|
||||
Reference in new issue
Block a user