mirror of
https://github.com/element-hq/element-android
synced 2024-11-27 20:06:51 +03:00
Timeline : use snapshot from pagedlist to build list
This commit is contained in:
parent
b3fe742ec4
commit
c6bcd1c022
3 changed files with 24 additions and 15 deletions
|
@ -28,8 +28,9 @@ class HomeModule(private val homeActivity: HomeActivity) : Module {
|
||||||
TextItemFactory()
|
TextItemFactory()
|
||||||
}
|
}
|
||||||
|
|
||||||
single {
|
factory {
|
||||||
TimelineEventController(get(), get(), get())
|
val roomId = it.get(0) as String
|
||||||
|
TimelineEventController(roomId, get(), get(), get())
|
||||||
}
|
}
|
||||||
|
|
||||||
}.invoke()
|
}.invoke()
|
||||||
|
|
|
@ -19,6 +19,7 @@ import im.vector.riotredesign.features.home.AvatarRenderer
|
||||||
import im.vector.riotredesign.features.home.room.detail.timeline.TimelineEventController
|
import im.vector.riotredesign.features.home.room.detail.timeline.TimelineEventController
|
||||||
import kotlinx.android.synthetic.main.fragment_room_detail.*
|
import kotlinx.android.synthetic.main.fragment_room_detail.*
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
|
import org.koin.core.parameter.ParameterList
|
||||||
|
|
||||||
class RoomDetailFragment : RiotFragment() {
|
class RoomDetailFragment : RiotFragment() {
|
||||||
|
|
||||||
|
@ -34,7 +35,7 @@ class RoomDetailFragment : RiotFragment() {
|
||||||
private val matrix by inject<Matrix>()
|
private val matrix by inject<Matrix>()
|
||||||
private val currentSession = matrix.currentSession
|
private val currentSession = matrix.currentSession
|
||||||
private var roomId by FragmentArgumentDelegate<String>()
|
private var roomId by FragmentArgumentDelegate<String>()
|
||||||
private val timelineEventController by inject<TimelineEventController>()
|
private val timelineEventController by inject<TimelineEventController>(parameters = { ParameterList(roomId) })
|
||||||
private lateinit var room: Room
|
private lateinit var room: Room
|
||||||
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
|
@ -81,7 +82,6 @@ class RoomDetailFragment : RiotFragment() {
|
||||||
|
|
||||||
private fun renderEvents(events: PagedList<EnrichedEvent>?) {
|
private fun renderEvents(events: PagedList<EnrichedEvent>?) {
|
||||||
timelineEventController.timeline = events
|
timelineEventController.timeline = events
|
||||||
timelineEventController.requestModelBuild()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,8 @@ import im.vector.matrix.android.api.session.events.model.EventType
|
||||||
import im.vector.riotredesign.core.extensions.localDateTime
|
import im.vector.riotredesign.core.extensions.localDateTime
|
||||||
import im.vector.riotredesign.features.home.LoadingItemModel_
|
import im.vector.riotredesign.features.home.LoadingItemModel_
|
||||||
|
|
||||||
class TimelineEventController(private val messageItemFactory: MessageItemFactory,
|
class TimelineEventController(private val roomId: String,
|
||||||
|
private val messageItemFactory: MessageItemFactory,
|
||||||
private val textItemFactory: TextItemFactory,
|
private val textItemFactory: TextItemFactory,
|
||||||
private val dateFormatter: TimelineDateFormatter
|
private val dateFormatter: TimelineDateFormatter
|
||||||
) : EpoxyController(
|
) : EpoxyController(
|
||||||
|
@ -18,35 +19,37 @@ class TimelineEventController(private val messageItemFactory: MessageItemFactory
|
||||||
|
|
||||||
private val pagedListCallback = object : PagedList.Callback() {
|
private val pagedListCallback = object : PagedList.Callback() {
|
||||||
override fun onChanged(position: Int, count: Int) {
|
override fun onChanged(position: Int, count: Int) {
|
||||||
requestModelBuild()
|
buildSnapshotList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onInserted(position: Int, count: Int) {
|
override fun onInserted(position: Int, count: Int) {
|
||||||
requestModelBuild()
|
buildSnapshotList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRemoved(position: Int, count: Int) {
|
override fun onRemoved(position: Int, count: Int) {
|
||||||
requestModelBuild()
|
buildSnapshotList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var snapshotList: List<EnrichedEvent>? = emptyList()
|
||||||
var timeline: PagedList<EnrichedEvent>? = null
|
var timeline: PagedList<EnrichedEvent>? = null
|
||||||
set(value) {
|
set(value) {
|
||||||
field?.removeWeakCallback(pagedListCallback)
|
field?.removeWeakCallback(pagedListCallback)
|
||||||
field = value
|
field = value
|
||||||
field?.addWeakCallback(null, pagedListCallback)
|
field?.addWeakCallback(null, pagedListCallback)
|
||||||
|
buildSnapshotList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun buildModels() {
|
override fun buildModels() {
|
||||||
buildModels(timeline)
|
buildModels(snapshotList)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildModels(data: List<EnrichedEvent>?) {
|
private fun buildModels(data: List<EnrichedEvent?>?) {
|
||||||
if (data.isNullOrEmpty()) {
|
if (data.isNullOrEmpty()) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for (index in 0 until data.size) {
|
for (index in 0 until data.size) {
|
||||||
val event = data[index]
|
val event = data[index] ?: continue
|
||||||
val nextEvent = if (index + 1 < data.size) data[index + 1] else null
|
val nextEvent = if (index + 1 < data.size) data[index + 1] else null
|
||||||
|
|
||||||
val date = event.root.localDateTime()
|
val date = event.root.localDateTime()
|
||||||
|
@ -55,7 +58,7 @@ class TimelineEventController(private val messageItemFactory: MessageItemFactory
|
||||||
|
|
||||||
val item = when (event.root.type) {
|
val item = when (event.root.type) {
|
||||||
EventType.MESSAGE -> messageItemFactory.create(event, nextEvent, addDaySeparator, date)
|
EventType.MESSAGE -> messageItemFactory.create(event, nextEvent, addDaySeparator, date)
|
||||||
else -> textItemFactory.create(event)
|
else -> textItemFactory.create(event)
|
||||||
}
|
}
|
||||||
item
|
item
|
||||||
?.onBind { timeline?.loadAround(index) }
|
?.onBind { timeline?.loadAround(index) }
|
||||||
|
@ -64,15 +67,20 @@ class TimelineEventController(private val messageItemFactory: MessageItemFactory
|
||||||
|
|
||||||
if (addDaySeparator) {
|
if (addDaySeparator) {
|
||||||
val formattedDay = dateFormatter.formatMessageDay(date)
|
val formattedDay = dateFormatter.formatMessageDay(date)
|
||||||
DaySeparatorItem(formattedDay).id(formattedDay).addTo(this)
|
DaySeparatorItem(formattedDay).id(roomId + formattedDay).addTo(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//It's a hack at the moment
|
//It's a hack at the moment
|
||||||
val isLastEvent = data.last().root.type == EventType.STATE_ROOM_CREATE
|
val isLastEvent = data.last()?.root?.type == EventType.STATE_ROOM_CREATE
|
||||||
LoadingItemModel_()
|
LoadingItemModel_()
|
||||||
.id("backward_loading_item")
|
.id(roomId + "backward_loading_item")
|
||||||
.addIf(!isLastEvent, this)
|
.addIf(!isLastEvent, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun buildSnapshotList() {
|
||||||
|
snapshotList = timeline?.snapshot() ?: emptyList()
|
||||||
|
requestModelBuild()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue