Skip to content

Commit ac7412c

Browse files
ganfraganfra
and
ganfra
authored
Feature/fga/matrix client versions (#1022)
* Extract a RustMatrixClientFactory * Use serverVersions api on client builder to speed up startup. * Clean up * Fix compilation of sample --------- Co-authored-by: ganfra <[email protected]>
1 parent f68b357 commit ac7412c

File tree

3 files changed

+100
-51
lines changed

3 files changed

+100
-51
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Copyright (c) 2023 New Vector Ltd
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.element.android.libraries.matrix.impl
18+
19+
import android.content.Context
20+
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
21+
import io.element.android.libraries.di.ApplicationContext
22+
import io.element.android.libraries.network.useragent.UserAgentProvider
23+
import io.element.android.libraries.sessionstorage.api.SessionData
24+
import io.element.android.libraries.sessionstorage.api.SessionStore
25+
import io.element.android.services.toolbox.api.systemclock.SystemClock
26+
import kotlinx.coroutines.CoroutineScope
27+
import kotlinx.coroutines.withContext
28+
import org.matrix.rustcomponents.sdk.ClientBuilder
29+
import org.matrix.rustcomponents.sdk.Session
30+
import org.matrix.rustcomponents.sdk.use
31+
import java.io.File
32+
import javax.inject.Inject
33+
34+
class RustMatrixClientFactory @Inject constructor(
35+
@ApplicationContext private val context: Context,
36+
private val baseDirectory: File,
37+
private val appCoroutineScope: CoroutineScope,
38+
private val coroutineDispatchers: CoroutineDispatchers,
39+
private val sessionStore: SessionStore,
40+
private val userAgentProvider: UserAgentProvider,
41+
private val clock: SystemClock,
42+
) {
43+
44+
suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) {
45+
val client = ClientBuilder()
46+
.basePath(baseDirectory.absolutePath)
47+
.homeserverUrl(sessionData.homeserverUrl)
48+
.username(sessionData.userId)
49+
.userAgent(userAgentProvider.provide())
50+
// FIXME Quick and dirty fix for stopping version requests on startup https://github.com/matrix-org/matrix-rust-sdk/pull/1376
51+
.serverVersions(listOf("v1.0", "v1.1", "v1.2", "v1.3", "v1.4", "v1.5"))
52+
.use { it.build() }
53+
54+
client.restoreSession(sessionData.toSession())
55+
56+
val syncService = client.syncService().finish()
57+
58+
RustMatrixClient(
59+
client = client,
60+
syncService = syncService,
61+
sessionStore = sessionStore,
62+
appCoroutineScope = appCoroutineScope,
63+
dispatchers = coroutineDispatchers,
64+
baseDirectory = baseDirectory,
65+
baseCacheDirectory = context.cacheDir,
66+
clock = clock,
67+
)
68+
}
69+
}
70+
71+
private fun SessionData.toSession() = Session(
72+
accessToken = accessToken,
73+
refreshToken = refreshToken,
74+
userId = userId,
75+
deviceId = deviceId,
76+
homeserverUrl = homeserverUrl,
77+
slidingSyncProxy = slidingSyncProxy,
78+
)

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

Lines changed: 7 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,27 @@
1616

1717
package io.element.android.libraries.matrix.impl.auth
1818

