Simplify loading/saving files to reduce bugs

This commit is contained in:
Billy Brawner 2019-11-10 10:18:51 -06:00 committed by William Brawner
parent 21cd8d1324
commit c42223f796

View file

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