From b03211fc91ea4e11e91bedf7515cb890a88b3732 Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Thu, 10 Apr 2025 12:28:19 +1200 Subject: [PATCH 1/3] Reintroduced experimental support for Session Replay on Android --- .../Sentry.Samples.Android/MainActivity.cs | 6 ++++ samples/Sentry.Samples.Maui/MauiProgram.cs | 8 +++++ .../Sentry.Bindings.Android.csproj | 12 ++++++++ .../Android/BindableNativeSentryOptions.cs | 30 +++++++++++++++++++ src/Sentry/Platforms/Android/NativeOptions.cs | 19 +++++++++++- src/Sentry/Platforms/Android/SentrySdk.cs | 7 +++++ .../Android/BindableNativeOptionsTests.cs | 5 ++++ 7 files changed, 86 insertions(+), 1 deletion(-) diff --git a/samples/Sentry.Samples.Android/MainActivity.cs b/samples/Sentry.Samples.Android/MainActivity.cs index 7ec70a4f9b..e098254833 100644 --- a/samples/Sentry.Samples.Android/MainActivity.cs +++ b/samples/Sentry.Samples.Android/MainActivity.cs @@ -21,6 +21,12 @@ protected override void OnCreate(Bundle? savedInstanceState) // Enable Native Android SDK ANR detection options.Native.AnrEnabled = true; + // Currently experimental support is only available on Android + options.Native.ExperimentalOptions.SessionReplay.OnErrorSampleRate = 1.0; + options.Native.ExperimentalOptions.SessionReplay.SessionSampleRate = 1.0; + options.Native.ExperimentalOptions.SessionReplay.MaskAllImages = false; + options.Native.ExperimentalOptions.SessionReplay.MaskAllText = false; + options.SetBeforeSend(evt => { if (evt.Exception?.Message.Contains("Something you don't care want logged?") ?? false) diff --git a/samples/Sentry.Samples.Maui/MauiProgram.cs b/samples/Sentry.Samples.Maui/MauiProgram.cs index 028d98b90c..b3f6df76b0 100644 --- a/samples/Sentry.Samples.Maui/MauiProgram.cs +++ b/samples/Sentry.Samples.Maui/MauiProgram.cs @@ -25,6 +25,14 @@ public static MauiApp CreateMauiApp() options.Debug = true; options.SampleRate = 1.0F; +#if ANDROID + // Currently experimental support is only available on Android + options.Native.ExperimentalOptions.SessionReplay.OnErrorSampleRate = 1.0; + options.Native.ExperimentalOptions.SessionReplay.SessionSampleRate = 1.0; + options.Native.ExperimentalOptions.SessionReplay.MaskAllImages = false; + options.Native.ExperimentalOptions.SessionReplay.MaskAllText = false; +#endif + options.SetBeforeScreenshotCapture((@event, hint) => { Console.WriteLine("screenshot about to be captured."); diff --git a/src/Sentry.Bindings.Android/Sentry.Bindings.Android.csproj b/src/Sentry.Bindings.Android/Sentry.Bindings.Android.csproj index 5893bf65c8..d3cc4f44cc 100644 --- a/src/Sentry.Bindings.Android/Sentry.Bindings.Android.csproj +++ b/src/Sentry.Bindings.Android/Sentry.Bindings.Android.csproj @@ -38,6 +38,8 @@ + + + + + @@ -66,6 +71,7 @@ /> + @@ -89,6 +95,12 @@ Condition="!Exists('$(SentryAndroidSdkDirectory)sentry-android-ndk-$(SentryAndroidSdkVersion).aar') And $(TargetFramework.StartsWith('net8'))" Retries="3" /> + public bool EnableBeforeSend { get; set; } = false; - } + + public class NativeExperimentalOptions + { + public NativeSentryReplayOptions SessionReplay { get; set; } = new(); + } + + public class NativeSentryReplayOptions + { + public double? OnErrorSampleRate { get; set; } + public double? SessionSampleRate { get; set; } + public bool MaskAllImages { get; set; } = true; + public bool MaskAllText { get; set; } = true; + } + + /// + /// ExperimentalOptions + /// + public NativeExperimentalOptions ExperimentalOptions { get; set; } = new(); } } diff --git a/src/Sentry/Platforms/Android/SentrySdk.cs b/src/Sentry/Platforms/Android/SentrySdk.cs index f0db0a1fef..ed54760d68 100644 --- a/src/Sentry/Platforms/Android/SentrySdk.cs +++ b/src/Sentry/Platforms/Android/SentrySdk.cs @@ -135,6 +135,13 @@ private static void InitSentryAndroidSdk(SentryOptions options) options.Native.InAppExcludes?.ForEach(o.AddInAppExclude); options.Native.InAppIncludes?.ForEach(o.AddInAppInclude); + o.SessionReplay.OnErrorSampleRate = + (JavaDouble?)options.Native.ExperimentalOptions.SessionReplay.OnErrorSampleRate; + o.SessionReplay.SessionSampleRate = + (JavaDouble?)options.Native.ExperimentalOptions.SessionReplay.SessionSampleRate; + o.SessionReplay.SetMaskAllImages(options.Native.ExperimentalOptions.SessionReplay.MaskAllImages); + o.SessionReplay.SetMaskAllText(options.Native.ExperimentalOptions.SessionReplay.MaskAllText); + // These options are intentionally set and not exposed for modification o.EnableExternalConfiguration = false; o.EnableDeduplication = false; diff --git a/test/Sentry.Tests/Platforms/Android/BindableNativeOptionsTests.cs b/test/Sentry.Tests/Platforms/Android/BindableNativeOptionsTests.cs index c70a9cb565..136ac43629 100644 --- a/test/Sentry.Tests/Platforms/Android/BindableNativeOptionsTests.cs +++ b/test/Sentry.Tests/Platforms/Android/BindableNativeOptionsTests.cs @@ -5,6 +5,11 @@ namespace Sentry.Tests.Platforms.Android; public class BindableNativeOptionsTests : BindableTests { + public BindableNativeOptionsTests() + : base(nameof(BindableSentryOptions.NativeOptions.ExperimentalOptions)) + { + } + [Fact] public void BindableProperties_MatchOptionsProperties() { From 5029512b0bb8ba346d745162877e0962ac09d90b Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Thu, 10 Apr 2025 12:31:17 +1200 Subject: [PATCH 2/3] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc9459e6cd..7a5831fe73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +- Reintroduced experimental support for Session Replay on Android ([#4097](https://github.com/getsentry/sentry-dotnet/pull/4097)) + ## 5.5.1 ### Fixes From db29f00d4b2d5e69d1c71d48af3a4652ccd4b129 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Thu, 10 Apr 2025 00:44:27 +0000 Subject: [PATCH 3/3] Format code --- src/Sentry/Platforms/Android/NativeOptions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Sentry/Platforms/Android/NativeOptions.cs b/src/Sentry/Platforms/Android/NativeOptions.cs index d2c226aa57..f9faacc1eb 100644 --- a/src/Sentry/Platforms/Android/NativeOptions.cs +++ b/src/Sentry/Platforms/Android/NativeOptions.cs @@ -277,5 +277,6 @@ public class NativeSentryReplayOptions /// /// ExperimentalOptions /// - public NativeExperimentalOptions ExperimentalOptions { get; set; } = new(); } + public NativeExperimentalOptions ExperimentalOptions { get; set; } = new(); + } }