From 64b6a1523d05ee8138dc7bb5fdc07051cfcdbfb5 Mon Sep 17 00:00:00 2001 From: bxdxnn <267911624+bxdxnn@users.noreply.github.com> Date: Fri, 29 May 2026 10:56:18 +0000 Subject: [PATCH] Revert screen recomposition fixes --- .../impl/timeline/TimelinePresenter.kt | 27 ++++--------- .../factories/TimelineItemsFactory.kt | 39 ------------------- 2 files changed, 8 insertions(+), 58 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt index 3af7326ff5..0b99c45e06 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt @@ -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.powerlevels.permissionsAsState 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.Timeline import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemEventOrigin @@ -255,25 +254,15 @@ class TimelinePresenter( } .launchIn(this) - var previousItems: List? = null combine(timelineController.timelineItems(), room.membersStateFlow) { items, membersState -> - val roomMembers = membersState.roomMembers().orEmpty() - if (previousItems !== items) { - previousItems = items - val parent = analyticsService.getLongRunningTransaction(DisplayFirstTimelineItems) - val transaction = parent?.startChild("timelineItemsFactory.replaceWith", "Processing timeline items") - transaction?.putExtraData(AnalyticsUserData.TIMELINE_ITEM_COUNT, items.count().toString()) - timelineItemsFactory.replaceWith( - timelineItems = items, - roomMembers = roomMembers - ) - transaction?.finish() - } else { - timelineItemsFactory.updateRoomMembers( - timelineItems = items, - roomMembers = roomMembers - ) - } + val parent = analyticsService.getLongRunningTransaction(DisplayFirstTimelineItems) + val transaction = parent?.startChild("timelineItemsFactory.replaceWith", "Processing timeline items") + transaction?.putExtraData(AnalyticsUserData.TIMELINE_ITEM_COUNT, items.count().toString()) + timelineItemsFactory.replaceWith( + timelineItems = items, + roomMembers = membersState.roomMembers().orEmpty() + ) + transaction?.finish() items } .onEach(redactedVoiceMessageManager::onEachMatrixTimelineItem) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt index d1ec5b648a..dc8bdddc92 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt @@ -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, - roomMembers: List, - ) = withContext(dispatchers.computation) { - lock.withLock { - var hasUpdates = false - val updatedStates = ArrayList() - 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( timelineItems: List, roomMembers: List,