From 629099683134eb81c3dc92d15fbe3570d49084b3 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 3 Feb 2023 14:41:24 +0100 Subject: [PATCH] Updates on rust: makes SS working but slow. Also branch some timeline virtual items. --- .../features/messages/MessagesPresenter.kt | 2 +- .../actionlist/ActionListPresenter.kt | 2 +- .../messages/timeline/TimelineView.kt | 44 +++++++---- .../components/TimelineItemEncryptedView.kt | 2 +- .../components/TimelineItemImageView.kt | 2 +- .../components/TimelineItemRedactedView.kt | 2 +- .../components/TimelineItemTextView.kt | 2 +- .../components/TimelineItemUnknownView.kt | 2 +- .../factories/TimelineItemsFactory.kt | 3 +- .../{ => event}/TimelineItemContentFactory.kt | 6 +- ...eItemContentFailedToParseMessageFactory.kt | 8 +- ...ineItemContentFailedToParseStateFactory.kt | 8 +- .../TimelineItemContentMessageFactory.kt | 16 ++-- ...TimelineItemContentProfileChangeFactory.kt | 9 +-- .../TimelineItemContentRedactedFactory.kt | 8 +- ...imelineItemContentRoomMembershipFactory.kt | 8 +- .../TimelineItemContentStateFactory.kt | 8 +- .../TimelineItemContentStickerFactory.kt | 8 +- .../TimelineItemContentUTDFactory.kt | 8 +- .../{ => event}/TimelineItemEventFactory.kt | 2 +- .../TimelineItemDaySeparatorFactory.kt} | 19 ++--- .../virtual/TimelineItemVirtualFactory.kt | 52 +++++++++++++ .../messages/timeline/model/TimelineItem.kt | 8 +- .../TimelineItemEmoteContent.kt | 2 +- .../TimelineItemEncryptedContent.kt | 4 +- .../TimelineItemEventContent.kt} | 6 +- .../TimelineItemImageContent.kt | 4 +- .../TimelineItemNoticeContent.kt | 2 +- .../TimelineItemRedactedContent.kt | 4 +- .../TimelineItemTextBasedContent.kt | 4 +- .../TimelineItemTextContent.kt | 2 +- .../TimelineItemUnknownContent.kt | 4 +- .../virtual/TimelineItemDaySeparatorModel.kt | 21 ++++++ .../model/virtual/TimelineItemLoadingModel.kt | 19 +++++ .../virtual/TimelineItemReadMarkerModel.kt | 19 +++++ .../virtual/TimelineItemTimelineStartModel.kt | 19 +++++ .../TimelineItemUnknownVirtualModel.kt | 19 +++++ .../model/virtual/TimelineItemVirtualModel.kt | 22 ++++++ .../libraries/matrix/RustMatrixClient.kt | 32 ++++++-- .../matrix/timeline/MatrixTimelineItem.kt | 5 +- .../matrix/tracing/TracingConfiguration.kt | 73 +++++++++++-------- 41 files changed, 352 insertions(+), 138 deletions(-) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemContentFactory.kt (93%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemContentFailedToParseMessageFactory.kt (75%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemContentFailedToParseStateFactory.kt (75%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemContentMessageFactory.kt (78%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemContentProfileChangeFactory.kt (70%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemContentRedactedFactory.kt (75%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemContentRoomMembershipFactory.kt (76%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemContentStateFactory.kt (76%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemContentStickerFactory.kt (76%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemContentUTDFactory.kt (75%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{ => event}/TimelineItemEventFactory.kt (98%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/{TimelineItemVirtualFactory.kt => virtual/TimelineItemDaySeparatorFactory.kt} (54%) create mode 100644 features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemVirtualFactory.kt rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/{content => event}/TimelineItemEmoteContent.kt (91%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/{content => event}/TimelineItemEncryptedContent.kt (88%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/{content/TimelineItemContent.kt => event/TimelineItemEventContent.kt} (90%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/{content => event}/TimelineItemImageContent.kt (89%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/{content => event}/TimelineItemNoticeContent.kt (91%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/{content => event}/TimelineItemRedactedContent.kt (82%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/{content => event}/TimelineItemTextBasedContent.kt (83%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/{content => event}/TimelineItemTextContent.kt (91%) rename features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/{content => event}/TimelineItemUnknownContent.kt (82%) create mode 100644 features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemDaySeparatorModel.kt create mode 100644 features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemLoadingModel.kt create mode 100644 features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemReadMarkerModel.kt create mode 100644 features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemTimelineStartModel.kt create mode 100644 features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemUnknownVirtualModel.kt create mode 100644 features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemVirtualModel.kt diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt index ccfb58b5f8..502ac0ecf1 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt @@ -32,7 +32,7 @@ import io.element.android.features.messages.textcomposer.MessageComposerState import io.element.android.features.messages.timeline.TimelineEvents import io.element.android.features.messages.timeline.TimelinePresenter import io.element.android.features.messages.timeline.model.TimelineItem -import io.element.android.features.messages.timeline.model.content.TimelineItemTextBasedContent +import io.element.android.features.messages.timeline.model.event.TimelineItemTextBasedContent import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/actionlist/ActionListPresenter.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/actionlist/ActionListPresenter.kt index f02f21bcbc..194a7f103e 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/actionlist/ActionListPresenter.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/actionlist/ActionListPresenter.kt @@ -23,7 +23,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import io.element.android.features.messages.actionlist.model.TimelineItemAction import io.element.android.features.messages.timeline.model.TimelineItem -import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent +import io.element.android.features.messages.timeline.model.event.TimelineItemRedactedContent import io.element.android.libraries.architecture.Presenter import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.CoroutineScope diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt index d408656c03..730fe0c02e 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt @@ -70,13 +70,14 @@ import io.element.android.features.messages.timeline.model.MessagesItemGroupPosi import io.element.android.features.messages.timeline.model.TimelineItem import io.element.android.features.messages.timeline.model.TimelineItemGroupPositionProvider import io.element.android.features.messages.timeline.model.TimelineItemReactions -import io.element.android.features.messages.timeline.model.content.MessagesTimelineItemContentProvider -import io.element.android.features.messages.timeline.model.content.TimelineItemContent -import io.element.android.features.messages.timeline.model.content.TimelineItemEncryptedContent -import io.element.android.features.messages.timeline.model.content.TimelineItemImageContent -import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent -import io.element.android.features.messages.timeline.model.content.TimelineItemTextBasedContent -import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent +import io.element.android.features.messages.timeline.model.event.MessagesTimelineItemContentProvider +import io.element.android.features.messages.timeline.model.event.TimelineItemEncryptedContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.event.TimelineItemImageContent +import io.element.android.features.messages.timeline.model.event.TimelineItemRedactedContent +import io.element.android.features.messages.timeline.model.event.TimelineItemTextBasedContent +import io.element.android.features.messages.timeline.model.event.TimelineItemUnknownContent +import io.element.android.features.messages.timeline.model.virtual.TimelineItemLoadingModel import io.element.android.libraries.designsystem.components.avatar.Avatar import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.utils.PairCombinedPreviewParameter @@ -158,8 +159,10 @@ fun TimelineItemRow( onLongClick: (TimelineItem.Event) -> Unit, ) { when (timelineItem) { - is TimelineItem.Virtual -> return - is TimelineItem.Event -> MessageEventRow( + is TimelineItem.Virtual -> TimelineItemVirtualRow( + virtual = timelineItem + ) + is TimelineItem.Event -> TimelineItemEventRow( event = timelineItem, isHighlighted = isHighlighted, onClick = { onClick(timelineItem) }, @@ -169,7 +172,18 @@ fun TimelineItemRow( } @Composable -fun MessageEventRow( +fun TimelineItemVirtualRow( + virtual: TimelineItem.Virtual, + modifier: Modifier = Modifier +) { + when (virtual.model) { + is TimelineItemLoadingModel -> TimelineLoadingMoreIndicator(modifier) + else -> return + } +} + +@Composable +fun TimelineItemEventRow( event: TimelineItem.Event, isHighlighted: Boolean, onClick: () -> Unit, @@ -338,9 +352,9 @@ internal fun BoxScope.TimelineScrollHelper( } @Composable -internal fun TimelineLoadingMoreIndicator() { +internal fun TimelineLoadingMoreIndicator(modifier: Modifier) { Box( - Modifier + modifier .fillMaxWidth() .wrapContentHeight() .padding(8.dp), @@ -354,7 +368,7 @@ internal fun TimelineLoadingMoreIndicator() { } class MessagesItemGroupPositionToMessagesTimelineItemContentProvider : - PairCombinedPreviewParameter( + PairCombinedPreviewParameter( TimelineItemGroupPositionProvider() to MessagesTimelineItemContentProvider() ) @@ -363,7 +377,7 @@ class MessagesItemGroupPositionToMessagesTimelineItemContentProvider : @Composable fun TimelineItemsPreview( @PreviewParameter(MessagesTimelineItemContentProvider::class) - content: TimelineItemContent + content: TimelineItemEventContent ) { val timelineItems = persistentListOf( // 3 items (First Middle Last) with isMine = false @@ -410,7 +424,7 @@ fun TimelineItemsPreview( private fun createMessageEvent( isMine: Boolean, - content: TimelineItemContent, + content: TimelineItemEventContent, groupPosition: MessagesItemGroupPosition ): TimelineItem { return TimelineItem.Event( diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemEncryptedView.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemEncryptedView.kt index 9b2be79685..3ad0d416f0 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemEncryptedView.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemEncryptedView.kt @@ -20,7 +20,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Warning import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import io.element.android.features.messages.timeline.model.content.TimelineItemEncryptedContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEncryptedContent @Composable fun TimelineItemEncryptedView( diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemImageView.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemImageView.kt index e6548a71e8..583986f3db 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemImageView.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemImageView.kt @@ -33,7 +33,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import coil.compose.AsyncImage import coil.request.ImageRequest -import io.element.android.features.messages.timeline.model.content.TimelineItemImageContent +import io.element.android.features.messages.timeline.model.event.TimelineItemImageContent @Composable fun TimelineItemImageView( diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemRedactedView.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemRedactedView.kt index f752f88c4a..923fec3fa4 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemRedactedView.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemRedactedView.kt @@ -20,7 +20,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Delete import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent +import io.element.android.features.messages.timeline.model.event.TimelineItemRedactedContent @Composable fun TimelineItemRedactedView( diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemTextView.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemTextView.kt index ad1bb5edb9..31a2749686 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemTextView.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemTextView.kt @@ -29,7 +29,7 @@ import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.core.text.util.LinkifyCompat import io.element.android.features.messages.timeline.components.html.HtmlDocument -import io.element.android.features.messages.timeline.model.content.TimelineItemTextBasedContent +import io.element.android.features.messages.timeline.model.event.TimelineItemTextBasedContent import io.element.android.libraries.designsystem.LinkColor import io.element.android.libraries.designsystem.components.ClickableLinkText diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemUnknownView.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemUnknownView.kt index 396bb19cb6..44629d61d0 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemUnknownView.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/components/TimelineItemUnknownView.kt @@ -20,7 +20,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Info import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent +import io.element.android.features.messages.timeline.model.event.TimelineItemUnknownContent @Composable fun TimelineItemUnknownView( diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemsFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemsFactory.kt index 2f94967c3f..d4c4701193 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemsFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemsFactory.kt @@ -19,11 +19,12 @@ package io.element.android.features.messages.timeline.factories import androidx.recyclerview.widget.DiffUtil import io.element.android.features.messages.timeline.diff.CacheInvalidator import io.element.android.features.messages.timeline.diff.MatrixTimelineItemsDiffCallback +import io.element.android.features.messages.timeline.factories.event.TimelineItemEventFactory +import io.element.android.features.messages.timeline.factories.virtual.TimelineItemVirtualFactory import io.element.android.features.messages.timeline.model.TimelineItem import io.element.android.features.messages.timeline.util.invalidateLast import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.matrix.timeline.MatrixTimelineItem -import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentFactory.kt similarity index 93% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentFactory.kt index a8c9ce9db0..121e5e38e8 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentFactory.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event -import io.element.android.features.messages.timeline.model.content.TimelineItemContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import javax.inject.Inject @@ -34,7 +34,7 @@ class TimelineItemContentFactory @Inject constructor( private val failedToParseStateFactory: TimelineItemContentFailedToParseStateFactory ) { - fun create(itemContent: RustTimelineItemContent): TimelineItemContent { + fun create(itemContent: RustTimelineItemContent): TimelineItemEventContent { return when (val kind = itemContent.kind()) { is TimelineItemContentKind.Message -> messageFactory.create(itemContent.asMessage()) is TimelineItemContentKind.RedactedMessage -> redactedMessageFactory.create(kind) diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentFailedToParseMessageFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentFailedToParseMessageFactory.kt similarity index 75% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentFailedToParseMessageFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentFailedToParseMessageFactory.kt index 382bc0d84a..5839cd06da 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentFailedToParseMessageFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentFailedToParseMessageFactory.kt @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event -import io.element.android.features.messages.timeline.model.content.TimelineItemContent -import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.event.TimelineItemUnknownContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import javax.inject.Inject class TimelineItemContentFailedToParseMessageFactory @Inject constructor() { - fun create(kind: TimelineItemContentKind.FailedToParseMessageLike): TimelineItemContent { + fun create(kind: TimelineItemContentKind.FailedToParseMessageLike): TimelineItemEventContent { return TimelineItemUnknownContent } } diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentFailedToParseStateFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentFailedToParseStateFactory.kt similarity index 75% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentFailedToParseStateFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentFailedToParseStateFactory.kt index 57d25673ab..a64950a77f 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentFailedToParseStateFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentFailedToParseStateFactory.kt @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event -import io.element.android.features.messages.timeline.model.content.TimelineItemContent -import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.event.TimelineItemUnknownContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import javax.inject.Inject class TimelineItemContentFailedToParseStateFactory @Inject constructor() { - fun create(kind: TimelineItemContentKind.FailedToParseState): TimelineItemContent { + fun create(kind: TimelineItemContentKind.FailedToParseState): TimelineItemEventContent { return TimelineItemUnknownContent } } diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentMessageFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentMessageFactory.kt similarity index 78% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentMessageFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentMessageFactory.kt index 5ac1dec13b..ce38a9e96f 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentMessageFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentMessageFactory.kt @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event -import io.element.android.features.messages.timeline.model.content.TimelineItemContent -import io.element.android.features.messages.timeline.model.content.TimelineItemEmoteContent -import io.element.android.features.messages.timeline.model.content.TimelineItemImageContent -import io.element.android.features.messages.timeline.model.content.TimelineItemNoticeContent -import io.element.android.features.messages.timeline.model.content.TimelineItemTextContent -import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEmoteContent +import io.element.android.features.messages.timeline.model.event.TimelineItemImageContent +import io.element.android.features.messages.timeline.model.event.TimelineItemNoticeContent +import io.element.android.features.messages.timeline.model.event.TimelineItemTextContent +import io.element.android.features.messages.timeline.model.event.TimelineItemUnknownContent import io.element.android.features.messages.timeline.util.toHtmlDocument import io.element.android.libraries.matrix.media.MediaResolver import org.matrix.rustcomponents.sdk.Message @@ -30,7 +30,7 @@ import javax.inject.Inject class TimelineItemContentMessageFactory @Inject constructor() { - fun create(contentAsMessage: Message?): TimelineItemContent { + fun create(contentAsMessage: Message?): TimelineItemEventContent { return when (val messageType = contentAsMessage?.msgtype()) { is MessageType.Emote -> TimelineItemEmoteContent( body = messageType.content.body, diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentProfileChangeFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentProfileChangeFactory.kt similarity index 70% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentProfileChangeFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentProfileChangeFactory.kt index 40027de1b4..6f775ac80f 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentProfileChangeFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentProfileChangeFactory.kt @@ -14,17 +14,16 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event -import io.element.android.features.messages.timeline.model.content.TimelineItemContent -import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent -import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.event.TimelineItemUnknownContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import javax.inject.Inject class TimelineItemContentProfileChangeFactory @Inject constructor() { - fun create(kind: TimelineItemContentKind.ProfileChange): TimelineItemContent { + fun create(kind: TimelineItemContentKind.ProfileChange): TimelineItemEventContent { return TimelineItemUnknownContent } } diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentRedactedFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentRedactedFactory.kt similarity index 75% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentRedactedFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentRedactedFactory.kt index 3bb8550071..4d6b9257a3 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentRedactedFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentRedactedFactory.kt @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event -import io.element.android.features.messages.timeline.model.content.TimelineItemContent -import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.event.TimelineItemRedactedContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import javax.inject.Inject class TimelineItemContentRedactedFactory @Inject constructor() { - fun create(kind: TimelineItemContentKind.RedactedMessage): TimelineItemContent { + fun create(kind: TimelineItemContentKind.RedactedMessage): TimelineItemEventContent { return TimelineItemRedactedContent } } diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentRoomMembershipFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentRoomMembershipFactory.kt similarity index 76% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentRoomMembershipFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentRoomMembershipFactory.kt index e2dcfeea19..1764087a2d 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentRoomMembershipFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentRoomMembershipFactory.kt @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event -import io.element.android.features.messages.timeline.model.content.TimelineItemContent -import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.event.TimelineItemUnknownContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import javax.inject.Inject class TimelineItemContentRoomMembershipFactory @Inject constructor() { - fun create(kind: TimelineItemContentKind.RoomMembership): TimelineItemContent { + fun create(kind: TimelineItemContentKind.RoomMembership): TimelineItemEventContent { return TimelineItemUnknownContent } } diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentStateFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentStateFactory.kt similarity index 76% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentStateFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentStateFactory.kt index abfa405ecd..176a540e00 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentStateFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentStateFactory.kt @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event -import io.element.android.features.messages.timeline.model.content.TimelineItemContent -import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.event.TimelineItemUnknownContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import javax.inject.Inject class TimelineItemContentStateFactory @Inject constructor() { - fun create(kind: TimelineItemContentKind.State): TimelineItemContent { + fun create(kind: TimelineItemContentKind.State): TimelineItemEventContent { return TimelineItemUnknownContent } } diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentStickerFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentStickerFactory.kt similarity index 76% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentStickerFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentStickerFactory.kt index d69ea61341..8e8a81ccf5 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentStickerFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentStickerFactory.kt @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event -import io.element.android.features.messages.timeline.model.content.TimelineItemContent -import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.event.TimelineItemUnknownContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import javax.inject.Inject class TimelineItemContentStickerFactory @Inject constructor() { - fun create(kind: TimelineItemContentKind.Sticker): TimelineItemContent { + fun create(kind: TimelineItemContentKind.Sticker): TimelineItemEventContent { return TimelineItemUnknownContent } } diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentUTDFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentUTDFactory.kt similarity index 75% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentUTDFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentUTDFactory.kt index 4f2285a402..77d9dcfefd 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemContentUTDFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemContentUTDFactory.kt @@ -14,16 +14,16 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event -import io.element.android.features.messages.timeline.model.content.TimelineItemContent -import io.element.android.features.messages.timeline.model.content.TimelineItemEncryptedContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEncryptedContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import javax.inject.Inject class TimelineItemContentUTDFactory @Inject constructor() { - fun create(kind: TimelineItemContentKind.UnableToDecrypt): TimelineItemContent { + fun create(kind: TimelineItemContentKind.UnableToDecrypt): TimelineItemEventContent { return TimelineItemEncryptedContent(kind.msg) } } diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemEventFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemEventFactory.kt similarity index 98% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemEventFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemEventFactory.kt index c49b007a43..67a9be5698 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemEventFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemEventFactory.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.event import io.element.android.features.messages.timeline.model.AggregatedReaction import io.element.android.features.messages.timeline.model.MessagesItemGroupPosition diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemVirtualFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemDaySeparatorFactory.kt similarity index 54% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemVirtualFactory.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemDaySeparatorFactory.kt index b0f4cc3bbb..5bb213b617 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/TimelineItemVirtualFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemDaySeparatorFactory.kt @@ -14,21 +14,18 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.factories +package io.element.android.features.messages.timeline.factories.virtual -import io.element.android.features.messages.timeline.model.TimelineItem -import io.element.android.libraries.matrix.timeline.MatrixTimelineItem +import io.element.android.features.messages.timeline.model.virtual.TimelineItemDaySeparatorModel +import io.element.android.features.messages.timeline.model.virtual.TimelineItemVirtualModel +import org.matrix.rustcomponents.sdk.VirtualTimelineItem import javax.inject.Inject -class TimelineItemVirtualFactory @Inject constructor() { +class TimelineItemDaySeparatorFactory @Inject constructor() { - suspend fun create( - currentTimelineItem: MatrixTimelineItem.Virtual, - index: Int, - timelineItems: List, - ): TimelineItem.Virtual { - return TimelineItem.Virtual( - id = "virtual_item_$index" + fun create(virtualItem: VirtualTimelineItem.DayDivider): TimelineItemVirtualModel { + return TimelineItemDaySeparatorModel( + day = "${virtualItem.ts}" ) } } diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemVirtualFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemVirtualFactory.kt new file mode 100644 index 0000000000..1a5f094d06 --- /dev/null +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemVirtualFactory.kt @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.messages.timeline.factories.virtual + +import io.element.android.features.messages.timeline.model.TimelineItem +import io.element.android.features.messages.timeline.model.virtual.TimelineItemLoadingModel +import io.element.android.features.messages.timeline.model.virtual.TimelineItemReadMarkerModel +import io.element.android.features.messages.timeline.model.virtual.TimelineItemUnknownVirtualModel +import io.element.android.features.messages.timeline.model.virtual.TimelineItemVirtualModel +import io.element.android.libraries.matrix.timeline.MatrixTimelineItem +import org.matrix.rustcomponents.sdk.VirtualTimelineItem +import javax.inject.Inject + +class TimelineItemVirtualFactory @Inject constructor( + private val daySeparatorFactory: TimelineItemDaySeparatorFactory, +) { + + suspend fun create( + currentTimelineItem: MatrixTimelineItem.Virtual, + index: Int, + timelineItems: List, + ): TimelineItem.Virtual { + return TimelineItem.Virtual( + id = "virtual_item_$index", + model = currentTimelineItem.computeModel(index) + ) + } + + private fun MatrixTimelineItem.Virtual.computeModel(index: Int): TimelineItemVirtualModel { + return when (val inner = virtual) { + is VirtualTimelineItem.DayDivider -> daySeparatorFactory.create(inner) + is VirtualTimelineItem.ReadMarker -> TimelineItemReadMarkerModel + is VirtualTimelineItem.LoadingIndicator -> TimelineItemLoadingModel + is VirtualTimelineItem.TimelineStart -> TimelineItemReadMarkerModel + else -> TimelineItemUnknownVirtualModel + } + } +} diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/TimelineItem.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/TimelineItem.kt index 5abbcb1d00..4d097ebcbc 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/TimelineItem.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/TimelineItem.kt @@ -17,14 +17,16 @@ package io.element.android.features.messages.timeline.model import androidx.compose.runtime.Immutable -import io.element.android.features.messages.timeline.model.content.TimelineItemContent +import io.element.android.features.messages.timeline.model.event.TimelineItemEventContent +import io.element.android.features.messages.timeline.model.virtual.TimelineItemVirtualModel import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.matrix.core.EventId @Immutable sealed interface TimelineItem { data class Virtual( - val id: String + val id: String, + val model: TimelineItemVirtualModel ) : TimelineItem data class Event( @@ -32,7 +34,7 @@ sealed interface TimelineItem { val senderId: String, val senderDisplayName: String?, val senderAvatar: AvatarData, - val content: TimelineItemContent, + val content: TimelineItemEventContent, val sentTime: String = "", val isMine: Boolean = false, val groupPosition: MessagesItemGroupPosition = MessagesItemGroupPosition.None, diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemEmoteContent.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEmoteContent.kt similarity index 91% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemEmoteContent.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEmoteContent.kt index c307b70edb..e6b4c9b439 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemEmoteContent.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEmoteContent.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.model.content +package io.element.android.features.messages.timeline.model.event import org.jsoup.nodes.Document diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemEncryptedContent.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEncryptedContent.kt similarity index 88% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemEncryptedContent.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEncryptedContent.kt index 937b4d32f6..a57378dfd8 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemEncryptedContent.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEncryptedContent.kt @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.model.content +package io.element.android.features.messages.timeline.model.event import org.matrix.rustcomponents.sdk.EncryptedMessage data class TimelineItemEncryptedContent( val encryptedMessage: EncryptedMessage -) : TimelineItemContent +) : TimelineItemEventContent diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemContent.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEventContent.kt similarity index 90% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemContent.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEventContent.kt index 973a4343a3..1924e0830e 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemContent.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEventContent.kt @@ -14,14 +14,14 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.model.content +package io.element.android.features.messages.timeline.model.event import androidx.compose.ui.tooling.preview.PreviewParameterProvider import org.matrix.rustcomponents.sdk.EncryptedMessage -sealed interface TimelineItemContent +sealed interface TimelineItemEventContent -class MessagesTimelineItemContentProvider : PreviewParameterProvider { +class MessagesTimelineItemContentProvider : PreviewParameterProvider { override val values = sequenceOf( TimelineItemEmoteContent( body = "Emote", diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemImageContent.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemImageContent.kt similarity index 89% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemImageContent.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemImageContent.kt index ef1c8d85d5..92912d952a 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemImageContent.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemImageContent.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.model.content +package io.element.android.features.messages.timeline.model.event import io.element.android.libraries.matrix.media.MediaResolver @@ -23,4 +23,4 @@ data class TimelineItemImageContent( val imageMeta: MediaResolver.Meta, val blurhash: String?, val aspectRatio: Float -) : TimelineItemContent +) : TimelineItemEventContent diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemNoticeContent.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemNoticeContent.kt similarity index 91% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemNoticeContent.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemNoticeContent.kt index 330ef1ff95..0b6ca6c26d 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemNoticeContent.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemNoticeContent.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.model.content +package io.element.android.features.messages.timeline.model.event import org.jsoup.nodes.Document diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemRedactedContent.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemRedactedContent.kt similarity index 82% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemRedactedContent.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemRedactedContent.kt index 6dd395f338..4ddae9be32 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemRedactedContent.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemRedactedContent.kt @@ -14,6 +14,6 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.model.content +package io.element.android.features.messages.timeline.model.event -object TimelineItemRedactedContent : TimelineItemContent +object TimelineItemRedactedContent : TimelineItemEventContent diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemTextBasedContent.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemTextBasedContent.kt similarity index 83% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemTextBasedContent.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemTextBasedContent.kt index 6146a5493f..6ca23a4e16 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemTextBasedContent.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemTextBasedContent.kt @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.model.content +package io.element.android.features.messages.timeline.model.event import org.jsoup.nodes.Document -sealed interface TimelineItemTextBasedContent : TimelineItemContent { +sealed interface TimelineItemTextBasedContent : TimelineItemEventContent { val body: String val htmlDocument: Document? } diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemTextContent.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemTextContent.kt similarity index 91% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemTextContent.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemTextContent.kt index abb3140b71..f35941b5bb 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemTextContent.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemTextContent.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.model.content +package io.element.android.features.messages.timeline.model.event import org.jsoup.nodes.Document diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemUnknownContent.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemUnknownContent.kt similarity index 82% rename from features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemUnknownContent.kt rename to features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemUnknownContent.kt index e2e0c5a14a..4b435bde69 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/content/TimelineItemUnknownContent.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemUnknownContent.kt @@ -14,6 +14,6 @@ * limitations under the License. */ -package io.element.android.features.messages.timeline.model.content +package io.element.android.features.messages.timeline.model.event -object TimelineItemUnknownContent : TimelineItemContent +object TimelineItemUnknownContent : TimelineItemEventContent diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemDaySeparatorModel.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemDaySeparatorModel.kt new file mode 100644 index 0000000000..e169033df3 --- /dev/null +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemDaySeparatorModel.kt @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.messages.timeline.model.virtual + +data class TimelineItemDaySeparatorModel( + val day: String +) : TimelineItemVirtualModel diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemLoadingModel.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemLoadingModel.kt new file mode 100644 index 0000000000..334fbd09ed --- /dev/null +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemLoadingModel.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.messages.timeline.model.virtual + +object TimelineItemLoadingModel : TimelineItemVirtualModel diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemReadMarkerModel.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemReadMarkerModel.kt new file mode 100644 index 0000000000..ccc154acf5 --- /dev/null +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemReadMarkerModel.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.messages.timeline.model.virtual + +object TimelineItemReadMarkerModel : TimelineItemVirtualModel diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemTimelineStartModel.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemTimelineStartModel.kt new file mode 100644 index 0000000000..a7493353f6 --- /dev/null +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemTimelineStartModel.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.messages.timeline.model.virtual + +object TimelineItemTimelineStartModel : TimelineItemVirtualModel diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemUnknownVirtualModel.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemUnknownVirtualModel.kt new file mode 100644 index 0000000000..dac0724dce --- /dev/null +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemUnknownVirtualModel.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.messages.timeline.model.virtual + +object TimelineItemUnknownVirtualModel : TimelineItemVirtualModel diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemVirtualModel.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemVirtualModel.kt new file mode 100644 index 0000000000..9970375daa --- /dev/null +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/virtual/TimelineItemVirtualModel.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.messages.timeline.model.virtual + +import androidx.compose.runtime.Immutable + +@Immutable +sealed interface TimelineItemVirtualModel diff --git a/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/RustMatrixClient.kt b/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/RustMatrixClient.kt index c6b9bef6e0..fb53d66b48 100644 --- a/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/RustMatrixClient.kt +++ b/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/RustMatrixClient.kt @@ -36,6 +36,7 @@ import org.matrix.rustcomponents.sdk.ClientDelegate import org.matrix.rustcomponents.sdk.MediaSource import org.matrix.rustcomponents.sdk.RequiredState import org.matrix.rustcomponents.sdk.SlidingSyncMode +import org.matrix.rustcomponents.sdk.SlidingSyncRequestListFilters import org.matrix.rustcomponents.sdk.SlidingSyncViewBuilder import org.matrix.rustcomponents.sdk.StoppableSpawn import timber.log.Timber @@ -66,7 +67,22 @@ internal class RustMatrixClient internal constructor( } } - private val slidingSyncView = SlidingSyncViewBuilder() + private val slidingSyncFilters by lazy { + SlidingSyncRequestListFilters( + isDm = null, + spaces = emptyList(), + isEncrypted = null, + isInvite = false, + isTombstoned = false, + roomTypes = emptyList(), + notRoomTypes = listOf("m.space"), + roomNameLike = null, + tags = emptyList(), + notTags = emptyList() + ) + } + + private val visibleRoomsView = SlidingSyncViewBuilder() .timelineLimit(limit = 10u) .requiredState( requiredState = listOf( @@ -74,17 +90,19 @@ internal class RustMatrixClient internal constructor( RequiredState(key = "m.room.encryption", value = ""), ) ) - .name(name = "HomeScreenView") + .filters(slidingSyncFilters) + .name(name = "CurrentlyVisibleRooms") + .sendUpdatesForItems(true) .syncMode(mode = SlidingSyncMode.SELECTIVE) - .addRange(0u, 30u) + .addRange(0u, 20u) .build() private val slidingSync = client .slidingSync() - .homeserver("https://slidingsync.lab.element.dev") + .homeserver("https://slidingsync.lab.matrix.org") .withCommonExtensions() - // .coldCache("ElementX") - .addView(slidingSyncView) + .coldCache("ElementX") + .addView(visibleRoomsView) .build() private val slidingSyncObserverProxy = SlidingSyncObserverProxy(coroutineScope) @@ -92,7 +110,7 @@ internal class RustMatrixClient internal constructor( RustRoomSummaryDataSource( slidingSyncObserverProxy.updateSummaryFlow, slidingSync, - slidingSyncView, + visibleRoomsView, dispatchers, ::onRestartSync ) diff --git a/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/timeline/MatrixTimelineItem.kt b/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/timeline/MatrixTimelineItem.kt index 35ad5ef7e5..19a7dfba79 100644 --- a/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/timeline/MatrixTimelineItem.kt +++ b/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/timeline/MatrixTimelineItem.kt @@ -18,13 +18,14 @@ package io.element.android.libraries.matrix.timeline import org.matrix.rustcomponents.sdk.EventTimelineItem import org.matrix.rustcomponents.sdk.TimelineItem +import org.matrix.rustcomponents.sdk.VirtualTimelineItem sealed interface MatrixTimelineItem { data class Event(val event: EventTimelineItem) : MatrixTimelineItem { val uniqueId: String = event.uniqueIdentifier() } - object Virtual : MatrixTimelineItem + data class Virtual(val virtual: VirtualTimelineItem) : MatrixTimelineItem object Other : MatrixTimelineItem } @@ -35,7 +36,7 @@ fun TimelineItem.asMatrixTimelineItem(): MatrixTimelineItem { } val asVirtual = asVirtual() if (asVirtual != null) { - return MatrixTimelineItem.Virtual + return MatrixTimelineItem.Virtual(asVirtual) } return MatrixTimelineItem.Other } diff --git a/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/tracing/TracingConfiguration.kt b/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/tracing/TracingConfiguration.kt index 9c7dc1632d..7adde7e524 100644 --- a/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/tracing/TracingConfiguration.kt +++ b/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/tracing/TracingConfiguration.kt @@ -17,48 +17,59 @@ package io.element.android.libraries.matrix.tracing data class TracingConfiguration( - val common: LogLevel = LogLevel.Warn, - val targets: Map = emptyMap() + val overrides: Map = emptyMap() ) { - val filter = "$common,${ - targets.map { "${it.key.filter}=${it.value.filter}" }.joinToString(separator = ",") - }" + private val targets = mapOf( + Target.Common to LogLevel.Warn, + Target.Hyper to LogLevel.Warn, + Target.Sled to LogLevel.Warn, + Target.MatrixSdk.Sled to LogLevel.Warn, + Target.MatrixSdk.HttpClient to LogLevel.Trace, + Target.MatrixSdk.SlidingSync to LogLevel.Trace, + Target.MatrixSdk.BaseSlidingSync to LogLevel.Trace + ) - sealed class Target(open val filter: String) { - object Hyper : Target("hyper") - object Sled : Target("sled") - sealed class MatrixSdk(override val filter: String) : Target(filter) { - object Root : MatrixSdk("matrix_sdk") - object Sled : MatrixSdk("matrix_sdk_sled") - object FFI : MatrixSdk("matrix_sdk_ffi") - object HttpClient : MatrixSdk("matrix_sdk::http_client") - object UniffiAPI : MatrixSdk("matrix_sdk_ffi::uniffi_api") - object SlidingSync : MatrixSdk("matrix_sdk::sliding_sync") - object BaseSlidingSync : MatrixSdk("matrix_sdk_base::sliding_sync") + val filter: String + get() { + val newTargets = HashMap(targets) + overrides.forEach { (target, logLevel) -> + newTargets[target] = logLevel + } + return newTargets.map { "${it.key.filter}=${it.value.filter}" }.joinToString(separator = ",") } - } +} - sealed class LogLevel(val filter: String) { - object Warn : LogLevel("warn") - object Trace : LogLevel("trace") - object Info : LogLevel("info") - object Debug : LogLevel("debug") - object Error : LogLevel("error") +sealed class Target(open val filter: String) { + object Common : Target("common") + object Hyper : Target("hyper") + object Sled : Target("sled") + sealed class MatrixSdk(override val filter: String) : Target(filter) { + object Root : MatrixSdk("matrix_sdk") + object Sled : MatrixSdk("matrix_sdk_sled") + object FFI : MatrixSdk("matrix_sdk_ffi") + object HttpClient : MatrixSdk("matrix_sdk::http_client") + object UniffiAPI : MatrixSdk("matrix_sdk_ffi::uniffi_api") + object SlidingSync : MatrixSdk("matrix_sdk::sliding_sync") + object BaseSlidingSync : MatrixSdk("matrix_sdk_base::sliding_sync") } } +sealed class LogLevel(val filter: String) { + object Warn : LogLevel("warn") + object Trace : LogLevel("trace") + object Info : LogLevel("info") + object Debug : LogLevel("debug") + object Error : LogLevel("error") +} + fun setupTracing(tracingConfiguration: TracingConfiguration) { org.matrix.rustcomponents.sdk.setupTracing(tracingConfiguration.filter) } object TracingConfigurations { - val release = TracingConfiguration(common = TracingConfiguration.LogLevel.Info) - val debug = TracingConfiguration() - val full = TracingConfiguration( - common = TracingConfiguration.LogLevel.Info, - targets = mapOf( - TracingConfiguration.Target.Sled to TracingConfiguration.LogLevel.Warn - ) - ) + val release = TracingConfiguration(overrides = mapOf(Target.Common to LogLevel.Info)) + val debug = TracingConfiguration(overrides = mapOf(Target.Common to LogLevel.Info)) + + fun custom(overrides: Map) = TracingConfiguration(overrides) }