Simplify loading/saving files to reduce bugs

This commit is contained in:
Billy Brawner 2019-11-10 10:18:51 -06:00
parent 9fb245d91c
commit d2604ac8ce

View file

@ -8,8 +8,6 @@ import com.wbrawner.simplemarkdown.utility.getName
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.FileInputStream
import java.io.InputStream
import java.io.OutputStream
import java.io.Reader
import kotlin.coroutines.CoroutineContext
@ -29,62 +27,41 @@ class MarkdownViewModel : ViewModel() {
suspend fun load(context: Context, uri: Uri?): Boolean {
if (uri == null) return false
return withContext(Dispatchers.IO) {
try {
context.contentResolver.openFileDescriptor(uri, "r")?.use {
val fileInput = FileInputStream(it.fileDescriptor)
val fileName = uri.getName(context)
return@withContext if (load(fileInput)) {
val content = fileInput.reader().use(Reader::readText)
originalMarkdown.postValue(content)
markdownUpdates.postValue(content)
this@MarkdownViewModel.fileName.postValue(fileName)
this@MarkdownViewModel.uri.postValue(uri)
true
} else {
false
}
} ?: false
}
}
suspend fun load(inputStream: InputStream): Boolean {
return try {
withContext(coroutineContext) {
val content = inputStream.reader().use(Reader::readText)
originalMarkdown.postValue(content)
markdownUpdates.postValue(content)
}
true
} catch (e: Throwable) {
e.printStackTrace()
} catch (ignored: Exception) {
false
}
}
}
suspend fun save(context: Context, givenUri: Uri? = this.uri.value): Boolean {
val uri = givenUri ?: this.uri.value ?: return false
return withContext(Dispatchers.IO) {
try {
val fileName = uri.getName(context)
val outputStream = context.contentResolver.openOutputStream(uri)
?: return@withContext false
if (save(outputStream)) {
this@MarkdownViewModel.fileName.postValue(fileName)
this@MarkdownViewModel.uri.postValue(uri)
true
} else {
false
}
}
}
suspend fun save(outputStream: OutputStream): Boolean {
return try {
withContext(coroutineContext) {
outputStream.writer().use {
it.write(markdownUpdates.value ?: "")
}
}
this@MarkdownViewModel.fileName.postValue(fileName)
this@MarkdownViewModel.uri.postValue(uri)
true
} catch (e: Throwable) {
} catch (ignored: Exception) {
false
}
}
}
fun reset(untitledFileName: String) {
fileName.postValue(untitledFileName)