forked from GitHub-Mirror/riotX-android
Add a way to enrich event with useful data to be displayed.
This commit is contained in:
@ -1,14 +1,18 @@
|
||||
package im.vector.riotredesign.features.home
|
||||
|
||||
import android.support.v7.util.DiffUtil
|
||||
import im.vector.matrix.android.api.session.events.model.Event
|
||||
import im.vector.matrix.android.api.session.events.model.EnrichedEvent
|
||||
|
||||
class EventDiffUtilCallback : DiffUtil.ItemCallback<Event>() {
|
||||
override fun areItemsTheSame(p0: Event, p1: Event): Boolean {
|
||||
return p0.eventId == p1.eventId
|
||||
class EventDiffUtilCallback : DiffUtil.ItemCallback<EnrichedEvent>() {
|
||||
override fun areItemsTheSame(p0: EnrichedEvent, p1: EnrichedEvent): Boolean {
|
||||
return p0.core.eventId == p1.core.eventId
|
||||
}
|
||||
|
||||
override fun areContentsTheSame(p0: Event, p1: Event): Boolean {
|
||||
return p0 == p1
|
||||
override fun areContentsTheSame(p0: EnrichedEvent, p1: EnrichedEvent): Boolean {
|
||||
return p0.core == p1.core
|
||||
&& p0.getMetaEvents()
|
||||
.zip(p1.getMetaEvents()) { a, b ->
|
||||
a.eventId == b.eventId
|
||||
}.none { !it }
|
||||
}
|
||||
}
|
@ -9,7 +9,7 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import im.vector.matrix.android.api.Matrix
|
||||
import im.vector.matrix.android.api.session.events.model.Event
|
||||
import im.vector.matrix.android.api.session.events.model.EnrichedEvent
|
||||
import im.vector.matrix.android.api.session.room.Room
|
||||
import im.vector.riotredesign.R
|
||||
import im.vector.riotredesign.core.platform.RiotFragment
|
||||
@ -46,7 +46,7 @@ class RoomDetailFragment : RiotFragment(), TimelineEventAdapter.Callback {
|
||||
room.liveTimeline().observe(this, Observer { renderEvents(it) })
|
||||
}
|
||||
|
||||
private fun renderEvents(events: PagedList<Event>?) {
|
||||
private fun renderEvents(events: PagedList<EnrichedEvent>?) {
|
||||
timelineAdapter.submitList(events)
|
||||
}
|
||||
|
||||
@ -65,7 +65,7 @@ class RoomDetailFragment : RiotFragment(), TimelineEventAdapter.Callback {
|
||||
//recyclerView.setController(timelineEventController)
|
||||
}
|
||||
|
||||
override fun onEventsListChanged(oldList: List<Event>?, newList: List<Event>?) {
|
||||
override fun onEventsListChanged(oldList: List<EnrichedEvent>?, newList: List<EnrichedEvent>?) {
|
||||
if (oldList == null && newList != null) {
|
||||
recyclerView.scrollToPosition(0)
|
||||
}
|
||||
|
@ -7,7 +7,10 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import im.vector.matrix.android.api.session.events.model.Event
|
||||
import im.vector.matrix.android.api.session.events.model.EnrichedEvent
|
||||
import im.vector.matrix.android.api.session.events.model.EventType
|
||||
import im.vector.matrix.android.api.session.room.model.MessageContent
|
||||
import im.vector.matrix.android.api.session.room.model.RoomMember
|
||||
import im.vector.riotredesign.R
|
||||
|
||||
/**
|
||||
@ -15,10 +18,10 @@ import im.vector.riotredesign.R
|
||||
*/
|
||||
|
||||
class TimelineEventAdapter(private val callback: Callback? = null)
|
||||
: PagedListAdapter<Event, TimelineEventAdapter.ViewHolder>(EventDiffUtilCallback()) {
|
||||
: PagedListAdapter<EnrichedEvent, TimelineEventAdapter.ViewHolder>(EventDiffUtilCallback()) {
|
||||
|
||||
|
||||
private var currentList: List<Event>? = null
|
||||
private var currentList: List<EnrichedEvent>? = null
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, position: Int): ViewHolder {
|
||||
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_event, parent, false)
|
||||
@ -30,27 +33,33 @@ class TimelineEventAdapter(private val callback: Callback? = null)
|
||||
viewHolder.bind(event)
|
||||
}
|
||||
|
||||
|
||||
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
||||
|
||||
val titleView = view.findViewById<TextView>(R.id.titleView)!!
|
||||
|
||||
fun bind(event: Event?) {
|
||||
if (event == null) {
|
||||
|
||||
fun bind(event: EnrichedEvent?) {
|
||||
if (event == null || event.core.type != EventType.MESSAGE) {
|
||||
titleView.text = null
|
||||
} else {
|
||||
titleView.text = event.toString()
|
||||
val messageContent = event.core.content<MessageContent>()
|
||||
val roomMember = event.getMetaEvents(EventType.STATE_ROOM_MEMBER).firstOrNull()?.content<RoomMember>()
|
||||
if (messageContent == null || roomMember == null) {
|
||||
titleView.text = null
|
||||
} else {
|
||||
val text = "${roomMember.displayName} : ${messageContent.body}"
|
||||
titleView.text = text
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCurrentListChanged(newList: PagedList<Event>?) {
|
||||
override fun onCurrentListChanged(newList: PagedList<EnrichedEvent>?) {
|
||||
callback?.onEventsListChanged(currentList, newList)
|
||||
currentList = newList
|
||||
}
|
||||
|
||||
interface Callback {
|
||||
fun onEventsListChanged(oldList: List<Event>?, newList: List<Event>?)
|
||||
fun onEventsListChanged(oldList: List<EnrichedEvent>?, newList: List<EnrichedEvent>?)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ class TimelineEventController : PagedListEpoxyController<Event>(
|
||||
return if (item == null) {
|
||||
LoadingItemModel_().id(-currentPosition)
|
||||
} else {
|
||||
TimelineEventItem(item.toString()).id(currentPosition)
|
||||
TimelineEventItem(item.toString()).id(item.eventId)
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user