diff --git a/CHANGELOG.md b/CHANGELOG.md index 26502bf6b5..ee00c18583 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ }, }); ``` +- Add the `enableUserInteractionBreadcrumbs` option to turn off native user interaction breadcrumbs on Android ([#7016](https://github.com/getsentry/sentry-react-native/pull/7016)) ### Fixes diff --git a/packages/core/android/src/main/java/io/sentry/react/RNSentryStart.java b/packages/core/android/src/main/java/io/sentry/react/RNSentryStart.java index 2025268110..6bae09e290 100644 --- a/packages/core/android/src/main/java/io/sentry/react/RNSentryStart.java +++ b/packages/core/android/src/main/java/io/sentry/react/RNSentryStart.java @@ -212,6 +212,10 @@ static void getSentryAndroidOptions( options.setEnableAppComponentBreadcrumbs( rnOptions.getBoolean("enableAppComponentBreadcrumbs")); } + if (rnOptions.hasKey("enableUserInteractionBreadcrumbs")) { + options.setEnableUserInteractionBreadcrumbs( + rnOptions.getBoolean("enableUserInteractionBreadcrumbs")); + } if (rnOptions.hasKey("spotlight")) { if (rnOptions.getType("spotlight") == ReadableType.Boolean) { options.setEnableSpotlight(rnOptions.getBoolean("spotlight")); diff --git a/packages/core/android/src/test/java/io/sentry/react/RNSentryStartTest.java b/packages/core/android/src/test/java/io/sentry/react/RNSentryStartTest.java index 9853414399..86ea7e88ec 100644 --- a/packages/core/android/src/test/java/io/sentry/react/RNSentryStartTest.java +++ b/packages/core/android/src/test/java/io/sentry/react/RNSentryStartTest.java @@ -93,4 +93,11 @@ public void enableAppComponentBreadcrumbsForwarded() { assertBreadcrumbOffSwitchForwarded( "enableAppComponentBreadcrumbs", SentryAndroidOptions::isEnableAppComponentBreadcrumbs); } + + @Test + public void enableUserInteractionBreadcrumbsForwarded() { + assertBreadcrumbOffSwitchForwarded( + "enableUserInteractionBreadcrumbs", + SentryAndroidOptions::isEnableUserInteractionBreadcrumbs); + } } diff --git a/packages/core/etc/sentry-react-native.api.md b/packages/core/etc/sentry-react-native.api.md index 94a8b1df87..9e90bdfe9f 100644 --- a/packages/core/etc/sentry-react-native.api.md +++ b/packages/core/etc/sentry-react-native.api.md @@ -192,6 +192,7 @@ export interface BaseReactNativeOptions { enableTombstone?: boolean; // @internal enableTurboModuleTracking?: boolean; + enableUserInteractionBreadcrumbs?: boolean; enableUserInteractionTracing?: boolean; enableWatchdogTerminationTracking?: boolean; // Warning: (ae-forgotten-export) The symbol "SharedExperimentsSubset" needs to be exported by the entry point index.d.ts diff --git a/packages/core/src/js/options.ts b/packages/core/src/js/options.ts index 238336b3b7..a956a3bfd5 100644 --- a/packages/core/src/js/options.ts +++ b/packages/core/src/js/options.ts @@ -350,6 +350,23 @@ export interface BaseReactNativeOptions { */ enableAppComponentBreadcrumbs?: boolean; + /** + * When enabled, the native Android SDK records breadcrumbs for user interactions + * (taps, swipes and scrolls) by wrapping each activity's `Window.Callback`. + * + * When the app uses `Sentry.wrap`, which adds `TouchEventBoundary`, the JS SDK already + * records touch breadcrumbs, so the native breadcrumbs duplicate them. Without + * `Sentry.wrap`, the native breadcrumbs are the only user interaction breadcrumbs. + * + * Disable this to stop the native layer from wrapping the window callback and adding + * user interaction breadcrumbs. If native user interaction tracing is also disabled + * (the default), the native `UserInteractionIntegration` is not installed. + * + * @default true + * @platform android + */ + enableUserInteractionBreadcrumbs?: boolean; + /** * Use this feature to enable the Sentry MetricKit integration. * diff --git a/packages/core/test/wrapper.test.ts b/packages/core/test/wrapper.test.ts index 687c4979a5..24a0b60edf 100644 --- a/packages/core/test/wrapper.test.ts +++ b/packages/core/test/wrapper.test.ts @@ -266,6 +266,7 @@ describe('Tests Native Wrapper', () => { enableAppLifecycleBreadcrumbs: false, enableSystemEventBreadcrumbs: false, enableAppComponentBreadcrumbs: false, + enableUserInteractionBreadcrumbs: false, devServerUrl: undefined, defaultSidecarUrl: undefined, mobileReplayOptions: undefined, @@ -278,6 +279,7 @@ describe('Tests Native Wrapper', () => { expect(initParameter.enableAppLifecycleBreadcrumbs).toBe(false); expect(initParameter.enableSystemEventBreadcrumbs).toBe(false); expect(initParameter.enableAppComponentBreadcrumbs).toBe(false); + expect(initParameter.enableUserInteractionBreadcrumbs).toBe(false); }); test('forwards reportAccessibilityIdentifier to the Native SDK', async () => {