forked from GitHub-Mirror/riotX-android
Timeline : improve scrolling performances
This commit is contained in:
parent
281c25e66d
commit
d288fb7c9c
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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) }
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user