From 47d3bf13023b3d62ef4530d439c3bd3e1d2baf9e Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Sun, 14 Jul 2024 23:41:26 +0200 Subject: Add Directory#liveList and make Directory#list() direct Also move the LiveData outside Directory.Content. A lot of code doesn't care about Directory content in two seconds, they want to know it now. Also, the LiveData returned is one of the annoying one where the content isn't correct until someone observes it. This makes more sense this way. --- .../java/org/the_jk/cleversync/io/Directory.kt | 7 +- .../the_jk/cleversync/io/ModifiableDirectory.kt | 7 +- .../org/the_jk/cleversync/io/impl/PathDirectory.kt | 84 +++++++++------------- 3 files changed, 42 insertions(+), 56 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/org/the_jk/cleversync/io/Directory.kt b/app/src/main/java/org/the_jk/cleversync/io/Directory.kt index 2273f3e..cf47db9 100644 --- a/app/src/main/java/org/the_jk/cleversync/io/Directory.kt +++ b/app/src/main/java/org/the_jk/cleversync/io/Directory.kt @@ -6,10 +6,11 @@ interface Directory { val name: String fun list(): Content + fun liveList(): LiveData data class Content( - val directories: LiveData>, - val files: LiveData>, - val links: LiveData>, + val directories: List, + val files: List, + val links: List, ) } diff --git a/app/src/main/java/org/the_jk/cleversync/io/ModifiableDirectory.kt b/app/src/main/java/org/the_jk/cleversync/io/ModifiableDirectory.kt index 43efa8f..f056bf5 100644 --- a/app/src/main/java/org/the_jk/cleversync/io/ModifiableDirectory.kt +++ b/app/src/main/java/org/the_jk/cleversync/io/ModifiableDirectory.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData interface ModifiableDirectory : Directory { fun modifiableList(): Content + fun modifiableLiveList(): LiveData fun createDirectory(name: String): ModifiableDirectory fun createFile(name: String): ModifiableFile @@ -14,8 +15,8 @@ interface ModifiableDirectory : Directory { fun removeLink(name: String): Boolean data class Content( - val directories: LiveData>, - val files: LiveData>, - val links: LiveData>, + val directories: List, + val files: List, + val links: List, ) } diff --git a/app/src/main/java/org/the_jk/cleversync/io/impl/PathDirectory.kt b/app/src/main/java/org/the_jk/cleversync/io/impl/PathDirectory.kt index fab4dcc..2df6cc4 100644 --- a/app/src/main/java/org/the_jk/cleversync/io/impl/PathDirectory.kt +++ b/app/src/main/java/org/the_jk/cleversync/io/impl/PathDirectory.kt @@ -31,37 +31,22 @@ internal open class PathDirectory( DirectoryWatcher() } - private val modifiableContent: ModifiableDirectory.Content by lazy { - val base = watcher.content - ModifiableDirectory.Content( - base.map { entries -> - entries.filterIsInstance().map { entry -> - PathDirectory(entry.path, pathWatcher) - } - }, - base.map { entries -> - entries.filterIsInstance().map { entry -> - PathFile(entry.path) - } - }, - base.map { entries -> - entries.filterIsInstance().map { entry -> - PathLink(entry.path, pathWatcher) - } - }, - ) + private val modifiableLiveContent: LiveData by lazy { + watcher.content } - private val content: Directory.Content by lazy { - val base = modifiableContent - Directory.Content( - base.directories.map { it }, - base.files.map { it }, - base.links.map { it }, - ) + private val liveContent: LiveData by lazy { + modifiableLiveContent.map { + Directory.Content( + it.directories, + it.files, + it.links, + ) + } } - override fun modifiableList() = modifiableContent + override fun modifiableList() = makeContent(path.listDirectoryEntries()) + override fun modifiableLiveList() = modifiableLiveContent override fun createDirectory(name: String): ModifiableDirectory { val path = path.resolve(name) @@ -99,30 +84,29 @@ internal open class PathDirectory( override val name: String get() = path.name - override fun list() = content + override fun list(): Directory.Content { + val modifiable = modifiableList() + return Directory.Content(modifiable.directories, modifiable.files, modifiable.links) + } + + override fun liveList() = liveContent override fun equals(other: Any?) = other is PathDirectory && other.path == path override fun hashCode() = path.hashCode() - private sealed class Entry(val path: Path) { - class Directory(path: Path) : Entry(path) - class File(path: Path) : Entry(path) - class Link(path: Path) : Entry(path) - } - private inner class DirectoryWatcher : PathWatcher.Delegate { - val content: LiveData> + val content: LiveData get() = _content @AnyThread override fun update(added: List, removed: List) { try { - _content.postValue(mapEntries(path.listDirectoryEntries())) + _content.postValue(makeContent(path.listDirectoryEntries())) } catch (ignored: NoSuchFileException) { } } - private val _content = object : MutableLiveData>() { + private val _content = object : MutableLiveData() { override fun onActive() { setup() } @@ -135,7 +119,7 @@ internal open class PathDirectory( private fun setup() { val entries = path.listDirectoryEntries() pathWatcher.add(path, this) - _content.value = mapEntries(entries) + _content.value = makeContent(entries) } private fun clear() { @@ -143,19 +127,19 @@ internal open class PathDirectory( } } - companion object { - private fun mapEntries(entries: List): List { - return entries.mapNotNull { - if (it.isDirectory(LinkOption.NOFOLLOW_LINKS)) { - Entry.Directory(it) - } else if (it.isRegularFile(LinkOption.NOFOLLOW_LINKS)) { - Entry.File(it) - } else if (it.isSymbolicLink()) { - Entry.Link(it) - } else { - null - } + private fun makeContent(entries: List): ModifiableDirectory.Content { + val directories = mutableListOf() + val files = mutableListOf() + val links = mutableListOf() + entries.forEach { + if (it.isDirectory(LinkOption.NOFOLLOW_LINKS)) { + directories.add(PathDirectory(it, pathWatcher)) + } else if (it.isRegularFile(LinkOption.NOFOLLOW_LINKS)) { + files.add(PathFile(it)) + } else if (it.isSymbolicLink()) { + links.add(PathLink(it, pathWatcher)) } } + return ModifiableDirectory.Content(directories, files, links) } } -- cgit v1.2.3-70-g09d2