@@ -13,14 +13,18 @@ import android.annotation.SuppressLint
1313import android.content.Context
1414import android.content.res.ColorStateList
1515import android.graphics.Typeface
16+ import android.text.SpannableStringBuilder
17+ import android.text.Spanned
1618import android.text.TextUtils
1719import android.text.format.DateUtils
20+ import android.text.style.ImageSpan
1821import android.view.View
1922import androidx.core.content.ContextCompat
2023import androidx.core.content.res.ResourcesCompat
2124import com.nextcloud.talk.R
2225import com.nextcloud.talk.adapters.items.ConversationItem.ConversationItemViewHolder
2326import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
27+ import com.nextcloud.talk.chat.data.model.ChatMessage
2428import com.nextcloud.talk.chat.data.model.ChatMessage.MessageType
2529import com.nextcloud.talk.data.database.mappers.asModel
2630import com.nextcloud.talk.data.user.model.User
@@ -209,7 +213,6 @@ class ConversationItem(
209213 R .drawable.ic_avatar_document
210214 )
211215 )
212-
213216 false
214217 }
215218
@@ -229,7 +232,7 @@ class ConversationItem(
229232 if (! TextUtils .isEmpty(chatMessage?.systemMessage) ||
230233 ConversationEnums .ConversationType .ROOM_SYSTEM == = model.type
231234 ) {
232- holder.binding.dialogLastMessage.text = chatMessage? .text
235+ holder.binding.dialogLastMessage.text = chatMessage.text
233236 } else {
234237 chatMessage?.activeUser = user
235238
@@ -249,7 +252,7 @@ class ConversationItem(
249252 }
250253 }
251254
252- private fun calculateRegularLastMessageText (appContext : Context ): String {
255+ private fun calculateRegularLastMessageText (appContext : Context ): CharSequence {
253256 return if (chatMessage?.actorId == user.userId) {
254257 String .format(
255258 appContext.getString(R .string.nc_formatted_message_you),
@@ -331,7 +334,7 @@ class ConversationItem(
331334 this .header = header
332335 }
333336
334- private val lastMessageDisplayText: String
337+ private val lastMessageDisplayText: CharSequence
335338 get() {
336339 if (chatMessage?.getCalculateMessageType() == MessageType .REGULAR_TEXT_MESSAGE ||
337340 chatMessage?.getCalculateMessageType() == MessageType .SYSTEM_MESSAGE ||
@@ -351,33 +354,21 @@ class ConversationItem(
351354 chatMessage?.getNullsafeActorDisplayName()
352355 )
353356 }
354- } else if (MessageType .SINGLE_NC_ATTACHMENT_MESSAGE == chatMessage?.getCalculateMessageType()) {
355- return if (chatMessage?.actorId == chatMessage?.activeUser!! .userId) {
356- sharedApplication!! .getString(R .string.nc_sent_an_attachment_you)
357- } else {
358- String .format(
359- sharedApplication!! .resources.getString(R .string.nc_sent_an_attachment),
360- chatMessage?.getNullsafeActorDisplayName()
361- )
362- }
363357 } else if (MessageType .SINGLE_NC_GEOLOCATION_MESSAGE == chatMessage?.getCalculateMessageType()) {
364- return if (chatMessage?.actorId == chatMessage?.activeUser!! .userId) {
365- sharedApplication!! .getString(R .string.nc_sent_location_you)
366- } else {
367- String .format(
368- sharedApplication!! .resources.getString(R .string.nc_sent_location),
369- chatMessage?.getNullsafeActorDisplayName()
370- )
371- }
358+ var locationName = chatMessage.messageParameters?.get(" object" )?.get(" name" ) ? : " "
359+ val author = authorName(chatMessage)
360+ val lastMessage =
361+ setLastNameForAttachmentMessage(author, R .drawable.baseline_location_pin_24, locationName)
362+ return lastMessage
372363 } else if (MessageType .VOICE_MESSAGE == chatMessage?.getCalculateMessageType()) {
373- return if (chatMessage?.actorId == chatMessage?.activeUser !! .userId) {
374- sharedApplication !! .getString( R .string.nc_sent_voice_you )
375- } else {
376- String .format(
377- sharedApplication !! .resources.getString( R .string.nc_sent_voice) ,
378- chatMessage?.getNullsafeActorDisplayName()
379- )
380- }
364+ var voiceMessageName = chatMessage.messageParameters?.get( " file " )?.get( " name " ) ? : " "
365+ val author = authorName(chatMessage )
366+ val lastMessage = setLastNameForAttachmentMessage(
367+ author,
368+ R .drawable.baseline_mic_24 ,
369+ voiceMessageName
370+ )
371+ return lastMessage
381372 } else if (MessageType .SINGLE_LINK_AUDIO_MESSAGE == chatMessage?.getCalculateMessageType()) {
382373 return if (chatMessage?.actorId == chatMessage?.activeUser!! .userId) {
383374 sharedApplication!! .getString(R .string.nc_sent_an_audio_you)
@@ -406,28 +397,77 @@ class ConversationItem(
406397 )
407398 }
408399 } else if (MessageType .POLL_MESSAGE == chatMessage?.getCalculateMessageType()) {
409- return if (chatMessage?.actorId == chatMessage?.activeUser!! .userId) {
410- sharedApplication!! .getString(R .string.nc_sent_poll_you)
411- } else {
412- String .format(
413- sharedApplication!! .resources.getString(R .string.nc_sent_poll),
414- chatMessage?.getNullsafeActorDisplayName()
415- )
400+ var pollMessageTitle = chatMessage.messageParameters?.get(" object" )?.get(" name" ) ? : " "
401+ val author = authorName(chatMessage)
402+ val lastMessage = setLastNameForAttachmentMessage(
403+ author,
404+ R .drawable.baseline_bar_chart_24,
405+ pollMessageTitle
406+ )
407+ return lastMessage
408+ } else if (MessageType .SINGLE_NC_ATTACHMENT_MESSAGE == chatMessage?.getCalculateMessageType()) {
409+ var attachmentName = chatMessage.message
410+ if (attachmentName == " {file}" ) {
411+ attachmentName = chatMessage.messageParameters?.get(" file" )?.get(" name" )
416412 }
417- } else if (MessageType .DECK_CARD == chatMessage?.getCalculateMessageType()) {
418- return if (chatMessage?.actorId == chatMessage?.activeUser!! .userId) {
419- sharedApplication!! .getString(R .string.nc_sent_deck_card_you)
420- } else {
421- String .format(
422- sharedApplication!! .resources.getString(R .string.nc_sent_deck_card),
423- chatMessage?.getNullsafeActorDisplayName()
424- )
413+ val author = authorName(chatMessage)
414+
415+ val drawable = chatMessage.messageParameters?.get(" file" )?.get(" mimetype" )?.let {
416+ when {
417+ it.contains(" image" ) -> R .drawable.baseline_image_24
418+ it.contains(" video" ) -> R .drawable.baseline_video_24
419+ it.contains(" application" ) -> R .drawable.baseline_insert_drive_file_24
420+ it.contains(" audio" ) -> R .drawable.baseline_audiotrack_24
421+ it.contains(" text/vcard" ) -> R .drawable.baseline_contacts_24
422+ else -> null
423+ }
425424 }
425+ val lastMessage = setLastNameForAttachmentMessage(author, drawable, attachmentName!! )
426+ return lastMessage
427+ } else if (MessageType .DECK_CARD == chatMessage?.getCalculateMessageType()) {
428+ var deckTitle = chatMessage.messageParameters?.get(" object" )?.get(" name" ) ? : " "
429+ val author = authorName(chatMessage)
430+ val lastMessage = setLastNameForAttachmentMessage(author, R .drawable.baseline_article_24, deckTitle)
431+ return lastMessage
426432 }
427433 }
428434 return " "
429435 }
430436
437+ fun authorName (chatMessage : ChatMessage ): String {
438+ val name = if (chatMessage.actorId == chatMessage.activeUser!! .userId) {
439+ sharedApplication!! .resources.getString(R .string.nc_current_user)
440+ } else {
441+ chatMessage.getNullsafeActorDisplayName()?.let { " $it :" } ? : " "
442+ }
443+ return name
444+ }
445+
446+ fun setLastNameForAttachmentMessage (actor : String , icon : Int? , attachmentName : String ): SpannableStringBuilder {
447+ val builder = SpannableStringBuilder ()
448+ builder.append(actor)
449+
450+ val drawable = icon?.let { it -> ContextCompat .getDrawable(context, it) }
451+ if (drawable != null ) {
452+ viewThemeUtils.platform.colorDrawable(
453+ drawable,
454+ context.resources.getColor(R .color.low_emphasis_text, null )
455+ )
456+ val desiredWidth = (drawable.intrinsicWidth * IMAGE_SCALE_FACTOR ).toInt()
457+ val desiredHeight = (drawable.intrinsicHeight * IMAGE_SCALE_FACTOR ).toInt()
458+ drawable.setBounds(0 , 0 , desiredWidth, desiredHeight)
459+
460+ val imageSpan = ImageSpan (drawable, ImageSpan .ALIGN_BOTTOM )
461+ val startImage = builder.length
462+ builder.append(" " )
463+ builder.setSpan(imageSpan, startImage, startImage + 1 , Spanned .SPAN_EXCLUSIVE_EXCLUSIVE )
464+ } else {
465+ builder.append(" " )
466+ }
467+ builder.append(attachmentName)
468+ return builder
469+ }
470+
431471 class ConversationItemViewHolder (view : View ? , adapter : FlexibleAdapter <* >? ) : FlexibleViewHolder(view, adapter) {
432472 var binding: RvItemConversationWithLastMessageBinding
433473
@@ -442,5 +482,6 @@ class ConversationItem(
442482 private const val STATUS_SIZE_IN_DP = 9f
443483 private const val UNREAD_BUBBLE_STROKE_WIDTH = 6.0f
444484 private const val UNREAD_MESSAGES_TRESHOLD = 1000
485+ private const val IMAGE_SCALE_FACTOR = 0.7f
445486 }
446487}
0 commit comments