diff --git a/app/build.gradle b/app/build.gradle
index 0917db47..9e4b754f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -63,12 +63,13 @@ android {
}
dependencies {
- implementation 'com.github.SimpleMobileTools:Simple-Commons:82a8684cd8'
+ implementation 'com.github.SimpleMobileTools:Simple-Commons:141660c8f9'
implementation 'org.greenrobot:eventbus:3.3.1'
implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61'
implementation 'com.github.tibbi:android-smsmms:4cdacdb701'
implementation "me.leolin:ShortcutBadger:1.1.22"
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
+ implementation 'com.googlecode.ez-vcard:ez-vcard:0.11.3'
kapt "androidx.room:room-compiler:2.4.3"
implementation "androidx.room:room-runtime:2.4.3"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e253980e..372a05cd 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -135,6 +135,12 @@
android:label="@string/blocked_numbers"
android:parentActivityName=".activities.SettingsActivity" />
+
+
+ when (menuItem.itemId) {
+ R.id.add_contact -> {
+ val intent = Intent(Intent.ACTION_VIEW).apply {
+ val mimetype = contentResolver.getType(vCardUri)
+ setDataAndType(vCardUri, mimetype?.lowercase())
+ addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ }
+ startActivity(intent)
+ }
+ else -> return@setOnMenuItemClickListener false
+ }
+ return@setOnMenuItemClickListener true
+ }
+ }
+
+ private fun setupContactsList(vCards: List) {
+ val items = prepareData(vCards)
+ val adapter = VCardViewerAdapter(this, items.toMutableList()) { item ->
+ val property = item as? VCardPropertyWrapper
+ if (property != null) {
+ handleClick(item)
+ }
+ }
+ contacts_list.adapter = adapter
+ }
+
+ private fun handleClick(property: VCardPropertyWrapper) {
+ when (property.property) {
+ is Telephone -> dialNumber(property.value.normalizePhoneNumber())
+ is Email -> sendEmailIntent(property.value)
+ }
+ }
+
+ private fun prepareData(vCards: List): List {
+ return vCards.map { vCard -> VCardWrapper.from(this, vCard) }
+ }
+}
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 75c31e54..baddb3ae 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt
@@ -32,13 +32,13 @@ import com.simplemobiletools.smsmessenger.R
import com.simplemobiletools.smsmessenger.activities.NewConversationActivity
import com.simplemobiletools.smsmessenger.activities.SimpleActivity
import com.simplemobiletools.smsmessenger.activities.ThreadActivity
+import com.simplemobiletools.smsmessenger.activities.VCardViewerActivity
import com.simplemobiletools.smsmessenger.dialogs.SelectTextDialog
-import com.simplemobiletools.smsmessenger.extensions.deleteMessage
-import com.simplemobiletools.smsmessenger.extensions.getContactFromAddress
-import com.simplemobiletools.smsmessenger.extensions.updateLastConversationMessage
+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_unknown_attachment.view.*
import kotlinx.android.synthetic.main.item_sent_unknown_attachment.view.*
@@ -53,7 +53,7 @@ class ThreadAdapter(
private var fontSize = activity.getTextSize()
@SuppressLint("MissingPermission")
- private val hasMultipleSIMCards = SubscriptionManager.from(activity).activeSubscriptionInfoList?.size ?: 0 > 1
+ private val hasMultipleSIMCards = (SubscriptionManager.from(activity).activeSubscriptionInfoList?.size ?: 0) > 1
init {
setupDragListener(true)
@@ -290,102 +290,170 @@ class ThreadAdapter(
if (message.attachment?.attachments?.isNotEmpty() == true) {
for (attachment in message.attachment.attachments) {
val mimetype = attachment.mimetype
- val uri = attachment.getUri()
- if (mimetype.startsWith("image/") || mimetype.startsWith("video/")) {
- val imageView = layoutInflater.inflate(R.layout.item_attachment_image, null)
- thread_mesage_attachments_holder.addView(imageView)
+ 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)
+ }
- val placeholderDrawable = ColorDrawable(Color.TRANSPARENT)
- val isTallImage = attachment.height > attachment.width
- val transformation = if (isTallImage) CenterCrop() else FitCenter()
- val options = RequestOptions()
- .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
- .placeholder(placeholderDrawable)
- .transform(transformation)
+ thread_message_play_outline.beVisibleIf(mimetype.startsWith("video/"))
+ }
+ }
+ }
+ }
- var builder = Glide.with(context)
- .load(uri)
- .transition(DrawableTransitionOptions.withCrossFade())
- .apply(options)
- .listener(object : RequestListener {
- override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
- thread_message_play_outline.beGone()
- thread_mesage_attachments_holder.removeView(imageView)
- return false
- }
+ private fun setupImageView(holder: ViewHolder, parent: View, message: Message, attachment: Attachment) {
+ val mimetype = attachment.mimetype
+ val uri = attachment.getUri()
+ parent.apply {
+ val imageView = layoutInflater.inflate(R.layout.item_attachment_image, null)
+ thread_mesage_attachments_holder.addView(imageView)
- override fun onResourceReady(dr: Drawable?, a: Any?, t: Target?, d: DataSource?, i: Boolean) =
- false
- })
+ val placeholderDrawable = ColorDrawable(Color.TRANSPARENT)
+ val isTallImage = attachment.height > attachment.width
+ val transformation = if (isTallImage) CenterCrop() else FitCenter()
+ val options = RequestOptions()
+ .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
+ .placeholder(placeholderDrawable)
+ .transform(transformation)
- builder = if (isTallImage) {
- builder.override(attachment.width, attachment.width)
+ var builder = Glide.with(context)
+ .load(uri)
+ .transition(DrawableTransitionOptions.withCrossFade())
+ .apply(options)
+ .listener(object : RequestListener {
+ override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
+ thread_message_play_outline.beGone()
+ thread_mesage_attachments_holder.removeView(imageView)
+ return false
+ }
+
+ override fun onResourceReady(dr: Drawable?, a: Any?, t: Target?, d: DataSource?, i: Boolean) =
+ false
+ })
+
+ builder = if (isTallImage) {
+ builder.override(attachment.width, attachment.width)
+ } else {
+ builder.override(attachment.width, attachment.height)
+ }
+
+ builder.into(imageView.attachment_image)
+ imageView.attachment_image.setOnClickListener {
+ if (actModeCallback.isSelectable) {
+ holder.viewClicked(message)
+ } else {
+ launchViewIntent(uri, mimetype, attachment.filename)
+ }
+ }
+ imageView.setOnLongClickListener {
+ holder.viewLongClicked()
+ true
+ }
+ }
+ }
+
+ private fun setupVCardView(holder: ViewHolder, parent: View, message: Message, attachment: Attachment) {
+ 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)
+ }
+ thread_mesage_attachments_holder.addView(vCardView)
+
+ parseVCardFromUri(context, uri) { vCards ->
+ val title = vCards.firstOrNull()?.formattedName?.value
+ 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 {
- builder.override(attachment.width, attachment.height)
+ vcard_subtitle.beGone()
}
- builder.into(imageView.attachment_image)
- imageView.attachment_image.setOnClickListener {
+ 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
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private fun setupFileView(holder: ViewHolder, parent: View, message: Message, attachment: Attachment) {
+ 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)
}
}
- imageView.setOnLongClickListener {
+ setOnLongClickListener {
holder.viewLongClicked()
true
}
- } else {
- 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
- }
- }
+ }
+ }
+ 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)
}
- 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
- }
- }
- }
- thread_mesage_attachments_holder.addView(attachmentView)
+ }
+ setOnLongClickListener {
+ holder.viewLongClicked()
+ true
}
}
-
- thread_message_play_outline.beVisibleIf(mimetype.startsWith("video/"))
}
+ thread_mesage_attachments_holder.addView(attachmentView)
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/VCardViewerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/VCardViewerAdapter.kt
new file mode 100644
index 00000000..2b08b175
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/VCardViewerAdapter.kt
@@ -0,0 +1,153 @@
+package com.simplemobiletools.smsmessenger.adapters
+
+import android.util.TypedValue
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.graphics.drawable.toDrawable
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.engine.DiskCacheStrategy
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
+import com.bumptech.glide.request.RequestOptions
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.SimpleContactsHelper
+import com.simplemobiletools.smsmessenger.R
+import com.simplemobiletools.smsmessenger.activities.SimpleActivity
+import com.simplemobiletools.smsmessenger.models.VCardPropertyWrapper
+import com.simplemobiletools.smsmessenger.models.VCardWrapper
+import kotlinx.android.synthetic.main.item_vcard_contact.view.*
+import kotlinx.android.synthetic.main.item_vcard_contact_property.view.*
+
+class VCardViewerAdapter(
+ activity: SimpleActivity, private var items: MutableList, private val itemClick: (Any) -> Unit
+) : RecyclerView.Adapter() {
+
+ private var fontSize = activity.getTextSize()
+ private var textColor = activity.getProperTextColor()
+ private val layoutInflater = activity.layoutInflater
+
+ override fun getItemCount() = items.size
+
+ override fun getItemViewType(position: Int): Int {
+ return when (val item = items[position]) {
+ is VCardWrapper -> R.layout.item_vcard_contact
+ is VCardPropertyWrapper -> R.layout.item_vcard_contact_property
+ else -> throw IllegalArgumentException("Unexpected type: ${item::class.simpleName}")
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VCardViewHolder {
+ val view = layoutInflater.inflate(viewType, parent, false)
+ return VCardViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: VCardViewerAdapter.VCardViewHolder, position: Int) {
+ val item = items[position]
+ val itemView = holder.bindView()
+ when (item) {
+ is VCardWrapper -> setupVCardView(itemView, item)
+ is VCardPropertyWrapper -> setupVCardPropertyView(itemView, item)
+ else -> throw IllegalArgumentException("Unexpected type: ${item::class.simpleName}")
+ }
+ }
+
+ private fun setupVCardView(view: View, item: VCardWrapper) {
+ val name = item.fullName
+ view.apply {
+ item_contact_name.apply {
+ text = name
+ setTextColor(textColor)
+ setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 1.2f)
+ }
+ item_contact_image.apply {
+ val photo = item.vCard.photos.firstOrNull()
+ val placeholder = if (name != null) {
+ SimpleContactsHelper(context).getContactLetterIcon(name).toDrawable(resources)
+ } else {
+ null
+ }
+ val roundingRadius = resources.getDimensionPixelSize(R.dimen.big_margin)
+ val transformation = RoundedCorners(roundingRadius)
+ val options = RequestOptions()
+ .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
+ .placeholder(placeholder)
+ .transform(transformation)
+ Glide.with(this)
+ .load(photo?.data ?: photo?.url)
+ .apply(options)
+ .transition(DrawableTransitionOptions.withCrossFade())
+ .into(this)
+ }
+ expand_collapse_icon.apply {
+ val expandCollapseDrawable = if (item.expanded) {
+ R.drawable.ic_collapse_up
+ } else {
+ R.drawable.ic_expand_down
+ }
+ setImageResource(expandCollapseDrawable)
+ applyColorFilter(textColor)
+ }
+
+ if (items.size > 1) {
+ setOnClickListener {
+ expandOrCollapseRow(view, item)
+ }
+ }
+ onGlobalLayout {
+ if (items.size == 1) {
+ expandOrCollapseRow(view, item)
+ view.expand_collapse_icon.beGone()
+ }
+ }
+ }
+ }
+
+ private fun setupVCardPropertyView(view: View, property: VCardPropertyWrapper) {
+ view.apply {
+ item_vcard_property_title.apply {
+ text = property.value
+ setTextColor(textColor)
+ setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 1.2f)
+ }
+ item_vcard_property_subtitle.apply {
+ text = property.type
+ setTextColor(textColor)
+ }
+ view.setOnClickListener {
+ itemClick(property)
+ }
+ }
+ }
+
+ private fun expandOrCollapseRow(view: View, item: VCardWrapper) {
+ val properties = item.properties
+ if (item.expanded) {
+ collapseRow(view, properties, item)
+ } else {
+ expandRow(view, properties, item)
+ }
+ }
+
+ private fun expandRow(view: View, properties: List, vCardWrapper: VCardWrapper) {
+ vCardWrapper.expanded = true
+ val nextPosition = items.indexOf(vCardWrapper) + 1
+ items.addAll(nextPosition, properties)
+ notifyItemRangeInserted(nextPosition, properties.size)
+ view.expand_collapse_icon.setImageResource(R.drawable.ic_collapse_up)
+ }
+
+ private fun collapseRow(view: View, properties: List, vCardWrapper: VCardWrapper) {
+ vCardWrapper.expanded = false
+ val nextPosition = items.indexOf(vCardWrapper) + 1
+ repeat(properties.size) {
+ items.removeAt(nextPosition)
+ }
+ notifyItemRangeRemoved(nextPosition, properties.size)
+ view.expand_collapse_icon.setImageResource(R.drawable.ic_expand_down)
+ }
+
+ inner class VCardViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ fun bindView() = itemView
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Date.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Date.kt
new file mode 100644
index 00000000..7cde1a5b
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Date.kt
@@ -0,0 +1,8 @@
+package com.simplemobiletools.smsmessenger.extensions
+
+import android.text.format.DateFormat
+import java.util.*
+
+fun Date.format(pattern: String): String {
+ return DateFormat.format(pattern, this).toString()
+}
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 acdf0bb9..89fb0f03 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/String.kt
@@ -14,3 +14,8 @@ fun String.getExtensionFromMimeType(): String {
fun String.isImageMimeType(): Boolean {
return lowercase().startsWith("image")
}
+
+fun String.isVCardMimeType(): Boolean {
+ val lowercase = lowercase()
+ return lowercase.endsWith("x-vcard") || lowercase.endsWith("vcard")
+}
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 21a85a95..973e56bc 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
@@ -28,6 +28,7 @@ const val EXPORT_FILE_EXT = ".json"
const val IMPORT_SMS = "import_sms"
const val IMPORT_MMS = "import_mms"
const val WAS_DB_CLEARED = "was_db_cleared_2"
+const val EXTRA_VCARD_URI = "vcard"
private const val PATH = "com.simplemobiletools.smsmessenger.action."
const val MARK_AS_READ = PATH + "mark_as_read"
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardParser.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardParser.kt
new file mode 100644
index 00000000..e01217bf
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/VCardParser.kt
@@ -0,0 +1,15 @@
+package com.simplemobiletools.smsmessenger.helpers
+
+import android.content.Context
+import android.net.Uri
+import com.simplemobiletools.commons.helpers.ensureBackgroundThread
+import ezvcard.Ezvcard
+import ezvcard.VCard
+
+fun parseVCardFromUri(context: Context, uri: Uri, callback: (vCards: List) -> Unit) {
+ ensureBackgroundThread {
+ val inputStream = context.contentResolver.openInputStream(uri)
+ val vCards = Ezvcard.parse(inputStream).all()
+ callback(vCards)
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/VCard.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/VCard.kt
new file mode 100644
index 00000000..c1869500
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/VCard.kt
@@ -0,0 +1,75 @@
+package com.simplemobiletools.smsmessenger.models
+
+import android.content.Context
+import com.simplemobiletools.commons.extensions.normalizePhoneNumber
+import com.simplemobiletools.smsmessenger.R
+import com.simplemobiletools.smsmessenger.extensions.config
+import com.simplemobiletools.smsmessenger.extensions.format
+import ezvcard.VCard
+import ezvcard.property.*
+
+private val displayedPropertyClasses = arrayOf(
+ Telephone::class.java, Email::class.java, Organization::class.java, Birthday::class.java, Anniversary::class.java, Note::class.java
+)
+
+data class VCardWrapper(val vCard: VCard, val fullName: String?, val properties: List, var expanded: Boolean = false) {
+
+ companion object {
+ private fun VCard.extractFullName(): String? {
+ var fullName = formattedName?.value
+ if (fullName.isNullOrEmpty()) {
+ val structured = structuredName
+ val given = structured?.given
+ val family = structured.family
+ fullName = if (family != null) {
+ given?.plus(" ")?.plus(family)
+ } else {
+ given
+ }
+ }
+ return fullName
+ }
+
+ fun from(context: Context, vCard: VCard): VCardWrapper {
+ val properties = vCard.properties
+ .filter { displayedPropertyClasses.contains(it::class.java) }
+ .map { VCardPropertyWrapper.from(context, it) }
+ .distinctBy { it.value }
+ val fullName = vCard.extractFullName()
+
+ return VCardWrapper(vCard, fullName, properties)
+ }
+ }
+}
+
+data class VCardPropertyWrapper(val value: String, val type: String, val property: VCardProperty) {
+
+ companion object {
+ private const val CELL = "CELL"
+ private const val HOME = "HOME"
+ private const val WORK = "WORK"
+
+ private fun VCardProperty.getPropertyTypeString(context: Context): String {
+ return when (parameters.type) {
+ CELL -> context.getString(R.string.mobile)
+ HOME -> context.getString(R.string.home)
+ WORK -> context.getString(R.string.work)
+ else -> ""
+ }
+ }
+
+ fun from(context: Context, property: VCardProperty): VCardPropertyWrapper {
+ return property.run {
+ when (this) {
+ is Telephone -> VCardPropertyWrapper(text.normalizePhoneNumber(), getPropertyTypeString(context), property)
+ is Email -> VCardPropertyWrapper(value, getPropertyTypeString(context), property)
+ is Organization -> VCardPropertyWrapper(values.joinToString(), context.getString(R.string.work), property)
+ is Birthday -> VCardPropertyWrapper(date.format(context.config.dateFormat), context.getString(R.string.birthday), property)
+ is Anniversary -> VCardPropertyWrapper(date.format(context.config.dateFormat), context.getString(R.string.anniversary), property)
+ is Note -> VCardPropertyWrapper(value, context.getString(R.string.notes), property)
+ else -> VCardPropertyWrapper("", "", property)
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/res/drawable/ic_collapse_up.xml b/app/src/main/res/drawable/ic_collapse_up.xml
new file mode 100644
index 00000000..fca0e627
--- /dev/null
+++ b/app/src/main/res/drawable/ic_collapse_up.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_expand_down.xml b/app/src/main/res/drawable/ic_expand_down.xml
new file mode 100644
index 00000000..1506c3b0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_expand_down.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_vcard_viewer.xml b/app/src/main/res/layout/activity_vcard_viewer.xml
new file mode 100644
index 00000000..46356502
--- /dev/null
+++ b/app/src/main/res/layout/activity_vcard_viewer.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_attachment_vcard.xml b/app/src/main/res/layout/item_attachment_vcard.xml
new file mode 100644
index 00000000..36339f34
--- /dev/null
+++ b/app/src/main/res/layout/item_attachment_vcard.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_vcard_contact.xml b/app/src/main/res/layout/item_vcard_contact.xml
new file mode 100644
index 00000000..6246baa6
--- /dev/null
+++ b/app/src/main/res/layout/item_vcard_contact.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_vcard_contact_property.xml b/app/src/main/res/layout/item_vcard_contact_property.xml
new file mode 100644
index 00000000..1b1789b5
--- /dev/null
+++ b/app/src/main/res/layout/item_vcard_contact_property.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/menu_vcard.xml b/app/src/main/res/menu/menu_vcard.xml
new file mode 100644
index 00000000..57556649
--- /dev/null
+++ b/app/src/main/res/menu/menu_vcard.xml
@@ -0,0 +1,9 @@
+
+
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 4c3e6fc2..eeebe406 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -20,6 +20,11 @@
ازالة التثبيت
اعادة ارسال
غير قادر على ضغط الصورة إلى الحجم المحدد
+
+
+ - and %d other
+ - and %d others
+
محادثة جديدة
إضافة جهة اتصال أو رقم …
@@ -79,4 +84,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 06a7ea86..33fb6e50 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
New conversation
Add Contact or Number…
@@ -71,4 +76,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-be/strings.xml b/app/src/main/res/values-be/strings.xml
index 9c6cfad5..7da4ac30 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -20,6 +20,11 @@
Адмацаваць
Пераслаць
Немагчыма сціснуць выяву да выбранага памеру
+
+
+ - and %d other
+ - and %d others
+
Новая размова
Дадаць кантакт альбо нумар…
@@ -75,4 +80,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-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index f14a1840..8699e0fe 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -20,6 +20,11 @@
Откачване
Препращане
Невъзможно е да се компресира изображението до избрания размер
+
+
+ - and %d other
+ - and %d others
+
Нов разговор
Добавете контакт или номер…
@@ -71,4 +76,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-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 1f76b105..3020e3dd 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -20,6 +20,11 @@
No fixis
Reenvia
No s\'ha pogut comprimir la imatge a la mida seleccionada
+
+
+ - and %d other
+ - and %d others
+
Conversa nova
Afegeix un contacte o número…
@@ -71,4 +76,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 ce1f6df3..762434d8 100644
--- a/app/src/main/res/values-cr/strings.xml
+++ b/app/src/main/res/values-cr/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
New conversation
Add Contact or Number…
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index ccccfcaf..bae416c1 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -20,6 +20,11 @@
Odepnout
Přeposlat
Nepodařilo se komprimovat obrázek na požadovanou velikost
+
+
+ - and %d other
+ - and %d others
+
Nová konverzace
Přidejte kontakt nebo číslo…
@@ -73,4 +78,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-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 4bff71f6..9ffe5f57 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -20,6 +20,11 @@
Frigør
Fremad
Billedet kan ikke komprimeres til den valgte størrelse
+
+
+ - and %d other
+ - and %d others
+
Ny Samtale
Tilføj kontakt eller nummer…
@@ -71,4 +76,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-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 7412f4e3..c3c03b91 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -20,6 +20,11 @@
Losheften
Weiterleiten
Bild kann nicht auf ausgewählte Größe komprimiert werden
+
+
+ - and %d other
+ - and %d others
+
Neuer Chat
Kontakt oder Nummer hinzufügen …
@@ -71,4 +76,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 a4de4eb9..a4cc9963 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -20,6 +20,11 @@
Ξεκαρφίτσωμα
Προώθηση
Αδυναμία συμπίεσης εικόνας στο επιλεγμένο μέγεθος
+
+
+ - and %d other
+ - and %d others
+
Νέα συνομιλία
Προσθήκη επαφής ή αριθμού…
@@ -71,4 +76,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-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index da1e085b..1e59e6ed 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -20,6 +20,11 @@
Depingli
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
New conversation
Add Contact or Number…
@@ -71,4 +76,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-es/strings.xml b/app/src/main/res/values-es/strings.xml
index b3d85c2e..689f7acc 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -20,6 +20,11 @@
Desanclar
Reenviar
Incapaz de comprimir la imagen al tamaño seleccionado
+
+
+ - and %d other
+ - and %d others
+
Nueva conversación
Escribe contacto o número…
@@ -71,4 +76,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 5e1c0a1d..6ca9ee5f 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -20,6 +20,11 @@
Eemalda kinnitus
Edasta
Pildi muutmine valitud suurusesse ei õnnestu
+
+
+ - and %d other
+ - and %d others
+
Uus vestlus
Add Contact or Number…
@@ -71,4 +76,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 5124ec80..86fa2c63 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
Uusi keskustelu
Lisää yhteystieto tai numero…
@@ -71,4 +76,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-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 220d7eb5..7c74ac8f 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -20,6 +20,11 @@
Désépingler
Transférer
Impossible de compresser l\'image à la taille sélectionnée
+
+
+ - and %d other
+ - and %d others
+
Nouvelle conversation
Ajouter un contact ou un numéro…
@@ -71,4 +76,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 15aedaec..85b6ca02 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
Nova conversa
Engadir contacto ou número…
@@ -71,4 +76,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-gr/strings.xml b/app/src/main/res/values-gr/strings.xml
index ce1f6df3..762434d8 100644
--- a/app/src/main/res/values-gr/strings.xml
+++ b/app/src/main/res/values-gr/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
New conversation
Add Contact or Number…
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index ce1f6df3..762434d8 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
New conversation
Add Contact or Number…
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 9f5e739d..d96a714f 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -20,6 +20,11 @@
Otkvači
Proslijedi
Isključi za komprimiranje slike na odabranu veličinu
+
+
+ - and %d other
+ - and %d others
+
Nova konverzacija
Dodaj kontakt ili broj …
@@ -73,4 +78,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-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 6af63212..8c8bd17d 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -20,6 +20,11 @@
Kitűzés megszüntetése
Továbbítás
Nem lehet tömöríteni a képet a kiválasztott méretre
+
+
+ - and %d other
+ - and %d others
+
Új beszélgetés
Névjegy vagy szám hozzáadása…
@@ -71,4 +76,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-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 6e9afd42..8b8b650f 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
Percakapan baru
Tambahkan Kontak atau Nomor…
@@ -69,4 +74,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-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 06721ecc..f3b750f6 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -20,6 +20,11 @@
Rimuovi
Inoltra
Impossibile comprimere l\'immagine alla dimensione selezionata
+
+
+ - and %d other
+ - and %d others
+
Nuova conversazione
Inserisci contatto o numero…
@@ -71,4 +76,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 ba2ca917..bd49490f 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -20,6 +20,11 @@
בטל הצמדה
התקדם
לא ניתן לדחוס תמונה לגודל שנבחר
+
+
+ - and %d other
+ - and %d others
+
שיחה חדשה
הוסף איש קשר או מספר…
@@ -75,4 +80,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-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 01451200..2584a57b 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -20,6 +20,11 @@
固定を外す
転送
選択したサイズに画像を圧縮できません
+
+
+ - and %d other
+ - and %d others
+
新しい会話
連絡先や電話番号を追加…
@@ -69,4 +74,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 e52c8a64..ff890fd0 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -20,6 +20,11 @@
Atjunkite
Pirmyn
Nepavyksta suspausti vaizdo iki pasirinkto dydžio
+
+
+ - and %d other
+ - and %d others
+
Naujas pokalbis
Pridėti kontaktą arba numerį…
@@ -73,4 +78,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-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index ce1f6df3..762434d8 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
New conversation
Add Contact or Number…
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index ce1f6df3..762434d8 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
New conversation
Add Contact or Number…
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index 975d3015..1f838afe 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
പുതിയ സംഭാഷണം
കോൺടാക്റ്റ് അല്ലെങ്കിൽ നമ്പർ ചേർക്കുക…
@@ -71,4 +76,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-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index d066aa15..e455377f 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -20,6 +20,11 @@
Løsne
Videresend
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
Ny samtale
Legg til kontakt eller nummer …
@@ -71,4 +76,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-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 37e9242e..a43a5bdd 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -20,6 +20,11 @@
Losmaken
Doorsturen
Kon de afbeelding niet comprimeren naar de gekozen grootte
+
+
+ - and %d other
+ - and %d others
+
Nieuw gesprek
Contact of nummer toevoegen…
@@ -71,4 +76,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-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 816a4603..3fa2f694 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -20,6 +20,11 @@
Odepnij
Przekaż dalej
Nie udało się skompresować obrazu do wybranego rozmiaru
+
+
+ - and %d other
+ - and %d others
+
Nowa rozmowa
Dodaj kontakt lub numer…
@@ -75,4 +80,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 2006873b..9a5c10e9 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -20,6 +20,11 @@
Desfixar
Encaminhar
Não pôde comprimir imagem ao tamanho selecionado
+
+
+ - and %d other
+ - and %d others
+
Nova conversa
Adicionar contato ou número…
@@ -71,4 +76,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/strings.xml b/app/src/main/res/values-pt/strings.xml
index 59a87c38..5daa9a7f 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -20,6 +20,11 @@
Desafixar
Reencaminhar
Incapaz de comprimir imagem no tamanho selecionado
+
+
+ - and %d other
+ - and %d others
+
Nova conversa
Adicionar contacto ou número…
@@ -71,4 +76,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-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index e2b584ab..18a904bc 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -20,6 +20,11 @@
Elimină fixarea
Redirecţionare
Nu se poate comprima imaginea la dimensiunea selectată
+
+
+ - and %d other
+ - and %d others
+
Conversaţie nouă
Adaugă contact sau număr de telefon…
@@ -73,4 +78,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-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 153a9c03..34a78997 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -20,6 +20,11 @@
Открепить
Переслать
Невозможно сжать изображение до выбранного размера
+
+
+ - and %d other
+ - and %d others
+
Новая переписка
Добавить контакт или номер…
@@ -75,4 +80,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 d536ebce..bb5913d2 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -20,6 +20,11 @@
Odopnúť
Preposlať
Nepodarilo sa zmenšiť obrázok na požadovanú veľkosť
+
+
+ - a %d ďalší
+ - a %d ďalší
+
Nová konverzácia
Pridať kontakt alebo číslo…
@@ -73,4 +78,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-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index ce1f6df3..762434d8 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
New conversation
Add Contact or Number…
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 8cefe0ed..fec82ad4 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -20,6 +20,11 @@
Lossa
Vidarebefordra
Det gick inte att komprimera bilden till den valda storleken
+
+
+ - and %d other
+ - and %d others
+
Ny konversation
Lägg till kontakt eller nummer…
@@ -71,4 +76,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 989088d0..8ebd9379 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -20,6 +20,11 @@
பின் நீக்கு
முன்னோக்கி
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
புதிய உரையாடல்
தொடர்பு அல்லது எண்ணைச் சேர்க்கவும்…
@@ -71,4 +76,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-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 0c422d3b..c40166de 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
New conversation
Add Contact or Number…
@@ -69,4 +74,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-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index a13d1214..2d8828e6 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -20,6 +20,11 @@
Sabitlemeyi kaldır
İlet
Resim seçilen boyuta sıkıştırılamıyor
+
+
+ - and %d other
+ - and %d others
+
Yeni görüşme
Kişi veya Numara Ekle…
@@ -71,4 +76,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 4252edbe..a54a46c5 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -20,6 +20,11 @@
Відкріпити
Переслати
Не вдається стиснути зображення до вибраного розміру
+
+
+ - and %d other
+ - and %d others
+
Нове листування
Додати контакт аба номер…
@@ -75,4 +80,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-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index f16f5033..3dae46c2 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -20,6 +20,11 @@
取消固定
转发
无法将图像压缩到选定的大小
+
+
+ - and %d other
+ - and %d others
+
新的对话
添加联系人或者号码…
@@ -69,4 +74,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 670239ce..da489f1c 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -20,6 +20,11 @@
取消釘選
轉傳
無法將圖片壓縮至指定大小
+
+
+ - and %d other
+ - and %d others
+
新對話
新增聯絡對象或電話號碼……
@@ -69,4 +74,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/dimens.xml b/app/src/main/res/values/dimens.xml
index 5411875a..68e9a072 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -6,4 +6,5 @@
60dp
24dp
15dp
+ 64dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ce1f6df3..762434d8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -20,6 +20,11 @@
Unpin
Forward
Unable to compress image to selected size
+
+
+ - and %d other
+ - and %d others
+
New conversation
Add Contact or Number…