Epoxy: optimize some hashcode in timeline

This commit is contained in:
ganfra 2020-06-29 15:05:21 +02:00
parent 8972319a85
commit 7e703e4788
8 changed files with 49 additions and 10 deletions

View File

@ -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()) {

View File

@ -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) }

View File

@ -109,6 +109,7 @@ abstract class AbsBaseMessageItem<H : AbsBaseMessageItem.Holder> : BaseEventItem
}
override fun unbind(holder: H) {
holder.reactionsContainer.setOnLongClickListener(null)
holder.readReceiptsView.unbind()
super.unbind(holder)
}

View File

@ -61,6 +61,7 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : AbsBaseMessageItem<H>
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<H : AbsMessageItem.Holder> : AbsBaseMessageItem<H>
}
}
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<ImageView>(R.id.messageAvatarImageView)
val memberNameView by bind<TextView>(R.id.messageMemberNameView)
@ -96,5 +107,25 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : AbsBaseMessageItem<H>
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
}
}
}

View File

@ -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<H : BaseEventItem.BaseHolder> : VectorEpoxyModel<H>
@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<RelativeLayout.LayoutParams> {
this.marginStart = leftGuideline
}

View File

@ -36,7 +36,7 @@ abstract class MessageFileItem : AbsMessageItem<MessageFileItem.Holder>() {
@EpoxyAttribute
@DrawableRes
var iconRes: Int = 0
@EpoxyAttribute
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
var clickListener: View.OnClickListener? = null
@EpoxyAttribute
var izLocalFile = false

View File

@ -37,7 +37,7 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
var playable: Boolean = false
@EpoxyAttribute
var mode = ImageContentRenderer.Mode.THUMBNAIL
@EpoxyAttribute
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
var clickListener: View.OnClickListener? = null
@EpoxyAttribute
lateinit var imageContentRenderer: ImageContentRenderer
@ -65,6 +65,8 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
override fun unbind(holder: Holder) {
GlideApp.with(holder.view.context.applicationContext).clear(holder.imageView)
contentUploadStateTrackerBinder.unbind(attributes.informationData.eventId)
holder.imageView.setOnClickListener(null)
holder.imageView.setOnLongClickListener(null)
super.unbind(holder)
}

View File

@ -34,7 +34,7 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
var message: CharSequence? = null
@EpoxyAttribute
var useBigFont: Boolean = false
@EpoxyAttribute
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
var movementMethod: MovementMethod? = null
override fun bind(holder: Holder) {