Add dialog to export messages
This commit is contained in:
parent
3e40feb3c0
commit
2a5f2bfc03
|
@ -18,19 +18,25 @@ import com.simplemobiletools.commons.models.FAQItem
|
||||||
import com.simplemobiletools.smsmessenger.BuildConfig
|
import com.simplemobiletools.smsmessenger.BuildConfig
|
||||||
import com.simplemobiletools.smsmessenger.R
|
import com.simplemobiletools.smsmessenger.R
|
||||||
import com.simplemobiletools.smsmessenger.adapters.ConversationsAdapter
|
import com.simplemobiletools.smsmessenger.adapters.ConversationsAdapter
|
||||||
|
import com.simplemobiletools.smsmessenger.dialogs.ExportMessagesDialog
|
||||||
import com.simplemobiletools.smsmessenger.extensions.*
|
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_ID
|
||||||
import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE
|
import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE
|
||||||
import com.simplemobiletools.smsmessenger.models.Conversation
|
import com.simplemobiletools.smsmessenger.models.Conversation
|
||||||
import com.simplemobiletools.smsmessenger.models.Events
|
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 kotlinx.android.synthetic.main.activity_main.*
|
||||||
import org.greenrobot.eventbus.EventBus
|
import org.greenrobot.eventbus.EventBus
|
||||||
import org.greenrobot.eventbus.Subscribe
|
import org.greenrobot.eventbus.Subscribe
|
||||||
import org.greenrobot.eventbus.ThreadMode
|
import org.greenrobot.eventbus.ThreadMode
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
class MainActivity : SimpleActivity() {
|
class MainActivity : SimpleActivity() {
|
||||||
private val MAKE_DEFAULT_APP_REQUEST = 1
|
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 storedTextColor = 0
|
||||||
private var storedFontSize = 0
|
private var storedFontSize = 0
|
||||||
|
@ -108,6 +114,8 @@ class MainActivity : SimpleActivity() {
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.search -> launchSearch()
|
R.id.search -> launchSearch()
|
||||||
R.id.settings -> launchSettings()
|
R.id.settings -> launchSettings()
|
||||||
|
R.id.export_messages -> tryToExportMessages()
|
||||||
|
R.id.import_messages -> launchSettings()
|
||||||
R.id.about -> launchAbout()
|
R.id.about -> launchAbout()
|
||||||
else -> return super.onOptionsItemSelected(item)
|
else -> return super.onOptionsItemSelected(item)
|
||||||
}
|
}
|
||||||
|
@ -122,6 +130,11 @@ class MainActivity : SimpleActivity() {
|
||||||
} else {
|
} else {
|
||||||
finish()
|
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)
|
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)
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||||
fun refreshMessages(event: Events.RefreshMessages) {
|
fun refreshMessages(event: Events.RefreshMessages) {
|
||||||
initMessenger()
|
initMessenger()
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,4 +25,17 @@ class Config(context: Context) : BaseConfig(context) {
|
||||||
var lockScreenVisibilitySetting: Int
|
var lockScreenVisibilitySetting: Int
|
||||||
get() = prefs.getInt(LOCK_SCREEN_VISIBILITY, LOCK_SCREEN_SENDER_MESSAGE)
|
get() = prefs.getInt(LOCK_SCREEN_VISIBILITY, LOCK_SCREEN_SENDER_MESSAGE)
|
||||||
set(lockScreenVisibilitySetting) = prefs.edit().putInt(LOCK_SCREEN_VISIBILITY, lockScreenVisibilitySetting).apply()
|
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()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,11 @@ const val NOTIFICATION_CHANNEL = "simple_sms_messenger"
|
||||||
const val SHOW_CHARACTER_COUNTER = "show_character_counter"
|
const val SHOW_CHARACTER_COUNTER = "show_character_counter"
|
||||||
const val LOCK_SCREEN_VISIBILITY = "lock_screen_visibility"
|
const val LOCK_SCREEN_VISIBILITY = "lock_screen_visibility"
|
||||||
const val ENABLE_DELIVERY_REPORTS = "enable_delivery_reports"
|
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."
|
private const val PATH = "com.simplemobiletools.smsmessenger.action."
|
||||||
const val MARK_AS_READ = PATH + "mark_as_read"
|
const val MARK_AS_READ = PATH + "mark_as_read"
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/export_messages_scrollview"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/export_messages_holder"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingStart="@dimen/activity_margin"
|
||||||
|
android:paddingTop="@dimen/activity_margin"
|
||||||
|
android:paddingEnd="@dimen/activity_margin">
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyTextView
|
||||||
|
android:id="@+id/export_messages_folder_label"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/folder"
|
||||||
|
android:textSize="@dimen/smaller_text_size" />
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyTextView
|
||||||
|
android:id="@+id/export_messages_folder"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/activity_margin"
|
||||||
|
android:layout_marginBottom="@dimen/activity_margin"
|
||||||
|
android:paddingTop="@dimen/small_margin"
|
||||||
|
android:paddingEnd="@dimen/small_margin"
|
||||||
|
android:paddingBottom="@dimen/small_margin" />
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyTextView
|
||||||
|
android:id="@+id/export_messages_filename_label"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/filename"
|
||||||
|
android:textSize="@dimen/smaller_text_size" />
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyEditText
|
||||||
|
android:id="@+id/export_messages_filename"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/activity_margin"
|
||||||
|
android:layout_marginBottom="@dimen/activity_margin"
|
||||||
|
android:paddingTop="@dimen/normal_margin"
|
||||||
|
android:paddingEnd="@dimen/small_margin"
|
||||||
|
android:textSize="@dimen/normal_text_size" />
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
|
||||||
|
android:id="@+id/export_sms_checkbox"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="@dimen/activity_margin"
|
||||||
|
android:paddingTop="@dimen/small_margin"
|
||||||
|
android:paddingBottom="@dimen/small_margin"
|
||||||
|
android:text="@string/export_sms" />
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
|
||||||
|
android:id="@+id/export_mms_checkbox"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="@dimen/activity_margin"
|
||||||
|
android:paddingTop="@dimen/small_margin"
|
||||||
|
android:paddingBottom="@dimen/small_margin"
|
||||||
|
android:text="@string/export_mms" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
|
@ -10,6 +10,16 @@
|
||||||
android:id="@+id/settings"
|
android:id="@+id/settings"
|
||||||
android:title="@string/settings"
|
android:title="@string/settings"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/import_messages"
|
||||||
|
android:title="@string/import_messages"
|
||||||
|
app:showAsAction="never"/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/export_messages"
|
||||||
|
android:title="@string/export_messages"
|
||||||
|
app:showAsAction="never"/>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/about"
|
android:id="@+id/about"
|
||||||
android:title="@string/about"
|
android:title="@string/about"
|
||||||
|
|
|
@ -15,8 +15,6 @@
|
||||||
<string name="no_reply_support">Sender doesn\'t support replies</string>
|
<string name="no_reply_support">Sender doesn\'t support replies</string>
|
||||||
<string name="draft">Draft</string>
|
<string name="draft">Draft</string>
|
||||||
<string name="sending">Sending…</string>
|
<string name="sending">Sending…</string>
|
||||||
<string name="export_messages">Export messages</string>
|
|
||||||
<string name="import_messages">Import messages</string>
|
|
||||||
|
|
||||||
<!-- New conversation -->
|
<!-- New conversation -->
|
||||||
<string name="new_conversation">New conversation</string>
|
<string name="new_conversation">New conversation</string>
|
||||||
|
@ -50,6 +48,13 @@
|
||||||
<string name="sender_only">Sender only</string>
|
<string name="sender_only">Sender only</string>
|
||||||
<string name="enable_delivery_reports">Enable delivery reports</string>
|
<string name="enable_delivery_reports">Enable delivery reports</string>
|
||||||
|
|
||||||
|
<!-- Export / Import -->
|
||||||
|
<string name="messages">Messages</string>
|
||||||
|
<string name="export_messages">Export messages</string>
|
||||||
|
<string name="export_sms">Export SMS</string>
|
||||||
|
<string name="export_mms">Export MMS</string>
|
||||||
|
<string name="import_messages">Import messages</string>
|
||||||
|
|
||||||
<!-- FAQ -->
|
<!-- FAQ -->
|
||||||
<string name="faq_1_title">Why does the app require access to the internet?</string>
|
<string name="faq_1_title">Why does the app require access to the internet?</string>
|
||||||
<string name="faq_1_text">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.
|
<string name="faq_1_text">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.
|
||||||
|
|
Loading…
Reference in New Issue