Fix StrictMode errors
parent
ac96c49b60
commit
e5b6947586
@ -1,20 +1,31 @@
|
|||||||
package org.koitharu.kotatsu.core.fs
|
package org.koitharu.kotatsu.core.fs
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import org.koitharu.kotatsu.core.util.iterator.CloseableIterator
|
import androidx.annotation.RequiresApi
|
||||||
|
import org.koitharu.kotatsu.core.util.CloseableSequence
|
||||||
import org.koitharu.kotatsu.core.util.iterator.MappingIterator
|
import org.koitharu.kotatsu.core.util.iterator.MappingIterator
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
|
|
||||||
class FileSequence(private val dir: File) : Sequence<File> {
|
sealed interface FileSequence : CloseableSequence<File> {
|
||||||
|
|
||||||
override fun iterator(): Iterator<File> {
|
@RequiresApi(Build.VERSION_CODES.O)
|
||||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
class StreamImpl(dir: File) : FileSequence {
|
||||||
val stream = Files.newDirectoryStream(dir.toPath())
|
|
||||||
CloseableIterator(MappingIterator(stream.iterator(), Path::toFile), stream)
|
private val stream = Files.newDirectoryStream(dir.toPath())
|
||||||
} else {
|
|
||||||
dir.listFiles().orEmpty().iterator()
|
override fun iterator(): Iterator<File> = MappingIterator(stream.iterator(), Path::toFile)
|
||||||
|
|
||||||
|
override fun close() = stream.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ListImpl(dir: File) : FileSequence {
|
||||||
|
|
||||||
|
private val list = dir.listFiles().orEmpty()
|
||||||
|
|
||||||
|
override fun iterator(): Iterator<File> = list.iterator()
|
||||||
|
|
||||||
|
override fun close() = Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,3 @@
|
|||||||
|
package org.koitharu.kotatsu.core.util
|
||||||
|
|
||||||
|
interface CloseableSequence<T> : Sequence<T>, AutoCloseable
|
||||||
@ -1,36 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.core.util.iterator
|
|
||||||
|
|
||||||
import okhttp3.internal.closeQuietly
|
|
||||||
import okio.Closeable
|
|
||||||
|
|
||||||
class CloseableIterator<T>(
|
|
||||||
private val upstream: Iterator<T>,
|
|
||||||
private val closeable: Closeable,
|
|
||||||
) : Iterator<T>, Closeable {
|
|
||||||
|
|
||||||
private var isClosed = false
|
|
||||||
|
|
||||||
override fun hasNext(): Boolean {
|
|
||||||
val result = upstream.hasNext()
|
|
||||||
if (!result) {
|
|
||||||
close()
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun next(): T {
|
|
||||||
try {
|
|
||||||
return upstream.next()
|
|
||||||
} catch (e: NoSuchElementException) {
|
|
||||||
close()
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun close() {
|
|
||||||
if (!isClosed) {
|
|
||||||
closeable.closeQuietly()
|
|
||||||
isClosed = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue