diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2024-07-14 23:41:26 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2024-07-14 23:41:26 +0200 |
| commit | 47d3bf13023b3d62ef4530d439c3bd3e1d2baf9e (patch) | |
| tree | 9c5de5112c3399188abe15d88ba8aa60c5f4501e /app/src/main/java/org/the_jk/cleversync/io | |
| parent | 820d8c9bb4b702015d2297011f79b0cc83f665aa (diff) | |
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.
Diffstat (limited to 'app/src/main/java/org/the_jk/cleversync/io')
3 files changed, 42 insertions, 56 deletions
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<Content> data class Content( - val directories: LiveData<List<Directory>>, - val files: LiveData<List<File>>, - val links: LiveData<List<Link>>, + val directories: List<Directory>, + val files: List<File>, + val links: List<Link>, ) } 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<Content> 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<List<ModifiableDirectory>>, - val files: LiveData<List<ModifiableFile>>, - val links: LiveData<List<ModifiableLink>>, + val directories: List<ModifiableDirectory>, + val files: List<ModifiableFile>, + val links: List<ModifiableLink>, ) } 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<Entry.Directory>().map { entry -> - PathDirectory(entry.path, pathWatcher) - } - }, - base.map { entries -> - entries.filterIsInstance<Entry.File>().map { entry -> - PathFile(entry.path) - } - }, - base.map { entries -> - entries.filterIsInstance<Entry.Link>().map { entry -> - PathLink(entry.path, pathWatcher) - } - }, - ) + private val modifiableLiveContent: LiveData<ModifiableDirectory.Content> 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<Directory.Content> 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<List<Entry>> + val content: LiveData<ModifiableDirectory.Content> get() = _content @AnyThread override fun update(added: List<Path>, removed: List<Path>) { try { - _content.postValue(mapEntries(path.listDirectoryEntries())) + _content.postValue(makeContent(path.listDirectoryEntries())) } catch (ignored: NoSuchFileException) { } } - private val _content = object : MutableLiveData<List<Entry>>() { + private val _content = object : MutableLiveData<ModifiableDirectory.Content>() { 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<Path>): List<Entry> { - 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<Path>): ModifiableDirectory.Content { + val directories = mutableListOf<ModifiableDirectory>() + val files = mutableListOf<ModifiableFile>() + val links = mutableListOf<ModifiableLink>() + 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) } } |
