Add a way to enrich event with useful data to be displayed.

This commit is contained in:
ganfra
2018-10-22 19:36:29 +02:00
parent 0f4d15e488
commit 279241974a
18 changed files with 232 additions and 85 deletions

View File

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

View File

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

View File

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

View File

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