From 00bc6d0863f7828cb15bbb926fb2181327b991d3 Mon Sep 17 00:00:00 2001 From: Marco Saia Date: Wed, 12 Aug 2026 13:02:51 +0200 Subject: [PATCH 1/5] fix: angle-bracket imports in RCTFabricWrapper for RN 0.87 support --- .../ios/Sources/RCTFabricWrapper.mm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/react-native-session-replay/ios/Sources/RCTFabricWrapper.mm b/packages/react-native-session-replay/ios/Sources/RCTFabricWrapper.mm index 31141ba9c..c3b8e3053 100644 --- a/packages/react-native-session-replay/ios/Sources/RCTFabricWrapper.mm +++ b/packages/react-native-session-replay/ios/Sources/RCTFabricWrapper.mm @@ -8,9 +8,15 @@ #if RCT_NEW_ARCH_ENABLED #import "RCTVersion.h" +#import "ParagraphProps.h" + +#if RCT_VERSION_MINOR >= 87 +#import +#import +#else #import "RCTParagraphComponentView.h" #import "RCTConversions.h" -#import "ParagraphProps.h" +#endif namespace rct = facebook::react; #endif From ec774a89970ddf30e12863f5bfc7a281edfa4f00 Mon Sep 17 00:00:00 2001 From: Marco Saia Date: Wed, 12 Aug 2026 14:44:00 +0200 Subject: [PATCH 2/5] fix: hardcode Android DD SDK version in internal-testing-tools --- packages/internal-testing-tools/android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/internal-testing-tools/android/build.gradle b/packages/internal-testing-tools/android/build.gradle index 4787fbaf6..7a10f232d 100644 --- a/packages/internal-testing-tools/android/build.gradle +++ b/packages/internal-testing-tools/android/build.gradle @@ -188,7 +188,7 @@ dependencies { } implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation project(path: ':datadog_mobile-react-native') - implementation "com.datadoghq:dd-sdk-android-core" + implementation "com.datadoghq:dd-sdk-android-core:3.12.1" implementation "com.google.code.gson:gson:2.11.0" testImplementation "org.junit.platform:junit-platform-launcher:1.6.2" From fb1bef60cd6a455fe66abc26d968be2abee87449 Mon Sep 17 00:00:00 2001 From: Marco Saia Date: Wed, 12 Aug 2026 16:41:14 +0200 Subject: [PATCH 3/5] fix: android 'Function invocation expected' error --- .../android/src/newarch/kotlin/com/datadog/reactnative/DdSdk.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/android/src/newarch/kotlin/com/datadog/reactnative/DdSdk.kt b/packages/core/android/src/newarch/kotlin/com/datadog/reactnative/DdSdk.kt index 421812545..544f10d73 100644 --- a/packages/core/android/src/newarch/kotlin/com/datadog/reactnative/DdSdk.kt +++ b/packages/core/android/src/newarch/kotlin/com/datadog/reactnative/DdSdk.kt @@ -201,7 +201,7 @@ class DdSdk( private fun registerLifecycleEvents(reactContext: ReactApplicationContext) { reactContext.addLifecycleEventListener(object : LifecycleEventListener { override fun onHostResume() { - val currentActivity: Activity? = currentActivity + val currentActivity: Activity? = reactContext.currentActivity if (currentActivity != null) { val intent = currentActivity.intent val extras = intent.extras From f5045667bbc7aefc79008c673d2c31d438247140 Mon Sep 17 00:00:00 2001 From: Marco Saia Date: Thu, 13 Aug 2026 15:52:30 +0200 Subject: [PATCH 4/5] fix: disable heatmaps on RN 0.65 for compatibility --- packages/core/android/build.gradle | 15 +++++++- .../reactnative/HeatmapViewResolverFactory.kt | 38 +++++++++++++++++++ .../reactnative/HeatmapViewResolverFactory.kt | 20 ++++++++++ .../kotlin/com/datadog/reactnative/DdFlags.kt | 0 .../kotlin/com/datadog/reactnative/DdLogs.kt | 0 .../kotlin/com/datadog/reactnative/DdRum.kt | 19 ++++------ .../kotlin/com/datadog/reactnative/DdSdk.kt | 0 .../kotlin/com/datadog/reactnative/DdTrace.kt | 0 8 files changed, 80 insertions(+), 12 deletions(-) create mode 100644 packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/HeatmapViewResolverFactory.kt create mode 100644 packages/core/android/src/oldarch65/kotlin/com/datadog/reactnative/HeatmapViewResolverFactory.kt rename packages/core/android/src/{oldarch => oldarchCommon}/kotlin/com/datadog/reactnative/DdFlags.kt (100%) rename packages/core/android/src/{oldarch => oldarchCommon}/kotlin/com/datadog/reactnative/DdLogs.kt (100%) rename packages/core/android/src/{oldarch => oldarchCommon}/kotlin/com/datadog/reactnative/DdRum.kt (95%) rename packages/core/android/src/{oldarch => oldarchCommon}/kotlin/com/datadog/reactnative/DdSdk.kt (100%) rename packages/core/android/src/{oldarch => oldarchCommon}/kotlin/com/datadog/reactnative/DdTrace.kt (100%) diff --git a/packages/core/android/build.gradle b/packages/core/android/build.gradle index 3680b7d12..46e6be6a8 100644 --- a/packages/core/android/build.gradle +++ b/packages/core/android/build.gradle @@ -138,7 +138,20 @@ android { if (isNewArchitectureEnabled()) { java.srcDirs += ['src/newarch/kotlin'] } else { - java.srcDirs += ['src/oldarch/kotlin'] + // `oldarchCommon` holds everything shared by all old-architecture RN versions. + // Version-specific pieces (currently just heatmap tap-to-view resolution, whose + // `UIManager.resolveView` API was added in RN 0.66) live in their own small source set, + // named `oldarch` for the highest old-arch minor version they cover (inclusive) — + // e.g. `oldarch65` for RN <= 65. The bare `oldarch` directory has no number because it + // always means "newer than the highest split defined" (today: RN > 65); if a future RN + // release breaks another old-arch API, split off the next `oldarch` the same way and + // `oldarch` keeps that same "later than the highest split" meaning. + java.srcDirs += ['src/oldarchCommon/kotlin'] + if (reactNativeMajorVersion == 0 && reactNativeMinorVersion <= 65) { + java.srcDirs += ['src/oldarch65/kotlin'] + } else { + java.srcDirs += ['src/oldarch/kotlin'] + } } } test { diff --git a/packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/HeatmapViewResolverFactory.kt b/packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/HeatmapViewResolverFactory.kt new file mode 100644 index 000000000..92d336b97 --- /dev/null +++ b/packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/HeatmapViewResolverFactory.kt @@ -0,0 +1,38 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2016-Present Datadog, Inc. + */ + +package com.datadog.reactnative + +import android.view.View +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.uimanager.UIManagerHelper +import com.facebook.react.uimanager.common.UIManagerType + +/** + * Resolves a React tag to its native [View] for heatmap tap tracking, via + * `UIManager.resolveView(reactTag)`. That method exists on the old-architecture `UIManager` + * interface from React Native 0.66 onward — see the `oldarch65` source set's counterpart of + * this function for RN <= 65, where it doesn't exist. + * + * This is the base `oldarch` source set, used whenever no more specific split applies: it + * covers every old-architecture RN version newer than the highest version-specific split + * defined (currently `oldarch65`). If a future RN release removes/changes another API this + * function (or another old-arch file) depends on, split off a new `oldarch` source set named + * for the highest old-arch minor version it covers — e.g. `oldarch70` for RN <= 70 — following + * this same pattern, and this directory keeps meaning "later than the highest split." + */ +internal fun createHeatmapViewResolver( + reactApplicationContext: ReactApplicationContext, + telemetry: DdTelemetry +): (Int) -> View? = { reactTag -> + try { + UIManagerHelper.getUIManager(reactApplicationContext, UIManagerType.DEFAULT) + ?.resolveView(reactTag) + } catch (e: Exception) { + telemetry.telemetryError("Failed to resolve view for heatmap tracking", e) + null + } +} diff --git a/packages/core/android/src/oldarch65/kotlin/com/datadog/reactnative/HeatmapViewResolverFactory.kt b/packages/core/android/src/oldarch65/kotlin/com/datadog/reactnative/HeatmapViewResolverFactory.kt new file mode 100644 index 000000000..1cfbe68c8 --- /dev/null +++ b/packages/core/android/src/oldarch65/kotlin/com/datadog/reactnative/HeatmapViewResolverFactory.kt @@ -0,0 +1,20 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2016-Present Datadog, Inc. + */ + +package com.datadog.reactnative + +import android.view.View +import com.facebook.react.bridge.ReactApplicationContext + +/** + * `UIManager.resolveView(reactTag)` was added in React Native 0.66; the old-architecture + * `UIManager` interface doesn't declare it on RN <= 65 (this source set), so a React tag can't + * be resolved to its native [View] for heatmap tap tracking here — this always returns null. + */ +internal fun createHeatmapViewResolver( + reactApplicationContext: ReactApplicationContext, + telemetry: DdTelemetry +): (Int) -> View? = { null } diff --git a/packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdFlags.kt b/packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdFlags.kt similarity index 100% rename from packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdFlags.kt rename to packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdFlags.kt diff --git a/packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdLogs.kt b/packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdLogs.kt similarity index 100% rename from packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdLogs.kt rename to packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdLogs.kt diff --git a/packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdRum.kt b/packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdRum.kt similarity index 95% rename from packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdRum.kt rename to packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdRum.kt index 1a2a7887b..79f7ad06a 100644 --- a/packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdRum.kt +++ b/packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdRum.kt @@ -13,8 +13,6 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.ReadableArray import com.facebook.react.bridge.ReadableMap -import com.facebook.react.uimanager.UIManagerHelper -import com.facebook.react.uimanager.common.UIManagerType /** * The entry point to use Datadog's RUM feature. @@ -27,18 +25,17 @@ class DdRum( private val telemetry = DdTelemetry() + // `createHeatmapViewResolver` is version-gated at the source-set level: it resolves a React + // tag to its native View via `UIManager.resolveView`, which only exists on the + // old-architecture `UIManager` interface from React Native 0.66 onward. See + // HeatmapViewResolverFactory.kt in the `oldarch` (RN > 65) and `oldarch65` (RN <= 65, no-op) + // source sets. private val implementation = DdRumImplementation( datadog = datadogWrapper, heatmapActionHandler = HeatmapActionHandler( - heatmapTouchResolver = HeatmapTouchResolver(viewResolver = { reactTag -> - try { - UIManagerHelper.getUIManager(reactApplicationContext, UIManagerType.DEFAULT) - ?.resolveView(reactTag) - } catch (e: Exception) { - telemetry.telemetryError("Failed to resolve view for heatmap tracking", e) - null - } - }) + heatmapTouchResolver = HeatmapTouchResolver( + viewResolver = createHeatmapViewResolver(reactApplicationContext, telemetry) + ) ) ) diff --git a/packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdSdk.kt b/packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdSdk.kt similarity index 100% rename from packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdSdk.kt rename to packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdSdk.kt diff --git a/packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdTrace.kt b/packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdTrace.kt similarity index 100% rename from packages/core/android/src/oldarch/kotlin/com/datadog/reactnative/DdTrace.kt rename to packages/core/android/src/oldarchCommon/kotlin/com/datadog/reactnative/DdTrace.kt From 6b3ccbfcc89834955e14fd4942e401a66cee2f9f Mon Sep 17 00:00:00 2001 From: Marco Saia Date: Thu, 13 Aug 2026 15:59:41 +0200 Subject: [PATCH 5/5] chore: add internal-testing-tools to bump-native-dd-sdk script --- bump-native-dd-sdk.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/bump-native-dd-sdk.sh b/bump-native-dd-sdk.sh index 67d99a0e7..fabaf9600 100755 --- a/bump-native-dd-sdk.sh +++ b/bump-native-dd-sdk.sh @@ -14,6 +14,7 @@ build_gradle_files=( "packages/core/android/build.gradle" "packages/react-native-session-replay/android/build.gradle" "packages/react-native-webview/android/build.gradle" + "packages/internal-testing-tools/android/build.gradle" "benchmarks/android/app/build.gradle" )