Skip to content

Commit dfe9323

Browse files
authored
Merge pull request #3501 from element-hq/bma/testRustMatrixClient
Test RustMatrixClient and other classes in the matrix module
2 parents 9571261 + 88a30eb commit dfe9323

File tree

70 files changed

+1598
-138
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+1598
-138
lines changed

libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationData.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ sealed interface NotificationContent {
9494
data object RoomHistoryVisibility : StateEvent
9595
data object RoomJoinRules : StateEvent
9696
data class RoomMemberContent(
97-
val userId: String,
97+
val userId: UserId,
9898
val membershipState: RoomMembershipState
9999
) : StateEvent
100100

@@ -108,6 +108,10 @@ sealed interface NotificationContent {
108108
data object SpaceChild : StateEvent
109109
data object SpaceParent : StateEvent
110110
}
111+
112+
data class Invite(
113+
val senderId: UserId,
114+
) : NotificationContent
111115
}
112116

113117
enum class CallNotifyType {

libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationService.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ package io.element.android.libraries.matrix.api.notification
99

1010
import io.element.android.libraries.matrix.api.core.EventId
1111
import io.element.android.libraries.matrix.api.core.RoomId
12-
import io.element.android.libraries.matrix.api.core.SessionId
1312

1413
interface NotificationService {
15-
suspend fun getNotification(userId: SessionId, roomId: RoomId, eventId: EventId): Result<NotificationData?>
14+
suspend fun getNotification(roomId: RoomId, eventId: EventId): Result<NotificationData?>
1615
}

libraries/matrix/impl/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ dependencies {
4646
testImplementation(libs.test.junit)
4747
testImplementation(libs.test.truth)
4848
testImplementation(libs.test.robolectric)
49+
testImplementation(projects.libraries.featureflag.test)
4950
testImplementation(projects.libraries.matrix.test)
51+
testImplementation(projects.libraries.preferences.test)
5052
testImplementation(projects.libraries.sessionStorage.implMemory)
5153
testImplementation(projects.libraries.sessionStorage.test)
5254
testImplementation(projects.services.analytics.test)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only
5+
* Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
package io.element.android.libraries.matrix.impl
9+
10+
import com.squareup.anvil.annotations.ContributesBinding
11+
import io.element.android.libraries.di.AppScope
12+
import org.matrix.rustcomponents.sdk.ClientBuilder
13+
import javax.inject.Inject
14+
15+
interface ClientBuilderProvider {
16+
fun provide(): ClientBuilder
17+
}
18+
19+
@ContributesBinding(AppScope::class)
20+
class RustClientBuilderProvider @Inject constructor() : ClientBuilderProvider {
21+
override fun provide(): ClientBuilder {
22+
return ClientBuilder()
23+
}
24+
}

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import io.element.android.libraries.matrix.impl.pushers.RustPushersService
5454
import io.element.android.libraries.matrix.impl.room.RoomContentForwarder
5555
import io.element.android.libraries.matrix.impl.room.RoomSyncSubscriber
5656
import io.element.android.libraries.matrix.impl.room.RustRoomFactory
57+
import io.element.android.libraries.matrix.impl.room.TimelineEventTypeFilterFactory
5758
import io.element.android.libraries.matrix.impl.room.preview.RoomPreviewMapper
5859
import io.element.android.libraries.matrix.impl.roomdirectory.RustRoomDirectoryService
5960
import io.element.android.libraries.matrix.impl.roomlist.RoomListFactory
@@ -115,14 +116,15 @@ import org.matrix.rustcomponents.sdk.SyncService as ClientSyncService
115116
@OptIn(ExperimentalCoroutinesApi::class)
116117
class RustMatrixClient(
117118
private val client: Client,
118-
private val syncService: ClientSyncService,
119+
private val baseDirectory: File,
119120
private val sessionStore: SessionStore,
120121
private val appCoroutineScope: CoroutineScope,
121-
private val dispatchers: CoroutineDispatchers,
122-
private val baseDirectory: File,
123-
baseCacheDirectory: File,
124-
private val clock: SystemClock,
125122
private val sessionDelegate: RustClientSessionDelegate,
123+
syncService: ClientSyncService,
124+
dispatchers: CoroutineDispatchers,
125+
baseCacheDirectory: File,
126+
clock: SystemClock,
127+
timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory,
126128
) : MatrixClient {
127129
override val sessionId: UserId = UserId(client.userId())
128130
override val deviceId: DeviceId = DeviceId(client.deviceId())
@@ -138,7 +140,7 @@ class RustMatrixClient(
138140
)
139141
private val notificationProcessSetup = NotificationProcessSetup.SingleProcess(syncService)
140142
private val notificationClient = runBlocking { client.notificationClient(notificationProcessSetup) }
141-
private val notificationService = RustNotificationService(sessionId, notificationClient, dispatchers, clock)
143+
private val notificationService = RustNotificationService(notificationClient, dispatchers, clock)
142144
private val notificationSettingsService = RustNotificationSettingsService(client, dispatchers)
143145
.apply { start() }
144146
private val encryptionService = RustEncryptionService(
@@ -185,6 +187,7 @@ class RustMatrixClient(
185187
systemClock = clock,
186188
roomContentForwarder = RoomContentForwarder(innerRoomListService),
187189
roomSyncSubscriber = roomSyncSubscriber,
190+
timelineEventTypeFilterFactory = timelineEventTypeFilterFactory,
188191
)
189192

190193
override val mediaLoader: MatrixMediaLoader = RustMediaLoader(

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import io.element.android.libraries.matrix.impl.certificates.UserCertificatesPro
1616
import io.element.android.libraries.matrix.impl.paths.SessionPaths
1717
import io.element.android.libraries.matrix.impl.paths.getSessionPaths
1818
import io.element.android.libraries.matrix.impl.proxy.ProxyProvider
19+
import io.element.android.libraries.matrix.impl.room.TimelineEventTypeFilterFactory
1920
import io.element.android.libraries.matrix.impl.util.anonymizedTokens
2021
import io.element.android.libraries.network.useragent.UserAgentProvider
2122
import io.element.android.libraries.sessionstorage.api.SessionData
@@ -45,6 +46,8 @@ class RustMatrixClientFactory @Inject constructor(
4546
private val clock: SystemClock,
4647
private val utdTracker: UtdTracker,
4748
private val featureFlagService: FeatureFlagService,
49+
private val timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory,
50+
private val clientBuilderProvider: ClientBuilderProvider,
4851
) {
4952
suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) {
5053
val sessionDelegate = RustClientSessionDelegate(sessionStore, appCoroutineScope, coroutineDispatchers)
@@ -68,14 +71,15 @@ class RustMatrixClientFactory @Inject constructor(
6871

6972
RustMatrixClient(
7073
client = client,
71-
syncService = syncService,
74+
baseDirectory = baseDirectory,
7275
sessionStore = sessionStore,
7376
appCoroutineScope = appCoroutineScope,
77+
sessionDelegate = sessionDelegate,
78+
syncService = syncService,
7479
dispatchers = coroutineDispatchers,
75-
baseDirectory = baseDirectory,
7680
baseCacheDirectory = cacheDirectory,
7781
clock = clock,
78-
sessionDelegate = sessionDelegate,
82+
timelineEventTypeFilterFactory = timelineEventTypeFilterFactory,
7983
).also {
8084
Timber.tag(it.toString()).d("Creating Client with access token '$anonymizedAccessToken' and refresh token '$anonymizedRefreshToken'")
8185
}
@@ -86,7 +90,7 @@ class RustMatrixClientFactory @Inject constructor(
8690
passphrase: String?,
8791
slidingSyncType: ClientBuilderSlidingSync,
8892
): ClientBuilder {
89-
return ClientBuilder()
93+
return clientBuilderProvider.provide()
9094
.sessionPaths(
9195
dataPath = sessionPaths.fileDirectory.absolutePath,
9296
cachePath = sessionPaths.cacheDirectory.absolutePath,

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,19 @@ package io.element.android.libraries.matrix.impl.notification
1010
import io.element.android.libraries.core.bool.orFalse
1111
import io.element.android.libraries.matrix.api.core.EventId
1212
import io.element.android.libraries.matrix.api.core.RoomId
13-
import io.element.android.libraries.matrix.api.core.SessionId
13+
import io.element.android.libraries.matrix.api.core.UserId
1414
import io.element.android.libraries.matrix.api.notification.NotificationContent
1515
import io.element.android.libraries.matrix.api.notification.NotificationData
16-
import io.element.android.libraries.matrix.api.room.RoomMembershipState
1716
import io.element.android.libraries.matrix.api.room.isDm
1817
import io.element.android.services.toolbox.api.systemclock.SystemClock
1918
import org.matrix.rustcomponents.sdk.NotificationEvent
2019
import org.matrix.rustcomponents.sdk.NotificationItem
2120
import org.matrix.rustcomponents.sdk.use
2221

2322
class NotificationMapper(
24-
sessionId: SessionId,
2523
private val clock: SystemClock,
2624
) {
27-
private val notificationContentMapper = NotificationContentMapper(sessionId)
25+
private val notificationContentMapper = NotificationContentMapper()
2826

2927
fun map(
3028
eventId: EventId,
@@ -56,15 +54,14 @@ class NotificationMapper(
5654
}
5755
}
5856

59-
class NotificationContentMapper(private val sessionId: SessionId) {
57+
class NotificationContentMapper {
6058
private val timelineEventToNotificationContentMapper = TimelineEventToNotificationContentMapper()
6159

6260
fun map(notificationEvent: NotificationEvent): NotificationContent =
6361
when (notificationEvent) {
6462
is NotificationEvent.Timeline -> timelineEventToNotificationContentMapper.map(notificationEvent.event)
65-
is NotificationEvent.Invite -> NotificationContent.StateEvent.RoomMemberContent(
66-
userId = sessionId.value,
67-
membershipState = RoomMembershipState.INVITE,
63+
is NotificationEvent.Invite -> NotificationContent.Invite(
64+
senderId = UserId(notificationEvent.sender),
6865
)
6966
}
7067
}

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationService.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ package io.element.android.libraries.matrix.impl.notification
1010
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
1111
import io.element.android.libraries.matrix.api.core.EventId
1212
import io.element.android.libraries.matrix.api.core.RoomId
13-
import io.element.android.libraries.matrix.api.core.SessionId
1413
import io.element.android.libraries.matrix.api.notification.NotificationData
1514
import io.element.android.libraries.matrix.api.notification.NotificationService
1615
import io.element.android.services.toolbox.api.systemclock.SystemClock
@@ -19,15 +18,13 @@ import org.matrix.rustcomponents.sdk.NotificationClient
1918
import org.matrix.rustcomponents.sdk.use
2019

2120
class RustNotificationService(
22-
sessionId: SessionId,
2321
private val notificationClient: NotificationClient,
2422
private val dispatchers: CoroutineDispatchers,
2523
clock: SystemClock,
2624
) : NotificationService {
27-
private val notificationMapper: NotificationMapper = NotificationMapper(sessionId, clock)
25+
private val notificationMapper: NotificationMapper = NotificationMapper(clock)
2826

2927
override suspend fun getNotification(
30-
userId: SessionId,
3128
roomId: RoomId,
3229
eventId: EventId,
3330
): Result<NotificationData?> = withContext(dispatchers.io) {

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ import org.matrix.rustcomponents.sdk.StateEventContent
1919
import org.matrix.rustcomponents.sdk.TimelineEvent
2020
import org.matrix.rustcomponents.sdk.TimelineEventType
2121
import org.matrix.rustcomponents.sdk.use
22-
import javax.inject.Inject
2322

24-
class TimelineEventToNotificationContentMapper @Inject constructor() {
23+
class TimelineEventToNotificationContentMapper {
2524
fun map(timelineEvent: TimelineEvent): NotificationContent {
2625
return timelineEvent.use {
2726
timelineEvent.eventType().use { eventType ->
@@ -52,7 +51,10 @@ private fun StateEventContent.toContent(): NotificationContent.StateEvent {
5251
StateEventContent.RoomHistoryVisibility -> NotificationContent.StateEvent.RoomHistoryVisibility
5352
StateEventContent.RoomJoinRules -> NotificationContent.StateEvent.RoomJoinRules
5453
is StateEventContent.RoomMemberContent -> {
55-
NotificationContent.StateEvent.RoomMemberContent(userId, RoomMemberMapper.mapMembership(membershipState))
54+
NotificationContent.StateEvent.RoomMemberContent(
55+
userId = UserId(userId),
56+
membershipState = RoomMemberMapper.mapMembership(membershipState),
57+
)
5658
}
5759
StateEventContent.RoomName -> NotificationContent.StateEvent.RoomName
5860
StateEventContent.RoomPinnedEvents -> NotificationContent.StateEvent.RoomPinnedEvents

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSyncSubscriber.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ import kotlinx.coroutines.sync.Mutex
1515
import kotlinx.coroutines.sync.withLock
1616
import kotlinx.coroutines.withContext
1717
import org.matrix.rustcomponents.sdk.RequiredState
18-
import org.matrix.rustcomponents.sdk.RoomListServiceInterface
18+
import org.matrix.rustcomponents.sdk.RoomListService
1919
import org.matrix.rustcomponents.sdk.RoomSubscription
2020
import timber.log.Timber
2121

2222
private const val DEFAULT_TIMELINE_LIMIT = 20u
2323

2424
class RoomSyncSubscriber(
25-
private val roomListService: RoomListServiceInterface,
25+
private val roomListService: RoomListService,
2626
private val dispatchers: CoroutineDispatchers,
2727
) {
2828
private val subscribedRoomIds = mutableSetOf<RoomId>()

0 commit comments

Comments
 (0)