diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a40d3d85..ea66d25e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -195,6 +195,16 @@
+
+
+
+
()
private var messages = ArrayList()
private val availableSIMCards = ArrayList()
- private var attachmentUris = LinkedHashSet()
+ private var attachmentSelections = mutableMapOf()
+ private val imageCompressor by lazy { ImageCompressor(this) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -119,7 +122,7 @@ class ThreadActivity : SimpleActivity() {
override fun onPause() {
super.onPause()
- if (thread_type_message.value != "" && attachmentUris.isEmpty()) {
+ if (thread_type_message.value != "" && attachmentSelections.isEmpty()) {
saveSmsDraft(thread_type_message.value, threadId)
} else {
deleteSmsDraft(threadId)
@@ -390,7 +393,10 @@ class ThreadActivity : SimpleActivity() {
private fun setupParticipants() {
if (participants.isEmpty()) {
participants = if (messages.isEmpty()) {
- getThreadParticipants(threadId, null)
+ val intentNumbers = getPhoneNumbersFromIntent()
+ val participants = getThreadParticipants(threadId, null)
+
+ fixParticipantNumbers(participants, intentNumbers)
} else {
messages.first().participants
}
@@ -583,7 +589,7 @@ class ThreadActivity : SimpleActivity() {
conversationsDB.markRead(threadId)
}
- if (i == cnt - 1 && (message.type == Telephony.Sms.MESSAGE_TYPE_SENT )) {
+ if (i == cnt - 1 && (message.type == Telephony.Sms.MESSAGE_TYPE_SENT)) {
items.add(ThreadSent(message.id, delivered = message.status == Telephony.Sms.STATUS_COMPLETE))
}
}
@@ -606,29 +612,57 @@ class ThreadActivity : SimpleActivity() {
}
private fun addAttachment(uri: Uri) {
- if (attachmentUris.contains(uri)) {
+ val originalUriString = uri.toString()
+ if (attachmentSelections.containsKey(originalUriString)) {
return
}
- attachmentUris.add(uri)
+ attachmentSelections[originalUriString] = AttachmentSelection(uri, false)
+ val attachmentView = addAttachmentView(originalUriString, uri)
+ val mimeType = contentResolver.getType(uri) ?: return
+
+ if (mimeType.isImageMimeType() && config.mmsFileSizeLimit != FILE_SIZE_NONE) {
+ val selection = attachmentSelections[originalUriString]
+ attachmentSelections[originalUriString] = selection!!.copy(isPending = true)
+ checkSendMessageAvailability()
+ attachmentView.thread_attachment_progress.beVisible()
+ imageCompressor.compressImage(uri, config.mmsFileSizeLimit) { compressedUri ->
+ runOnUiThread {
+ if (compressedUri != null) {
+ attachmentSelections[originalUriString] = AttachmentSelection(compressedUri, false)
+ loadAttachmentPreview(attachmentView, compressedUri)
+ }
+ checkSendMessageAvailability()
+ attachmentView.thread_attachment_progress.beGone()
+ }
+ }
+ }
+ }
+
+ private fun addAttachmentView(originalUri: String, uri: Uri): View {
thread_attachments_holder.beVisible()
val attachmentView = layoutInflater.inflate(R.layout.item_attachment, null).apply {
thread_attachments_wrapper.addView(this)
thread_remove_attachment.setOnClickListener {
thread_attachments_wrapper.removeView(this)
- attachmentUris.remove(uri)
- if (attachmentUris.isEmpty()) {
+ attachmentSelections.remove(originalUri)
+ if (attachmentSelections.isEmpty()) {
thread_attachments_holder.beGone()
}
}
}
+ loadAttachmentPreview(attachmentView, uri)
+ return attachmentView
+ }
+
+ private fun loadAttachmentPreview(attachmentView: View, uri: Uri) {
val roundedCornersRadius = resources.getDimension(R.dimen.medium_margin).toInt()
val options = RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.transform(CenterCrop(), RoundedCorners(roundedCornersRadius))
- Glide.with(this)
+ Glide.with(attachmentView.thread_attachment_preview)
.load(uri)
.transition(DrawableTransitionOptions.withCrossFade())
.apply(options)
@@ -650,7 +684,7 @@ class ThreadActivity : SimpleActivity() {
}
private fun checkSendMessageAvailability() {
- if (thread_type_message.text.isNotEmpty() || attachmentUris.isNotEmpty()) {
+ if (thread_type_message.text.isNotEmpty() || (attachmentSelections.isNotEmpty() && !attachmentSelections.values.any { it.isPending })) {
thread_send_message.isClickable = true
thread_send_message.alpha = 0.9f
} else {
@@ -660,8 +694,8 @@ class ThreadActivity : SimpleActivity() {
}
private fun sendMessage() {
- var msg = thread_type_message.value
- if (msg.isEmpty() && attachmentUris.isEmpty()) {
+ val msg = thread_type_message.value
+ if (msg.isEmpty() && attachmentSelections.isEmpty()) {
return
}
@@ -689,11 +723,11 @@ class ThreadActivity : SimpleActivity() {
val transaction = Transaction(this, settings)
val message = com.klinker.android.send_message.Message(msg, numbers.toTypedArray())
- if (attachmentUris.isNotEmpty()) {
- for (uri in attachmentUris) {
+ if (attachmentSelections.isNotEmpty()) {
+ for (selection in attachmentSelections.values) {
try {
- val byteArray = contentResolver.openInputStream(uri)?.readBytes() ?: continue
- val mimeType = contentResolver.getType(uri) ?: continue
+ val byteArray = contentResolver.openInputStream(selection.uri)?.readBytes() ?: continue
+ val mimeType = contentResolver.getType(selection.uri) ?: continue
message.addMedia(byteArray, mimeType)
} catch (e: Exception) {
showErrorToast(e)
@@ -713,7 +747,7 @@ class ThreadActivity : SimpleActivity() {
refreshedSinceSent = false
transaction.sendNewMessage(message, threadId)
thread_type_message.setText("")
- attachmentUris.clear()
+ attachmentSelections.clear()
thread_attachments_holder.beGone()
thread_attachments_wrapper.removeAllViews()
@@ -783,6 +817,41 @@ class ThreadActivity : SimpleActivity() {
showSelectedContacts()
}
+ private fun getPhoneNumbersFromIntent(): ArrayList {
+ val numberFromIntent = intent.getStringExtra(THREAD_NUMBER)
+ val numbers = ArrayList()
+
+ if (numberFromIntent != null) {
+ if (numberFromIntent.startsWith('[') && numberFromIntent.endsWith(']')) {
+ val type = object : TypeToken>() {}.type
+ numbers.addAll(Gson().fromJson(numberFromIntent, type))
+ } else {
+ numbers.add(numberFromIntent)
+ }
+ }
+ return numbers
+ }
+
+ private fun fixParticipantNumbers(participants: ArrayList, properNumbers: ArrayList): ArrayList {
+ for (number in properNumbers) {
+ for (participant in participants) {
+ participant.phoneNumbers = participant.phoneNumbers.map {
+ val numberWithoutPlus = number.replace("+", "")
+ if (numberWithoutPlus == it.trim()) {
+ if (participant.name == it) {
+ participant.name = number
+ }
+ number
+ } else {
+ it
+ }
+ } as ArrayList
+ }
+ }
+
+ return participants
+ }
+
@SuppressLint("MissingPermission")
@Subscribe(threadMode = ThreadMode.ASYNC)
fun refreshMessages(event: Events.RefreshMessages) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Bitmap.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Bitmap.kt
new file mode 100644
index 00000000..c55bbe7b
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Bitmap.kt
@@ -0,0 +1,9 @@
+package com.simplemobiletools.smsmessenger.extensions
+
+import android.graphics.Bitmap
+
+fun Bitmap.CompressFormat.extension() = when (this) {
+ Bitmap.CompressFormat.PNG -> "png"
+ Bitmap.CompressFormat.WEBP -> "webp"
+ else -> "jpg"
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt
index 0f3c34f3..4ff626ce 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt
@@ -5,6 +5,7 @@ import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
+import android.content.ContentResolver
import android.content.ContentValues
import android.content.Context
import android.content.Intent
@@ -17,6 +18,7 @@ import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.provider.ContactsContract.PhoneLookup
+import android.provider.OpenableColumns
import android.provider.Telephony.*
import android.text.TextUtils
import androidx.core.app.NotificationCompat
@@ -35,10 +37,11 @@ import com.simplemobiletools.smsmessenger.interfaces.MessagesDao
import com.simplemobiletools.smsmessenger.models.*
import com.simplemobiletools.smsmessenger.receivers.DirectReplyReceiver
import com.simplemobiletools.smsmessenger.receivers.MarkAsReadReceiver
-import me.leolin.shortcutbadger.ShortcutBadger
+import java.io.FileNotFoundException
import java.util.*
import kotlin.collections.ArrayList
import java.text.Normalizer
+import me.leolin.shortcutbadger.ShortcutBadger
val Context.config: Config get() = Config.newInstance(applicationContext)
@@ -822,6 +825,18 @@ fun Context.deleteSmsDraft(threadId: Long) {
}
}
+fun Context.getMMSFileLimitText(size: Long) = getString(
+ when (size) {
+ FILE_SIZE_100_KB -> R.string.mms_file_size_limit_100kb
+ FILE_SIZE_200_KB -> R.string.mms_file_size_limit_200kb
+ FILE_SIZE_300_KB -> R.string.mms_file_size_limit_300kb
+ FILE_SIZE_600_KB -> R.string.mms_file_size_limit_600kb
+ FILE_SIZE_1_MB -> R.string.mms_file_size_limit_1mb
+ FILE_SIZE_2_MB -> R.string.mms_file_size_limit_2mb
+ else -> R.string.mms_file_size_limit_none
+ }
+)
+
fun Context.updateLastConversationMessage(threadId: Long) {
val uri = Threads.CONTENT_URI
val selection = "${Threads._ID} = ?"
@@ -833,3 +848,38 @@ fun Context.updateLastConversationMessage(threadId: Long) {
} catch (e: Exception) {
}
}
+
+fun Context.getFileSizeFromUri(uri: Uri): Long {
+ val assetFileDescriptor = try {
+ contentResolver.openAssetFileDescriptor(uri, "r")
+ } catch (e: FileNotFoundException) {
+ null
+ }
+
+ // uses ParcelFileDescriptor#getStatSize underneath if failed
+ val length = assetFileDescriptor?.use { it.length } ?: FILE_SIZE_NONE
+ if (length != -1L) {
+ return length
+ }
+
+ // if "content://" uri scheme, try contentResolver table
+ if (uri.scheme.equals(ContentResolver.SCHEME_CONTENT)) {
+ return contentResolver.query(uri, arrayOf(OpenableColumns.SIZE), null, null, null)
+ ?.use { cursor ->
+ // maybe shouldn't trust ContentResolver for size:
+ // https://stackoverflow.com/questions/48302972/content-resolver-returns-wrong-size
+ val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
+ if (sizeIndex == -1) {
+ return@use FILE_SIZE_NONE
+ }
+ cursor.moveToFirst()
+ return try {
+ cursor.getLong(sizeIndex)
+ } catch (_: Throwable) {
+ FILE_SIZE_NONE
+ }
+ } ?: FILE_SIZE_NONE
+ } else {
+ return FILE_SIZE_NONE
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt
new file mode 100644
index 00000000..acdf0bb9
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt
@@ -0,0 +1,16 @@
+package com.simplemobiletools.smsmessenger.extensions
+
+fun String.getExtensionFromMimeType(): String {
+ return when (lowercase()) {
+ "image/png" -> ".png"
+ "image/apng" -> ".apng"
+ "image/webp" -> ".webp"
+ "image/svg+xml" -> ".svg"
+ "image/gif" -> ".gif"
+ else -> ".jpg"
+ }
+}
+
+fun String.isImageMimeType(): Boolean {
+ return lowercase().startsWith("image")
+}
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 c6b6576d..78670daf 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt
@@ -29,4 +29,8 @@ 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 mmsFileSizeLimit: Long
+ get() = prefs.getLong(MMS_FILE_SIZE_LIMIT, FILE_SIZE_1_MB)
+ set(mmsFileSizeLimit) = prefs.edit().putLong(MMS_FILE_SIZE_LIMIT, mmsFileSizeLimit).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 6fbb310e..9e1ec619 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
@@ -16,6 +16,7 @@ const val SHOW_CHARACTER_COUNTER = "show_character_counter"
const val USE_SIMPLE_CHARACTERS = "use_simple_characters"
const val LOCK_SCREEN_VISIBILITY = "lock_screen_visibility"
const val ENABLE_DELIVERY_REPORTS = "enable_delivery_reports"
+const val MMS_FILE_SIZE_LIMIT = "mms_file_size_limit"
private const val PATH = "com.simplemobiletools.smsmessenger.action."
const val MARK_AS_READ = PATH + "mark_as_read"
@@ -34,6 +35,14 @@ const val LOCK_SCREEN_SENDER_MESSAGE = 1
const val LOCK_SCREEN_SENDER = 2
const val LOCK_SCREEN_NOTHING = 3
+const val FILE_SIZE_NONE = -1L
+const val FILE_SIZE_100_KB = 102_400L
+const val FILE_SIZE_200_KB = 204_800L
+const val FILE_SIZE_300_KB = 307_200L
+const val FILE_SIZE_600_KB = 614_400L
+const val FILE_SIZE_1_MB = 1_048_576L
+const val FILE_SIZE_2_MB = 2_097_152L
+
fun refreshMessages() {
EventBus.getDefault().post(Events.RefreshMessages())
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ImageCompressor.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ImageCompressor.kt
new file mode 100644
index 00000000..aa58387e
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ImageCompressor.kt
@@ -0,0 +1,119 @@
+package com.simplemobiletools.smsmessenger.helpers
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import android.graphics.Matrix
+import android.media.ExifInterface
+import android.net.Uri
+import com.simplemobiletools.commons.extensions.getCompressionFormat
+import com.simplemobiletools.commons.extensions.getMyFileUri
+import com.simplemobiletools.commons.helpers.ensureBackgroundThread
+import com.simplemobiletools.smsmessenger.extensions.extension
+import com.simplemobiletools.smsmessenger.extensions.getExtensionFromMimeType
+import com.simplemobiletools.smsmessenger.extensions.getFileSizeFromUri
+import com.simplemobiletools.smsmessenger.extensions.isImageMimeType
+import java.io.File
+import java.io.FileOutputStream
+
+/**
+ * Compress image to a given size based on
+ * [Compressor](https://github.com/zetbaitsu/Compressor/)
+ * */
+class ImageCompressor(private val context: Context) {
+ private val contentResolver = context.contentResolver
+ private val outputDirectory = File(context.cacheDir, "compressed").apply {
+ if (!exists()) {
+ mkdirs()
+ }
+ }
+
+ fun compressImage(uri: Uri, compressSize: Long, callback: (compressedFileUri: Uri?) -> Unit) {
+ ensureBackgroundThread {
+ try {
+ val fileSize = context.getFileSizeFromUri(uri)
+ if (fileSize > compressSize) {
+ val mimeType = contentResolver.getType(uri)!!
+ if (mimeType.isImageMimeType()) {
+ val byteArray = contentResolver.openInputStream(uri)?.readBytes()!!
+ var destinationFile = File(outputDirectory, System.currentTimeMillis().toString().plus(mimeType.getExtensionFromMimeType()))
+ destinationFile.writeBytes(byteArray)
+ val constraint = SizeConstraint(compressSize)
+ while (constraint.isSatisfied(destinationFile).not()) {
+ destinationFile = constraint.satisfy(destinationFile)
+ }
+ callback.invoke(context.getMyFileUri(destinationFile))
+ } else {
+ callback.invoke(null)
+ }
+ } else {
+ //no need to compress since the file is less than the compress size
+ callback.invoke(uri)
+ }
+ } catch (e: Exception) {
+ callback.invoke(null)
+ }
+ }
+ }
+
+ private fun overWrite(imageFile: File, bitmap: Bitmap, format: Bitmap.CompressFormat = imageFile.path.getCompressionFormat(), quality: Int = 100): File {
+ val result = if (format == imageFile.path.getCompressionFormat()) {
+ imageFile
+ } else {
+ File("${imageFile.absolutePath.substringBeforeLast(".")}.${format.extension()}")
+ }
+ imageFile.delete()
+ saveBitmap(bitmap, result, format, quality)
+ return result
+ }
+
+ private fun saveBitmap(bitmap: Bitmap, destination: File, format: Bitmap.CompressFormat = destination.path.getCompressionFormat(), quality: Int = 100) {
+ destination.parentFile?.mkdirs()
+ var fileOutputStream: FileOutputStream? = null
+ try {
+ fileOutputStream = FileOutputStream(destination.absolutePath)
+ bitmap.compress(format, quality, fileOutputStream)
+ } finally {
+ fileOutputStream?.run {
+ flush()
+ close()
+ }
+ }
+ }
+
+ private fun loadBitmap(imageFile: File) = BitmapFactory.decodeFile(imageFile.absolutePath).run {
+ determineImageRotation(imageFile, this)
+ }
+
+ private fun determineImageRotation(imageFile: File, bitmap: Bitmap): Bitmap {
+ val exif = ExifInterface(imageFile.absolutePath)
+ val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0)
+ val matrix = Matrix()
+ when (orientation) {
+ 6 -> matrix.postRotate(90f)
+ 3 -> matrix.postRotate(180f)
+ 8 -> matrix.postRotate(270f)
+ }
+ return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
+ }
+
+ private inner class SizeConstraint(
+ private val maxFileSize: Long,
+ private val stepSize: Int = 10,
+ private val maxIteration: Int = 10,
+ private val minQuality: Int = 10
+ ) {
+ private var iteration: Int = 0
+
+ fun isSatisfied(imageFile: File): Boolean {
+ return imageFile.length() <= maxFileSize || iteration >= maxIteration
+ }
+
+ fun satisfy(imageFile: File): File {
+ iteration++
+ val quality = (100 - iteration * stepSize).takeIf { it >= minQuality } ?: minQuality
+ return overWrite(imageFile, loadBitmap(imageFile), quality = quality)
+ }
+ }
+
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt
new file mode 100644
index 00000000..e56835d2
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt
@@ -0,0 +1,8 @@
+package com.simplemobiletools.smsmessenger.models
+
+import android.net.Uri
+
+data class AttachmentSelection(
+ val uri: Uri,
+ val isPending: Boolean,
+)
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index 0d4ff987..77283b63 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -273,5 +273,38 @@
tools:text="@string/sender_and_message" />
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_attachment.xml b/app/src/main/res/layout/item_attachment.xml
index ee25d173..be794651 100644
--- a/app/src/main/res/layout/item_attachment.xml
+++ b/app/src/main/res/layout/item_attachment.xml
@@ -1,14 +1,24 @@
+ android:layout_width="@dimen/attachment_preview_size"
+ android:layout_height="@dimen/attachment_preview_size">
+ android:visibility="gone"
+ tools:visibility="visible" />
+
+
+ android:visibility="gone"
+ tools:visibility="visible" />
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 516b8a38..af8271c5 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Proč aplikace vyžaduje přístup k internetu?
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 56013ca1..16102277 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Hvorfor kræver appen adgang til internettet?
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 85554a2f..40f69e22 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Warum benötigt diese App Internetzugriff?
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 0cffef67..68124259 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -50,6 +50,8 @@
Αποστολέας μόνο
Ενεργοποίηση αναφορών παράδοσης
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Γιατί η εφαρμογή απαιτεί πρόσβαση στο Internet;
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index b047f66f..a267726e 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
¿Por qué la aplicación requiere acceso a internet?
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 33a8f9a8..ab3a4416 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Miksi sovellus vaatii Internet-yhteyden?
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 46c6eebf..9a8e008c 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Pourquoi cette application a besoin d\'un accès à internet ?
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index f9621d2a..e4217469 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Mengapa aplikasi membutuhkan akses ke internet?
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 0c9f0242..b1477e50 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -50,6 +50,8 @@
Solo mittente
Abilita conferma di consegna
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Perché l\'applicazione richiede l\'accesso ad internet?
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 734c6ed8..b281ca3d 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
なぜアプリ使用にインターネットへのアクセスが必要なのですか?
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 5a7c0edd..714051b0 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Why does the app require access to the internet?
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index f9101ca3..50c2029f 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
അപ്ലിക്കേഷന് ഇന്റർനെറ്റിലേക്ക് ആവശ്യമായി വരുന്നത് എന്തുകൊണ്ട്?
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 9b10597d..20889974 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -50,6 +50,8 @@
Alleen afzender
Bezorgingsrapporten inschakelen
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Waarom heeft deze app toegang nodig tot het internet?
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 40e93cde..b0e73120 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -52,6 +52,8 @@
Tylko nadawca
Włącz raporty doręczeń
Usuwaj akcenty i znaki diakrytyczne podczas wysyłania wiadomości
+ Resize sent MMS images
+ No limit
Dlaczego aplikacja wymaga dostępu do Internetu?
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 5333c14e..4f08f40e 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Porque é que a aplicação necessita de aceder à Internet?
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 7a39dd11..e7835b1c 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -52,6 +52,8 @@
Только отправитель
Использовать отчёты о доставке
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Почему приложение требует доступ к интернету?
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index c13a1817..3cc6de92 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -12,7 +12,7 @@
Odpovedať
Zobraziť počítadlo znakov pri písaní správ
Načítanie správ…
- Sender doesn\'t support replies
+ Odosielateľ nepodporuje odpovede
Koncept
Odosiela sa…
Exportovať správy
@@ -52,6 +52,8 @@
Iba odosielateľ
Povoliť správy o doručení
Remove accents and diacritics at sending messages
+ Zmenšiť MMS obrázky pri odosielaní
+ Žiadny limit
Prečo vyžaduje apka prístup na internet?
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 745fd84e..575b3c20 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Uygulama neden internete erişim gerektiriyor?
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 8cb65dee..8a5a6b46 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Чому додаток потрубує доступу до інтернету?
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index b198b4fa..c2622ff6 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
为什么该应用需要访问互联网?
diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml
index 24f6140e..244c41e4 100644
--- a/app/src/main/res/values/donottranslate.xml
+++ b/app/src/main/res/values/donottranslate.xml
@@ -2,4 +2,11 @@
com.simplemobiletools.smsmessenger
+ 100KB
+ 200KB
+ 300KB
+ 600KB
+ 1MB
+ 2MB
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f9f13526..bb24daff 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -50,6 +50,8 @@
Sender only
Enable delivery reports
Remove accents and diacritics at sending messages
+ Resize sent MMS images
+ No limit
Why does the app require access to the internet?
diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml
new file mode 100644
index 00000000..d2c19fcd
--- /dev/null
+++ b/app/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,4 @@
+
+
+
+