From 6bb979a83313f7a42df1c9ba0bcd6ee0a5a3c2ec Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 27 Jan 2026 09:45:10 +0100 Subject: [PATCH] TimelineEvents -> TimelineEvent --- .../features/messages/impl/MessagesNode.kt | 10 ++-- .../messages/impl/MessagesPresenter.kt | 4 +- .../features/messages/impl/MessagesView.kt | 8 +-- .../impl/threads/ThreadedMessagesNode.kt | 10 ++-- .../{TimelineEvents.kt => TimelineEvent.kt} | 24 ++++----- .../impl/timeline/TimelinePresenter.kt | 30 +++++------ .../messages/impl/timeline/TimelineState.kt | 2 +- .../impl/timeline/TimelineStateProvider.kt | 2 +- .../messages/impl/timeline/TimelineView.kt | 14 ++--- .../components/TimelineEventTimestampView.kt | 9 ++-- .../components/TimelineItemEventRow.kt | 12 ++--- .../TimelineItemGroupedEventsRow.kt | 6 +-- .../timeline/components/TimelineItemRow.kt | 4 +- .../components/TimelineItemStateEventRow.kt | 4 +- .../components/TimelineItemVirtualRow.kt | 8 +-- .../event/TimelineItemEventContentView.kt | 4 +- .../components/event/TimelineItemPollView.kt | 10 ++-- .../messages/impl/MessagesPresenterTest.kt | 8 +-- .../messages/impl/MessagesViewTest.kt | 14 ++--- .../impl/timeline/TimelinePresenterTest.kt | 51 +++++++++---------- .../impl/timeline/TimelineViewTest.kt | 28 +++++----- .../event/TimelineItemPollViewTest.kt | 14 ++--- 22 files changed, 137 insertions(+), 139 deletions(-) rename features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/{TimelineEvents.kt => TimelineEvent.kt} (77%) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt index b2507e6870..e892f80c7d 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt @@ -36,7 +36,7 @@ import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.messagecomposer.MessageComposerEvent import io.element.android.features.messages.impl.messagecomposer.MessageComposerPresenter import io.element.android.features.messages.impl.timeline.TimelineController -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.TimelinePresenter import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactories @@ -151,7 +151,7 @@ class MessagesNode( activity: Activity, darkTheme: Boolean, url: String, - eventSink: (TimelineEvents) -> Unit, + eventSink: (TimelineEvent) -> Unit, customTab: Boolean ) { when (val permalink = permalinkParser.parse(url)) { @@ -178,12 +178,12 @@ class MessagesNode( private fun handleRoomLinkClick( roomLink: PermalinkData.RoomLink, - eventSink: (TimelineEvents) -> Unit, + eventSink: (TimelineEvent) -> Unit, ) { if (room.matches(roomLink.roomIdOrAlias)) { val eventId = roomLink.eventId if (eventId != null) { - eventSink(TimelineEvents.FocusOnEvent(eventId)) + eventSink(TimelineEvent.FocusOnEvent(eventId)) } else { // Click on the same room, ignore displaySameRoomToast() @@ -305,7 +305,7 @@ class MessagesNode( } LaunchedEffect(focusedEventId) { if (focusedEventId != null) { - state.timelineState.eventSink(TimelineEvents.FocusOnEvent(focusedEventId!!)) + state.timelineState.eventSink(TimelineEvent.FocusOnEvent(focusedEventId!!)) focusedEventId = null } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 5f2413c9a1..c1f8effd64 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -37,7 +37,7 @@ import io.element.android.features.messages.impl.messagecomposer.MessageComposer import io.element.android.features.messages.impl.pinned.banner.PinnedMessagesBannerState import io.element.android.features.messages.impl.timeline.MarkAsFullyRead import io.element.android.features.messages.impl.timeline.TimelineController -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.TimelineState import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionState import io.element.android.features.messages.impl.timeline.components.reactionsummary.ReactionSummaryState @@ -527,7 +527,7 @@ class MessagesPresenter( event: TimelineItem.Event, timelineState: TimelineState, ) { - event.eventId?.let { timelineState.eventSink(TimelineEvents.EndPoll(it)) } + event.eventId?.let { timelineState.eventSink(TimelineEvent.EndPoll(it)) } } private suspend fun handleCopyLink(event: TimelineItem.Event) { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt index 4dfbe74fda..2d9319c262 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt @@ -68,7 +68,7 @@ import io.element.android.features.messages.impl.pinned.banner.PinnedMessagesBan import io.element.android.features.messages.impl.pinned.banner.PinnedMessagesBannerView import io.element.android.features.messages.impl.pinned.banner.PinnedMessagesBannerViewDefaults import io.element.android.features.messages.impl.timeline.FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.TimelineView import io.element.android.features.messages.impl.timeline.aGroupedEvents import io.element.android.features.messages.impl.timeline.aTimelineItemDaySeparator @@ -301,7 +301,7 @@ fun MessagesView( state = state, onLinkClick = { url, customTab -> onLinkClick(url, customTab) }, onRoomSuccessorClick = { roomId -> - state.timelineState.eventSink(TimelineEvents.NavigateToPredecessorOrSuccessorRoom(roomId = roomId)) + state.timelineState.eventSink(TimelineEvent.NavigateToPredecessorOrSuccessorRoom(roomId = roomId)) }, ) }, @@ -371,7 +371,7 @@ fun MessagesView( }, onEmojiReactionClick = ::onEmojiReactionClick, onVerifiedUserSendFailureClick = { event -> - state.timelineState.eventSink(TimelineEvents.ComputeVerifiedUserSendFailure(event)) + state.timelineState.eventSink(TimelineEvent.ComputeVerifiedUserSendFailure(event)) }, ) @@ -489,7 +489,7 @@ private fun MessagesViewContent( ) { fun focusOnPinnedEvent(eventId: EventId) { state.timelineState.eventSink( - TimelineEvents.FocusOnEvent(eventId = eventId, debounce = FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS.milliseconds) + TimelineEvent.FocusOnEvent(eventId = eventId, debounce = FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS.milliseconds) ) } PinnedMessagesBannerView( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt index 10922ca5e7..03953e0e29 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt @@ -36,7 +36,7 @@ import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.messagecomposer.MessageComposerEvent import io.element.android.features.messages.impl.messagecomposer.MessageComposerPresenter import io.element.android.features.messages.impl.timeline.TimelineController -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.TimelinePresenter import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactories @@ -148,7 +148,7 @@ class ThreadedMessagesNode( activity: Activity, darkTheme: Boolean, url: String, - eventSink: (TimelineEvents) -> Unit, + eventSink: (TimelineEvent) -> Unit, customTab: Boolean ) { when (val permalink = permalinkParser.parse(url)) { @@ -175,12 +175,12 @@ class ThreadedMessagesNode( private fun handleRoomLinkClick( roomLink: PermalinkData.RoomLink, - eventSink: (TimelineEvents) -> Unit, + eventSink: (TimelineEvent) -> Unit, ) { if (room.matches(roomLink.roomIdOrAlias)) { val eventId = roomLink.eventId if (eventId != null) { - eventSink(TimelineEvents.FocusOnEvent(eventId)) + eventSink(TimelineEvent.FocusOnEvent(eventId)) } else { // Click on the same room, navigate up // Note that it can not be enough to go back to the room if the thread has been opened @@ -277,7 +277,7 @@ class ThreadedMessagesNode( } LaunchedEffect(Unit) { focusedEventId?.also { eventId -> - state.timelineState.eventSink(TimelineEvents.FocusOnEvent(eventId)) + state.timelineState.eventSink(TimelineEvent.FocusOnEvent(eventId)) } // Reset the focused event id to null to avoid refocusing when restoring node. focusedEventId = null diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvents.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvent.kt similarity index 77% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvents.kt rename to features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvent.kt index c7fe37b531..b3fc841ba9 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvents.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvent.kt @@ -16,19 +16,19 @@ import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.timeline.Timeline import kotlin.time.Duration -sealed interface TimelineEvents { - data class OnScrollFinished(val firstIndex: Int) : TimelineEvents - data class FocusOnEvent(val eventId: EventId, val debounce: Duration = Duration.ZERO) : TimelineEvents - data object ClearFocusRequestState : TimelineEvents - data object OnFocusEventRender : TimelineEvents - data object JumpToLive : TimelineEvents +sealed interface TimelineEvent { + data class OnScrollFinished(val firstIndex: Int) : TimelineEvent + data class FocusOnEvent(val eventId: EventId, val debounce: Duration = Duration.ZERO) : TimelineEvent + data object ClearFocusRequestState : TimelineEvent + data object OnFocusEventRender : TimelineEvent + data object JumpToLive : TimelineEvent - data object HideShieldDialog : TimelineEvents + data object HideShieldDialog : TimelineEvent /** * Events coming from a timeline item. */ - sealed interface EventFromTimelineItem : TimelineEvents + sealed interface EventFromTimelineItem : TimelineEvent data class ComputeVerifiedUserSendFailure(val event: TimelineItem.Event) : EventFromTimelineItem data class ShowShieldDialog(val messageShieldData: MessageShieldData) : EventFromTimelineItem @@ -43,18 +43,18 @@ sealed interface TimelineEvents { /** * Events coming from a poll item. */ - sealed interface TimelineItemPollEvents : EventFromTimelineItem + sealed interface TimelineItemPollEvent : EventFromTimelineItem data class SelectPollAnswer( val pollStartId: EventId, val answerId: String - ) : TimelineItemPollEvents + ) : TimelineItemPollEvent data class EndPoll( val pollStartId: EventId, - ) : TimelineItemPollEvents + ) : TimelineItemPollEvent data class EditPoll( val pollStartId: EventId, - ) : TimelineItemPollEvents + ) : TimelineItemPollEvent } 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 8d1612ff1e..df704287a3 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 @@ -150,9 +150,9 @@ class TimelinePresenter( value = featureFlagService.isFeatureEnabled(FeatureFlags.Threads) } - fun handleEvent(event: TimelineEvents) { + fun handleEvent(event: TimelineEvent) { when (event) { - is TimelineEvents.LoadMore -> { + is TimelineEvent.LoadMore -> { if (event.direction == Timeline.PaginationDirection.FORWARDS && timelineMode is Timeline.Mode.Thread) { // Do not paginate forwards in thread mode, as it's not supported return @@ -161,7 +161,7 @@ class TimelinePresenter( timelineController.paginate(direction = event.direction) } } - is TimelineEvents.OnScrollFinished -> { + is TimelineEvent.OnScrollFinished -> { if (isLive) { if (event.firstIndex == 0) { newEventState.value = NewEventState.None @@ -177,7 +177,7 @@ class TimelinePresenter( newEventState.value = NewEventState.None } } - is TimelineEvents.SelectPollAnswer -> sessionCoroutineScope.launch { + is TimelineEvent.SelectPollAnswer -> sessionCoroutineScope.launch { timelineController.invokeOnCurrentTimeline { sendPollResponseAction.execute( timeline = this, @@ -186,7 +186,7 @@ class TimelinePresenter( ) } } - is TimelineEvents.EndPoll -> sessionCoroutineScope.launch { + is TimelineEvent.EndPoll -> sessionCoroutineScope.launch { timelineController.invokeOnCurrentTimeline { endPollAction.execute( timeline = this, @@ -194,38 +194,38 @@ class TimelinePresenter( ) } } - is TimelineEvents.EditPoll -> { + is TimelineEvent.EditPoll -> { navigator.navigateToEditPoll(event.pollStartId) } - is TimelineEvents.FocusOnEvent -> sessionCoroutineScope.launch { + is TimelineEvent.FocusOnEvent -> sessionCoroutineScope.launch { focusRequestState.value = FocusRequestState.Requested(event.eventId, event.debounce) delay(event.debounce) Timber.tag(tag).d("Started focus on ${event.eventId}") focusOnEvent(event.eventId, focusRequestState) }.start() - is TimelineEvents.OnFocusEventRender -> { + is TimelineEvent.OnFocusEventRender -> { // If there was a pending 'notification tap opens timeline' transaction, finish it now we're focused in the required event analyticsService.finishLongRunningTransaction(NotificationToMessage) focusRequestState.value = focusRequestState.value.onFocusEventRender() } - is TimelineEvents.ClearFocusRequestState -> { + is TimelineEvent.ClearFocusRequestState -> { focusRequestState.value = FocusRequestState.None } - is TimelineEvents.JumpToLive -> { + is TimelineEvent.JumpToLive -> { timelineController.focusOnLive() } - TimelineEvents.HideShieldDialog -> messageShieldDialogData.value = null - is TimelineEvents.ShowShieldDialog -> messageShieldDialogData.value = event.messageShieldData - is TimelineEvents.ComputeVerifiedUserSendFailure -> { + TimelineEvent.HideShieldDialog -> messageShieldDialogData.value = null + is TimelineEvent.ShowShieldDialog -> messageShieldDialogData.value = event.messageShieldData + is TimelineEvent.ComputeVerifiedUserSendFailure -> { resolveVerifiedUserSendFailureState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(event.event)) } - is TimelineEvents.NavigateToPredecessorOrSuccessorRoom -> { + is TimelineEvent.NavigateToPredecessorOrSuccessorRoom -> { // Navigate to the predecessor or successor room val serverNames = calculateServerNamesForRoom(room) navigator.navigateToRoom(event.roomId, null, serverNames) } - is TimelineEvents.OpenThread -> { + is TimelineEvent.OpenThread -> { navigator.navigateToThread( threadRootId = event.threadRootEventId, focusedEventId = event.focusedEvent, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt index a53960f63b..03f0083856 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt @@ -34,7 +34,7 @@ data class TimelineState( val messageShieldDialogData: MessageShieldData?, val resolveVerifiedUserSendFailureState: ResolveVerifiedUserSendFailureState, val displayThreadSummaries: Boolean, - val eventSink: (TimelineEvents) -> Unit, + val eventSink: (TimelineEvent) -> Unit, ) { private val lastTimelineEvent = timelineItems.firstOrNull { it is TimelineItem.Event } as? TimelineItem.Event val hasAnyEvent = lastTimelineEvent != null 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 e2ed3d4307..adfaa93cce 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 @@ -56,7 +56,7 @@ fun aTimelineState( messageShield: MessageShield? = null, resolveVerifiedUserSendFailureState: ResolveVerifiedUserSendFailureState = aResolveVerifiedUserSendFailureState(), displayThreadSummaries: Boolean = false, - eventSink: (TimelineEvents) -> Unit = {}, + eventSink: (TimelineEvent) -> Unit = {}, ): TimelineState { val focusedEventId = timelineItems.filterIsInstance().getOrNull(focusedEventIndex)?.eventId val focusRequestState = if (focusedEventId != null) { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt index f8d488c0ba..e44a6e170c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt @@ -107,19 +107,19 @@ fun TimelineView( nestedScrollConnection: NestedScrollConnection = rememberNestedScrollInteropConnection(), ) { fun clearFocusRequestState() { - state.eventSink(TimelineEvents.ClearFocusRequestState) + state.eventSink(TimelineEvent.ClearFocusRequestState) } fun onScrollFinishAt(firstVisibleIndex: Int) { - state.eventSink(TimelineEvents.OnScrollFinished(firstVisibleIndex)) + state.eventSink(TimelineEvent.OnScrollFinished(firstVisibleIndex)) } fun onFocusEventRender() { - state.eventSink(TimelineEvents.OnFocusEventRender) + state.eventSink(TimelineEvent.OnFocusEventRender) } fun onJumpToLive() { - state.eventSink(TimelineEvents.JumpToLive) + state.eventSink(TimelineEvent.JumpToLive) } val context = LocalContext.current @@ -129,7 +129,7 @@ fun TimelineView( val useReverseLayout = !isTalkbackActive() fun inReplyToClick(eventId: EventId) { - state.eventSink(TimelineEvents.FocusOnEvent(eventId)) + state.eventSink(TimelineEvent.FocusOnEvent(eventId)) } fun onLinkLongClick(link: Link) { @@ -143,7 +143,7 @@ fun TimelineView( } fun prefetchMoreItems() { - state.eventSink(TimelineEvents.LoadMore(Timeline.PaginationDirection.BACKWARDS)) + state.eventSink(TimelineEvent.LoadMore(Timeline.PaginationDirection.BACKWARDS)) } // Animate alpha when timeline is first displayed, to avoid flashes or glitching when viewing rooms @@ -223,7 +223,7 @@ private fun MessageShieldDialog(state: TimelineState) { val messageShield = state.messageShieldDialogData ?: return AlertDialog( content = messageShield.toText(), - onDismiss = { state.eventSink.invoke(TimelineEvents.HideShieldDialog) }, + onDismiss = { state.eventSink.invoke(TimelineEvent.HideShieldDialog) }, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt index 40369595ea..a6ace1cadd 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.event.isEdited import io.element.android.features.messages.impl.timeline.model.event.isRedacted @@ -33,13 +33,12 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState -import io.element.android.libraries.matrix.api.timeline.item.event.isCritical import io.element.android.libraries.ui.strings.CommonStrings @Composable fun TimelineEventTimestampView( event: TimelineItem.Event, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier, ) { val formattedTime = event.sentTime @@ -80,7 +79,7 @@ fun TimelineEventTimestampView( enabled = isVerifiedUserSendFailure, onClickLabel = stringResource(CommonStrings.action_open_context_menu), ) { - eventSink(TimelineEvents.ComputeVerifiedUserSendFailure(event)) + eventSink(TimelineEvent.ComputeVerifiedUserSendFailure(event)) } ) } @@ -96,7 +95,7 @@ fun TimelineEventTimestampView( .clickable( onClickLabel = stringResource(CommonStrings.a11y_view_details), ) { - eventSink(TimelineEvents.ShowShieldDialog(shield)) + eventSink(TimelineEvent.ShowShieldDialog(shield)) }, tint = shield.toIconColor(), ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt index 1f40e94a9b..811ba83759 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt @@ -57,7 +57,7 @@ import androidx.constraintlayout.compose.ConstrainScope import androidx.constraintlayout.compose.ConstraintLayout import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.TimelineRoomInfo import io.element.android.features.messages.impl.timeline.aTimelineItemEvent import io.element.android.features.messages.impl.timeline.components.event.TimelineItemEventContentView @@ -153,7 +153,7 @@ fun TimelineItemEventRow( onMoreReactionsClick: (eventId: TimelineItem.Event) -> Unit, onReadReceiptClick: (event: TimelineItem.Event) -> Unit, onSwipeToReply: () -> Unit, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier, eventContentView: @Composable (Modifier, (ContentAvoidingLayoutData) -> Unit) -> Unit = { contentModifier, onContentLayoutChange -> // Only pass down a custom clickable lambda if the content can be clicked separately @@ -278,7 +278,7 @@ fun TimelineItemEventRow( isOutgoing = event.isMine, onClick = { event.eventId?.let { - eventSink(TimelineEvents.OpenThread(it.toThreadId(), null)) + eventSink(TimelineEvent.OpenThread(it.toThreadId(), null)) } } ) @@ -410,7 +410,7 @@ private fun TimelineItemEventRowContent( onReactionClick: (emoji: String) -> Unit, onReactionLongClick: (emoji: String) -> Unit, onMoreReactionsClick: (event: TimelineItem.Event) -> Unit, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier, eventContentView: @Composable (Modifier, (ContentAvoidingLayoutData) -> Unit) -> Unit, ) { @@ -585,7 +585,7 @@ private fun MessageEventBubbleContent( timelineProtectionState: TimelineProtectionState, onMessageLongClick: () -> Unit, inReplyToClick: () -> Unit, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, @SuppressLint("ModifierParameter") // need to rename this modifier to prevent linter false positives @Suppress("ModifierNaming") @@ -623,7 +623,7 @@ private fun MessageEventBubbleContent( @Composable fun WithTimestampLayout( timestampPosition: TimestampPosition, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier, canShrinkContent: Boolean = false, content: @Composable (onContentLayoutChange: (ContentAvoidingLayoutData) -> Unit) -> Unit, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt index 66f2459491..9f5842afd4 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt @@ -16,7 +16,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Modifier import androidx.compose.ui.res.pluralStringResource import io.element.android.features.messages.impl.R -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.TimelineRoomInfo import io.element.android.features.messages.impl.timeline.aGroupedEvents import io.element.android.features.messages.impl.timeline.aTimelineRoomInfo @@ -57,7 +57,7 @@ fun TimelineItemGroupedEventsRow( onReactionLongClick: (key: String, TimelineItem.Event) -> Unit, onMoreReactionsClick: (TimelineItem.Event) -> Unit, onReadReceiptClick: (TimelineItem.Event) -> Unit, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier, eventContentView: @Composable (TimelineItem.Event, Modifier, (ContentAvoidingLayoutData) -> Unit) -> Unit = { event, contentModifier, onContentLayoutChange -> @@ -130,7 +130,7 @@ private fun TimelineItemGroupedEventsRowContent( onReactionLongClick: (key: String, TimelineItem.Event) -> Unit, onMoreReactionsClick: (TimelineItem.Event) -> Unit, onReadReceiptClick: (TimelineItem.Event) -> Unit, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier, eventContentView: @Composable (TimelineItem.Event, Modifier, (ContentAvoidingLayoutData) -> Unit) -> Unit = { event, contentModifier, onContentLayoutChange -> diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt index 4a0a6f70b8..93882e8436 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.TimelineRoomInfo import io.element.android.features.messages.impl.timeline.components.event.TimelineItemEventContentView import io.element.android.features.messages.impl.timeline.components.layout.ContentAvoidingLayoutData @@ -73,7 +73,7 @@ internal fun TimelineItemRow( onReadReceiptClick: (TimelineItem.Event) -> Unit, onSwipeToReply: (TimelineItem.Event) -> Unit, onJoinCallClick: () -> Unit, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier, eventContentView: @Composable (TimelineItem.Event, Modifier, (ContentAvoidingLayoutData) -> Unit) -> Unit = { event, contentModifier, onContentLayoutChange -> diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemStateEventRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemStateEventRow.kt index e796e93311..4c6f627af0 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemStateEventRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemStateEventRow.kt @@ -21,7 +21,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.aTimelineItemEvent import io.element.android.features.messages.impl.timeline.components.event.TimelineItemEventContentView import io.element.android.features.messages.impl.timeline.components.receipt.ReadReceiptViewState @@ -44,7 +44,7 @@ fun TimelineItemStateEventRow( onClick: () -> Unit, onLongClick: () -> Unit, onReadReceiptsClick: (event: TimelineItem.Event) -> Unit, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier ) { val interactionSource = remember { MutableInteractionSource() } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemVirtualRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemVirtualRow.kt index be94512c2c..a7685314f9 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemVirtualRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemVirtualRow.kt @@ -15,7 +15,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.TimelineRoomInfo import io.element.android.features.messages.impl.timeline.components.virtual.TimelineItemDaySeparatorView import io.element.android.features.messages.impl.timeline.components.virtual.TimelineItemReadMarkerView @@ -35,7 +35,7 @@ import timber.log.Timber fun TimelineItemVirtualRow( virtual: TimelineItem.Virtual, timelineRoomInfo: TimelineRoomInfo, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier ) { Box(modifier = modifier) { @@ -48,7 +48,7 @@ fun TimelineItemVirtualRow( roomName = timelineRoomInfo.name, isDm = timelineRoomInfo.isDm, onPredecessorRoomClick = { roomId -> - eventSink(TimelineEvents.NavigateToPredecessorOrSuccessorRoom(roomId)) + eventSink(TimelineEvent.NavigateToPredecessorOrSuccessorRoom(roomId)) }, ) } @@ -57,7 +57,7 @@ fun TimelineItemVirtualRow( val latestEventSink by rememberUpdatedState(eventSink) LaunchedEffect(virtual.model.timestamp) { Timber.d("Pagination triggered by load more indicator") - latestEventSink(TimelineEvents.LoadMore(virtual.model.direction)) + latestEventSink(TimelineEvent.LoadMore(virtual.model.direction)) } } // Empty model trick to avoid timeline jumping during forward pagination. diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEventContentView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEventContentView.kt index 73cd1ad8b8..dcd53e3fa2 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEventContentView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEventContentView.kt @@ -10,7 +10,7 @@ package io.element.android.features.messages.impl.timeline.components.event import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.components.layout.ContentAvoidingLayoutData import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.di.rememberPresenter @@ -43,7 +43,7 @@ fun TimelineItemEventContentView( onShowContentClick: () -> Unit, onLinkClick: (Link) -> Unit, onLinkLongClick: (Link) -> Unit, - eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, + eventSink: (TimelineEvent.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier, onContentLayoutChange: (ContentAvoidingLayoutData) -> Unit = {}, ) { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemPollView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemPollView.kt index ba72c067f0..e956a99b45 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemPollView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemPollView.kt @@ -11,7 +11,7 @@ package io.element.android.features.messages.impl.timeline.components.event import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewParameter -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContentProvider import io.element.android.features.poll.api.pollcontent.PollContentView @@ -23,19 +23,19 @@ import kotlinx.collections.immutable.toImmutableList @Composable fun TimelineItemPollView( content: TimelineItemPollContent, - eventSink: (TimelineEvents.TimelineItemPollEvents) -> Unit, + eventSink: (TimelineEvent.TimelineItemPollEvent) -> Unit, modifier: Modifier = Modifier, ) { fun onSelectAnswer(pollStartId: EventId, answerId: String) { - eventSink(TimelineEvents.SelectPollAnswer(pollStartId, answerId)) + eventSink(TimelineEvent.SelectPollAnswer(pollStartId, answerId)) } fun onEndPoll(pollStartId: EventId) { - eventSink(TimelineEvents.EndPoll(pollStartId)) + eventSink(TimelineEvent.EndPoll(pollStartId)) } fun onEditPoll(pollStartId: EventId) { - eventSink(TimelineEvents.EditPoll(pollStartId)) + eventSink(TimelineEvent.EditPoll(pollStartId)) } PollContentView( diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt index 3afe719798..15331f2ba5 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt @@ -28,7 +28,7 @@ import io.element.android.features.messages.impl.pinned.banner.aLoadedPinnedMess import io.element.android.features.messages.impl.timeline.FakeMarkAsFullyRead import io.element.android.features.messages.impl.timeline.MarkAsFullyRead import io.element.android.features.messages.impl.timeline.TimelineController -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.aTimelineState import io.element.android.features.messages.impl.timeline.model.TimelineItemThreadInfo import io.element.android.features.messages.impl.timeline.model.event.TimelineItemFileContent @@ -482,13 +482,13 @@ class MessagesPresenterTest { @Test fun `present - handle action end poll`() = runTest { - val timelineEventSink = EventsRecorder() + val timelineEventSink = EventsRecorder() val presenter = createMessagesPresenter(timelineEventSink = timelineEventSink) presenter.testWithLifecycleOwner { val initialState = awaitItem() initialState.eventSink(MessagesEvent.HandleAction(TimelineItemAction.EndPoll, aMessageEvent(content = aTimelineItemPollContent()))) delay(1) - timelineEventSink.assertSingle(TimelineEvents.EndPoll(AN_EVENT_ID)) + timelineEventSink.assertSingle(TimelineEvent.EndPoll(AN_EVENT_ID)) cancelAndIgnoreRemainingEvents() } } @@ -1263,7 +1263,7 @@ class MessagesPresenterTest { navigator: FakeMessagesNavigator = FakeMessagesNavigator(), clipboardHelper: FakeClipboardHelper = FakeClipboardHelper(), analyticsService: FakeAnalyticsService = FakeAnalyticsService(), - timelineEventSink: (TimelineEvents) -> Unit = {}, + timelineEventSink: (TimelineEvent) -> Unit = {}, permalinkParser: PermalinkParser = FakePermalinkParser(), messageComposerPresenter: Presenter = Presenter { aMessageComposerState( diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt index 336a3e67c7..ee272ac6f3 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt @@ -40,7 +40,7 @@ import io.element.android.features.messages.impl.messagecomposer.aMessageCompose import io.element.android.features.messages.impl.pinned.banner.PinnedMessagesBannerItem import io.element.android.features.messages.impl.pinned.banner.aLoadedPinnedMessagesBannerState import io.element.android.features.messages.impl.timeline.FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.aTimelineItemEvent import io.element.android.features.messages.impl.timeline.aTimelineItemList import io.element.android.features.messages.impl.timeline.aTimelineItemReadReceipts @@ -483,7 +483,7 @@ class MessagesViewTest { @Test fun `clicking on verified user send failure from action list emits the expected Event`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val state = aMessagesState() val timelineItem = state.timelineState.timelineItems.first() as TimelineItem.Event val stateWithActionListState = state.copy( @@ -506,7 +506,7 @@ class MessagesViewTest { rule.onNodeWithText(verifiedUserSendFailure).performClick() // Give time for the close animation to complete rule.mainClock.advanceTimeBy(milliseconds = 1_000) - eventsRecorder.assertSingle(TimelineEvents.ComputeVerifiedUserSendFailure(timelineItem)) + eventsRecorder.assertSingle(TimelineEvent.ComputeVerifiedUserSendFailure(timelineItem)) } @Test @@ -552,7 +552,7 @@ class MessagesViewTest { @Test fun `clicking on pinned messages banner emits the expected Event`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val state = aMessagesState( timelineState = aTimelineState(eventSink = eventsRecorder), pinnedMessagesBannerState = aLoadedPinnedMessagesBannerState( @@ -566,12 +566,12 @@ class MessagesViewTest { ) rule.setMessagesView(state = state) rule.onNodeWithText("This is a pinned message").performClick() - eventsRecorder.assertSingle(TimelineEvents.FocusOnEvent(AN_EVENT_ID, debounce = FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS.milliseconds)) + eventsRecorder.assertSingle(TimelineEvent.FocusOnEvent(AN_EVENT_ID, debounce = FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS.milliseconds)) } @Test fun `clicking on successor room button emits expected event`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val successorRoomId = RoomId("!successor:server.org") val state = aMessagesState( successorRoom = SuccessorRoom( @@ -584,7 +584,7 @@ class MessagesViewTest { val text = rule.activity.getString(R.string.screen_room_timeline_tombstoned_room_action) // The bottomsheet subcompose seems to make the node to appear twice rule.onAllNodesWithText(text).onFirst().performClick() - eventsRecorder.assertSingle(TimelineEvents.NavigateToPredecessorOrSuccessorRoom(successorRoomId)) + eventsRecorder.assertSingle(TimelineEvent.NavigateToPredecessorOrSuccessorRoom(successorRoomId)) } @Test diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt index 529e7fcdbe..194694714b 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt @@ -9,7 +9,6 @@ package io.element.android.features.messages.impl.timeline import app.cash.turbine.ReceiveTurbine -import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.messages.impl.FakeMessagesNavigator import io.element.android.features.messages.impl.crypto.sendfailure.resolve.aResolveVerifiedUserSendFailureState @@ -120,8 +119,8 @@ class TimelinePresenterTest { val presenter = createTimelinePresenter(timeline = timeline) presenter.test { val initialState = awaitItem() - initialState.eventSink.invoke(TimelineEvents.LoadMore(Timeline.PaginationDirection.BACKWARDS)) - initialState.eventSink.invoke(TimelineEvents.LoadMore(Timeline.PaginationDirection.FORWARDS)) + initialState.eventSink.invoke(TimelineEvent.LoadMore(Timeline.PaginationDirection.BACKWARDS)) + initialState.eventSink.invoke(TimelineEvent.LoadMore(Timeline.PaginationDirection.FORWARDS)) assert(paginateLambda) .isCalledExactly(2) .withSequence( @@ -173,7 +172,7 @@ class TimelinePresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink.invoke(TimelineEvents.OnScrollFinished(0)) + initialState.eventSink.invoke(TimelineEvent.OnScrollFinished(0)) runCurrent() assert(markAsReadResult) .isCalledOnce() @@ -207,7 +206,7 @@ class TimelinePresenterTest { presenter.test { skipItems(1) awaitItem().run { - eventSink.invoke(TimelineEvents.OnScrollFinished(1)) + eventSink.invoke(TimelineEvent.OnScrollFinished(1)) } advanceUntilIdle() assert(sendReadReceiptsLambda) @@ -246,8 +245,8 @@ class TimelinePresenterTest { presenter.test { skipItems(1) awaitItem().run { - eventSink.invoke(TimelineEvents.OnScrollFinished(0)) - eventSink.invoke(TimelineEvents.OnScrollFinished(1)) + eventSink.invoke(TimelineEvent.OnScrollFinished(0)) + eventSink.invoke(TimelineEvent.OnScrollFinished(1)) } advanceUntilIdle() assert(sendReadReceiptsLambda) @@ -282,8 +281,8 @@ class TimelinePresenterTest { presenter.test { skipItems(1) awaitItem().run { - eventSink.invoke(TimelineEvents.OnScrollFinished(1)) - eventSink.invoke(TimelineEvents.OnScrollFinished(1)) + eventSink.invoke(TimelineEvent.OnScrollFinished(1)) + eventSink.invoke(TimelineEvent.OnScrollFinished(1)) } advanceUntilIdle() cancelAndIgnoreRemainingEvents() @@ -310,7 +309,7 @@ class TimelinePresenterTest { presenter.test { skipItems(1) val initialState = awaitFirstItem() - initialState.eventSink.invoke(TimelineEvents.OnScrollFinished(1)) + initialState.eventSink.invoke(TimelineEvent.OnScrollFinished(1)) cancelAndIgnoreRemainingEvents() assert(sendReadReceiptsLambda).isNeverCalled() } @@ -349,7 +348,7 @@ class TimelinePresenterTest { consumeItemsUntilPredicate { it.timelineItems.size == 3 } // Scroll to bottom to clear previous FromMe - initialState.eventSink.invoke(TimelineEvents.OnScrollFinished(0)) + initialState.eventSink.invoke(TimelineEvent.OnScrollFinished(0)) awaitLastSequentialItem().also { state -> assertThat(state.newEventState).isEqualTo(NewEventState.None) } @@ -429,7 +428,7 @@ class TimelinePresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink.invoke(TimelineEvents.SelectPollAnswer(AN_EVENT_ID, "anAnswerId")) + initialState.eventSink.invoke(TimelineEvent.SelectPollAnswer(AN_EVENT_ID, "anAnswerId")) } delay(1) sendPollResponseAction.verifyExecutionCount(1) @@ -443,7 +442,7 @@ class TimelinePresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink.invoke(TimelineEvents.EndPoll(AN_EVENT_ID)) + initialState.eventSink.invoke(TimelineEvent.EndPoll(AN_EVENT_ID)) } delay(1) endPollAction.verifyExecutionCount(1) @@ -459,7 +458,7 @@ class TimelinePresenterTest { messagesNavigator = navigator, ) presenter.test { - awaitFirstItem().eventSink(TimelineEvents.EditPoll(AN_EVENT_ID)) + awaitFirstItem().eventSink(TimelineEvent.EditPoll(AN_EVENT_ID)) onEditPollClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID)) } } @@ -510,7 +509,7 @@ class TimelinePresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID)) + initialState.eventSink.invoke(TimelineEvent.FocusOnEvent(AN_EVENT_ID)) awaitItem().also { state -> assertThat(state.focusedEventId).isEqualTo(AN_EVENT_ID) assertThat(state.focusRequestState).isEqualTo(FocusRequestState.Requested(AN_EVENT_ID, Duration.ZERO)) @@ -524,7 +523,7 @@ class TimelinePresenterTest { assertThat(state.focusRequestState).isEqualTo(FocusRequestState.Success(AN_EVENT_ID)) assertThat(state.timelineItems).isNotEmpty() } - initialState.eventSink.invoke(TimelineEvents.JumpToLive) + initialState.eventSink.invoke(TimelineEvent.JumpToLive) skipItems(2) awaitItem().also { state -> // Event stays focused @@ -564,7 +563,7 @@ class TimelinePresenterTest { // Pre-populate the indexer after the first items have been retrieved timelineItemIndexer.process(listOf(aMessageEvent(eventId = AN_EVENT_ID))) - initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID)) + initialState.eventSink.invoke(TimelineEvent.FocusOnEvent(AN_EVENT_ID)) advanceUntilIdle() @@ -595,7 +594,7 @@ class TimelinePresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink(TimelineEvents.FocusOnEvent(AN_EVENT_ID)) + initialState.eventSink(TimelineEvent.FocusOnEvent(AN_EVENT_ID)) awaitItem().also { state -> assertThat(state.focusedEventId).isEqualTo(AN_EVENT_ID) assertThat(state.focusRequestState).isEqualTo(FocusRequestState.Requested(AN_EVENT_ID, Duration.ZERO)) @@ -606,7 +605,7 @@ class TimelinePresenterTest { } awaitItem().also { state -> assertThat(state.focusRequestState).isInstanceOf(FocusRequestState.Failure::class.java) - state.eventSink(TimelineEvents.ClearFocusRequestState) + state.eventSink(TimelineEvent.ClearFocusRequestState) } awaitItem().also { state -> assertThat(state.focusRequestState).isEqualTo(FocusRequestState.None) @@ -648,7 +647,7 @@ class TimelinePresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID)) + initialState.eventSink.invoke(TimelineEvent.FocusOnEvent(AN_EVENT_ID)) awaitItem().also { state -> assertThat(state.focusedEventId).isEqualTo(AN_EVENT_ID) @@ -707,7 +706,7 @@ class TimelinePresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID)) + initialState.eventSink.invoke(TimelineEvent.FocusOnEvent(AN_EVENT_ID)) awaitItem().also { state -> assertThat(state.focusedEventId).isEqualTo(AN_EVENT_ID) @@ -762,7 +761,7 @@ class TimelinePresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID)) + initialState.eventSink.invoke(TimelineEvent.FocusOnEvent(AN_EVENT_ID)) awaitItem().also { state -> assertThat(state.focusedEventId).isEqualTo(AN_EVENT_ID) @@ -821,7 +820,7 @@ class TimelinePresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID)) + initialState.eventSink.invoke(TimelineEvent.FocusOnEvent(AN_EVENT_ID)) awaitItem().also { state -> assertThat(state.focusedEventId).isEqualTo(AN_EVENT_ID) @@ -854,10 +853,10 @@ class TimelinePresenterTest { val initialState = awaitFirstItem() assertThat(initialState.messageShieldDialogData).isNull() val shieldData = MessageShieldData(shield, null, null) - initialState.eventSink(TimelineEvents.ShowShieldDialog(shieldData)) + initialState.eventSink(TimelineEvent.ShowShieldDialog(shieldData)) awaitItem().also { state -> assertThat(state.messageShieldDialogData).isEqualTo(shieldData) - state.eventSink(TimelineEvents.HideShieldDialog) + state.eventSink(TimelineEvent.HideShieldDialog) } awaitItem().also { state -> assertThat(state.messageShieldDialogData).isNull() @@ -963,7 +962,7 @@ class TimelinePresenterTest { val presenter = createTimelinePresenter(room = room, messagesNavigator = navigator) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink(TimelineEvents.NavigateToPredecessorOrSuccessorRoom(A_ROOM_ID)) + initialState.eventSink(TimelineEvent.NavigateToPredecessorOrSuccessorRoom(A_ROOM_ID)) assert(onNavigateToRoomLambda) .isCalledOnce() .with( diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewTest.kt index 587b8f0839..c56641a048 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewTest.kt @@ -50,7 +50,7 @@ class TimelineViewTest { @Test fun `reaching the end of the timeline with more events to load emits a LoadMore event`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() rule.setTimelineView( state = aTimelineState( timelineItems = persistentListOf( @@ -62,12 +62,12 @@ class TimelineViewTest { eventSink = eventsRecorder, ), ) - eventsRecorder.assertSingle(TimelineEvents.LoadMore(Timeline.PaginationDirection.BACKWARDS)) + eventsRecorder.assertSingle(TimelineEvent.LoadMore(Timeline.PaginationDirection.BACKWARDS)) } @Test fun `reaching the end of the timeline does not send a LoadMore event`() { - val eventsRecorder = EventsRecorder(expectEvents = false) + val eventsRecorder = EventsRecorder(expectEvents = false) rule.setTimelineView( state = aTimelineState( eventSink = eventsRecorder, @@ -77,7 +77,7 @@ class TimelineViewTest { @Test fun `scroll to bottom on live timeline does not emit the Event`() { - val eventsRecorder = EventsRecorder(expectEvents = false) + val eventsRecorder = EventsRecorder(expectEvents = false) rule.setTimelineView( state = aTimelineState( isLive = true, @@ -91,7 +91,7 @@ class TimelineViewTest { @Test fun `scroll to bottom on detached timeline emits the expected Event`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() rule.setTimelineView( state = aTimelineState( isLive = false, @@ -100,12 +100,12 @@ class TimelineViewTest { ) val contentDescription = rule.activity.getString(CommonStrings.a11y_jump_to_bottom) rule.onNodeWithContentDescription(contentDescription).performClick() - eventsRecorder.assertSingle(TimelineEvents.JumpToLive) + eventsRecorder.assertSingle(TimelineEvent.JumpToLive) } @Test fun `show shield dialog`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() rule.setTimelineView( state = aTimelineState( timelineItems = persistentListOf( @@ -122,15 +122,15 @@ class TimelineViewTest { rule.onNodeWithContentDescription(contentDescription).performClick() eventsRecorder.assertList( listOf( - TimelineEvents.OnScrollFinished(0), - TimelineEvents.ShowShieldDialog(MessageShieldData(MessageShield.UnverifiedIdentity(true))), + TimelineEvent.OnScrollFinished(0), + TimelineEvent.ShowShieldDialog(MessageShieldData(MessageShield.UnverifiedIdentity(true))), ) ) } @Test fun `hide shield dialog`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() rule.setTimelineView( state = aTimelineState( isLive = false, @@ -139,12 +139,12 @@ class TimelineViewTest { ), ) rule.clickOn(CommonStrings.action_ok) - eventsRecorder.assertSingle(TimelineEvents.HideShieldDialog) + eventsRecorder.assertSingle(TimelineEvent.HideShieldDialog) } @Test fun `scrolling near to the start of the loaded items triggers a pre-fetch`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val items = List(200) { aTimelineItemEvent( eventId = EventId("\$event_$it"), @@ -167,8 +167,8 @@ class TimelineViewTest { eventsRecorder.assertList( listOf( - TimelineEvents.OnScrollFinished(firstIndex = 0), - TimelineEvents.LoadMore(Timeline.PaginationDirection.BACKWARDS), + TimelineEvent.OnScrollFinished(firstIndex = 0), + TimelineEvent.LoadMore(Timeline.PaginationDirection.BACKWARDS), ) ) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemPollViewTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemPollViewTest.kt index f8b416a302..64b5216d2e 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemPollViewTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemPollViewTest.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.performClick import androidx.test.ext.junit.runners.AndroidJUnit4 -import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemPollContent import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.ui.strings.CommonStrings @@ -39,7 +39,7 @@ class TimelineItemPollViewTest { } private fun testAnswer(answerIndex: Int) { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val content = aTimelineItemPollContent() rule.setContent { TimelineItemPollView( @@ -52,12 +52,12 @@ class TimelineItemPollViewTest { matcher = hasText(answer.text), useUnmergedTree = true, ).performClick() - eventsRecorder.assertSingle(TimelineEvents.SelectPollAnswer(content.eventId!!, answer.id)) + eventsRecorder.assertSingle(TimelineEvent.SelectPollAnswer(content.eventId!!, answer.id)) } @Test fun `editing a poll should emit a PollEditClicked event`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val content = aTimelineItemPollContent( isMine = true, isEditable = true, @@ -69,12 +69,12 @@ class TimelineItemPollViewTest { ) } rule.clickOn(CommonStrings.action_edit_poll) - eventsRecorder.assertSingle(TimelineEvents.EditPoll(content.eventId!!)) + eventsRecorder.assertSingle(TimelineEvent.EditPoll(content.eventId!!)) } @Test fun `closing a poll should emit a PollEndClicked event`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val content = aTimelineItemPollContent( isMine = true, ) @@ -88,6 +88,6 @@ class TimelineItemPollViewTest { // A confirmation dialog should be shown eventsRecorder.assertEmpty() rule.pressTag(TestTags.dialogPositive.value) - eventsRecorder.assertSingle(TimelineEvents.EndPoll(content.eventId!!)) + eventsRecorder.assertSingle(TimelineEvent.EndPoll(content.eventId!!)) } }