19-
import android.content.Context
19+
// TODO Oidc
20+
// import org.matrix.rustcomponents.sdk.OidcAuthenticationUrl
2021
import com.squareup.anvil.annotations.ContributesBinding
2122
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
2223
import io.element.android.libraries.core.extensions.mapFailure
2324
import io.element.android.libraries.di.AppScope
24-
import io.element.android.libraries.di.ApplicationContext
2525
import io.element.android.libraries.di.SingleIn
2626
import io.element.android.libraries.matrix.api.MatrixClient
2727
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
2828
import io.element.android.libraries.matrix.api.auth.MatrixHomeServerDetails
2929
import io.element.android.libraries.matrix.api.auth.OidcDetails
3030
import io.element.android.libraries.matrix.api.core.SessionId
31-
import io.element.android.libraries.matrix.impl.RustMatrixClient
31+
import io.element.android.libraries.matrix.impl.RustMatrixClientFactory
3232
import io.element.android.libraries.matrix.impl.exception.mapClientException
3333
import io.element.android.libraries.network.useragent.UserAgentProvider
3434
import io.element.android.libraries.sessionstorage.api.SessionData
3535
import io.element.android.libraries.sessionstorage.api.SessionStore
36-
import io.element.android.services.toolbox.api.systemclock.SystemClock
37-
import kotlinx.coroutines.CoroutineScope
3836
import kotlinx.coroutines.flow.Flow
3937
import kotlinx.coroutines.flow.MutableStateFlow
4038
import kotlinx.coroutines.flow.StateFlow
4139
import kotlinx.coroutines.withContext
42-
import org.matrix.rustcomponents.sdk.Client
43-
import org.matrix.rustcomponents.sdk.ClientBuilder
44-
// TODO Oidc
45-
// import org.matrix.rustcomponents.sdk.OidcAuthenticationUrl
4640
import org.matrix.rustcomponents.sdk.Session
4741
import org.matrix.rustcomponents.sdk.use
4842
import java.io.File
@@ -53,13 +47,11 @@ import org.matrix.rustcomponents.sdk.AuthenticationService as RustAuthentication
5347
@ContributesBinding(AppScope::class)
5448
@SingleIn(AppScope::class)
5549
class RustMatrixAuthenticationService @Inject constructor(
56-
@ApplicationContext private val context: Context,
57-
private val baseDirectory: File,
58-
private val appCoroutineScope: CoroutineScope,
50+
baseDirectory: File,
5951
private val coroutineDispatchers: CoroutineDispatchers,
6052
private val sessionStore: SessionStore,
61-
private val clock: SystemClock,
62-
private val userAgentProvider: UserAgentProvider,
53+
userAgentProvider: UserAgentProvider,
54+
private val rustMatrixClientFactory: RustMatrixClientFactory,
6355
) : MatrixAuthenticationService {
6456

6557
private val authService: RustAuthenticationService = RustAuthenticationService(
@@ -84,14 +76,7 @@ class RustMatrixAuthenticationService @Inject constructor(
8476
runCatching {
8577
val sessionData = sessionStore.getSession(sessionId.value)
8678
if (sessionData != null) {
87-
val client = ClientBuilder()
88-
.basePath(baseDirectory.absolutePath)
89-
.homeserverUrl(sessionData.homeserverUrl)
90-
.username(sessionData.userId)
91-
.userAgent(userAgentProvider.provide())
92-
.use { it.build() }
93-
client.restoreSession(sessionData.toSession())
94-
createMatrixClient(client)
79+
rustMatrixClientFactory.create(sessionData)
9580
} else {
9681
error("No session to restore with id $sessionId")
9782
}
@@ -181,30 +166,8 @@ class RustMatrixAuthenticationService @Inject constructor(
181166
*/
182167
}
183168

184-
private suspend fun createMatrixClient(client: Client): MatrixClient {
185-
val syncService = client.syncService().finish()
186-
return RustMatrixClient(
187-
client = client,
188-
syncService = syncService,
189-
sessionStore = sessionStore,
190-
appCoroutineScope = appCoroutineScope,
191-
dispatchers = coroutineDispatchers,
192-
baseDirectory = baseDirectory,
193-
baseCacheDirectory = context.cacheDir,
194-
clock = clock,
195-
)
196-
}
197169
}
198170

199-
private fun SessionData.toSession() = Session(
200-
accessToken = accessToken,
201-
refreshToken = refreshToken,
202-
userId = userId,
203-
deviceId = deviceId,
204-
homeserverUrl = homeserverUrl,
205-
slidingSyncProxy = slidingSyncProxy,
206-
)
207-
208171
private fun Session.toSessionData() = SessionData(
209172
userId = userId,
210173
deviceId = deviceId,

samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@ import androidx.compose.runtime.getValue
2626
import androidx.compose.ui.Modifier
2727
import androidx.compose.ui.platform.LocalContext
2828
import androidx.core.view.WindowCompat
29-
import io.element.android.libraries.theme.ElementTheme
3029
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
30+
import io.element.android.libraries.matrix.impl.RustMatrixClientFactory
3131
import io.element.android.libraries.matrix.impl.auth.RustMatrixAuthenticationService
3232
import io.element.android.libraries.network.useragent.SimpleUserAgentProvider
3333
import io.element.android.libraries.sessionstorage.impl.memory.InMemorySessionStore
34+
import io.element.android.libraries.theme.ElementTheme
3435
import io.element.android.services.toolbox.impl.systemclock.DefaultSystemClock
3536
import kotlinx.coroutines.runBlocking
3637
import java.io.File
@@ -39,15 +40,22 @@ class MainActivity : ComponentActivity() {
3940

4041
private val matrixAuthenticationService: MatrixAuthenticationService by lazy {
4142
val baseDirectory = File(applicationContext.filesDir, "sessions")
42-
43+
val userAgentProvider = SimpleUserAgentProvider("MinimalSample")
44+
val sessionStore = InMemorySessionStore()
4345
RustMatrixAuthenticationService(
44-
context = applicationContext,
4546
baseDirectory = baseDirectory,
46-
appCoroutineScope = Singleton.appScope,
4747
coroutineDispatchers = Singleton.coroutineDispatchers,
48-
sessionStore = InMemorySessionStore(),
49-
clock = DefaultSystemClock(),
50-
userAgentProvider = SimpleUserAgentProvider("MinimalSample")
48+
sessionStore = sessionStore,
49+
userAgentProvider = userAgentProvider,
50+
rustMatrixClientFactory = RustMatrixClientFactory(
51+
context = applicationContext,
52+
baseDirectory = baseDirectory,
53+
appCoroutineScope = Singleton.appScope,
54+
coroutineDispatchers = Singleton.coroutineDispatchers,
55+
sessionStore = sessionStore,
56+
userAgentProvider = userAgentProvider,
57+
clock = DefaultSystemClock()
58+
)
5159
)
5260
}
5361

0 commit comments

Comments
 (0)