Skip to content

Commit fc55f8e

Browse files
authored
Merge pull request #3394 from DataDog/release/3.9.0
Merge `3.9.1` into `master`
2 parents d88a104 + f061d4f commit fc55f8e

18 files changed

Lines changed: 436 additions & 232 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# 3.9.1 / 2026-04-23
2+
3+
* [BUGFIX] Cache reflection lookups in `LayoutNodeUtils`. See [#3381](https://github.com/DataDog/dd-sdk-android/pull/3381)
4+
* [IMPROVEMENT] Add `fed2` endpoint to `DatadogSite`. See [#3391](https://github.com/DataDog/dd-sdk-android/pull/3391)
5+
16
# 3.9.0 / 2026-04-16
27

38
* [FEATURE] Track GraphQL errors. See [#3275](https://github.com/DataDog/dd-sdk-android/pull/3275)

buildSrc/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ object AndroidConfig {
1919
const val MIN_SDK_FOR_AUTO = 29
2020
const val BUILD_TOOLS_VERSION = "36.0.0"
2121

22-
val VERSION = Version(3, 9, 0, Version.Type.Release)
22+
val VERSION = Version(3, 9, 1, Version.Type.Release)
2323
}
2424

2525
// TODO RUM-628 Switch to Java 17 bytecode

dd-sdk-android-core/api/apiSurface

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ enum com.datadog.android.DatadogSite
2323
- AP1
2424
- AP2
2525
- US1_FED
26+
- US2_FED
2627
- STAGING
2728
val intakeEndpoint: String
2829
class com.datadog.android._InternalProxy

dd-sdk-android-core/api/dd-sdk-android-core.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public final class com/datadog/android/DatadogSite : java/lang/Enum {
6464
public static final field STAGING Lcom/datadog/android/DatadogSite;
6565
public static final field US1 Lcom/datadog/android/DatadogSite;
6666
public static final field US1_FED Lcom/datadog/android/DatadogSite;
67+
public static final field US2_FED Lcom/datadog/android/DatadogSite;
6768
public static final field US3 Lcom/datadog/android/DatadogSite;
6869
public static final field US5 Lcom/datadog/android/DatadogSite;
6970
public final fun getIntakeEndpoint ()Ljava/lang/String;

dd-sdk-android-core/src/main/kotlin/com/datadog/android/DatadogSite.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ enum class DatadogSite private constructor(internal val siteName: String, privat
5050
*/
5151
US1_FED("us1_fed", "browser-intake-ddog-gov.com"),
5252

53+
/**
54+
* The US2_FED site (FedRAMP compatible): [us2.ddog-gov.com](https://us2.ddog-gov.com).
55+
*/
56+
US2_FED("us2_fed", "browser-intake-us2-ddog-gov.com"),
57+
5358
/**
5459
* The STAGING site (internal usage only): [app.datad0g.com](https://app.datad0g.com).
5560
*/

dd-sdk-android-core/src/test/kotlin/com/datadog/android/DatadogSiteTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ internal class DatadogSiteTest {
4545
assertThat(DatadogSite.US1_FED.intakeEndpoint).isEqualTo("https://browser-intake-ddog-gov.com")
4646
}
4747

48+
@Test
49+
fun `M return intake endpoint W intakeEndpoint {US2-FED}`() {
50+
assertThat(DatadogSite.US2_FED.intakeEndpoint).isEqualTo("https://browser-intake-us2-ddog-gov.com")
51+
}
52+
4853
@Test
4954
fun `M return intake endpoint W intakeEndpoint {EU1}`() {
5055
assertThat(DatadogSite.EU1.intakeEndpoint).isEqualTo("https://browser-intake-datadoghq.eu")

detekt_custom_safe_calls.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,16 +954,19 @@ datadog:
954954
- "kotlin.collections.MutableMap.filterKeys(kotlin.Function1)"
955955
- "kotlin.collections.MutableMap.filterValues(kotlin.Function1)"
956956
- "kotlin.collections.MutableMap.forEach(kotlin.Function1)"
957+
- "kotlin.collections.MutableMap.get(java.lang.Class)"
957958
- "kotlin.collections.MutableMap.get(kotlin.String)"
958959
- "kotlin.collections.MutableMap.get(kotlin.String?)"
959960
- "kotlin.collections.MutableMap.getOrElse(java.lang.Class, kotlin.Function0)"
961+
- "kotlin.collections.MutableMap.getOrPut(java.lang.Class, kotlin.Function0)"
960962
- "kotlin.collections.MutableMap.getOrPut(kotlin.String, kotlin.Function0)"
961963
- "kotlin.collections.MutableMap.isEmpty()"
962964
- "kotlin.collections.MutableMap.isNotEmpty()"
963965
- "kotlin.collections.MutableMap.iterator()"
964966
- "kotlin.collections.MutableMap.orEmpty()"
965967
- "kotlin.collections.MutableMap.map(kotlin.Function1)"
966968
- "kotlin.collections.MutableMap.mapValues(kotlin.Function1)"
969+
- "kotlin.collections.MutableMap.put(java.lang.Class, kotlin.String?)"
967970
- "kotlin.collections.MutableMap.put(kotlin.Any?, kotlin.Any?)"
968971
- "kotlin.collections.MutableMap.put(kotlin.String, kotlin.Any)"
969972
- "kotlin.collections.MutableMap.put(kotlin.String, kotlin.Any?)"

features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/DatadogSiteExtensions.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ internal fun DatadogSite.getFlagsEndpoint(customerDomain: String): String? {
2525
* @return Flags host string in format `<customerDomain>.ff-cdn.<site>.<tld>`, or null if site not supported
2626
*/
2727
private fun DatadogSite.flagsHost(customerDomain: String): String? = when (this) {
28-
DatadogSite.US1_FED -> null
28+
DatadogSite.US1_FED,
29+
DatadogSite.US2_FED -> null
2930

3031
DatadogSite.STAGING -> "$customerDomain.ff-cdn.datad0g.com"
3132
DatadogSite.EU1 -> buildFlagsHostString(customerDomain, tld = "eu") // No site in the host, .eu TLD

features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/DatadogSiteExtensionsTest.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import com.datadog.android.DatadogSite
1010
import fr.xgouchet.elmyr.annotation.StringForgery
1111
import fr.xgouchet.elmyr.junit5.ForgeExtension
1212
import org.assertj.core.api.Assertions.assertThat
13-
import org.junit.jupiter.api.Test
1413
import org.junit.jupiter.api.extension.ExtendWith
1514
import org.junit.jupiter.params.ParameterizedTest
1615
import org.junit.jupiter.params.provider.Arguments
16+
import org.junit.jupiter.params.provider.EnumSource
1717
import org.junit.jupiter.params.provider.MethodSource
1818

1919
@ExtendWith(ForgeExtension::class)
@@ -56,10 +56,14 @@ internal class DatadogSiteExtensionsTest {
5656

5757
// region getFlagsEndpoint - Error Cases
5858

59-
@Test
60-
fun `M return null W getFlagsEndpoint() { unsupported site }`(@StringForgery customerDomain: String) {
59+
@ParameterizedTest
60+
@EnumSource(DatadogSite::class, names = ["US1_FED", "US2_FED"])
61+
fun `M return null W getFlagsEndpoint() { unsupported site }`(
62+
site: DatadogSite,
63+
@StringForgery customerDomain: String
64+
) {
6165
// When
62-
val result = DatadogSite.US1_FED.getFlagsEndpoint(customerDomain)
66+
val result = site.getFlagsEndpoint(customerDomain)
6367

6468
// Then
6569
assertThat(result).isNull()

features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/net/PrecomputedAssignmentsRequestFactoryTest.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import org.json.JSONObject
2424
import org.junit.jupiter.api.BeforeEach
2525
import org.junit.jupiter.api.Test
2626
import org.junit.jupiter.api.extension.ExtendWith
27+
import org.junit.jupiter.params.ParameterizedTest
28+
import org.junit.jupiter.params.provider.EnumSource
2729
import org.mockito.Mock
2830
import org.mockito.junit.jupiter.MockitoExtension
2931
import org.mockito.junit.jupiter.MockitoSettings
@@ -49,7 +51,10 @@ internal class PrecomputedAssignmentsRequestFactoryTest {
4951
@BeforeEach
5052
fun `set up`(forge: Forge) {
5153
fakeDatadogContext = fakeDatadogContext.copy(
52-
site = forge.aValueFrom(DatadogSite::class.java, exclude = listOf(DatadogSite.US1_FED)),
54+
site = forge.aValueFrom(
55+
DatadogSite::class.java,
56+
exclude = listOf(DatadogSite.US1_FED, DatadogSite.US2_FED)
57+
),
5358
featuresContext = fakeDatadogContext.featuresContext +
5459
mapOf(Feature.RUM_FEATURE_NAME to mapOf("application_id" to fakeRumApplicationId.toString()))
5560
)
@@ -252,8 +257,10 @@ internal class PrecomputedAssignmentsRequestFactoryTest {
252257

253258
// region create() - Error cases
254259

255-
@Test
260+
@ParameterizedTest
261+
@EnumSource(DatadogSite::class, names = ["US1_FED", "US2_FED"])
256262
fun `M return null W create() { unsupported site and no custom endpoint }`(
263+
site: DatadogSite,
257264
@StringForgery fakeTargetingKey: String
258265
) {
259266
// Given
@@ -262,7 +269,7 @@ internal class PrecomputedAssignmentsRequestFactoryTest {
262269
attributes = emptyMap()
263270
)
264271
fakeDatadogContext = fakeDatadogContext.copy(
265-
site = DatadogSite.US1_FED
272+
site = site
266273
)
267274

268275
// When

0 commit comments

Comments
 (0)