Update dependency org.matrix.rustcomponents:sdk-android to v26.2.6 (#6144)

* Update dependency org.matrix.rustcomponents:sdk-android to v26.2.5

* Fix breaking API changes:
- Add temporary imlementation for `RustClientSessionDelegate.onBackgroundTaskErrorReport`, logging unrecoverable errors in background tasks of the SDK.
- Change `TimelineEventTypeFilter` to `TimelineEventFilter`.
- Support new `LatestEventValue.RemoteInvite`.

* Update the Rust SDK to `26.2.6`

* Fix API changes: `TimelineFocus.PinnedEvents` no longer takes any arguments

* Fix test fixtures: `NotificationItem` has a `rawEvent` field now

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
This commit is contained in:
renovate[bot] 2026-02-06 12:40:03 +00:00 committed by GitHub
parent f7e08aa465
commit 82dd9a3f77
16 changed files with 52 additions and 33 deletions

View file

@ -95,6 +95,7 @@ class RoomListRoomSummaryFactory(
content = content, content = content,
) )
} }
is LatestEventValue.RoomInvite -> LatestEvent.None
} }
} }
} }

View file

@ -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 # 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 # 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. # 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 # Others
coil = { module = "io.coil-kt.coil3:coil", version.ref = "coil" } coil = { module = "io.coil-kt.coil3:coil", version.ref = "coil" }

View file

@ -28,4 +28,10 @@ sealed interface LatestEventValue {
val senderProfile: ProfileDetails, val senderProfile: ProfileDetails,
val isSending: Boolean, val isSending: Boolean,
) : LatestEventValue ) : LatestEventValue
data class RoomInvite(
val timestamp: Long,
val inviterId: UserId?,
val invitedProfile: ProfileDetails,
) : LatestEventValue
} }

View file

@ -19,6 +19,7 @@ data class RoomSummary(
is LatestEventValue.None -> null is LatestEventValue.None -> null
is LatestEventValue.Local -> latestEvent.timestamp is LatestEventValue.Local -> latestEvent.timestamp
is LatestEventValue.Remote -> latestEvent.timestamp is LatestEventValue.Remote -> latestEvent.timestamp
is LatestEventValue.RoomInvite -> latestEvent.timestamp
} }
val isOneToOne get() = info.activeMembersCount == 2L val isOneToOne get() = info.activeMembersCount == 2L
} }

View file

