summaryrefslogtreecommitdiff
path: root/app/src/main/java/org/the_jk/cleversync
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/org/the_jk/cleversync')
-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)
}
}