From c7a5ce152e80123b8c1fbce7c24b73b7ed42a74a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Fri, 28 Nov 2025 16:42:36 +0100 Subject: [PATCH] Fix providing the Sentry SDK DSN in Element Pro when no analytic modules are enabled --- .../io/element/android/x/di/AppBindings.kt | 4 +++ .../x/initializer/PlatformInitializer.kt | 3 +-- .../libraries/di/annotations/SentrySdkDsn.kt | 27 +++++++++++++++++++ .../analytics/noop/di/NoopAnalyticsModule.kt | 22 +++++++++++++++ .../sentry/di/SentryModule.kt | 23 ++++++++++++++++ 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 libraries/di/src/main/kotlin/io/element/android/libraries/di/annotations/SentrySdkDsn.kt create mode 100644 services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/di/NoopAnalyticsModule.kt create mode 100644 services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/di/SentryModule.kt diff --git a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt index 6e157f6ac1..f506e15688 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt @@ -17,6 +17,7 @@ import io.element.android.features.lockscreen.api.LockScreenService import io.element.android.features.rageshake.api.reporter.BugReporter import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher +import io.element.android.libraries.di.annotations.SentrySdkDsn import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.matrix.api.platform.InitPlatformService import io.element.android.libraries.matrix.api.tracing.TracingService @@ -48,4 +49,7 @@ interface AppBindings { fun featureFlagService(): FeatureFlagService fun buildMeta(): BuildMeta + + @SentrySdkDsn + fun sentrySdkDsn(): String? } diff --git a/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt b/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt index 757f5af9d3..206024d70b 100644 --- a/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt +++ b/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt @@ -15,7 +15,6 @@ import io.element.android.features.rageshake.api.logs.createWriteToFilesConfigur import io.element.android.libraries.architecture.bindings import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.tracing.TracingConfiguration -import io.element.android.services.analyticsproviders.sentry.SentryConfig import io.element.android.x.di.AppBindings import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking @@ -39,7 +38,7 @@ class PlatformInitializer : Initializer { logLevel = logLevel, extraTargets = listOf(ELEMENT_X_TARGET), traceLogPacks = runBlocking { preferencesStore.getTracingLogPacksFlow().first() }, - sdkSentryDsn = SentryConfig.SDK_DSN.takeIf { it.isNotBlank() }, + sdkSentryDsn = appBindings.sentrySdkDsn()?.takeIf { it.isNotBlank() }, ) bugReporter.setCurrentTracingLogLevel(logLevel.name) platformService.init(tracingConfiguration) diff --git a/libraries/di/src/main/kotlin/io/element/android/libraries/di/annotations/SentrySdkDsn.kt b/libraries/di/src/main/kotlin/io/element/android/libraries/di/annotations/SentrySdkDsn.kt new file mode 100644 index 0000000000..da3fd2945a --- /dev/null +++ b/libraries/di/src/main/kotlin/io/element/android/libraries/di/annotations/SentrySdkDsn.kt @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Element Creations 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.libraries.di.annotations + +import dev.zacsweers.metro.Qualifier + +/** + * Qualifies the Sentry SDK DSN in the DI graph. + */ +@Retention(AnnotationRetention.RUNTIME) +@MustBeDocumented +@Qualifier +@Target( + AnnotationTarget.CLASS, + AnnotationTarget.FIELD, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.TYPE, +) +annotation class SentrySdkDsn diff --git a/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/di/NoopAnalyticsModule.kt b/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/di/NoopAnalyticsModule.kt new file mode 100644 index 0000000000..f7d6646b8d --- /dev/null +++ b/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/di/NoopAnalyticsModule.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2025 Element Creations 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.noop.di + +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.ContributesTo +import dev.zacsweers.metro.Provides +import io.element.android.libraries.di.annotations.SentrySdkDsn + +@BindingContainer +@ContributesTo(AppScope::class) +object NoopAnalyticsModule { + @SentrySdkDsn + @Provides + fun provideSentrySdkDsn(): String? = null +} diff --git a/services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/di/SentryModule.kt b/services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/di/SentryModule.kt new file mode 100644 index 0000000000..5ddfce4ce7 --- /dev/null +++ b/services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/di/SentryModule.kt @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2025 Element Creations 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.analyticsproviders.sentry.di + +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.ContributesTo +import dev.zacsweers.metro.Provides +import io.element.android.libraries.di.annotations.SentrySdkDsn +import io.element.android.services.analyticsproviders.sentry.SentryConfig + +@BindingContainer +@ContributesTo(AppScope::class) +object SentryModule { + @Provides + @SentrySdkDsn + fun provideSentrySdkDsn(): String? = SentryConfig.SDK_DSN +}