Merge pull request #139 from tom93/json-streams

Use streams to encode and decode the JSON backups
This commit is contained in:
Naveen Singh 2024-12-25 18:50:58 +05:30 committed by GitHub
commit 207596d33b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 24 additions and 14 deletions

View file

@ -5,9 +5,10 @@ import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.provider.DocumentsContract
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.encodeToStream
import org.fossify.commons.activities.ManageBlockedNumbersActivity import org.fossify.commons.activities.ManageBlockedNumbersActivity
import org.fossify.commons.dialogs.ChangeDateTimeFormatDialog import org.fossify.commons.dialogs.ChangeDateTimeFormatDialog
import org.fossify.commons.dialogs.ConfirmationDialog import org.fossify.commons.dialogs.ConfirmationDialog
@ -170,8 +171,10 @@ class SettingsActivity : SimpleActivity() {
} }
} }
@OptIn(kotlinx.serialization.ExperimentalSerializationApi::class)
private fun exportMessages(uri: Uri) { private fun exportMessages(uri: Uri) {
ensureBackgroundThread { ensureBackgroundThread {
var success = false
try { try {
MessagesReader(this).getMessagesToExport( MessagesReader(this).getMessagesToExport(
config.exportSms, config.exportSms,
@ -182,16 +185,23 @@ class SettingsActivity : SimpleActivity() {
return@getMessagesToExport return@getMessagesToExport
} }
val json = Json { encodeDefaults = true } val json = Json { encodeDefaults = true }
val jsonString = json.encodeToString(messagesToExport) contentResolver.openOutputStream(uri)!!.buffered().use { outputStream ->
val outputStream = contentResolver.openOutputStream(uri)!! json.encodeToStream(messagesToExport, outputStream)
outputStream.use {
it.write(jsonString.toByteArray())
} }
success = true
toast(org.fossify.commons.R.string.exporting_successful) toast(org.fossify.commons.R.string.exporting_successful)
} }
} catch (e: Exception) { } catch (e: Throwable) { // also catch OutOfMemoryError etc.
showErrorToast(e) showErrorToast(e.toString())
} finally {
if (!success) {
// delete the file to avoid leaving behind an empty/corrupt file
try {
DocumentsContract.deleteDocument(contentResolver, uri)
} catch (ignored: Exception) {
// ignored because we don't want to overwhelm the user with two error messages
}
}
} }
} }
} }

View file

@ -4,6 +4,7 @@ import android.net.Uri
import android.util.Xml import android.util.Xml
import kotlinx.serialization.SerializationException import kotlinx.serialization.SerializationException
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.decodeFromStream
import org.fossify.commons.extensions.showErrorToast import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toast import org.fossify.commons.extensions.toast
import org.fossify.commons.helpers.ensureBackgroundThread import org.fossify.commons.helpers.ensureBackgroundThread
@ -32,18 +33,17 @@ class MessagesImporter(private val activity: SimpleActivity) {
} else { } else {
importJson(uri) importJson(uri)
} }
} catch (e: Exception) { } catch (e: Throwable) { // also catch OutOfMemoryError etc.
activity.showErrorToast(e) activity.showErrorToast(e.toString())
} }
} }
@OptIn(kotlinx.serialization.ExperimentalSerializationApi::class)
private fun importJson(uri: Uri) { private fun importJson(uri: Uri) {
try { try {
val jsonString = activity.contentResolver.openInputStream(uri)!!.use { inputStream -> val deserializedList = activity.contentResolver.openInputStream(uri)!!.buffered().use { inputStream ->
inputStream.bufferedReader().readText() Json.decodeFromStream<List<MessagesBackup>>(inputStream)
} }
val deserializedList = Json.decodeFromString<List<MessagesBackup>>(jsonString)
if (deserializedList.isEmpty()) { if (deserializedList.isEmpty()) {
activity.toast(org.fossify.commons.R.string.no_entries_for_importing) activity.toast(org.fossify.commons.R.string.no_entries_for_importing)
return return