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.