Revert screen recomposition fixes

This commit is contained in:
bxdxnn
2026-05-29 10:56:18 +00:00
parent e1f968390a
commit 64b6a1523d
2 changed files with 8 additions and 58 deletions
@@ -51,7 +51,6 @@ import io.element.android.libraries.matrix.api.core.asEventId
import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.api.room.powerlevels.permissionsAsState import io.element.android.libraries.matrix.api.room.powerlevels.permissionsAsState
import io.element.android.libraries.matrix.api.room.roomMembers import io.element.android.libraries.matrix.api.room.roomMembers
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
import io.element.android.libraries.matrix.api.timeline.ReceiptType import io.element.android.libraries.matrix.api.timeline.ReceiptType
import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemEventOrigin import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemEventOrigin
@@ -255,25 +254,15 @@ class TimelinePresenter(
} }
.launchIn(this) .launchIn(this)
var previousItems: List<MatrixTimelineItem>? = null
combine(timelineController.timelineItems(), room.membersStateFlow) { items, membersState -> combine(timelineController.timelineItems(), room.membersStateFlow) { items, membersState ->
val roomMembers = membersState.roomMembers().orEmpty() val parent = analyticsService.getLongRunningTransaction(DisplayFirstTimelineItems)
if (previousItems !== items) { val transaction = parent?.startChild("timelineItemsFactory.replaceWith", "Processing timeline items")
previousItems = items transaction?.putExtraData(AnalyticsUserData.TIMELINE_ITEM_COUNT, items.count().toString())
val parent = analyticsService.getLongRunningTransaction(DisplayFirstTimelineItems) timelineItemsFactory.replaceWith(
val transaction = parent?.startChild("timelineItemsFactory.replaceWith", "Processing timeline items") timelineItems = items,
transaction?.putExtraData(AnalyticsUserData.TIMELINE_ITEM_COUNT, items.count().toString()) roomMembers = membersState.roomMembers().orEmpty()
timelineItemsFactory.replaceWith( )
timelineItems = items, transaction?.finish()
roomMembers = roomMembers
)
transaction?.finish()
} else {
timelineItemsFactory.updateRoomMembers(
timelineItems = items,
roomMembers = roomMembers
)
}
items items
} }
.onEach(redactedVoiceMessageManager::onEachMatrixTimelineItem) .onEach(redactedVoiceMessageManager::onEachMatrixTimelineItem)
@@ -72,45 +72,6 @@ class TimelineItemsFactory(
} }
} }
/**
* Lightweight update that only refreshes member-derived data (e.g., read receipt display names)
* on cached items without rebuilding the diff cache or creating new items.
* Skips emission if no cached items have member-dependent state.
*/
suspend fun updateRoomMembers(
timelineItems: List<MatrixTimelineItem>,
roomMembers: List<RoomMember>,
) = withContext(dispatchers.computation) {
lock.withLock {
var hasUpdates = false
val updatedStates = ArrayList<TimelineItem>()
for (index in diffCache.indices().reversed()) {
val cacheItem = diffCache.get(index)
if (cacheItem is TimelineItem.Event && roomMembers.isNotEmpty()) {
val updatedItem = eventItemFactory.update(
timelineItem = cacheItem,
receivedMatrixTimelineItem = timelineItems[index] as MatrixTimelineItem.Event,
roomMembers = roomMembers
)
diffCache[index] = updatedItem
hasUpdates = true
updatedStates.add(updatedItem)
} else if (cacheItem != null) {
updatedStates.add(cacheItem)
} else {
buildAndCacheItem(timelineItems, index, roomMembers)?.also { timelineItemState ->
updatedStates.add(timelineItemState)
}
}
}
if (hasUpdates) {
val result = timelineItemGrouper.group(updatedStates).toImmutableList()
val filteredResult = filterEmptyDaySeparators(result)
_timelineItems.emit(filteredResult)
}
}
}
private suspend fun buildAndEmitTimelineItemStates( private suspend fun buildAndEmitTimelineItemStates(
timelineItems: List<MatrixTimelineItem>, timelineItems: List<MatrixTimelineItem>,
roomMembers: List<RoomMember>, roomMembers: List<RoomMember>,