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 96d8e4939d..51e71f3855 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 @@ -54,7 +54,11 @@ class RustMatrixClientFactory @Inject constructor( val client = getBaseClientBuilder( sessionPath = sessionData.sessionPath, passphrase = sessionData.passphrase, - useSimplifiedSlidingSync = appPreferencesStore.isSimplifiedSlidingSyncEnabledFlow().first(), + slidingSync = if (appPreferencesStore.isSimplifiedSlidingSyncEnabledFlow().first()) { + ClientBuilderSlidingSync.Simplified + } else { + ClientBuilderSlidingSync.Restored + }, ) .homeserverUrl(sessionData.homeserverUrl) .username(sessionData.userId) @@ -86,7 +90,7 @@ class RustMatrixClientFactory @Inject constructor( sessionPath: String, passphrase: String?, slidingSyncProxy: String? = null, - useSimplifiedSlidingSync: Boolean = false, + slidingSync: ClientBuilderSlidingSync, ): ClientBuilder { return ClientBuilder() .sessionPath(sessionPath) @@ -96,7 +100,13 @@ class RustMatrixClientFactory @Inject constructor( .addRootCertificates(userCertificatesProvider.provides()) .autoEnableBackups(true) .autoEnableCrossSigning(true) - .simplifiedSlidingSync(useSimplifiedSlidingSync) + .run { + when (slidingSync) { + ClientBuilderSlidingSync.Restored -> this + ClientBuilderSlidingSync.Discovered -> requiresSlidingSync() + ClientBuilderSlidingSync.Simplified -> simplifiedSlidingSync(true) + } + } .run { // Workaround for non-nullable proxy parameter in the SDK, since each call to the ClientBuilder returns a new reference we need to keep proxyProvider.provides()?.let { proxy(it) } ?: this @@ -104,6 +114,17 @@ class RustMatrixClientFactory @Inject constructor( } } +enum class ClientBuilderSlidingSync { + // The proxy will be supplied when restoring the Session. + Restored, + + // A proxy must be discovered whilst building the session. + Discovered, + + // Use Simplified Sliding Sync (discovery isn't a thing yet). + Simplified, +} + private fun SessionData.toSession() = Session( accessToken = accessToken, refreshToken = refreshToken, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt index 8c0546fa8b..e1ff0811e1 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt @@ -29,6 +29,7 @@ import io.element.android.libraries.matrix.api.auth.OidcDetails import io.element.android.libraries.matrix.api.auth.qrlogin.MatrixQrCodeLoginData import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.impl.ClientBuilderSlidingSync import io.element.android.libraries.matrix.impl.RustMatrixClientFactory import io.element.android.libraries.matrix.impl.auth.qrlogin.QrErrorMapper import io.element.android.libraries.matrix.impl.auth.qrlogin.SdkQrCodeLoginData @@ -210,6 +211,7 @@ class RustMatrixAuthenticationService @Inject constructor( sessionPath = sessionPath, passphrase = pendingPassphrase, slidingSyncProxy = AuthenticationConfig.SLIDING_SYNC_PROXY_URL, + slidingSync = ClientBuilderSlidingSync.Discovered, ) .buildWithQrCode( qrCodeData = (qrCodeData as SdkQrCodeLoginData).rustQrCodeData, @@ -251,8 +253,8 @@ class RustMatrixAuthenticationService @Inject constructor( sessionPath = sessionPath, passphrase = pendingPassphrase, slidingSyncProxy = AuthenticationConfig.SLIDING_SYNC_PROXY_URL, + slidingSync = ClientBuilderSlidingSync.Discovered, ) - .requiresSlidingSync() private fun clear() { currentClient?.close()