diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/MessageColorProvider.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/MessageColorProvider.kt index c6ab5b024f..96f7885e5d 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/MessageColorProvider.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/MessageColorProvider.kt @@ -20,6 +20,7 @@ import androidx.annotation.ColorInt import im.vector.matrix.android.api.session.room.send.SendState import im.vector.riotx.R import im.vector.riotx.core.resources.ColorProvider +import im.vector.riotx.core.utils.getColorFromUserId import im.vector.riotx.features.settings.VectorPreferences import javax.inject.Inject @@ -27,6 +28,11 @@ class MessageColorProvider @Inject constructor( private val colorProvider: ColorProvider, private val vectorPreferences: VectorPreferences) { + @ColorInt + fun getMemberNameTextColor(userId: String): Int { + return colorProvider.getColor(getColorFromUserId(userId)) + } + @ColorInt fun getMessageTextColor(sendState: SendState): Int { return if (vectorPreferences.developerMode()) { diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt index 06c9544881..b976cd4140 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt @@ -71,11 +71,8 @@ class MessageInformationDataFactory @Inject constructor(private val session: Ses || isTileTypeMessage(nextEvent) val time = dateFormatter.formatMessageHour(date) - val formattedMemberName = span(event.senderInfo.disambiguatedDisplayName) { - textColor = colorProvider.getColor(getColorFromUserId(event.root.senderId)) - } - val e2eDecoration = getE2EDecoration(event) + return MessageInformationData( eventId = eventId, senderId = event.root.senderId ?: "", @@ -83,7 +80,7 @@ class MessageInformationDataFactory @Inject constructor(private val session: Ses time = time, ageLocalTS = event.root.ageLocalTs, avatarUrl = event.senderInfo.avatarUrl, - memberName = formattedMemberName, + memberName = event.senderInfo.disambiguatedDisplayName, showInformation = showInformation, orderedReactionList = event.annotations?.reactionsSummary // ?.filter { isSingleEmoji(it.key) } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt index e62de05518..0845b9059c 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsBaseMessageItem.kt @@ -109,6 +109,7 @@ abstract class AbsBaseMessageItem : BaseEventItem } override fun unbind(holder: H) { + holder.reactionsContainer.setOnLongClickListener(null) holder.readReceiptsView.unbind() super.unbind(holder) } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt index 2b01e915df..4f7828ddaf 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt @@ -61,6 +61,7 @@ abstract class AbsMessageItem : AbsBaseMessageItem holder.timeView.visibility = View.VISIBLE holder.timeView.text = attributes.informationData.time holder.memberNameView.text = attributes.informationData.memberName + holder.memberNameView.setTextColor(attributes.getMemberNameColor()) attributes.avatarRenderer.render(attributes.informationData.matrixItem, holder.avatarImageView) holder.avatarImageView.setOnLongClickListener(attributes.itemLongClickListener) holder.memberNameView.setOnLongClickListener(attributes.itemLongClickListener) @@ -75,6 +76,16 @@ abstract class AbsMessageItem : AbsBaseMessageItem } } + override fun unbind(holder: H) { + holder.avatarImageView.setOnClickListener(null) + holder.avatarImageView.setOnLongClickListener(null) + holder.memberNameView.setOnClickListener(null) + holder.memberNameView.setOnLongClickListener(null) + super.unbind(holder) + } + + private fun Attributes.getMemberNameColor() = messageColorProvider.getMemberNameTextColor(informationData.senderId) + abstract class Holder(@IdRes stubId: Int) : AbsBaseMessageItem.Holder(stubId) { val avatarImageView by bind(R.id.messageAvatarImageView) val memberNameView by bind(R.id.messageMemberNameView) @@ -96,5 +107,25 @@ abstract class AbsMessageItem : AbsBaseMessageItem val avatarCallback: TimelineEventController.AvatarCallback? = null, override val readReceiptsCallback: TimelineEventController.ReadReceiptsCallback? = null, val emojiTypeFace: Typeface? = null - ) : AbsBaseMessageItem.Attributes + ) : AbsBaseMessageItem.Attributes { + + // Have to override as it's used to diff epoxy items + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as Attributes + + if (avatarSize != other.avatarSize) return false + if (informationData != other.informationData) return false + + return true + } + + override fun hashCode(): Int { + var result = avatarSize + result = 31 * result + informationData.hashCode() + return result + } + } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/BaseEventItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/BaseEventItem.kt index f674cfa0f4..6eacb034ac 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/BaseEventItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/BaseEventItem.kt @@ -28,6 +28,7 @@ import im.vector.riotx.core.epoxy.VectorEpoxyModel import im.vector.riotx.core.platform.CheckableView import im.vector.riotx.core.ui.views.ReadReceiptsView import im.vector.riotx.core.utils.DimensionConverter +import timber.log.Timber /** * Children must override getViewType() @@ -40,12 +41,13 @@ abstract class BaseEventItem : VectorEpoxyModel @EpoxyAttribute open var leftGuideline: Int = 0 - @EpoxyAttribute + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) lateinit var dimensionConverter: DimensionConverter @CallSuper override fun bind(holder: H) { super.bind(holder) + Timber.v("Bind event item with ids: ${getEventIds()}") holder.leftGuideline.updateLayoutParams { this.marginStart = leftGuideline } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt index 24a783a6d6..ea52df2bfb 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageFileItem.kt @@ -36,7 +36,7 @@ abstract class MessageFileItem : AbsMessageItem() { @EpoxyAttribute @DrawableRes var iconRes: Int = 0 - @EpoxyAttribute + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var clickListener: View.OnClickListener? = null @EpoxyAttribute var izLocalFile = false diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt index 2fd46ddf12..779b132f2d 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageImageVideoItem.kt @@ -37,7 +37,7 @@ abstract class MessageImageVideoItem : AbsMessageItem() { var message: CharSequence? = null @EpoxyAttribute var useBigFont: Boolean = false - @EpoxyAttribute + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var movementMethod: MovementMethod? = null override fun bind(holder: Holder) {