From 8d75d5b133895bfc735ae77786285a1d4fbac7de Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 23 Oct 2022 18:34:43 +0530 Subject: [PATCH 01/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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 ccacc511561ada9f9fae0e62b62323b84fe051ef Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 7 Nov 2022 20:22:22 +0530 Subject: [PATCH 36/40] 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 37/40] 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 38/40] 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 39/40] 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 40/40] 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) {