From 721becf45dc6ff398bf0aa768d408098c6fbee6e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 17:07:44 +0100 Subject: [PATCH] fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.3.24 (#4394) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.3.24 * Fix SDK changes related to: - OIDC authentication. - Element Call widget URL generation. - Forced trace logging in the SDK. --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jorge Martín --- gradle/libs.versions.toml | 2 +- .../api/widget/CallWidgetSettingsProvider.kt | 2 +- libraries/matrix/impl/build.gradle.kts | 2 ++ .../libraries/matrix/impl/RustMatrixClient.kt | 6 +++- .../auth/RustMatrixAuthenticationService.kt | 10 ++++-- .../matrix/impl/sync/RustSyncService.kt | 1 + .../matrix/impl/tracing/RustTracingService.kt | 2 ++ .../DefaultCallWidgetSettingsProvider.kt | 32 +++++++++++++++---- .../widget/FakeCallWidgetSettingsProvider.kt | 2 +- .../analytics/api/store/AnalyticsStore.kt | 26 +++++++++++++++ .../analytics/impl/DefaultAnalyticsService.kt | 2 +- ...yticsStore.kt => DefaultAnalyticsStore.kt} | 17 +--------- .../impl/DefaultAnalyticsServiceTest.kt | 2 +- .../impl/store/FakeAnalyticsStore.kt | 1 + 14 files changed, 76 insertions(+), 31 deletions(-) create mode 100644 services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/store/AnalyticsStore.kt rename services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/{AnalyticsStore.kt => DefaultAnalyticsStore.kt} (85%) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a6aca9b7ec..8f77a385b3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -174,7 +174,7 @@ jsoup = "org.jsoup:jsoup:1.19.1" appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = "app.cash.molecule:molecule-runtime:2.0.0" timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.3.20" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.3.24" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/widget/CallWidgetSettingsProvider.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/widget/CallWidgetSettingsProvider.kt index e5bdeb9a8e..c87316a1dc 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/widget/CallWidgetSettingsProvider.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/widget/CallWidgetSettingsProvider.kt @@ -10,7 +10,7 @@ package io.element.android.libraries.matrix.api.widget import java.util.UUID interface CallWidgetSettingsProvider { - fun provide( + suspend fun provide( baseUrl: String, widgetId: String = UUID.randomUUID().toString(), encrypted: Boolean, diff --git a/libraries/matrix/impl/build.gradle.kts b/libraries/matrix/impl/build.gradle.kts index 790d23ec07..e0f2d6394b 100644 --- a/libraries/matrix/impl/build.gradle.kts +++ b/libraries/matrix/impl/build.gradle.kts @@ -33,6 +33,8 @@ dependencies { implementation(projects.libraries.network) implementation(projects.libraries.preferences.api) implementation(projects.services.analytics.api) + implementation(projects.services.analyticsproviders.posthog) + implementation(projects.services.analyticsproviders.sentry) implementation(projects.services.toolbox.api) api(projects.libraries.matrix.api) implementation(libs.dagger) 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 c2b20e1786..6a69511fd3 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 @@ -477,11 +477,16 @@ class RustMatrixClient( override fun roomDirectoryService(): RoomDirectoryService = roomDirectoryService override fun close() { + innerNotificationClient.close() + appCoroutineScope.launch { roomFactory.destroy() rustSyncService.destroy() notificationSettingsService.destroy() + // This is sync, but it can destroy the `Client` instance and block stopping the sync service + notificationProcessSetup.destroy() } + sessionCoroutineScope.cancel() clientDelegateTaskHandle?.cancelAndDestroy() verificationService.destroy() @@ -489,7 +494,6 @@ class RustMatrixClient( sessionDelegate.clearCurrentClient() innerRoomListService.close() notificationService.close() - notificationProcessSetup.destroy() encryptionService.close() innerClient.close() } 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 208f684fa1..94f77b2dd2 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 @@ -205,7 +205,9 @@ class RustMatrixAuthenticationService @Inject constructor( override suspend fun cancelOidcLogin(): Result { return withContext(coroutineDispatchers.io) { runCatching { - pendingOAuthAuthorizationData?.close() + pendingOAuthAuthorizationData?.use { + currentClient?.abortOidcAuth(it) + } pendingOAuthAuthorizationData = null }.mapFailure { failure -> failure.mapAuthenticationException() @@ -221,16 +223,18 @@ class RustMatrixAuthenticationService @Inject constructor( runCatching { val client = currentClient ?: error("You need to call `setHomeserver()` first") val currentSessionPaths = sessionPaths ?: error("You need to call `setHomeserver()` first") - val urlForOidcLogin = pendingOAuthAuthorizationData ?: error("You need to call `getOidcUrl()` first") - client.loginWithOidcCallback(urlForOidcLogin, callbackUrl) + client.loginWithOidcCallback(callbackUrl) val sessionData = client.session().toSessionData( isTokenValid = true, loginType = LoginType.OIDC, passphrase = pendingPassphrase, sessionPaths = currentSessionPaths, ) + + // Free the pending data since we won't use it to abort the flow anymore pendingOAuthAuthorizationData?.close() pendingOAuthAuthorizationData = null + newMatrixClientObserver?.invoke(rustMatrixClientFactory.create(client)) sessionStore.storeData(sessionData) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt index dffe6f1b71..3318e1384f 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt @@ -62,6 +62,7 @@ class RustSyncService( stopSync() Timber.d("Destroying sync service") isServiceReady.set(false) + inner.destroy() } override val syncState: StateFlow = diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt index 0638e49974..60ee29dc57 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt @@ -51,5 +51,7 @@ fun TracingConfiguration.map(): org.matrix.rustcomponents.sdk.TracingConfigurati writeToStdoutOrSystem = writesToLogcat, logLevel = logLevel.toRustLogLevel(), extraTargets = extraTargets, + // WARNING: this should be used only to debug issues, changes to this value should *never* be published + traceLogPacks = emptyList(), writeToFiles = writesToFilesConfiguration.toTracingFileConfiguration(), ) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt index 0b7b5f7a6b..437fa4900c 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt @@ -8,30 +8,50 @@ package io.element.android.libraries.matrix.impl.widget import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.appconfig.RageshakeConfig +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.di.AppScope import io.element.android.libraries.matrix.api.widget.CallWidgetSettingsProvider import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings +import io.element.android.services.analytics.api.store.AnalyticsStore +import io.element.android.services.analyticsproviders.posthog.PosthogEndpointConfigProvider +import io.element.android.services.analyticsproviders.sentry.SentryConfig +import kotlinx.coroutines.flow.first import org.matrix.rustcomponents.sdk.EncryptionSystem import org.matrix.rustcomponents.sdk.VirtualElementCallWidgetOptions import org.matrix.rustcomponents.sdk.newVirtualElementCallWidget import javax.inject.Inject +import org.matrix.rustcomponents.sdk.Intent as CallIntent @ContributesBinding(AppScope::class) -class DefaultCallWidgetSettingsProvider @Inject constructor() : CallWidgetSettingsProvider { - override fun provide(baseUrl: String, widgetId: String, encrypted: Boolean): MatrixWidgetSettings { +class DefaultCallWidgetSettingsProvider @Inject constructor( + private val buildMeta: BuildMeta, + private val posthogEndpointConfigProvider: PosthogEndpointConfigProvider, + private val analyticsStore: AnalyticsStore, +) : CallWidgetSettingsProvider { + override suspend fun provide(baseUrl: String, widgetId: String, encrypted: Boolean): MatrixWidgetSettings { + val analyticsEnabled = analyticsStore.userConsentFlow.first() + val posthogEndpointConfig = posthogEndpointConfigProvider.provide() val options = VirtualElementCallWidgetOptions( elementCallUrl = baseUrl, widgetId = widgetId, - parentUrl = null, - hideHeader = null, preload = null, fontScale = null, appPrompt = false, - skipLobby = true, confineToRoom = true, font = null, - analyticsId = null, encryption = if (encrypted) EncryptionSystem.PerParticipantKeys else EncryptionSystem.Unencrypted, + intent = CallIntent.START_CALL, + hideScreensharing = false, + posthogUserId = null, + posthogApiHost = posthogEndpointConfig.host.takeIf { analyticsEnabled }, + posthogApiKey = posthogEndpointConfig.apiKey.takeIf { analyticsEnabled }, + rageshakeSubmitUrl = RageshakeConfig.BUG_REPORT_URL, + sentryDsn = SentryConfig.DSN.takeIf { analyticsEnabled }, + sentryEnvironment = if (buildMeta.buildType == BuildType.RELEASE) SentryConfig.ENV_RELEASE else SentryConfig.ENV_DEBUG, + parentUrl = null, + hideHeader = true, ) val rustWidgetSettings = newVirtualElementCallWidget(options) return MatrixWidgetSettings.fromRustWidgetSettings(rustWidgetSettings) diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/widget/FakeCallWidgetSettingsProvider.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/widget/FakeCallWidgetSettingsProvider.kt index 392d4454e5..1b1c65abe3 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/widget/FakeCallWidgetSettingsProvider.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/widget/FakeCallWidgetSettingsProvider.kt @@ -15,7 +15,7 @@ class FakeCallWidgetSettingsProvider( ) : CallWidgetSettingsProvider { val providedBaseUrls = mutableListOf() - override fun provide(baseUrl: String, widgetId: String, encrypted: Boolean): MatrixWidgetSettings { + override suspend fun provide(baseUrl: String, widgetId: String, encrypted: Boolean): MatrixWidgetSettings { providedBaseUrls += baseUrl return provideFn(baseUrl, widgetId) } diff --git a/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/store/AnalyticsStore.kt b/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/store/AnalyticsStore.kt new file mode 100644 index 0000000000..aa26896b47 --- /dev/null +++ b/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/store/AnalyticsStore.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.services.analytics.api.store + +import kotlinx.coroutines.flow.Flow + +/** + * Local storage for: + * - user consent (Boolean); + * - did ask user consent (Boolean); + * - analytics Id (String). + */ +interface AnalyticsStore { + val userConsentFlow: Flow + val didAskUserConsentFlow: Flow + val analyticsIdFlow: Flow + suspend fun setUserConsent(newUserConsent: Boolean) + suspend fun setDidAskUserConsent(newValue: Boolean = true) + suspend fun setAnalyticsId(newAnalyticsId: String) + suspend fun reset() +} diff --git a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt index 6dafd7f334..875d9a913c 100644 --- a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt +++ b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt @@ -17,8 +17,8 @@ import io.element.android.libraries.di.SingleIn import io.element.android.libraries.sessionstorage.api.observer.SessionListener import io.element.android.libraries.sessionstorage.api.observer.SessionObserver import io.element.android.services.analytics.api.AnalyticsService +import io.element.android.services.analytics.api.store.AnalyticsStore import io.element.android.services.analytics.impl.log.analyticsTag -import io.element.android.services.analytics.impl.store.AnalyticsStore import io.element.android.services.analyticsproviders.api.AnalyticsProvider import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow diff --git a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/AnalyticsStore.kt b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/DefaultAnalyticsStore.kt similarity index 85% rename from services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/AnalyticsStore.kt rename to services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/DefaultAnalyticsStore.kt index 7c7109e482..c7f130d9ac 100644 --- a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/AnalyticsStore.kt +++ b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/DefaultAnalyticsStore.kt @@ -18,6 +18,7 @@ import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext +import io.element.android.services.analytics.api.store.AnalyticsStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map @@ -28,22 +29,6 @@ import javax.inject.Inject */ private val Context.dataStore: DataStore by preferencesDataStore(name = "vector_analytics") -/** - * Local storage for: - * - user consent (Boolean); - * - did ask user consent (Boolean); - * - analytics Id (String). - */ -interface AnalyticsStore { - val userConsentFlow: Flow - val didAskUserConsentFlow: Flow - val analyticsIdFlow: Flow - suspend fun setUserConsent(newUserConsent: Boolean) - suspend fun setDidAskUserConsent(newValue: Boolean = true) - suspend fun setAnalyticsId(newAnalyticsId: String) - suspend fun reset() -} - @ContributesBinding(AppScope::class) class DefaultAnalyticsStore @Inject constructor( @ApplicationContext private val context: Context diff --git a/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt b/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt index 1b00b238eb..e5ea06dbd7 100644 --- a/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt +++ b/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt @@ -18,7 +18,7 @@ import im.vector.app.features.analytics.plan.SuperProperties import im.vector.app.features.analytics.plan.UserProperties import io.element.android.libraries.sessionstorage.api.observer.SessionObserver import io.element.android.libraries.sessionstorage.test.observer.NoOpSessionObserver -import io.element.android.services.analytics.impl.store.AnalyticsStore +import io.element.android.services.analytics.api.store.AnalyticsStore import io.element.android.services.analytics.impl.store.FakeAnalyticsStore import io.element.android.services.analyticsproviders.api.AnalyticsProvider import io.element.android.services.analyticsproviders.test.FakeAnalyticsProvider diff --git a/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/store/FakeAnalyticsStore.kt b/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/store/FakeAnalyticsStore.kt index 68e0c0691a..d3d4379c6c 100644 --- a/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/store/FakeAnalyticsStore.kt +++ b/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/store/FakeAnalyticsStore.kt @@ -7,6 +7,7 @@ package io.element.android.services.analytics.impl.store +import io.element.android.services.analytics.api.store.AnalyticsStore import io.element.android.tests.testutils.lambda.lambdaError import kotlinx.coroutines.flow.MutableStateFlow