Invalidate the timeline when the DM state changes for a room
We need to redraw messages when this changes, since we use different layouts for DMs and non-direct chats. Change-Id: Icf2df3a14655f7c9b6e5f7cdb29b590f393de4fd
This commit is contained in:
parent
b5e3a83ff2
commit
d3ca5d0db0
@ -95,6 +95,11 @@ interface Timeline {
|
|||||||
*/
|
*/
|
||||||
fun getTimelineEventWithId(eventId: String?): TimelineEvent?
|
fun getTimelineEventWithId(eventId: String?): TimelineEvent?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the DM flag of the room is changed
|
||||||
|
*/
|
||||||
|
fun onDmStateChanged()
|
||||||
|
|
||||||
interface Listener {
|
interface Listener {
|
||||||
/**
|
/**
|
||||||
* Call when the timeline has been updated through pagination or sync.
|
* Call when the timeline has been updated through pagination or sync.
|
||||||
@ -112,6 +117,11 @@ interface Timeline {
|
|||||||
* Called when new events come through the sync
|
* Called when new events come through the sync
|
||||||
*/
|
*/
|
||||||
fun onNewTimelineEvents(eventIds: List<String>)
|
fun onNewTimelineEvents(eventIds: List<String>)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the DM flag of the room is changed
|
||||||
|
*/
|
||||||
|
fun onDmStateChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -285,6 +285,12 @@ internal class DefaultTimeline(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onDmStateChanged() {
|
||||||
|
listeners.forEach {
|
||||||
|
it.onDmStateChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?): Boolean {
|
override fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?): Boolean {
|
||||||
return tryOrNull {
|
return tryOrNull {
|
||||||
builtEventsIdMap[eventId]?.let { builtIndex ->
|
builtEventsIdMap[eventId]?.let { builtIndex ->
|
||||||
|
@ -1498,6 +1498,7 @@ class RoomDetailViewModel @AssistedInject constructor(
|
|||||||
|
|
||||||
private fun observeSummaryState() {
|
private fun observeSummaryState() {
|
||||||
asyncSubscribe(RoomDetailViewState::asyncRoomSummary) { summary ->
|
asyncSubscribe(RoomDetailViewState::asyncRoomSummary) { summary ->
|
||||||
|
val previousSummary = roomSummariesHolder.get(summary.roomId)
|
||||||
roomSummariesHolder.set(summary)
|
roomSummariesHolder.set(summary)
|
||||||
setState {
|
setState {
|
||||||
val typingMessage = typingHelper.getTypingMessage(summary.typingUsers)
|
val typingMessage = typingHelper.getTypingMessage(summary.typingUsers)
|
||||||
@ -1516,6 +1517,9 @@ class RoomDetailViewModel @AssistedInject constructor(
|
|||||||
room.getStateEvent(EventType.STATE_ROOM_TOMBSTONE)?.also {
|
room.getStateEvent(EventType.STATE_ROOM_TOMBSTONE)?.also {
|
||||||
setState { copy(tombstoneEvent = it) }
|
setState { copy(tombstoneEvent = it) }
|
||||||
}
|
}
|
||||||
|
if (previousSummary == null || previousSummary.isDirect != summary.isDirect) {
|
||||||
|
timeline.onDmStateChanged()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1567,4 +1571,8 @@ class RoomDetailViewModel @AssistedInject constructor(
|
|||||||
callManager.removePstnSupportListener(this)
|
callManager.removePstnSupportListener(this)
|
||||||
super.onCleared()
|
super.onCleared()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onDmStateChanged() {
|
||||||
|
// No-op
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,7 @@ import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventDiff
|
|||||||
import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventVisibilityHelper
|
import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventVisibilityHelper
|
||||||
import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventVisibilityStateChangedListener
|
import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventVisibilityStateChangedListener
|
||||||
import im.vector.app.features.home.room.detail.timeline.factory.TimelineItemFactoryParams
|
import im.vector.app.features.home.room.detail.timeline.factory.TimelineItemFactoryParams
|
||||||
|
import im.vector.app.features.home.room.detail.timeline.helper.InvalidateTimelineEventDiffUtilCallback
|
||||||
import im.vector.app.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider
|
import im.vector.app.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider
|
||||||
import im.vector.app.features.home.room.detail.timeline.item.AbsMessageItem
|
import im.vector.app.features.home.room.detail.timeline.item.AbsMessageItem
|
||||||
import im.vector.app.features.home.room.detail.timeline.item.BasedMergedItem
|
import im.vector.app.features.home.room.detail.timeline.item.BasedMergedItem
|
||||||
@ -292,6 +293,18 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
|
|||||||
// no-op, already handled
|
// no-op, already handled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onDmStateChanged() {
|
||||||
|
backgroundHandler.post {
|
||||||
|
inSubmitList = true
|
||||||
|
// Invalidate all timeline events to rebuild the whole Room/DM layout
|
||||||
|
val diffCallback = InvalidateTimelineEventDiffUtilCallback(currentSnapshot)
|
||||||
|
val diffResult = DiffUtil.calculateDiff(diffCallback)
|
||||||
|
diffResult.dispatchUpdatesTo(listUpdateCallback)
|
||||||
|
requestModelBuild()
|
||||||
|
inSubmitList = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun submitSnapshot(newSnapshot: List<TimelineEvent>) {
|
private fun submitSnapshot(newSnapshot: List<TimelineEvent>) {
|
||||||
backgroundHandler.post {
|
backgroundHandler.post {
|
||||||
inSubmitList = true
|
inSubmitList = true
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
package im.vector.app.features.home.room.detail.timeline.helper
|
||||||
|
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
|
||||||
|
|
||||||
|
class InvalidateTimelineEventDiffUtilCallback(private val oldAndNewList: List<TimelineEvent>): DiffUtil.Callback() {
|
||||||
|
|
||||||
|
override fun getOldListSize(): Int {
|
||||||
|
return oldAndNewList.size
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getNewListSize(): Int {
|
||||||
|
return oldAndNewList.size
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
|
||||||
|
// We want to 'fake' updated items with this class - updated means in this case, not completely invalidated.
|
||||||
|
return oldItemPosition == newItemPosition
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
|
||||||
|
// We want to 'fake' updated items with this class.
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user