summaryrefslogtreecommitdiff
path: root/app/src/main/java/org/the_jk/cleversync/io
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2024-07-14 23:41:26 +0200
committerJoel Klinghed <the_jk@spawned.biz>2024-07-14 23:41:26 +0200
commit47d3bf13023b3d62ef4530d439c3bd3e1d2baf9e (patch)
tree9c5de5112c3399188abe15d88ba8aa60c5f4501e /app/src/main/java/org/the_jk/cleversync/io
parent820d8c9bb4b702015d2297011f79b0cc83f665aa (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')
-rw-r--r--app/src/main/java/org/the_jk/cleversync/io/Directory.kt7
-rw-r--r--app/src/main/java/org/the_jk/cleversync/io/ModifiableDirectory.kt7
-rw-r--r--app/src/main/java/org/the_jk/cleversync/io/impl/PathDirectory.kt84
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)
}
}