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 513e50ac..1368b3ab 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt
@@ -18,19 +18,25 @@ import com.simplemobiletools.commons.models.FAQItem
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.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.OutputStream
+import java.util.ArrayList
+import java.util.Arrays
import kotlinx.android.synthetic.main.activity_main.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
-import java.util.*
class MainActivity : SimpleActivity() {
private val MAKE_DEFAULT_APP_REQUEST = 1
+ private val PICK_IMPORT_SOURCE_INTENT = 11
+ private val PICK_EXPORT_FILE_INTENT = 21
private var storedTextColor = 0
private var storedFontSize = 0
@@ -108,6 +114,8 @@ class MainActivity : SimpleActivity() {
when (item.itemId) {
R.id.search -> launchSearch()
R.id.settings -> launchSettings()
+ R.id.export_messages -> tryToExportMessages()
+ R.id.import_messages -> launchSettings()
R.id.about -> launchAbout()
else -> return super.onOptionsItemSelected(item)
}
@@ -122,6 +130,11 @@ class MainActivity : SimpleActivity() {
} else {
finish()
}
+ } else if (requestCode == PICK_IMPORT_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
+
+ } else if (requestCode == PICK_EXPORT_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
+ val outputStream = contentResolver.openOutputStream(resultData.data!!)
+ exportMessagesTo(outputStream)
}
}
@@ -318,6 +331,36 @@ class MainActivity : SimpleActivity() {
startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true)
}
+ private fun tryToExportMessages() {
+ if (isQPlus()) {
+ ExportMessagesDialog(this, config.lastExportPath, true) { file ->
+
+ Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
+ type = EXPORT_MIME_TYPE
+ putExtra(Intent.EXTRA_TITLE, file.name)
+ addCategory(Intent.CATEGORY_OPENABLE)
+ startActivityForResult(this, PICK_EXPORT_FILE_INTENT)
+ }
+ }
+ } else {
+ handlePermission(PERMISSION_WRITE_STORAGE) {
+ if (it) {
+ ExportMessagesDialog(this, config.lastExportPath, false) { file ->
+ getFileOutputStream(file.toFileDirItem(this), true) { outStream->
+ exportMessagesTo(outStream)
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private fun exportMessagesTo(outputStream: OutputStream?) {
+ ensureBackgroundThread {
+
+ }
+ }
+
@Subscribe(threadMode = ThreadMode.MAIN)
fun refreshMessages(event: Events.RefreshMessages) {
initMessenger()
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/dialogs/ExportMessagesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/dialogs/ExportMessagesDialog.kt
new file mode 100644
index 00000000..5115cfbd
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/dialogs/ExportMessagesDialog.kt
@@ -0,0 +1,76 @@
+package com.simplemobiletools.smsmessenger.dialogs
+
+import android.view.ViewGroup
+import androidx.appcompat.app.AlertDialog
+import com.simplemobiletools.commons.dialogs.FilePickerDialog
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.ensureBackgroundThread
+import com.simplemobiletools.smsmessenger.R
+import com.simplemobiletools.smsmessenger.activities.SimpleActivity
+import com.simplemobiletools.smsmessenger.extensions.config
+import com.simplemobiletools.smsmessenger.helpers.EXPORT_FILE_EXT
+import java.io.File
+import kotlinx.android.synthetic.main.dialog_export_messages.view.*
+
+class ExportMessagesDialog(
+ private val activity: SimpleActivity,
+ private val path: String,
+ private val hidePath: Boolean,
+ private val callback: (file: File) -> Unit,
+) {
+ private var realPath = if (path.isEmpty()) activity.internalStoragePath else path
+ private val config = activity.config
+
+ init {
+ val view = (activity.layoutInflater.inflate(R.layout.dialog_export_messages, null) as ViewGroup).apply {
+ export_messages_folder.text = activity.humanizePath(realPath)
+ export_messages_filename.setText("${activity.getString(R.string.messages)}_${activity.getCurrentFormattedDateTime()}")
+ export_sms_checkbox.isChecked = config.exportSms
+ export_mms_checkbox.isChecked = config.exportMms
+
+ if (hidePath) {
+ export_messages_folder_label.beGone()
+ export_messages_folder.beGone()
+ } else {
+ export_messages_folder.setOnClickListener {
+ activity.hideKeyboard(export_messages_filename)
+ FilePickerDialog(activity, realPath, false, showFAB = true) {
+ export_messages_folder.text = activity.humanizePath(it)
+ realPath = it
+ }
+ }
+ }
+ }
+
+ AlertDialog.Builder(activity)
+ .setPositiveButton(R.string.ok, null)
+ .setNegativeButton(R.string.cancel, null)
+ .create().apply {
+ activity.setupDialogStuff(view, this, R.string.export_messages) {
+ getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
+ val filename = view.export_messages_filename.value
+ when {
+ filename.isEmpty() -> activity.toast(R.string.empty_name)
+ filename.isAValidFilename() -> {
+ val file = File(realPath, "$filename$EXPORT_FILE_EXT")
+ if (!hidePath && file.exists()) {
+ activity.toast(R.string.name_taken)
+ return@setOnClickListener
+ }
+
+ ensureBackgroundThread {
+ config.lastExportPath = file.absolutePath.getParentPath()
+ config.exportSms = view.export_sms_checkbox.isChecked
+ config.exportMms = view.export_mms_checkbox.isChecked
+
+ callback(file)
+ dismiss()
+ }
+ }
+ else -> activity.toast(R.string.invalid_name)
+ }
+ }
+ }
+ }
+ }
+}
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 e284b832..87af0344 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt
@@ -25,4 +25,17 @@ class Config(context: Context) : BaseConfig(context) {
var lockScreenVisibilitySetting: Int
get() = prefs.getInt(LOCK_SCREEN_VISIBILITY, LOCK_SCREEN_SENDER_MESSAGE)
set(lockScreenVisibilitySetting) = prefs.edit().putInt(LOCK_SCREEN_VISIBILITY, lockScreenVisibilitySetting).apply()
+
+ var lastExportPath: String
+ get() = prefs.getString(LAST_EXPORT_PATH, "")!!
+ set(lastExportPath) = prefs.edit().putString(LAST_EXPORT_PATH, lastExportPath).apply()
+
+ var exportSms: Boolean
+ get() = prefs.getBoolean(EXPORT_SMS, true)
+ set(exportSms) = prefs.edit().putBoolean(EXPORT_SMS, exportSms).apply()
+
+ var exportMms: Boolean
+ get() = prefs.getBoolean(EXPORT_MMS, true)
+ set(exportMms) = prefs.edit().putBoolean(EXPORT_MMS, exportMms).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 36025476..04f4b988 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
@@ -15,6 +15,11 @@ const val NOTIFICATION_CHANNEL = "simple_sms_messenger"
const val SHOW_CHARACTER_COUNTER = "show_character_counter"
const val LOCK_SCREEN_VISIBILITY = "lock_screen_visibility"
const val ENABLE_DELIVERY_REPORTS = "enable_delivery_reports"
+const val LAST_EXPORT_PATH = "last_export_path"
+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"
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_export_messages.xml b/app/src/main/res/layout/dialog_export_messages.xml
new file mode 100644
index 00000000..1c2fda39
--- /dev/null
+++ b/app/src/main/res/layout/dialog_export_messages.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index adda1b70..3e772ac1 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -10,6 +10,16 @@
android:id="@+id/settings"
android:title="@string/settings"
app:showAsAction="never" />
+
+
+
+
- Sender doesn\'t support replies
Draft
Sending…
- Export messages
- Import messages
New conversation
@@ -50,6 +48,13 @@
Sender only
Enable delivery reports
+
+ Messages
+ Export messages
+ Export SMS
+ Export MMS
+ Import messages
+
Why does the app require access to the internet?
Sadly it is needed for sending MMS attachments. Not being able to send MMS would be a really huge disadvantage compared to other apps, so we decided to go this way.