diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt
index 1368b3ab..1e0fff09 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt
@@ -8,10 +8,12 @@ import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.graphics.drawable.Icon
import android.graphics.drawable.LayerDrawable
+import android.net.Uri
import android.os.Bundle
import android.provider.Telephony
import android.view.Menu
import android.view.MenuItem
+import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FAQItem
@@ -19,12 +21,14 @@ import com.simplemobiletools.smsmessenger.BuildConfig
import com.simplemobiletools.smsmessenger.R
import com.simplemobiletools.smsmessenger.adapters.ConversationsAdapter
import com.simplemobiletools.smsmessenger.dialogs.ExportMessagesDialog
+import com.simplemobiletools.smsmessenger.dialogs.ImportMessagesDialog
import com.simplemobiletools.smsmessenger.extensions.*
import com.simplemobiletools.smsmessenger.helpers.EXPORT_MIME_TYPE
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE
import com.simplemobiletools.smsmessenger.models.Conversation
import com.simplemobiletools.smsmessenger.models.Events
+import java.io.FileOutputStream
import java.io.OutputStream
import java.util.ArrayList
import java.util.Arrays
@@ -115,7 +119,7 @@ class MainActivity : SimpleActivity() {
R.id.search -> launchSearch()
R.id.settings -> launchSettings()
R.id.export_messages -> tryToExportMessages()
- R.id.import_messages -> launchSettings()
+ R.id.import_messages -> tryImportMessages()
R.id.about -> launchAbout()
else -> return super.onOptionsItemSelected(item)
}
@@ -131,7 +135,7 @@ class MainActivity : SimpleActivity() {
finish()
}
} else if (requestCode == PICK_IMPORT_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
-
+ tryImportMessagesFromFile(resultData.data!!)
} else if (requestCode == PICK_EXPORT_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
val outputStream = contentResolver.openOutputStream(resultData.data!!)
exportMessagesTo(outputStream)
@@ -346,7 +350,7 @@ class MainActivity : SimpleActivity() {
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
ExportMessagesDialog(this, config.lastExportPath, false) { file ->
- getFileOutputStream(file.toFileDirItem(this), true) { outStream->
+ getFileOutputStream(file.toFileDirItem(this), true) { outStream ->
exportMessagesTo(outStream)
}
}
@@ -361,6 +365,61 @@ class MainActivity : SimpleActivity() {
}
}
+ private fun tryImportMessages() {
+ if (isQPlus()) {
+ Intent(Intent.ACTION_GET_CONTENT).apply {
+ addCategory(Intent.CATEGORY_OPENABLE)
+ type = EXPORT_MIME_TYPE
+ startActivityForResult(this, PICK_IMPORT_SOURCE_INTENT)
+ }
+ } else {
+ handlePermission(PERMISSION_READ_STORAGE) {
+ if (it) {
+ importEvents()
+ }
+ }
+ }
+ }
+
+ private fun importEvents() {
+ FilePickerDialog(this) {
+ showImportEventsDialog(it)
+ }
+ }
+
+ private fun showImportEventsDialog(path: String) {
+ ImportMessagesDialog(this, path) { refresh ->
+ if (refresh) {
+ runOnUiThread {
+ // refresh
+ }
+ }
+ }
+ }
+
+ private fun tryImportMessagesFromFile(uri: Uri) {
+ when (uri.scheme) {
+ "file" -> showImportEventsDialog(uri.path!!)
+ "content" -> {
+ val tempFile = getTempFile("messages", "backup.json")
+ if (tempFile == null) {
+ toast(R.string.unknown_error_occurred)
+ return
+ }
+
+ try {
+ val inputStream = contentResolver.openInputStream(uri)
+ val out = FileOutputStream(tempFile)
+ inputStream!!.copyTo(out)
+ showImportEventsDialog(tempFile.absolutePath)
+ } catch (e: Exception) {
+ showErrorToast(e)
+ }
+ }
+ else -> toast(R.string.invalid_file_format)
+ }
+ }
+
@Subscribe(threadMode = ThreadMode.MAIN)
fun refreshMessages(event: Events.RefreshMessages) {
initMessenger()
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/dialogs/ImportMessagesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/dialogs/ImportMessagesDialog.kt
new file mode 100644
index 00000000..7cca894d
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/dialogs/ImportMessagesDialog.kt
@@ -0,0 +1,38 @@
+package com.simplemobiletools.smsmessenger.dialogs
+
+import android.view.ViewGroup
+import androidx.appcompat.app.AlertDialog
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.smsmessenger.R
+import com.simplemobiletools.smsmessenger.activities.SimpleActivity
+import com.simplemobiletools.smsmessenger.extensions.config
+import kotlinx.android.synthetic.main.dialog_import_messages.view.import_mms_checkbox
+import kotlinx.android.synthetic.main.dialog_import_messages.view.import_sms_checkbox
+
+class ImportMessagesDialog(
+ private val activity: SimpleActivity,
+ private val path: String,
+ private val callback: (refresh: Boolean) -> Unit,
+) {
+
+ private val config = activity.config
+
+ init {
+ val view = (activity.layoutInflater.inflate(R.layout.dialog_import_messages, null) as ViewGroup).apply {
+ import_sms_checkbox.isChecked = config.importSms
+ import_mms_checkbox.isChecked = config.importMms
+ }
+
+ AlertDialog.Builder(activity)
+ .setPositiveButton(R.string.ok, null)
+ .setNegativeButton(R.string.cancel, null)
+ .create().apply {
+ activity.setupDialogStuff(view, this, R.string.import_messages) {
+ getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
+ dismiss()
+ callback.invoke(true)
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt
index 87af0344..8b590b0e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt
@@ -38,4 +38,12 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(EXPORT_MMS, true)
set(exportMms) = prefs.edit().putBoolean(EXPORT_MMS, exportMms).apply()
+ var importSms: Boolean
+ get() = prefs.getBoolean(IMPORT_SMS, true)
+ set(importSms) = prefs.edit().putBoolean(IMPORT_SMS, importSms).apply()
+
+ var importMms: Boolean
+ get() = prefs.getBoolean(IMPORT_MMS, true)
+ set(importMms) = prefs.edit().putBoolean(IMPORT_MMS, importMms).apply()
+
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
index 04f4b988..7e99610e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
@@ -20,6 +20,8 @@ const val EXPORT_SMS = "export_sms"
const val EXPORT_MMS = "export_mms"
const val EXPORT_MIME_TYPE = "application/json"
const val EXPORT_FILE_EXT = ".json"
+const val IMPORT_SMS = "import_sms"
+const val IMPORT_MMS = "import_mms"
private const val PATH = "com.simplemobiletools.smsmessenger.action."
const val MARK_AS_READ = PATH + "mark_as_read"
diff --git a/app/src/main/res/layout/dialog_import_messages.xml b/app/src/main/res/layout/dialog_import_messages.xml
new file mode 100644
index 00000000..0f057a3b
--- /dev/null
+++ b/app/src/main/res/layout/dialog_import_messages.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c4f012d1..527171ed 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -54,6 +54,8 @@
Export SMS
Export MMS
Import messages
+ Import SMS
+ Import MMS
Why does the app require access to the internet?