From 28a1003bed41e7471af14383b14b2f98040255b4 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 13 Oct 2025 22:27:10 +0200 Subject: [PATCH 1/5] fix(replay): Fix crash when root view has no window or is too small --- .../main/java/io/sentry/android/replay/ScreenshotRecorder.kt | 2 +- .../src/main/java/io/sentry/android/replay/WindowRecorder.kt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/ScreenshotRecorder.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/ScreenshotRecorder.kt index 2d866e6a6db..3bc995fad2d 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/ScreenshotRecorder.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/ScreenshotRecorder.kt @@ -289,7 +289,7 @@ public data class ScreenshotRecorderConfig( private fun Int.adjustToBlockSize(): Int { val remainder = this % 16 return if (remainder <= 8) { - this - remainder + maxOf(16, this - remainder) } else { this + (16 - remainder) } diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/WindowRecorder.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/WindowRecorder.kt index 5731c4e4f56..4023ab0f9e4 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/WindowRecorder.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/WindowRecorder.kt @@ -108,6 +108,10 @@ internal class WindowRecorder( } override fun onRootViewsChanged(root: View, added: Boolean) { + if (root.phoneWindow == null) { + options.logger.log(WARNING, "Root view does not have a phone window, skipping.") + return + } rootViewsLock.acquire().use { if (added) { rootViews.add(WeakReference(root)) From 6ed6982478f297a00598d2cbbfebeddb52ce8f8d Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 13 Oct 2025 22:33:03 +0200 Subject: [PATCH 2/5] Changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cb73a5552f..c9aeae67a48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ - Use logger from options for JVM profiler ([#4771](https://github.com/getsentry/sentry-java/pull/4771)) - Session Replay: Avoid deadlock when pausing replay if no connection ([#4788](https://github.com/getsentry/sentry-java/pull/4788)) +- Session Replay: Fix capturing roots with no windows ([#4805](https://github.com/getsentry/sentry-java/pull/4805)) +- Session Replay: Fix `java.lang.IllegalArgumentException: width and height must be > 0` ([#4805](https://github.com/getsentry/sentry-java/pull/4805)) ### Miscellaneous From 827d950b38ff68c17979e63767406e69f3fda2f0 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 13 Oct 2025 22:34:17 +0200 Subject: [PATCH 3/5] move the null check under if(added) --- .../main/java/io/sentry/android/replay/WindowRecorder.kt | 9 +++++---- sentry-samples/sentry-samples-android/build.gradle.kts | 2 ++ .../sentry-samples-android/src/main/AndroidManifest.xml | 6 +++--- .../java/io/sentry/samples/android/MyApplication.java | 5 +++++ settings.gradle.kts | 3 +++ 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/WindowRecorder.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/WindowRecorder.kt index 4023ab0f9e4..eec316e5c38 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/WindowRecorder.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/WindowRecorder.kt @@ -108,12 +108,13 @@ internal class WindowRecorder( } override fun onRootViewsChanged(root: View, added: Boolean) { - if (root.phoneWindow == null) { - options.logger.log(WARNING, "Root view does not have a phone window, skipping.") - return - } rootViewsLock.acquire().use { if (added) { + if (root.phoneWindow == null) { + options.logger.log(WARNING, "Root view does not have a phone window, skipping.") + return + } + rootViews.add(WeakReference(root)) capturer?.recorder?.bind(root) determineWindowSize(root) diff --git a/sentry-samples/sentry-samples-android/build.gradle.kts b/sentry-samples/sentry-samples-android/build.gradle.kts index 48ac6dda5ce..72ec93e2881 100644 --- a/sentry-samples/sentry-samples-android/build.gradle.kts +++ b/sentry-samples/sentry-samples-android/build.gradle.kts @@ -121,6 +121,8 @@ dependencies { kotlin(Config.kotlinStdLib, org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION) ) + //noinspection UseTomlInstead + implementation("com.smartlook.android:smartlook-analytics:2.3.2") implementation(projects.sentryAndroid) implementation(projects.sentryAndroidFragment) implementation(projects.sentryAndroidTimber) diff --git a/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml b/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml index c6360ca911d..34dbb1c8148 100644 --- a/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml +++ b/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml @@ -101,7 +101,7 @@ - + @@ -129,11 +129,11 @@ - + - + diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MyApplication.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MyApplication.java index 572c4cdba72..6dd4f20bbdf 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MyApplication.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MyApplication.java @@ -3,6 +3,7 @@ import android.app.Application; import android.os.StrictMode; import io.sentry.Sentry; +import io.sentry.android.core.SentryAndroid; /** Apps. main Application. */ public class MyApplication extends Application { @@ -13,8 +14,12 @@ public void onCreate() { strictMode(); super.onCreate(); + // Smartlook.getInstance().getPreferences().setProjectKey("528377853758d75ddf24c84b801366e4dc6bf2d1"); + // Smartlook.getInstance().getPreferences().setRenderingMode(RenderingMode.WIREFRAME); + // Smartlook.getInstance().start(); // Example how to initialize the SDK manually which allows access to SentryOptions callbacks. // Make sure you disable the auto init via manifest meta-data: io.sentry.auto-init=false + SentryAndroid.init(this); // SentryAndroid.init( // this, // options -> { diff --git a/settings.gradle.kts b/settings.gradle.kts index 26970de73c8..162de4bee20 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,6 +12,9 @@ dependencyResolutionManagement { google() mavenCentral() mavenLocal() + maven { + url = uri("https://sdk.smartlook.com/android/release") + } } } From e0dc6b224eae21c36f3942261ec74fd7af86ce25 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 13 Oct 2025 22:35:29 +0200 Subject: [PATCH 4/5] revert --- sentry-samples/sentry-samples-android/build.gradle.kts | 2 -- .../main/java/io/sentry/samples/android/MyApplication.java | 5 ----- settings.gradle.kts | 3 --- 3 files changed, 10 deletions(-) diff --git a/sentry-samples/sentry-samples-android/build.gradle.kts b/sentry-samples/sentry-samples-android/build.gradle.kts index 72ec93e2881..48ac6dda5ce 100644 --- a/sentry-samples/sentry-samples-android/build.gradle.kts +++ b/sentry-samples/sentry-samples-android/build.gradle.kts @@ -121,8 +121,6 @@ dependencies { kotlin(Config.kotlinStdLib, org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION) ) - //noinspection UseTomlInstead - implementation("com.smartlook.android:smartlook-analytics:2.3.2") implementation(projects.sentryAndroid) implementation(projects.sentryAndroidFragment) implementation(projects.sentryAndroidTimber) diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MyApplication.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MyApplication.java index 6dd4f20bbdf..572c4cdba72 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MyApplication.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MyApplication.java @@ -3,7 +3,6 @@ import android.app.Application; import android.os.StrictMode; import io.sentry.Sentry; -import io.sentry.android.core.SentryAndroid; /** Apps. main Application. */ public class MyApplication extends Application { @@ -14,12 +13,8 @@ public void onCreate() { strictMode(); super.onCreate(); - // Smartlook.getInstance().getPreferences().setProjectKey("528377853758d75ddf24c84b801366e4dc6bf2d1"); - // Smartlook.getInstance().getPreferences().setRenderingMode(RenderingMode.WIREFRAME); - // Smartlook.getInstance().start(); // Example how to initialize the SDK manually which allows access to SentryOptions callbacks. // Make sure you disable the auto init via manifest meta-data: io.sentry.auto-init=false - SentryAndroid.init(this); // SentryAndroid.init( // this, // options -> { diff --git a/settings.gradle.kts b/settings.gradle.kts index 162de4bee20..26970de73c8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,9 +12,6 @@ dependencyResolutionManagement { google() mavenCentral() mavenLocal() - maven { - url = uri("https://sdk.smartlook.com/android/release") - } } } From 57f34067ab6032aaa7649c269d4f485dc7911315 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Mon, 13 Oct 2025 22:36:23 +0200 Subject: [PATCH 5/5] revert --- .../sentry-samples-android/src/main/AndroidManifest.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml b/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml index 34dbb1c8148..c6360ca911d 100644 --- a/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml +++ b/sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml @@ -101,7 +101,7 @@ - + @@ -129,11 +129,11 @@ - + - +