diff --git a/CHANGELOG.md b/CHANGELOG.md index 01f269da5b..a7aaeec99f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Features + +- Add a `isEnableSystemEventBreadcrumbsExtras` option to disable reporting system events extras for breadcrumbs ([#4625](https://github.com/getsentry/sentry-java/pull/4625)) + ### Improvements - Session Replay: Use main thread looper to schedule replay capture ([#4542](https://github.com/getsentry/sentry-java/pull/4542)) diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index f3adbd6ee8..5b41648657 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -336,6 +336,7 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr public fun isEnableRootCheck ()Z public fun isEnableScopeSync ()Z public fun isEnableSystemEventBreadcrumbs ()Z + public fun isEnableSystemEventBreadcrumbsExtras ()Z public fun isReportHistoricalAnrs ()Z public fun setAnrEnabled (Z)V public fun setAnrReportInDebug (Z)V @@ -360,6 +361,7 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr public fun setEnableRootCheck (Z)V public fun setEnableScopeSync (Z)V public fun setEnableSystemEventBreadcrumbs (Z)V + public fun setEnableSystemEventBreadcrumbsExtras (Z)V public fun setFrameMetricsCollector (Lio/sentry/android/core/internal/util/SentryFrameMetricsCollector;)V public fun setNativeHandlerStrategy (Lio/sentry/android/core/NdkHandlerStrategy;)V public fun setNativeSdkName (Ljava/lang/String;)V diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java index 69ddfe4b0a..221495172e 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java @@ -177,6 +177,9 @@ public final class SentryAndroidOptions extends SentryOptions { */ private boolean enableAutoTraceIdGeneration = true; + /** Enable or disable intent extras reporting for system event breadcrumbs. Default is false. */ + private boolean enableSystemEventBreadcrumbsExtras = false; + public interface BeforeCaptureCallback { /** @@ -614,6 +617,15 @@ public void setEnableAutoTraceIdGeneration(final boolean enableAutoTraceIdGenera this.enableAutoTraceIdGeneration = enableAutoTraceIdGeneration; } + public boolean isEnableSystemEventBreadcrumbsExtras() { + return enableSystemEventBreadcrumbsExtras; + } + + public void setEnableSystemEventBreadcrumbsExtras( + final boolean enableSystemEventBreadcrumbsExtras) { + this.enableSystemEventBreadcrumbsExtras = enableSystemEventBreadcrumbsExtras; + } + static class AndroidUserFeedbackIDialogHandler implements SentryFeedbackOptions.IDialogHandler { @Override public void showDialog( diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java b/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java index 91099d0125..561f507c5a 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java @@ -370,7 +370,7 @@ String getStringAfterDotFast(final @Nullable String str) { if (batteryState.charging != null) { breadcrumb.setData("charging", batteryState.charging); } - } else { + } else if (options.isEnableSystemEventBreadcrumbsExtras()) { final Bundle extras = intent.getExtras(); if (extras != null && !extras.isEmpty()) { final Map newExtras = new HashMap<>(extras.size()); diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidOptionsTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidOptionsTest.kt index 6326018209..8cb79b0bb5 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidOptionsTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidOptionsTest.kt @@ -181,6 +181,20 @@ class SentryAndroidOptionsTest { ) } + @Test + fun `system event breadcrumbs extras disabled by default`() { + val sentryOptions = SentryAndroidOptions() + + assertFalse(sentryOptions.isEnableSystemEventBreadcrumbsExtras) + } + + @Test + fun `system event breadcrumbs extras can be enabled`() { + val sentryOptions = SentryAndroidOptions() + sentryOptions.isEnableSystemEventBreadcrumbsExtras = true + assertTrue(sentryOptions.isEnableSystemEventBreadcrumbsExtras) + } + private class CustomDebugImagesLoader : IDebugImagesLoader { override fun loadDebugImages(): List? = null diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegrationTest.kt index 65eb3cb46f..b2749e3940 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegrationTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegrationTest.kt @@ -51,11 +51,13 @@ class SystemEventsBreadcrumbsIntegrationTest { fun getSut( enableSystemEventBreadcrumbs: Boolean = true, + enableSystemEventBreadcrumbsExtras: Boolean = false, executorService: ISentryExecutorService = ImmediateExecutorService(), ): SystemEventsBreadcrumbsIntegration { options = SentryAndroidOptions().apply { isEnableSystemEventBreadcrumbs = enableSystemEventBreadcrumbs + isEnableSystemEventBreadcrumbsExtras = enableSystemEventBreadcrumbsExtras this.executorService = executorService } return SystemEventsBreadcrumbsIntegration( @@ -528,4 +530,59 @@ class SystemEventsBreadcrumbsIntegrationTest { assertNull(sut.receiver) } + + @Test + fun `system event breadcrumbs include extras when enableSystemEventBreadcrumbsExtras is true`() { + val sut = fixture.getSut(enableSystemEventBreadcrumbsExtras = true) + + sut.register(fixture.scopes, fixture.options) + val intent = + Intent().apply { + action = Intent.ACTION_TIME_CHANGED + putExtra("test", 10) + putExtra("test2", 20) + } + sut.receiver!!.onReceive(fixture.context, intent) + + verify(fixture.scopes) + .addBreadcrumb( + check { + assertEquals("device.event", it.category) + assertEquals("system", it.type) + assertEquals(SentryLevel.INFO, it.level) + assertEquals("TIME_SET", it.data["action"]) + assertNotNull(it.data["extras"]) + val extras = it.data["extras"] as Map + assertEquals("10", extras["test"]) + assertEquals("20", extras["test2"]) + }, + anyOrNull(), + ) + } + + @Test + fun `system event breadcrumbs do not include extras when enableSystemEventBreadcrumbsExtras is false`() { + val sut = fixture.getSut(enableSystemEventBreadcrumbsExtras = false) + + sut.register(fixture.scopes, fixture.options) + val intent = + Intent().apply { + action = Intent.ACTION_TIME_CHANGED + putExtra("test", 10) + putExtra("test2", 20) + } + sut.receiver!!.onReceive(fixture.context, intent) + + verify(fixture.scopes) + .addBreadcrumb( + check { + assertEquals("device.event", it.category) + assertEquals("system", it.type) + assertEquals(SentryLevel.INFO, it.level) + assertEquals("TIME_SET", it.data["action"]) + assertNull(it.data["extras"]) + }, + anyOrNull(), + ) + } }