From 8d75d5b133895bfc735ae77786285a1d4fbac7de Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 23 Oct 2022 18:34:43 +0530 Subject: [PATCH 01/61] Improve unknown attachment preview --- .../smsmessenger/adapters/ThreadAdapter.kt | 85 ++++++++----------- .../smsmessenger/extensions/String.kt | 4 + .../main/res/drawable/ic_document_vector.xml | 5 ++ .../item_received_unknown_attachment.xml | 23 ----- .../res/layout/item_unknown_attachment.xml | 51 +++++++++++ 5 files changed, 96 insertions(+), 72 deletions(-) create mode 100644 app/src/main/res/drawable/ic_document_vector.xml delete mode 100644 app/src/main/res/layout/item_received_unknown_attachment.xml create mode 100644 app/src/main/res/layout/item_unknown_attachment.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt index cace2918..06366948 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -44,13 +44,12 @@ import kotlinx.android.synthetic.main.item_received_message.view.thread_mesage_a import kotlinx.android.synthetic.main.item_received_message.view.thread_message_body import kotlinx.android.synthetic.main.item_received_message.view.thread_message_holder import kotlinx.android.synthetic.main.item_received_message.view.thread_message_play_outline -import kotlinx.android.synthetic.main.item_received_unknown_attachment.view.* import kotlinx.android.synthetic.main.item_sent_message.view.* -import kotlinx.android.synthetic.main.item_sent_unknown_attachment.view.* import kotlinx.android.synthetic.main.item_thread_date_time.view.* import kotlinx.android.synthetic.main.item_thread_error.view.* import kotlinx.android.synthetic.main.item_thread_sending.view.* import kotlinx.android.synthetic.main.item_thread_success.view.* +import kotlinx.android.synthetic.main.item_unknown_attachment.view.* import java.util.* class ThreadAdapter( @@ -286,12 +285,10 @@ class ThreadAdapter( if (message.attachment?.attachments?.isNotEmpty() == true) { for (attachment in message.attachment.attachments) { val mimetype = attachment.mimetype - if (mimetype.isImageMimeType() || mimetype.startsWith("video/")) { - setupImageView(holder, view, message, attachment) - } else if (mimetype.isVCardMimeType()) { - setupVCardView(holder, view, message, attachment) - } else { - setupFileView(holder, view, message, attachment) + when { + mimetype.isImageMimeType() || mimetype.isVideoMimeType() -> setupImageView(holder, view, message, attachment) + mimetype.isVCardMimeType() -> setupVCardView(holder, view, message, attachment) + else -> setupFileView(holder, view, message, attachment) } thread_message_play_outline.beVisibleIf(mimetype.startsWith("video/")) @@ -454,51 +451,41 @@ class ThreadAdapter( val mimetype = attachment.mimetype val uri = attachment.getUri() parent.apply { - if (message.isReceivedMessage()) { - val attachmentView = layoutInflater.inflate(R.layout.item_received_unknown_attachment, null).apply { - thread_received_attachment_label.apply { - if (attachment.filename.isNotEmpty()) { - thread_received_attachment_label.text = attachment.filename - } - setTextColor(textColor) - setOnClickListener { - if (actModeCallback.isSelectable) { - holder.viewClicked(message) - } else { - launchViewIntent(uri, mimetype, attachment.filename) - } - } - setOnLongClickListener { - holder.viewLongClicked() - true - } + val attachmentView = layoutInflater.inflate(R.layout.item_unknown_attachment, null).apply { + if (attachment.filename.isNotEmpty()) { + filename.text = attachment.filename + } + + val size = context.contentResolver + .openInputStream(uri) + ?.use { it.readBytes() } + ?.size + + if (size != null) { + file_size.beVisible() + file_size.text = size.formatSize() + } else { + file_size.beGone() + } + + background.applyColorFilter(textColor) + filename.setTextColor(textColor) + file_size.setTextColor(textColor) + icon.background.setTint(properPrimaryColor) + + setOnClickListener { + if (actModeCallback.isSelectable) { + holder.viewClicked(message) + } else { + launchViewIntent(uri, mimetype, attachment.filename) } } - thread_mesage_attachments_holder.addView(attachmentView) - } else { - val background = context.getProperPrimaryColor() - val attachmentView = layoutInflater.inflate(R.layout.item_sent_unknown_attachment, null).apply { - thread_sent_attachment_label.apply { - this.background.applyColorFilter(background) - setTextColor(background.getContrastColor()) - if (attachment.filename.isNotEmpty()) { - thread_sent_attachment_label.text = attachment.filename - } - setOnClickListener { - if (actModeCallback.isSelectable) { - holder.viewClicked(message) - } else { - launchViewIntent(uri, mimetype, attachment.filename) - } - } - setOnLongClickListener { - holder.viewLongClicked() - true - } - } + setOnLongClickListener { + holder.viewLongClicked() + true } - thread_mesage_attachments_holder.addView(attachmentView) } + thread_mesage_attachments_holder.addView(attachmentView) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt index 89fb0f03..ac2b8948 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt @@ -15,6 +15,10 @@ fun String.isImageMimeType(): Boolean { return lowercase().startsWith("image") } +fun String.isVideoMimeType(): Boolean { + return lowercase().startsWith("video") +} + fun String.isVCardMimeType(): Boolean { val lowercase = lowercase() return lowercase.endsWith("x-vcard") || lowercase.endsWith("vcard") diff --git a/app/src/main/res/drawable/ic_document_vector.xml b/app/src/main/res/drawable/ic_document_vector.xml new file mode 100644 index 00000000..e7ef3d4b --- /dev/null +++ b/app/src/main/res/drawable/ic_document_vector.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/item_received_unknown_attachment.xml b/app/src/main/res/layout/item_received_unknown_attachment.xml deleted file mode 100644 index b56653ca..00000000 --- a/app/src/main/res/layout/item_received_unknown_attachment.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/item_unknown_attachment.xml b/app/src/main/res/layout/item_unknown_attachment.xml new file mode 100644 index 00000000..8b884084 --- /dev/null +++ b/app/src/main/res/layout/item_unknown_attachment.xml @@ -0,0 +1,51 @@ + + + + + + + + + + From 23643d3198be6faa6dbe8bb9cd66235a6e046f82 Mon Sep 17 00:00:00 2001 From: Naveen Date: Wed, 2 Nov 2022 18:03:35 +0530 Subject: [PATCH 02/61] Add support for sending all types of files --- app/src/main/AndroidManifest.xml | 7 +- .../smsmessenger/activities/ThreadActivity.kt | 409 +++++++++++------- .../adapters/AttachmentsAdapter.kt | 227 ++++++++++ .../smsmessenger/adapters/ThreadAdapter.kt | 132 ++---- .../smsmessenger/extensions/Activity.kt | 24 + .../smsmessenger/extensions/Context.kt | 1 + .../smsmessenger/extensions/View.kt | 18 + .../smsmessenger/helpers/Config.kt | 4 + .../smsmessenger/helpers/Constants.kt | 15 + .../smsmessenger/helpers/DocumentPreview.kt | 55 +++ .../smsmessenger/helpers/VCardPreview.kt | 83 ++++ .../models/AttachmentSelection.kt | 31 +- app/src/main/res/drawable/ic_image_vector.xml | 10 + app/src/main/res/drawable/ic_music_vector.xml | 10 + .../ic_vector_play_circle_outline.xml | 10 + .../main/res/drawable/ic_videocam_vector.xml | 10 + app/src/main/res/layout/activity_thread.xml | 268 +++++++++--- app/src/main/res/layout/item_attachment.xml | 34 -- .../res/layout/item_attachment_document.xml | 53 +++ .../item_attachment_document_preview.xml | 30 ++ .../layout/item_attachment_media_preview.xml | 55 +++ .../main/res/layout/item_attachment_vcard.xml | 88 ++-- .../layout/item_attachment_vcard_preview.xml | 39 ++ .../layout/item_remove_attachment_button.xml | 22 + .../res/layout/item_unknown_attachment.xml | 51 --- app/src/main/res/values/dimens.xml | 7 +- 26 files changed, 1234 insertions(+), 459 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/View.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/DocumentPreview.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardPreview.kt create mode 100644 app/src/main/res/drawable/ic_image_vector.xml create mode 100644 app/src/main/res/drawable/ic_music_vector.xml create mode 100644 app/src/main/res/drawable/ic_vector_play_circle_outline.xml create mode 100644 app/src/main/res/drawable/ic_videocam_vector.xml delete mode 100644 app/src/main/res/layout/item_attachment.xml create mode 100644 app/src/main/res/layout/item_attachment_document.xml create mode 100644 app/src/main/res/layout/item_attachment_document_preview.xml create mode 100644 app/src/main/res/layout/item_attachment_media_preview.xml create mode 100644 app/src/main/res/layout/item_attachment_vcard_preview.xml create mode 100644 app/src/main/res/layout/item_remove_attachment_button.xml delete mode 100644 app/src/main/res/layout/item_unknown_attachment.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b669ba54..b12c0b35 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -93,17 +93,14 @@ - - - + - - + diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 9d7dde11..2f0263ec 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -5,7 +5,6 @@ import android.app.Activity import android.content.ActivityNotFoundException import android.content.Intent import android.graphics.BitmapFactory -import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import android.media.MediaMetadataRetriever import android.net.Uri @@ -27,21 +26,19 @@ import android.util.TypedValue import android.view.Gravity import android.view.View import android.view.WindowManager +import android.view.animation.OvershootInterpolator import android.view.inputmethod.EditorInfo import android.widget.LinearLayout import android.widget.LinearLayout.LayoutParams import android.widget.RelativeLayout +import androidx.annotation.StringRes +import androidx.appcompat.widget.AppCompatButton +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.res.ResourcesCompat -import com.bumptech.glide.Glide -import com.bumptech.glide.load.DataSource -import com.bumptech.glide.load.engine.DiskCacheStrategy -import com.bumptech.glide.load.engine.GlideException -import com.bumptech.glide.load.resource.bitmap.CenterCrop -import com.bumptech.glide.load.resource.bitmap.RoundedCorners -import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions -import com.bumptech.glide.request.RequestListener -import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.Target +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.children +import androidx.core.view.updateLayoutParams import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.dialogs.ConfirmationDialog @@ -53,14 +50,17 @@ import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.smsmessenger.R +import com.simplemobiletools.smsmessenger.adapters.AttachmentsAdapter import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter import com.simplemobiletools.smsmessenger.adapters.ThreadAdapter import com.simplemobiletools.smsmessenger.dialogs.ScheduleMessageDialog import com.simplemobiletools.smsmessenger.extensions.* import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.models.* +import ezvcard.VCard +import ezvcard.property.FormattedName +import ezvcard.property.Telephone import kotlinx.android.synthetic.main.activity_thread.* -import kotlinx.android.synthetic.main.item_attachment.view.* import kotlinx.android.synthetic.main.item_selected_contact.view.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -72,12 +72,6 @@ import java.io.OutputStream class ThreadActivity : SimpleActivity() { private val MIN_DATE_TIME_DIFF_SECS = 300 - private val PICK_ATTACHMENT_INTENT = 1 - private val PICK_SAVE_FILE_INTENT = 11 - private val TAKE_PHOTO_INTENT = 42 - - private val TYPE_TAKE_PHOTO = 12 - private val TYPE_CHOOSE_PHOTO = 13 private val TYPE_EDIT = 14 private val TYPE_SEND = 15 @@ -93,8 +87,6 @@ class ThreadActivity : SimpleActivity() { private var privateContacts = ArrayList() private var messages = ArrayList() private val availableSIMCards = ArrayList() - private var attachmentSelections = mutableMapOf() - private val imageCompressor by lazy { ImageCompressor(this) } private var lastAttachmentUri: String? = null private var capturedImageUri: Uri? = null private var loadingOlderMessages = false @@ -105,6 +97,8 @@ class ThreadActivity : SimpleActivity() { private var scheduledMessage: Message? = null private lateinit var scheduledDateTime: DateTime + private var isAttachmentPickerVisible = false + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_thread) @@ -145,6 +139,10 @@ class ThreadActivity : SimpleActivity() { finish() } } + + setupAttachmentPickerView() + setupKeyboardListener() + hideAttachmentPicker() } override fun onResume() { @@ -161,7 +159,7 @@ class ThreadActivity : SimpleActivity() { override fun onPause() { super.onPause() - if (thread_type_message.value != "" && attachmentSelections.isEmpty()) { + if (thread_type_message.value != "" && getAttachments().isEmpty()) { saveSmsDraft(thread_type_message.value, threadId) } else { deleteSmsDraft(threadId) @@ -172,6 +170,15 @@ class ThreadActivity : SimpleActivity() { isActivityVisible = false } + override fun onBackPressed() { + isAttachmentPickerVisible = false + if (attachment_picker_holder.isVisible()) { + hideAttachmentPicker() + } else { + super.onBackPressed() + } + } + override fun onDestroy() { super.onDestroy() bus?.unregister(this) @@ -214,13 +221,28 @@ class ThreadActivity : SimpleActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { super.onActivityResult(requestCode, resultCode, resultData) if (resultCode != Activity.RESULT_OK) return + val data = resultData?.data - if (requestCode == TAKE_PHOTO_INTENT) { - addAttachment(capturedImageUri!!) - } else if (requestCode == PICK_ATTACHMENT_INTENT && resultData != null && resultData.data != null) { - addAttachment(resultData.data!!) - } else if (requestCode == PICK_SAVE_FILE_INTENT && resultData != null && resultData.data != null) { - saveAttachment(resultData) + when (requestCode) { + CAPTURE_PHOTO_INTENT -> addAttachment(capturedImageUri!!) + CAPTURE_VIDEO_INTENT -> if (data != null) { + addAttachment(data) + } + PICK_DOCUMENT_INTENT -> if (data != null) { + addAttachment(data) + } + CAPTURE_AUDIO_INTENT -> if (data != null) { + addAttachment(data) + } + PICK_PHOTO_VIDEO_INTENT -> if (data != null) { + addAttachment(data) + } + PICK_CONTACT_INTENT -> if (data != null) { + handleContactAttachment(data) + } + PICK_SAVE_FILE_INTENT -> if (data != null) { + saveAttachment(resultData) + } } } @@ -487,7 +509,14 @@ class ThreadActivity : SimpleActivity() { thread_type_message.setText(intent.getStringExtra(THREAD_TEXT)) thread_add_attachment.setOnClickListener { - takeOrPickPhotoVideo() + if (attachment_picker_holder.isVisible()) { + isAttachmentPickerVisible = false + showKeyboard(thread_type_message) + } else { + isAttachmentPickerVisible = true + hideKeyboard() + } + window.decorView.requestApplyInsets() } if (intent.extras?.containsKey(THREAD_ATTACHMENT_URI) == true) { @@ -780,135 +809,134 @@ class ThreadActivity : SimpleActivity() { return items } - private fun takeOrPickPhotoVideo() { - val items = arrayListOf( - RadioItem(TYPE_TAKE_PHOTO, getString(R.string.take_photo)), - RadioItem(TYPE_CHOOSE_PHOTO, getString(R.string.choose_photo)) - ) - RadioGroupDialog(this, items = items) { - val checkedId = it as Int - if (checkedId == TYPE_TAKE_PHOTO) { - launchTakePhotoIntent() - } else if (checkedId == TYPE_CHOOSE_PHOTO) { - launchPickPhotoVideoIntent() - } - } - } - - private fun launchTakePhotoIntent() { - val imageFile = createImageFile() - capturedImageUri = getMyFileUri(imageFile) + private fun launchActivityForResult(intent: Intent, requestCode: Int, @StringRes error: Int = R.string.no_app_found) { + hideKeyboard() try { - val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { - putExtra(MediaStore.EXTRA_OUTPUT, capturedImageUri) - } - startActivityForResult(intent, TAKE_PHOTO_INTENT) + startActivityForResult(intent, requestCode) } catch (e: ActivityNotFoundException) { - showErrorToast(getString(R.string.no_app_found)) + showErrorToast(getString(error)) } catch (e: Exception) { showErrorToast(e) } } + private fun createTemporaryFile(extension: String = ".jpg"): File { + val outputDirectory = File(cacheDir, "captured").apply { + if (!exists()) { + mkdirs() + } + } + return File.createTempFile("attachment_", extension, outputDirectory) + } + + private fun launchCapturePhotoIntent() { + val imageFile = createTemporaryFile() + capturedImageUri = getMyFileUri(imageFile) + val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { + putExtra(MediaStore.EXTRA_OUTPUT, capturedImageUri) + } + launchActivityForResult(intent, CAPTURE_PHOTO_INTENT) + } + + private fun launchCaptureVideoIntent() { + val intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE) + launchActivityForResult(intent, CAPTURE_VIDEO_INTENT) + } + + private fun launchCaptureAudioIntent() { + val intent = Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION) + launchActivityForResult(intent, CAPTURE_AUDIO_INTENT) + } + private fun launchPickPhotoVideoIntent() { - hideKeyboard() val mimeTypes = arrayOf("image/*", "video/*") Intent(Intent.ACTION_GET_CONTENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "*/*" putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) - try { - startActivityForResult(this, PICK_ATTACHMENT_INTENT) - } catch (e: ActivityNotFoundException) { - showErrorToast(getString(R.string.no_app_found)) - } catch (e: Exception) { - showErrorToast(e) + launchActivityForResult(this, PICK_PHOTO_VIDEO_INTENT) + } + } + + private fun launchPickDocumentIntent() { + val mimeTypes = arrayOf("*/*") + Intent(Intent.ACTION_GET_CONTENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "*/*" + putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) + + launchActivityForResult(this, PICK_DOCUMENT_INTENT) + } + } + + private fun launchPickContactIntent() { + val intent = Intent(Intent.ACTION_PICK).apply { + type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE + } + launchActivityForResult(intent, PICK_CONTACT_INTENT) + } + + private fun handleContactAttachment(contactUri: Uri) { + val projection = arrayOf( + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, + ContactsContract.CommonDataKinds.Phone.NUMBER + ) + queryCursor(contactUri, projection, null, null, null) { cursor -> + if (cursor.moveToFirst()) { + val nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) + val numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) + val name = cursor.getString(nameIndex) + val number = cursor.getString(numberIndex) + // todo: export all properties using VcfExporter + val vCard = VCard() + vCard.addTelephoneNumber(Telephone(number)) + vCard.addFormattedName(FormattedName(name)) + val file = createTemporaryFile(".vcf") + val outputStream = file.outputStream() + vCard.write(outputStream) + val vCardUri = getMyFileUri(file) + addAttachment(vCardUri) } } } + private fun getAttachmentsAdapter(): AttachmentsAdapter? { + val adapter = thread_attachments_recyclerview.adapter + return adapter as? AttachmentsAdapter + } + + private fun getAttachments() = getAttachmentsAdapter()?.attachments ?: emptyList() + private fun addAttachment(uri: Uri) { - val originalUriString = uri.toString() - if (attachmentSelections.containsKey(originalUriString)) { + if (getAttachments().any { it.uri.toString() == uri.toString() }) { return } - 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) - } else { - toast(R.string.compress_error) - removeAttachment(attachmentView, originalUriString) - } + var adapter = getAttachmentsAdapter() + if (adapter == null) { + adapter = AttachmentsAdapter( + activity = this, + onItemClick = {}, + onAttachmentsRemoved = { + thread_attachments_recyclerview.beGone() 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 { - removeAttachment(this, originalUri) - } + }, + onReady = { checkSendMessageAvailability() } + ) + thread_attachments_recyclerview.adapter = adapter } - loadAttachmentPreview(attachmentView, uri) - return attachmentView - } + thread_attachments_recyclerview.beVisible() + val mimeType = contentResolver.getType(uri).orEmpty() + val attachment = AttachmentSelection( + uri = uri, + mimetype = mimeType, + filename = getFilenameFromUri(uri), + isPending = mimeType.isImageMimeType() + ) + adapter.addAttachment(attachment) - private fun loadAttachmentPreview(attachmentView: View, uri: Uri) { - if (isDestroyed || isFinishing) { - return - } - - val roundedCornersRadius = resources.getDimension(R.dimen.medium_margin).toInt() - val options = RequestOptions() - .diskCacheStrategy(DiskCacheStrategy.NONE) - .transform(CenterCrop(), RoundedCorners(roundedCornersRadius)) - - Glide.with(attachmentView.thread_attachment_preview) - .load(uri) - .transition(DrawableTransitionOptions.withCrossFade()) - .apply(options) - .listener(object : RequestListener { - override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean { - attachmentView.thread_attachment_preview.beGone() - attachmentView.thread_remove_attachment.beGone() - return false - } - - override fun onResourceReady(dr: Drawable?, a: Any?, t: Target?, d: DataSource?, i: Boolean): Boolean { - attachmentView.thread_attachment_preview.beVisible() - attachmentView.thread_remove_attachment.beVisible() - checkSendMessageAvailability() - return false - } - }) - .into(attachmentView.thread_attachment_preview) - } - - private fun removeAttachment(attachmentView: View, originalUri: String) { - thread_attachments_wrapper.removeView(attachmentView) - attachmentSelections.remove(originalUri) - if (attachmentSelections.isEmpty()) { - thread_attachments_holder.beGone() - } checkSendMessageAvailability() } @@ -933,7 +961,7 @@ class ThreadActivity : SimpleActivity() { } private fun checkSendMessageAvailability() { - if (thread_type_message.text!!.isNotEmpty() || (attachmentSelections.isNotEmpty() && !attachmentSelections.values.any { it.isPending })) { + if (thread_type_message.text!!.isNotEmpty() || (getAttachments().isNotEmpty() && !getAttachments().any { it.isPending })) { thread_send_message.isEnabled = true thread_send_message.isClickable = true thread_send_message.alpha = 0.9f @@ -947,7 +975,7 @@ class ThreadActivity : SimpleActivity() { private fun sendMessage() { var text = thread_type_message.value - if (text.isEmpty() && attachmentSelections.isEmpty()) { + if (text.isEmpty() && getAttachments().isEmpty()) { showErrorToast(getString(R.string.unknown_error_occurred)) return } @@ -1002,8 +1030,7 @@ class ThreadActivity : SimpleActivity() { private fun sendNormalMessage(text: String, subscriptionId: Int) { val addresses = participants.getAddresses() - val attachments = attachmentSelections.values - .map { it.uri } + val attachments = getAttachments().map { it.uri } try { refreshedSinceSent = false @@ -1022,9 +1049,8 @@ class ThreadActivity : SimpleActivity() { private fun clearCurrentMessage() { thread_type_message.setText("") - attachmentSelections.clear() - thread_attachments_holder.beGone() - thread_attachments_wrapper.removeAllViews() + getAttachmentsAdapter()?.clear() + checkSendMessageAvailability() } // show selected contacts, properly split to new lines when appropriate @@ -1150,13 +1176,7 @@ class ThreadActivity : SimpleActivity() { addCategory(Intent.CATEGORY_OPENABLE) putExtra(Intent.EXTRA_TITLE, path.split("/").last()) - try { - startActivityForResult(this, PICK_SAVE_FILE_INTENT) - } catch (e: ActivityNotFoundException) { - showErrorToast(getString(R.string.system_service_disabled)) - } catch (e: Exception) { - showErrorToast(e) - } + launchActivityForResult(this, PICK_SAVE_FILE_INTENT, error = R.string.system_service_disabled) } } @@ -1204,7 +1224,7 @@ class ThreadActivity : SimpleActivity() { private fun isMmsMessage(text: String): Boolean { val isGroupMms = participants.size > 1 && config.sendGroupMessageMMS val isLongMmsMessage = isLongMmsMessage(text) && config.sendLongMessageMMS - return attachmentSelections.isNotEmpty() || isGroupMms || isLongMmsMessage + return getAttachments().isNotEmpty() || isGroupMms || isLongMmsMessage } private fun updateMessageType() { @@ -1217,15 +1237,6 @@ class ThreadActivity : SimpleActivity() { thread_send_message.setText(stringId) } - private fun createImageFile(): File { - val outputDirectory = File(cacheDir, "captured").apply { - if (!exists()) { - mkdirs() - } - } - return File.createTempFile("IMG_", ".jpg", outputDirectory) - } - private fun showScheduledMessageInfo(message: Message) { val items = arrayListOf( RadioItem(TYPE_EDIT, getString(R.string.update_message)), @@ -1282,7 +1293,7 @@ class ThreadActivity : SimpleActivity() { private fun setupScheduleSendUi() { val textColor = getProperTextColor() - scheduled_message_holder.background.applyColorFilter(getProperBackgroundColor().getContrastColor()) + scheduled_message_holder.background.applyColorFilter(getProperPrimaryColor().darkenColor()) scheduled_message_button.apply { val clockDrawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_clock_vector, theme)?.apply { applyColorFilter(textColor) } setCompoundDrawablesWithIntrinsicBounds(clockDrawable, null, null, null) @@ -1358,10 +1369,94 @@ class ThreadActivity : SimpleActivity() { } private fun buildMessageAttachment(text: String, messageId: Long): MessageAttachment { - val attachments = attachmentSelections.values + val attachments = getAttachments() .map { Attachment(null, messageId, it.uri.toString(), contentResolver.getType(it.uri) ?: "*/*", 0, 0, "") } .toArrayList() return MessageAttachment(messageId, text, attachments) } + + private fun setupAttachmentPickerView() { + val colors = arrayOf( + R.color.md_red_500, + R.color.md_pink_500, + R.color.md_purple_500, + R.color.md_teal_500, + R.color.md_green_500, + R.color.md_light_green_500, + R.color.md_blue_500 + ) + attachment_picker_holder.children.filterIsInstance().forEachIndexed { index, button -> + button.setTextColor(getProperTextColor()) + val color = resources.getColor(colors[index]) + button.compoundDrawables.forEach { it?.applyColorFilter(color) } + } + pick_from_gallery.setOnClickListener { + launchPickPhotoVideoIntent() + } + camera.setOnClickListener { + launchCapturePhotoIntent() + } + record_video.setOnClickListener { + launchCaptureVideoIntent() + } + record_audio.setOnClickListener { + launchCaptureAudioIntent() + } + pick_file.setOnClickListener { + launchPickDocumentIntent() + } + pick_contact.setOnClickListener { + launchPickContactIntent() + } + schedule_message.setOnClickListener { + if (isScheduledMessage) { + launchScheduleSendDialog(scheduledDateTime) + } else { + launchScheduleSendDialog() + } + } + } + + private fun showAttachmentPicker() { + attachment_picker_divider.showWithAnimation() + attachment_picker_holder.showWithAnimation() + animateAttachmentButton(rotation = -135f) + } + + private fun hideAttachmentPicker() { + attachment_picker_divider.beGone() + attachment_picker_holder.apply { + beGone() + updateLayoutParams { + height = config.keyboardHeight + } + } + animateAttachmentButton(rotation = 0f) + } + + private fun animateAttachmentButton(rotation: Float) { + thread_add_attachment.animate() + .rotation(rotation) + .setDuration(500L) + .setInterpolator(OvershootInterpolator()) + .start() + } + + private fun setupKeyboardListener() { + val typeMask = WindowInsetsCompat.Type.ime() + + ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { _, insets -> + if (insets.isVisible(typeMask)) { + config.keyboardHeight = insets.getInsets(typeMask).bottom + hideAttachmentPicker() + } else { + if (isAttachmentPickerVisible) { + showAttachmentPicker() + } + } + + insets + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt new file mode 100644 index 00000000..37baa75b --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt @@ -0,0 +1,227 @@ +package com.simplemobiletools.smsmessenger.adapters + +import android.content.Intent +import android.graphics.drawable.Drawable +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.smsmessenger.activities.VCardViewerActivity +import com.simplemobiletools.smsmessenger.extensions.config +import com.simplemobiletools.smsmessenger.extensions.isImageMimeType +import com.simplemobiletools.smsmessenger.extensions.isVideoMimeType +import com.simplemobiletools.smsmessenger.extensions.launchViewIntent +import com.simplemobiletools.smsmessenger.helpers.* +import com.simplemobiletools.smsmessenger.models.AttachmentSelection +import kotlinx.android.synthetic.main.item_attachment_media_preview.view.* +import kotlinx.android.synthetic.main.item_remove_attachment_button.view.* + +class AttachmentsAdapter( + val activity: BaseSimpleActivity, + val onItemClick: (AttachmentSelection) -> Unit, + val onAttachmentsRemoved: () -> Unit, + val onReady: (() -> Unit) +) : ListAdapter(AttachmentDiffCallback()) { + + private val config = activity.config + private val resources = activity.resources + private val primaryColor = activity.getProperPrimaryColor() + private val imageCompressor by lazy { ImageCompressor(activity) } + + val attachments = mutableListOf() + + fun clear() { + attachments.clear() + submitList(ArrayList()) + onAttachmentsRemoved() + } + + fun addAttachment(attachment: AttachmentSelection) { + attachments.removeAll { AttachmentSelection.areItemsTheSame(it, attachment) } + attachments.add(attachment) + submitList(attachments.toList()) + } + + private fun removeAttachment(attachment: AttachmentSelection) { + attachments.removeAll { AttachmentSelection.areItemsTheSame(it, attachment) } + if (attachments.isEmpty()) { + onAttachmentsRemoved() + } else { + submitList(ArrayList(attachments)) + } + } + + override fun getItemViewType(position: Int): Int { + return getItem(position).viewType + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val layoutRes = when (viewType) { + ATTACHMENT_DOCUMENT -> com.simplemobiletools.smsmessenger.R.layout.item_attachment_document_preview + ATTACHMENT_VCARD -> com.simplemobiletools.smsmessenger.R.layout.item_attachment_vcard_preview + ATTACHMENT_MEDIA -> com.simplemobiletools.smsmessenger.R.layout.item_attachment_media_preview + else -> throw IllegalArgumentException("Unknown view type: $viewType") + } + + val view = activity.layoutInflater.inflate(layoutRes, parent, false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val attachment = getItem(position) + holder.bindView(attachment, allowSingleClick = true, allowLongClick = false) { view, position -> + when (attachment.viewType) { + ATTACHMENT_DOCUMENT -> { + view.setupDocumentPreview( + uri = attachment.uri, + title = attachment.filename, + attachment = true, + onClick = { activity.launchViewIntent(attachment.uri, attachment.mimetype, attachment.filename) }, + onRemoveButtonClicked = { removeAttachment(attachment) } + ) + } + ATTACHMENT_VCARD -> { + view.setupVCardPreview( + activity = activity, + uri = attachment.uri, + attachment = true, + onClick = { + val intent = Intent(activity, VCardViewerActivity::class.java).also { + it.putExtra(EXTRA_VCARD_URI, attachment.uri) + } + activity.startActivity(intent) + }, + onRemoveButtonClicked = { removeAttachment(attachment) } + ) + } + ATTACHMENT_MEDIA -> setupMediaPreview(view, attachment) + } + } + } + + private fun setupMediaPreview(view: View, attachment: AttachmentSelection) { + view.apply { + media_attachment_holder.background.applyColorFilter(primaryColor.darkenColor()) + media_attachment_holder.setOnClickListener { + activity.launchViewIntent(attachment.uri, attachment.mimetype, attachment.filename) + } + remove_attachment_button.apply { + beVisible() + background.applyColorFilter(primaryColor) + setOnClickListener { + removeAttachment(attachment) + } + } + + if (attachment.mimetype.isImageMimeType() && attachment.isPending && config.mmsFileSizeLimit != FILE_SIZE_NONE) { + thumbnail.beGone() + compression_progress.beVisible() + + imageCompressor.compressImage(attachment.uri, config.mmsFileSizeLimit) { compressedUri -> + activity.runOnUiThread { + when (compressedUri) { + attachment.uri -> { + attachments.find { it.uri == attachment.uri }?.isPending = false + loadMediaPreview(view, attachment) + } + null -> { + activity.toast(com.simplemobiletools.smsmessenger.R.string.compress_error) + removeAttachment(attachment) + } + else -> { + attachments.remove(attachment) + addAttachment(attachment.copy(uri = compressedUri, isPending = false)) + } + } + onReady() + } + } + } else { + loadMediaPreview(view, attachment) + } + } + } + + private fun loadMediaPreview(view: View, attachment: AttachmentSelection) { + val roundedCornersRadius = resources.getDimension(com.simplemobiletools.smsmessenger.R.dimen.activity_margin).toInt() + val size = resources.getDimension(com.simplemobiletools.smsmessenger.R.dimen.attachment_preview_size).toInt() + + val options = RequestOptions() + .diskCacheStrategy(DiskCacheStrategy.NONE) + .transform(CenterCrop(), RoundedCorners(roundedCornersRadius)) + + Glide.with(view.thumbnail) + .load(attachment.uri) + .transition(DrawableTransitionOptions.withCrossFade()) + .override(size, size) + .apply(options) + .listener(object : RequestListener { + override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean { + removeAttachment(attachment) + activity.toast(com.simplemobiletools.smsmessenger.R.string.unknown_error_occurred) + return false + } + + override fun onResourceReady(dr: Drawable?, a: Any?, t: Target?, d: DataSource?, i: Boolean): Boolean { + view.thumbnail.beVisible() + view.play_icon.beVisibleIf(attachment.mimetype.isVideoMimeType()) + view.compression_progress.beGone() + return false + } + }) + .into(view.thumbnail) + } + + open inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + fun bindView( + any: AttachmentSelection, + allowSingleClick: Boolean, + allowLongClick: Boolean, + callback: (itemView: View, adapterPosition: Int) -> Unit + ): View { + return itemView.apply { + callback(this, adapterPosition) + + if (allowSingleClick) { + setOnClickListener { viewClicked(any) } + setOnLongClickListener { if (allowLongClick) viewLongClicked() else viewClicked(any); true } + } else { + setOnClickListener(null) + setOnLongClickListener(null) + } + } + } + + private fun viewClicked(any: AttachmentSelection) { + onItemClick.invoke(any) + } + + private fun viewLongClicked() { + + } + } +} + +private class AttachmentDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: AttachmentSelection, newItem: AttachmentSelection): Boolean { + return AttachmentSelection.areItemsTheSame(oldItem, newItem) + } + + override fun areContentsTheSame(oldItem: AttachmentSelection, newItem: AttachmentSelection): Boolean { + return AttachmentSelection.areContentsTheSame(oldItem, newItem) + } + +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt index 06366948..9aa0f4ee 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -1,13 +1,11 @@ package com.simplemobiletools.smsmessenger.adapters import android.annotation.SuppressLint -import android.content.ActivityNotFoundException import android.content.Intent import android.graphics.Color import android.graphics.Typeface import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable -import android.net.Uri import android.util.TypedValue import android.view.Menu import android.view.View @@ -38,7 +36,6 @@ import com.simplemobiletools.smsmessenger.extensions.* import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.models.* import kotlinx.android.synthetic.main.item_attachment_image.view.* -import kotlinx.android.synthetic.main.item_attachment_vcard.view.* import kotlinx.android.synthetic.main.item_received_message.view.* import kotlinx.android.synthetic.main.item_received_message.view.thread_mesage_attachments_holder import kotlinx.android.synthetic.main.item_received_message.view.thread_message_body @@ -49,8 +46,6 @@ import kotlinx.android.synthetic.main.item_thread_date_time.view.* import kotlinx.android.synthetic.main.item_thread_error.view.* import kotlinx.android.synthetic.main.item_thread_sending.view.* import kotlinx.android.synthetic.main.item_thread_success.view.* -import kotlinx.android.synthetic.main.item_unknown_attachment.view.* -import java.util.* class ThreadAdapter( activity: SimpleActivity, var messages: ArrayList, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit, val onThreadIdUpdate: (Long) -> Unit @@ -386,7 +381,7 @@ class ThreadAdapter( if (actModeCallback.isSelectable) { holder.viewClicked(message) } else { - launchViewIntent(uri, mimetype, attachment.filename) + activity.launchViewIntent(uri, mimetype, attachment.filename) } } imageView.setOnLongClickListener { @@ -400,50 +395,23 @@ class ThreadAdapter( val uri = attachment.getUri() parent.apply { val vCardView = layoutInflater.inflate(R.layout.item_attachment_vcard, null).apply { - background.applyColorFilter(backgroundColor.getContrastColor()) - vcard_title.setTextColor(textColor) - vcard_subtitle.setTextColor(textColor) - view_contact_details.setTextColor(properPrimaryColor) + setupVCardPreview( + activity = activity, + uri = uri, + onClick = { + if (actModeCallback.isSelectable) { + holder.viewClicked(message) + } else { + val intent = Intent(context, VCardViewerActivity::class.java).also { + it.putExtra(EXTRA_VCARD_URI, uri) + } + context.startActivity(intent) + } + }, + onLongClick = { holder.viewLongClicked() } + ) } thread_mesage_attachments_holder.addView(vCardView) - - parseVCardFromUri(context, uri) { vCards -> - val title = vCards.firstOrNull()?.parseNameFromVCard() - val imageIcon = if (title != null) { - SimpleContactsHelper(context).getContactLetterIcon(title) - } else { - null - } - activity.runOnUiThread { - vCardView.apply { - vcard_title.text = title - vcard_photo.setImageBitmap(imageIcon) - - if (vCards.size > 1) { - vcard_subtitle.beVisible() - val quantity = vCards.size - 1 - vcard_subtitle.text = resources.getQuantityString(R.plurals.and_other_contacts, quantity, quantity) - } else { - vcard_subtitle.beGone() - } - - setOnClickListener { - if (actModeCallback.isSelectable) { - holder.viewClicked(message) - } else { - val intent = Intent(context, VCardViewerActivity::class.java).also { - it.putExtra(EXTRA_VCARD_URI, uri) - } - context.startActivity(intent) - } - } - setOnLongClickListener { - holder.viewLongClicked() - true - } - } - } - } } } @@ -451,66 +419,24 @@ class ThreadAdapter( val mimetype = attachment.mimetype val uri = attachment.getUri() parent.apply { - val attachmentView = layoutInflater.inflate(R.layout.item_unknown_attachment, null).apply { - if (attachment.filename.isNotEmpty()) { - filename.text = attachment.filename - } - - val size = context.contentResolver - .openInputStream(uri) - ?.use { it.readBytes() } - ?.size - - if (size != null) { - file_size.beVisible() - file_size.text = size.formatSize() - } else { - file_size.beGone() - } - - background.applyColorFilter(textColor) - filename.setTextColor(textColor) - file_size.setTextColor(textColor) - icon.background.setTint(properPrimaryColor) - - setOnClickListener { - if (actModeCallback.isSelectable) { - holder.viewClicked(message) - } else { - launchViewIntent(uri, mimetype, attachment.filename) - } - } - setOnLongClickListener { - holder.viewLongClicked() - true - } + val attachmentView = layoutInflater.inflate(R.layout.item_attachment_document, null).apply { + setupDocumentPreview( + uri = uri, + title = attachment.filename, + onClick = { + if (actModeCallback.isSelectable) { + holder.viewClicked(message) + } else { + activity.launchViewIntent(uri, mimetype, attachment.filename) + } + }, + onLongClick = { holder.viewLongClicked() }, + ) } thread_mesage_attachments_holder.addView(attachmentView) } } - private fun launchViewIntent(uri: Uri, mimetype: String, filename: String) { - Intent().apply { - action = Intent.ACTION_VIEW - setDataAndType(uri, mimetype.lowercase(Locale.getDefault())) - addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - - try { - activity.hideKeyboard() - activity.startActivity(this) - } catch (e: ActivityNotFoundException) { - val newMimetype = filename.getMimeType() - if (newMimetype.isNotEmpty() && mimetype != newMimetype) { - launchViewIntent(uri, newMimetype, filename) - } else { - activity.toast(R.string.no_app_found) - } - } catch (e: Exception) { - activity.showErrorToast(e) - } - } - } - private fun setupDateTime(view: View, dateTime: ThreadDateTime) { view.apply { thread_date_time.apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Activity.kt index 1d165091..8bbd408c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Activity.kt @@ -4,10 +4,12 @@ import android.app.Activity import android.content.ActivityNotFoundException import android.content.Intent import android.net.Uri +import com.simplemobiletools.commons.extensions.getMimeType import com.simplemobiletools.commons.extensions.hideKeyboard import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.smsmessenger.R +import java.util.* fun Activity.dialNumber(phoneNumber: String, callback: (() -> Unit)? = null) { hideKeyboard() @@ -24,3 +26,25 @@ fun Activity.dialNumber(phoneNumber: String, callback: (() -> Unit)? = null) { } } } + +fun Activity.launchViewIntent(uri: Uri, mimetype: String, filename: String) { + Intent().apply { + action = Intent.ACTION_VIEW + setDataAndType(uri, mimetype.lowercase(Locale.getDefault())) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + + try { + hideKeyboard() + startActivity(this) + } catch (e: ActivityNotFoundException) { + val newMimetype = filename.getMimeType() + if (newMimetype.isNotEmpty() && mimetype != newMimetype) { + launchViewIntent(uri, newMimetype, filename) + } else { + toast(R.string.no_app_found) + } + } catch (e: Exception) { + showErrorToast(e) + } + } +} 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 c285ec98..17cc4b90 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -335,6 +335,7 @@ fun Context.getMmsAttachment(id: Long, getImageResolutions: Boolean): MessageAtt val attachment = Attachment(partId, id, Uri.withAppendedPath(uri, partId.toString()).toString(), mimetype, 0, 0, attachmentName) messageAttachment.attachments.add(attachment) } else { + // todo: fix filename parsing, xml is shown some sometimes val text = cursor.getStringValue(Mms.Part.TEXT) val cutName = text.substringAfter("ref src=\"").substringBefore("\"") if (cutName.isNotEmpty()) { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/View.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/View.kt new file mode 100644 index 00000000..47ff0dba --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/View.kt @@ -0,0 +1,18 @@ +package com.simplemobiletools.smsmessenger.extensions + +import android.animation.ObjectAnimator +import android.view.View +import androidx.core.animation.doOnStart +import androidx.core.view.isVisible + +fun View.showWithAnimation(duration: Long = 250L) { + if (!isVisible) { + ObjectAnimator.ofFloat( + this, "alpha", 0f, 1f + ).apply { + this.duration = duration + doOnStart { visibility = View.VISIBLE } + }.start() + } +} + 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 57c5ad8d..bec52c26 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt @@ -86,4 +86,8 @@ class Config(context: Context) : BaseConfig(context) { var wasDbCleared: Boolean get() = prefs.getBoolean(WAS_DB_CLEARED, false) set(wasDbCleared) = prefs.edit().putBoolean(WAS_DB_CLEARED, wasDbCleared).apply() + + var keyboardHeight: Int + get() = prefs.getInt(SOFT_KEYBOARD_HEIGHT, 600) + set(value) = prefs.edit().putInt(SOFT_KEYBOARD_HEIGHT, value).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 15baf492..2e96f376 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt @@ -30,6 +30,7 @@ const val IMPORT_MMS = "import_mms" const val WAS_DB_CLEARED = "was_db_cleared_2" const val EXTRA_VCARD_URI = "vcard" const val SCHEDULED_MESSAGE_ID = "scheduled_message_id" +const val SOFT_KEYBOARD_HEIGHT = "soft_keyboard_height" private const val PATH = "com.simplemobiletools.smsmessenger.action." const val MARK_AS_READ = PATH + "mark_as_read" @@ -45,6 +46,11 @@ const val THREAD_SENT_MESSAGE_ERROR = 4 const val THREAD_SENT_MESSAGE_SENT = 5 const val THREAD_SENT_MESSAGE_SENDING = 6 +// view types for attachment list +const val ATTACHMENT_DOCUMENT = 7 +const val ATTACHMENT_MEDIA = 8 +const val ATTACHMENT_VCARD = 9 + // lock screen visibility constants const val LOCK_SCREEN_SENDER_MESSAGE = 1 const val LOCK_SCREEN_SENDER = 2 @@ -60,6 +66,15 @@ const val FILE_SIZE_2_MB = 2_097_152L const val MESSAGES_LIMIT = 50 +// intent launch request codes +const val PICK_PHOTO_VIDEO_INTENT = 42 +const val PICK_SAVE_FILE_INTENT = 43 +const val CAPTURE_PHOTO_INTENT = 44 +const val CAPTURE_VIDEO_INTENT = 45 +const val CAPTURE_AUDIO_INTENT = 46 +const val PICK_DOCUMENT_INTENT = 47 +const val PICK_CONTACT_INTENT = 48 + fun refreshMessages() { EventBus.getDefault().post(Events.RefreshMessages()) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/DocumentPreview.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/DocumentPreview.kt new file mode 100644 index 00000000..f737a823 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/DocumentPreview.kt @@ -0,0 +1,55 @@ +package com.simplemobiletools.smsmessenger.helpers + +import android.net.Uri +import android.view.View +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.smsmessenger.extensions.getFileSizeFromUri +import kotlinx.android.synthetic.main.item_attachment_document.view.* +import kotlinx.android.synthetic.main.item_remove_attachment_button.view.* + +fun View.setupDocumentPreview( + uri: Uri, + title: String, + attachment: Boolean = false, + onClick: (() -> Unit)? = null, + onLongClick: (() -> Unit)? = null, + onRemoveButtonClicked: (() -> Unit)? = null +) { + if (title.isNotEmpty()) { + filename.text = title + } + + val size = context.getFileSizeFromUri(uri) + file_size.beVisible() + file_size.text = size.formatSize() + + val textColor = context.getProperTextColor() + val primaryColor = context.getProperPrimaryColor() + + document_attachment_holder.background.applyColorFilter(textColor) + filename.setTextColor(textColor) + file_size.setTextColor(textColor) + // todo: set icon drawable based on mime type + icon.background.setTint(primaryColor) + document_attachment_holder.background.applyColorFilter(primaryColor.darkenColor()) + + if (attachment) { + remove_attachment_button.apply { + beVisible() + background.applyColorFilter(primaryColor) + if (onRemoveButtonClicked != null) { + setOnClickListener { + onRemoveButtonClicked.invoke() + } + } + } + } + + document_attachment_holder.setOnClickListener { + onClick?.invoke() + } + document_attachment_holder.setOnLongClickListener { + onLongClick?.invoke() + true + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardPreview.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardPreview.kt new file mode 100644 index 00000000..8cf7052c --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardPreview.kt @@ -0,0 +1,83 @@ +package com.simplemobiletools.smsmessenger.helpers + +import android.app.Activity +import android.net.Uri +import android.view.View +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.SimpleContactsHelper +import com.simplemobiletools.smsmessenger.R +import kotlinx.android.synthetic.main.item_attachment_vcard.view.* +import kotlinx.android.synthetic.main.item_attachment_vcard_preview.view.* +import kotlinx.android.synthetic.main.item_remove_attachment_button.view.* + +fun View.setupVCardPreview( + activity: Activity, + uri: Uri, + attachment: Boolean = false, + onClick: (() -> Unit)? = null, + onLongClick: (() -> Unit)? = null, + onRemoveButtonClicked: (() -> Unit)? = null, +) { + val textColor = activity.getProperTextColor() + val primaryColor = activity.getProperPrimaryColor() + + vcard_attachment_holder.background.applyColorFilter(primaryColor.darkenColor()) + vcard_title.setTextColor(textColor) + vcard_subtitle.setTextColor(textColor) + + if (attachment) { + vcard_progress.beVisible() + } + arrayOf(vcard_photo, vcard_title, vcard_subtitle, view_contact_details).forEach { + it.beGone() + } + + parseVCardFromUri(activity, uri) { vCards -> + val title = vCards.firstOrNull()?.parseNameFromVCard() + val imageIcon = if (title != null) { + SimpleContactsHelper(activity).getContactLetterIcon(title) + } else { + null + } + activity.runOnUiThread { + arrayOf(vcard_photo, vcard_title).forEach { + it.beVisible() + } + + vcard_photo.setImageBitmap(imageIcon) + vcard_title.text = title + + if (vCards.size > 1) { + vcard_subtitle.beVisible() + val quantity = vCards.size - 1 + vcard_subtitle.text = resources.getQuantityString(R.plurals.and_other_contacts, quantity, quantity) + } else { + vcard_subtitle.beGone() + } + + if (attachment) { + vcard_progress.beGone() + remove_attachment_button.apply { + beVisible() + background.applyColorFilter(primaryColor) + if (onRemoveButtonClicked != null) { + setOnClickListener { + onRemoveButtonClicked.invoke() + } + } + } + } else { + view_contact_details.setTextColor(primaryColor) + view_contact_details.beVisible() + } + + vcard_attachment_holder.setOnClickListener { + onClick?.invoke() + } + vcard_attachment_holder.setOnLongClickListener { + onLongClick?.invoke() + true + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt index e56835d2..eb81fda2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt @@ -1,8 +1,35 @@ package com.simplemobiletools.smsmessenger.models import android.net.Uri +import com.simplemobiletools.smsmessenger.extensions.isImageMimeType +import com.simplemobiletools.smsmessenger.extensions.isVCardMimeType +import com.simplemobiletools.smsmessenger.extensions.isVideoMimeType +import com.simplemobiletools.smsmessenger.helpers.ATTACHMENT_DOCUMENT +import com.simplemobiletools.smsmessenger.helpers.ATTACHMENT_MEDIA +import com.simplemobiletools.smsmessenger.helpers.ATTACHMENT_VCARD data class AttachmentSelection( val uri: Uri, - val isPending: Boolean, -) + val mimetype: String, + val filename: String, + var isPending: Boolean, + val viewType: Int = getViewTypeForMimeType(mimetype) +) { + companion object { + fun getViewTypeForMimeType(mimetype: String): Int { + return when { + mimetype.isImageMimeType() || mimetype.isVideoMimeType() -> ATTACHMENT_MEDIA + mimetype.isVCardMimeType() -> ATTACHMENT_VCARD + else -> ATTACHMENT_DOCUMENT + } + } + + fun areItemsTheSame(first: AttachmentSelection, second: AttachmentSelection): Boolean { + return first.uri == second.uri + } + + fun areContentsTheSame(first: AttachmentSelection, second: AttachmentSelection): Boolean { + return first.uri == second.uri && first.mimetype == second.mimetype && first.filename == second.filename + } + } +} diff --git a/app/src/main/res/drawable/ic_image_vector.xml b/app/src/main/res/drawable/ic_image_vector.xml new file mode 100644 index 00000000..0a221c91 --- /dev/null +++ b/app/src/main/res/drawable/ic_image_vector.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_music_vector.xml b/app/src/main/res/drawable/ic_music_vector.xml new file mode 100644 index 00000000..1a7c4d5b --- /dev/null +++ b/app/src/main/res/drawable/ic_music_vector.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_vector_play_circle_outline.xml b/app/src/main/res/drawable/ic_vector_play_circle_outline.xml new file mode 100644 index 00000000..8a252301 --- /dev/null +++ b/app/src/main/res/drawable/ic_vector_play_circle_outline.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_videocam_vector.xml b/app/src/main/res/drawable/ic_videocam_vector.xml new file mode 100644 index 00000000..5ea7a412 --- /dev/null +++ b/app/src/main/res/drawable/ic_videocam_vector.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_thread.xml b/app/src/main/res/layout/activity_thread.xml index 4e3baf2c..7bdec389 100644 --- a/app/src/main/res/layout/activity_thread.xml +++ b/app/src/main/res/layout/activity_thread.xml @@ -22,10 +22,10 @@ - @@ -34,6 +34,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" + app:layout_constraintTop_toTopOf="parent" tools:visibility="visible"> + android:importantForAccessibility="no" + app:layout_constraintBottom_toTopOf="@id/scheduled_message_holder" + app:layout_constraintTop_toBottomOf="@id/thread_messages_fastscroller" + tools:layout_height="1dp" /> + android:src="@drawable/ic_plus_vector" + app:layout_constraintBottom_toTopOf="@id/attachment_picker_divider" + app:layout_constraintStart_toStartOf="parent" /> - - + - - - - + android:visibility="gone" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:layout_constraintBottom_toTopOf="@id/thread_type_message" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/scheduled_message_holder" + app:layout_goneMarginTop="@dimen/medium_margin" + tools:itemCount="2" + tools:listitem="@layout/item_attachment_document_preview" + tools:visibility="visible" /> + android:minHeight="@dimen/normal_icon_size" + app:layout_constraintBottom_toTopOf="@id/attachment_picker_divider" + app:layout_constraintEnd_toStartOf="@id/thread_select_sim_icon" + app:layout_constraintStart_toEndOf="@+id/thread_add_attachment" /> + android:visibility="gone" + app:layout_constraintBottom_toTopOf="@id/attachment_picker_divider" + app:layout_constraintEnd_toStartOf="@id/thread_character_counter" + tools:visibility="visible" /> + app:layout_constraintBottom_toBottomOf="@id/thread_select_sim_icon" + app:layout_constraintEnd_toEndOf="@id/thread_select_sim_icon" + app:layout_constraintStart_toStartOf="@id/thread_select_sim_icon" + app:layout_constraintTop_toTopOf="@id/thread_select_sim_icon" + tools:text="1" + tools:textColor="@color/dark_grey" + tools:visibility="visible" /> + app:layout_constraintBottom_toTopOf="@id/attachment_picker_divider" + app:layout_constraintEnd_toStartOf="@+id/thread_send_message" + app:layout_constraintTop_toTopOf="@+id/thread_send_message" + tools:ignore="HardcodedText" + tools:visibility="visible" /> + android:textSize="@dimen/smaller_text_size" + app:layout_constraintBottom_toTopOf="@id/attachment_picker_divider" + app:layout_constraintEnd_toEndOf="parent" /> - + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_attachment.xml b/app/src/main/res/layout/item_attachment.xml deleted file mode 100644 index be794651..00000000 --- a/app/src/main/res/layout/item_attachment.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/layout/item_attachment_document.xml b/app/src/main/res/layout/item_attachment_document.xml new file mode 100644 index 00000000..603454b4 --- /dev/null +++ b/app/src/main/res/layout/item_attachment_document.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_attachment_document_preview.xml b/app/src/main/res/layout/item_attachment_document_preview.xml new file mode 100644 index 00000000..19f29d13 --- /dev/null +++ b/app/src/main/res/layout/item_attachment_document_preview.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/app/src/main/res/layout/item_attachment_media_preview.xml b/app/src/main/res/layout/item_attachment_media_preview.xml new file mode 100644 index 00000000..c5a4c8df --- /dev/null +++ b/app/src/main/res/layout/item_attachment_media_preview.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_attachment_vcard.xml b/app/src/main/res/layout/item_attachment_vcard.xml index 03ab668b..ff446f8f 100644 --- a/app/src/main/res/layout/item_attachment_vcard.xml +++ b/app/src/main/res/layout/item_attachment_vcard.xml @@ -1,57 +1,63 @@ - + app:layout_constraintTop_toTopOf="parent" /> - + android:layout_gravity="center_vertical" + android:layout_marginStart="@dimen/medium_margin" + android:orientation="vertical"> - + - + - + + + + diff --git a/app/src/main/res/layout/item_attachment_vcard_preview.xml b/app/src/main/res/layout/item_attachment_vcard_preview.xml new file mode 100644 index 00000000..ac469552 --- /dev/null +++ b/app/src/main/res/layout/item_attachment_vcard_preview.xml @@ -0,0 +1,39 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/item_remove_attachment_button.xml b/app/src/main/res/layout/item_remove_attachment_button.xml new file mode 100644 index 00000000..b516b97b --- /dev/null +++ b/app/src/main/res/layout/item_remove_attachment_button.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/app/src/main/res/layout/item_unknown_attachment.xml b/app/src/main/res/layout/item_unknown_attachment.xml deleted file mode 100644 index 8b884084..00000000 --- a/app/src/main/res/layout/item_unknown_attachment.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e0959a28..0a03e197 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,9 +3,14 @@ 72dp 64dp 36dp - 60dp + 64dp + @dimen/attachment_preview_size + 156dp 24dp 15dp 64dp 20dp + 36dp + 80dp + 90dp From 54f7c5980bd3f0c698643d261c6d54dffee144a7 Mon Sep 17 00:00:00 2001 From: Naveen Date: Wed, 2 Nov 2022 20:32:51 +0530 Subject: [PATCH 03/61] Move preview helpers to one place --- ...{VCardPreview.kt => AttachmentPreviews.kt} | 49 +++++++++++++++++ .../smsmessenger/helpers/DocumentPreview.kt | 55 ------------------- 2 files changed, 49 insertions(+), 55 deletions(-) rename app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/{VCardPreview.kt => AttachmentPreviews.kt} (65%) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/DocumentPreview.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardPreview.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt similarity index 65% rename from app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardPreview.kt rename to app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt index 8cf7052c..03efe2f0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardPreview.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt @@ -6,10 +6,59 @@ import android.view.View import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.smsmessenger.R +import com.simplemobiletools.smsmessenger.extensions.getFileSizeFromUri +import kotlinx.android.synthetic.main.item_attachment_document.view.* import kotlinx.android.synthetic.main.item_attachment_vcard.view.* import kotlinx.android.synthetic.main.item_attachment_vcard_preview.view.* import kotlinx.android.synthetic.main.item_remove_attachment_button.view.* +fun View.setupDocumentPreview( + uri: Uri, + title: String, + attachment: Boolean = false, + onClick: (() -> Unit)? = null, + onLongClick: (() -> Unit)? = null, + onRemoveButtonClicked: (() -> Unit)? = null +) { + if (title.isNotEmpty()) { + filename.text = title + } + + val size = context.getFileSizeFromUri(uri) + file_size.beVisible() + file_size.text = size.formatSize() + + val textColor = context.getProperTextColor() + val primaryColor = context.getProperPrimaryColor() + + document_attachment_holder.background.applyColorFilter(textColor) + filename.setTextColor(textColor) + file_size.setTextColor(textColor) + // todo: set icon drawable based on mime type + icon.background.setTint(primaryColor) + document_attachment_holder.background.applyColorFilter(primaryColor.darkenColor()) + + if (attachment) { + remove_attachment_button.apply { + beVisible() + background.applyColorFilter(primaryColor) + if (onRemoveButtonClicked != null) { + setOnClickListener { + onRemoveButtonClicked.invoke() + } + } + } + } + + document_attachment_holder.setOnClickListener { + onClick?.invoke() + } + document_attachment_holder.setOnLongClickListener { + onLongClick?.invoke() + true + } +} + fun View.setupVCardPreview( activity: Activity, uri: Uri, diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/DocumentPreview.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/DocumentPreview.kt deleted file mode 100644 index f737a823..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/DocumentPreview.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.simplemobiletools.smsmessenger.helpers - -import android.net.Uri -import android.view.View -import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.smsmessenger.extensions.getFileSizeFromUri -import kotlinx.android.synthetic.main.item_attachment_document.view.* -import kotlinx.android.synthetic.main.item_remove_attachment_button.view.* - -fun View.setupDocumentPreview( - uri: Uri, - title: String, - attachment: Boolean = false, - onClick: (() -> Unit)? = null, - onLongClick: (() -> Unit)? = null, - onRemoveButtonClicked: (() -> Unit)? = null -) { - if (title.isNotEmpty()) { - filename.text = title - } - - val size = context.getFileSizeFromUri(uri) - file_size.beVisible() - file_size.text = size.formatSize() - - val textColor = context.getProperTextColor() - val primaryColor = context.getProperPrimaryColor() - - document_attachment_holder.background.applyColorFilter(textColor) - filename.setTextColor(textColor) - file_size.setTextColor(textColor) - // todo: set icon drawable based on mime type - icon.background.setTint(primaryColor) - document_attachment_holder.background.applyColorFilter(primaryColor.darkenColor()) - - if (attachment) { - remove_attachment_button.apply { - beVisible() - background.applyColorFilter(primaryColor) - if (onRemoveButtonClicked != null) { - setOnClickListener { - onRemoveButtonClicked.invoke() - } - } - } - } - - document_attachment_holder.setOnClickListener { - onClick?.invoke() - } - document_attachment_holder.setOnLongClickListener { - onLongClick?.invoke() - true - } -} From ecdbc9036aae0ef00b609ca15283b56d023d9fd0 Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 3 Nov 2022 00:01:52 +0530 Subject: [PATCH 04/61] Extract all properties when adding contact attachment --- .../smsmessenger/activities/ThreadActivity.kt | 57 +-- .../adapters/AttachmentsAdapter.kt | 11 +- .../smsmessenger/helpers/ContactsHelper.kt | 449 ++++++++++++++++++ app/src/main/res/xml/provider_paths.xml | 2 +- 4 files changed, 486 insertions(+), 33 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ContactsHelper.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 02667c6b..466f13ca 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -57,9 +57,6 @@ import com.simplemobiletools.smsmessenger.dialogs.ScheduleMessageDialog import com.simplemobiletools.smsmessenger.extensions.* import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.models.* -import ezvcard.VCard -import ezvcard.property.FormattedName -import ezvcard.property.Telephone import kotlinx.android.synthetic.main.activity_thread.* import kotlinx.android.synthetic.main.item_selected_contact.view.* import org.greenrobot.eventbus.EventBus @@ -240,7 +237,7 @@ class ThreadActivity : SimpleActivity() { addAttachment(data) } PICK_CONTACT_INTENT -> if (data != null) { - handleContactAttachment(data) + addContactAttachment(data) } PICK_SAVE_FILE_INTENT -> if (data != null) { saveAttachment(resultData) @@ -817,17 +814,16 @@ class ThreadActivity : SimpleActivity() { } } - private fun createTemporaryFile(extension: String = ".jpg"): File { - val outputDirectory = File(cacheDir, "captured").apply { + private fun getAttachmentsDir(): File { + return File(cacheDir, "attachments").apply { if (!exists()) { mkdirs() } } - return File.createTempFile("attachment_", extension, outputDirectory) } private fun launchCapturePhotoIntent() { - val imageFile = createTemporaryFile() + val imageFile = File.createTempFile("attachment_", ".jpg", getAttachmentsDir()) capturedImageUri = getMyFileUri(imageFile) val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, capturedImageUri) @@ -874,26 +870,30 @@ class ThreadActivity : SimpleActivity() { launchActivityForResult(intent, PICK_CONTACT_INTENT) } - private fun handleContactAttachment(contactUri: Uri) { - val projection = arrayOf( - ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, - ContactsContract.CommonDataKinds.Phone.NUMBER - ) - queryCursor(contactUri, projection, null, null, null) { cursor -> - if (cursor.moveToFirst()) { - val nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) - val numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) - val name = cursor.getString(nameIndex) - val number = cursor.getString(numberIndex) - // todo: export all properties using VcfExporter - val vCard = VCard() - vCard.addTelephoneNumber(Telephone(number)) - vCard.addFormattedName(FormattedName(name)) - val file = createTemporaryFile(".vcf") - val outputStream = file.outputStream() - vCard.write(outputStream) - val vCardUri = getMyFileUri(file) - addAttachment(vCardUri) + private fun addContactAttachment(contactUri: Uri) { + ensureBackgroundThread { + val contact = ContactsHelper(this).getContactFromUri(contactUri) + if (contact != null) { + val outputFile = File(getAttachmentsDir(), "${contact.contactId}.vcf") + val outputStream = outputFile.outputStream() + + VcfExporter().exportContacts( + activity = this, + outputStream = outputStream, + contacts = arrayListOf(contact), + showExportingToast = false, + ) { + if (it == VcfExporter.ExportResult.EXPORT_OK) { + val vCardUri = getMyFileUri(outputFile) + runOnUiThread { + addAttachment(vCardUri) + } + } else { + toast(R.string.unknown_error_occurred) + } + } + } else { + toast(R.string.unknown_error_occurred) } } } @@ -914,6 +914,7 @@ class ThreadActivity : SimpleActivity() { if (adapter == null) { adapter = AttachmentsAdapter( activity = this, + recyclerView = thread_attachments_recyclerview, onItemClick = {}, onAttachmentsRemoved = { thread_attachments_recyclerview.beGone() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt index 37baa75b..135da40b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt @@ -31,6 +31,7 @@ import kotlinx.android.synthetic.main.item_remove_attachment_button.view.* class AttachmentsAdapter( val activity: BaseSimpleActivity, + val recyclerView: RecyclerView, val onItemClick: (AttachmentSelection) -> Unit, val onAttachmentsRemoved: () -> Unit, val onReady: (() -> Unit) @@ -45,8 +46,10 @@ class AttachmentsAdapter( fun clear() { attachments.clear() - submitList(ArrayList()) - onAttachmentsRemoved() + submitList(emptyList()) + recyclerView.onGlobalLayout { + onAttachmentsRemoved() + } } fun addAttachment(attachment: AttachmentSelection) { @@ -58,9 +61,9 @@ class AttachmentsAdapter( private fun removeAttachment(attachment: AttachmentSelection) { attachments.removeAll { AttachmentSelection.areItemsTheSame(it, attachment) } if (attachments.isEmpty()) { - onAttachmentsRemoved() + clear() } else { - submitList(ArrayList(attachments)) + submitList(attachments.toList()) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ContactsHelper.kt new file mode 100644 index 00000000..36c9d123 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ContactsHelper.kt @@ -0,0 +1,449 @@ +package com.simplemobiletools.smsmessenger.helpers + +import android.content.Context +import android.net.Uri +import android.provider.ContactsContract +import android.provider.ContactsContract.CommonDataKinds.* +import android.provider.ContactsContract.Data +import android.text.TextUtils +import android.util.SparseArray +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.models.PhoneNumber +import com.simplemobiletools.commons.models.contacts.* +import com.simplemobiletools.commons.models.contacts.Email +import com.simplemobiletools.commons.models.contacts.Event +import com.simplemobiletools.commons.models.contacts.Organization +import com.simplemobiletools.commons.overloads.times + +// based on the ContactsHelper from Simple-Contacts +class ContactsHelper(val context: Context) { + private var displayContactSources = ArrayList() + + fun getContactFromUri(uri: Uri): Contact? { + val projection = arrayOf(Data.RAW_CONTACT_ID) + val cursor = context.contentResolver.query(uri, projection, null, null, null) + cursor?.use { + if (cursor.moveToFirst()) { + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + return getContactWithId(id) + } + } + return null + } + + private fun getContactWithId(id: Int): Contact? { + if (id == 0) { + return null + } + + val selection = "(${Data.MIMETYPE} = ? OR ${Data.MIMETYPE} = ?) AND ${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = arrayOf(StructuredName.CONTENT_ITEM_TYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE, id.toString()) + return parseContactCursor(selection, selectionArgs) + } + + private fun parseContactCursor(selection: String, selectionArgs: Array): Contact? { + val storedGroups = getDeviceStoredGroups() + val uri = Data.CONTENT_URI + val projection = getContactProjection() + + val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + + var prefix = "" + var firstName = "" + var middleName = "" + var surname = "" + var suffix = "" + val mimetype = cursor.getStringValue(Data.MIMETYPE) + + // ignore names at Organization type contacts + if (mimetype == StructuredName.CONTENT_ITEM_TYPE) { + prefix = cursor.getStringValue(StructuredName.PREFIX) ?: "" + firstName = cursor.getStringValue(StructuredName.GIVEN_NAME) ?: "" + middleName = cursor.getStringValue(StructuredName.MIDDLE_NAME) ?: "" + surname = cursor.getStringValue(StructuredName.FAMILY_NAME) ?: "" + suffix = cursor.getStringValue(StructuredName.SUFFIX) ?: "" + } + + val nickname = getNicknames(id)[id] ?: "" + val photoUri = cursor.getStringValue(Phone.PHOTO_URI) ?: "" + val number = getPhoneNumbers(id)[id] ?: ArrayList() + val emails = getEmails(id)[id] ?: ArrayList() + val addresses = getAddresses(id)[id] ?: ArrayList() + val events = getEvents(id)[id] ?: ArrayList() + val notes = getNotes(id)[id] ?: "" + val accountName = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: "" + val starred = cursor.getIntValue(StructuredName.STARRED) + val ringtone = cursor.getStringValue(StructuredName.CUSTOM_RINGTONE) + val contactId = cursor.getIntValue(Data.CONTACT_ID) + val groups = getContactGroups(storedGroups, contactId)[contactId] ?: ArrayList() + val thumbnailUri = cursor.getStringValue(StructuredName.PHOTO_THUMBNAIL_URI) ?: "" + val organization = getOrganizations(id)[id] ?: Organization("", "") + val websites = getWebsites(id)[id] ?: ArrayList() + val ims = getIMs(id)[id] ?: ArrayList() + return Contact( + id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, number, emails, addresses, events, + accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims, mimetype, ringtone + ) + } + } + + return null + } + + private fun getPhoneNumbers(contactId: Int? = null): SparseArray> { + val phoneNumbers = SparseArray>() + val uri = Phone.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + Phone.NUMBER, + Phone.NORMALIZED_NUMBER, + Phone.TYPE, + Phone.LABEL, + Phone.IS_PRIMARY + ) + + val selection = if (contactId == null) getSourcesSelection() else "${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = if (contactId == null) getSourcesSelectionArgs() else arrayOf(contactId.toString()) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val number = cursor.getStringValue(Phone.NUMBER) ?: return@queryCursor + val normalizedNumber = cursor.getStringValue(Phone.NORMALIZED_NUMBER) ?: number.normalizePhoneNumber() + val type = cursor.getIntValue(Phone.TYPE) + val label = cursor.getStringValue(Phone.LABEL) ?: "" + val isPrimary = cursor.getIntValue(Phone.IS_PRIMARY) != 0 + + if (phoneNumbers[id] == null) { + phoneNumbers.put(id, ArrayList()) + } + + val phoneNumber = PhoneNumber(number, type, label, normalizedNumber, isPrimary) + phoneNumbers[id].add(phoneNumber) + } + + return phoneNumbers + } + + private fun getNicknames(contactId: Int? = null): SparseArray { + val nicknames = SparseArray() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + Nickname.NAME + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(Nickname.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val nickname = cursor.getStringValue(Nickname.NAME) ?: return@queryCursor + nicknames.put(id, nickname) + } + + return nicknames + } + + private fun getEmails(contactId: Int? = null): SparseArray> { + val emails = SparseArray>() + val uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + ContactsContract.CommonDataKinds.Email.DATA, + ContactsContract.CommonDataKinds.Email.TYPE, + ContactsContract.CommonDataKinds.Email.LABEL + ) + + val selection = if (contactId == null) getSourcesSelection() else "${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = if (contactId == null) getSourcesSelectionArgs() else arrayOf(contactId.toString()) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val email = cursor.getStringValue(ContactsContract.CommonDataKinds.Email.DATA) ?: return@queryCursor + val type = cursor.getIntValue(ContactsContract.CommonDataKinds.Email.TYPE) + val label = cursor.getStringValue(ContactsContract.CommonDataKinds.Email.LABEL) ?: "" + + if (emails[id] == null) { + emails.put(id, ArrayList()) + } + + emails[id]!!.add(Email(email, type, label)) + } + + return emails + } + + private fun getAddresses(contactId: Int? = null): SparseArray> { + val addresses = SparseArray>() + val uri = StructuredPostal.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + StructuredPostal.FORMATTED_ADDRESS, + StructuredPostal.TYPE, + StructuredPostal.LABEL + ) + + val selection = if (contactId == null) getSourcesSelection() else "${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = if (contactId == null) getSourcesSelectionArgs() else arrayOf(contactId.toString()) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val address = cursor.getStringValue(StructuredPostal.FORMATTED_ADDRESS) ?: return@queryCursor + val type = cursor.getIntValue(StructuredPostal.TYPE) + val label = cursor.getStringValue(StructuredPostal.LABEL) ?: "" + + if (addresses[id] == null) { + addresses.put(id, ArrayList()) + } + + addresses[id]!!.add(Address(address, type, label)) + } + + return addresses + } + + private fun getIMs(contactId: Int? = null): SparseArray> { + val IMs = SparseArray>() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + Im.DATA, + Im.PROTOCOL, + Im.CUSTOM_PROTOCOL + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(Im.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val IM = cursor.getStringValue(Im.DATA) ?: return@queryCursor + val type = cursor.getIntValue(Im.PROTOCOL) + val label = cursor.getStringValue(Im.CUSTOM_PROTOCOL) ?: "" + + if (IMs[id] == null) { + IMs.put(id, ArrayList()) + } + + IMs[id]!!.add(IM(IM, type, label)) + } + + return IMs + } + + private fun getEvents(contactId: Int? = null): SparseArray> { + val events = SparseArray>() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + ContactsContract.CommonDataKinds.Event.START_DATE, + ContactsContract.CommonDataKinds.Event.TYPE + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val startDate = cursor.getStringValue(ContactsContract.CommonDataKinds.Event.START_DATE) ?: return@queryCursor + val type = cursor.getIntValue(ContactsContract.CommonDataKinds.Event.TYPE) + + if (events[id] == null) { + events.put(id, ArrayList()) + } + + events[id]!!.add(Event(startDate, type)) + } + + return events + } + + private fun getNotes(contactId: Int? = null): SparseArray { + val notes = SparseArray() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + Note.NOTE + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(Note.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val note = cursor.getStringValue(Note.NOTE) ?: return@queryCursor + notes.put(id, note) + } + + return notes + } + + private fun getOrganizations(contactId: Int? = null): SparseArray { + val organizations = SparseArray() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + ContactsContract.CommonDataKinds.Organization.COMPANY, + ContactsContract.CommonDataKinds.Organization.TITLE + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val company = cursor.getStringValue(ContactsContract.CommonDataKinds.Organization.COMPANY) ?: "" + val title = cursor.getStringValue(ContactsContract.CommonDataKinds.Organization.TITLE) ?: "" + if (company.isEmpty() && title.isEmpty()) { + return@queryCursor + } + + val organization = Organization(company, title) + organizations.put(id, organization) + } + + return organizations + } + + private fun getWebsites(contactId: Int? = null): SparseArray> { + val websites = SparseArray>() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + Website.URL + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(Website.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val url = cursor.getStringValue(Website.URL) ?: return@queryCursor + + if (websites[id] == null) { + websites.put(id, ArrayList()) + } + + websites[id]!!.add(url) + } + + return websites + } + + private fun getDeviceStoredGroups(): java.util.ArrayList { + val groups = java.util.ArrayList() + + val uri = ContactsContract.Groups.CONTENT_URI + val projection = arrayOf( + ContactsContract.Groups._ID, + ContactsContract.Groups.TITLE, + ContactsContract.Groups.SYSTEM_ID + ) + + val selection = "${ContactsContract.Groups.AUTO_ADD} = ? AND ${ContactsContract.Groups.FAVORITES} = ?" + val selectionArgs = arrayOf("0", "0") + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getLongValue(ContactsContract.Groups._ID) + val title = cursor.getStringValue(ContactsContract.Groups.TITLE) ?: return@queryCursor + + val systemId = cursor.getStringValue(ContactsContract.Groups.SYSTEM_ID) + if (groups.map { it.title }.contains(title) && systemId != null) { + return@queryCursor + } + + groups.add(Group(id, title)) + } + return groups + } + + private fun getContactGroups(storedGroups: ArrayList, contactId: Int? = null): SparseArray> { + val groups = SparseArray>() + + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.CONTACT_ID, + Data.DATA1 + ) + + val selection = getSourcesSelection(true, contactId != null, false) + val selectionArgs = getSourcesSelectionArgs(GroupMembership.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.CONTACT_ID) + val newRowId = cursor.getLongValue(Data.DATA1) + + val groupTitle = storedGroups.firstOrNull { it.id == newRowId }?.title ?: return@queryCursor + val group = Group(newRowId, groupTitle) + if (groups[id] == null) { + groups.put(id, ArrayList()) + } + groups[id]!!.add(group) + } + + return groups + } + + private fun getQuestionMarks() = ("?," * displayContactSources.filter { it.isNotEmpty() }.size).trimEnd(',') + + private fun getSourcesSelection(addMimeType: Boolean = false, addContactId: Boolean = false, useRawContactId: Boolean = true): String { + val strings = ArrayList() + if (addMimeType) { + strings.add("${Data.MIMETYPE} = ?") + } + + if (addContactId) { + strings.add("${if (useRawContactId) Data.RAW_CONTACT_ID else Data.CONTACT_ID} = ?") + } else { + // sometimes local device storage has null account_name, handle it properly + val accountNameString = StringBuilder() + if (displayContactSources.contains("")) { + accountNameString.append("(") + } + accountNameString.append("${ContactsContract.RawContacts.ACCOUNT_NAME} IN (${getQuestionMarks()})") + if (displayContactSources.contains("")) { + accountNameString.append(" OR ${ContactsContract.RawContacts.ACCOUNT_NAME} IS NULL)") + } + strings.add(accountNameString.toString()) + } + + return TextUtils.join(" AND ", strings) + } + + private fun getSourcesSelectionArgs(mimetype: String? = null, contactId: Int? = null): Array { + val args = ArrayList() + + if (mimetype != null) { + args.add(mimetype) + } + + if (contactId != null) { + args.add(contactId.toString()) + } else { + args.addAll(displayContactSources.filter { it.isNotEmpty() }) + } + + return args.toTypedArray() + } + + private fun getContactProjection() = arrayOf( + Data.MIMETYPE, + Data.CONTACT_ID, + Data.RAW_CONTACT_ID, + StructuredName.PREFIX, + StructuredName.GIVEN_NAME, + StructuredName.MIDDLE_NAME, + StructuredName.FAMILY_NAME, + StructuredName.SUFFIX, + StructuredName.PHOTO_URI, + StructuredName.PHOTO_THUMBNAIL_URI, + StructuredName.STARRED, + StructuredName.CUSTOM_RINGTONE, + ContactsContract.RawContacts.ACCOUNT_NAME, + ContactsContract.RawContacts.ACCOUNT_TYPE + ) + +} diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml index 758c02cd..7c909b1b 100644 --- a/app/src/main/res/xml/provider_paths.xml +++ b/app/src/main/res/xml/provider_paths.xml @@ -1,5 +1,5 @@ - + From fedc52adc3c49e94094466c4cffefb939fa3a8bb Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 3 Nov 2022 00:20:02 +0530 Subject: [PATCH 05/61] Show toast warning for duplicate attachments --- .../smsmessenger/activities/ThreadActivity.kt | 1 + app/src/main/res/values-ar/strings.xml | 4 +++- app/src/main/res/values-az/strings.xml | 2 ++ app/src/main/res/values-be/strings.xml | 2 ++ app/src/main/res/values-bg/strings.xml | 2 ++ app/src/main/res/values-ca/strings.xml | 4 +++- app/src/main/res/values-cr/strings.xml | 2 ++ app/src/main/res/values-cs/strings.xml | 2 ++ app/src/main/res/values-da/strings.xml | 2 ++ app/src/main/res/values-de/strings.xml | 4 +++- app/src/main/res/values-el/strings.xml | 2 ++ app/src/main/res/values-eo/strings.xml | 2 ++ app/src/main/res/values-es/strings.xml | 4 +++- app/src/main/res/values-et/strings.xml | 4 +++- app/src/main/res/values-fi/strings.xml | 2 ++ app/src/main/res/values-fr/strings.xml | 4 +++- app/src/main/res/values-gl/strings.xml | 4 +++- app/src/main/res/values-hi/strings.xml | 2 ++ app/src/main/res/values-hr/strings.xml | 2 ++ app/src/main/res/values-hu/strings.xml | 2 ++ app/src/main/res/values-in/strings.xml | 2 ++ app/src/main/res/values-it/strings.xml | 4 +++- app/src/main/res/values-iw/strings.xml | 2 ++ app/src/main/res/values-ja/strings.xml | 4 +++- app/src/main/res/values-lt/strings.xml | 2 ++ app/src/main/res/values-lv/strings.xml | 2 ++ app/src/main/res/values-mk/strings.xml | 2 ++ app/src/main/res/values-ml/strings.xml | 2 ++ app/src/main/res/values-nb-rNO/strings.xml | 2 ++ app/src/main/res/values-nl/strings.xml | 4 +++- app/src/main/res/values-pa-rPK/strings.xml | 2 ++ app/src/main/res/values-pl/strings.xml | 4 +++- app/src/main/res/values-pt-rBR/strings.xml | 2 ++ app/src/main/res/values-pt/strings.xml | 2 ++ app/src/main/res/values-ro/strings.xml | 2 ++ app/src/main/res/values-ru/strings.xml | 4 +++- app/src/main/res/values-sk/strings.xml | 2 ++ app/src/main/res/values-sl/strings.xml | 4 +++- app/src/main/res/values-sv/strings.xml | 4 +++- app/src/main/res/values-ta/strings.xml | 2 ++ app/src/main/res/values-th/strings.xml | 2 ++ app/src/main/res/values-tr/strings.xml | 4 +++- app/src/main/res/values-uk/strings.xml | 2 ++ app/src/main/res/values-zh-rCN/strings.xml | 4 +++- app/src/main/res/values-zh-rTW/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 46 files changed, 107 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 466f13ca..450d2e53 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -907,6 +907,7 @@ class ThreadActivity : SimpleActivity() { private fun addAttachment(uri: Uri) { if (getAttachments().any { it.uri.toString() == uri.toString() }) { + toast(R.string.duplicate_item_warning) return } diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index bbda648f..d5381541 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -20,6 +20,8 @@ ازالة التثبيت اعادة ارسال غير قادر على ضغط الصورة إلى الحجم المحدد + + Duplicate item was not included و %d أخرى @@ -99,4 +101,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index ce4cfab9..37b538a6 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -20,6 +20,8 @@ Unpin Forward Unable to compress image to selected size + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 3cb94d5c..ac14c023 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -20,6 +20,8 @@ Адмацаваць Пераслаць Немагчыма сціснуць выяву да выбранага памеру + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 8a4ba571..f340e9e5 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -20,6 +20,8 @@ Откачване Препращане Невъзможно е да се компресира изображението до избрания размер + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 5818bef5..afdaf1e3 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -20,6 +20,8 @@ No fixis Reenvia No s\'ha pogut comprimir la imatge a la mida seleccionada + + Duplicate item was not included i %d altra @@ -87,4 +89,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-cr/strings.xml b/app/src/main/res/values-cr/strings.xml index ce4cfab9..37b538a6 100644 --- a/app/src/main/res/values-cr/strings.xml +++ b/app/src/main/res/values-cr/strings.xml @@ -20,6 +20,8 @@ Unpin Forward Unable to compress image to selected size + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 826c1fc6..92755a86 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -20,6 +20,8 @@ Odepnout Přeposlat Nepodařilo se komprimovat obrázek na požadovanou velikost + + Duplicate item was not included a %d další diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index e7eee89a..6010253c 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -20,6 +20,8 @@ Frigør Fremad Billedet kan ikke komprimeres til den valgte størrelse + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2070b2f8..4c653eb6 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -20,6 +20,8 @@ Losheften Weiterleiten Bild kann nicht auf ausgewählte Größe komprimiert werden + + Duplicate item was not included und %d andere @@ -87,4 +89,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b736ea37..6ceb4e14 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -20,6 +20,8 @@ Ξεκαρφίτσωμα Προώθηση Αδυναμία συμπίεσης εικόνας στο επιλεγμένο μέγεθος + + Duplicate item was not included και άλλος %d diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 8efb4fed..75a0dda3 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -20,6 +20,8 @@ Depingli Forward Unable to compress image to selected size + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 14149d72..0affd8d7 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -20,6 +20,8 @@ Desanclar Reenviar Incapaz de comprimir la imagen al tamaño seleccionado + + Duplicate item was not included y %d otro @@ -90,4 +92,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 0d38e20e..06e036a9 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -20,6 +20,8 @@ Eemalda kinnitus Edasta Pildi muutmine valitud suurusesse ei õnnestu + + Duplicate item was not included ja %d muud @@ -87,4 +89,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 9002ea6c..6314c34f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -20,6 +20,8 @@ Poista Välitä Kuvan pakkaaminen valittuun kokoon ei onnistu + + Duplicate item was not included ja %d muu diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 0151d724..897ba5e1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -20,6 +20,8 @@ Désépingler Transférer Impossible de compresser l\'image à la taille sélectionnée + + Duplicate item was not included et %d autre @@ -90,4 +92,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 8d0b9a2d..7d412026 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -20,6 +20,8 @@ Desenganche Adiante Non se puido comprimir a imaxe ao tamaño seleccionado + + Duplicate item was not included E %d outro @@ -87,4 +89,4 @@ Non atopaches algunhas cadeas? Hai máis en https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index ce4cfab9..37b538a6 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -20,6 +20,8 @@ Unpin Forward Unable to compress image to selected size + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 14cd1f2c..23b49e2a 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -20,6 +20,8 @@ Otkvači Proslijedi Isključi za komprimiranje slike na odabranu veličinu + + Duplicate item was not included i još %d druga diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index c5cc383b..e8c09ebe 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -20,6 +20,8 @@ Kitűzés megszüntetése Továbbítás Nem lehet tömöríteni a képet a kiválasztott méretre + + Duplicate item was not included és még %d fő diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index e4307a8b..59ec5275 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -20,6 +20,8 @@ Unpin Forward Unable to compress image to selected size + + Duplicate item was not included and %d others diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 5d50ef49..cca883c9 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -20,6 +20,8 @@ Rimuovi Inoltra Impossibile comprimere l\'immagine alla dimensione selezionata + + Duplicate item was not included e %d altro @@ -90,4 +92,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index d1abdaa8..d876906c 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -20,6 +20,8 @@ בטל הצמדה התקדם לא ניתן לדחוס תמונה לגודל שנבחר + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 204b05cf..e1e66068 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -20,6 +20,8 @@ 固定を外す 転送 選択したサイズに画像を圧縮できません + + Duplicate item was not included and %d others @@ -84,4 +86,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 2f6a4218..9dfbf21d 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -20,6 +20,8 @@ Atjunkite Pirmyn Nepavyksta suspausti vaizdo iki pasirinkto dydžio + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index b49e6d50..5a3a4fe6 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -20,6 +20,8 @@ Unpin Forward Unable to compress image to selected size + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index ce4cfab9..37b538a6 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -20,6 +20,8 @@ Unpin Forward Unable to compress image to selected size + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 284ab728..7ba29d8c 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -20,6 +20,8 @@ Unpin Forward Unable to compress image to selected size + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 3a6750d7..7099dde8 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -20,6 +20,8 @@ Løsne Videresend Unable to compress image to selected size + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index fca96f51..b44c1b97 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -20,6 +20,8 @@ Losmaken Doorsturen Kon de afbeelding niet comprimeren naar de gekozen grootte + + Duplicate item was not included en %d andere @@ -87,4 +89,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index a2d002f7..7d1c6f9f 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -20,6 +20,8 @@ Unpin اگے تصویر نوں چݨے ہوۓ اکار وچ سنکُچت کر نہیں سکدی + + Duplicate item was not included تے %d ہور diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 0d013873..43d8cfab 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -20,6 +20,8 @@ Odepnij Przekaż dalej Nie udało się skompresować obrazu do wybranego rozmiaru + + Duplicate item was not included i %d inny @@ -93,4 +95,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index fce03488..c83ad4dc 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -20,6 +20,8 @@ Desfixar Encaminhar Não pôde comprimir imagem ao tamanho selecionado + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 66339642..ee3db70d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -20,6 +20,8 @@ Desafixar Reencaminhar Incapaz de comprimir imagem no tamanho selecionado + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 6fb541ce..1fad4076 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -20,6 +20,8 @@ Elimină fixarea Redirecţionare Nu se poate comprima imaginea la dimensiunea selectată + + Duplicate item was not included și %d alt diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3ad117cc..e6db74df 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -20,6 +20,8 @@ Открепить Переслать Невозможно сжать изображение до выбранного размера + + Duplicate item was not included и ещё %d @@ -93,4 +95,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 28cd4030..f58158ff 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -20,6 +20,8 @@ Odopnúť Preposlať Nepodarilo sa zmenšiť obrázok na požadovanú veľkosť + + Duplicate item was not included a %d ďalší diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 388241a0..5be4741b 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -20,6 +20,8 @@ Odpni Posreduj Slike ni mogoče stisniti na izbrano velikost + + Duplicate item was not included in %d drug @@ -93,4 +95,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index c9fe0303..781113ee 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -20,6 +20,8 @@ Lossa Vidarebefordra Det gick inte att komprimera bilden till den valda storleken + + Duplicate item was not included och %d annan @@ -87,4 +89,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 65cbce32..013a21dd 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -20,6 +20,8 @@ பின் நீக்கு முன்னோக்கி Unable to compress image to selected size + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index aca6f73e..769f87ad 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -20,6 +20,8 @@ Unpin Forward Unable to compress image to selected size + + Duplicate item was not included and %d others diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c03eb152..9d62ce58 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -20,6 +20,8 @@ Sabitlemeyi kaldır İlet Resim seçilen boyuta sıkıştırılamıyor + + Duplicate item was not included ve %d diğeri @@ -87,4 +89,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index ac09c46c..60671e1c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -20,6 +20,8 @@ Відкріпити Переслати Не вдається стиснути зображення до вибраного розміру + + Duplicate item was not included and %d other diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 1f50f0b6..9dcc8e6a 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -20,6 +20,8 @@ 取消固定 转发 无法将图像压缩到选定的大小 + + Duplicate item was not included 及 %d 个其他人 @@ -84,4 +86,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e553273c..dfc7c27a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -20,6 +20,8 @@ 取消釘選 轉傳 無法將圖片壓縮至指定大小 + + Duplicate item was not included and %d others diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d05f0dc0..710aaf73 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,6 +20,8 @@ Unpin Forward Unable to compress image to selected size + + Duplicate item was not included and %d other From 7c02e33bbdefc197a389aed3492d919bc59d11f4 Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 3 Nov 2022 00:32:34 +0530 Subject: [PATCH 06/61] Remove unused click listeners and callbacks --- .../smsmessenger/activities/ThreadActivity.kt | 1 - .../adapters/AttachmentsAdapter.kt | 26 ++----------------- 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 450d2e53..7b057aa8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -916,7 +916,6 @@ class ThreadActivity : SimpleActivity() { adapter = AttachmentsAdapter( activity = this, recyclerView = thread_attachments_recyclerview, - onItemClick = {}, onAttachmentsRemoved = { thread_attachments_recyclerview.beGone() checkSendMessageAvailability() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt index 135da40b..c8ffce4c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt @@ -32,7 +32,6 @@ import kotlinx.android.synthetic.main.item_remove_attachment_button.view.* class AttachmentsAdapter( val activity: BaseSimpleActivity, val recyclerView: RecyclerView, - val onItemClick: (AttachmentSelection) -> Unit, val onAttachmentsRemoved: () -> Unit, val onReady: (() -> Unit) ) : ListAdapter(AttachmentDiffCallback()) { @@ -85,7 +84,7 @@ class AttachmentsAdapter( override fun onBindViewHolder(holder: ViewHolder, position: Int) { val attachment = getItem(position) - holder.bindView(attachment, allowSingleClick = true, allowLongClick = false) { view, position -> + holder.bindView() { view, _ -> when (attachment.viewType) { ATTACHMENT_DOCUMENT -> { view.setupDocumentPreview( @@ -189,32 +188,11 @@ class AttachmentsAdapter( } open inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - fun bindView( - any: AttachmentSelection, - allowSingleClick: Boolean, - allowLongClick: Boolean, - callback: (itemView: View, adapterPosition: Int) -> Unit - ): View { + fun bindView(callback: (itemView: View, adapterPosition: Int) -> Unit): View { return itemView.apply { callback(this, adapterPosition) - - if (allowSingleClick) { - setOnClickListener { viewClicked(any) } - setOnLongClickListener { if (allowLongClick) viewLongClicked() else viewClicked(any); true } - } else { - setOnClickListener(null) - setOnLongClickListener(null) - } } } - - private fun viewClicked(any: AttachmentSelection) { - onItemClick.invoke(any) - } - - private fun viewLongClicked() { - - } } } From 9fb37320d4750e46d3065cbdcf3f10a680de423f Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 3 Nov 2022 03:34:33 +0530 Subject: [PATCH 07/61] Update simple-commons --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f208ea6e..bdff89bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ android { } dependencies { - implementation 'com.github.SimpleMobileTools:Simple-Commons:0828fecd09' + implementation 'com.github.SimpleMobileTools:Simple-Commons:63ee2676f5' implementation 'org.greenrobot:eventbus:3.3.1' implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61' implementation 'com.github.tibbi:android-smsmms:875a46a9c4' From c1ccfd343b7614ef5f4eb9551c42c2f4c34055d8 Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 3 Nov 2022 22:41:41 +0530 Subject: [PATCH 08/61] Fix threading issue with scheduled message --- .../smsmessenger/activities/ThreadActivity.kt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 7b057aa8..5184eca6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -1013,13 +1013,16 @@ class ThreadActivity : SimpleActivity() { conversationsDB.insertOrUpdate(conversation.copy(date = nowSeconds)) } scheduleMessage(message) - } - clearCurrentMessage() - hideScheduleSendUi() - scheduledMessage = null - if (!refreshedSinceSent) { - refreshMessages() + runOnUiThread { + clearCurrentMessage() + hideScheduleSendUi() + scheduledMessage = null + + if (!refreshedSinceSent) { + refreshMessages() + } + } } } catch (e: Exception) { showErrorToast(e.localizedMessage ?: getString(R.string.unknown_error_occurred)) From db51241b81ed390a75b3944f9c9d54b389beac0b Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 3 Nov 2022 23:39:58 +0530 Subject: [PATCH 09/61] Do ui setup on ui thread (crashfix) --- .../smsmessenger/activities/ThreadActivity.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 5184eca6..59146eb1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -392,11 +392,13 @@ class ThreadActivity : SimpleActivity() { } } - confirm_inserted_number?.setOnClickListener { - val number = add_contact_or_number.value - val phoneNumber = PhoneNumber(number, 0, "", number) - val contact = SimpleContact(number.hashCode(), number.hashCode(), number, "", arrayListOf(phoneNumber), ArrayList(), ArrayList()) - addSelectedContact(contact) + runOnUiThread { + confirm_inserted_number?.setOnClickListener { + val number = add_contact_or_number.value + val phoneNumber = PhoneNumber(number, 0, "", number) + val contact = SimpleContact(number.hashCode(), number.hashCode(), number, "", arrayListOf(phoneNumber), ArrayList(), ArrayList()) + addSelectedContact(contact) + } } } From 09956f809d28f783338c11096d02eae6ca81c185 Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 3 Nov 2022 23:40:47 +0530 Subject: [PATCH 10/61] Properly parse attachment file names --- .../smsmessenger/extensions/Context.kt | 15 ++-- .../smsmessenger/helpers/AttachmentUtils.kt | 72 +++++++++++++++++++ 2 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentUtils.kt 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 17cc4b90..4de5434b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -35,6 +35,7 @@ import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.ThreadActivity import com.simplemobiletools.smsmessenger.databases.MessagesDatabase import com.simplemobiletools.smsmessenger.helpers.* +import com.simplemobiletools.smsmessenger.helpers.AttachmentUtils.parseAttachmentNames import com.simplemobiletools.smsmessenger.interfaces.AttachmentsDao import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao import com.simplemobiletools.smsmessenger.interfaces.MessageAttachmentsDao @@ -307,7 +308,8 @@ fun Context.getMmsAttachment(id: Long, getImageResolutions: Boolean): MessageAtt val selectionArgs = arrayOf(id.toString()) val messageAttachment = MessageAttachment(id, "", arrayListOf()) - var attachmentName = "" + var attachmentNames: List? = null + var attachmentCount = 0 queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> val partId = cursor.getLongValue(Mms._ID) val mimetype = cursor.getStringValue(Mms.Part.CONTENT_TYPE) @@ -332,15 +334,14 @@ fun Context.getMmsAttachment(id: Long, getImageResolutions: Boolean): MessageAtt val attachment = Attachment(partId, id, fileUri.toString(), mimetype, width, height, "") messageAttachment.attachments.add(attachment) } else if (mimetype != "application/smil") { - val attachment = Attachment(partId, id, Uri.withAppendedPath(uri, partId.toString()).toString(), mimetype, 0, 0, attachmentName) + val attachment = Attachment( + partId, id, Uri.withAppendedPath(uri, partId.toString()).toString(), mimetype, 0, 0, attachmentNames?.getOrNull(attachmentCount) ?: "" + ) messageAttachment.attachments.add(attachment) + attachmentCount++ } else { - // todo: fix filename parsing, xml is shown some sometimes val text = cursor.getStringValue(Mms.Part.TEXT) - val cutName = text.substringAfter("ref src=\"").substringBefore("\"") - if (cutName.isNotEmpty()) { - attachmentName = cutName - } + attachmentNames = parseAttachmentNames(text) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentUtils.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentUtils.kt new file mode 100644 index 00000000..2fd6239f --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentUtils.kt @@ -0,0 +1,72 @@ +package com.simplemobiletools.smsmessenger.helpers + +import android.util.Xml +import org.xmlpull.v1.XmlPullParser + +object AttachmentUtils { + + fun parseAttachmentNames(text: String): List { + val parser = Xml.newPullParser() + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false) + parser.setInput(text.reader()) + parser.nextTag() + + return readSmil(parser) + } + + private fun readSmil(parser: XmlPullParser): List { + parser.require(XmlPullParser.START_TAG, null, "smil") + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.eventType != XmlPullParser.START_TAG) { + continue + } + if (parser.name == "body") { + return readBody(parser) + } else { + skip(parser) + } + } + + return emptyList() + } + + private fun readBody(parser: XmlPullParser): List { + val names = mutableListOf() + parser.require(XmlPullParser.START_TAG, null, "body") + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.eventType != XmlPullParser.START_TAG) { + continue + } + if (parser.name == "par") { + parser.require(XmlPullParser.START_TAG, null, "par") + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.eventType != XmlPullParser.START_TAG) { + continue + } + if (parser.name == "ref") { + val value = parser.getAttributeValue(null, "src") + names.add(value) + parser.nextTag() + } + } + } else { + skip(parser) + } + } + return names + } + + private fun skip(parser: XmlPullParser) { + if (parser.eventType != XmlPullParser.START_TAG) { + throw IllegalStateException() + } + var depth = 1 + while (depth != 0) { + when (parser.next()) { + XmlPullParser.END_TAG -> depth-- + XmlPullParser.START_TAG -> depth++ + } + } + } + +} From b6012f6e2b966ae3f873ea84b2be1201f1cf6527 Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 3 Nov 2022 23:49:55 +0530 Subject: [PATCH 11/61] Workaround some potential exceptions --- .../helpers/AttachmentPreviews.kt | 28 +++++++++++++------ .../smsmessenger/helpers/VCardParser.kt | 7 ++++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt index 03efe2f0..222ad3cf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt @@ -24,9 +24,13 @@ fun View.setupDocumentPreview( filename.text = title } - val size = context.getFileSizeFromUri(uri) - file_size.beVisible() - file_size.text = size.formatSize() + try { + val size = context.getFileSizeFromUri(uri) + file_size.beVisible() + file_size.text = size.formatSize() + } catch (e: Exception) { + file_size.beGone() + } val textColor = context.getProperTextColor() val primaryColor = context.getProperPrimaryColor() @@ -82,13 +86,19 @@ fun View.setupVCardPreview( } parseVCardFromUri(activity, uri) { vCards -> - val title = vCards.firstOrNull()?.parseNameFromVCard() - val imageIcon = if (title != null) { - SimpleContactsHelper(activity).getContactLetterIcon(title) - } else { - null - } activity.runOnUiThread { + if (vCards.isEmpty()) { + vcard_title.beVisible() + vcard_title.text = context.getString(R.string.unknown_error_occurred) + return@runOnUiThread + } + val title = vCards.firstOrNull()?.parseNameFromVCard() + val imageIcon = if (title != null) { + SimpleContactsHelper(activity).getContactLetterIcon(title) + } else { + null + } + arrayOf(vcard_photo, vcard_title).forEach { it.beVisible() } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardParser.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardParser.kt index 3456c080..d93c36ac 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardParser.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardParser.kt @@ -8,7 +8,12 @@ import ezvcard.VCard fun parseVCardFromUri(context: Context, uri: Uri, callback: (vCards: List) -> Unit) { ensureBackgroundThread { - val inputStream = context.contentResolver.openInputStream(uri) + val inputStream = try { + context.contentResolver.openInputStream(uri) + } catch (e: Exception) { + callback(emptyList()) + return@ensureBackgroundThread + } val vCards = Ezvcard.parse(inputStream).all() callback(vCards) } From 0e3f65168762f62df268306fd4198959843933df Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 4 Nov 2022 03:27:07 +0530 Subject: [PATCH 12/61] Add a little space between attachments --- .../main/res/drawable/linear_layout_vertical_divider.xml | 6 ++++++ app/src/main/res/layout/item_received_message.xml | 4 +++- app/src/main/res/layout/item_sent_message.xml | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable/linear_layout_vertical_divider.xml diff --git a/app/src/main/res/drawable/linear_layout_vertical_divider.xml b/app/src/main/res/drawable/linear_layout_vertical_divider.xml new file mode 100644 index 00000000..ceb1be00 --- /dev/null +++ b/app/src/main/res/drawable/linear_layout_vertical_divider.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/layout/item_received_message.xml b/app/src/main/res/layout/item_received_message.xml index c36e4b8c..409f6c18 100644 --- a/app/src/main/res/layout/item_received_message.xml +++ b/app/src/main/res/layout/item_received_message.xml @@ -34,7 +34,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toEndOf="@+id/thread_message_sender_photo" - android:orientation="vertical" /> + android:divider="@drawable/linear_layout_vertical_divider" + android:orientation="vertical" + android:showDividers="middle" /> + android:divider="@drawable/linear_layout_vertical_divider" + android:orientation="vertical" + android:showDividers="middle" /> Date: Sat, 5 Nov 2022 00:20:04 +0530 Subject: [PATCH 13/61] Show icon for common mime types --- .../smsmessenger/adapters/AttachmentsAdapter.kt | 1 + .../smsmessenger/adapters/ThreadAdapter.kt | 1 + .../smsmessenger/extensions/String.kt | 16 ++++++++++++++++ .../smsmessenger/helpers/AttachmentPreviews.kt | 14 ++++++++++++-- .../main/res/drawable/ic_vector_audio_file.xml | 5 +++++ .../main/res/drawable/ic_vector_folder_zip.xml | 5 +++++ app/src/main/res/drawable/ic_vector_pdf.xml | 9 +++++++++ 7 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable/ic_vector_audio_file.xml create mode 100644 app/src/main/res/drawable/ic_vector_folder_zip.xml create mode 100644 app/src/main/res/drawable/ic_vector_pdf.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt index c8ffce4c..c96fccdd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt @@ -90,6 +90,7 @@ class AttachmentsAdapter( view.setupDocumentPreview( uri = attachment.uri, title = attachment.filename, + mimeType = attachment.mimetype, attachment = true, onClick = { activity.launchViewIntent(attachment.uri, attachment.mimetype, attachment.filename) }, onRemoveButtonClicked = { removeAttachment(attachment) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt index bb6abdf5..f56fa634 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -427,6 +427,7 @@ class ThreadAdapter( setupDocumentPreview( uri = uri, title = attachment.filename, + mimeType = attachment.mimetype, onClick = { if (actModeCallback.isSelectable) { holder.viewClicked(message) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt index ac2b8948..8ba65db8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt @@ -23,3 +23,19 @@ fun String.isVCardMimeType(): Boolean { val lowercase = lowercase() return lowercase.endsWith("x-vcard") || lowercase.endsWith("vcard") } + +fun String.isAudioMimeType(): Boolean { + return lowercase().startsWith("audio") +} + +fun String.isCalendarMimeType(): Boolean { + return lowercase().endsWith("calendar") +} + +fun String.isPdfMimeType(): Boolean { + return lowercase().endsWith("pdf") +} + +fun String.isZipMimeType(): Boolean { + return lowercase().endsWith("zip") +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt index 222ad3cf..82d7eeb8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentPreviews.kt @@ -6,7 +6,7 @@ import android.view.View import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.smsmessenger.R -import com.simplemobiletools.smsmessenger.extensions.getFileSizeFromUri +import com.simplemobiletools.smsmessenger.extensions.* import kotlinx.android.synthetic.main.item_attachment_document.view.* import kotlinx.android.synthetic.main.item_attachment_vcard.view.* import kotlinx.android.synthetic.main.item_attachment_vcard_preview.view.* @@ -15,6 +15,7 @@ import kotlinx.android.synthetic.main.item_remove_attachment_button.view.* fun View.setupDocumentPreview( uri: Uri, title: String, + mimeType: String, attachment: Boolean = false, onClick: (() -> Unit)? = null, onLongClick: (() -> Unit)? = null, @@ -38,7 +39,8 @@ fun View.setupDocumentPreview( document_attachment_holder.background.applyColorFilter(textColor) filename.setTextColor(textColor) file_size.setTextColor(textColor) - // todo: set icon drawable based on mime type + + icon.setImageResource(getIconResourceForMimeType(mimeType)) icon.background.setTint(primaryColor) document_attachment_holder.background.applyColorFilter(primaryColor.darkenColor()) @@ -140,3 +142,11 @@ fun View.setupVCardPreview( } } } + +private fun getIconResourceForMimeType(mimeType: String) = when { + mimeType.isAudioMimeType() -> R.drawable.ic_vector_audio_file + mimeType.isCalendarMimeType() -> R.drawable.ic_calendar_month_vector + mimeType.isPdfMimeType() -> R.drawable.ic_vector_pdf + mimeType.isZipMimeType() -> R.drawable.ic_vector_folder_zip + else -> R.drawable.ic_document_vector +} diff --git a/app/src/main/res/drawable/ic_vector_audio_file.xml b/app/src/main/res/drawable/ic_vector_audio_file.xml new file mode 100644 index 00000000..ef4035d4 --- /dev/null +++ b/app/src/main/res/drawable/ic_vector_audio_file.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_vector_folder_zip.xml b/app/src/main/res/drawable/ic_vector_folder_zip.xml new file mode 100644 index 00000000..6e94c4b9 --- /dev/null +++ b/app/src/main/res/drawable/ic_vector_folder_zip.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_vector_pdf.xml b/app/src/main/res/drawable/ic_vector_pdf.xml new file mode 100644 index 00000000..84899cf5 --- /dev/null +++ b/app/src/main/res/drawable/ic_vector_pdf.xml @@ -0,0 +1,9 @@ + + + From cd2c94ccee37e38b5c3b683769f3402f2bc30890 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sat, 5 Nov 2022 00:21:59 +0530 Subject: [PATCH 14/61] Workaround attachment filename issue --- app/build.gradle | 2 +- .../smsmessenger/activities/ThreadActivity.kt | 26 ++++++++----------- .../smsmessenger/helpers/Messaging.kt | 16 +++++++----- .../receivers/ScheduledMessageReceiver.kt | 2 +- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bdff89bf..7b4053ea 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,7 +66,7 @@ dependencies { implementation 'com.github.SimpleMobileTools:Simple-Commons:63ee2676f5' implementation 'org.greenrobot:eventbus:3.3.1' implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61' - implementation 'com.github.tibbi:android-smsmms:875a46a9c4' + implementation 'com.github.tibbi:android-smsmms:3581774c39' implementation "me.leolin:ShortcutBadger:1.1.22" implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'com.googlecode.ez-vcard:ez-vcard:0.11.3' diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 59146eb1..62a2306c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -156,7 +156,7 @@ class ThreadActivity : SimpleActivity() { override fun onPause() { super.onPause() - if (thread_type_message.value != "" && getAttachments().isEmpty()) { + if (thread_type_message.value != "" && getAttachmentSelections().isEmpty()) { saveSmsDraft(thread_type_message.value, threadId) } else { deleteSmsDraft(threadId) @@ -905,10 +905,10 @@ class ThreadActivity : SimpleActivity() { return adapter as? AttachmentsAdapter } - private fun getAttachments() = getAttachmentsAdapter()?.attachments ?: emptyList() + private fun getAttachmentSelections() = getAttachmentsAdapter()?.attachments ?: emptyList() private fun addAttachment(uri: Uri) { - if (getAttachments().any { it.uri.toString() == uri.toString() }) { + if (getAttachmentSelections().any { it.uri.toString() == uri.toString() }) { toast(R.string.duplicate_item_warning) return } @@ -961,7 +961,7 @@ class ThreadActivity : SimpleActivity() { } private fun checkSendMessageAvailability() { - if (thread_type_message.text!!.isNotEmpty() || (getAttachments().isNotEmpty() && !getAttachments().any { it.isPending })) { + if (thread_type_message.text!!.isNotEmpty() || (getAttachmentSelections().isNotEmpty() && !getAttachmentSelections().any { it.isPending })) { thread_send_message.isEnabled = true thread_send_message.isClickable = true thread_send_message.alpha = 0.9f @@ -975,7 +975,7 @@ class ThreadActivity : SimpleActivity() { private fun sendMessage() { var text = thread_type_message.value - if (text.isEmpty() && getAttachments().isEmpty()) { + if (text.isEmpty() && getAttachmentSelections().isEmpty()) { showErrorToast(getString(R.string.unknown_error_occurred)) return } @@ -1033,7 +1033,7 @@ class ThreadActivity : SimpleActivity() { private fun sendNormalMessage(text: String, subscriptionId: Int) { val addresses = participants.getAddresses() - val attachments = getAttachments().map { it.uri } + val attachments = buildMessageAttachments() try { refreshedSinceSent = false @@ -1227,7 +1227,7 @@ class ThreadActivity : SimpleActivity() { private fun isMmsMessage(text: String): Boolean { val isGroupMms = participants.size > 1 && config.sendGroupMessageMMS val isLongMmsMessage = isLongMmsMessage(text) && config.sendLongMessageMMS - return getAttachments().isNotEmpty() || isGroupMms || isLongMmsMessage + return getAttachmentSelections().isNotEmpty() || isGroupMms || isLongMmsMessage } private fun updateMessageType() { @@ -1363,7 +1363,7 @@ class ThreadActivity : SimpleActivity() { read = false, threadId = threadId, isMMS = isMmsMessage(text), - attachment = buildMessageAttachment(text, messageId), + attachment = MessageAttachment(messageId, text, buildMessageAttachments(messageId)), senderName = "", senderPhotoUri = "", subscriptionId = subscriptionId, @@ -1371,13 +1371,9 @@ class ThreadActivity : SimpleActivity() { ) } - private fun buildMessageAttachment(text: String, messageId: Long): MessageAttachment { - val attachments = getAttachments() - .map { Attachment(null, messageId, it.uri.toString(), contentResolver.getType(it.uri) ?: "*/*", 0, 0, "") } - .toArrayList() - - return MessageAttachment(messageId, text, attachments) - } + private fun buildMessageAttachments(messageId: Long = -1L) = getAttachmentSelections() + .map { Attachment(null, messageId, it.uri.toString(), it.mimetype, 0, 0, it.filename) } + .toArrayList() private fun setupAttachmentPickerView() { val colors = arrayOf( diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Messaging.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Messaging.kt index fb048c6c..8e68d533 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Messaging.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Messaging.kt @@ -4,7 +4,6 @@ import android.app.AlarmManager import android.app.PendingIntent import android.content.Context import android.content.Intent -import android.net.Uri import android.os.Handler import android.os.Looper import androidx.core.app.AlarmManagerCompat @@ -15,6 +14,7 @@ import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.helpers.isMarshmallowPlus import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.extensions.config +import com.simplemobiletools.smsmessenger.models.Attachment import com.simplemobiletools.smsmessenger.models.Message import com.simplemobiletools.smsmessenger.receivers.ScheduledMessageReceiver import com.simplemobiletools.smsmessenger.receivers.SmsStatusDeliveredReceiver @@ -34,7 +34,7 @@ fun Context.getSendMessageSettings(): Settings { return settings } -fun Context.sendMessage(text: String, addresses: List, subscriptionId: Int?, attachments: List) { +fun Context.sendMessage(text: String, addresses: List, subscriptionId: Int?, attachments: List) { val settings = getSendMessageSettings() if (subscriptionId != null) { settings.subscriptionId = subscriptionId @@ -44,11 +44,15 @@ fun Context.sendMessage(text: String, addresses: List, subscriptionId: I val message = com.klinker.android.send_message.Message(text, addresses.toTypedArray()) if (attachments.isNotEmpty()) { - for (uri in attachments) { + for (attachment in attachments) { try { - val byteArray = contentResolver.openInputStream(uri)?.readBytes() ?: continue - val mimeType = contentResolver.getType(uri) ?: continue - message.addMedia(byteArray, mimeType) + val uri = attachment.getUri() + contentResolver.openInputStream(uri)?.use { + val bytes = it.readBytes() + val mimeType = contentResolver.getType(uri) ?: return@use + val name = attachment.filename + message.addMedia(bytes, mimeType, name, name) + } } catch (e: Exception) { showErrorToast(e) } catch (e: Error) { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/ScheduledMessageReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/ScheduledMessageReceiver.kt index bc89a283..53c9e020 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/ScheduledMessageReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/ScheduledMessageReceiver.kt @@ -40,7 +40,7 @@ class ScheduledMessageReceiver : BroadcastReceiver() { } val addresses = message.participants.getAddresses() - val attachments = message.attachment?.attachments?.mapNotNull { it.getUri() } ?: emptyList() + val attachments = message.attachment?.attachments ?: emptyList() try { context.sendMessage(message.body, addresses, message.subscriptionId, attachments) From 1c48352432db644261abcfbbc7a86ae5dcadfb89 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sat, 5 Nov 2022 00:54:17 +0530 Subject: [PATCH 15/61] Fix issue previewing GIF files --- .../smsmessenger/activities/ThreadActivity.kt | 2 +- .../smsmessenger/adapters/AttachmentsAdapter.kt | 8 +++----- .../simplemobiletools/smsmessenger/extensions/String.kt | 4 ++++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 62a2306c..67d05da0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -933,7 +933,7 @@ class ThreadActivity : SimpleActivity() { uri = uri, mimetype = mimeType, filename = getFilenameFromUri(uri), - isPending = mimeType.isImageMimeType() + isPending = mimeType.isImageMimeType() && !mimeType.isGifMimeType() ) adapter.addAttachment(attachment) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt index c96fccdd..a0075441 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt @@ -20,10 +20,7 @@ import com.bumptech.glide.request.target.Target import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.smsmessenger.activities.VCardViewerActivity -import com.simplemobiletools.smsmessenger.extensions.config -import com.simplemobiletools.smsmessenger.extensions.isImageMimeType -import com.simplemobiletools.smsmessenger.extensions.isVideoMimeType -import com.simplemobiletools.smsmessenger.extensions.launchViewIntent +import com.simplemobiletools.smsmessenger.extensions.* import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.models.AttachmentSelection import kotlinx.android.synthetic.main.item_attachment_media_preview.view.* @@ -129,7 +126,8 @@ class AttachmentsAdapter( } } - if (attachment.mimetype.isImageMimeType() && attachment.isPending && config.mmsFileSizeLimit != FILE_SIZE_NONE) { + val compressImage = attachment.mimetype.isImageMimeType() && !attachment.mimetype.isGifMimeType() + if (compressImage && attachment.isPending && config.mmsFileSizeLimit != FILE_SIZE_NONE) { thumbnail.beGone() compression_progress.beVisible() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt index 8ba65db8..953564ba 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt @@ -15,6 +15,10 @@ fun String.isImageMimeType(): Boolean { return lowercase().startsWith("image") } +fun String.isGifMimeType(): Boolean { + return lowercase().endsWith("gif") +} + fun String.isVideoMimeType(): Boolean { return lowercase().startsWith("video") } From 48d22d8aa5339a4a89b64ab59d3cf72ed79f703e Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Sun, 6 Nov 2022 09:51:40 +0100 Subject: [PATCH 16/61] moving overring functions at the top --- .../adapters/AttachmentsAdapter.kt | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt index a0075441..adad4bb1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AttachmentsAdapter.kt @@ -19,6 +19,7 @@ import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.Target import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.VCardViewerActivity import com.simplemobiletools.smsmessenger.extensions.* import com.simplemobiletools.smsmessenger.helpers.* @@ -40,38 +41,15 @@ class AttachmentsAdapter( val attachments = mutableListOf() - fun clear() { - attachments.clear() - submitList(emptyList()) - recyclerView.onGlobalLayout { - onAttachmentsRemoved() - } - } - - fun addAttachment(attachment: AttachmentSelection) { - attachments.removeAll { AttachmentSelection.areItemsTheSame(it, attachment) } - attachments.add(attachment) - submitList(attachments.toList()) - } - - private fun removeAttachment(attachment: AttachmentSelection) { - attachments.removeAll { AttachmentSelection.areItemsTheSame(it, attachment) } - if (attachments.isEmpty()) { - clear() - } else { - submitList(attachments.toList()) - } - } - override fun getItemViewType(position: Int): Int { return getItem(position).viewType } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val layoutRes = when (viewType) { - ATTACHMENT_DOCUMENT -> com.simplemobiletools.smsmessenger.R.layout.item_attachment_document_preview - ATTACHMENT_VCARD -> com.simplemobiletools.smsmessenger.R.layout.item_attachment_vcard_preview - ATTACHMENT_MEDIA -> com.simplemobiletools.smsmessenger.R.layout.item_attachment_media_preview + ATTACHMENT_DOCUMENT -> R.layout.item_attachment_document_preview + ATTACHMENT_VCARD -> R.layout.item_attachment_vcard_preview + ATTACHMENT_MEDIA -> R.layout.item_attachment_media_preview else -> throw IllegalArgumentException("Unknown view type: $viewType") } @@ -112,6 +90,29 @@ class AttachmentsAdapter( } } + fun clear() { + attachments.clear() + submitList(emptyList()) + recyclerView.onGlobalLayout { + onAttachmentsRemoved() + } + } + + fun addAttachment(attachment: AttachmentSelection) { + attachments.removeAll { AttachmentSelection.areItemsTheSame(it, attachment) } + attachments.add(attachment) + submitList(attachments.toList()) + } + + private fun removeAttachment(attachment: AttachmentSelection) { + attachments.removeAll { AttachmentSelection.areItemsTheSame(it, attachment) } + if (attachments.isEmpty()) { + clear() + } else { + submitList(attachments.toList()) + } + } + private fun setupMediaPreview(view: View, attachment: AttachmentSelection) { view.apply { media_attachment_holder.background.applyColorFilter(primaryColor.darkenColor()) @@ -139,7 +140,7 @@ class AttachmentsAdapter( loadMediaPreview(view, attachment) } null -> { - activity.toast(com.simplemobiletools.smsmessenger.R.string.compress_error) + activity.toast(R.string.compress_error) removeAttachment(attachment) } else -> { @@ -157,8 +158,8 @@ class AttachmentsAdapter( } private fun loadMediaPreview(view: View, attachment: AttachmentSelection) { - val roundedCornersRadius = resources.getDimension(com.simplemobiletools.smsmessenger.R.dimen.activity_margin).toInt() - val size = resources.getDimension(com.simplemobiletools.smsmessenger.R.dimen.attachment_preview_size).toInt() + val roundedCornersRadius = resources.getDimension(R.dimen.activity_margin).toInt() + val size = resources.getDimension(R.dimen.attachment_preview_size).toInt() val options = RequestOptions() .diskCacheStrategy(DiskCacheStrategy.NONE) @@ -172,7 +173,7 @@ class AttachmentsAdapter( .listener(object : RequestListener { override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean { removeAttachment(attachment) - activity.toast(com.simplemobiletools.smsmessenger.R.string.unknown_error_occurred) + activity.toast(R.string.unknown_error_occurred) return false } @@ -203,5 +204,4 @@ private class AttachmentDiffCallback : DiffUtil.ItemCallback Date: Sun, 6 Nov 2022 10:00:09 +0100 Subject: [PATCH 17/61] minor code style updates --- .../smsmessenger/activities/ThreadActivity.kt | 45 ++++++------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 67d05da0..182bf643 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -163,7 +163,6 @@ class ThreadActivity : SimpleActivity() { } bus?.post(Events.RefreshMessages()) - isActivityVisible = false } @@ -220,27 +219,13 @@ class ThreadActivity : SimpleActivity() { if (resultCode != Activity.RESULT_OK) return val data = resultData?.data - when (requestCode) { - CAPTURE_PHOTO_INTENT -> if (capturedImageUri != null) { - addAttachment(capturedImageUri!!) - } - CAPTURE_VIDEO_INTENT -> if (data != null) { - addAttachment(data) - } - PICK_DOCUMENT_INTENT -> if (data != null) { - addAttachment(data) - } - CAPTURE_AUDIO_INTENT -> if (data != null) { - addAttachment(data) - } - PICK_PHOTO_VIDEO_INTENT -> if (data != null) { - addAttachment(data) - } - PICK_CONTACT_INTENT -> if (data != null) { - addContactAttachment(data) - } - PICK_SAVE_FILE_INTENT -> if (data != null) { - saveAttachment(resultData) + if (requestCode == CAPTURE_PHOTO_INTENT && capturedImageUri != null) { + addAttachment(capturedImageUri!!) + } else if (data != null) { + when (requestCode) { + CAPTURE_VIDEO_INTENT, PICK_DOCUMENT_INTENT, CAPTURE_AUDIO_INTENT, PICK_PHOTO_VIDEO_INTENT -> addAttachment(data) + PICK_CONTACT_INTENT -> addContactAttachment(data) + PICK_SAVE_FILE_INTENT -> saveAttachment(resultData) } } } @@ -450,6 +435,7 @@ class ThreadActivity : SimpleActivity() { setTextColor(textColor) compoundDrawables.forEach { it?.applyColorFilter(textColor) } } + confirm_manage_contacts.applyColorFilter(textColor) thread_add_attachment.applyColorFilter(textColor) @@ -463,6 +449,7 @@ class ThreadActivity : SimpleActivity() { thread_send_message.setOnClickListener { sendMessage() } + thread_send_message.setOnLongClickListener { if (!isScheduledMessage) { launchScheduleSendDialog() @@ -849,7 +836,6 @@ class ThreadActivity : SimpleActivity() { addCategory(Intent.CATEGORY_OPENABLE) type = "*/*" putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) - launchActivityForResult(this, PICK_PHOTO_VIDEO_INTENT) } } @@ -860,16 +846,15 @@ class ThreadActivity : SimpleActivity() { addCategory(Intent.CATEGORY_OPENABLE) type = "*/*" putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) - launchActivityForResult(this, PICK_DOCUMENT_INTENT) } } private fun launchPickContactIntent() { - val intent = Intent(Intent.ACTION_PICK).apply { + Intent(Intent.ACTION_PICK).apply { type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE + launchActivityForResult(this, PICK_CONTACT_INTENT) } - launchActivityForResult(intent, PICK_CONTACT_INTENT) } private fun addContactAttachment(contactUri: Uri) { @@ -936,7 +921,6 @@ class ThreadActivity : SimpleActivity() { isPending = mimeType.isImageMimeType() && !mimeType.isGifMimeType() ) adapter.addAttachment(attachment) - checkSendMessageAvailability() } @@ -1178,7 +1162,6 @@ class ThreadActivity : SimpleActivity() { type = mimeType addCategory(Intent.CATEGORY_OPENABLE) putExtra(Intent.EXTRA_TITLE, path.split("/").last()) - launchActivityForResult(this, PICK_SAVE_FILE_INTENT, error = R.string.system_service_disabled) } } @@ -1449,10 +1432,8 @@ class ThreadActivity : SimpleActivity() { if (insets.isVisible(typeMask)) { config.keyboardHeight = insets.getInsets(typeMask).bottom hideAttachmentPicker() - } else { - if (isAttachmentPickerVisible) { - showAttachmentPicker() - } + } else if (isAttachmentPickerVisible) { + showAttachmentPicker() } insets From 6bf9d6399e3121419741525030de60c8b504a1cd Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Sun, 6 Nov 2022 10:32:52 +0100 Subject: [PATCH 18/61] fixing some spacing --- .../smsmessenger/helpers/AttachmentUtils.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentUtils.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentUtils.kt index 2fd6239f..1b062c86 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentUtils.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/AttachmentUtils.kt @@ -10,7 +10,6 @@ object AttachmentUtils { parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false) parser.setInput(text.reader()) parser.nextTag() - return readSmil(parser) } @@ -20,6 +19,7 @@ object AttachmentUtils { if (parser.eventType != XmlPullParser.START_TAG) { continue } + if (parser.name == "body") { return readBody(parser) } else { @@ -37,12 +37,14 @@ object AttachmentUtils { if (parser.eventType != XmlPullParser.START_TAG) { continue } + if (parser.name == "par") { parser.require(XmlPullParser.START_TAG, null, "par") while (parser.next() != XmlPullParser.END_TAG) { if (parser.eventType != XmlPullParser.START_TAG) { continue } + if (parser.name == "ref") { val value = parser.getAttributeValue(null, "src") names.add(value) @@ -60,6 +62,7 @@ object AttachmentUtils { if (parser.eventType != XmlPullParser.START_TAG) { throw IllegalStateException() } + var depth = 1 while (depth != 0) { when (parser.next()) { @@ -68,5 +71,4 @@ object AttachmentUtils { } } } - } From 83677681e97158d7929abab3d0c9e4cf3f7b9607 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Sun, 6 Nov 2022 10:41:58 +0100 Subject: [PATCH 19/61] minor formatting --- .../com/simplemobiletools/smsmessenger/extensions/Context.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 4de5434b..77b47faf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -334,9 +334,8 @@ fun Context.getMmsAttachment(id: Long, getImageResolutions: Boolean): MessageAtt val attachment = Attachment(partId, id, fileUri.toString(), mimetype, width, height, "") messageAttachment.attachments.add(attachment) } else if (mimetype != "application/smil") { - val attachment = Attachment( - partId, id, Uri.withAppendedPath(uri, partId.toString()).toString(), mimetype, 0, 0, attachmentNames?.getOrNull(attachmentCount) ?: "" - ) + val attachmentName = attachmentNames?.getOrNull(attachmentCount) ?: "" + val attachment = Attachment(partId, id, Uri.withAppendedPath(uri, partId.toString()).toString(), mimetype, 0, 0, attachmentName) messageAttachment.attachments.add(attachment) attachmentCount++ } else { From 3a1b749a58dbfbaec5592818e1ad82aef22390b9 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Sun, 6 Nov 2022 10:44:49 +0100 Subject: [PATCH 20/61] fixing a param name --- .../kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 bec52c26..fa076222 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt @@ -89,5 +89,5 @@ class Config(context: Context) : BaseConfig(context) { var keyboardHeight: Int get() = prefs.getInt(SOFT_KEYBOARD_HEIGHT, 600) - set(value) = prefs.edit().putInt(SOFT_KEYBOARD_HEIGHT, value).apply() + set(keyboardHeight) = prefs.edit().putInt(SOFT_KEYBOARD_HEIGHT, keyboardHeight).apply() } From e4da7d63f4438cdada84846325df794f18f6b902 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 6 Nov 2022 16:06:52 +0530 Subject: [PATCH 21/61] Remove android:tint from vector drawables --- app/src/main/res/drawable/ic_document_vector.xml | 2 +- app/src/main/res/drawable/ic_image_vector.xml | 1 - app/src/main/res/drawable/ic_music_vector.xml | 1 - app/src/main/res/drawable/ic_vector_audio_file.xml | 2 +- app/src/main/res/drawable/ic_vector_folder_zip.xml | 2 +- app/src/main/res/drawable/ic_vector_pdf.xml | 10 +++++----- .../res/drawable/ic_vector_play_circle_outline.xml | 1 - app/src/main/res/drawable/ic_videocam_vector.xml | 1 - 8 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/drawable/ic_document_vector.xml b/app/src/main/res/drawable/ic_document_vector.xml index e7ef3d4b..45b4a884 100644 --- a/app/src/main/res/drawable/ic_document_vector.xml +++ b/app/src/main/res/drawable/ic_document_vector.xml @@ -1,4 +1,4 @@ - diff --git a/app/src/main/res/drawable/ic_image_vector.xml b/app/src/main/res/drawable/ic_image_vector.xml index 0a221c91..cffc7970 100644 --- a/app/src/main/res/drawable/ic_image_vector.xml +++ b/app/src/main/res/drawable/ic_image_vector.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/ic_vector_folder_zip.xml b/app/src/main/res/drawable/ic_vector_folder_zip.xml index 6e94c4b9..2912f70b 100644 --- a/app/src/main/res/drawable/ic_vector_folder_zip.xml +++ b/app/src/main/res/drawable/ic_vector_folder_zip.xml @@ -1,4 +1,4 @@ - diff --git a/app/src/main/res/drawable/ic_vector_pdf.xml b/app/src/main/res/drawable/ic_vector_pdf.xml index 84899cf5..801a7e6c 100644 --- a/app/src/main/res/drawable/ic_vector_pdf.xml +++ b/app/src/main/res/drawable/ic_vector_pdf.xml @@ -1,9 +1,9 @@ - + diff --git a/app/src/main/res/drawable/ic_vector_play_circle_outline.xml b/app/src/main/res/drawable/ic_vector_play_circle_outline.xml index 8a252301..472b37fe 100644 --- a/app/src/main/res/drawable/ic_vector_play_circle_outline.xml +++ b/app/src/main/res/drawable/ic_vector_play_circle_outline.xml @@ -1,7 +1,6 @@ Date: Sun, 6 Nov 2022 16:07:10 +0530 Subject: [PATCH 22/61] Optimize vector drawables --- app/src/main/res/drawable/ic_document_vector.xml | 6 ++---- app/src/main/res/drawable/ic_image_vector.xml | 10 ++-------- app/src/main/res/drawable/ic_music_vector.xml | 10 ++-------- app/src/main/res/drawable/ic_vector_audio_file.xml | 6 ++---- app/src/main/res/drawable/ic_vector_folder_zip.xml | 6 ++---- app/src/main/res/drawable/ic_vector_pdf.xml | 10 ++-------- .../res/drawable/ic_vector_play_circle_outline.xml | 10 ++-------- app/src/main/res/drawable/ic_videocam_vector.xml | 10 ++-------- 8 files changed, 16 insertions(+), 52 deletions(-) diff --git a/app/src/main/res/drawable/ic_document_vector.xml b/app/src/main/res/drawable/ic_document_vector.xml index 45b4a884..d2fae544 100644 --- a/app/src/main/res/drawable/ic_document_vector.xml +++ b/app/src/main/res/drawable/ic_document_vector.xml @@ -1,5 +1,3 @@ - - + + diff --git a/app/src/main/res/drawable/ic_image_vector.xml b/app/src/main/res/drawable/ic_image_vector.xml index cffc7970..b20b8ad6 100644 --- a/app/src/main/res/drawable/ic_image_vector.xml +++ b/app/src/main/res/drawable/ic_image_vector.xml @@ -1,9 +1,3 @@ - - + + diff --git a/app/src/main/res/drawable/ic_music_vector.xml b/app/src/main/res/drawable/ic_music_vector.xml index 41e0151d..0c4e948d 100644 --- a/app/src/main/res/drawable/ic_music_vector.xml +++ b/app/src/main/res/drawable/ic_music_vector.xml @@ -1,9 +1,3 @@ - - + + diff --git a/app/src/main/res/drawable/ic_vector_audio_file.xml b/app/src/main/res/drawable/ic_vector_audio_file.xml index a5b829a1..4705cfa2 100644 --- a/app/src/main/res/drawable/ic_vector_audio_file.xml +++ b/app/src/main/res/drawable/ic_vector_audio_file.xml @@ -1,5 +1,3 @@ - - + + diff --git a/app/src/main/res/drawable/ic_vector_folder_zip.xml b/app/src/main/res/drawable/ic_vector_folder_zip.xml index 2912f70b..1a4b5f79 100644 --- a/app/src/main/res/drawable/ic_vector_folder_zip.xml +++ b/app/src/main/res/drawable/ic_vector_folder_zip.xml @@ -1,5 +1,3 @@ - - + + diff --git a/app/src/main/res/drawable/ic_vector_pdf.xml b/app/src/main/res/drawable/ic_vector_pdf.xml index 801a7e6c..23b0a48b 100644 --- a/app/src/main/res/drawable/ic_vector_pdf.xml +++ b/app/src/main/res/drawable/ic_vector_pdf.xml @@ -1,9 +1,3 @@ - - + + diff --git a/app/src/main/res/drawable/ic_vector_play_circle_outline.xml b/app/src/main/res/drawable/ic_vector_play_circle_outline.xml index 472b37fe..6003cd60 100644 --- a/app/src/main/res/drawable/ic_vector_play_circle_outline.xml +++ b/app/src/main/res/drawable/ic_vector_play_circle_outline.xml @@ -1,9 +1,3 @@ - - + + diff --git a/app/src/main/res/drawable/ic_videocam_vector.xml b/app/src/main/res/drawable/ic_videocam_vector.xml index 049ab368..7b16409b 100644 --- a/app/src/main/res/drawable/ic_videocam_vector.xml +++ b/app/src/main/res/drawable/ic_videocam_vector.xml @@ -1,9 +1,3 @@ - - + + From c1c60e8971c8b05800d0d63f388723730735e7de Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 6 Nov 2022 16:13:28 +0530 Subject: [PATCH 23/61] Reformat xml comment --- app/src/main/res/values-ar/strings.xml | 4 ++-- app/src/main/res/values-az/strings.xml | 4 ++-- app/src/main/res/values-be/strings.xml | 4 ++-- app/src/main/res/values-bg/strings.xml | 4 ++-- app/src/main/res/values-ca/strings.xml | 4 ++-- app/src/main/res/values-cr/strings.xml | 4 ++-- app/src/main/res/values-cs/strings.xml | 4 ++-- app/src/main/res/values-da/strings.xml | 4 ++-- app/src/main/res/values-de/strings.xml | 4 ++-- app/src/main/res/values-el/strings.xml | 4 ++-- app/src/main/res/values-eo/strings.xml | 4 ++-- app/src/main/res/values-es/strings.xml | 4 ++-- app/src/main/res/values-et/strings.xml | 4 ++-- app/src/main/res/values-fi/strings.xml | 4 ++-- app/src/main/res/values-fr/strings.xml | 4 ++-- app/src/main/res/values-gl/strings.xml | 4 ++-- app/src/main/res/values-hi/strings.xml | 4 ++-- app/src/main/res/values-hr/strings.xml | 4 ++-- app/src/main/res/values-hu/strings.xml | 4 ++-- app/src/main/res/values-in/strings.xml | 4 ++-- app/src/main/res/values-it/strings.xml | 4 ++-- app/src/main/res/values-iw/strings.xml | 4 ++-- app/src/main/res/values-ja/strings.xml | 4 ++-- app/src/main/res/values-lt/strings.xml | 4 ++-- app/src/main/res/values-lv/strings.xml | 4 ++-- app/src/main/res/values-mk/strings.xml | 4 ++-- app/src/main/res/values-ml/strings.xml | 4 ++-- app/src/main/res/values-nb-rNO/strings.xml | 4 ++-- app/src/main/res/values-nl/strings.xml | 4 ++-- app/src/main/res/values-pa-rPK/strings.xml | 4 ++-- app/src/main/res/values-pl/strings.xml | 4 ++-- app/src/main/res/values-pt-rBR/strings.xml | 4 ++-- app/src/main/res/values-pt/strings.xml | 4 ++-- app/src/main/res/values-ro/strings.xml | 4 ++-- app/src/main/res/values-ru/strings.xml | 4 ++-- app/src/main/res/values-sk/strings.xml | 4 ++-- app/src/main/res/values-sl/strings.xml | 4 ++-- app/src/main/res/values-sv/strings.xml | 4 ++-- app/src/main/res/values-ta/strings.xml | 4 ++-- app/src/main/res/values-th/strings.xml | 4 ++-- app/src/main/res/values-tr/strings.xml | 4 ++-- app/src/main/res/values-uk/strings.xml | 4 ++-- app/src/main/res/values-zh-rCN/strings.xml | 4 ++-- app/src/main/res/values-zh-rTW/strings.xml | 4 ++-- app/src/main/res/values/strings.xml | 4 ++-- 45 files changed, 90 insertions(+), 90 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index d5381541..dbcf6559 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -20,9 +20,9 @@ ازالة التثبيت اعادة ارسال غير قادر على ضغط الصورة إلى الحجم المحدد - + Duplicate item was not included - + و %d أخرى و %d أخرى diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 37b538a6..d3ecbea8 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -20,9 +20,9 @@ Unpin Forward Unable to compress image to selected size - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index ac14c023..ae2b2073 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -20,9 +20,9 @@ Адмацаваць Пераслаць Немагчыма сціснуць выяву да выбранага памеру - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index f340e9e5..1f708488 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -20,9 +20,9 @@ Откачване Препращане Невъзможно е да се компресира изображението до избрания размер - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index afdaf1e3..672e8f60 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -20,9 +20,9 @@ No fixis Reenvia No s\'ha pogut comprimir la imatge a la mida seleccionada - + Duplicate item was not included - + i %d altra i %d altres diff --git a/app/src/main/res/values-cr/strings.xml b/app/src/main/res/values-cr/strings.xml index 37b538a6..d3ecbea8 100644 --- a/app/src/main/res/values-cr/strings.xml +++ b/app/src/main/res/values-cr/strings.xml @@ -20,9 +20,9 @@ Unpin Forward Unable to compress image to selected size - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 92755a86..8eafa162 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -20,9 +20,9 @@ Odepnout Přeposlat Nepodařilo se komprimovat obrázek na požadovanou velikost - + Duplicate item was not included - + a %d další a %d další diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 6010253c..a56e24ab 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -20,9 +20,9 @@ Frigør Fremad Billedet kan ikke komprimeres til den valgte størrelse - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4c653eb6..6983cc16 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -20,9 +20,9 @@ Losheften Weiterleiten Bild kann nicht auf ausgewählte Größe komprimiert werden - + Duplicate item was not included - + und %d andere und %d anderen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 6ceb4e14..84e8d44c 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -20,9 +20,9 @@ Ξεκαρφίτσωμα Προώθηση Αδυναμία συμπίεσης εικόνας στο επιλεγμένο μέγεθος - + Duplicate item was not included - + και άλλος %d και άλλοι %d diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 75a0dda3..bfd97ea1 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -20,9 +20,9 @@ Depingli Forward Unable to compress image to selected size - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 0affd8d7..95c07450 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -20,9 +20,9 @@ Desanclar Reenviar Incapaz de comprimir la imagen al tamaño seleccionado - + Duplicate item was not included - + y %d otro y %d otros diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 06e036a9..19dccea1 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -20,9 +20,9 @@ Eemalda kinnitus Edasta Pildi muutmine valitud suurusesse ei õnnestu - + Duplicate item was not included - + ja %d muud ja %d teised diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 6314c34f..57764854 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -20,9 +20,9 @@ Poista Välitä Kuvan pakkaaminen valittuun kokoon ei onnistu - + Duplicate item was not included - + ja %d muu ja %d muuta diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 897ba5e1..a6362373 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -20,9 +20,9 @@ Désépingler Transférer Impossible de compresser l\'image à la taille sélectionnée - + Duplicate item was not included - + et %d autre et %d autres diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 7d412026..9be31218 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -20,9 +20,9 @@ Desenganche Adiante Non se puido comprimir a imaxe ao tamaño seleccionado - + Duplicate item was not included - + E %d outro E %d outros diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 37b538a6..d3ecbea8 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -20,9 +20,9 @@ Unpin Forward Unable to compress image to selected size - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 23b49e2a..3fda8528 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -20,9 +20,9 @@ Otkvači Proslijedi Isključi za komprimiranje slike na odabranu veličinu - + Duplicate item was not included - + i još %d druga i još %d druge diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index e8c09ebe..8e99341d 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -20,9 +20,9 @@ Kitűzés megszüntetése Továbbítás Nem lehet tömöríteni a képet a kiválasztott méretre - + Duplicate item was not included - + és még %d fő és még %d fő diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 59ec5275..f09f240e 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -20,9 +20,9 @@ Unpin Forward Unable to compress image to selected size - + Duplicate item was not included - + and %d others diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index cca883c9..818c4175 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -20,9 +20,9 @@ Rimuovi Inoltra Impossibile comprimere l\'immagine alla dimensione selezionata - + Duplicate item was not included - + e %d altro e %d altri diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index d876906c..578270c1 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -20,9 +20,9 @@ בטל הצמדה התקדם לא ניתן לדחוס תמונה לגודל שנבחר - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e1e66068..c33d2132 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -20,9 +20,9 @@ 固定を外す 転送 選択したサイズに画像を圧縮できません - + Duplicate item was not included - + and %d others diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 9dfbf21d..fc00464f 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -20,9 +20,9 @@ Atjunkite Pirmyn Nepavyksta suspausti vaizdo iki pasirinkto dydžio - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 5a3a4fe6..3f955f9e 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -20,9 +20,9 @@ Unpin Forward Unable to compress image to selected size - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 37b538a6..d3ecbea8 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -20,9 +20,9 @@ Unpin Forward Unable to compress image to selected size - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 7ba29d8c..7e4bb7fe 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -20,9 +20,9 @@ Unpin Forward Unable to compress image to selected size - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 7099dde8..fd7d141f 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -20,9 +20,9 @@ Løsne Videresend Unable to compress image to selected size - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index b44c1b97..552320b0 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -20,9 +20,9 @@ Losmaken Doorsturen Kon de afbeelding niet comprimeren naar de gekozen grootte - + Duplicate item was not included - + en %d andere en %d anderen diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 7d1c6f9f..66f5a68c 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -20,9 +20,9 @@ Unpin اگے تصویر نوں چݨے ہوۓ اکار وچ سنکُچت کر نہیں سکدی - + Duplicate item was not included - + تے %d ہور تے %d ہور diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 43d8cfab..50cbb1d9 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -20,9 +20,9 @@ Odepnij Przekaż dalej Nie udało się skompresować obrazu do wybranego rozmiaru - + Duplicate item was not included - + i %d inny i %d inne diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index c83ad4dc..e9adec12 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -20,9 +20,9 @@ Desfixar Encaminhar Não pôde comprimir imagem ao tamanho selecionado - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index ee3db70d..7a4e6f27 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -20,9 +20,9 @@ Desafixar Reencaminhar Incapaz de comprimir imagem no tamanho selecionado - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 1fad4076..8883889b 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -20,9 +20,9 @@ Elimină fixarea Redirecţionare Nu se poate comprima imaginea la dimensiunea selectată - + Duplicate item was not included - + și %d alt și %d altele diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e6db74df..05ca7ed8 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -20,9 +20,9 @@ Открепить Переслать Невозможно сжать изображение до выбранного размера - + Duplicate item was not included - + и ещё %d и ещё %d diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index f58158ff..d1fe3311 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -20,9 +20,9 @@ Odopnúť Preposlať Nepodarilo sa zmenšiť obrázok na požadovanú veľkosť - + Duplicate item was not included - + a %d ďalší a %d ďalší diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 5be4741b..8a14192f 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -20,9 +20,9 @@ Odpni Posreduj Slike ni mogoče stisniti na izbrano velikost - + Duplicate item was not included - + in %d drug in %d druga diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 781113ee..01abcdaa 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -20,9 +20,9 @@ Lossa Vidarebefordra Det gick inte att komprimera bilden till den valda storleken - + Duplicate item was not included - + och %d annan och %d andra diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 013a21dd..c5f0f542 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -20,9 +20,9 @@ பின் நீக்கு முன்னோக்கி Unable to compress image to selected size - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 769f87ad..e5eaf577 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -20,9 +20,9 @@ Unpin Forward Unable to compress image to selected size - + Duplicate item was not included - + and %d others diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 9d62ce58..e778a209 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -20,9 +20,9 @@ Sabitlemeyi kaldır İlet Resim seçilen boyuta sıkıştırılamıyor - + Duplicate item was not included - + ve %d diğeri ve %d diğeri diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 60671e1c..70c414ca 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -20,9 +20,9 @@ Відкріпити Переслати Не вдається стиснути зображення до вибраного розміру - + Duplicate item was not included - + and %d other and %d others diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9dcc8e6a..d39fd9c8 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -20,9 +20,9 @@ 取消固定 转发 无法将图像压缩到选定的大小 - + Duplicate item was not included - + 及 %d 个其他人 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index dfc7c27a..661c5b8a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -20,9 +20,9 @@ 取消釘選 轉傳 無法將圖片壓縮至指定大小 - + Duplicate item was not included - + and %d others diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 710aaf73..ed8a94d4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,9 +20,9 @@ Unpin Forward Unable to compress image to selected size - + Duplicate item was not included - + and %d other and %d others From 0eb5b791887b6e0a325671584bb5b015d7f683f5 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 6 Nov 2022 17:15:49 +0530 Subject: [PATCH 24/61] Use original uri as `id` for attachment selections --- .../smsmessenger/activities/ThreadActivity.kt | 4 +++- .../smsmessenger/models/AttachmentSelection.kt | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 182bf643..4ab99dfb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -893,7 +893,8 @@ class ThreadActivity : SimpleActivity() { private fun getAttachmentSelections() = getAttachmentsAdapter()?.attachments ?: emptyList() private fun addAttachment(uri: Uri) { - if (getAttachmentSelections().any { it.uri.toString() == uri.toString() }) { + val id = uri.toString() + if (getAttachmentSelections().any { it.id == id }) { toast(R.string.duplicate_item_warning) return } @@ -915,6 +916,7 @@ class ThreadActivity : SimpleActivity() { thread_attachments_recyclerview.beVisible() val mimeType = contentResolver.getType(uri).orEmpty() val attachment = AttachmentSelection( + id = id, uri = uri, mimetype = mimeType, filename = getFilenameFromUri(uri), diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt index eb81fda2..dc92e584 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/AttachmentSelection.kt @@ -9,6 +9,7 @@ import com.simplemobiletools.smsmessenger.helpers.ATTACHMENT_MEDIA import com.simplemobiletools.smsmessenger.helpers.ATTACHMENT_VCARD data class AttachmentSelection( + val id: String, val uri: Uri, val mimetype: String, val filename: String, @@ -25,7 +26,7 @@ data class AttachmentSelection( } fun areItemsTheSame(first: AttachmentSelection, second: AttachmentSelection): Boolean { - return first.uri == second.uri + return first.id == second.id } fun areContentsTheSame(first: AttachmentSelection, second: AttachmentSelection): Boolean { From c3561a374ea638bb2eec5faa25289ef688fa1b95 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 6 Nov 2022 17:48:02 +0530 Subject: [PATCH 25/61] Account for bottom bar height in attachment picker --- .../smsmessenger/activities/ThreadActivity.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 4ab99dfb..c0c735e2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -1428,11 +1428,12 @@ class ThreadActivity : SimpleActivity() { } private fun setupKeyboardListener() { - val typeMask = WindowInsetsCompat.Type.ime() + val imeTypeMask = WindowInsetsCompat.Type.ime() + val navigationBarMask = WindowInsetsCompat.Type.navigationBars() ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { _, insets -> - if (insets.isVisible(typeMask)) { - config.keyboardHeight = insets.getInsets(typeMask).bottom + if (insets.isVisible(imeTypeMask)) { + config.keyboardHeight = insets.getInsets(imeTypeMask).bottom - insets.getInsets(navigationBarMask).bottom hideAttachmentPicker() } else if (isAttachmentPickerVisible) { showAttachmentPicker() From e706e0ee4f08cb2c3006ee29adbc5fa46bfab354 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 6 Nov 2022 18:08:04 +0530 Subject: [PATCH 26/61] Update commons lib and strings --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 7b4053ea..b3d42047 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ android { } dependencies { - implementation 'com.github.SimpleMobileTools:Simple-Commons:63ee2676f5' + implementation 'com.github.SimpleMobileTools:Simple-Commons:30842aca5e' implementation 'org.greenrobot:eventbus:3.3.1' implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61' implementation 'com.github.tibbi:android-smsmms:3581774c39' From 05ffecffb68b13a6d57d10acff5419db786d097f Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 6 Nov 2022 19:01:49 +0530 Subject: [PATCH 27/61] Fix system bar color customization --- app/src/main/AndroidManifest.xml | 3 ++- .../smsmessenger/activities/ThreadActivity.kt | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b12c0b35..e25bbf6b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -52,7 +52,8 @@ + android:parentActivityName=".activities.MainActivity" + android:windowSoftInputMode="adjustResize" /> + window.decorView.setOnApplyWindowInsetsListener { view, windowInsets -> + val insets = WindowInsetsCompat.toWindowInsetsCompat(windowInsets) if (insets.isVisible(imeTypeMask)) { config.keyboardHeight = insets.getInsets(imeTypeMask).bottom - insets.getInsets(navigationBarMask).bottom hideAttachmentPicker() @@ -1439,7 +1440,7 @@ class ThreadActivity : SimpleActivity() { showAttachmentPicker() } - insets + view.onApplyWindowInsets(windowInsets) } } } From 6f58903cf209fd4ff2664c8a392d5969aeeeb8f9 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 6 Nov 2022 19:07:09 +0530 Subject: [PATCH 28/61] Set proper navigation bar color --- .../simplemobiletools/smsmessenger/activities/MainActivity.kt | 2 ++ .../smsmessenger/activities/SettingsActivity.kt | 1 + .../simplemobiletools/smsmessenger/activities/ThreadActivity.kt | 1 + 3 files changed, 4 insertions(+) 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 5b6641e2..b4ceb0e3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -87,6 +87,8 @@ class MainActivity : SimpleActivity() { override fun onResume() { super.onResume() setupToolbar(main_toolbar) + updateNavigationBarColor(getBottomNavigationBackgroundColor()) + if (storedTextColor != getProperTextColor()) { (conversations_list.adapter as? ConversationsAdapter)?.updateTextColor(getProperTextColor()) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt index dd2ce29c..39fa27b3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt @@ -27,6 +27,7 @@ class SettingsActivity : SimpleActivity() { override fun onResume() { super.onResume() setupToolbar(settings_toolbar, NavigationIcon.Arrow) + updateNavigationBarColor(getBottomNavigationBackgroundColor()) setupPurchaseThankYou() setupCustomizeColors() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 201f2112..a120f595 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -145,6 +145,7 @@ class ThreadActivity : SimpleActivity() { override fun onResume() { super.onResume() setupToolbar(thread_toolbar, NavigationIcon.Arrow) + updateNavigationBarColor(getBottomNavigationBackgroundColor()) val smsDraft = getSmsDraft(threadId) if (smsDraft != null) { From b6407dc49b4eae41d6448bfe995939e558b0ad15 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 6 Nov 2022 21:00:35 +0530 Subject: [PATCH 29/61] Use lookup key to load contacts --- .../smsmessenger/activities/ThreadActivity.kt | 2 +- .../smsmessenger/helpers/ContactsHelper.kt | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index a120f595..d90e2a00 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -853,7 +853,7 @@ class ThreadActivity : SimpleActivity() { private fun launchPickContactIntent() { Intent(Intent.ACTION_PICK).apply { - type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE + type = ContactsContract.Contacts.CONTENT_TYPE launchActivityForResult(this, PICK_CONTACT_INTENT) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ContactsHelper.kt index 36c9d123..0bfc46db 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/ContactsHelper.kt @@ -20,24 +20,24 @@ class ContactsHelper(val context: Context) { private var displayContactSources = ArrayList() fun getContactFromUri(uri: Uri): Contact? { - val projection = arrayOf(Data.RAW_CONTACT_ID) - val cursor = context.contentResolver.query(uri, projection, null, null, null) + val key = getLookupKeyFromUri(uri) ?: return null + return getContactWithLookupKey(key) + } + + private fun getLookupKeyFromUri(lookupUri: Uri): String? { + val projection = arrayOf(ContactsContract.Contacts.LOOKUP_KEY) + val cursor = context.contentResolver.query(lookupUri, projection, null, null, null) cursor?.use { if (cursor.moveToFirst()) { - val id = cursor.getIntValue(Data.RAW_CONTACT_ID) - return getContactWithId(id) + return cursor.getStringValue(ContactsContract.Contacts.LOOKUP_KEY) } } return null } - private fun getContactWithId(id: Int): Contact? { - if (id == 0) { - return null - } - - val selection = "(${Data.MIMETYPE} = ? OR ${Data.MIMETYPE} = ?) AND ${Data.RAW_CONTACT_ID} = ?" - val selectionArgs = arrayOf(StructuredName.CONTENT_ITEM_TYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE, id.toString()) + private fun getContactWithLookupKey(key: String): Contact? { + val selection = "(${Data.MIMETYPE} = ? OR ${Data.MIMETYPE} = ?) AND ${Data.LOOKUP_KEY} = ?" + val selectionArgs = arrayOf(StructuredName.CONTENT_ITEM_TYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE, key) return parseContactCursor(selection, selectionArgs) } From 69c4d62e42a64e8bc60f6be45b6cd8d741139c8e Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 6 Nov 2022 23:09:45 +0530 Subject: [PATCH 30/61] Redesign attachment picker buttons --- .../smsmessenger/activities/ThreadActivity.kt | 24 +- app/src/main/res/layout/activity_thread.xml | 117 +------- .../res/layout/layout_attachment_picker.xml | 256 ++++++++++++++++++ app/src/main/res/values/dimens.xml | 2 +- 4 files changed, 275 insertions(+), 124 deletions(-) create mode 100644 app/src/main/res/layout/layout_attachment_picker.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index d90e2a00..8e5e1ee3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -32,11 +32,9 @@ import android.widget.LinearLayout import android.widget.LinearLayout.LayoutParams import android.widget.RelativeLayout import androidx.annotation.StringRes -import androidx.appcompat.widget.AppCompatButton import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.res.ResourcesCompat import androidx.core.view.WindowInsetsCompat -import androidx.core.view.children import androidx.core.view.updateLayoutParams import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -1362,20 +1360,26 @@ class ThreadActivity : SimpleActivity() { .toArrayList() private fun setupAttachmentPickerView() { - val colors = arrayOf( + val buttonColors = arrayOf( R.color.md_red_500, R.color.md_pink_500, R.color.md_purple_500, R.color.md_teal_500, R.color.md_green_500, - R.color.md_light_green_500, + R.color.md_indigo_500, R.color.md_blue_500 - ) - attachment_picker_holder.children.filterIsInstance().forEachIndexed { index, button -> - button.setTextColor(getProperTextColor()) - val color = resources.getColor(colors[index]) - button.compoundDrawables.forEach { it?.applyColorFilter(color) } - } + ).map { ResourcesCompat.getColor(resources, it, theme) } + arrayOf(choose_photo_icon, take_photo_icon, record_video_icon, record_audio_icon, pick_file_icon, pick_contact_icon, schedule_message_icon) + .forEachIndexed { index, icon -> + val iconColor = buttonColors[index] + icon.background.applyColorFilter(iconColor) + icon.applyColorFilter(iconColor.getContrastColor()) + } + + val textColor = getProperTextColor() + arrayOf(choose_photo_text, take_photo_text, record_video_text, record_audio_text, pick_file_text, pick_contact_text, schedule_message_text) + .forEach { it.setTextColor(textColor) } + pick_from_gallery.setOnClickListener { launchPickPhotoVideoIntent() } diff --git a/app/src/main/res/layout/activity_thread.xml b/app/src/main/res/layout/activity_thread.xml index 7bdec389..92f829f4 100644 --- a/app/src/main/res/layout/activity_thread.xml +++ b/app/src/main/res/layout/activity_thread.xml @@ -307,125 +307,16 @@ android:importantForAccessibility="no" app:layout_constraintBottom_toTopOf="@id/attachment_picker_holder" /> - - - - - - - - - - - - - - - - - + tools:visibility="visible" /> diff --git a/app/src/main/res/layout/layout_attachment_picker.xml b/app/src/main/res/layout/layout_attachment_picker.xml new file mode 100644 index 00000000..f86e87bc --- /dev/null +++ b/app/src/main/res/layout/layout_attachment_picker.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0a03e197..d8f37a56 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -11,6 +11,6 @@ 64dp 20dp 36dp - 80dp + 96dp 90dp From 48438c6553e7ee3987a45a9aec14189da6b930ff Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 6 Nov 2022 23:54:24 +0530 Subject: [PATCH 31/61] Automatically wrap buttons on bigger screens --- .../smsmessenger/activities/ThreadActivity.kt | 4 +- app/src/main/res/layout/activity_thread.xml | 13 +++-- .../res/layout/layout_attachment_picker.xml | 51 +++++++------------ 3 files changed, 31 insertions(+), 37 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 8e5e1ee3..4d02ad59 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -1380,10 +1380,10 @@ class ThreadActivity : SimpleActivity() { arrayOf(choose_photo_text, take_photo_text, record_video_text, record_audio_text, pick_file_text, pick_contact_text, schedule_message_text) .forEach { it.setTextColor(textColor) } - pick_from_gallery.setOnClickListener { + choose_photo.setOnClickListener { launchPickPhotoVideoIntent() } - camera.setOnClickListener { + take_photo.setOnClickListener { launchCapturePhotoIntent() } record_video.setOnClickListener { diff --git a/app/src/main/res/layout/activity_thread.xml b/app/src/main/res/layout/activity_thread.xml index 92f829f4..42448012 100644 --- a/app/src/main/res/layout/activity_thread.xml +++ b/app/src/main/res/layout/activity_thread.xml @@ -307,16 +307,23 @@ android:importantForAccessibility="no" app:layout_constraintBottom_toTopOf="@id/attachment_picker_holder" /> - + tools:visibility="visible"> + + + diff --git a/app/src/main/res/layout/layout_attachment_picker.xml b/app/src/main/res/layout/layout_attachment_picker.xml index f86e87bc..c2d5b1a3 100644 --- a/app/src/main/res/layout/layout_attachment_picker.xml +++ b/app/src/main/res/layout/layout_attachment_picker.xml @@ -1,23 +1,29 @@ + + + android:paddingVertical="@dimen/medium_margin"> + android:paddingVertical="@dimen/medium_margin"> + android:paddingVertical="@dimen/medium_margin"> + android:paddingVertical="@dimen/medium_margin"> + android:textColor="@color/default_text_color"> + android:textColor="@color/default_text_color"> + android:paddingVertical="@dimen/medium_margin"> Date: Mon, 7 Nov 2022 00:43:59 +0530 Subject: [PATCH 32/61] Let base activity configure bottom bar --- .../simplemobiletools/smsmessenger/activities/MainActivity.kt | 1 - .../smsmessenger/activities/SettingsActivity.kt | 1 - .../simplemobiletools/smsmessenger/activities/ThreadActivity.kt | 1 - 3 files changed, 3 deletions(-) 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 b4ceb0e3..22467a36 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -87,7 +87,6 @@ class MainActivity : SimpleActivity() { override fun onResume() { super.onResume() setupToolbar(main_toolbar) - updateNavigationBarColor(getBottomNavigationBackgroundColor()) if (storedTextColor != getProperTextColor()) { (conversations_list.adapter as? ConversationsAdapter)?.updateTextColor(getProperTextColor()) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt index 39fa27b3..dd2ce29c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt @@ -27,7 +27,6 @@ class SettingsActivity : SimpleActivity() { override fun onResume() { super.onResume() setupToolbar(settings_toolbar, NavigationIcon.Arrow) - updateNavigationBarColor(getBottomNavigationBackgroundColor()) setupPurchaseThankYou() setupCustomizeColors() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 4d02ad59..afb0317d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -143,7 +143,6 @@ class ThreadActivity : SimpleActivity() { override fun onResume() { super.onResume() setupToolbar(thread_toolbar, NavigationIcon.Arrow) - updateNavigationBarColor(getBottomNavigationBackgroundColor()) val smsDraft = getSmsDraft(threadId) if (smsDraft != null) { From 79d97f97295b5111e7d9b7c0a618afdefa67facf Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 7 Nov 2022 03:16:45 +0530 Subject: [PATCH 33/61] Update commons lib --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b3d42047..7fd7b75b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ android { } dependencies { - implementation 'com.github.SimpleMobileTools:Simple-Commons:30842aca5e' + implementation 'com.github.SimpleMobileTools:Simple-Commons:d5ae570e2a' implementation 'org.greenrobot:eventbus:3.3.1' implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61' implementation 'com.github.tibbi:android-smsmms:3581774c39' From 40a77118bff1c0f5d0a3132c7921bbef31fb5c92 Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 7 Nov 2022 03:24:53 +0530 Subject: [PATCH 34/61] Add "Choose video" button --- .../smsmessenger/activities/ThreadActivity.kt | 57 +++++++++++-------- .../smsmessenger/helpers/Constants.kt | 3 +- .../res/drawable/ic_video_camera_vector.xml | 3 + .../res/layout/layout_attachment_picker.xml | 38 ++++++++++++- 4 files changed, 73 insertions(+), 28 deletions(-) create mode 100644 app/src/main/res/drawable/ic_video_camera_vector.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index afb0317d..fac7604e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -221,7 +221,7 @@ class ThreadActivity : SimpleActivity() { addAttachment(capturedImageUri!!) } else if (data != null) { when (requestCode) { - CAPTURE_VIDEO_INTENT, PICK_DOCUMENT_INTENT, CAPTURE_AUDIO_INTENT, PICK_PHOTO_VIDEO_INTENT -> addAttachment(data) + CAPTURE_VIDEO_INTENT, PICK_DOCUMENT_INTENT, CAPTURE_AUDIO_INTENT, PICK_PHOTO_INTENT, PICK_VIDEO_INTENT -> addAttachment(data) PICK_CONTACT_INTENT -> addContactAttachment(data) PICK_SAVE_FILE_INTENT -> saveAttachment(resultData) } @@ -828,23 +828,12 @@ class ThreadActivity : SimpleActivity() { launchActivityForResult(intent, CAPTURE_AUDIO_INTENT) } - private fun launchPickPhotoVideoIntent() { - val mimeTypes = arrayOf("image/*", "video/*") + private fun launchGetContentIntent(mimeTypes: Array, requestCode: Int) { Intent(Intent.ACTION_GET_CONTENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "*/*" putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) - launchActivityForResult(this, PICK_PHOTO_VIDEO_INTENT) - } - } - - private fun launchPickDocumentIntent() { - val mimeTypes = arrayOf("*/*") - Intent(Intent.ACTION_GET_CONTENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = "*/*" - putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) - launchActivityForResult(this, PICK_DOCUMENT_INTENT) + launchActivityForResult(this, requestCode) } } @@ -1361,6 +1350,7 @@ class ThreadActivity : SimpleActivity() { private fun setupAttachmentPickerView() { val buttonColors = arrayOf( R.color.md_red_500, + R.color.md_brown_500, R.color.md_pink_500, R.color.md_purple_500, R.color.md_teal_500, @@ -1368,19 +1358,38 @@ class ThreadActivity : SimpleActivity() { R.color.md_indigo_500, R.color.md_blue_500 ).map { ResourcesCompat.getColor(resources, it, theme) } - arrayOf(choose_photo_icon, take_photo_icon, record_video_icon, record_audio_icon, pick_file_icon, pick_contact_icon, schedule_message_icon) - .forEachIndexed { index, icon -> - val iconColor = buttonColors[index] - icon.background.applyColorFilter(iconColor) - icon.applyColorFilter(iconColor.getContrastColor()) - } + arrayOf( + choose_photo_icon, + choose_video_icon, + take_photo_icon, + record_video_icon, + record_audio_icon, + pick_file_icon, + pick_contact_icon, + schedule_message_icon + ).forEachIndexed { index, icon -> + val iconColor = buttonColors[index] + icon.background.applyColorFilter(iconColor) + icon.applyColorFilter(iconColor.getContrastColor()) + } val textColor = getProperTextColor() - arrayOf(choose_photo_text, take_photo_text, record_video_text, record_audio_text, pick_file_text, pick_contact_text, schedule_message_text) - .forEach { it.setTextColor(textColor) } + arrayOf( + choose_photo_text, + choose_video_text, + take_photo_text, + record_video_text, + record_audio_text, + pick_file_text, + pick_contact_text, + schedule_message_text + ).forEach { it.setTextColor(textColor) } choose_photo.setOnClickListener { - launchPickPhotoVideoIntent() + launchGetContentIntent(arrayOf("image/*"), PICK_PHOTO_INTENT) + } + choose_video.setOnClickListener { + launchGetContentIntent(arrayOf("video/*"), PICK_VIDEO_INTENT) } take_photo.setOnClickListener { launchCapturePhotoIntent() @@ -1392,7 +1401,7 @@ class ThreadActivity : SimpleActivity() { launchCaptureAudioIntent() } pick_file.setOnClickListener { - launchPickDocumentIntent() + launchGetContentIntent(arrayOf("*/*"), PICK_DOCUMENT_INTENT) } pick_contact.setOnClickListener { launchPickContactIntent() 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 2e96f376..bf8f2761 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt @@ -67,7 +67,8 @@ const val FILE_SIZE_2_MB = 2_097_152L const val MESSAGES_LIMIT = 50 // intent launch request codes -const val PICK_PHOTO_VIDEO_INTENT = 42 +const val PICK_PHOTO_INTENT = 42 +const val PICK_VIDEO_INTENT = 49 const val PICK_SAVE_FILE_INTENT = 43 const val CAPTURE_PHOTO_INTENT = 44 const val CAPTURE_VIDEO_INTENT = 45 diff --git a/app/src/main/res/drawable/ic_video_camera_vector.xml b/app/src/main/res/drawable/ic_video_camera_vector.xml new file mode 100644 index 00000000..872944c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_video_camera_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/app/src/main/res/layout/layout_attachment_picker.xml b/app/src/main/res/layout/layout_attachment_picker.xml index c2d5b1a3..54b7328d 100644 --- a/app/src/main/res/layout/layout_attachment_picker.xml +++ b/app/src/main/res/layout/layout_attachment_picker.xml @@ -8,7 +8,7 @@ + + + + + + + @@ -203,7 +235,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="@dimen/medium_margin" - android:text="@string/contacts_short" + android:text="@string/choose_contact" android:textAlignment="center" android:textColor="@color/default_text_color" android:textSize="@dimen/normal_text_size" /> From 1e67cd0fdf438630b28c6638c986b1a0cb48f547 Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 7 Nov 2022 15:35:57 +0530 Subject: [PATCH 35/61] Use 'application/txt' when sending text files --- .../smsmessenger/activities/ThreadActivity.kt | 6 +++++- .../simplemobiletools/smsmessenger/extensions/String.kt | 4 ++++ .../simplemobiletools/smsmessenger/helpers/Messaging.kt | 7 ++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index fac7604e..c536b538 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -901,7 +901,11 @@ class ThreadActivity : SimpleActivity() { } thread_attachments_recyclerview.beVisible() - val mimeType = contentResolver.getType(uri).orEmpty() + val mimeType = contentResolver.getType(uri) + if (mimeType == null) { + toast(R.string.unknown_error_occurred) + return + } val attachment = AttachmentSelection( id = id, uri = uri, diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt index 953564ba..4b0ebc34 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt @@ -43,3 +43,7 @@ fun String.isPdfMimeType(): Boolean { fun String.isZipMimeType(): Boolean { return lowercase().endsWith("zip") } + +fun String.isPlainTextMimeType(): Boolean { + return lowercase().startsWith("text") +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Messaging.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Messaging.kt index 8e68d533..6935744d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Messaging.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Messaging.kt @@ -14,6 +14,7 @@ import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.helpers.isMarshmallowPlus import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.extensions.config +import com.simplemobiletools.smsmessenger.extensions.isPlainTextMimeType import com.simplemobiletools.smsmessenger.models.Attachment import com.simplemobiletools.smsmessenger.models.Message import com.simplemobiletools.smsmessenger.receivers.ScheduledMessageReceiver @@ -49,7 +50,11 @@ fun Context.sendMessage(text: String, addresses: List, subscriptionId: I val uri = attachment.getUri() contentResolver.openInputStream(uri)?.use { val bytes = it.readBytes() - val mimeType = contentResolver.getType(uri) ?: return@use + val mimeType = if (attachment.mimetype.isPlainTextMimeType()) { + "application/txt" + } else { + attachment.mimetype + } val name = attachment.filename message.addMedia(bytes, mimeType, name, name) } From 14859607ec994ffd9c17a00f0f02e45c57ae388f Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 7 Nov 2022 15:47:34 +0100 Subject: [PATCH 36/61] limit shown attachment sizes in thread to avoid OOM --- .../smsmessenger/adapters/ThreadAdapter.kt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt index 479e14a2..066cbf13 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -8,6 +8,7 @@ import android.graphics.Typeface import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.net.Uri +import android.util.Size import android.util.TypedValue import android.view.Menu import android.view.View @@ -60,6 +61,7 @@ class ThreadAdapter( @SuppressLint("MissingPermission") private val hasMultipleSIMCards = (activity.subscriptionManagerCompat().activeSubscriptionInfoList?.size ?: 0) > 1 + private val maxChatBubbleWidth = activity.usableScreenSize.x * 0.8f init { setupDragListener(true) @@ -374,14 +376,20 @@ class ThreadAdapter( return false } - override fun onResourceReady(dr: Drawable?, a: Any?, t: Target?, d: DataSource?, i: Boolean) = - false + override fun onResourceReady(dr: Drawable?, a: Any?, t: Target?, d: DataSource?, i: Boolean) = false }) + // limit attachment sizes to avoid causing OOM + var wantedAttachmentSize = Size(attachment.width, attachment.height) + if (wantedAttachmentSize.width > maxChatBubbleWidth) { + val newHeight = wantedAttachmentSize.height / (wantedAttachmentSize.width / maxChatBubbleWidth) + wantedAttachmentSize = Size(maxChatBubbleWidth.toInt(), newHeight.toInt()) + } + builder = if (isTallImage) { - builder.override(attachment.width, attachment.width) + builder.override(wantedAttachmentSize.width, wantedAttachmentSize.width) } else { - builder.override(attachment.width, attachment.height) + builder.override(wantedAttachmentSize.width, wantedAttachmentSize.height) } try { From ccacc511561ada9f9fae0e62b62323b84fe051ef Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 7 Nov 2022 20:22:22 +0530 Subject: [PATCH 37/61] Check for exact mimetype match --- .../com/simplemobiletools/smsmessenger/extensions/String.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt index 4b0ebc34..8ad4bd49 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt @@ -45,5 +45,5 @@ fun String.isZipMimeType(): Boolean { } fun String.isPlainTextMimeType(): Boolean { - return lowercase().startsWith("text") + return lowercase() == "text/plain" } From 4fee6bb7b4bf7a2dca97781015ea4a7393952303 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Mon, 7 Nov 2022 16:03:01 +0100 Subject: [PATCH 38/61] removing an unused import --- .../com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt index 8e9c0908..63a484d3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -6,7 +6,6 @@ import android.graphics.Color import android.graphics.Typeface import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable -import android.net.Uri import android.util.Size import android.util.TypedValue import android.view.Menu From e87c8eeff78fff6a5b1c3a4aedb936d0f7745661 Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 7 Nov 2022 20:47:39 +0530 Subject: [PATCH 39/61] Refresh messages when an MMS is received --- .../com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt index 18d97921..8c2acf0b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/MmsReceiver.kt @@ -10,6 +10,7 @@ import com.simplemobiletools.commons.extensions.normalizePhoneNumber import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.extensions.* +import com.simplemobiletools.smsmessenger.helpers.refreshMessages // more info at https://github.com/klinker41/android-smsmms class MmsReceiver : com.klinker.android.send_message.MmsReceivedReceiver() { @@ -42,6 +43,7 @@ class MmsReceiver : com.klinker.android.send_message.MmsReceivedReceiver() { ensureBackgroundThread { context.conversationsDB.insertOrUpdate(conversation) context.updateUnreadCountBadge(context.conversationsDB.getUnreadConversations()) + refreshMessages() } } } From b4c5648ddc4727f3a9d2863090d78cfaf7950446 Mon Sep 17 00:00:00 2001 From: Naveen Date: Tue, 8 Nov 2022 02:13:24 +0530 Subject: [PATCH 40/61] Properly handle attachment picker visibility --- .../smsmessenger/activities/ThreadActivity.kt | 49 +++++++++++++------ .../smsmessenger/extensions/Context.kt | 2 + .../smsmessenger/helpers/Config.kt | 3 +- app/src/main/res/values/dimens.xml | 1 + 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index c536b538..12adb04a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -34,8 +34,7 @@ import android.widget.RelativeLayout import androidx.annotation.StringRes import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.res.ResourcesCompat -import androidx.core.view.WindowInsetsCompat -import androidx.core.view.updateLayoutParams +import androidx.core.view.* import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.dialogs.ConfirmationDialog @@ -488,10 +487,11 @@ class ThreadActivity : SimpleActivity() { thread_add_attachment.setOnClickListener { if (attachment_picker_holder.isVisible()) { isAttachmentPickerVisible = false - showKeyboard(thread_type_message) + WindowCompat.getInsetsController(window, thread_type_message).show(WindowInsetsCompat.Type.ime()) } else { isAttachmentPickerVisible = true - hideKeyboard() + showOrHideAttachmentPicker() + WindowCompat.getInsetsController(window, thread_type_message).hide(WindowInsetsCompat.Type.ime()) } window.decorView.requestApplyInsets() } @@ -1445,19 +1445,40 @@ class ThreadActivity : SimpleActivity() { } private fun setupKeyboardListener() { - val imeTypeMask = WindowInsetsCompat.Type.ime() - val navigationBarMask = WindowInsetsCompat.Type.navigationBars() + window.decorView.setOnApplyWindowInsetsListener { _, insets -> + showOrHideAttachmentPicker() + insets + } - window.decorView.setOnApplyWindowInsetsListener { view, windowInsets -> - val insets = WindowInsetsCompat.toWindowInsetsCompat(windowInsets) - if (insets.isVisible(imeTypeMask)) { - config.keyboardHeight = insets.getInsets(imeTypeMask).bottom - insets.getInsets(navigationBarMask).bottom - hideAttachmentPicker() - } else if (isAttachmentPickerVisible) { - showAttachmentPicker() + val callback = object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_CONTINUE_ON_SUBTREE) { + override fun onPrepare(animation: WindowInsetsAnimationCompat) { + super.onPrepare(animation) + showOrHideAttachmentPicker() } - view.onApplyWindowInsets(windowInsets) + override fun onProgress(insets: WindowInsetsCompat, runningAnimations: MutableList) = insets + } + ViewCompat.setWindowInsetsAnimationCallback(window.decorView, callback) + } + + private fun showOrHideAttachmentPicker() { + val type = WindowInsetsCompat.Type.ime() + val insets = ViewCompat.getRootWindowInsets(window.decorView) ?: return + val isKeyboardVisible = insets.isVisible(type) + + if (isKeyboardVisible) { + val keyboardHeight = insets.getInsets(type).bottom + val bottomBarHeight = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom + + // check keyboard height just to be sure, 150 seems like a good middle ground between ime and navigation bar + config.keyboardHeight = if (keyboardHeight > 150) { + keyboardHeight - bottomBarHeight + } else { + getDefaultKeyboardHeight() + } + hideAttachmentPicker() + } else if (isAttachmentPickerVisible) { + showAttachmentPicker() } } } 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 77b47faf..6b97672f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -1065,3 +1065,5 @@ fun Context.clearExpiredScheduledMessages(threadId: Long, messagesToDelete: List return } } + +fun Context.getDefaultKeyboardHeight() = resources.getDimensionPixelSize(R.dimen.default_keyboard_height) 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 fa076222..c1fa3d74 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.smsmessenger.helpers import android.content.Context import com.simplemobiletools.commons.helpers.BaseConfig +import com.simplemobiletools.smsmessenger.extensions.getDefaultKeyboardHeight import com.simplemobiletools.smsmessenger.models.Conversation class Config(context: Context) : BaseConfig(context) { @@ -88,6 +89,6 @@ class Config(context: Context) : BaseConfig(context) { set(wasDbCleared) = prefs.edit().putBoolean(WAS_DB_CLEARED, wasDbCleared).apply() var keyboardHeight: Int - get() = prefs.getInt(SOFT_KEYBOARD_HEIGHT, 600) + get() = prefs.getInt(SOFT_KEYBOARD_HEIGHT, context.getDefaultKeyboardHeight()) set(keyboardHeight) = prefs.edit().putInt(SOFT_KEYBOARD_HEIGHT, keyboardHeight).apply() } diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index d8f37a56..324712d5 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -13,4 +13,5 @@ 36dp 96dp 90dp + 250dp From 10b0135922828cc7bb169fef1a59ab90e36cfd1e Mon Sep 17 00:00:00 2001 From: Naveen Date: Tue, 8 Nov 2022 02:16:07 +0530 Subject: [PATCH 41/61] Apply window insets --- .../smsmessenger/activities/ThreadActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 12adb04a..0e088d86 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -1445,9 +1445,9 @@ class ThreadActivity : SimpleActivity() { } private fun setupKeyboardListener() { - window.decorView.setOnApplyWindowInsetsListener { _, insets -> + window.decorView.setOnApplyWindowInsetsListener { view, insets -> showOrHideAttachmentPicker() - insets + view.onApplyWindowInsets(insets) } val callback = object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_CONTINUE_ON_SUBTREE) { From 8e257ef3e8e76c554e71688a3cd12d77a95706c0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 8 Nov 2022 10:36:02 +0100 Subject: [PATCH 42/61] removing some local gradle properties --- gradle.properties | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/gradle.properties b/gradle.properties index 23339e0d..dbb7bf70 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,21 +1,2 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX android.enableJetifier=true -# Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official +android.useAndroidX=true From e66abb7dd1a99efe91b211f8dd6f339c211d3892 Mon Sep 17 00:00:00 2001 From: Digger Date: Wed, 26 Oct 2022 23:30:23 +0000 Subject: [PATCH 43/61] Translated using Weblate (Japanese) Currently translated at 100.0% (64 of 64 strings) Translation: Simple Mobile Tools/Simple SMS Messenger Translate-URL: https://hosted.weblate.org/projects/simple-mobile-tools/simple-sms-messenger/ja/ --- app/src/main/res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index c33d2132..d1c14af9 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -81,7 +81,7 @@ メッセージ相手が MMS を受信できません。何かできますか? MMS のサイズは通信キャリアによって制限されています。アプリの設定で制限を小さくしてみてください。 アプリは予約メッセージをサポートしていますか? - はい、送信ボタンを長押しして、希望の日付と日時を選択することで、今後送信したいメッセージを予約できます。 + はい、送信ボタンを長押しして、希望の日付と時間を選択することで、今後送信したいメッセージを予約できます。 نیت سنہے Schedule message - Schedule send - Cancel schedule send + بھیجݨ دی سمان سارݨی بݨاؤ + سماں دا بھیجݨ رد کرو You must pick a time in the future Keep the phone on and make sure there is nothing killing the app while in background. - Update message - Send now + سنیہا بدلو + ہݨے بھیجو - Received SMS - New message - Mark as Read - Mark as Unread - Me + سنیہا لیا گیا + نواں سنیہا + پرھے وجوں چنھت کرو + نا پڑھے وجوں چنھت کرو + میں Are you sure you want to delete all messages of this conversation\? @@ -60,23 +60,23 @@ Lock screen notification visibility - Sender and message - Sender only + بھیجݨ والا تے سنیہا + صرف بھیجݨ والا Enable delivery reports Remove accents and diacritics at sending messages Resize sent MMS images - No limit + کوئی حد نہیں Outgoing messages Send group messages as MMS Send long messages as MMS - Messages - Export messages - Export SMS - Export MMS - Import messages - Import SMS - Import MMS + سنیہے + سنیہے ایکسپورٹ کرو + سنیہے ایکسپورٹ کرو + میڈیا سنیہا ایکسپورٹ کرو + سنیہے ایمپورٹ کرو + سنیہے ایمپورٹ کرو + میڈیا دیاں سنیہے ایمپورٹ کرو You have to select at least one item Why does the app require access to the internet\? @@ -85,4 +85,4 @@ MMS size is limited by carriers, you can try setting a smaller limit in the app settings. Does the app support scheduled messages\? Yes, you can schedule messages to be sent in the future by long pressing the Send button and picking the desired date and time. - + \ No newline at end of file From c60ada330beb67884da4502ad63caedb03a5e2bb Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 30 Oct 2022 19:30:37 +0000 Subject: [PATCH 45/61] Translated using Weblate (Croatian) Currently translated at 100.0% (64 of 64 strings) Translation: Simple Mobile Tools/Simple SMS Messenger Translate-URL: https://hosted.weblate.org/projects/simple-mobile-tools/simple-sms-messenger/hr/ --- app/src/main/res/values-hr/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 3fda8528..8bd917ca 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -33,14 +33,14 @@ Dodaj kontakt ili broj … Prijedlozi - Scheduled message - Schedule message - Schedule send - Cancel schedule send - You must pick a time in the future - Keep the phone on and make sure there is nothing killing the app while in background. - Update message - Send now + Zakazana poruka + Raspored poruka + Raspored slanja + Otkaži slanje rasporeda + Morate odabrati vrijeme u budućnosti + Držite telefon uključen i provjerite da ništa ne uništava aplikaciju dok je u pozadini. + Ažuriraj poruku + Pošalji sada Primljene SMS poruke Nova poruka @@ -92,4 +92,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - + \ No newline at end of file From 8b30b1fb125a6e5ad3080932b73f14421300639e Mon Sep 17 00:00:00 2001 From: bgo-eiu Date: Sun, 30 Oct 2022 04:19:59 +0000 Subject: [PATCH 46/61] Translated using Weblate (Punjabi (Pakistan)) Currently translated at 79.6% (51 of 64 strings) Translation: Simple Mobile Tools/Simple SMS Messenger Translate-URL: https://hosted.weblate.org/projects/simple-mobile-tools/simple-sms-messenger/pa_PK/ --- app/src/main/res/values-pa-rPK/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index bd48a699..1e1d9d0a 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -17,7 +17,7 @@ کھرڑا بھیجیا جا رہا اے… سکھر تے لگو - Unpin + لگݨ اُلٹاؤ اگے تصویر نوں چݨے ہوۓ اکار وچ سنکُچت کر نہیں سکدی @@ -33,10 +33,10 @@ سُجھے نیت سنہے - Schedule message + تالکا وچ سنیہا پایو بھیجݨ دی سمان سارݨی بݨاؤ سماں دا بھیجݨ رد کرو - You must pick a time in the future + بھوِکھ وچ سماں چݨیو Keep the phone on and make sure there is nothing killing the app while in background. سنیہا بدلو ہݨے بھیجو @@ -47,7 +47,7 @@ نا پڑھے وجوں چنھت کرو میں - Are you sure you want to delete all messages of this conversation\? + تسیں پکے اے، سارے سنیہے مٹاؤ؟ %d conversation @@ -55,15 +55,15 @@ - %d message - %d messages + %d سنیہا + %d سنیہے Lock screen notification visibility بھیجݨ والا تے سنیہا صرف بھیجݨ والا Enable delivery reports - Remove accents and diacritics at sending messages + سنیہے وچ سارے عراب ہٹاؤ Resize sent MMS images کوئی حد نہیں Outgoing messages @@ -77,12 +77,12 @@ سنیہے ایمپورٹ کرو سنیہے ایمپورٹ کرو میڈیا دیاں سنیہے ایمپورٹ کرو - You have to select at least one item + کجھ چیز چݨیو 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. However, as usually, there are no ads, tracking or analytics whatsoever, the internet is used only for sending MMS. The other end is not receiving my MMS, is there anything I can do about it\? MMS size is limited by carriers, you can try setting a smaller limit in the app settings. - Does the app support scheduled messages\? + ایس اَیپ وچ سنیہاں دا تالکا کیہ اے؟ Yes, you can schedule messages to be sent in the future by long pressing the Send button and picking the desired date and time. \ No newline at end of file From 21c7879c3da6b4b59770c0b832bc18e0d102134c Mon Sep 17 00:00:00 2001 From: bgo-eiu Date: Sun, 30 Oct 2022 04:09:22 +0000 Subject: [PATCH 47/61] Translated using Weblate (Punjabi (Pakistan)) Currently translated at 60.0% (3 of 5 strings) Translation: Simple Mobile Tools/Simple SMS Messenger metadata Translate-URL: https://hosted.weblate.org/projects/simple-mobile-tools/simple-sms-messenger-metadata/pa_PK/ --- fastlane/metadata/android/pa-PK/short_description.txt | 1 + fastlane/metadata/android/pa-PK/title.txt | 1 + 2 files changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/pa-PK/short_description.txt create mode 100644 fastlane/metadata/android/pa-PK/title.txt diff --git a/fastlane/metadata/android/pa-PK/short_description.txt b/fastlane/metadata/android/pa-PK/short_description.txt new file mode 100644 index 00000000..f7aad2be --- /dev/null +++ b/fastlane/metadata/android/pa-PK/short_description.txt @@ -0,0 +1 @@ +آنڈروئیڈ لئی سنیہے دی ایپلیکیشن، جالدی بھیجدے، اِنٹرفیس چنگی اے diff --git a/fastlane/metadata/android/pa-PK/title.txt b/fastlane/metadata/android/pa-PK/title.txt new file mode 100644 index 00000000..30b94791 --- /dev/null +++ b/fastlane/metadata/android/pa-PK/title.txt @@ -0,0 +1 @@ +سادے سنہے From bc327379fa64f05508d8c7000350de4ca3f70716 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 31 Oct 2022 19:40:13 +0000 Subject: [PATCH 48/61] Translated using Weblate (Croatian) Currently translated at 100.0% (64 of 64 strings) Translation: Simple Mobile Tools/Simple SMS Messenger Translate-URL: https://hosted.weblate.org/projects/simple-mobile-tools/simple-sms-messenger/hr/ --- app/src/main/res/values-hr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 8bd917ca..720f9133 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -86,8 +86,8 @@ Nažalost, potreban je za slanje MMS privitaka. Nemogućnost slanja MMS-a bila bi zaista veliki nedostatak u usporedbi s drugim aplikacijama, pa smo odlučili krenuti ovim putem. No, kao i obično, nema reklama, praćenja ili analiziranja podataka, internet se koristi samo za slanje MMS-a. Druga strana ne prima moj MMS. Mogu li išta učiniti po tom pitanju\? Veličinu MMS-a ograničavaju operateri. Možeš pokušati smanjiti ograničenje u postavkama aplikacije. - Does the app support scheduled messages? - Yes, you can schedule messages to be sent in the future by long pressing the Send button and picking the desired date and time. + Podržava li aplikacija zakazane poruke\? + Da, možete zakazati slanje poruka u budućnosti tako da dugo pritisnete gumb Pošalji i odaberete željeni datum i vrijeme. + Duplicate item was not included + и %d друго и %d других и %d други + Нови разговор Додајте контакт или број… Предлози + Заказана порука Закажите поруку Закажите слање - Шаљите дугачке поруке као ММС Откажи слање распореда - Поруке - Извезите поруке - Извези СМС Морате изабрати време у будућности + Држите телефон укључен и уверите се да ништа не убија апликацију док је у позадини. + Ажурирајте поруку + Пошаљи одмах + + Примите СМС + Нова порука + Означи као прочитано + Означи као непрочитанo + Ja + + Да ли сте сигурни да желите да избришете све поруке ове конверзације\? + %d разговор %d разговорa %d разговори + + + %d порука + %d порука + %d порукe + + Видљивост обавештења на закључаном екрану Пошиљалац и порука Само пошиљалац + Омогућите извештаје о испоруци + Уклоните акценте и дијакритичке знакове при слању порука + Промените величину посланих ММС слика + Без лимита + Одлазне поруке Пошаљите групне поруке као ММС + Шаљите дугачке поруке као ММС + + Поруке + Извезите поруке + Извези СМС Извези ММС Увезите поруке Увезите СМС Увези ММС Морате да изаберете најмање једну ставку + Зашто је апликацији потребан приступ интернету\? Нажалост, то је потребно за слање ММС прилога. Немогућност слања ММС-а била би заиста велика мана у поређењу са другим апликацијама, па смо одлучили да идемо овим путем. Међутим, као и обично, нема реклама, праћења или аналитике, интернет се користи само за слање ММС-а. Други крај не прима мој ММС, да ли могу нешто да урадим поводом тога\? Величина ММС-а је ограничена оператерима, можете покушати да подесите мање ограничење у подешавањима апликације. Да ли апликација подржава заказане поруке\? Да, можете заказати слање порука у будућности дугим притиском на дугме Пошаљи и одабиром жељеног датума и времена. - Duplicate item was not included - \ No newline at end of file + From d2895123e975ca1014cc414c58b3a529336a7be4 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Tue, 8 Nov 2022 10:42:57 +0100 Subject: [PATCH 57/61] Delete video.txt --- fastlane/metadata/android/hr/video.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 fastlane/metadata/android/hr/video.txt diff --git a/fastlane/metadata/android/hr/video.txt b/fastlane/metadata/android/hr/video.txt deleted file mode 100644 index 8d8c3507..00000000 --- a/fastlane/metadata/android/hr/video.txt +++ /dev/null @@ -1 +0,0 @@ -video.txt:1 From c91c32989835c331f0d655d88773e5c35107989c Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 8 Nov 2022 10:43:38 +0100 Subject: [PATCH 58/61] updating commons --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 7fd7b75b..46333b6d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ android { } dependencies { - implementation 'com.github.SimpleMobileTools:Simple-Commons:d5ae570e2a' + implementation 'com.github.SimpleMobileTools:Simple-Commons:9162225f33' implementation 'org.greenrobot:eventbus:3.3.1' implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61' implementation 'com.github.tibbi:android-smsmms:3581774c39' From 3e6401e29fe6f3ed37bc54a2d16c95fc9e818653 Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Tue, 8 Nov 2022 09:40:56 +0000 Subject: [PATCH 59/61] Translated using Weblate (Polish) Currently translated at 100.0% (65 of 65 strings) Translation: Simple Mobile Tools/Simple SMS Messenger Translate-URL: https://hosted.weblate.org/projects/simple-mobile-tools/simple-sms-messenger/pl/ --- app/src/main/res/values-pl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 50cbb1d9..847d413d 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -21,7 +21,7 @@ Przekaż dalej Nie udało się skompresować obrazu do wybranego rozmiaru - Duplicate item was not included + Powielony element nie został uwzględniony i %d inny @@ -95,4 +95,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - + \ No newline at end of file From 6e8a55d8333a283b88a017fb7a93df46fd94f530 Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 8 Nov 2022 09:37:52 +0000 Subject: [PATCH 60/61] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (65 of 65 strings) Translation: Simple Mobile Tools/Simple SMS Messenger Translate-URL: https://hosted.weblate.org/projects/simple-mobile-tools/simple-sms-messenger/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d39fd9c8..f51e23d6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -21,10 +21,10 @@ 转发 无法将图像压缩到选定的大小 - Duplicate item was not included + 未包含重复项 - 及 %d 个其他人 + 及其他 %d 个联系人 新的对话 @@ -86,4 +86,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - + \ No newline at end of file From c75dc69d9635b567200356cbe55e07874971cc37 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 8 Nov 2022 10:59:08 +0100 Subject: [PATCH 61/61] updating a slovak string --- app/src/main/res/values-sk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d1fe3311..e59bdd97 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -21,7 +21,7 @@ Preposlať Nepodarilo sa zmenšiť obrázok na požadovanú veľkosť - Duplicate item was not included + Duplicitná položka nebola pridaná a %d ďalší