Timeline : improve scrolling performances

This commit is contained in:
ganfra 2019-01-07 11:39:26 +01:00
parent 281c25e66d
commit d288fb7c9c
5 changed files with 24 additions and 16 deletions

View File

@ -75,6 +75,8 @@ class RoomDetailFragment : RiotFragment(), TimelineEventController.Callback {
//scrollOnNewMessageCallback = ScrollOnNewMessageCallback(layoutManager) //scrollOnNewMessageCallback = ScrollOnNewMessageCallback(layoutManager)
recyclerView.layoutManager = layoutManager recyclerView.layoutManager = layoutManager
//timelineEventController.addModelBuildListener { it.dispatchTo(scrollOnNewMessageCallback) } //timelineEventController.addModelBuildListener { it.dispatchTo(scrollOnNewMessageCallback) }
recyclerView.setHasFixedSize(true)
recyclerView.setItemViewCacheSize(20)
recyclerView.setController(timelineEventController) recyclerView.setController(timelineEventController)
timelineEventController.callback = this timelineEventController.callback = this
} }

View File

@ -1,11 +1,9 @@
package im.vector.riotredesign.features.home.room.detail.timeline package im.vector.riotredesign.features.home.room.detail.timeline


import android.text.util.Linkify
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import im.vector.matrix.android.api.permalinks.MatrixLinkify import im.vector.matrix.android.api.permalinks.MatrixLinkify
import im.vector.matrix.android.api.permalinks.MatrixPermalinkSpan
import im.vector.riotredesign.R import im.vector.riotredesign.R
import im.vector.riotredesign.core.epoxy.KotlinModel import im.vector.riotredesign.core.epoxy.KotlinModel
import im.vector.riotredesign.features.home.AvatarRenderer import im.vector.riotredesign.features.home.AvatarRenderer
@ -15,8 +13,7 @@ data class MessageItem(
val time: CharSequence? = null, val time: CharSequence? = null,
val avatarUrl: String?, val avatarUrl: String?,
val memberName: CharSequence? = null, val memberName: CharSequence? = null,
val showInformation: Boolean = true, val showInformation: Boolean = true
val onUrlClickedListener: ((url: String) -> Unit)? = null
) : KotlinModel(R.layout.item_event_message) { ) : KotlinModel(R.layout.item_event_message) {


private val avatarImageView by bind<ImageView>(R.id.messageAvatarImageView) private val avatarImageView by bind<ImageView>(R.id.messageAvatarImageView)
@ -26,12 +23,7 @@ data class MessageItem(


override fun bind() { override fun bind() {
messageView.text = message messageView.text = message
MatrixLinkify.addLinks(messageView, object : MatrixPermalinkSpan.Callback { MatrixLinkify.addLinkMovementMethod(messageView)
override fun onUrlClicked(url: String) {
onUrlClickedListener?.invoke(url)
}
})
Linkify.addLinks(messageView, Linkify.ALL)
if (showInformation) { if (showInformation) {
avatarImageView.visibility = View.VISIBLE avatarImageView.visibility = View.VISIBLE
memberNameView.visibility = View.VISIBLE memberNameView.visibility = View.VISIBLE

View File

@ -1,5 +1,9 @@
package im.vector.riotredesign.features.home.room.detail.timeline package im.vector.riotredesign.features.home.room.detail.timeline


import android.text.SpannableStringBuilder
import android.text.util.Linkify
import im.vector.matrix.android.api.permalinks.MatrixLinkify
import im.vector.matrix.android.api.permalinks.MatrixPermalinkSpan
import im.vector.matrix.android.api.session.events.model.EnrichedEvent import im.vector.matrix.android.api.session.events.model.EnrichedEvent
import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.events.model.toModel
import im.vector.matrix.android.api.session.room.model.MessageContent import im.vector.matrix.android.api.session.room.model.MessageContent
@ -25,14 +29,24 @@ class MessageItemFactory(private val timelineDateFormatter: TimelineDateFormatte
if (addDaySeparator || nextRoomMember != roomMember) { if (addDaySeparator || nextRoomMember != roomMember) {
messagesDisplayedWithInformation.add(event.root.eventId) messagesDisplayedWithInformation.add(event.root.eventId)
} }

val message = messageContent.body?.let {
val spannable = SpannableStringBuilder(it)
MatrixLinkify.addLinks(spannable, object : MatrixPermalinkSpan.Callback {
override fun onUrlClicked(url: String) {
callback?.onUrlClicked(url)
}
})
Linkify.addLinks(spannable, Linkify.ALL)
spannable
}
val showInformation = messagesDisplayedWithInformation.contains(event.root.eventId) val showInformation = messagesDisplayedWithInformation.contains(event.root.eventId)
return MessageItem( return MessageItem(
message = messageContent.body, message = message,
avatarUrl = roomMember.avatarUrl, avatarUrl = roomMember.avatarUrl,
showInformation = showInformation, showInformation = showInformation,
time = timelineDateFormatter.formatMessageHour(date), time = timelineDateFormatter.formatMessageHour(date),
memberName = roomMember.displayName ?: event.root.sender, memberName = roomMember.displayName ?: event.root.sender
onUrlClickedListener = { callback?.onUrlClicked(it) }
) )
} }



View File

@ -58,7 +58,7 @@ object MatrixLinkify {
} }




private fun addLinkMovementMethod(textView: TextView) { fun addLinkMovementMethod(textView: TextView) {
val movementMethod = textView.movementMethod val movementMethod = textView.movementMethod
if (movementMethod == null || movementMethod !is LinkMovementMethod) { if (movementMethod == null || movementMethod !is LinkMovementMethod) {
if (textView.linksClickable) { if (textView.linksClickable) {

View File

@ -15,7 +15,7 @@ import im.vector.matrix.android.internal.database.query.where
import im.vector.matrix.android.internal.session.room.members.RoomMemberExtractor import im.vector.matrix.android.internal.session.room.members.RoomMemberExtractor
import im.vector.matrix.android.internal.task.TaskExecutor import im.vector.matrix.android.internal.task.TaskExecutor
import im.vector.matrix.android.internal.task.configureWith import im.vector.matrix.android.internal.task.configureWith
import im.vector.matrix.android.internal.util.tryTransactionSync import im.vector.matrix.android.internal.util.tryTransactionAsync
import io.realm.Realm import io.realm.Realm
import io.realm.RealmQuery import io.realm.RealmQuery


@ -55,7 +55,7 @@ internal class DefaultTimelineHolder(private val roomId: String,
} }


private fun clearUnlinkedEvents() { private fun clearUnlinkedEvents() {
monarchy.tryTransactionSync { realm -> monarchy.tryTransactionAsync { realm ->
val unlinkedEvents = EventEntity val unlinkedEvents = EventEntity
.where(realm, roomId = roomId) .where(realm, roomId = roomId)
.equalTo(EventEntityFields.IS_UNLINKED, true) .equalTo(EventEntityFields.IS_UNLINKED, true)