diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt index 0200f495ef..d723d1a424 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt @@ -95,6 +95,7 @@ class RoomListRoomSummaryFactory( content = content, ) } + is LatestEventValue.RoomInvite -> LatestEvent.None } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1ec46a70ba..6b98fac8c5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -177,7 +177,7 @@ test_detekt_test = { module = "io.gitlab.arturbosch.detekt:detekt-test", version # https://github.com/matrix-org/matrix-rust-components-kotlin/commits/main/sdk/sdk-android/src/main/kotlin/org/matrix/rustcomponents/sdk/matrix_sdk_ffi.kt # All new features should not be implemented in the pull request that upgrades the version, developers should # only fix API breaks and may add some TODOs. -matrix_sdk = "org.matrix.rustcomponents:sdk-android:26.1.27" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:26.2.6" # Others coil = { module = "io.coil-kt.coil3:coil", version.ref = "coil" } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/LatestEventValue.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/LatestEventValue.kt index 5482a67875..b10dab9e4b 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/LatestEventValue.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/LatestEventValue.kt @@ -28,4 +28,10 @@ sealed interface LatestEventValue { val senderProfile: ProfileDetails, val isSending: Boolean, ) : LatestEventValue + + data class RoomInvite( + val timestamp: Long, + val inviterId: UserId?, + val invitedProfile: ProfileDetails, + ) : LatestEventValue } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomSummary.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomSummary.kt index 89a4acfec1..aca093eab6 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomSummary.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomSummary.kt @@ -19,6 +19,7 @@ data class RoomSummary( is LatestEventValue.None -> null is LatestEventValue.Local -> latestEvent.timestamp is LatestEventValue.Remote -> latestEvent.timestamp + is LatestEventValue.RoomInvite -> latestEvent.timestamp } val isOneToOne get() = info.activeMembersCount == 2L } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustClientSessionDelegate.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustClientSessionDelegate.kt index ee9f1d3eac..fb6c362734 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustClientSessionDelegate.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustClientSessionDelegate.kt @@ -20,6 +20,7 @@ import org.matrix.rustcomponents.sdk.ClientDelegate import org.matrix.rustcomponents.sdk.ClientSessionDelegate import org.matrix.rustcomponents.sdk.Session import timber.log.Timber +import uniffi.matrix_sdk_common.BackgroundTaskFailureReason import java.lang.ref.WeakReference import java.util.concurrent.atomic.AtomicBoolean @@ -120,6 +121,11 @@ class RustClientSessionDelegate( } } + override fun onBackgroundTaskErrorReport(taskName: String, error: BackgroundTaskFailureReason) { + // TODO actually implement the missing logic to report to sentry and crash the app + Timber.tag(loggerTag.value).e("onBackgroundTaskErrorReport(taskName=$taskName, error=$error)") + } + override fun retrieveSessionFromKeychain(userId: String): Session { // This should never be called, as it's only used for multi-process setups error("retrieveSessionFromKeychain should never be called for Android") diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index 5848faa8d6..124db3dd1f 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -66,7 +66,7 @@ import io.element.android.libraries.matrix.impl.room.RoomContentForwarder import io.element.android.libraries.matrix.impl.room.RoomInfoMapper import io.element.android.libraries.matrix.impl.room.RoomSyncSubscriber import io.element.android.libraries.matrix.impl.room.RustRoomFactory -import io.element.android.libraries.matrix.impl.room.TimelineEventTypeFilterFactory +import io.element.android.libraries.matrix.impl.room.TimelineEventFilterFactory import io.element.android.libraries.matrix.impl.room.history.map import io.element.android.libraries.matrix.impl.room.join.map import io.element.android.libraries.matrix.impl.room.preview.RoomPreviewInfoMapper @@ -141,7 +141,7 @@ class RustMatrixClient( dispatchers: CoroutineDispatchers, baseCacheDirectory: File, clock: SystemClock, - timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory, + timelineEventFilterFactory: TimelineEventFilterFactory, private val featureFlagService: FeatureFlagService, private val analyticsService: AnalyticsService, private val workManagerScheduler: WorkManagerScheduler, @@ -225,7 +225,7 @@ class RustMatrixClient( systemClock = clock, roomContentForwarder = RoomContentForwarder(innerRoomListService), roomSyncSubscriber = roomSyncSubscriber, - timelineEventTypeFilterFactory = timelineEventTypeFilterFactory, + timelineEventFilterFactory = timelineEventFilterFactory, roomMembershipObserver = roomMembershipObserver, roomInfoMapper = roomInfoMapper, featureFlagService = featureFlagService, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt index f497947a83..34907ab781 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt @@ -21,7 +21,7 @@ import io.element.android.libraries.matrix.impl.certificates.UserCertificatesPro import io.element.android.libraries.matrix.impl.paths.SessionPaths import io.element.android.libraries.matrix.impl.paths.getSessionPaths import io.element.android.libraries.matrix.impl.proxy.ProxyProvider -import io.element.android.libraries.matrix.impl.room.TimelineEventTypeFilterFactory +import io.element.android.libraries.matrix.impl.room.TimelineEventFilterFactory import io.element.android.libraries.matrix.impl.storage.SqliteStoreBuilderProvider import io.element.android.libraries.matrix.impl.util.anonymizedTokens import io.element.android.libraries.network.useragent.UserAgentProvider @@ -61,7 +61,7 @@ class RustMatrixClientFactory( private val clock: SystemClock, private val analyticsService: AnalyticsService, private val featureFlagService: FeatureFlagService, - private val timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory, + private val timelineEventFilterFactory: TimelineEventFilterFactory, private val clientBuilderProvider: ClientBuilderProvider, private val sqliteStoreBuilderProvider: SqliteStoreBuilderProvider, private val workManagerScheduler: WorkManagerScheduler, @@ -115,7 +115,7 @@ class RustMatrixClientFactory( dispatchers = coroutineDispatchers, baseCacheDirectory = cacheDirectory, clock = clock, - timelineEventTypeFilterFactory = timelineEventTypeFilterFactory, + timelineEventFilterFactory = timelineEventFilterFactory, featureFlagService = featureFlagService, analyticsService = analyticsService, workManagerScheduler = workManagerScheduler, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt index 00d4175ee3..bb58054998 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt @@ -80,6 +80,7 @@ import org.matrix.rustcomponents.sdk.getElementCallRequiredPermissions import org.matrix.rustcomponents.sdk.use import timber.log.Timber import uniffi.matrix_sdk.RoomPowerLevelChanges +import uniffi.matrix_sdk_ui.TimelineEventFocusThreadMode import uniffi.matrix_sdk_ui.TimelineReadReceiptTracking import kotlin.coroutines.cancellation.CancellationException import org.matrix.rustcomponents.sdk.IdentityStatusChange as RustIdentityStateChange @@ -177,21 +178,18 @@ class JoinedRustRoom( ): Result = withContext(roomDispatcher) { val hideThreadedEvents = featureFlagService.isFeatureEnabled(FeatureFlags.Threads) val focus = when (createTimelineParams) { - is CreateTimelineParams.PinnedOnly -> TimelineFocus.PinnedEvents( - maxEventsToLoad = 100u, - maxConcurrentRequests = 10u, - ) + is CreateTimelineParams.PinnedOnly -> TimelineFocus.PinnedEvents is CreateTimelineParams.MediaOnly -> TimelineFocus.Live(hideThreadedEvents = hideThreadedEvents) is CreateTimelineParams.Focused -> TimelineFocus.Event( eventId = createTimelineParams.focusedEventId.value, numContextEvents = 50u, - hideThreadedEvents = hideThreadedEvents, + threadMode = TimelineEventFocusThreadMode.Automatic(hideThreadedEvents), ) is CreateTimelineParams.MediaOnlyFocused -> TimelineFocus.Event( eventId = createTimelineParams.focusedEventId.value, numContextEvents = 50u, // Never hide threaded events in media focused timeline - hideThreadedEvents = false, + threadMode = TimelineEventFocusThreadMode.Automatic(false), ) is CreateTimelineParams.Threaded -> TimelineFocus.Thread( rootEventId = createTimelineParams.threadRootEventId.value, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt index cbc39b1c61..a3af54863c 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt @@ -57,7 +57,7 @@ class RustRoomFactory( private val roomListService: RoomListService, private val innerRoomListService: InnerRoomListService, private val roomSyncSubscriber: RoomSyncSubscriber, - private val timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory, + private val timelineEventFilterFactory: TimelineEventFilterFactory, private val featureFlagService: FeatureFlagService, private val roomMembershipObserver: RoomMembershipObserver, private val roomInfoMapper: RoomInfoMapper, @@ -70,7 +70,7 @@ class RustRoomFactory( private val eventFilters = TimelineConfig.excludedEvents .takeIf { it.isNotEmpty() } ?.let { listStateEventType -> - timelineEventTypeFilterFactory.create(listStateEventType) + timelineEventFilterFactory.create(listStateEventType) } suspend fun destroy() { @@ -133,7 +133,7 @@ class RustRoomFactory( sdkRoom.timelineWithConfiguration( TimelineConfiguration( focus = TimelineFocus.Live(hideThreadedEvents = hideThreadedEvents), - filter = eventFilters?.let(TimelineFilter::EventTypeFilter) ?: TimelineFilter.All, + filter = eventFilters?.let(TimelineFilter::EventFilter) ?: TimelineFilter.All, internalIdPrefix = "live", dateDividerMode = DateDividerMode.DAILY, trackReadReceipts = TimelineReadReceiptTracking.ALL_EVENTS, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/TimelineEventTypeFilterFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/TimelineEventFilterFactory.kt similarity index 75% rename from libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/TimelineEventTypeFilterFactory.kt rename to libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/TimelineEventFilterFactory.kt index d25f595569..b4735fdaf3 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/TimelineEventTypeFilterFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/TimelineEventFilterFactory.kt @@ -12,16 +12,16 @@ import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.libraries.matrix.api.room.StateEventType import org.matrix.rustcomponents.sdk.FilterTimelineEventType -import org.matrix.rustcomponents.sdk.TimelineEventTypeFilter +import org.matrix.rustcomponents.sdk.TimelineEventFilter -interface TimelineEventTypeFilterFactory { - fun create(listStateEventType: List): TimelineEventTypeFilter +interface TimelineEventFilterFactory { + fun create(listStateEventType: List): TimelineEventFilter } @ContributesBinding(AppScope::class) -class RustTimelineEventTypeFilterFactory : TimelineEventTypeFilterFactory { - override fun create(listStateEventType: List): TimelineEventTypeFilter { - return TimelineEventTypeFilter.exclude( +class RustTimelineEventFilterFactory : TimelineEventFilterFactory { + override fun create(listStateEventType: List): TimelineEventFilter { + return TimelineEventFilter.excludeEventTypes( listStateEventType.map { stateEventType -> FilterTimelineEventType.State(stateEventType.map()) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryFactory.kt index 738c1f72ea..06afb96d3f 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryFactory.kt @@ -53,6 +53,11 @@ class RoomSummaryFactory( senderProfile = event.profile.map(), isOwn = event.isOwn, ) + is RustLatestEventValue.RemoteInvite -> LatestEventValue.RoomInvite( + timestamp = event.timestamp.toLong(), + inviterId = event.inviter?.let(::UserId), + invitedProfile = event.inviterProfile.map(), + ) } } return RoomSummary( diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt index fa69752afe..5e53d015e9 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt @@ -13,7 +13,7 @@ import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.impl.auth.FakeProxyProvider import io.element.android.libraries.matrix.impl.auth.FakeUserCertificatesProvider -import io.element.android.libraries.matrix.impl.room.FakeTimelineEventTypeFilterFactory +import io.element.android.libraries.matrix.impl.room.FakeTimelineEventFilterFactory import io.element.android.libraries.matrix.impl.storage.FakeSqliteStoreBuilderProvider import io.element.android.libraries.network.useragent.SimpleUserAgentProvider import io.element.android.libraries.sessionstorage.api.SessionStore @@ -63,7 +63,7 @@ fun TestScope.createRustMatrixClientFactory( clock = FakeSystemClock(), analyticsService = FakeAnalyticsService(), featureFlagService = FakeFeatureFlagService(), - timelineEventTypeFilterFactory = FakeTimelineEventTypeFilterFactory(), + timelineEventFilterFactory = FakeTimelineEventFilterFactory(), clientBuilderProvider = clientBuilderProvider, sqliteStoreBuilderProvider = FakeSqliteStoreBuilderProvider(), workManagerScheduler = workManagerScheduler, diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt index 7239226947..ed8440fe53 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt @@ -15,7 +15,7 @@ import io.element.android.libraries.core.data.bytes import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiClient import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiSyncService -import io.element.android.libraries.matrix.impl.room.FakeTimelineEventTypeFilterFactory +import io.element.android.libraries.matrix.impl.room.FakeTimelineEventFilterFactory import io.element.android.libraries.matrix.test.AN_AVATAR_URL import io.element.android.libraries.matrix.test.A_DEVICE_ID import io.element.android.libraries.matrix.test.A_ROOM_ID @@ -150,7 +150,7 @@ class RustMatrixClientTest { dispatchers = testCoroutineDispatchers(), baseCacheDirectory = File(""), clock = FakeSystemClock(), - timelineEventTypeFilterFactory = FakeTimelineEventTypeFilterFactory(), + timelineEventFilterFactory = FakeTimelineEventFilterFactory(), featureFlagService = FakeFeatureFlagService(), analyticsService = FakeAnalyticsService(), workManagerScheduler = FakeWorkManagerScheduler(submitLambda = {}), diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt index 672439ad6c..4db2db7107 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt @@ -30,6 +30,7 @@ internal fun aRustNotificationItem( hasMention: Boolean? = false, threadId: ThreadId? = null, actions: List? = null, + rawEvent: String = "", ) = NotificationItem( event = event, senderInfo = senderInfo, @@ -38,6 +39,7 @@ internal fun aRustNotificationItem( hasMention = hasMention, threadId = threadId?.value, actions = actions, + rawEvent = rawEvent, ) internal fun aRustBatchNotificationResultOk( diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEventTypeFilter.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEventFilter.kt similarity index 72% rename from libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEventTypeFilter.kt rename to libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEventFilter.kt index 067567c4e9..2f9798dcc2 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEventTypeFilter.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEventFilter.kt @@ -9,6 +9,6 @@ package io.element.android.libraries.matrix.impl.fixtures.fakes import org.matrix.rustcomponents.sdk.NoHandle -import org.matrix.rustcomponents.sdk.TimelineEventTypeFilter +import org.matrix.rustcomponents.sdk.TimelineEventFilter -class FakeFfiTimelineEventTypeFilter : TimelineEventTypeFilter(NoHandle) +class FakeFfiTimelineEventFilter : TimelineEventFilter(NoHandle) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/FakeTimelineEventTypeFilterFactory.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/FakeTimelineEventFilterFactory.kt similarity index 67% rename from libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/FakeTimelineEventTypeFilterFactory.kt rename to libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/FakeTimelineEventFilterFactory.kt index 52da51a123..f35746d8d3 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/FakeTimelineEventTypeFilterFactory.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/FakeTimelineEventFilterFactory.kt @@ -9,11 +9,11 @@ package io.element.android.libraries.matrix.impl.room import io.element.android.libraries.matrix.api.room.StateEventType -import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiTimelineEventTypeFilter -import org.matrix.rustcomponents.sdk.TimelineEventTypeFilter +import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiTimelineEventFilter +import org.matrix.rustcomponents.sdk.TimelineEventFilter -class FakeTimelineEventTypeFilterFactory : TimelineEventTypeFilterFactory { - override fun create(listStateEventType: List): TimelineEventTypeFilter { - return FakeFfiTimelineEventTypeFilter() +class FakeTimelineEventFilterFactory : TimelineEventFilterFactory { + override fun create(listStateEventType: List): TimelineEventFilter { + return FakeFfiTimelineEventFilter() } }