diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt index 9ccf8733d..5760e85d0 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt @@ -13,14 +13,18 @@ import android.annotation.SuppressLint import android.content.Context import android.content.res.ColorStateList import android.graphics.Typeface +import android.text.SpannableStringBuilder +import android.text.Spanned import android.text.TextUtils import android.text.format.DateUtils +import android.text.style.ImageSpan import android.view.View import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import com.nextcloud.talk.R import com.nextcloud.talk.adapters.items.ConversationItem.ConversationItemViewHolder import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication +import com.nextcloud.talk.chat.data.model.ChatMessage import com.nextcloud.talk.chat.data.model.ChatMessage.MessageType import com.nextcloud.talk.data.database.mappers.asModel import com.nextcloud.talk.data.user.model.User @@ -209,7 +213,6 @@ class ConversationItem( R.drawable.ic_avatar_document ) ) - false } @@ -229,7 +232,7 @@ class ConversationItem( if (!TextUtils.isEmpty(chatMessage?.systemMessage) || ConversationEnums.ConversationType.ROOM_SYSTEM === model.type ) { - holder.binding.dialogLastMessage.text = chatMessage?.text + holder.binding.dialogLastMessage.text = chatMessage.text } else { chatMessage?.activeUser = user @@ -249,7 +252,7 @@ class ConversationItem( } } - private fun calculateRegularLastMessageText(appContext: Context): String { + private fun calculateRegularLastMessageText(appContext: Context): CharSequence { return if (chatMessage?.actorId == user.userId) { String.format( appContext.getString(R.string.nc_formatted_message_you), @@ -331,7 +334,7 @@ class ConversationItem( this.header = header } - private val lastMessageDisplayText: String + private val lastMessageDisplayText: CharSequence get() { if (chatMessage?.getCalculateMessageType() == MessageType.REGULAR_TEXT_MESSAGE || chatMessage?.getCalculateMessageType() == MessageType.SYSTEM_MESSAGE || @@ -351,33 +354,21 @@ class ConversationItem( chatMessage?.getNullsafeActorDisplayName() ) } - } else if (MessageType.SINGLE_NC_ATTACHMENT_MESSAGE == chatMessage?.getCalculateMessageType()) { - return if (chatMessage?.actorId == chatMessage?.activeUser!!.userId) { - sharedApplication!!.getString(R.string.nc_sent_an_attachment_you) - } else { - String.format( - sharedApplication!!.resources.getString(R.string.nc_sent_an_attachment), - chatMessage?.getNullsafeActorDisplayName() - ) - } } else if (MessageType.SINGLE_NC_GEOLOCATION_MESSAGE == chatMessage?.getCalculateMessageType()) { - return if (chatMessage?.actorId == chatMessage?.activeUser!!.userId) { - sharedApplication!!.getString(R.string.nc_sent_location_you) - } else { - String.format( - sharedApplication!!.resources.getString(R.string.nc_sent_location), - chatMessage?.getNullsafeActorDisplayName() - ) - } + var locationName = chatMessage.messageParameters?.get("object")?.get("name") ?: "" + val author = authorName(chatMessage) + val lastMessage = + setLastNameForAttachmentMessage(author, R.drawable.baseline_location_pin_24, locationName) + return lastMessage } else if (MessageType.VOICE_MESSAGE == chatMessage?.getCalculateMessageType()) { - return if (chatMessage?.actorId == chatMessage?.activeUser!!.userId) { - sharedApplication!!.getString(R.string.nc_sent_voice_you) - } else { - String.format( - sharedApplication!!.resources.getString(R.string.nc_sent_voice), - chatMessage?.getNullsafeActorDisplayName() - ) - } + var voiceMessageName = chatMessage.messageParameters?.get("file")?.get("name") ?: "" + val author = authorName(chatMessage) + val lastMessage = setLastNameForAttachmentMessage( + author, + R.drawable.baseline_mic_24, + voiceMessageName + ) + return lastMessage } else if (MessageType.SINGLE_LINK_AUDIO_MESSAGE == chatMessage?.getCalculateMessageType()) { return if (chatMessage?.actorId == chatMessage?.activeUser!!.userId) { sharedApplication!!.getString(R.string.nc_sent_an_audio_you) @@ -406,28 +397,77 @@ class ConversationItem( ) } } else if (MessageType.POLL_MESSAGE == chatMessage?.getCalculateMessageType()) { - return if (chatMessage?.actorId == chatMessage?.activeUser!!.userId) { - sharedApplication!!.getString(R.string.nc_sent_poll_you) - } else { - String.format( - sharedApplication!!.resources.getString(R.string.nc_sent_poll), - chatMessage?.getNullsafeActorDisplayName() - ) + var pollMessageTitle = chatMessage.messageParameters?.get("object")?.get("name") ?: "" + val author = authorName(chatMessage) + val lastMessage = setLastNameForAttachmentMessage( + author, + R.drawable.baseline_bar_chart_24, + pollMessageTitle + ) + return lastMessage + } else if (MessageType.SINGLE_NC_ATTACHMENT_MESSAGE == chatMessage?.getCalculateMessageType()) { + var attachmentName = chatMessage.message + if (attachmentName == "{file}") { + attachmentName = chatMessage.messageParameters?.get("file")?.get("name") } + val author = authorName(chatMessage) + + val drawable = chatMessage.messageParameters?.get("file")?.get("mimetype")?.let { + when { + it.contains("image") -> R.drawable.baseline_image_24 + it.contains("video") -> R.drawable.baseline_video_24 + it.contains("application") -> R.drawable.baseline_insert_drive_file_24 + it.contains("audio") -> R.drawable.baseline_audiotrack_24 + it.contains("text/vcard") -> R.drawable.baseline_contacts_24 + else -> null + } + } + val lastMessage = setLastNameForAttachmentMessage(author, drawable, attachmentName!!) + return lastMessage } else if (MessageType.DECK_CARD == chatMessage?.getCalculateMessageType()) { - return if (chatMessage?.actorId == chatMessage?.activeUser!!.userId) { - sharedApplication!!.getString(R.string.nc_sent_deck_card_you) - } else { - String.format( - sharedApplication!!.resources.getString(R.string.nc_sent_deck_card), - chatMessage?.getNullsafeActorDisplayName() - ) - } + var deckTitle = chatMessage.messageParameters?.get("object")?.get("name") ?: "" + val author = authorName(chatMessage) + val lastMessage = setLastNameForAttachmentMessage(author, R.drawable.baseline_article_24, deckTitle) + return lastMessage } } return "" } + fun authorName(chatMessage: ChatMessage): String { + val name = if (chatMessage.actorId == chatMessage.activeUser!!.userId) { + sharedApplication!!.resources.getString(R.string.nc_current_user) + } else { + chatMessage.getNullsafeActorDisplayName()?.let { "$it:" } ?: "" + } + return name + } + + fun setLastNameForAttachmentMessage(actor: String, icon: Int?, attachmentName: String): SpannableStringBuilder { + val builder = SpannableStringBuilder() + builder.append(actor) + + val drawable = icon?.let { it -> ContextCompat.getDrawable(context, it) } + if (drawable != null) { + viewThemeUtils.platform.colorDrawable( + drawable, + context.resources.getColor(R.color.low_emphasis_text, null) + ) + val desiredWidth = (drawable.intrinsicWidth * IMAGE_SCALE_FACTOR).toInt() + val desiredHeight = (drawable.intrinsicHeight * IMAGE_SCALE_FACTOR).toInt() + drawable.setBounds(0, 0, desiredWidth, desiredHeight) + + val imageSpan = ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM) + val startImage = builder.length + builder.append(" ") + builder.setSpan(imageSpan, startImage, startImage + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + } else { + builder.append(" ") + } + builder.append(attachmentName) + return builder + } + class ConversationItemViewHolder(view: View?, adapter: FlexibleAdapter<*>?) : FlexibleViewHolder(view, adapter) { var binding: RvItemConversationWithLastMessageBinding @@ -442,5 +482,6 @@ class ConversationItem( private const val STATUS_SIZE_IN_DP = 9f private const val UNREAD_BUBBLE_STROKE_WIDTH = 6.0f private const val UNREAD_MESSAGES_TRESHOLD = 1000 + private const val IMAGE_SCALE_FACTOR = 0.7f } } diff --git a/app/src/main/res/drawable/baseline_article_24.xml b/app/src/main/res/drawable/baseline_article_24.xml new file mode 100644 index 000000000..2f6ed464a --- /dev/null +++ b/app/src/main/res/drawable/baseline_article_24.xml @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/baseline_audiotrack_24.xml b/app/src/main/res/drawable/baseline_audiotrack_24.xml new file mode 100644 index 000000000..f825aaaa2 --- /dev/null +++ b/app/src/main/res/drawable/baseline_audiotrack_24.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/app/src/main/res/drawable/baseline_bar_chart_24.xml b/app/src/main/res/drawable/baseline_bar_chart_24.xml new file mode 100644 index 000000000..033bf2aa3 --- /dev/null +++ b/app/src/main/res/drawable/baseline_bar_chart_24.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/baseline_contacts_24.xml b/app/src/main/res/drawable/baseline_contacts_24.xml new file mode 100644 index 000000000..4d07d6007 --- /dev/null +++ b/app/src/main/res/drawable/baseline_contacts_24.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/app/src/main/res/drawable/baseline_image_24.xml b/app/src/main/res/drawable/baseline_image_24.xml new file mode 100644 index 000000000..07209096f --- /dev/null +++ b/app/src/main/res/drawable/baseline_image_24.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/app/src/main/res/drawable/baseline_insert_drive_file_24.xml b/app/src/main/res/drawable/baseline_insert_drive_file_24.xml new file mode 100644 index 000000000..4ce0dfc55 --- /dev/null +++ b/app/src/main/res/drawable/baseline_insert_drive_file_24.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/baseline_location_pin_24.xml b/app/src/main/res/drawable/baseline_location_pin_24.xml new file mode 100644 index 000000000..35a523a0f --- /dev/null +++ b/app/src/main/res/drawable/baseline_location_pin_24.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/app/src/main/res/drawable/baseline_mic_24.xml b/app/src/main/res/drawable/baseline_mic_24.xml new file mode 100644 index 000000000..3a53969f3 --- /dev/null +++ b/app/src/main/res/drawable/baseline_mic_24.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/app/src/main/res/drawable/baseline_video_24.xml b/app/src/main/res/drawable/baseline_video_24.xml new file mode 100644 index 000000000..16a43fbd2 --- /dev/null +++ b/app/src/main/res/drawable/baseline_video_24.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e34c0fa2..d6b4732c2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -415,23 +415,14 @@ How to translate with transifex: Conversation info Unread messages %1$s sent a GIF. - %1$s sent an attachment. %1$s sent an audio. %1$s sent a video. %1$s sent an image. - %1$s sent a poll. - %1$s sent a location. - %1$s sent a voice message. %1$s sent a deck card You sent a GIF. - You sent an attachment. You sent an audio. You sent a video. You sent an image. - You sent a poll. - You sent a location. - You sent a voice message. - You sent a deck card %1$s: %2$s Cancel reply @@ -444,6 +435,8 @@ How to translate with transifex: Sending Failed to send message: Add attachment + Recent + You: See %d similar message See %d similar messages