11package com.simplemobiletools.smsmessenger.helpers
22
33import android.content.Context
4- import android.provider.Telephony.*
54import com.google.gson.Gson
65import com.google.gson.reflect.TypeToken
76import com.simplemobiletools.commons.extensions.showErrorToast
87import com.simplemobiletools.commons.helpers.ensureBackgroundThread
98import com.simplemobiletools.smsmessenger.extensions.*
109import com.simplemobiletools.smsmessenger.helpers.MessagesImporter.ImportResult.*
11- import com.simplemobiletools.smsmessenger.models.ExportedMessage
10+ import com.simplemobiletools.smsmessenger.models.MmsBackup
11+ import com.simplemobiletools.smsmessenger.models.SmsBackup
1212import java.io.File
1313
1414class MessagesImporter (private val context : Context ) {
@@ -32,33 +32,59 @@ class MessagesImporter(private val context: Context) {
3232 }
3333
3434 inputStream.bufferedReader().use { reader ->
35- val json = reader.readText()
36- val type = object : TypeToken <List <ExportedMessage >>() {}.type
37- val messages = gson.fromJson<List <ExportedMessage >>(json, type)
38- val totalMessages = messages.flatMap { it.sms ? : emptyList() }.size + messages.flatMap { it.mms ? : emptyList() }.size
39- if (totalMessages <= 0 ) {
40- callback.invoke(IMPORT_NOTHING_NEW )
41- return @ensureBackgroundThread
42- }
35+ val jsonReader = gson.newJsonReader(reader)
36+ val smsMessageType = object : TypeToken <SmsBackup >() {}.type
37+ val mmsMessageType = object : TypeToken <MmsBackup >() {}.type
4338
44- onProgress.invoke(totalMessages, messagesImported)
45- for (message in messages) {
46- if (config.importSms) {
47- message.sms?.forEach { backup ->
48- messageWriter.writeSmsMessage(backup)
49- messagesImported++
50- onProgress.invoke(totalMessages, messagesImported)
39+ jsonReader.beginArray()
40+ while (jsonReader.hasNext()) {
41+ jsonReader.beginObject()
42+ while (jsonReader.hasNext()) {
43+ if (jsonReader.nextName().equals(" sms" )) {
44+ if (config.importSms) {
45+ jsonReader.beginArray()
46+ while (jsonReader.hasNext()) {
47+ try {
48+ val message = gson.fromJson<SmsBackup >(jsonReader, smsMessageType)
49+ messageWriter.writeSmsMessage(message)
50+ messagesImported++
51+ } catch (e: Exception ) {
52+ context.showErrorToast(e)
53+ messagesFailed++
54+ }
55+ }
56+ jsonReader.endArray()
57+ } else {
58+ jsonReader.skipValue()
59+ }
5160 }
52- }
53- if (config.importMms) {
54- message.mms?.forEach { backup ->
55- messageWriter.writeMmsMessage(backup)
56- messagesImported++
57- onProgress.invoke(totalMessages, messagesImported)
61+
62+ if (jsonReader.nextName().equals(" mms" )) {
63+ if (config.importMms) {
64+ jsonReader.beginArray()
65+
66+ while (jsonReader.hasNext()) {
67+ try {
68+ val message = gson.fromJson<MmsBackup >(jsonReader, mmsMessageType)
69+ messageWriter.writeMmsMessage(message)
70+ messagesImported++
71+ } catch (e: Exception ) {
72+ context.showErrorToast(e)
73+ messagesFailed++
74+ }
75+ }
76+ jsonReader.endArray()
77+ } else {
78+ jsonReader.skipValue()
79+ }
5880 }
5981 }
82+
83+ jsonReader.endObject()
6084 refreshMessages()
6185 }
86+
87+ jsonReader.endArray()
6288 }
6389 } catch (e: Exception ) {
6490 context.showErrorToast(e)
@@ -67,8 +93,9 @@ class MessagesImporter(private val context: Context) {
6793
6894 callback.invoke(
6995 when {
70- messagesImported == 0 -> IMPORT_FAIL
71- messagesFailed > 0 -> IMPORT_PARTIAL
96+ messagesImported == 0 && messagesFailed == 0 -> IMPORT_NOTHING_NEW
97+ messagesFailed > 0 && messagesImported > 0 -> IMPORT_PARTIAL
98+ messagesFailed > 0 -> IMPORT_FAIL
7299 else -> IMPORT_OK
73100 }
74101 )
0 commit comments