@ -20,6 +20,7 @@ import org.matrix.rustcomponents.sdk.ClientDelegate
import org.matrix.rustcomponents.sdk.ClientSessionDelegate import org.matrix.rustcomponents.sdk.ClientSessionDelegate
import org.matrix.rustcomponents.sdk.Session import org.matrix.rustcomponents.sdk.Session
import timber.log.Timber import timber.log.Timber
import uniffi.matrix_sdk_common.BackgroundTaskFailureReason
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.concurrent.atomic.AtomicBoolean 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 { override fun retrieveSessionFromKeychain(userId: String): Session {
// This should never be called, as it's only used for multi-process setups // This should never be called, as it's only used for multi-process setups
error("retrieveSessionFromKeychain should never be called for Android") error("retrieveSessionFromKeychain should never be called for Android")

View file

@ -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.RoomInfoMapper
import io.element.android.libraries.matrix.impl.room.RoomSyncSubscriber 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.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.history.map
import io.element.android.libraries.matrix.impl.room.join.map import io.element.android.libraries.matrix.impl.room.join.map
import io.element.android.libraries.matrix.impl.room.preview.RoomPreviewInfoMapper import io.element.android.libraries.matrix.impl.room.preview.RoomPreviewInfoMapper
@ -141,7 +141,7 @@ class RustMatrixClient(
dispatchers: CoroutineDispatchers, dispatchers: CoroutineDispatchers,
baseCacheDirectory: File, baseCacheDirectory: File,
clock: SystemClock, clock: SystemClock,
timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory, timelineEventFilterFactory: TimelineEventFilterFactory,
private val featureFlagService: FeatureFlagService, private val featureFlagService: FeatureFlagService,
private val analyticsService: AnalyticsService, private val analyticsService: AnalyticsService,
private val workManagerScheduler: WorkManagerScheduler, private val workManagerScheduler: WorkManagerScheduler,
@ -225,7 +225,7 @@ class RustMatrixClient(
systemClock = clock, systemClock = clock,
roomContentForwarder = RoomContentForwarder(innerRoomListService), roomContentForwarder = RoomContentForwarder(innerRoomListService),
roomSyncSubscriber = roomSyncSubscriber, roomSyncSubscriber = roomSyncSubscriber,
timelineEventTypeFilterFactory = timelineEventTypeFilterFactory, timelineEventFilterFactory = timelineEventFilterFactory,
roomMembershipObserver = roomMembershipObserver, roomMembershipObserver = roomMembershipObserver,
roomInfoMapper = roomInfoMapper, roomInfoMapper = roomInfoMapper,
featureFlagService = featureFlagService, featureFlagService = featureFlagService,

View file

@ -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.SessionPaths
import io.element.android.libraries.matrix.impl.paths.getSessionPaths 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.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.storage.SqliteStoreBuilderProvider
import io.element.android.libraries.matrix.impl.util.anonymizedTokens import io.element.android.libraries.matrix.impl.util.anonymizedTokens
import io.element.android.libraries.network.useragent.UserAgentProvider import io.element.android.libraries.network.useragent.UserAgentProvider
@ -61,7 +61,7 @@ class RustMatrixClientFactory(
private val clock: SystemClock, private val clock: SystemClock,
private val analyticsService: AnalyticsService, private val analyticsService: AnalyticsService,
private val featureFlagService: FeatureFlagService, private val featureFlagService: FeatureFlagService,
private val timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory, private val timelineEventFilterFactory: TimelineEventFilterFactory,
private val clientBuilderProvider: ClientBuilderProvider, private val clientBuilderProvider: ClientBuilderProvider,
private val sqliteStoreBuilderProvider: SqliteStoreBuilderProvider, private val sqliteStoreBuilderProvider: SqliteStoreBuilderProvider,
private val workManagerScheduler: WorkManagerScheduler, private val workManagerScheduler: WorkManagerScheduler,
@ -115,7 +115,7 @@ class RustMatrixClientFactory(
dispatchers = coroutineDispatchers, dispatchers = coroutineDispatchers,
baseCacheDirectory = cacheDirectory, baseCacheDirectory = cacheDirectory,
clock = clock, clock = clock,
timelineEventTypeFilterFactory = timelineEventTypeFilterFactory, timelineEventFilterFactory = timelineEventFilterFactory,
featureFlagService = featureFlagService, featureFlagService = featureFlagService,
analyticsService = analyticsService, analyticsService = analyticsService,
workManagerScheduler = workManagerScheduler, workManagerScheduler = workManagerScheduler,

View file

@ -80,6 +80,7 @@ import org.matrix.rustcomponents.sdk.getElementCallRequiredPermissions
import org.matrix.rustcomponents.sdk.use import org.matrix.rustcomponents.sdk.use
import timber.log.Timber import timber.log.Timber
import uniffi.matrix_sdk.RoomPowerLevelChanges import uniffi.matrix_sdk.RoomPowerLevelChanges
import uniffi.matrix_sdk_ui.TimelineEventFocusThreadMode
import uniffi.matrix_sdk_ui.TimelineReadReceiptTracking import uniffi.matrix_sdk_ui.TimelineReadReceiptTracking
import kotlin.coroutines.cancellation.CancellationException import kotlin.coroutines.cancellation.CancellationException
import org.matrix.rustcomponents.sdk.IdentityStatusChange as RustIdentityStateChange import org.matrix.rustcomponents.sdk.IdentityStatusChange as RustIdentityStateChange
@ -177,21 +178,18 @@ class JoinedRustRoom(
): Result<Timeline> = withContext(roomDispatcher) { ): Result<Timeline> = withContext(roomDispatcher) {
val hideThreadedEvents = featureFlagService.isFeatureEnabled(FeatureFlags.Threads) val hideThreadedEvents = featureFlagService.isFeatureEnabled(FeatureFlags.Threads)
val focus = when (createTimelineParams) { val focus = when (createTimelineParams) {
is CreateTimelineParams.PinnedOnly -> TimelineFocus.PinnedEvents( is CreateTimelineParams.PinnedOnly -> TimelineFocus.PinnedEvents
maxEventsToLoad = 100u,
maxConcurrentRequests = 10u,
)
is CreateTimelineParams.MediaOnly -> TimelineFocus.Live(hideThreadedEvents = hideThreadedEvents) is CreateTimelineParams.MediaOnly -> TimelineFocus.Live(hideThreadedEvents = hideThreadedEvents)
is CreateTimelineParams.Focused -> TimelineFocus.Event( is CreateTimelineParams.Focused -> TimelineFocus.Event(
eventId = createTimelineParams.focusedEventId.value, eventId = createTimelineParams.focusedEventId.value,
numContextEvents = 50u, numContextEvents = 50u,
hideThreadedEvents = hideThreadedEvents, threadMode = TimelineEventFocusThreadMode.Automatic(hideThreadedEvents),
) )
is CreateTimelineParams.MediaOnlyFocused -> TimelineFocus.Event( is CreateTimelineParams.MediaOnlyFocused -> TimelineFocus.Event(
eventId = createTimelineParams.focusedEventId.value, eventId = createTimelineParams.focusedEventId.value,
numContextEvents = 50u, numContextEvents = 50u,
// Never hide threaded events in media focused timeline // Never hide threaded events in media focused timeline
hideThreadedEvents = false, threadMode = TimelineEventFocusThreadMode.Automatic(false),
) )
is CreateTimelineParams.Threaded -> TimelineFocus.Thread( is CreateTimelineParams.Threaded -> TimelineFocus.Thread(
rootEventId = createTimelineParams.threadRootEventId.value, rootEventId = createTimelineParams.threadRootEventId.value,

View file

@ -57,7 +57,7 @@ class RustRoomFactory(
private val roomListService: RoomListService, private val roomListService: RoomListService,
private val innerRoomListService: InnerRoomListService, private val innerRoomListService: InnerRoomListService,
private val roomSyncSubscriber: RoomSyncSubscriber, private val roomSyncSubscriber: RoomSyncSubscriber,
private val timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory, private val timelineEventFilterFactory: TimelineEventFilterFactory,
private val featureFlagService: FeatureFlagService, private val featureFlagService: FeatureFlagService,
private val roomMembershipObserver: RoomMembershipObserver, private val roomMembershipObserver: RoomMembershipObserver,
private val roomInfoMapper: RoomInfoMapper, private val roomInfoMapper: RoomInfoMapper,
@ -70,7 +70,7 @@ class RustRoomFactory(
private val eventFilters = TimelineConfig.excludedEvents private val eventFilters = TimelineConfig.excludedEvents
.takeIf { it.isNotEmpty() } .takeIf { it.isNotEmpty() }
?.let { listStateEventType -> ?.let { listStateEventType ->
timelineEventTypeFilterFactory.create(listStateEventType) timelineEventFilterFactory.create(listStateEventType)
} }
suspend fun destroy() { suspend fun destroy() {
@ -133,7 +133,7 @@ class RustRoomFactory(
sdkRoom.timelineWithConfiguration( sdkRoom.timelineWithConfiguration(
TimelineConfiguration( TimelineConfiguration(
focus = TimelineFocus.Live(hideThreadedEvents = hideThreadedEvents), focus = TimelineFocus.Live(hideThreadedEvents = hideThreadedEvents),
filter = eventFilters?.let(TimelineFilter::EventTypeFilter) ?: TimelineFilter.All, filter = eventFilters?.let(TimelineFilter::EventFilter) ?: TimelineFilter.All,
internalIdPrefix = "live", internalIdPrefix = "live",
dateDividerMode = DateDividerMode.DAILY, dateDividerMode = DateDividerMode.DAILY,
trackReadReceipts = TimelineReadReceiptTracking.ALL_EVENTS, trackReadReceipts = TimelineReadReceiptTracking.ALL_EVENTS,

View file

@ -12,16 +12,16 @@ import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.ContributesBinding
import io.element.android.libraries.matrix.api.room.StateEventType import io.element.android.libraries.matrix.api.room.StateEventType
import org.matrix.rustcomponents.sdk.FilterTimelineEventType import org.matrix.rustcomponents.sdk.FilterTimelineEventType
import org.matrix.rustcomponents.sdk.TimelineEventTypeFilter import org.matrix.rustcomponents.sdk.TimelineEventFilter
interface TimelineEventTypeFilterFactory { interface TimelineEventFilterFactory {
fun create(listStateEventType: List<StateEventType>): TimelineEventTypeFilter fun create(listStateEventType: List<StateEventType>): TimelineEventFilter
} }
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
class RustTimelineEventTypeFilterFactory : TimelineEventTypeFilterFactory { class RustTimelineEventFilterFactory : TimelineEventFilterFactory {
override fun create(listStateEventType: List<StateEventType>): TimelineEventTypeFilter { override fun create(listStateEventType: List<StateEventType>): TimelineEventFilter {
return TimelineEventTypeFilter.exclude( return TimelineEventFilter.excludeEventTypes(
listStateEventType.map { stateEventType -> listStateEventType.map { stateEventType ->
FilterTimelineEventType.State(stateEventType.map()) FilterTimelineEventType.State(stateEventType.map())
} }

View file

@ -53,6 +53,11 @@ class RoomSummaryFactory(
senderProfile = event.profile.map(), senderProfile = event.profile.map(),
isOwn = event.isOwn, isOwn = event.isOwn,
) )
is RustLatestEventValue.RemoteInvite -> LatestEventValue.RoomInvite(
timestamp = event.timestamp.toLong(),
inviterId = event.inviter?.let(::UserId),
invitedProfile = event.inviterProfile.map(),
)
} }
} }
return RoomSummary( return RoomSummary(

View file

@ -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.api.core.SessionId
import io.element.android.libraries.matrix.impl.auth.FakeProxyProvider 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.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.matrix.impl.storage.FakeSqliteStoreBuilderProvider
import io.element.android.libraries.network.useragent.SimpleUserAgentProvider import io.element.android.libraries.network.useragent.SimpleUserAgentProvider
import io.element.android.libraries.sessionstorage.api.SessionStore import io.element.android.libraries.sessionstorage.api.SessionStore
@ -63,7 +63,7 @@ fun TestScope.createRustMatrixClientFactory(
clock = FakeSystemClock(), clock = FakeSystemClock(),
analyticsService = FakeAnalyticsService(), analyticsService = FakeAnalyticsService(),
featureFlagService = FakeFeatureFlagService(), featureFlagService = FakeFeatureFlagService(),
timelineEventTypeFilterFactory = FakeTimelineEventTypeFilterFactory(), timelineEventFilterFactory = FakeTimelineEventFilterFactory(),
clientBuilderProvider = clientBuilderProvider, clientBuilderProvider = clientBuilderProvider,
sqliteStoreBuilderProvider = FakeSqliteStoreBuilderProvider(), sqliteStoreBuilderProvider = FakeSqliteStoreBuilderProvider(),
workManagerScheduler = workManagerScheduler, workManagerScheduler = workManagerScheduler,

View file

@ -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.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiClient 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.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.AN_AVATAR_URL
import io.element.android.libraries.matrix.test.A_DEVICE_ID import io.element.android.libraries.matrix.test.A_DEVICE_ID
import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_ID
@ -150,7 +150,7 @@ class RustMatrixClientTest {
dispatchers = testCoroutineDispatchers(), dispatchers = testCoroutineDispatchers(),
baseCacheDirectory = File(""), baseCacheDirectory = File(""),
clock = FakeSystemClock(), clock = FakeSystemClock(),
timelineEventTypeFilterFactory = FakeTimelineEventTypeFilterFactory(), timelineEventFilterFactory = FakeTimelineEventFilterFactory(),
featureFlagService = FakeFeatureFlagService(), featureFlagService = FakeFeatureFlagService(),
analyticsService = FakeAnalyticsService(), analyticsService = FakeAnalyticsService(),
workManagerScheduler = FakeWorkManagerScheduler(submitLambda = {}), workManagerScheduler = FakeWorkManagerScheduler(submitLambda = {}),

View file

@ -30,6 +30,7 @@ internal fun aRustNotificationItem(
hasMention: Boolean? = false, hasMention: Boolean? = false,
threadId: ThreadId? = null, threadId: ThreadId? = null,
actions: List<Action>? = null, actions: List<Action>? = null,
rawEvent: String = "",
) = NotificationItem( ) = NotificationItem(
event = event, event = event,
senderInfo = senderInfo, senderInfo = senderInfo,
@ -38,6 +39,7 @@ internal fun aRustNotificationItem(
hasMention = hasMention, hasMention = hasMention,
threadId = threadId?.value, threadId = threadId?.value,
actions = actions, actions = actions,
rawEvent = rawEvent,
) )
internal fun aRustBatchNotificationResultOk( internal fun aRustBatchNotificationResultOk(

View file

@ -9,6 +9,6 @@
package io.element.android.libraries.matrix.impl.fixtures.fakes package io.element.android.libraries.matrix.impl.fixtures.fakes
import org.matrix.rustcomponents.sdk.NoHandle 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)

View file

@ -9,11 +9,11 @@
package io.element.android.libraries.matrix.impl.room package io.element.android.libraries.matrix.impl.room
import io.element.android.libraries.matrix.api.room.StateEventType import io.element.android.libraries.matrix.api.room.StateEventType
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiTimelineEventTypeFilter import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiTimelineEventFilter
import org.matrix.rustcomponents.sdk.TimelineEventTypeFilter import org.matrix.rustcomponents.sdk.TimelineEventFilter
class FakeTimelineEventTypeFilterFactory : TimelineEventTypeFilterFactory { class FakeTimelineEventFilterFactory : TimelineEventFilterFactory {
override fun create(listStateEventType: List<StateEventType>): TimelineEventTypeFilter { override fun create(listStateEventType: List<StateEventType>): TimelineEventFilter {
return FakeFfiTimelineEventTypeFilter() return FakeFfiTimelineEventFilter()
} }
} }