From c6cf6df60bc5c0ce2d1c9c3821603a28cd33d0bd Mon Sep 17 00:00:00 2001 From: Ryan Karn Date: Tue, 14 Apr 2026 11:26:09 -0700 Subject: [PATCH 1/2] fix: prevent overflow crash on older android versions --- .../rnsandbox/SandboxReactNativeDelegate.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/react-native-sandbox/android/src/main/java/io/callstack/rnsandbox/SandboxReactNativeDelegate.kt b/packages/react-native-sandbox/android/src/main/java/io/callstack/rnsandbox/SandboxReactNativeDelegate.kt index c008e5d..81c5ccd 100644 --- a/packages/react-native-sandbox/android/src/main/java/io/callstack/rnsandbox/SandboxReactNativeDelegate.kt +++ b/packages/react-native-sandbox/android/src/main/java/io/callstack/rnsandbox/SandboxReactNativeDelegate.kt @@ -382,6 +382,21 @@ class SandboxReactNativeDelegate( override fun getFilesDir(): java.io.File = sandboxFilesDir override fun getApplicationContext(): Context = this + + /** + * On Android 12 and below, Context.registerComponentCallbacks() delegates to + * getApplicationContext().registerComponentCallbacks(). Since getApplicationContext() + * returns `this` in SandboxContextWrapper, that causes infinite recursion and a + * StackOverflowError. Android 13+ fixed this in ContextWrapper by delegating to mBase + * directly. We mirror that fix here to support older platforms. + * / + override fun registerComponentCallbacks(callback: android.content.ComponentCallbacks) { + baseContext.applicationContext.registerComponentCallbacks(callback) + } + + override fun unregisterComponentCallbacks(callback: android.content.ComponentCallbacks) { + baseContext.applicationContext.unregisterComponentCallbacks(callback) + } } private class FilteredReactPackage( From fc5f1cf12cc9cfcd77194ce91f97b8ae4f0237cd Mon Sep 17 00:00:00 2001 From: Ryan Karn Date: Tue, 14 Apr 2026 21:15:58 -0700 Subject: [PATCH 2/2] chore: missed space in comment form prev commit --- .../java/io/callstack/rnsandbox/SandboxReactNativeDelegate.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-sandbox/android/src/main/java/io/callstack/rnsandbox/SandboxReactNativeDelegate.kt b/packages/react-native-sandbox/android/src/main/java/io/callstack/rnsandbox/SandboxReactNativeDelegate.kt index 81c5ccd..1aea3fe 100644 --- a/packages/react-native-sandbox/android/src/main/java/io/callstack/rnsandbox/SandboxReactNativeDelegate.kt +++ b/packages/react-native-sandbox/android/src/main/java/io/callstack/rnsandbox/SandboxReactNativeDelegate.kt @@ -389,7 +389,7 @@ class SandboxReactNativeDelegate( * returns `this` in SandboxContextWrapper, that causes infinite recursion and a * StackOverflowError. Android 13+ fixed this in ContextWrapper by delegating to mBase * directly. We mirror that fix here to support older platforms. - * / + */ override fun registerComponentCallbacks(callback: android.content.ComponentCallbacks) { baseContext.applicationContext.registerComponentCallbacks(callback) }