Bubbles: fix recycling issue

This commit is contained in:
ganfra 2022-01-12 18:45:40 +01:00
parent af542a8243
commit f7df0b891e
17 changed files with 34 additions and 15 deletions

View File

@ -172,7 +172,9 @@ class MessageItemFactory @Inject constructor(
is MessagePollContent -> buildPollContent(messageContent, informationData, highlight, callback, attributes)
else -> buildNotHandledMessageItem(messageContent, informationData, highlight, callback, attributes)
}
return messageItem?.apply {
return messageItem?.takeIf {
it.layout == R.layout.item_timeline_event_base
}?.apply {
layout(informationData.messageLayout.layoutRes)
}
}

View File

@ -27,6 +27,7 @@ import im.vector.app.core.epoxy.VectorEpoxyHolder
import im.vector.app.core.epoxy.VectorEpoxyModel
import im.vector.app.core.platform.CheckableView
import im.vector.app.core.utils.DimensionConverter
import timber.log.Timber
/**
* Children must override getViewType()
@ -43,6 +44,20 @@ abstract class BaseEventItem<H : BaseEventItem.BaseHolder> : VectorEpoxyModel<H>
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
lateinit var dimensionConverter: DimensionConverter
final override fun getViewType(): Int {
// This makes sure we have a unique integer for the combination of layout and ViewStubId.
return pairingFunction(layout, getViewStubId()).also {
Timber.v("GetViewType: for ${javaClass.canonicalName} $it with layout:$layout and stubId:${getViewStubId()}")
}
}
abstract fun getViewStubId(): Int
// Szudzik function
private fun pairingFunction(a: Int, b: Int): Int {
return if (a >= b) a * a + a + b else a + b * b
}
@CallSuper
override fun bind(holder: H) {
super.bind(holder)

View File

@ -50,7 +50,7 @@ abstract class CallTileTimelineItem : AbsBaseMessageItem<CallTileTimelineItem.Ho
@EpoxyAttribute
lateinit var attributes: Attributes
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
override fun bind(holder: Holder) {
super.bind(holder)

View File

@ -46,7 +46,7 @@ abstract class DefaultItem : BaseEventItem<DefaultItem.Holder>() {
return listOf(attributes.informationData.eventId)
}
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
class Holder : BaseHolder(STUB_ID) {
val avatarImageView by bind<ImageView>(R.id.itemDefaultAvatarView)

View File

@ -29,7 +29,7 @@ import im.vector.app.features.home.AvatarRenderer
@EpoxyModelClass(layout = R.layout.item_timeline_event_base_noinfo)
abstract class MergedMembershipEventsItem : BasedMergedItem<MergedMembershipEventsItem.Holder>() {
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
@EpoxyAttribute
override lateinit var attributes: Attributes

View File

@ -51,7 +51,7 @@ abstract class MergedRoomCreationItem : BasedMergedItem<MergedRoomCreationItem.H
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
var movementMethod: MovementMethod? = null
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
override fun bind(holder: Holder) {
super.bind(holder)

View File

@ -44,7 +44,7 @@ abstract class MessageBlockCodeItem : AbsMessageItem<MessageBlockCodeItem.Holder
holder.editedView.setTextOrHide(editedSpan?.charSequence)
}
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
class Holder : AbsMessageItem.Holder(STUB_ID) {
val messageView by bind<TextView>(R.id.codeBlockTextView)

View File

@ -95,7 +95,7 @@ abstract class MessageFileItem : AbsMessageItem<MessageFileItem.Holder>() {
contentDownloadStateTrackerBinder.unbind(mxcUrl)
}
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
class Holder : AbsMessageItem.Holder(STUB_ID) {
val progressLayout by bind<ViewGroup>(R.id.messageFileUploadProgressLayout)

View File

@ -83,7 +83,7 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
super.unbind(holder)
}
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
class Holder : AbsMessageItem.Holder(STUB_ID) {
val progressLayout by bind<ViewGroup>(R.id.messageMediaUploadProgressLayout)

View File

@ -115,7 +115,7 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
previewUrlRetriever?.removeListener(attributes.informationData.eventId, previewUrlViewUpdater)
}
override fun getViewType() = STUB_ID + layout
override fun getViewStubId() = STUB_ID
class Holder : AbsMessageItem.Holder(STUB_ID) {
val messageView by bind<AppCompatTextView>(R.id.messageTextView)

View File

@ -120,7 +120,7 @@ abstract class MessageVoiceItem : AbsMessageItem<MessageVoiceItem.Holder>() {
voiceMessagePlaybackTracker.unTrack(attributes.informationData.eventId)
}
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
class Holder : AbsMessageItem.Holder(STUB_ID) {
val voiceLayout by bind<ViewGroup>(R.id.voiceLayout)

View File

@ -64,7 +64,7 @@ abstract class NoticeItem : BaseEventItem<NoticeItem.Holder>() {
return listOf(attributes.informationData.eventId)
}
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
class Holder : BaseHolder(STUB_ID) {
val avatarImageView by bind<ImageView>(R.id.itemNoticeAvatarView)

View File

@ -46,6 +46,8 @@ abstract class PollItem : AbsMessageItem<PollItem.Holder>() {
@EpoxyAttribute
lateinit var optionViewStates: List<PollOptionViewState>
override fun getViewStubId() = STUB_ID
override fun bind(holder: Holder) {
super.bind(holder)
val relatedEventId = eventId ?: return

View File

@ -22,7 +22,7 @@ import im.vector.app.R
@EpoxyModelClass(layout = R.layout.item_timeline_event_base)
abstract class RedactedMessageItem : AbsMessageItem<RedactedMessageItem.Holder>() {
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
override fun shouldShowReactionAtBottom() = false

View File

@ -40,7 +40,7 @@ abstract class StatusTileTimelineItem : AbsBaseMessageItem<StatusTileTimelineIte
@EpoxyAttribute
lateinit var attributes: Attributes
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
@SuppressLint("SetTextI18n")
override fun bind(holder: Holder) {

View File

@ -51,7 +51,7 @@ abstract class VerificationRequestItem : AbsBaseMessageItem<VerificationRequestI
@EpoxyAttribute
var callback: TimelineEventController.Callback? = null
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
@SuppressLint("SetTextI18n")
override fun bind(holder: Holder) {

View File

@ -41,7 +41,7 @@ abstract class WidgetTileTimelineItem : AbsBaseMessageItem<WidgetTileTimelineIte
@EpoxyAttribute
lateinit var attributes: Attributes
override fun getViewType() = STUB_ID
override fun getViewStubId() = STUB_ID
@SuppressLint("SetTextI18n")
override fun bind(holder: Holder) {