Added and refactored xml import support

This commit is contained in:
merkost 2023-07-20 13:37:54 +10:00
parent 05ced83909
commit ec6bf55025
3 changed files with 16 additions and 19 deletions

View File

@ -13,13 +13,10 @@ import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.R
import com.simplemobiletools.smsmessenger.dialogs.ExportMessagesDialog import com.simplemobiletools.smsmessenger.dialogs.ExportMessagesDialog
import com.simplemobiletools.smsmessenger.dialogs.ImportMessagesDialog
import com.simplemobiletools.smsmessenger.extensions.config import com.simplemobiletools.smsmessenger.extensions.config
import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.helpers.*
import com.simplemobiletools.smsmessenger.models.* import com.simplemobiletools.smsmessenger.models.*
import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.activity_settings.*
import kotlinx.serialization.SerializationException
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import java.util.* import java.util.*
@ -28,7 +25,7 @@ import kotlin.system.exitProcess
class SettingsActivity : SimpleActivity() { class SettingsActivity : SimpleActivity() {
private var blockedNumbersAtPause = -1 private var blockedNumbersAtPause = -1
private val messagesFileType = "application/json" private val messagesFileType = "application/json"
private val messageImportFileType = "application/json, application/xml, text/plain" private val messageImportFileTypes = listOf("application/json", "application/xml", "text/xml")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true isMaterialActivity = true
@ -81,16 +78,10 @@ class SettingsActivity : SimpleActivity() {
} }
} }
private val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> private val getContent = registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri ->
if (uri != null) { if (uri != null) {
toast(R.string.importing) toast(R.string.importing)
MessagesImporter(this).importMessages(uri) { deserializedList -> MessagesImporter(this).importMessages(uri)
if (deserializedList.isEmpty()) {
toast(R.string.no_entries_for_importing)
} else {
ImportMessagesDialog(this, deserializedList)
}
}
} }
} }
@ -111,7 +102,7 @@ class SettingsActivity : SimpleActivity() {
private fun setupMessagesImport() { private fun setupMessagesImport() {
settings_import_messages_holder.setOnClickListener { settings_import_messages_holder.setOnClickListener {
getContent.launch(messageImportFileType) getContent.launch(messageImportFileTypes.toTypedArray())
} }
} }

View File

@ -27,15 +27,12 @@ class MessagesImporter(private val activity: SimpleActivity) {
fun importMessages(uri: Uri) { fun importMessages(uri: Uri) {
try { try {
val fileType = activity.contentResolver.getType(uri).orEmpty() val fileType = activity.contentResolver.getType(uri).orEmpty()
val isXml = isXmlMimeType(fileType) || (uri.path?.endsWith("txt") == true && isFileXml(uri)) val isXml = isXmlMimeType(fileType) || (uri.path?.endsWith("txt") == true && isFileXml(uri))
if (isXml) { if (isXml) {
getInputStreamFromUri(uri)!!.importXml() getInputStreamFromUri(uri)!!.importXml()
} else { } else {
importJson(uri) importJson(uri)
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) activity.showErrorToast(e)
} }
@ -133,7 +130,11 @@ class MessagesImporter(private val activity: SimpleActivity) {
} }
refreshMessages() refreshMessages()
} }
// TODO: Add result to xml import when {
messagesFailed > 0 && messagesImported > 0 -> activity.toast(R.string.importing_some_entries_failed)
messagesFailed > 0 -> activity.toast(R.string.importing_failed)
else -> activity.toast(R.string.importing_successful)
}
} }
private fun XmlPullParser.readSms(): SmsBackup { private fun XmlPullParser.readSms(): SmsBackup {
@ -183,6 +184,10 @@ class MessagesImporter(private val activity: SimpleActivity) {
} }
private fun isXmlMimeType(mimeType: String): Boolean { private fun isXmlMimeType(mimeType: String): Boolean {
return mimeType.equals("application/xml", ignoreCase = true) return mimeType.equals("application/xml", ignoreCase = true) || mimeType.equals("text/xml", ignoreCase = true)
}
private fun isJsonMimeType(mimeType: String): Boolean {
return mimeType.equals("application/json", ignoreCase = true)
} }
} }

View File

@ -3,6 +3,7 @@ package com.simplemobiletools.smsmessenger.models
import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.json.* import kotlinx.serialization.json.*
@Serializable(with = BackupSerializer::class) @Serializable(with = BackupSerializer::class)
@ -17,7 +18,7 @@ object BackupSerializer :
return when (element.jsonObject["backupType"]?.jsonPrimitive?.content) { return when (element.jsonObject["backupType"]?.jsonPrimitive?.content) {
"sms" -> SmsBackup.serializer() "sms" -> SmsBackup.serializer()
"mms" -> MmsBackup.serializer() "mms" -> MmsBackup.serializer()
else -> throw Exception("ERROR: No Serializer found. Serialization failed.") else -> throw SerializationException("ERROR: No Serializer found. Serialization failed.")
} }
} }
} }