diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt index cecc528cee..6c790d7b1d 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt @@ -30,7 +30,6 @@ import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo -import io.element.android.libraries.matrix.api.timeline.item.event.LazyTimelineItemProvider import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails @@ -167,10 +166,8 @@ internal fun aTimelineItemEvent( inReplyTo = inReplyTo, isThreaded = isThreaded, origin = null, - lazyTimelineItemProvider = object : LazyTimelineItemProvider { - override fun getTimelineItemDebugInfo(): TimelineItemDebugInfo = debugInfo - override fun getShield(strict: Boolean): MessageShield? = messageShield - } + timelineItemDebugInfoProvider = { debugInfo }, + messageShieldProvider = { messageShield }, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewMessageShieldPreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewMessageShieldPreview.kt index ddbc98c638..99f69675fa 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewMessageShieldPreview.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewMessageShieldPreview.kt @@ -17,7 +17,6 @@ import io.element.android.features.messages.impl.timeline.model.event.aTimelineI import io.element.android.features.messages.impl.timeline.protection.aTimelineProtectionState import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.matrix.api.timeline.item.event.LazyTimelineItemProvider import kotlinx.collections.immutable.toImmutableList @PreviewsDayNight @@ -28,10 +27,7 @@ internal fun TimelineViewMessageShieldPreview() = ElementPreview { val messageShield = aCriticalShield() val items = listOf( (timelineItems.first() as TimelineItem.Event).copy( - lazyTimelineItemProvider = object : LazyTimelineItemProvider { - override fun getTimelineItemDebugInfo() = aTimelineItemDebugInfo() - override fun getShield(strict: Boolean) = messageShield - } + messageShieldProvider = { messageShield }, ) ) + timelineItems.drop(1) CompositionLocalProvider( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt index d276dbd5d5..21004fb4ab 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt @@ -86,7 +86,8 @@ class TimelineItemEventFactory @AssistedInject constructor( inReplyTo = currentTimelineItem.event.inReplyTo()?.map(permalinkParser = permalinkParser), isThreaded = currentTimelineItem.event.isThreaded(), origin = currentTimelineItem.event.origin, - lazyTimelineItemProvider = currentTimelineItem.event.lazyTimelineItemProvider, + timelineItemDebugInfoProvider = currentTimelineItem.event.timelineItemDebugInfoProvider, + messageShieldProvider = currentTimelineItem.event.messageShieldProvider, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt index 7748f46c06..d13fd992bf 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt @@ -18,10 +18,11 @@ import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo -import io.element.android.libraries.matrix.api.timeline.item.event.LazyTimelineItemProvider import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield +import io.element.android.libraries.matrix.api.timeline.item.event.MessageShieldProvider import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails +import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemDebugInfoProvider import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemEventOrigin import io.element.android.libraries.matrix.api.timeline.item.event.getDisambiguatedDisplayName import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails @@ -76,7 +77,8 @@ sealed interface TimelineItem { val inReplyTo: InReplyToDetails?, val isThreaded: Boolean, val origin: TimelineItemEventOrigin?, - val lazyTimelineItemProvider: LazyTimelineItemProvider, + val timelineItemDebugInfoProvider: TimelineItemDebugInfoProvider, + val messageShieldProvider: MessageShieldProvider, ) : TimelineItem { val showSenderInformation = groupPosition.isNew() && !isMine @@ -91,10 +93,10 @@ sealed interface TimelineItem { val isRemote = eventId != null // No need to be lazy here? - val messageShield: MessageShield? = lazyTimelineItemProvider.getShield(strict = false) + val messageShield: MessageShield? = messageShieldProvider(strict = false) val debugInfo: TimelineItemDebugInfo - get() = lazyTimelineItemProvider.getTimelineItemDebugInfo() + get() = timelineItemDebugInfoProvider() } @Immutable diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt index 7f197f93f1..3a4d343203 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt @@ -20,7 +20,6 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo -import io.element.android.libraries.matrix.api.timeline.item.event.LazyTimelineItemProvider import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield import io.element.android.libraries.matrix.test.AN_EVENT_ID @@ -61,8 +60,6 @@ internal fun aMessageEvent( inReplyTo = inReplyTo, isThreaded = isThreaded, origin = null, - lazyTimelineItemProvider = object : LazyTimelineItemProvider { - override fun getTimelineItemDebugInfo() = debugInfo - override fun getShield(strict: Boolean) = messageShield - }, + timelineItemDebugInfoProvider = { debugInfo }, + messageShieldProvider = { messageShield }, ) diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouperTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouperTest.kt index 2b76ab6a90..a5a806fe5b 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouperTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouperTest.kt @@ -18,7 +18,6 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt import io.element.android.features.messages.impl.timeline.model.virtual.aTimelineItemDaySeparatorModel import io.element.android.libraries.designsystem.components.avatar.anAvatarData import io.element.android.libraries.matrix.api.core.UniqueId -import io.element.android.libraries.matrix.api.timeline.item.event.LazyTimelineItemProvider import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.A_USER_ID @@ -43,10 +42,8 @@ class TimelineItemGrouperTest { inReplyTo = null, isThreaded = false, origin = null, - lazyTimelineItemProvider = object : LazyTimelineItemProvider { - override fun getTimelineItemDebugInfo() = aTimelineItemDebugInfo() - override fun getShield(strict: Boolean) = null - }, + timelineItemDebugInfoProvider = { aTimelineItemDebugInfo() }, + messageShieldProvider = { null }, ) private val aNonGroupableItem = aMessageEvent() private val aNonGroupableItemNoEvent = TimelineItem.Virtual(UniqueId("virtual"), aTimelineItemDaySeparatorModel("Today")) diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/RedactedVoiceMessageManagerTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/RedactedVoiceMessageManagerTest.kt index 284254045a..a980467add 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/RedactedVoiceMessageManagerTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/RedactedVoiceMessageManagerTest.kt @@ -14,7 +14,6 @@ import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem -import io.element.android.libraries.matrix.api.timeline.item.event.LazyTimelineItemProvider import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails import io.element.android.libraries.matrix.api.timeline.item.event.RedactedContent import io.element.android.libraries.matrix.test.AN_EVENT_ID @@ -89,15 +88,14 @@ fun aRedactedMatrixTimeline(eventId: EventId) = listOf( timestamp = 9442, content = RedactedContent, origin = null, - lazyTimelineItemProvider = object : LazyTimelineItemProvider { - override fun getTimelineItemDebugInfo() = TimelineItemDebugInfo( + timelineItemDebugInfoProvider = { + TimelineItemDebugInfo( model = "enim", originalJson = null, - latestEditedJson = null + latestEditedJson = null, ) - - override fun getShield(strict: Boolean) = null }, + messageShieldProvider = { null }, ), ) ) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt index e9c27cf022..eb8923d1d6 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt @@ -28,7 +28,8 @@ data class EventTimelineItem( val timestamp: Long, val content: EventContent, val origin: TimelineItemEventOrigin?, - val lazyTimelineItemProvider: LazyTimelineItemProvider, + val timelineItemDebugInfoProvider: TimelineItemDebugInfoProvider, + val messageShieldProvider: MessageShieldProvider, ) { fun inReplyTo(): InReplyTo? { return (content as? MessageContent)?.inReplyTo @@ -44,7 +45,10 @@ data class EventTimelineItem( } } -interface LazyTimelineItemProvider { - fun getTimelineItemDebugInfo(): TimelineItemDebugInfo - fun getShield(strict: Boolean): MessageShield? +fun interface TimelineItemDebugInfoProvider { + operator fun invoke(): TimelineItemDebugInfo +} + +fun interface MessageShieldProvider { + operator fun invoke(strict: Boolean): MessageShield? } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt index c423d976dd..95b11e10c1 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt @@ -14,7 +14,6 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.event.EventReaction import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem -import io.element.android.libraries.matrix.api.timeline.item.event.LazyTimelineItemProvider import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails @@ -32,7 +31,6 @@ import uniffi.matrix_sdk_common.ShieldStateCode import org.matrix.rustcomponents.sdk.EventSendState as RustEventSendState import org.matrix.rustcomponents.sdk.EventTimelineItem as RustEventTimelineItem import org.matrix.rustcomponents.sdk.EventTimelineItemDebugInfo as RustEventTimelineItemDebugInfo -import org.matrix.rustcomponents.sdk.LazyTimelineItemProvider as RustLazyTimelineItemProvider import org.matrix.rustcomponents.sdk.ProfileDetails as RustProfileDetails import org.matrix.rustcomponents.sdk.Receipt as RustReceipt import uniffi.matrix_sdk_ui.EventItemOrigin as RustEventItemOrigin @@ -56,7 +54,8 @@ class EventTimelineItemMapper( timestamp = timestamp.toLong(), content = contentMapper.map(content), origin = origin?.map(), - lazyTimelineItemProvider = LazyTimelineItemProviderWrapper(lazyProvider) + timelineItemDebugInfoProvider = { lazyProvider.debugInfo().map() }, + messageShieldProvider = { strict -> lazyProvider.getShields(strict)?.map() }, ) } } @@ -164,16 +163,6 @@ private fun ShieldState?.map(): MessageShield? { } } -class LazyTimelineItemProviderWrapper(private val provider: RustLazyTimelineItemProvider) : LazyTimelineItemProvider { - override fun getTimelineItemDebugInfo(): TimelineItemDebugInfo { - return provider.debugInfo().map() - } - - override fun getShield(strict: Boolean): MessageShield? { - return provider.getShields(strict)?.map() - } -} - private fun EventOrTransactionId.eventId(): EventId? { return (this as? EventOrTransactionId.EventId)?.let { EventId(it.eventId) } } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/TimelineFixture.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/TimelineFixture.kt index 09c3d52969..e1c6d9829e 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/TimelineFixture.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/TimelineFixture.kt @@ -19,7 +19,6 @@ import io.element.android.libraries.matrix.api.timeline.item.event.EventContent import io.element.android.libraries.matrix.api.timeline.item.event.EventReaction import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo -import io.element.android.libraries.matrix.api.timeline.item.event.LazyTimelineItemProvider import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.api.timeline.item.event.MessageContent import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield @@ -69,10 +68,8 @@ fun anEventTimelineItem( timestamp = timestamp, content = content, origin = null, - lazyTimelineItemProvider = object : LazyTimelineItemProvider { - override fun getTimelineItemDebugInfo() = debugInfo - override fun getShield(strict: Boolean) = messageShield - }, + timelineItemDebugInfoProvider = { debugInfo }, + messageShieldProvider = { messageShield }, ) fun aProfileTimelineDetails(