diff options
Diffstat (limited to 'app/src/main/java/org/the_jk')
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) } } |
