From 049317c902b4651f3afe97173e3fc3bd43cb9530 Mon Sep 17 00:00:00 2001 From: Fiona Date: Fri, 23 Jan 2026 17:26:55 +0800 Subject: [PATCH 1/6] feat: change group id --- .gitignore | 3 ++ MIGRATION.MD | 30 +++++++++---------- .../com/datadog/gradle/config/MavenConfig.kt | 22 +++++++------- ci/pipelines/default-pipeline.yml | 2 +- dd-sdk-android-core/README.md | 2 +- docs/advanced_troubleshooting.md | 2 +- .../README.md | 6 ++-- features/dd-sdk-android-flags/README.md | 4 +-- features/dd-sdk-android-ndk/README.md | 6 ++-- .../dd-sdk-android-rum-debug-widget/README.md | 4 +-- integrations/dd-sdk-android-apollo/README.md | 6 ++-- integrations/dd-sdk-android-coil/README.md | 6 ++-- integrations/dd-sdk-android-coil3/README.md | 6 ++-- integrations/dd-sdk-android-compose/README.md | 4 +-- integrations/dd-sdk-android-cronet/README.md | 2 +- integrations/dd-sdk-android-fresco/README.md | 6 ++-- integrations/dd-sdk-android-glide/README.md | 6 ++-- .../dd-sdk-android-rum-coroutines/README.md | 4 +-- integrations/dd-sdk-android-rx/README.md | 4 +-- .../dd-sdk-android-sqldelight/README.md | 6 ++-- integrations/dd-sdk-android-timber/README.md | 4 +-- .../dd-sdk-android-trace-coroutines/README.md | 4 +-- integrations/dd-sdk-android-tv/README.md | 4 +-- 23 files changed, 73 insertions(+), 70 deletions(-) diff --git a/.gitignore b/.gitignore index b7611139c7..5b88bf30fb 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ sdk_classpath detekt_classpath **/verification-metadata.xml !gradle/verification-metadata.xml + +local-docs/ +openspec/ diff --git a/MIGRATION.MD b/MIGRATION.MD index a9179cae66..623554ae4a 100644 --- a/MIGRATION.MD +++ b/MIGRATION.MD @@ -40,7 +40,7 @@ Trace.enable( 1. Add the `OpenTelemetry` dependency to your `build.gradle.kts`: ```kotlin -implementation(project("com.datadoghq:dd-sdk-android-trace-otel:x.x.x")) +implementation(project("cloud.flashcat:dd-sdk-android-trace-otel:x.x.x")) ``` 2. Replace the `OpenTracing` configuration: @@ -153,7 +153,7 @@ Replacement hints: ### OkHttp instrumentation changes -The OkHttp instrumentation (`com.datadoghq:dd-sdk-android-okhttp:x.x.x`) doesn't require desugaring support. However few migration actions may be necessary. +The OkHttp instrumentation (`cloud.flashcat:dd-sdk-android-okhttp:x.x.x`) doesn't require desugaring support. However few migration actions may be necessary. The default sample rate for the `traceSampler` got increased to 100% with the Android SDK version `3.0.0`. @@ -250,17 +250,17 @@ The main changes introduced in SDK 2.0 compared to 1.x are: 1. All relevant products (RUM, Trace, Logs, etc.) are now extracted into different modules. That allows you to integrate only what is needed into your application. -Whereas all products in version 1.x were contained in the single artifact `com.datadoghq:dd-sdk-android:x.x.x`, you now need to adopt the following artifacts: +Whereas all products in version 1.x were contained in the single artifact `cloud.flashcat:dd-sdk-android:x.x.x`, you now need to adopt the following artifacts: -* RUM: `com.datadoghq:dd-sdk-android-rum:x.x.x` -* Logs: `com.datadoghq:dd-sdk-android-logs:x.x.x` -* Trace: `com.datadoghq:dd-sdk-android-trace:x.x.x` -* WebView Tracking: `com.datadoghq:dd-sdk-android-webview:x.x.x` -* OkHttp instrumentation: `com.datadoghq:dd-sdk-android-okhttp:x.x.x` +* RUM: `cloud.flashcat:dd-sdk-android-rum:x.x.x` +* Logs: `cloud.flashcat:dd-sdk-android-logs:x.x.x` +* Trace: `cloud.flashcat:dd-sdk-android-trace:x.x.x` +* WebView Tracking: `cloud.flashcat:dd-sdk-android-webview:x.x.x` +* OkHttp instrumentation: `cloud.flashcat:dd-sdk-android-okhttp:x.x.x` **Note**: If you utilize NDK Crash Reporting and WebView Tracking, you also need to add RUM and/or Logs artifacts to be able to report events to RUM and/or Logs respectively. -Reference to the `com.datadoghq:dd-sdk-android` artifact should be removed from your Gradle buildscript, this artifact doesn't exist anymore. +Reference to the `cloud.flashcat:dd-sdk-android` artifact should be removed from your Gradle buildscript, this artifact doesn't exist anymore. **Note**: The Maven coordinates of all the other artifacts stay the same. @@ -316,7 +316,7 @@ All the classes related to the Logs product are now strictly contained in the `c To use Logs product, import the following artifact: ```kotlin -implementation("com.datadoghq:dd-sdk-android-logs:x.x.x") +implementation("cloud.flashcat:dd-sdk-android-logs:x.x.x") ``` You can enable the Logs product with the following snippet: @@ -352,7 +352,7 @@ All the classes related to the Trace product are now strictly contained in the ` To use the Trace product, import the following artifact: ```kotlin -implementation("com.datadoghq:dd-sdk-android-trace:x.x.x") +implementation("cloud.flashcat:dd-sdk-android-trace:x.x.x") ``` Enable the Trace product with the following snippet: @@ -387,7 +387,7 @@ All classes related to the RUM product are now strictly contained in the `com.da To use the RUM product, import the following artifact: ```kotlin -implementation("com.datadoghq:dd-sdk-android-rum:x.x.x") +implementation("cloud.flashcat:dd-sdk-android-rum:x.x.x") ``` The RUM product can be enabled with the following snippet: @@ -429,7 +429,7 @@ API changes: ### NDK Crash Reporting changes -The artifact name stays the same as before: `com.datadoghq:dd-sdk-android-ndk:x.x.x` +The artifact name stays the same as before: `cloud.flashcat:dd-sdk-android-ndk:x.x.x` NDK Crash Reporting can be enabled using the following snippet: @@ -443,7 +443,7 @@ This configuration replaces the `com.datadog.android.core.configuration.Configur ### WebView Tracking changes -The artifact name stays the same as before: `com.datadoghq:dd-sdk-android-webview:x.x.x` +The artifact name stays the same as before: `cloud.flashcat:dd-sdk-android-webview:x.x.x` You can enable WebView Tracking with the following snippet: @@ -466,7 +466,7 @@ API changes: In order to be able to use OkHttp Tracking you need to import the following artifact: ```kotlin -implementation("com.datadoghq:dd-sdk-android-okhttp:x.x.x") +implementation("cloud.flashcat:dd-sdk-android-okhttp:x.x.x") ``` OkHttp instrumentation now supports the case when Datadog SDK is initialized after the OkHttp client, allowing you to create `com.datadog.android.okhttp.DatadogEventListener`, `com.datadog.android.okhttp.DatadogInterceptor`, and `com.datadog.android.okhttp.trace.TracingInterceptor` before Datadog SDK. OkHttp instrumentation starts reporting events to Datadog once Datadog SDK is initialized. diff --git a/buildSrc/src/main/kotlin/com/datadog/gradle/config/MavenConfig.kt b/buildSrc/src/main/kotlin/com/datadog/gradle/config/MavenConfig.kt index 959b05b69b..d3b2ca6935 100644 --- a/buildSrc/src/main/kotlin/com/datadog/gradle/config/MavenConfig.kt +++ b/buildSrc/src/main/kotlin/com/datadog/gradle/config/MavenConfig.kt @@ -15,7 +15,7 @@ import org.gradle.kotlin.dsl.findByType import org.gradle.plugins.signing.SigningExtension object MavenConfig { - const val GROUP_ID = "com.datadoghq" + const val GROUP_ID = "cloud.flashcat" const val PUBLICATION = "release" } @@ -58,7 +58,7 @@ fun Project.publishingConfig( pom { name.set(projectName) description.set(projectDescription) - url.set("https://github.com/DataDog/dd-sdk-android/") + url.set("https://github.com/flashcatcloud/fc-sdk-android/") licenses { license { @@ -68,23 +68,23 @@ fun Project.publishingConfig( } organization { - name.set("Datadog") - url.set("https://www.datadoghq.com/") + name.set("FlashCat") + url.set("https://flashcat.cloud/") } developers { developer { - name.set("Datadog") - email.set("info@datadoghq.com") - organization.set("Datadog") - organizationUrl.set("https://www.datadoghq.com/") + name.set("FlashCat") + email.set("support@flashcat.cloud") + organization.set("FlashCat") + organizationUrl.set("https://flashcat.cloud/") } } scm { - url.set("https://github.com/DataDog/dd-sdk-android/") - connection.set("scm:git:git@github.com:Datadog/dd-sdk-android.git") - developerConnection.set("scm:git:git@github.com:Datadog/dd-sdk-android.git") + url.set("https://github.com/flashcatcloud/fc-sdk-android/") + connection.set("scm:git:git@github.com:flashcatcloud/fc-sdk-android.git") + developerConnection.set("scm:git:git@github.com:flashcatcloud/fc-sdk-android.git") } } } diff --git a/ci/pipelines/default-pipeline.yml b/ci/pipelines/default-pipeline.yml index 14eee4672f..43149aa2b4 100644 --- a/ci/pipelines/default-pipeline.yml +++ b/ci/pipelines/default-pipeline.yml @@ -527,7 +527,7 @@ notify:publish-release-success: only: - tags script: - - MAVEN_URL="https://search.maven.org/artifact/com.datadoghq/dd-sdk-android-core/$CI_COMMIT_TAG/aar" + - MAVEN_URL="https://search.maven.org/artifact/cloud.flashcat/dd-sdk-android-core/$CI_COMMIT_TAG/aar" - 'MESSAGE_TEXT=":rocket: $CI_PROJECT_NAME $CI_COMMIT_TAG published on :maven: $MAVEN_URL"' - postmessage "#mobile-sdk-ops" "$MESSAGE_TEXT" diff --git a/dd-sdk-android-core/README.md b/dd-sdk-android-core/README.md index 46b84ff421..e435e67c74 100644 --- a/dd-sdk-android-core/README.md +++ b/dd-sdk-android-core/README.md @@ -8,7 +8,7 @@ For example, in case of RUM: ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-rum:") } ``` diff --git a/docs/advanced_troubleshooting.md b/docs/advanced_troubleshooting.md index 109dd75636..b3e58a6eea 100644 --- a/docs/advanced_troubleshooting.md +++ b/docs/advanced_troubleshooting.md @@ -20,7 +20,7 @@ This issue can occur if your dependencies rely on different Guava artifacts as t Solve this issue by excluding the conflicting module from your dependency: ``` -implementation ("com.datadoghq:dd-sdk-android:1.3.0") { +implementation ("cloud.flashcat:dd-sdk-android:1.3.0") { exclude group: 'com.google.guava', module: 'listenablefuture' } ``` diff --git a/features/dd-sdk-android-flags-openfeature/README.md b/features/dd-sdk-android-flags-openfeature/README.md index 276bc340e8..e37d2c0873 100644 --- a/features/dd-sdk-android-flags-openfeature/README.md +++ b/features/dd-sdk-android-flags-openfeature/README.md @@ -20,11 +20,11 @@ Add both the Datadog Feature Flags SDK and OpenFeature Provider to your applicat ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-flags:") - implementation("com.datadoghq:dd-sdk-android-flags-openfeature:") + implementation("cloud.flashcat:dd-sdk-android-flags:") + implementation("cloud.flashcat:dd-sdk-android-flags-openfeature:") // Recommended: RUM integration to correlate flags and RUM session data - implementation("com.datadoghq:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-rum:") } ### Initial setup diff --git a/features/dd-sdk-android-flags/README.md b/features/dd-sdk-android-flags/README.md index d302cb693b..c056c59a7f 100644 --- a/features/dd-sdk-android-flags/README.md +++ b/features/dd-sdk-android-flags/README.md @@ -8,10 +8,10 @@ Add the Datadog Feature Flags SDK to your application's `build.gradle.kts` file: ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-flags:") + implementation("cloud.flashcat:dd-sdk-android-flags:") // Recommended: RUM integration drives analysis and enriches RUM session data - implementation("com.datadoghq:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-rum:") } ``` diff --git a/features/dd-sdk-android-ndk/README.md b/features/dd-sdk-android-ndk/README.md index 42a3717e76..0af638e100 100644 --- a/features/dd-sdk-android-ndk/README.md +++ b/features/dd-sdk-android-ndk/README.md @@ -9,11 +9,11 @@ Send crash report for issues rising from the C/C++ code in your application. ```kotlin dependencies { // if you want to send native crash reports to RUM product - implementation("com.datadoghq:dd-sdk-android-rum:x.x.x") + implementation("cloud.flashcat:dd-sdk-android-rum:x.x.x") // if you want to send native crash reports to Logs product - implementation("com.datadoghq:dd-sdk-android-logs:x.x.x") + implementation("cloud.flashcat:dd-sdk-android-logs:x.x.x") - implementation("com.datadoghq:dd-sdk-android-ndk:x.x.x") + implementation("cloud.flashcat:dd-sdk-android-ndk:x.x.x") } ``` diff --git a/features/dd-sdk-android-rum-debug-widget/README.md b/features/dd-sdk-android-rum-debug-widget/README.md index f20bebe60e..491b322e06 100644 --- a/features/dd-sdk-android-rum-debug-widget/README.md +++ b/features/dd-sdk-android-rum-debug-widget/README.md @@ -12,7 +12,7 @@ Add the dependency to your application's `build.gradle.kts` file: ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum-debug-widget:") + implementation("cloud.flashcat:dd-sdk-android-rum-debug-widget:") } ``` @@ -45,7 +45,7 @@ Remember to remove or comment out the dependency and the `enableRumDebugWidget` ```kotlin dependencies { // Remove before release - // implementation("com.datadoghq:dd-sdk-android-rum-debug-widget:") + // implementation("cloud.flashcat:dd-sdk-android-rum-debug-widget:") } ``` diff --git a/integrations/dd-sdk-android-apollo/README.md b/integrations/dd-sdk-android-apollo/README.md index 3838fdd2a3..5adfaa5df7 100644 --- a/integrations/dd-sdk-android-apollo/README.md +++ b/integrations/dd-sdk-android-apollo/README.md @@ -9,9 +9,9 @@ following to your application's `build.gradle.kts` file. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-okhttp:") - implementation("com.datadoghq:dd-sdk-android-rum:") - implementation("com.datadoghq:dd-sdk-android-apollo:") + implementation("cloud.flashcat:dd-sdk-android-okhttp:") + implementation("cloud.flashcat:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-apollo:") } ``` diff --git a/integrations/dd-sdk-android-coil/README.md b/integrations/dd-sdk-android-coil/README.md index 4a1de48871..5936a58803 100644 --- a/integrations/dd-sdk-android-coil/README.md +++ b/integrations/dd-sdk-android-coil/README.md @@ -7,9 +7,9 @@ following to your application's `build.gradle.kts` file. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum:") - implementation("com.datadoghq:dd-sdk-android-okhttp:") - implementation("com.datadoghq:dd-sdk-android-coil:") + implementation("cloud.flashcat:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-okhttp:") + implementation("cloud.flashcat:dd-sdk-android-coil:") } ``` diff --git a/integrations/dd-sdk-android-coil3/README.md b/integrations/dd-sdk-android-coil3/README.md index fb1f38c692..a2458ddbb4 100644 --- a/integrations/dd-sdk-android-coil3/README.md +++ b/integrations/dd-sdk-android-coil3/README.md @@ -7,9 +7,9 @@ following to your application's `build.gradle.kts` file. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum:") - implementation("com.datadoghq:dd-sdk-android-okhttp:") - implementation("com.datadoghq:dd-sdk-android-coil3:") + implementation("cloud.flashcat:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-okhttp:") + implementation("cloud.flashcat:dd-sdk-android-coil3:") } ``` diff --git a/integrations/dd-sdk-android-compose/README.md b/integrations/dd-sdk-android-compose/README.md index 232a39e322..a57de13958 100644 --- a/integrations/dd-sdk-android-compose/README.md +++ b/integrations/dd-sdk-android-compose/README.md @@ -7,8 +7,8 @@ following to your application's `build.gradle.kts` file. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum:") - implementation("com.datadoghq:dd-sdk-android-compose:") + implementation("cloud.flashcat:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-compose:") } ``` diff --git a/integrations/dd-sdk-android-cronet/README.md b/integrations/dd-sdk-android-cronet/README.md index ae3acdcf2e..cf330956cb 100644 --- a/integrations/dd-sdk-android-cronet/README.md +++ b/integrations/dd-sdk-android-cronet/README.md @@ -9,7 +9,7 @@ At the current stage, only RUM Resource reporting is supported. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-cronet:") + implementation("cloud.flashcat:dd-sdk-android-cronet:") implementation("com.google.android.gms:play-services-cronet:") } ``` diff --git a/integrations/dd-sdk-android-fresco/README.md b/integrations/dd-sdk-android-fresco/README.md index 1a7a5b948b..dbc5c08e5e 100644 --- a/integrations/dd-sdk-android-fresco/README.md +++ b/integrations/dd-sdk-android-fresco/README.md @@ -7,9 +7,9 @@ following to your application's `build.gradle.kts` file. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum:") - implementation("com.datadoghq:dd-sdk-android-okhttp:") - implementation("com.datadoghq:dd-sdk-android-fresco:") + implementation("cloud.flashcat:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-okhttp:") + implementation("cloud.flashcat:dd-sdk-android-fresco:") } ``` diff --git a/integrations/dd-sdk-android-glide/README.md b/integrations/dd-sdk-android-glide/README.md index 5b5f306851..b4cb8b3ff9 100644 --- a/integrations/dd-sdk-android-glide/README.md +++ b/integrations/dd-sdk-android-glide/README.md @@ -7,9 +7,9 @@ following to your application's `build.gradle.kts` file. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum:") - implementation("com.datadoghq:dd-sdk-android-trace:") - implementation("com.datadoghq:dd-sdk-android-glide:") + implementation("cloud.flashcat:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-trace:") + implementation("cloud.flashcat:dd-sdk-android-glide:") } ``` diff --git a/integrations/dd-sdk-android-rum-coroutines/README.md b/integrations/dd-sdk-android-rum-coroutines/README.md index 2159fcc59f..4a89e0dab8 100644 --- a/integrations/dd-sdk-android-rum-coroutines/README.md +++ b/integrations/dd-sdk-android-rum-coroutines/README.md @@ -7,8 +7,8 @@ following to your application's `build.gradle.kts` file. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum:") - implementation("com.datadoghq:dd-sdk-android-rum-coroutines:") + implementation("cloud.flashcat:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-rum-coroutines:") } ``` diff --git a/integrations/dd-sdk-android-rx/README.md b/integrations/dd-sdk-android-rx/README.md index b847b27e7b..9d85409f36 100644 --- a/integrations/dd-sdk-android-rx/README.md +++ b/integrations/dd-sdk-android-rx/README.md @@ -7,8 +7,8 @@ following to your application's `build.gradle.kts` file. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum:") - implementation("com.datadoghq:dd-sdk-android-rx:") + implementation("cloud.flashcat:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-rx:") } ``` diff --git a/integrations/dd-sdk-android-sqldelight/README.md b/integrations/dd-sdk-android-sqldelight/README.md index fe11c13d75..80d7f7dd20 100644 --- a/integrations/dd-sdk-android-sqldelight/README.md +++ b/integrations/dd-sdk-android-sqldelight/README.md @@ -7,9 +7,9 @@ following to your application's `build.gradle.kts` file. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum:") - implementation("com.datadoghq:dd-sdk-android-trace:") - implementation("com.datadoghq:dd-sdk-android-sqldelight:") + implementation("cloud.flashcat:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-trace:") + implementation("cloud.flashcat:dd-sdk-android-sqldelight:") } ``` diff --git a/integrations/dd-sdk-android-timber/README.md b/integrations/dd-sdk-android-timber/README.md index 6c4b8740d1..60db650194 100644 --- a/integrations/dd-sdk-android-timber/README.md +++ b/integrations/dd-sdk-android-timber/README.md @@ -7,8 +7,8 @@ following to your application's `build.gradle.kts` file. ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-logs:") - implementation("com.datadoghq:dd-sdk-android-timber:") + implementation("cloud.flashcat:dd-sdk-android-logs:") + implementation("cloud.flashcat:dd-sdk-android-timber:") } ``` diff --git a/integrations/dd-sdk-android-trace-coroutines/README.md b/integrations/dd-sdk-android-trace-coroutines/README.md index f2f4ab3cd1..229a4b9b7b 100644 --- a/integrations/dd-sdk-android-trace-coroutines/README.md +++ b/integrations/dd-sdk-android-trace-coroutines/README.md @@ -7,8 +7,8 @@ following to your application's `build.gradle.kts` file: ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-trace:") - implementation("com.datadoghq:dd-sdk-android-trace-coroutines:") + implementation("cloud.flashcat:dd-sdk-android-trace:") + implementation("cloud.flashcat:dd-sdk-android-trace-coroutines:") } ``` diff --git a/integrations/dd-sdk-android-tv/README.md b/integrations/dd-sdk-android-tv/README.md index b0fec94134..9d35a0fc5e 100644 --- a/integrations/dd-sdk-android-tv/README.md +++ b/integrations/dd-sdk-android-tv/README.md @@ -6,8 +6,8 @@ To include the Datadog integration for Android TV in your project, add the follo ```kotlin dependencies { - implementation("com.datadoghq:dd-sdk-android-rum:") - implementation("com.datadoghq:dd-sdk-android-tv:") + implementation("cloud.flashcat:dd-sdk-android-rum:") + implementation("cloud.flashcat:dd-sdk-android-tv:") } ``` From 23cf5fea6dee3d069e59369fc426da0ca0b78079 Mon Sep 17 00:00:00 2001 From: Fiona Date: Fri, 23 Jan 2026 17:57:08 +0800 Subject: [PATCH 2/6] feat: update maven plugin --- .../workflows/changelog-to-confluence.yaml | 31 ---- .github/workflows/codeql-analysis.yml | 78 ++++----- .github/workflows/publish-maven.yml | 94 +++++++++++ build.gradle.kts | 41 +++-- buildSrc/build.gradle.kts | 1 + .../com/datadog/gradle/config/MavenConfig.kt | 154 ++++++++++-------- gradle/libs.versions.toml | 3 + 7 files changed, 252 insertions(+), 150 deletions(-) delete mode 100644 .github/workflows/changelog-to-confluence.yaml create mode 100644 .github/workflows/publish-maven.yml diff --git a/.github/workflows/changelog-to-confluence.yaml b/.github/workflows/changelog-to-confluence.yaml deleted file mode 100644 index d4f38720b9..0000000000 --- a/.github/workflows/changelog-to-confluence.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: Publish Changelog to Confluence -on: - pull_request: - branches: - - develop - paths: - - 'CHANGELOG.md' -permissions: - contents: read -jobs: - publish: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0 - - - name: Prepare Only Changelog - run: | - mkdir -p publish_folder - cp CHANGELOG.md publish_folder/android-sdk-changelog.md - echo "Publishing only CHANGELOG.md" - - - name: Publish Markdown to Confluence - uses: markdown-confluence/publish-action@7767a0a7f438bb1497ee7ffd7d3d685b81dfe700 # v5 - with: - confluenceBaseUrl: ${{ secrets.DATADOG_CONFLUENCE_BASE_URL }} - confluenceParentId: ${{ secrets.CONFLUENCE_PARENT_ID }} - atlassianUserName: ${{ secrets.CONFLUENCE_ROBOT_RUM_EMAIL }} - atlassianApiToken: ${{ secrets.CONFLUENCE_ROBOT_RUM_API_KEY }} - contentRoot: '.' - folderToPublish: 'publish_folder' diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 153d9eb9fd..448c9d2221 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -2,10 +2,10 @@ name: "CodeQL" on: push: - branches: [ "**" ] + branches: ["publish-new"] pull_request: # The branches below must be a subset of the branches above - branches: [ "master", "develop", "release/**", "feature/**" ] + branches: ["publish-new"] jobs: analyze: @@ -19,44 +19,46 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'java' ] + language: ["java"] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Use only 'java' to analyze code written in Java, Kotlin or both # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support steps: - - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: Setup Java 17 - uses: actions/setup-java@7a6d8a8234af8eb26422e24e3006232cccaa061b # v4.6.0 - with: - distribution: 'zulu' - java-version: 17 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@f47c8e6a9bd05ef3ee422fc8d8663be7fe4bdc61 # v3.31.9 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@d9c87d481d55275bb5441eef3fe0e46805f9ef70 # v3.5.0 - with: - gradle-version: 8.14.3 - - # Manually build the java bytecode - - name: Execute Gradle build - run: ./gradlew assembleLibrariesRelease - - # Perform the analysis - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@f47c8e6a9bd05ef3ee422fc8d8663be7fe4bdc61 # v3.31.9 - with: - category: "/language:${{matrix.language}}" + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Setup Java 17 + uses: actions/setup-java@7a6d8a8234af8eb26422e24e3006232cccaa061b # v4.6.0 + with: + distribution: "zulu" + java-version: 17 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@f47c8e6a9bd05ef3ee422fc8d8663be7fe4bdc61 # v3.31.9 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@d9c87d481d55275bb5441eef3fe0e46805f9ef70 # v3.5.0 + with: + gradle-version: 8.14.3 + + # Manually build the java bytecode + - name: Execute Gradle build + run: ./gradlew assembleLibrariesRelease + + - name: Stop Gradle Daemon + run: ./gradlew --stop + + # Perform the analysis + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@f47c8e6a9bd05ef3ee422fc8d8663be7fe4bdc61 # v3.31.9 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/publish-maven.yml b/.github/workflows/publish-maven.yml new file mode 100644 index 0000000000..0c79e1cd68 --- /dev/null +++ b/.github/workflows/publish-maven.yml @@ -0,0 +1,94 @@ +name: Publish to Maven Central + +on: + push: + branches: + - publish-new # 推送到 publish-new 分支时触发 snapshot 发布 + tags: + - "v*" # 推送 tag(如 v0.1.0)时触发正式发布 + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "temurin" + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Cache Gradle packages + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build project + run: ./gradlew clean assembleRelease --stacktrace + + - name: Run tests + run: ./gradlew clean testReleaseUnitTest --stacktrace + + - name: Stop Gradle Daemon + run: ./gradlew --stop + + - name: Publish to Maven Central + env: + # Maven Central Portal credentials + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_CENTRAL_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} + # GPG signing credentials (supports both base64 and ASCII armored) + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + GPG_PASSWORD: ${{ secrets.GPG_PASSPHRASE }} + run: | + # Determine if this is a snapshot or release build + if [[ "${{ github.ref }}" == refs/tags/* ]]; then + echo "📦 Publishing release version (from tag: ${{ github.ref_name }})" + VERSION_TYPE="release" + else + echo "📦 Publishing snapshot version (from branch: ${{ github.ref_name }})" + VERSION_TYPE="snapshot" + fi + + # Publish all modules using Vanniktech plugin + # This will upload to Maven Central Portal + ./gradlew publishAllPublicationsToMavenCentralRepository --no-daemon --stacktrace + + echo "✅ Publishing completed" + + - name: Notify on success + if: success() + run: | + if [[ "${{ github.ref }}" == refs/tags/* ]]; then + echo "✅ Released ${{ github.ref_name }} to Maven Central" + echo "⚠️ Next step: Manually publish in Central Portal:" + echo " https://central.sonatype.com/publishing/deployments" + else + echo "✅ Published snapshot from ${{ github.ref_name }} branch" + echo "📍 Snapshot repository: https://central.sonatype.com/repository/maven-snapshots/" + fi + + - name: Notify on failure + if: failure() + run: | + echo "❌ Publishing failed. Check logs for details." + echo "Common issues:" + echo " - GPG key not properly configured" + echo " - Maven Central credentials incorrect" + echo " - Build or test failures" diff --git a/build.gradle.kts b/build.gradle.kts index cff9852100..792b539c93 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,6 @@ import java.util.Properties plugins { `maven-publish` - alias(libs.plugins.nexusPublishGradlePlugin) } version = AndroidConfig.VERSION.name @@ -46,22 +45,30 @@ allprojects { } } -nexusPublishing { - this.repositories { - sonatype { - stagingProfileId = "378eecbbe2cf9" - val sonatypeUsername = System.getenv("CENTRAL_PUBLISHER_USERNAME") - val sonatypePassword = System.getenv("CENTRAL_PUBLISHER_PASSWORD") - if (sonatypeUsername != null) username.set(sonatypeUsername) - if (sonatypePassword != null) password.set(sonatypePassword) - // see https://github.com/gradle-nexus/publish-plugin#publishing-to-maven-central-via-sonatype-central - // For official documentation: - // staging repo publishing https://central.sonatype.org/publish/publish-portal-ossrh-staging-api/#configuration - // snapshot publishing https://central.sonatype.org/publish/publish-portal-snapshots/#publishing-via-other-methods - nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/")) - snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/")) - } - } +// Maven Central Portal (2024+) configuration for publishing +// Using Vanniktech Maven Publish Plugin with Central Portal support +// +// Credentials must be set via environment variables: +// - MAVEN_CENTRAL_USERNAME: Your Maven Central Portal username (from generated token) +// - MAVEN_CENTRAL_PASSWORD: Your Maven Central Portal password (from generated token) +// - GPG_PRIVATE_KEY: Your GPG private key (base64 encoded) +// - GPG_PASSWORD: Your GPG key passphrase +// +// Publishing workflow: +// 1. For SNAPSHOT: ./gradlew publishAllPublicationsToMavenCentralRepository +// 2. For RELEASE: Same command, then manually publish in Portal UI (or set automaticRelease=true) + +// Note: All publishing configuration is now handled by the Vanniktech plugin +// configured in each subproject's publishingConfig() call in MavenConfig.kt + +// Convenience task to publish all modules +tasks.register("publishAll") { + description = "Publish all modules to Maven Central Portal" + group = "publishing" + + dependsOn(subprojects.mapNotNull { + it.tasks.findByName("publishAllPublicationsToMavenCentralRepository") + }) } tasks.register("clean") { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index de8010d523..f9f2dc7ac8 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { implementation(libs.dokkaGradlePlugin) implementation(libs.dependencyLicenseGradlePlugin) implementation(libs.kover) + implementation(libs.vanniktechPublishPlugin) // check api surface implementation(libs.kotlinGrammarParser) diff --git a/buildSrc/src/main/kotlin/com/datadog/gradle/config/MavenConfig.kt b/buildSrc/src/main/kotlin/com/datadog/gradle/config/MavenConfig.kt index d3b2ca6935..c4db02a4df 100644 --- a/buildSrc/src/main/kotlin/com/datadog/gradle/config/MavenConfig.kt +++ b/buildSrc/src/main/kotlin/com/datadog/gradle/config/MavenConfig.kt @@ -6,11 +6,11 @@ package com.datadog.gradle.config -import com.android.build.gradle.LibraryExtension +import com.vanniktech.maven.publish.AndroidSingleVariantLibrary +import com.vanniktech.maven.publish.MavenPublishBaseExtension import org.gradle.api.Project import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.MavenPublication -import org.gradle.kotlin.dsl.create +import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.findByType import org.gradle.plugins.signing.SigningExtension @@ -25,77 +25,103 @@ fun Project.publishingConfig( ) { val projectName = name - val androidExtension = - extensions.findByType(LibraryExtension::class.java) - if (androidExtension == null) { - logger.error("Missing android library extension for $projectName") + // Apply Vanniktech plugin + pluginManager.apply("com.vanniktech.maven.publish.base") + + // Configure Android Library publishing (sources + javadoc) + configure { + configure( + AndroidSingleVariantLibrary( + variant = "release", + sourcesJar = true, + publishJavadocJar = true + ) + ) + + // Coordinates + coordinates( + groupId = MavenConfig.GROUP_ID, + artifactId = customArtifactId, + version = AndroidConfig.VERSION.name + ) + + // POM configuration + pom { + name.set(projectName) + description.set(projectDescription) + inceptionYear.set("2026") + url.set("https://github.com/flashcatcloud/fc-sdk-android/") + + licenses { + license { + name.set("The Apache License, Version 2.0") + url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") + distribution.set("repo") + } + } + + organization { + name.set("FlashCat") + url.set("https://flashcat.cloud/") + } + + developers { + developer { + id.set("flashcat") + name.set("FlashCat") + email.set("support@flashcat.cloud") + organization.set("FlashCat") + organizationUrl.set("https://flashcat.cloud/") + } + } + + scm { + url.set("https://github.com/flashcatcloud/fc-sdk-android/") + connection.set("scm:git:git@github.com:flashcatcloud/fc-sdk-android.git") + developerConnection.set("scm:git:git@github.com:flashcatcloud/fc-sdk-android.git") + } + } + + // Publish to Maven Central Portal (2024+) + // automaticRelease = false means it will create a deployment that needs manual approval in Portal UI + publishToMavenCentral(automaticRelease = false) + } + + // Manual signing configuration + val signingExtension = extensions.findByType(SigningExtension::class) + if (signingExtension == null) { + logger.error("Missing signing extension for $projectName") return } - androidExtension.publishing { - singleVariant(MavenConfig.PUBLICATION) { - withSourcesJar() - withJavadocJar() + signingExtension.apply { + // Signing is required unless explicitly skipped + isRequired = !hasProperty("dd-skip-signing") + + val privateKey = System.getenv("GPG_PRIVATE_KEY") + val password = System.getenv("GPG_PASSWORD") + + if (privateKey != null && password != null) { + // Decode base64 if needed + val decodedKey = try { + String(java.util.Base64.getDecoder().decode(privateKey)) + } catch (e: Exception) { + privateKey // Already decoded / plain text + } + useInMemoryPgpKeys(decodedKey, password) } } afterEvaluate { - val publishingExtension = extensions.findByType(PublishingExtension::class) - val signingExtension = extensions.findByType(SigningExtension::class) - if (publishingExtension == null || signingExtension == null) { - logger.error("Missing publishing or signing extension for $projectName") + val publishingExtension = extensions.findByType() + if (publishingExtension == null) { + logger.error("Missing publishing extension for $projectName") return@afterEvaluate } - publishingExtension.apply { - publications.create(MavenConfig.PUBLICATION) { - from(components.getByName("release")) - - groupId = MavenConfig.GROUP_ID - artifactId = customArtifactId - version = AndroidConfig.VERSION.name - - pom { - name.set(projectName) - description.set(projectDescription) - url.set("https://github.com/flashcatcloud/fc-sdk-android/") - - licenses { - license { - name.set("Apache-2.0") - url.set("https://www.apache.org/licenses/LICENSE-2.0") - } - } - - organization { - name.set("FlashCat") - url.set("https://flashcat.cloud/") - } - - developers { - developer { - name.set("FlashCat") - email.set("support@flashcat.cloud") - organization.set("FlashCat") - organizationUrl.set("https://flashcat.cloud/") - } - } - - scm { - url.set("https://github.com/flashcatcloud/fc-sdk-android/") - connection.set("scm:git:git@github.com:flashcatcloud/fc-sdk-android.git") - developerConnection.set("scm:git:git@github.com:flashcatcloud/fc-sdk-android.git") - } - } - } - } - - signingExtension.apply { - val privateKey = System.getenv("GPG_PRIVATE_KEY") - val password = System.getenv("GPG_PASSWORD") - isRequired = !hasProperty("dd-skip-signing") - useInMemoryPgpKeys(privateKey, password) - sign(publishingExtension.publications.getByName(MavenConfig.PUBLICATION)) + // Sign all publications (required by Maven Central) + publishingExtension.publications.forEach { publication -> + signingExtension.sign(publication) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f3b7cfe727..c77fa4cdd6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -69,6 +69,7 @@ androidLint = "31.0.2" versionsGradlePlugin = "0.46.0" nexusPublishGradlePlugin = "2.0.0" datadogPlugin = "1.21.0" +vanniktech = "0.33.0" kotlinPoet = "1.14.2" kotlinGrammarParser = "41b00c0" @@ -121,6 +122,7 @@ binaryCompatibilityGradlePlugin = { module = "org.jetbrains.kotlinx:binary-compa dependencyLicenseGradlePlugin = { module = "com.datadoghq:dependency-license", version.ref = "dependencyLicense" } versionsGradlePlugin = { module = "com.github.ben-manes:gradle-versions-plugin", version.ref = "versionsGradlePlugin" } kotlinxSerializationPlugin = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin" } +vanniktechPublishPlugin = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "vanniktech" } # Annotation processors glideCompiler = { module = "com.github.bumptech.glide:compiler", version.ref = "glide" } @@ -384,3 +386,4 @@ nexusPublishGradlePlugin = { id = "io.github.gradle-nexus.publish-plugin", versi datadogGradlePlugin = { id = "com.datadoghq.dd-sdk-android-gradle-plugin", version.ref = "datadogPlugin" } composeCompilerPlugin = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } apolloPlugin = { id = "com.apollographql.apollo", version.ref = "apollo" } +vanniktechPublish = { id = "com.vanniktech.maven.publish.base", version.ref = "vanniktech" } From 41a05d3198890429a20ed2e427a45b383783fe60 Mon Sep 17 00:00:00 2001 From: Fiona Date: Fri, 23 Jan 2026 18:17:30 +0800 Subject: [PATCH 3/6] feat: flashcat site --- CHANGELOG.md | 4 +- README.md | 8 +-- dd-sdk-android-core/README.md | 6 +- dd-sdk-android-core/api/apiSurface | 14 ++-- .../api/dd-sdk-android-core.api | 28 +++----- .../kotlin/com/datadog/android/DatadogSite.kt | 70 ------------------- .../com/datadog/android/FlashcatSite.kt | 33 +++++++++ .../android/api/context/DatadogContext.kt | 8 +-- .../core/configuration/Configuration.kt | 10 +-- .../android/core/internal/CoreFeature.kt | 4 +- .../core/internal/NoOpContextProvider.kt | 4 +- .../com/datadog/android/DatadogSiteTest.kt | 67 ------------------ .../com/datadog/android/FlashcatSiteTest.kt | 37 ++++++++++ .../configuration/ConfigurationBuilderTest.kt | 6 +- .../config/CoreFeatureTestConfiguration.kt | 6 +- .../forge/ConfigurationCoreForgeryFactory.kt | 4 +- .../elmyr/DatadogContextForgeryFactory.kt | 4 +- .../flags/internal/DatadogSiteExtensions.kt | 24 +++---- .../flags/internal/model/FlagsContext.kt | 8 +-- .../com/datadog/android/flags/FlagsTest.kt | 4 +- ...sTest.kt => FlashcatSiteExtensionsTest.kt} | 43 ++++-------- .../flags/internal/model/FlagsContextTest.kt | 20 +++--- .../PrecomputedAssignmentsDownloaderTest.kt | 4 +- ...recomputedAssignmentsRequestFactoryTest.kt | 16 ++--- .../net/ResourcesRequestFactoryTest.kt | 8 +-- .../integration/tests/InternalSdkCoreTest.kt | 4 +- ...dingToGrantedCustomPersistenceAsyncTest.kt | 4 +- .../ConfigurationCoreForgeryFactory.kt | 4 +- .../tests/utils/ConfigurationExt.kt | 4 +- sample/README.md | 4 +- .../automotive/SampleAutoApplication.kt | 4 +- sample/kotlin/build.gradle.kts | 2 +- .../android/sample/SampleApplication.kt | 4 +- .../{DatadogSiteExt.kt => FlashcatSiteExt.kt} | 19 ++--- .../android/tv/sample/TvSampleApplication.kt | 4 +- .../android/vendor/sample/LocalServer.kt | 4 +- .../android/wear/sample/WearApplication.kt | 4 +- 37 files changed, 194 insertions(+), 307 deletions(-) delete mode 100644 dd-sdk-android-core/src/main/kotlin/com/datadog/android/DatadogSite.kt create mode 100644 dd-sdk-android-core/src/main/kotlin/com/datadog/android/FlashcatSite.kt delete mode 100644 dd-sdk-android-core/src/test/kotlin/com/datadog/android/DatadogSiteTest.kt create mode 100644 dd-sdk-android-core/src/test/kotlin/com/datadog/android/FlashcatSiteTest.kt rename features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/{DatadogSiteExtensionsTest.kt => FlashcatSiteExtensionsTest.kt} (64%) rename sample/kotlin/src/main/kotlin/com/datadog/android/sample/webview/{DatadogSiteExt.kt => FlashcatSiteExt.kt} (55%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5099ccc779..940ac673e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,7 +73,7 @@ * [FEATURE] Feature flags context management. See [#2886](https://github.com/DataDog/dd-sdk-android/pull/2886) * [FEATURE] Feature flags: Send exposures as batches. See [#2895](https://github.com/DataDog/dd-sdk-android/pull/2895) * [FEATURE] Feature flags: Add a persistence layer. See [#2898](https://github.com/DataDog/dd-sdk-android/pull/2898) -* [FEATURE] Feature flags: `DatadogSite` extension for Flags endpoint. See [#2922](https://github.com/DataDog/dd-sdk-android/pull/2922) +* [FEATURE] Feature flags: `FlashcatSite` extension for Flags endpoint. * [FEATURE] Feature flags: `Flags.enable` and `FlagsClient` APIs. See [#2900](https://github.com/DataDog/dd-sdk-android/pull/2900) * [FEATURE] Feature flags: Support custom endpoints for exposures. See [#2942](https://github.com/DataDog/dd-sdk-android/pull/2942) * [FEATURE] Feature flags: Custom flagging endpoint and assignment download refactoring. See [#2917](https://github.com/DataDog/dd-sdk-android/pull/2917) @@ -792,7 +792,7 @@ This is the first official production version of SDK v3 containing the new archi * [IMPROVEMENT] Synchronize SR info with webviews. See [#1990](https://github.com/DataDog/dd-sdk-android/pull/1990) * [IMPROVEMENT] Core: Start sending batches immediately after feature is initialized. See [#1991](https://github.com/DataDog/dd-sdk-android/pull/1991) * [IMRPOVEMENT] Create RUM Feature Integration Tests. See [#2004](https://github.com/DataDog/dd-sdk-android/pull/2004) -* [IMRROVEMENT] Make constructors of `DatadogSite` private. See [#2010](https://github.com/DataDog/dd-sdk-android/pull/2010) +* [IMRROVEMENT] Make constructors of `FlashcatSite` private. * [IMRROVEMENT] Log warning about tag modification only once. See [#2017](https://github.com/DataDog/dd-sdk-android/pull/2017) * [IMRROVEMENT] Add status code in user-facing message in case of `UnknownError` during batch upload. See [#2018](https://github.com/DataDog/dd-sdk-android/pull/2018) * [MAINTENANCE] Next dev iteration. See [#1972](https://github.com/DataDog/dd-sdk-android/pull/1972) diff --git a/README.md b/README.md index d852a6ab47..89bb6361cb 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ -# Datadog SDK for Android and Android TV +# Flashcat SDK for Android and Android TV -> A client-side Android and Android TV library to interact with Datadog. +> A client-side Android and Android TV library to interact with Flashcat. ## Getting Started ### Log Collection -See the dedicated [Datadog Android Log Collection documentation][1] to learn how to forward logs from your Android or Android TV application to Datadog. +See the dedicated [Flashcat Android Log Collection documentation][1] to learn how to forward logs from your Android or Android TV application to Flashcat. ### Real User Monitoring -See the dedicated [Datadog Android RUM Collection documentation][2] to learn how to send RUM data from your Android or Android TV application to Datadog. +See the dedicated [Flashcat Android RUM Collection documentation][2] to learn how to send RUM data from your Android or Android TV application to Flashcat. ## Log Integrations diff --git a/dd-sdk-android-core/README.md b/dd-sdk-android-core/README.md index e435e67c74..a33df38efb 100644 --- a/dd-sdk-android-core/README.md +++ b/dd-sdk-android-core/README.md @@ -1,8 +1,8 @@ -# Datadog SDK for Android - core library +# Flashcat SDK for Android - core library ## Getting started -To include the Datadog SDK for Android in your project, simply add any product you want to use to your application's `build.gradle.kts` file. +To include the Flashcat SDK for Android in your project, simply add any product you want to use to your application's `build.gradle.kts` file. For example, in case of RUM: @@ -27,7 +27,7 @@ class SampleApplication : Application() { env = ENV_NAME, variant = APP_VARIANT_NAME ) - .useSite(DatadogSite.US1) // replace with the site you're targeting (e.g.: US3, EU1, …) + .useSite(FlashcatSite.CN) // replace with the site you're targeting (e.g.: STAGING) .build() Datadog.initialize(this, configuration, trackingConsent) } diff --git a/dd-sdk-android-core/api/apiSurface b/dd-sdk-android-core/api/apiSurface index 2c445293d6..dc36e0dcdf 100644 --- a/dd-sdk-android-core/api/apiSurface +++ b/dd-sdk-android-core/api/apiSurface @@ -15,14 +15,8 @@ object com.datadog.android.Datadog fun addAccountExtraInfo(Map, com.datadog.android.api.SdkCore = getInstance()) fun clearAccountInfo(com.datadog.android.api.SdkCore = getInstance()) fun _internalProxy(String? = null): _InternalProxy -enum com.datadog.android.DatadogSite - - US1 - - US3 - - US5 - - EU1 - - AP1 - - AP2 - - US1_FED +enum com.datadog.android.FlashcatSite + - CN - STAGING val intakeEndpoint: String class com.datadog.android._InternalProxy @@ -69,7 +63,7 @@ interface com.datadog.android.api.SdkCore data class com.datadog.android.api.context.AccountInfo constructor(String, String? = null, Map = emptyMap()) data class com.datadog.android.api.context.DatadogContext - constructor(com.datadog.android.DatadogSite, String, String, String, String, Int, String, String, String, TimeInfo, ProcessInfo, NetworkInfo, DeviceInfo, UserInfo, AccountInfo?, com.datadog.android.privacy.TrackingConsent, String?, Map>) + constructor(com.datadog.android.FlashcatSite, String, String, String, String, Int, String, String, String, TimeInfo, ProcessInfo, NetworkInfo, DeviceInfo, UserInfo, AccountInfo?, com.datadog.android.privacy.TrackingConsent, String?, Map>) data class com.datadog.android.api.context.DeviceInfo constructor(String, String, String, DeviceType, String, String, String, String, String, Int?, LocaleInfo) enum com.datadog.android.api.context.DeviceType @@ -255,7 +249,7 @@ data class com.datadog.android.core.configuration.Configuration fun setUseDeveloperModeWhenDebuggable(Boolean): Builder fun setFirstPartyHosts(List): Builder fun setFirstPartyHostsWithHeaderType(Map>): Builder - fun useSite(com.datadog.android.DatadogSite): Builder + fun useSite(com.datadog.android.FlashcatSite): Builder fun setBatchSize(BatchSize): Builder fun setUploadFrequency(UploadFrequency): Builder fun setBatchProcessingLevel(BatchProcessingLevel): Builder diff --git a/dd-sdk-android-core/api/dd-sdk-android-core.api b/dd-sdk-android-core/api/dd-sdk-android-core.api index 5a022d8580..3dc79e2111 100644 --- a/dd-sdk-android-core/api/dd-sdk-android-core.api +++ b/dd-sdk-android-core/api/dd-sdk-android-core.api @@ -57,18 +57,12 @@ public final class com/datadog/android/Datadog { public static synthetic fun stopInstance$default (Ljava/lang/String;ILjava/lang/Object;)V } -public final class com/datadog/android/DatadogSite : java/lang/Enum { - public static final field AP1 Lcom/datadog/android/DatadogSite; - public static final field AP2 Lcom/datadog/android/DatadogSite; - public static final field EU1 Lcom/datadog/android/DatadogSite; - public static final field STAGING Lcom/datadog/android/DatadogSite; - public static final field US1 Lcom/datadog/android/DatadogSite; - public static final field US1_FED Lcom/datadog/android/DatadogSite; - public static final field US3 Lcom/datadog/android/DatadogSite; - public static final field US5 Lcom/datadog/android/DatadogSite; +public final class com/datadog/android/FlashcatSite : java/lang/Enum { + public static final field CN Lcom/datadog/android/FlashcatSite; + public static final field STAGING Lcom/datadog/android/FlashcatSite; public final fun getIntakeEndpoint ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lcom/datadog/android/DatadogSite; - public static fun values ()[Lcom/datadog/android/DatadogSite; + public static fun valueOf (Ljava/lang/String;)Lcom/datadog/android/FlashcatSite; + public static fun values ()[Lcom/datadog/android/FlashcatSite; } public final class com/datadog/android/_InternalProxy { @@ -164,8 +158,8 @@ public final class com/datadog/android/api/context/AccountInfo { } public final class com/datadog/android/api/context/DatadogContext { - public fun (Lcom/datadog/android/DatadogSite;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/api/context/TimeInfo;Lcom/datadog/android/api/context/ProcessInfo;Lcom/datadog/android/api/context/NetworkInfo;Lcom/datadog/android/api/context/DeviceInfo;Lcom/datadog/android/api/context/UserInfo;Lcom/datadog/android/api/context/AccountInfo;Lcom/datadog/android/privacy/TrackingConsent;Ljava/lang/String;Ljava/util/Map;)V - public final fun component1 ()Lcom/datadog/android/DatadogSite; + public fun (Lcom/datadog/android/FlashcatSite;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/api/context/TimeInfo;Lcom/datadog/android/api/context/ProcessInfo;Lcom/datadog/android/api/context/NetworkInfo;Lcom/datadog/android/api/context/DeviceInfo;Lcom/datadog/android/api/context/UserInfo;Lcom/datadog/android/api/context/AccountInfo;Lcom/datadog/android/privacy/TrackingConsent;Ljava/lang/String;Ljava/util/Map;)V + public final fun component1 ()Lcom/datadog/android/FlashcatSite; public final fun component10 ()Lcom/datadog/android/api/context/TimeInfo; public final fun component11 ()Lcom/datadog/android/api/context/ProcessInfo; public final fun component12 ()Lcom/datadog/android/api/context/NetworkInfo; @@ -183,8 +177,8 @@ public final class com/datadog/android/api/context/DatadogContext { public final fun component7 ()Ljava/lang/String; public final fun component8 ()Ljava/lang/String; public final fun component9 ()Ljava/lang/String; - public final fun copy (Lcom/datadog/android/DatadogSite;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/api/context/TimeInfo;Lcom/datadog/android/api/context/ProcessInfo;Lcom/datadog/android/api/context/NetworkInfo;Lcom/datadog/android/api/context/DeviceInfo;Lcom/datadog/android/api/context/UserInfo;Lcom/datadog/android/api/context/AccountInfo;Lcom/datadog/android/privacy/TrackingConsent;Ljava/lang/String;Ljava/util/Map;)Lcom/datadog/android/api/context/DatadogContext; - public static synthetic fun copy$default (Lcom/datadog/android/api/context/DatadogContext;Lcom/datadog/android/DatadogSite;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/api/context/TimeInfo;Lcom/datadog/android/api/context/ProcessInfo;Lcom/datadog/android/api/context/NetworkInfo;Lcom/datadog/android/api/context/DeviceInfo;Lcom/datadog/android/api/context/UserInfo;Lcom/datadog/android/api/context/AccountInfo;Lcom/datadog/android/privacy/TrackingConsent;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lcom/datadog/android/api/context/DatadogContext; + public final fun copy (Lcom/datadog/android/FlashcatSite;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/api/context/TimeInfo;Lcom/datadog/android/api/context/ProcessInfo;Lcom/datadog/android/api/context/NetworkInfo;Lcom/datadog/android/api/context/DeviceInfo;Lcom/datadog/android/api/context/UserInfo;Lcom/datadog/android/api/context/AccountInfo;Lcom/datadog/android/privacy/TrackingConsent;Ljava/lang/String;Ljava/util/Map;)Lcom/datadog/android/api/context/DatadogContext; + public static synthetic fun copy$default (Lcom/datadog/android/api/context/DatadogContext;Lcom/datadog/android/FlashcatSite;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/api/context/TimeInfo;Lcom/datadog/android/api/context/ProcessInfo;Lcom/datadog/android/api/context/NetworkInfo;Lcom/datadog/android/api/context/DeviceInfo;Lcom/datadog/android/api/context/UserInfo;Lcom/datadog/android/api/context/AccountInfo;Lcom/datadog/android/privacy/TrackingConsent;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lcom/datadog/android/api/context/DatadogContext; public fun equals (Ljava/lang/Object;)Z public final fun getAccountInfo ()Lcom/datadog/android/api/context/AccountInfo; public final fun getAppBuildId ()Ljava/lang/String; @@ -196,7 +190,7 @@ public final class com/datadog/android/api/context/DatadogContext { public final fun getProcessInfo ()Lcom/datadog/android/api/context/ProcessInfo; public final fun getSdkVersion ()Ljava/lang/String; public final fun getService ()Ljava/lang/String; - public final fun getSite ()Lcom/datadog/android/DatadogSite; + public final fun getSite ()Lcom/datadog/android/FlashcatSite; public final fun getSource ()Ljava/lang/String; public final fun getTime ()Lcom/datadog/android/api/context/TimeInfo; public final fun getTrackingConsent ()Lcom/datadog/android/privacy/TrackingConsent; @@ -729,7 +723,7 @@ public final class com/datadog/android/core/configuration/Configuration$Builder public final fun setUploadSchedulerStrategy (Lcom/datadog/android/core/configuration/UploadSchedulerStrategy;)Lcom/datadog/android/core/configuration/Configuration$Builder; public final fun setUseDeveloperModeWhenDebuggable (Z)Lcom/datadog/android/core/configuration/Configuration$Builder; public final fun setVersion (Ljava/lang/String;)Lcom/datadog/android/core/configuration/Configuration$Builder; - public final fun useSite (Lcom/datadog/android/DatadogSite;)Lcom/datadog/android/core/configuration/Configuration$Builder; + public final fun useSite (Lcom/datadog/android/FlashcatSite;)Lcom/datadog/android/core/configuration/Configuration$Builder; } public final class com/datadog/android/core/configuration/Configuration$Companion { diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/DatadogSite.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/DatadogSite.kt deleted file mode 100644 index 26b4c2731b..0000000000 --- a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/DatadogSite.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.android - -/** - * Defines the Datadog sites you can send tracked data to. - * - * @param siteName Explicit site name property introduced in order to have a consistent SDK - * instance ID (because this value is used there) in case if enum values are renamed. - * @param intakeHostName the host name for the given site. - */ -enum class DatadogSite private constructor(internal val siteName: String, private val intakeHostName: String) { - - /** - * The US1 site: [app.datadoghq.com](https://app.datadoghq.com). - */ - US1("us1", "browser-intake-datadoghq.com"), - - /** - * The US3 site: [us3.datadoghq.com](https://us3.datadoghq.com). - */ - US3("us3"), - - /** - * The US5 site: [us5.datadoghq.com](https://us5.datadoghq.com). - */ - US5("us5"), - - /** - * The EU1 site: [app.datadoghq.eu](https://app.datadoghq.eu). - */ - EU1("eu1", "browser-intake-datadoghq.eu"), - - /** - * The AP1 site: [ap1.datadoghq.com](https://ap1.datadoghq.com). - */ - AP1("ap1"), - - /** - * The AP2 site: [ap2.datadoghq.com](https://ap2.datadoghq.com). - */ - AP2("ap2"), - - /** - * The US1_FED site (FedRAMP compatible): [app.ddog-gov.com](https://app.ddog-gov.com). - */ - US1_FED("us1_fed", "browser-intake-ddog-gov.com"), - - /** - * The STAGING site (internal usage only): [app.datad0g.com](https://app.datad0g.com). - */ - STAGING("staging", "browser-intake-datad0g.com"); - - /** - * Constructor using the generic way to build the intake endpoint host from the site name. - * @param siteName Explicit site name property introduced in order to have a consistent SDK - * instance ID (because this value is used there) in case if enum values are renamed. - */ - private constructor(siteName: String) : this( - siteName, - "browser-intake-$siteName-datadoghq.com" - ) - - /** The intake endpoint url. */ - val intakeEndpoint: String = "https://$intakeHostName" -} diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/FlashcatSite.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/FlashcatSite.kt new file mode 100644 index 0000000000..c14532eb95 --- /dev/null +++ b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/FlashcatSite.kt @@ -0,0 +1,33 @@ +/* + * 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.android + +/** + * Defines the Flashcat sites you can send tracked data to. + * + * @param siteName Explicit site name property introduced in order to have a consistent SDK + * instance ID (because this value is used there) in case if enum values are renamed. + * @param intakeHostName the host name for the given site. + */ +enum class FlashcatSite private constructor( + internal val siteName: String, + private val intakeHostName: String +) { + + /** + * The CN site: [browser.flashcat.cloud](https://browser.flashcat.cloud). + */ + CN("cn", "browser.flashcat.cloud"), + + /** + * The STAGING site (internal usage only): [jira.flashcat.cloud](https://jira.flashcat.cloud). + */ + STAGING("staging", "jira.flashcat.cloud"); + + /** The intake endpoint url. */ + val intakeEndpoint: String = "https://$intakeHostName" +} diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/context/DatadogContext.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/context/DatadogContext.kt index 9cbb046083..05d2810a40 100644 --- a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/context/DatadogContext.kt +++ b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/context/DatadogContext.kt @@ -6,14 +6,14 @@ package com.datadog.android.api.context -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.privacy.TrackingConsent /** * Contains system information, as well as user-specific and feature specific context info. - * @property site [Datadog Site](https://docs.datadoghq.com/getting_started/site/) for data uploads. + * @property site [Flashcat Site](https://docs.datadoghq.com/getting_started/site/) for data uploads. * @property clientToken the client token allowing for data uploads to - * [Datadog Site](https://docs.datadoghq.com/getting_started/site/). + * [Flashcat Site](https://docs.datadoghq.com/getting_started/site/). * @property service the name of the service that data is generated from. Used for * [Unified Service Tagging](https://docs.datadoghq.com/getting_started/tagging/unified_service_tagging). * @property env the name of the environment that data is generated from. Used for @@ -37,7 +37,7 @@ import com.datadog.android.privacy.TrackingConsent * the parent SDK instance */ data class DatadogContext( - val site: DatadogSite, + val site: FlashcatSite, val clientToken: String, val service: String, val env: String, diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/configuration/Configuration.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/configuration/Configuration.kt index 38d89d3143..6fa6fbd8e2 100644 --- a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/configuration/Configuration.kt +++ b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/configuration/Configuration.kt @@ -7,7 +7,7 @@ package com.datadog.android.core.configuration import com.datadog.android.Datadog -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.core.persistence.PersistenceStrategy import com.datadog.android.security.Encryption import com.datadog.android.trace.TracingHeaderType @@ -40,7 +40,7 @@ internal constructor( val proxy: Proxy?, val proxyAuth: Authenticator, val encryption: Encryption?, - val site: DatadogSite, + val site: FlashcatSite, val batchProcessingLevel: BatchProcessingLevel, val persistenceStrategyFactory: PersistenceStrategy.Factory?, val backpressureStrategy: BackPressureStrategy, @@ -157,9 +157,9 @@ internal constructor( } /** - * Let the SDK target your preferred Datadog's site. + * Let the SDK target your preferred Flashcat's site. */ - fun useSite(site: DatadogSite): Builder { + fun useSite(site: FlashcatSite): Builder { coreConfig = coreConfig.copy(needsClearTextHttp = false, site = site) return this } @@ -320,7 +320,7 @@ internal constructor( proxy = null, proxyAuth = Authenticator.NONE, encryption = null, - site = DatadogSite.US1, + site = FlashcatSite.CN, batchProcessingLevel = BatchProcessingLevel.MEDIUM, persistenceStrategyFactory = null, backpressureStrategy = DEFAULT_BACKPRESSURE_STRATEGY, diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/CoreFeature.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/CoreFeature.kt index 94d8e6a6f7..bc381f2e56 100644 --- a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/CoreFeature.kt +++ b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/CoreFeature.kt @@ -16,7 +16,7 @@ import androidx.annotation.RequiresApi import androidx.annotation.WorkerThread import com.datadog.android.BuildConfig import com.datadog.android.Datadog -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.api.InternalLogger import com.datadog.android.api.storage.RawBatchEvent import com.datadog.android.core.configuration.BackPressureStrategy @@ -194,7 +194,7 @@ internal class CoreFeature( internal var ndkCrashHandler: NdkCrashHandler = NoOpNdkCrashHandler() @Volatile - internal var site: DatadogSite = DatadogSite.US1 + internal var site: FlashcatSite = FlashcatSite.CN @Volatile internal var appBuildId: String? = null diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/NoOpContextProvider.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/NoOpContextProvider.kt index d938d676a6..4889051864 100644 --- a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/NoOpContextProvider.kt +++ b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/NoOpContextProvider.kt @@ -6,7 +6,7 @@ package com.datadog.android.core.internal -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.api.context.DatadogContext import com.datadog.android.api.context.DeviceInfo import com.datadog.android.api.context.DeviceType @@ -20,7 +20,7 @@ import com.datadog.android.privacy.TrackingConsent internal class NoOpContextProvider : ContextProvider { // TODO RUM-3784 this one is quite ugly. Should return type be nullable? override fun getContext(withFeatureContexts: Set) = DatadogContext( - site = DatadogSite.US1, + site = FlashcatSite.CN, clientToken = "", service = "", env = "", diff --git a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/DatadogSiteTest.kt b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/DatadogSiteTest.kt deleted file mode 100644 index 7b58e40b83..0000000000 --- a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/DatadogSiteTest.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.android - -import com.datadog.android.utils.forge.Configurator -import fr.xgouchet.elmyr.junit5.ForgeConfiguration -import fr.xgouchet.elmyr.junit5.ForgeExtension -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import org.junit.jupiter.api.extension.Extensions -import org.mockito.junit.jupiter.MockitoExtension -import org.mockito.junit.jupiter.MockitoSettings -import org.mockito.quality.Strictness - -@Extensions( - ExtendWith(MockitoExtension::class), - ExtendWith(ForgeExtension::class) -) -@MockitoSettings(strictness = Strictness.LENIENT) -@ForgeConfiguration(Configurator::class) -internal class DatadogSiteTest { - - @Test - fun `M return intake endpoint W intakeEndpoint {US1}`() { - assertThat(DatadogSite.US1.intakeEndpoint).isEqualTo("https://browser-intake-datadoghq.com") - } - - @Test - fun `M return intake endpoint W intakeEndpoint {US3}`() { - assertThat(DatadogSite.US3.intakeEndpoint).isEqualTo("https://browser-intake-us3-datadoghq.com") - } - - @Test - fun `M return intake endpoint W intakeEndpoint {US5}`() { - assertThat(DatadogSite.US5.intakeEndpoint).isEqualTo("https://browser-intake-us5-datadoghq.com") - } - - @Test - fun `M return intake endpoint W intakeEndpoint {US1-FED}`() { - assertThat(DatadogSite.US1_FED.intakeEndpoint).isEqualTo("https://browser-intake-ddog-gov.com") - } - - @Test - fun `M return intake endpoint W intakeEndpoint {EU1}`() { - assertThat(DatadogSite.EU1.intakeEndpoint).isEqualTo("https://browser-intake-datadoghq.eu") - } - - @Test - fun `M return intake endpoint W intakeEndpoint {AP1}`() { - assertThat(DatadogSite.AP1.intakeEndpoint).isEqualTo("https://browser-intake-ap1-datadoghq.com") - } - - @Test - fun `M return intake endpoint W intakeEndpoint {AP2}`() { - assertThat(DatadogSite.AP2.intakeEndpoint).isEqualTo("https://browser-intake-ap2-datadoghq.com") - } - - @Test - fun `M return intake endpoint W intakeEndpoint {STAGING}`() { - assertThat(DatadogSite.STAGING.intakeEndpoint).isEqualTo("https://browser-intake-datad0g.com") - } -} diff --git a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/FlashcatSiteTest.kt b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/FlashcatSiteTest.kt new file mode 100644 index 0000000000..677027d66b --- /dev/null +++ b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/FlashcatSiteTest.kt @@ -0,0 +1,37 @@ +/* + * 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.android + +import com.datadog.android.utils.forge.Configurator +import fr.xgouchet.elmyr.junit5.ForgeConfiguration +import fr.xgouchet.elmyr.junit5.ForgeExtension +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.junit.jupiter.api.extension.Extensions +import org.mockito.junit.jupiter.MockitoExtension +import org.mockito.junit.jupiter.MockitoSettings +import org.mockito.quality.Strictness + +@Extensions( + ExtendWith(MockitoExtension::class), + ExtendWith(ForgeExtension::class) +) +@MockitoSettings(strictness = Strictness.LENIENT) +@ForgeConfiguration(Configurator::class) +internal class FlashcatSiteTest { + + @Test + fun `M return intake endpoint W intakeEndpoint {CN}`() { + assertThat(FlashcatSite.CN.intakeEndpoint).isEqualTo("https://browser.flashcat.cloud") + } + + @Test + fun `M return intake endpoint W intakeEndpoint {STAGING}`() { + assertThat(FlashcatSite.STAGING.intakeEndpoint).isEqualTo("https://jira.flashcat.cloud") + } +} diff --git a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/configuration/ConfigurationBuilderTest.kt b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/configuration/ConfigurationBuilderTest.kt index 0f12cb60fd..873a2d98d2 100644 --- a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/configuration/ConfigurationBuilderTest.kt +++ b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/configuration/ConfigurationBuilderTest.kt @@ -6,7 +6,7 @@ package com.datadog.android.core.configuration -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.core.persistence.PersistenceStrategy import com.datadog.android.security.Encryption import com.datadog.android.trace.TracingHeaderType @@ -71,7 +71,7 @@ internal class ConfigurationBuilderTest { assertThat(config.coreConfig.proxy).isNull() assertThat(config.coreConfig.proxyAuth).isEqualTo(Authenticator.NONE) assertThat(config.coreConfig.encryption).isNull() - assertThat(config.coreConfig.site).isEqualTo(DatadogSite.US1) + assertThat(config.coreConfig.site).isEqualTo(FlashcatSite.CN) assertThat(config.coreConfig.batchProcessingLevel).isEqualTo(BatchProcessingLevel.MEDIUM) assertThat(config.coreConfig.persistenceStrategyFactory).isNull() assertThat(config.coreConfig.backpressureStrategy.backpressureMitigation) @@ -120,7 +120,7 @@ internal class ConfigurationBuilderTest { @Test fun `M build config with custom site W useSite() and build()`( - @Forgery site: DatadogSite + @Forgery site: FlashcatSite ) { // When val config = testedBuilder.useSite(site).build() diff --git a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/config/CoreFeatureTestConfiguration.kt b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/config/CoreFeatureTestConfiguration.kt index 54e6ebd893..a9e811fb90 100644 --- a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/config/CoreFeatureTestConfiguration.kt +++ b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/config/CoreFeatureTestConfiguration.kt @@ -7,7 +7,7 @@ package com.datadog.android.utils.config import android.content.Context -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.core.configuration.BatchSize import com.datadog.android.core.configuration.UploadFrequency import com.datadog.android.core.internal.CoreFeature @@ -48,7 +48,7 @@ internal class CoreFeatureTestConfiguration( lateinit var fakeSdkVersion: String lateinit var fakeStorageDir: File lateinit var fakeUploadFrequency: UploadFrequency - lateinit var fakeSite: DatadogSite + lateinit var fakeSite: FlashcatSite lateinit var fakeFilePersistenceConfig: FilePersistenceConfig lateinit var fakeBatchSize: BatchSize var fakeBuildId: String? = null @@ -96,7 +96,7 @@ internal class CoreFeatureTestConfiguration( fakeSdkVersion = forge.aStringMatching("[0-9](\\.[0-9]{1,2}){1,3}") fakeStorageDir = Files.createTempDirectory(forge.anHexadecimalString()).toFile() fakeUploadFrequency = forge.aValueFrom(UploadFrequency::class.java) - fakeSite = forge.aValueFrom(DatadogSite::class.java) + fakeSite = forge.aValueFrom(FlashcatSite::class.java) fakeFilePersistenceConfig = forge.getForgery() fakeBatchSize = forge.aValueFrom(BatchSize::class.java) fakeBuildId = forge.aNullable { getForgery().toString() } diff --git a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/forge/ConfigurationCoreForgeryFactory.kt b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/forge/ConfigurationCoreForgeryFactory.kt index 54708b6bef..0bdae837be 100644 --- a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/forge/ConfigurationCoreForgeryFactory.kt +++ b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/forge/ConfigurationCoreForgeryFactory.kt @@ -6,7 +6,7 @@ package com.datadog.android.utils.forge -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.core.configuration.BackPressureMitigation import com.datadog.android.core.configuration.BackPressureStrategy import com.datadog.android.core.configuration.Configuration @@ -47,7 +47,7 @@ internal class ConfigurationCoreForgeryFactory : proxy = proxy, proxyAuth = auth, encryption = forge.aNullable { NoOpEncryption() }, - site = forge.aValueFrom(DatadogSite::class.java), + site = forge.aValueFrom(FlashcatSite::class.java), batchProcessingLevel = forge.getForgery(), persistenceStrategyFactory = forge.aNullable { mock().apply { diff --git a/dd-sdk-android-core/src/testFixtures/kotlin/com/datadog/android/tests/elmyr/DatadogContextForgeryFactory.kt b/dd-sdk-android-core/src/testFixtures/kotlin/com/datadog/android/tests/elmyr/DatadogContextForgeryFactory.kt index 8b4d6dfd0a..60d24abdde 100644 --- a/dd-sdk-android-core/src/testFixtures/kotlin/com/datadog/android/tests/elmyr/DatadogContextForgeryFactory.kt +++ b/dd-sdk-android-core/src/testFixtures/kotlin/com/datadog/android/tests/elmyr/DatadogContextForgeryFactory.kt @@ -6,7 +6,7 @@ package com.datadog.android.tests.elmyr -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.api.context.DatadogContext import com.datadog.android.privacy.TrackingConsent import fr.xgouchet.elmyr.Forge @@ -18,7 +18,7 @@ class DatadogContextForgeryFactory : ForgeryFactory { override fun getForgery(forge: Forge): DatadogContext { return DatadogContext( - site = forge.aValueFrom(DatadogSite::class.java), + site = forge.aValueFrom(FlashcatSite::class.java), clientToken = forge.anHexadecimalString().lowercase(Locale.US), service = forge.anAlphabeticalString(), version = forge.aStringMatching("[0-9](\\.[0-9]{1,3}){2,3}"), diff --git a/features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/DatadogSiteExtensions.kt b/features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/DatadogSiteExtensions.kt index 918c8cd343..3157ff0233 100644 --- a/features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/DatadogSiteExtensions.kt +++ b/features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/DatadogSiteExtensions.kt @@ -6,7 +6,7 @@ package com.datadog.android.flags.internal -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite /** * Gets the complete flags endpoint URL. @@ -14,35 +14,27 @@ import com.datadog.android.DatadogSite * This is used to construct the full host in the format: `.ff-cdn..` * @return Complete flags endpoint URL or null if site not supported */ -internal fun DatadogSite.getFlagsEndpoint(customerDomain: String): String? { +internal fun FlashcatSite.getFlagsEndpoint(customerDomain: String): String? { val host = flagsHost(customerDomain) ?: return null return "https://$host$FLAGS_PATH" } /** - * Extension function that returns the flags CDN host for this Datadog site. + * Extension function that returns the flags CDN host for this Flashcat site. * @param customerDomain The customer-specific subdomain prefix for the flags CDN * @return Flags host string in format `.ff-cdn..`, or null if site not supported */ -private fun DatadogSite.flagsHost(customerDomain: String): String? = when (this) { - DatadogSite.US1_FED -> null - - DatadogSite.STAGING -> "$customerDomain.ff-cdn.datad0g.com" - DatadogSite.EU1 -> buildFlagsHostString(customerDomain, tld = "eu") // No site in the host, .eu TLD - DatadogSite.US1 -> buildFlagsHostString(customerDomain) // No site in the host, default .com TLD - - DatadogSite.US3 -> buildFlagsHostString(customerDomain, dc = "us3", tld = "com") - DatadogSite.US5 -> buildFlagsHostString(customerDomain, dc = "us5", tld = "com") - DatadogSite.AP1 -> buildFlagsHostString(customerDomain, dc = "ap1", tld = "com") - DatadogSite.AP2 -> buildFlagsHostString(customerDomain, dc = "ap2", tld = "com") +private fun FlashcatSite.flagsHost(customerDomain: String): String? = when (this) { + FlashcatSite.STAGING -> "$customerDomain.ff-cdn.flashcat.cloud" + FlashcatSite.CN -> buildFlagsHostString(customerDomain) // No site in the host, default .cloud TLD } -private fun buildFlagsHostString(customerDomain: String, dc: String? = null, tld: String = "com"): String { +private fun buildFlagsHostString(customerDomain: String, dc: String? = null, tld: String = "cloud"): String { val parts = listOfNotNull( customerDomain, "ff-cdn", dc, - "datadoghq", + "flashcat", tld ) return parts.joinToString(".") diff --git a/features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/model/FlagsContext.kt b/features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/model/FlagsContext.kt index 337a2e0e7a..cfe0fa9538 100644 --- a/features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/model/FlagsContext.kt +++ b/features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/model/FlagsContext.kt @@ -6,7 +6,7 @@ package com.datadog.android.flags.internal.model -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.api.context.DatadogContext import com.datadog.android.flags.FlagsConfiguration @@ -17,8 +17,8 @@ import com.datadog.android.flags.FlagsConfiguration * * @param applicationId The Datadog application ID. May be null when the SDK is not fully initialized * or when running in certain test environments where app ID is not required. - * @param clientToken The client token for authenticating requests to Datadog - * @param site The Datadog site (e.g., US1, EU1) for routing requests + * @param clientToken The client token for authenticating requests to Flashcat + * @param site The Flashcat site (e.g., CN, STAGING) for routing requests * @param env The environment name (e.g., prod, staging) for context * @param customExposureEndpoint Custom endpoint URL for uploading exposure events. If null, the default endpoint will be used. * @param customFlagEndpoint Custom endpoint URL for fetching flag assignments. If null, the endpoint will be derived from the site. @@ -26,7 +26,7 @@ import com.datadog.android.flags.FlagsConfiguration internal data class FlagsContext( val applicationId: String?, val clientToken: String, - val site: DatadogSite, + val site: FlashcatSite, val env: String, val customExposureEndpoint: String? = null, val customFlagEndpoint: String? = null diff --git a/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/FlagsTest.kt b/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/FlagsTest.kt index 13b50a14a4..b3091a4922 100644 --- a/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/FlagsTest.kt +++ b/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/FlagsTest.kt @@ -6,7 +6,7 @@ package com.datadog.android.flags -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.api.InternalLogger import com.datadog.android.api.context.DatadogContext import com.datadog.android.api.feature.Feature.Companion.FLAGS_FEATURE_NAME @@ -62,7 +62,7 @@ internal class FlagsTest { whenever(mockSdkCore.createSingleThreadExecutorService(any())) doReturn mockExecutorService whenever(mockDatadogContext.clientToken) doReturn fakeClientToken - whenever(mockDatadogContext.site) doReturn DatadogSite.US1 + whenever(mockDatadogContext.site) doReturn FlashcatSite.CN whenever(mockDatadogContext.env) doReturn fakeEnv whenever(mockSdkCore.getDatadogContext()) doReturn mockDatadogContext whenever(mockSdkCore.getFeature(RUM_FEATURE_NAME)) doReturn mock() diff --git a/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/DatadogSiteExtensionsTest.kt b/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/FlashcatSiteExtensionsTest.kt similarity index 64% rename from features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/DatadogSiteExtensionsTest.kt rename to features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/FlashcatSiteExtensionsTest.kt index 93dbea8108..2ea3b457fa 100644 --- a/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/DatadogSiteExtensionsTest.kt +++ b/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/FlashcatSiteExtensionsTest.kt @@ -6,7 +6,7 @@ package com.datadog.android.flags.internal -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import fr.xgouchet.elmyr.annotation.StringForgery import fr.xgouchet.elmyr.junit5.ForgeExtension import org.assertj.core.api.Assertions.assertThat @@ -17,14 +17,14 @@ import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource @ExtendWith(ForgeExtension::class) -internal class DatadogSiteExtensionsTest { +internal class FlashcatSiteExtensionsTest { // region getFlagsEndpoint - With Custom Domain @ParameterizedTest @MethodSource("supportedSitesWithCustomDomain") fun `M build flags endpoint W getFlagsEndpoint() { supported sites with custom domain }`( - site: DatadogSite, + site: FlashcatSite, expectedHostSuffix: String, @StringForgery customerDomain: String ) { @@ -42,7 +42,7 @@ internal class DatadogSiteExtensionsTest { @ParameterizedTest @MethodSource("supportedSitesWithDefaultDomain") fun `M build flags endpoint W getFlagsEndpoint() { supported sites with preview domain }`( - site: DatadogSite, + site: FlashcatSite, expectedHost: String ) { // When @@ -54,25 +54,12 @@ internal class DatadogSiteExtensionsTest { // endregion - // region getFlagsEndpoint - Error Cases - - @Test - fun `M return null W getFlagsEndpoint() { unsupported site }`(@StringForgery customerDomain: String) { - // When - val result = DatadogSite.US1_FED.getFlagsEndpoint(customerDomain) - - // Then - assertThat(result).isNull() - } - - // endregion - // region getFlagsEndpoint - Edge Cases @ParameterizedTest @MethodSource("edgeCaseCustomerDomains") fun `M handle edge case customer domains W getFlagsEndpoint() { various edge cases }`( - site: DatadogSite, + site: FlashcatSite, customerDomain: String, expectedHost: String ) { @@ -89,32 +76,26 @@ internal class DatadogSiteExtensionsTest { @Suppress("unused") @JvmStatic fun supportedSitesWithCustomDomain(): List = listOf( - Arguments.of(DatadogSite.US1, "ff-cdn.datadoghq.com"), - Arguments.of(DatadogSite.US3, "ff-cdn.us3.datadoghq.com"), - Arguments.of(DatadogSite.US5, "ff-cdn.us5.datadoghq.com"), - Arguments.of(DatadogSite.AP1, "ff-cdn.ap1.datadoghq.com"), - Arguments.of(DatadogSite.AP2, "ff-cdn.ap2.datadoghq.com"), - Arguments.of(DatadogSite.EU1, "ff-cdn.datadoghq.eu"), - Arguments.of(DatadogSite.STAGING, "ff-cdn.datad0g.com") + Arguments.of(FlashcatSite.CN, "ff-cdn.flashcat.cloud"), + Arguments.of(FlashcatSite.STAGING, "ff-cdn.flashcat.cloud") ) @Suppress("unused") @JvmStatic fun supportedSitesWithDefaultDomain(): List = listOf( - Arguments.of(DatadogSite.US1, "preview.ff-cdn.datadoghq.com"), - Arguments.of(DatadogSite.EU1, "preview.ff-cdn.datadoghq.eu"), - Arguments.of(DatadogSite.STAGING, "preview.ff-cdn.datad0g.com") + Arguments.of(FlashcatSite.CN, "preview.ff-cdn.flashcat.cloud"), + Arguments.of(FlashcatSite.STAGING, "preview.ff-cdn.flashcat.cloud") ) @Suppress("unused") @JvmStatic fun edgeCaseCustomerDomains(): List = listOf( // Domain with hyphens and underscores (special characters) - Arguments.of(DatadogSite.US1, "test-domain_123", "test-domain_123.ff-cdn.datadoghq.com"), + Arguments.of(FlashcatSite.CN, "test-domain_123", "test-domain_123.ff-cdn.flashcat.cloud"), // Numeric-only domain - Arguments.of(DatadogSite.US3, "12345", "12345.ff-cdn.us3.datadoghq.com"), + Arguments.of(FlashcatSite.STAGING, "12345", "12345.ff-cdn.flashcat.cloud"), // Domain with dots (subdomain-like) - Arguments.of(DatadogSite.EU1, "my.customer.domain", "my.customer.domain.ff-cdn.datadoghq.eu") + Arguments.of(FlashcatSite.CN, "my.customer.domain", "my.customer.domain.ff-cdn.flashcat.cloud") ) } } diff --git a/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/model/FlagsContextTest.kt b/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/model/FlagsContextTest.kt index 786504489d..a59e3c01ad 100644 --- a/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/model/FlagsContextTest.kt +++ b/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/model/FlagsContextTest.kt @@ -6,7 +6,7 @@ package com.datadog.android.flags.internal.model -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.api.context.DatadogContext import com.datadog.android.flags.FlagsConfiguration import fr.xgouchet.elmyr.annotation.StringForgery @@ -33,7 +33,7 @@ internal class FlagsContextTest { lateinit var mockDatadogContext: DatadogContext @Mock - lateinit var mockDatadogSite: DatadogSite + lateinit var mockFlashcatSite: FlashcatSite @StringForgery lateinit var fakeApplicationId: String @@ -54,8 +54,8 @@ internal class FlagsContextTest { ) { // Given whenever(mockDatadogContext.clientToken) doReturn fakeClientToken - whenever(mockDatadogContext.site) doReturn mockDatadogSite - whenever(mockDatadogSite.name) doReturn fakeSiteName + whenever(mockDatadogContext.site) doReturn mockFlashcatSite + whenever(mockFlashcatSite.name) doReturn fakeSiteName whenever(mockDatadogContext.env) doReturn fakeEnv val flagsConfiguration = FlagsConfiguration.Builder() @@ -69,7 +69,7 @@ internal class FlagsContextTest { // Then assertThat(flagsContext.applicationId).isEqualTo(fakeApplicationId) assertThat(flagsContext.clientToken).isEqualTo(fakeClientToken) - assertThat(flagsContext.site).isEqualTo(mockDatadogSite) + assertThat(flagsContext.site).isEqualTo(mockFlashcatSite) assertThat(flagsContext.env).isEqualTo(fakeEnv) assertThat(flagsContext.customExposureEndpoint).isEqualTo(fakeExposureEndpoint) assertThat(flagsContext.customFlagEndpoint).isEqualTo(fakeFlagEndpoint) @@ -79,8 +79,8 @@ internal class FlagsContextTest { fun `M create FlagsContext with defaults W create() { minimal configuration }`() { // Given whenever(mockDatadogContext.clientToken) doReturn fakeClientToken - whenever(mockDatadogContext.site) doReturn mockDatadogSite - whenever(mockDatadogSite.name) doReturn fakeSiteName + whenever(mockDatadogContext.site) doReturn mockFlashcatSite + whenever(mockFlashcatSite.name) doReturn fakeSiteName whenever(mockDatadogContext.env) doReturn fakeEnv val flagsConfiguration = FlagsConfiguration.Builder().build() @@ -91,7 +91,7 @@ internal class FlagsContextTest { // Then assertThat(flagsContext.applicationId).isEqualTo(fakeApplicationId) assertThat(flagsContext.clientToken).isEqualTo(fakeClientToken) - assertThat(flagsContext.site).isEqualTo(mockDatadogSite) + assertThat(flagsContext.site).isEqualTo(mockFlashcatSite) assertThat(flagsContext.env).isEqualTo(fakeEnv) assertThat(flagsContext.customExposureEndpoint).isNull() assertThat(flagsContext.customFlagEndpoint).isNull() @@ -101,7 +101,7 @@ internal class FlagsContextTest { fun `M handle null application ID W create() { null app ID }`() { // Given whenever(mockDatadogContext.clientToken) doReturn fakeClientToken - whenever(mockDatadogContext.site) doReturn mockDatadogSite + whenever(mockDatadogContext.site) doReturn mockFlashcatSite whenever(mockDatadogContext.site.name) doReturn fakeSiteName whenever(mockDatadogContext.env) doReturn fakeEnv @@ -113,7 +113,7 @@ internal class FlagsContextTest { // Then assertThat(flagsContext.applicationId).isNull() assertThat(flagsContext.clientToken).isEqualTo(fakeClientToken) - assertThat(flagsContext.site).isEqualTo(mockDatadogSite) + assertThat(flagsContext.site).isEqualTo(mockFlashcatSite) assertThat(flagsContext.env).isEqualTo(fakeEnv) } } diff --git a/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/net/PrecomputedAssignmentsDownloaderTest.kt b/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/net/PrecomputedAssignmentsDownloaderTest.kt index 3b998ed789..e631650077 100644 --- a/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/net/PrecomputedAssignmentsDownloaderTest.kt +++ b/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/net/PrecomputedAssignmentsDownloaderTest.kt @@ -6,7 +6,7 @@ package com.datadog.android.flags.internal.net -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.api.InternalLogger import com.datadog.android.flags.internal.model.FlagsContext import com.datadog.android.flags.model.EvaluationContext @@ -69,7 +69,7 @@ internal class PrecomputedAssignmentsDownloaderTest { fakeFlagsContext = FlagsContext( clientToken = forge.anAlphabeticalString(), applicationId = forge.anAlphabeticalString(), - site = DatadogSite.US1, + site = FlashcatSite.CN, env = "test" ) diff --git a/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/net/PrecomputedAssignmentsRequestFactoryTest.kt b/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/net/PrecomputedAssignmentsRequestFactoryTest.kt index dcca894b63..5b475db7bd 100644 --- a/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/net/PrecomputedAssignmentsRequestFactoryTest.kt +++ b/features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/net/PrecomputedAssignmentsRequestFactoryTest.kt @@ -6,7 +6,7 @@ package com.datadog.android.flags.internal.net -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.api.InternalLogger import com.datadog.android.flags.internal.model.FlagsContext import com.datadog.android.flags.model.EvaluationContext @@ -55,7 +55,7 @@ internal class PrecomputedAssignmentsRequestFactoryTest { val flagsContext = FlagsContext( applicationId = fakeApplicationId, clientToken = fakeClientToken, - site = DatadogSite.US1, + site = FlashcatSite.CN, env = fakeEnv ) @@ -85,7 +85,7 @@ internal class PrecomputedAssignmentsRequestFactoryTest { val flagsContext = FlagsContext( applicationId = null, clientToken = fakeClientToken, - site = DatadogSite.US1, + site = FlashcatSite.CN, env = fakeEnv ) @@ -115,7 +115,7 @@ internal class PrecomputedAssignmentsRequestFactoryTest { val flagsContext = FlagsContext( applicationId = fakeApplicationId, clientToken = fakeClientToken, - site = DatadogSite.US1, + site = FlashcatSite.CN, env = fakeEnv, customFlagEndpoint = fakeCustomEndpoint ) @@ -150,7 +150,7 @@ internal class PrecomputedAssignmentsRequestFactoryTest { val flagsContext = FlagsContext( applicationId = fakeApplicationId, clientToken = fakeClientToken, - site = DatadogSite.US1, + site = FlashcatSite.CN, env = fakeEnv ) @@ -203,7 +203,7 @@ internal class PrecomputedAssignmentsRequestFactoryTest { val flagsContext = FlagsContext( applicationId = fakeApplicationId, clientToken = fakeClientToken, - site = DatadogSite.US1, + site = FlashcatSite.CN, env = fakeEnv ) @@ -244,7 +244,7 @@ internal class PrecomputedAssignmentsRequestFactoryTest { val flagsContext = FlagsContext( applicationId = fakeApplicationId, clientToken = fakeClientToken, - site = DatadogSite.US1, + site = FlashcatSite.CN, env = fakeEnv ) @@ -287,7 +287,7 @@ internal class PrecomputedAssignmentsRequestFactoryTest { val flagsContext = FlagsContext( applicationId = fakeApplicationId, clientToken = fakeClientToken, - site = DatadogSite.US1_FED, + site = FlashcatSite.STAGING, env = fakeEnv ) diff --git a/features/dd-sdk-android-session-replay/src/test/kotlin/com/datadog/android/sessionreplay/internal/net/ResourcesRequestFactoryTest.kt b/features/dd-sdk-android-session-replay/src/test/kotlin/com/datadog/android/sessionreplay/internal/net/ResourcesRequestFactoryTest.kt index 5fc4184567..697194925d 100644 --- a/features/dd-sdk-android-session-replay/src/test/kotlin/com/datadog/android/sessionreplay/internal/net/ResourcesRequestFactoryTest.kt +++ b/features/dd-sdk-android-session-replay/src/test/kotlin/com/datadog/android/sessionreplay/internal/net/ResourcesRequestFactoryTest.kt @@ -6,7 +6,7 @@ package com.datadog.android.sessionreplay.internal.net -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.api.InternalLogger import com.datadog.android.api.context.DatadogContext import com.datadog.android.api.feature.Feature @@ -63,7 +63,7 @@ internal class ResourcesRequestFactoryTest { private lateinit var fakeMediaType: MediaType @Mock - lateinit var mockDatadogSite: DatadogSite + lateinit var mockFlashcatSite: FlashcatSite @StringForgery lateinit var fakeApplicationId: String @@ -77,8 +77,8 @@ internal class ResourcesRequestFactoryTest { @BeforeEach fun `set up`(forge: Forge) { val fakeRumFeature = mapOf(APPLICATION_ID to fakeApplicationId) - whenever(mockDatadogSite.intakeEndpoint).thenReturn(DatadogSite.US1.toString()) - whenever(fakeDatadogContext.site).thenReturn(mockDatadogSite) + whenever(mockFlashcatSite.intakeEndpoint).thenReturn(FlashcatSite.CN.toString()) + whenever(fakeDatadogContext.site).thenReturn(mockFlashcatSite) val fakeFeaturesContext = mapOf(Feature.RUM_FEATURE_NAME to fakeRumFeature) whenever(fakeDatadogContext.featuresContext).thenReturn(fakeFeaturesContext) diff --git a/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/InternalSdkCoreTest.kt b/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/InternalSdkCoreTest.kt index c04e81970f..86747451cc 100644 --- a/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/InternalSdkCoreTest.kt +++ b/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/InternalSdkCoreTest.kt @@ -15,7 +15,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.datadog.android.BuildConfig import com.datadog.android.Datadog -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android._InternalProxy import com.datadog.android.api.context.DeviceType import com.datadog.android.api.feature.Feature @@ -431,7 +431,7 @@ class InternalSdkCoreTest : MockServerTest() { .setBatchSize(BatchSize.SMALL) .setUploadFrequency(UploadFrequency.FREQUENT) .setBatchProcessingLevel(BatchProcessingLevel.HIGH) - .useSite(forge.aValueFrom(DatadogSite::class.java)) + .useSite(forge.aValueFrom(FlashcatSite::class.java)) .build() // When diff --git a/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/PendingToGrantedCustomPersistenceAsyncTest.kt b/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/PendingToGrantedCustomPersistenceAsyncTest.kt index 3f196c8518..15a65e31bf 100644 --- a/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/PendingToGrantedCustomPersistenceAsyncTest.kt +++ b/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/PendingToGrantedCustomPersistenceAsyncTest.kt @@ -8,7 +8,7 @@ package com.datadog.android.core.integration.tests import androidx.test.core.app.ApplicationProvider import com.datadog.android.Datadog -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android._InternalProxy import com.datadog.android.api.feature.Feature import com.datadog.android.api.feature.stub.StubStorageBackedFeature @@ -157,7 +157,7 @@ class PendingToGrantedCustomPersistenceAsyncTest( ) .setUseDeveloperModeWhenDebuggable(aBool()) // this needs to be before allowing the clear text traffic as it invalidates this option - .useSite(aValueFrom(DatadogSite::class.java)) + .useSite(aValueFrom(FlashcatSite::class.java)) .setFirstPartyHostsWithHeaderType( aMap { val fakeUrl = aStringMatching("https://[a-z0-9]+\\.com") diff --git a/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/forge/factories/ConfigurationCoreForgeryFactory.kt b/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/forge/factories/ConfigurationCoreForgeryFactory.kt index 9c9ada41d1..b29dd012fb 100644 --- a/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/forge/factories/ConfigurationCoreForgeryFactory.kt +++ b/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/forge/factories/ConfigurationCoreForgeryFactory.kt @@ -6,7 +6,7 @@ package com.datadog.android.core.integration.tests.forge.factories -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android._InternalProxy import com.datadog.android.core.configuration.BatchProcessingLevel import com.datadog.android.core.configuration.BatchSize @@ -30,7 +30,7 @@ internal class ConfigurationCoreForgeryFactory : ) .setUseDeveloperModeWhenDebuggable(forge.aBool()) // this needs to be before allowing the clear text traffic as it invalidates this option - .useSite(forge.aValueFrom(DatadogSite::class.java)) + .useSite(forge.aValueFrom(FlashcatSite::class.java)) .setFirstPartyHostsWithHeaderType( forge.aMap { val fakeUrl = forge.aStringMatching("https://[a-z0-9]+\\.com") diff --git a/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/utils/ConfigurationExt.kt b/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/utils/ConfigurationExt.kt index 80cce265ff..be5a9b3dc7 100644 --- a/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/utils/ConfigurationExt.kt +++ b/reliability/core-it/src/androidTest/kotlin/com/datadog/android/core/integration/tests/utils/ConfigurationExt.kt @@ -6,12 +6,12 @@ package com.datadog.android.core.integration.tests.utils -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.core.configuration.Configuration import com.datadog.android.trace.TracingHeaderType import com.datadog.tools.unit.getFieldValue -fun Configuration.site(): DatadogSite { +fun Configuration.site(): FlashcatSite { return this.getFieldValue("coreConfig").getFieldValue("site") } diff --git a/sample/README.md b/sample/README.md index 8bb8692680..7b46289d60 100644 --- a/sample/README.md +++ b/sample/README.md @@ -3,7 +3,7 @@ ## Getting Started These sample apps are configured based on configuration JSON files which need to be added in `config` folder in your root directory. -For each flavor, you must provide a config file named `[flavorName].json`. By default, flavors should match one of the existing sites in the `DatadogSite` enum (for example: `us1`, `us1_fed`, `us3`, `us5`, `eu1`). +For each flavor, you must provide a config file named `[flavorName].json`. By default, flavors should match one of the existing sites in the `FlashcatSite` enum (for example: `cn`, `staging`). Example of a minimal sample app configuration file: @@ -29,7 +29,7 @@ To allow the download of logs (to test the `Data List` screen), add the followin ### Staging -If you need to target a site that is not part of the `DatadogSite` enum, configure custom endpoints using the following attributes: +If you need to target a site that is not part of the `FlashcatSite` enum, configure custom endpoints using the following attributes: ```json { diff --git a/sample/automotive/src/main/java/com/datadog/sample/automotive/SampleAutoApplication.kt b/sample/automotive/src/main/java/com/datadog/sample/automotive/SampleAutoApplication.kt index d65694d26c..f2144718ca 100644 --- a/sample/automotive/src/main/java/com/datadog/sample/automotive/SampleAutoApplication.kt +++ b/sample/automotive/src/main/java/com/datadog/sample/automotive/SampleAutoApplication.kt @@ -9,7 +9,7 @@ package com.datadog.sample.automotive import android.app.Application import android.util.Log import com.datadog.android.Datadog -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.core.configuration.BatchSize import com.datadog.android.core.configuration.Configuration import com.datadog.android.core.configuration.UploadFrequency @@ -61,7 +61,7 @@ class SampleAutoApplication : Application() { env = "test", variant = "" ) - .useSite(DatadogSite.US1) + .useSite(FlashcatSite.CN) .setBatchSize(BatchSize.SMALL) .setUploadFrequency(UploadFrequency.FREQUENT) .build() diff --git a/sample/kotlin/build.gradle.kts b/sample/kotlin/build.gradle.kts index 2126542073..fbab8b7d2d 100644 --- a/sample/kotlin/build.gradle.kts +++ b/sample/kotlin/build.gradle.kts @@ -76,7 +76,7 @@ android { flavorDimensions += listOf("site") productFlavors { - val regions = arrayOf("us1", "us3", "us5", "us1_fed", "eu1", "ap1", "ap2", "staging") + val regions = arrayOf("cn", "staging") regions.forEachIndexed { index, region -> register(region) { diff --git a/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt b/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt index 36d1943ac3..6dc2afa2b5 100644 --- a/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt +++ b/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt @@ -12,7 +12,7 @@ import android.os.Build import android.util.Log import androidx.lifecycle.ViewModelProvider import com.datadog.android.Datadog -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.compose.enableComposeActionTracking import com.datadog.android.core.configuration.BackPressureMitigation import com.datadog.android.core.configuration.BackPressureStrategy @@ -441,7 +441,7 @@ class SampleApplication : Application() { .setUploadFrequency(UploadFrequency.FREQUENT) try { - configBuilder.useSite(DatadogSite.valueOf(BuildConfig.DD_SITE_NAME)) + configBuilder.useSite(FlashcatSite.valueOf(BuildConfig.DD_SITE_NAME)) } catch (e: IllegalArgumentException) { Timber.e("Error setting site to ${BuildConfig.DD_SITE_NAME}") } diff --git a/sample/kotlin/src/main/kotlin/com/datadog/android/sample/webview/DatadogSiteExt.kt b/sample/kotlin/src/main/kotlin/com/datadog/android/sample/webview/FlashcatSiteExt.kt similarity index 55% rename from sample/kotlin/src/main/kotlin/com/datadog/android/sample/webview/DatadogSiteExt.kt rename to sample/kotlin/src/main/kotlin/com/datadog/android/sample/webview/FlashcatSiteExt.kt index 4f98c094ba..f525325f42 100644 --- a/sample/kotlin/src/main/kotlin/com/datadog/android/sample/webview/DatadogSiteExt.kt +++ b/sample/kotlin/src/main/kotlin/com/datadog/android/sample/webview/FlashcatSiteExt.kt @@ -6,31 +6,24 @@ package com.datadog.android.sample.webview -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.sample.BuildConfig import timber.log.Timber internal val BROWSER_SITE: String get() { return try { - DatadogSite.valueOf(BuildConfig.DD_SITE_NAME) + FlashcatSite.valueOf(BuildConfig.DD_SITE_NAME) } catch (e: IllegalArgumentException) { Timber.e("Error setting site to ${BuildConfig.DD_SITE_NAME}") null }.browserSite() } -private fun DatadogSite?.browserSite(): String { +private fun FlashcatSite?.browserSite(): String { return when (this) { - DatadogSite.US1, - DatadogSite.STAGING, - null -> "datadoghq.com" - - DatadogSite.US3 -> "us3.datadoghq.com" - DatadogSite.US5 -> "us5.datadoghq.com" - DatadogSite.EU1 -> "datadoghq.eu" - DatadogSite.AP1 -> "ap1.datadoghq.com" - DatadogSite.AP2 -> "ap2.datadoghq.com" - DatadogSite.US1_FED -> "ddog-gov.com" + FlashcatSite.CN, + FlashcatSite.STAGING, + null -> "flashcat.cloud" } } diff --git a/sample/tv/src/main/java/com/datadog/android/tv/sample/TvSampleApplication.kt b/sample/tv/src/main/java/com/datadog/android/tv/sample/TvSampleApplication.kt index a497d21635..3dec085545 100644 --- a/sample/tv/src/main/java/com/datadog/android/tv/sample/TvSampleApplication.kt +++ b/sample/tv/src/main/java/com/datadog/android/tv/sample/TvSampleApplication.kt @@ -9,7 +9,7 @@ package com.datadog.android.tv.sample import android.app.Application import android.util.Log import com.datadog.android.Datadog -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.core.configuration.BatchSize import com.datadog.android.core.configuration.Configuration import com.datadog.android.core.configuration.UploadFrequency @@ -99,7 +99,7 @@ class TvSampleApplication : Application() { env = "test", variant = "" ) - .useSite(DatadogSite.US1) + .useSite(FlashcatSite.CN) .setBatchSize(BatchSize.SMALL) .setUploadFrequency(UploadFrequency.FREQUENT) .build() diff --git a/sample/vendor-lib/src/main/kotlin/com/datadog/android/vendor/sample/LocalServer.kt b/sample/vendor-lib/src/main/kotlin/com/datadog/android/vendor/sample/LocalServer.kt index 07f37a4563..039ffe35a0 100644 --- a/sample/vendor-lib/src/main/kotlin/com/datadog/android/vendor/sample/LocalServer.kt +++ b/sample/vendor-lib/src/main/kotlin/com/datadog/android/vendor/sample/LocalServer.kt @@ -9,7 +9,7 @@ package com.datadog.android.vendor.sample import android.content.Context import android.util.Log import com.datadog.android.Datadog -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.core.configuration.BatchSize import com.datadog.android.core.configuration.Configuration import com.datadog.android.core.configuration.UploadFrequency @@ -60,7 +60,7 @@ public class LocalServer { env = "prod", service = SERVICE_NAME ) - .useSite(DatadogSite.US1) + .useSite(FlashcatSite.CN) .setBatchSize(BatchSize.SMALL) .setUploadFrequency(UploadFrequency.FREQUENT) .build() diff --git a/sample/wear/src/main/java/com/datadog/android/wear/sample/WearApplication.kt b/sample/wear/src/main/java/com/datadog/android/wear/sample/WearApplication.kt index 75888f5d84..2938a2c5ff 100644 --- a/sample/wear/src/main/java/com/datadog/android/wear/sample/WearApplication.kt +++ b/sample/wear/src/main/java/com/datadog/android/wear/sample/WearApplication.kt @@ -9,7 +9,7 @@ package com.datadog.android.wear.sample import android.app.Application import android.util.Log import com.datadog.android.Datadog -import com.datadog.android.DatadogSite +import com.datadog.android.FlashcatSite import com.datadog.android.core.configuration.Configuration import com.datadog.android.log.Logs import com.datadog.android.log.LogsConfiguration @@ -104,7 +104,7 @@ class WearApplication : Application() { ) try { - configBuilder.useSite(DatadogSite.valueOf(BuildConfig.DD_SITE_NAME)) + configBuilder.useSite(FlashcatSite.valueOf(BuildConfig.DD_SITE_NAME)) } catch (e: IllegalArgumentException) { Timber.e("Error setting site to ${BuildConfig.DD_SITE_NAME}") } From 3f5cec6112368945d38797a1a7d611d9c8d9b564 Mon Sep 17 00:00:00 2001 From: Fiona Date: Fri, 23 Jan 2026 22:56:59 +0800 Subject: [PATCH 4/6] chore: configure SDK v0.3.0 release settings - Exclude logs, flags, session-replay modules from publishing - Update version to 0.3.0 with dynamic versioning from git tags - Add JVM --add-opens for java.lang.invoke to fix JDK 17+ reflection - Comment out excluded module dependencies in samples and integration tests - Exclude sample projects from build (depend on removed features) --- .github/workflows/publish-maven.yml | 2 +- .../datadog/gradle/config/AndroidConfig.kt | 38 ++++- .../com/datadog/gradle/config/JUnitConfig.kt | 3 +- .../build.gradle.kts | 10 +- .../dd-sdk-android-flags/build.gradle.kts | 10 +- features/dd-sdk-android-logs/build.gradle.kts | 10 +- .../build.gradle.kts | 8 +- .../build.gradle.kts | 8 +- .../build.gradle.kts | 10 +- instrumented/integration/build.gradle.kts | 4 +- sample/automotive/build.gradle.kts | 2 +- .../automotive/SampleAutoApplication.kt | 8 +- .../datadog/sample/automotive/SharedLogger.kt | 9 +- sample/benchmark/build.gradle.kts | 8 +- sample/kotlin/build.gradle.kts | 16 +- .../android/sample/SampleApplication.kt | 159 ++++-------------- sample/tv/build.gradle.kts | 8 +- .../android/tv/sample/TvSampleApplication.kt | 28 +-- sample/vendor-lib/build.gradle.kts | 2 +- .../android/vendor/sample/LocalServer.kt | 26 +-- sample/wear/build.gradle.kts | 2 +- .../android/wear/sample/WearApplication.kt | 6 +- settings.gradle.kts | 32 ++-- 23 files changed, 182 insertions(+), 227 deletions(-) diff --git a/.github/workflows/publish-maven.yml b/.github/workflows/publish-maven.yml index 0c79e1cd68..5f8152a5a1 100644 --- a/.github/workflows/publish-maven.yml +++ b/.github/workflows/publish-maven.yml @@ -43,7 +43,7 @@ jobs: run: ./gradlew clean assembleRelease --stacktrace - name: Run tests - run: ./gradlew clean testReleaseUnitTest --stacktrace + run: ./gradlew testReleaseUnitTest --stacktrace - name: Stop Gradle Daemon run: ./gradlew --stop diff --git a/buildSrc/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt b/buildSrc/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt index 76ab413427..e866a67464 100644 --- a/buildSrc/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt +++ b/buildSrc/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt @@ -20,7 +20,43 @@ object AndroidConfig { const val MIN_SDK_FOR_AUTO = 29 const val BUILD_TOOLS_VERSION = "36.0.0" - val VERSION = Version(3, 6, 0, Version.Type.Snapshot) + /** + * Determine version based on CI environment variables (GitHub Actions) + * - Tag (GITHUB_REF_TYPE == "tag") → Release version parsed from tag (e.g., v0.3.0 -> 0.3.0) + * - publish-new branch → Snapshot version (e.g., 0.3.0-SNAPSHOT) + * - Other → Default snapshot version for local development + */ + val VERSION = determineVersion() + + private fun determineVersion(): Version { + // Check GitHub Actions variables + val githubRefType = System.getenv("GITHUB_REF_TYPE") + val githubRefName = System.getenv("GITHUB_REF_NAME") + + return when { + // GitHub Actions: ref type is tag and ref name starts with 'v' + githubRefType == "tag" && githubRefName?.startsWith("v") == true -> { + parseVersionFromTag(githubRefName) + } + // Local development or other branches → Snapshot + else -> { + Version(0, 3, 0, Version.Type.Snapshot) + } + } + } + + private fun parseVersionFromTag(tag: String): Version { + // Remove 'v' prefix if present (e.g., v0.3.0 -> 0.3.0) + val versionString = tag.removePrefix("v").trim() + val parts = versionString.split(".") + + return Version( + major = parts.getOrNull(0)?.toIntOrNull() ?: 0, + minor = parts.getOrNull(1)?.toIntOrNull() ?: 0, + hotfix = parts.getOrNull(2)?.toIntOrNull() ?: 0, + type = Version.Type.Release + ) + } } // TODO RUM-628 Switch to Java 17 bytecode diff --git a/buildSrc/src/main/kotlin/com/datadog/gradle/config/JUnitConfig.kt b/buildSrc/src/main/kotlin/com/datadog/gradle/config/JUnitConfig.kt index ae79bdb1b5..228b6647b5 100644 --- a/buildSrc/src/main/kotlin/com/datadog/gradle/config/JUnitConfig.kt +++ b/buildSrc/src/main/kotlin/com/datadog/gradle/config/JUnitConfig.kt @@ -14,7 +14,8 @@ fun Project.junitConfig() { tasks.withType().configureEach { jvmArgs( "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED", - "--add-opens=java.base/java.util.concurrent=ALL-UNNAMED" + "--add-opens=java.base/java.util.concurrent=ALL-UNNAMED", + "--add-opens=java.base/java.lang.invoke=ALL-UNNAMED" ) useJUnitPlatform { includeEngines("spek", "junit-jupiter", "junit-vintage") diff --git a/features/dd-sdk-android-flags-openfeature/build.gradle.kts b/features/dd-sdk-android-flags-openfeature/build.gradle.kts index 8ad3473ae7..3f245e21b1 100644 --- a/features/dd-sdk-android-flags-openfeature/build.gradle.kts +++ b/features/dd-sdk-android-flags-openfeature/build.gradle.kts @@ -78,8 +78,10 @@ androidLibraryConfig() junitConfig() javadocConfig() dependencyUpdateConfig() -publishingConfig( - "OpenFeature Provider integration for the Datadog Feature Flags " + - "library for Android applications." -) +/* +// publishingConfig( +// "OpenFeature Provider integration for the Datadog Feature Flags " + +// "library for Android applications." +// ) +*/ detektCustomConfig() diff --git a/features/dd-sdk-android-flags/build.gradle.kts b/features/dd-sdk-android-flags/build.gradle.kts index 0af2d5c3c0..b1dfe40548 100644 --- a/features/dd-sdk-android-flags/build.gradle.kts +++ b/features/dd-sdk-android-flags/build.gradle.kts @@ -85,8 +85,10 @@ androidLibraryConfig() junitConfig() javadocConfig() dependencyUpdateConfig() -publishingConfig( - "The Feature Flags integration feature to use with the Datadog monitoring " + - "library for Android applications." -) +/* +// publishingConfig( +// "The Feature Flags integration feature to use with the Datadog monitoring " + +// "library for Android applications." +// ) +*/ detektCustomConfig() diff --git a/features/dd-sdk-android-logs/build.gradle.kts b/features/dd-sdk-android-logs/build.gradle.kts index be802a3fff..c3c3bea28c 100644 --- a/features/dd-sdk-android-logs/build.gradle.kts +++ b/features/dd-sdk-android-logs/build.gradle.kts @@ -84,8 +84,10 @@ androidLibraryConfig() junitConfig() javadocConfig() dependencyUpdateConfig() -publishingConfig( - "The Logs feature to use with the Datadog monitoring " + - "library for Android applications." -) +/* +// publishingConfig( +// "The Logs feature to use with the Datadog monitoring " + +// "library for Android applications." +// ) +*/ detektCustomConfig() diff --git a/features/dd-sdk-android-session-replay-compose/build.gradle.kts b/features/dd-sdk-android-session-replay-compose/build.gradle.kts index ab6f0501a3..3046756b53 100644 --- a/features/dd-sdk-android-session-replay-compose/build.gradle.kts +++ b/features/dd-sdk-android-session-replay-compose/build.gradle.kts @@ -83,7 +83,9 @@ androidLibraryConfig() junitConfig() javadocConfig() dependencyUpdateConfig() -publishingConfig( - "Session Replay Extension Support for Jetpack Compose." -) +/* +// publishingConfig( +// "Session Replay Extension Support for Jetpack Compose." +// ) +*/ detektCustomConfig() diff --git a/features/dd-sdk-android-session-replay-material/build.gradle.kts b/features/dd-sdk-android-session-replay-material/build.gradle.kts index 38a359811e..bc8745ff50 100644 --- a/features/dd-sdk-android-session-replay-material/build.gradle.kts +++ b/features/dd-sdk-android-session-replay-material/build.gradle.kts @@ -68,7 +68,9 @@ androidLibraryConfig() junitConfig() javadocConfig() dependencyUpdateConfig() -publishingConfig( - "Session Replay Extension Support for Material UI components." -) +/* +// publishingConfig( +// "Session Replay Extension Support for Material UI components." +// ) +*/ detektCustomConfig() diff --git a/features/dd-sdk-android-session-replay/build.gradle.kts b/features/dd-sdk-android-session-replay/build.gradle.kts index 2e4eb06efa..bc3fd8f847 100644 --- a/features/dd-sdk-android-session-replay/build.gradle.kts +++ b/features/dd-sdk-android-session-replay/build.gradle.kts @@ -87,8 +87,10 @@ androidLibraryConfig() junitConfig() javadocConfig() dependencyUpdateConfig() -publishingConfig( - "The Session Replay feature to use with the Datadog monitoring " + - "library for Android applications." -) +/* +// publishingConfig( +// "The Session Replay feature to use with the Datadog monitoring " + +// "library for Android applications." +// ) +*/ detektCustomConfig() diff --git a/instrumented/integration/build.gradle.kts b/instrumented/integration/build.gradle.kts index 3e1f8bd950..f9af0c9034 100644 --- a/instrumented/integration/build.gradle.kts +++ b/instrumented/integration/build.gradle.kts @@ -91,8 +91,8 @@ dependencies { if (project.hasProperty(com.datadog.gradle.Properties.USE_DESUGARING)) { coreLibraryDesugaring(libs.androidDesugaringSdk) } - implementation(project(":features:dd-sdk-android-session-replay")) - implementation(project(":features:dd-sdk-android-logs")) + // implementation(project(":features:dd-sdk-android-session-replay")) + // implementation(project(":features:dd-sdk-android-logs")) implementation(project(":features:dd-sdk-android-trace")) implementation(project(":features:dd-sdk-android-rum")) implementation(project(":dd-sdk-android-internal")) diff --git a/sample/automotive/build.gradle.kts b/sample/automotive/build.gradle.kts index 84f8409c1c..d9882f561e 100644 --- a/sample/automotive/build.gradle.kts +++ b/sample/automotive/build.gradle.kts @@ -59,7 +59,7 @@ android { dependencies { // Datadog Libraries - implementation(project(":features:dd-sdk-android-logs")) + // implementation(project(":features:dd-sdk-android-logs")) implementation(project(":features:dd-sdk-android-rum")) implementation(libs.kotlin) diff --git a/sample/automotive/src/main/java/com/datadog/sample/automotive/SampleAutoApplication.kt b/sample/automotive/src/main/java/com/datadog/sample/automotive/SampleAutoApplication.kt index f2144718ca..97f8401de3 100644 --- a/sample/automotive/src/main/java/com/datadog/sample/automotive/SampleAutoApplication.kt +++ b/sample/automotive/src/main/java/com/datadog/sample/automotive/SampleAutoApplication.kt @@ -13,8 +13,8 @@ import com.datadog.android.FlashcatSite import com.datadog.android.core.configuration.BatchSize import com.datadog.android.core.configuration.Configuration import com.datadog.android.core.configuration.UploadFrequency -import com.datadog.android.log.Logs -import com.datadog.android.log.LogsConfiguration +// import com.datadog.android.log.Logs +// import com.datadog.android.log.LogsConfiguration import com.datadog.android.privacy.TrackingConsent import com.datadog.android.rum.GlobalRumMonitor import com.datadog.android.rum.Rum @@ -40,8 +40,8 @@ class SampleAutoApplication : Application() { val rumConfig = createRumConfiguration() Rum.enable(rumConfig) - val logsConfig = LogsConfiguration.Builder().build() - Logs.enable(logsConfig) + // val logsConfig = LogsConfiguration.Builder().build() + // Logs.enable(logsConfig) GlobalRumMonitor.get().debug = true } diff --git a/sample/automotive/src/main/java/com/datadog/sample/automotive/SharedLogger.kt b/sample/automotive/src/main/java/com/datadog/sample/automotive/SharedLogger.kt index e5fceddaa0..9168f8f1ab 100644 --- a/sample/automotive/src/main/java/com/datadog/sample/automotive/SharedLogger.kt +++ b/sample/automotive/src/main/java/com/datadog/sample/automotive/SharedLogger.kt @@ -6,14 +6,15 @@ package com.datadog.sample.automotive -import com.datadog.android.log.Logger +// import com.datadog.android.log.Logger @Suppress("UndocumentedPublicClass") object SharedLogger { @Suppress("UndocumentedPublicProperty") val logger by lazy { - Logger.Builder() - .setLogcatLogsEnabled(true) - .build() + // Logger.Builder() + // .setLogcatLogsEnabled(true) + // .build() + null } } diff --git a/sample/benchmark/build.gradle.kts b/sample/benchmark/build.gradle.kts index 737853f1ec..e47fcc1f7d 100644 --- a/sample/benchmark/build.gradle.kts +++ b/sample/benchmark/build.gradle.kts @@ -104,15 +104,15 @@ dependencies { implementation(libs.coroutinesCore) implementation(libs.bundles.ktorClient) implementation(libs.kotlinxSerializationJson) - implementation(project(":features:dd-sdk-android-logs")) + // implementation(project(":features:dd-sdk-android-logs")) implementation(project(":features:dd-sdk-android-rum")) implementation(project(":features:dd-sdk-android-trace")) implementation(project(":features:dd-sdk-android-trace-otel")) implementation(project(":features:dd-sdk-android-ndk")) implementation(project(":features:dd-sdk-android-webview")) - implementation(project(":features:dd-sdk-android-session-replay")) - implementation(project(":features:dd-sdk-android-session-replay-material")) - implementation(project(":features:dd-sdk-android-session-replay-compose")) + // implementation(project(":features:dd-sdk-android-session-replay")) + // implementation(project(":features:dd-sdk-android-session-replay-material")) + // implementation(project(":features:dd-sdk-android-session-replay-compose")) implementation(project(":integrations:dd-sdk-android-compose")) implementation(project(":integrations:dd-sdk-android-glide")) implementation(project(":integrations:dd-sdk-android-okhttp")) diff --git a/sample/kotlin/build.gradle.kts b/sample/kotlin/build.gradle.kts index fbab8b7d2d..82343a1c16 100644 --- a/sample/kotlin/build.gradle.kts +++ b/sample/kotlin/build.gradle.kts @@ -149,23 +149,23 @@ datadog { dependencies { // Datadog Libraries - implementation(project(":features:dd-sdk-android-logs")) - implementation(project(":features:dd-sdk-android-flags")) - implementation(project(":features:dd-sdk-android-flags-openfeature")) + // implementation(project(":features:dd-sdk-android-logs")) + // implementation(project(":features:dd-sdk-android-flags")) + // implementation(project(":features:dd-sdk-android-flags-openfeature")) implementation(project(":features:dd-sdk-android-rum")) implementation(project(":features:dd-sdk-android-rum-debug-widget")) implementation(project(":features:dd-sdk-android-trace")) implementation(project(":features:dd-sdk-android-trace-otel")) implementation(project(":features:dd-sdk-android-ndk")) implementation(project(":features:dd-sdk-android-webview")) - implementation(project(":features:dd-sdk-android-session-replay")) - implementation(project(":features:dd-sdk-android-session-replay-material")) - implementation(project(":features:dd-sdk-android-session-replay-compose")) + // implementation(project(":features:dd-sdk-android-session-replay")) + // implementation(project(":features:dd-sdk-android-session-replay-material")) + // implementation(project(":features:dd-sdk-android-session-replay-compose")) implementation(project(":features:dd-sdk-android-profiling")) implementation(project(":integrations:dd-sdk-android-trace-coroutines")) implementation(project(":integrations:dd-sdk-android-rum-coroutines")) implementation(project(":integrations:dd-sdk-android-rx")) - implementation(project(":integrations:dd-sdk-android-timber")) + // implementation(project(":integrations:dd-sdk-android-timber")) implementation(project(":integrations:dd-sdk-android-coil")) implementation(project(":integrations:dd-sdk-android-coil3")) implementation(project(":integrations:dd-sdk-android-glide")) @@ -181,7 +181,7 @@ dependencies { coreLibraryDesugaring(libs.androidDesugaringSdk) // Sample Vendor Library - implementation(project(":sample:vendor-lib")) + // implementation(project(":sample:vendor-lib")) implementation(libs.kotlin) diff --git a/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt b/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt index 6dc2afa2b5..edf26be4a2 100644 --- a/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt +++ b/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt @@ -19,14 +19,14 @@ import com.datadog.android.core.configuration.BackPressureStrategy import com.datadog.android.core.configuration.BatchSize import com.datadog.android.core.configuration.Configuration import com.datadog.android.core.configuration.UploadFrequency -import com.datadog.android.flags.Flags -import com.datadog.android.flags.FlagsClient -import com.datadog.android.flags.FlagsConfiguration -import com.datadog.android.flags.openfeature.asOpenFeatureProvider +// import com.datadog.android.flags.Flags +// import com.datadog.android.flags.FlagsClient +// import com.datadog.android.flags.FlagsConfiguration +// import com.datadog.android.flags.openfeature.asOpenFeatureProvider import com.datadog.android.insights.enableRumDebugWidget -import com.datadog.android.log.Logger -import com.datadog.android.log.Logs -import com.datadog.android.log.LogsConfiguration +// import com.datadog.android.log.Logger +// import com.datadog.android.log.Logs +// import com.datadog.android.log.LogsConfiguration import com.datadog.android.ndk.NdkCrashReports import com.datadog.android.okhttp.DatadogEventListener import com.datadog.android.okhttp.DatadogInterceptor @@ -47,15 +47,15 @@ import com.datadog.android.sample.picture.CoilImageLoader import com.datadog.android.sample.picture.FrescoImageLoader import com.datadog.android.sample.picture.PicassoImageLoader import com.datadog.android.sample.user.UserFragment -import com.datadog.android.sessionreplay.ImagePrivacy -import com.datadog.android.sessionreplay.SessionReplay -import com.datadog.android.sessionreplay.SessionReplayConfiguration -import com.datadog.android.sessionreplay.SessionReplayPrivacy -import com.datadog.android.sessionreplay.SystemRequirementsConfiguration -import com.datadog.android.sessionreplay.TextAndInputPrivacy -import com.datadog.android.sessionreplay.TouchPrivacy -import com.datadog.android.sessionreplay.compose.ComposeExtensionSupport -import com.datadog.android.sessionreplay.material.MaterialExtensionSupport +// import com.datadog.android.sessionreplay.ImagePrivacy +// import com.datadog.android.sessionreplay.SessionReplay +// import com.datadog.android.sessionreplay.SessionReplayConfiguration +// import com.datadog.android.sessionreplay.SessionReplayPrivacy +// import com.datadog.android.sessionreplay.SystemRequirementsConfiguration +// import com.datadog.android.sessionreplay.TextAndInputPrivacy +// import com.datadog.android.sessionreplay.TouchPrivacy +// import com.datadog.android.sessionreplay.compose.ComposeExtensionSupport +// import com.datadog.android.sessionreplay.material.MaterialExtensionSupport import com.datadog.android.timber.DatadogTree import com.datadog.android.trace.DatadogTracing import com.datadog.android.trace.GlobalDatadogTracer @@ -169,8 +169,8 @@ class SampleApplication : Application() { preferences.getTrackingConsent() ) - initializeSessionReplay() - initializeLogs() + // initializeSessionReplay() + // initializeLogs() initializeTraces() NdkCrashReports.enable() @@ -180,7 +180,7 @@ class SampleApplication : Application() { Rum.enable(createRumConfiguration()) - initializeFlags() + // initializeFlags() GlobalRumMonitor.get().debug = true @@ -237,71 +237,13 @@ class SampleApplication : Application() { ) } + /* private fun initializeFlags() { - // Enable Datadog Flags feature - val flagsConfig = FlagsConfiguration.Builder().build() - Flags.enable(flagsConfig) - - // Create FlagsClient and convert to OpenFeature provider - val flagsClient = FlagsClient.Builder().build() - val provider = flagsClient.asOpenFeatureProvider() - - // Set as OpenFeature provider - OpenFeatureAPI.setProvider(provider) - - // Set evaluation context on OpenFeatureAPI (provider forwards to FlagsClient) - val preferences = Preferences.defaultPreferences(this) - val userId = preferences.getUserId()?.takeIf { it.isNotBlank() } ?: UUID.randomUUID().toString() - val attributes = buildMap { - put("userId", Value.String(userId)) - preferences.getUserName()?.takeIf { it.isNotBlank() }?.let { - put("userName", Value.String(it)) - } - preferences.getUserEmail()?.takeIf { it.isNotBlank() }?.let { - put("userEmail", Value.String(it)) - } - } - - // Setting a blank targeting key results in all users being assigned the same bucket where randomization occurs. - val context = ImmutableContext( - targetingKey = userId, - attributes = attributes - ) - OpenFeatureAPI.setEvaluationContext(context) - - // Observe OpenFeature provider state changes - applicationScope.launch { - provider.observe() - .catch { error -> - GlobalRumMonitor.get().addError( - "OpenFeature observer error", - RumErrorSource.SOURCE, - error, - mapOf("component" to "openfeature-observer") - ) - } - .collect { event -> - // Track provider errors in RUM - when (event) { - is OpenFeatureProviderEvents.ProviderError -> { - GlobalRumMonitor.get().addError( - "OpenFeature provider error", - RumErrorSource.SOURCE, - null, - mapOf( - "error" to event.error.toString(), - "component" to "openfeature-provider" - ) - ) - } - else -> { - // Ignore other events (UI handles state display) - } - } - } - } + // ... (all flags init code) } + */ + /* private fun initializeLogs() { val logsConfig = LogsConfiguration.Builder().apply { if (BuildConfig.DD_OVERRIDE_LOGS_URL.isNotBlank()) { @@ -310,32 +252,13 @@ class SampleApplication : Application() { }.build() Logs.enable(logsConfig) } + */ + /* private fun initializeSessionReplay() { - val shouldUseFgm = SecureRandom().nextInt(100) < USE_FGM_PCT - val systemRequirementsConfiguration = SystemRequirementsConfiguration.Builder() - .setMinRAMSizeMb(1024) - .setMinCPUCoreNumber(1) - .build() - - val sessionReplayConfig = SessionReplayConfiguration.Builder(SAMPLE_IN_ALL_SESSIONS) - .apply { - if (BuildConfig.DD_OVERRIDE_SESSION_REPLAY_URL.isNotBlank()) { - useCustomEndpoint(BuildConfig.DD_OVERRIDE_SESSION_REPLAY_URL) - } - - if (shouldUseFgm) { - useFgmConfiguration(this) - } else { - useLegacyConfiguration(this) - } - } - .addExtensionSupport(MaterialExtensionSupport()) - .addExtensionSupport(ComposeExtensionSupport()) - .setSystemRequirements(systemRequirementsConfiguration) - .build() - SessionReplay.enable(sessionReplayConfig) + // ... (SR init code) } + */ private fun useFgmConfiguration(builder: SessionReplayConfiguration.Builder) { val shouldMaskAll = SecureRandom().nextInt(100) < MASK_SESSION_PCT // 25% @@ -459,33 +382,11 @@ class SampleApplication : Application() { } @Suppress("TooGenericExceptionCaught", "CheckInternal") + /* private fun initializeTimber() { - val logger = Logger.Builder() - .setName("timber") - .setNetworkInfoEnabled(true) - .build() - - val device = JsonObject() - val abis = JsonArray() - try { - device.addProperty("api", Build.VERSION.SDK_INT) - device.addProperty("brand", Build.BRAND) - device.addProperty("manufacturer", Build.MANUFACTURER) - device.addProperty("model", Build.MODEL) - for (abi in Build.SUPPORTED_ABIS) { - abis.add(abi) - } - } catch (t: Throwable) { - Timber.e(t, "Error setting device and abi properties") - } - logger.addAttribute("device", device) - logger.addAttribute("supported_abis", abis) - - logger.addTag("flavor", BuildConfig.FLAVOR) - logger.addTag("build_type", BuildConfig.BUILD_TYPE) - - Timber.plant(DatadogTree(logger)) + // ... (timber init code) } + */ companion object { private const val USE_FGM_PCT = 10 diff --git a/sample/tv/build.gradle.kts b/sample/tv/build.gradle.kts index 56738799fb..b72ce46864 100644 --- a/sample/tv/build.gradle.kts +++ b/sample/tv/build.gradle.kts @@ -74,11 +74,11 @@ dependencies { implementation(project(":dd-sdk-android-core")) implementation(project(":features:dd-sdk-android-rum")) - implementation(project(":features:dd-sdk-android-logs")) - implementation(project(":features:dd-sdk-android-session-replay")) - implementation(project(":features:dd-sdk-android-session-replay-material")) + // implementation(project(":features:dd-sdk-android-logs")) + // implementation(project(":features:dd-sdk-android-session-replay")) + // implementation(project(":features:dd-sdk-android-session-replay-material")) implementation(project(":integrations:dd-sdk-android-okhttp")) - implementation(project(":integrations:dd-sdk-android-timber")) + // implementation(project(":integrations:dd-sdk-android-timber")) implementation(project(":integrations:dd-sdk-android-tv")) implementation(libs.kotlin) diff --git a/sample/tv/src/main/java/com/datadog/android/tv/sample/TvSampleApplication.kt b/sample/tv/src/main/java/com/datadog/android/tv/sample/TvSampleApplication.kt index 3dec085545..e0205372f6 100644 --- a/sample/tv/src/main/java/com/datadog/android/tv/sample/TvSampleApplication.kt +++ b/sample/tv/src/main/java/com/datadog/android/tv/sample/TvSampleApplication.kt @@ -14,9 +14,9 @@ import com.datadog.android.core.configuration.BatchSize import com.datadog.android.core.configuration.Configuration import com.datadog.android.core.configuration.UploadFrequency import com.datadog.android.core.sampling.RateBasedSampler -import com.datadog.android.log.Logger -import com.datadog.android.log.Logs -import com.datadog.android.log.LogsConfiguration +// import com.datadog.android.log.Logger +// import com.datadog.android.log.Logs +// import com.datadog.android.log.LogsConfiguration import com.datadog.android.okhttp.DatadogEventListener import com.datadog.android.okhttp.DatadogInterceptor import com.datadog.android.okhttp.trace.TracingInterceptor @@ -25,13 +25,13 @@ import com.datadog.android.rum.GlobalRumMonitor import com.datadog.android.rum.Rum import com.datadog.android.rum.RumConfiguration import com.datadog.android.rum.tracking.ActivityViewTrackingStrategy -import com.datadog.android.sessionreplay.ImagePrivacy -import com.datadog.android.sessionreplay.SessionReplay -import com.datadog.android.sessionreplay.SessionReplayConfiguration -import com.datadog.android.sessionreplay.SystemRequirementsConfiguration -import com.datadog.android.sessionreplay.TextAndInputPrivacy -import com.datadog.android.sessionreplay.TouchPrivacy -import com.datadog.android.sessionreplay.material.MaterialExtensionSupport +// import com.datadog.android.sessionreplay.ImagePrivacy +// import com.datadog.android.sessionreplay.SessionReplay +// import com.datadog.android.sessionreplay.SessionReplayConfiguration +// import com.datadog.android.sessionreplay.SystemRequirementsConfiguration +// import com.datadog.android.sessionreplay.TextAndInputPrivacy +// import com.datadog.android.sessionreplay.TouchPrivacy +// import com.datadog.android.sessionreplay.material.MaterialExtensionSupport import com.datadog.android.timber.DatadogTree import com.datadog.android.tv.sample.net.OkHttpDownloader import okhttp3.OkHttpClient @@ -64,11 +64,11 @@ class TvSampleApplication : Application() { val rumConfig = createRumConfiguration() Rum.enable(rumConfig) - val logsConfig = LogsConfiguration.Builder().build() - Logs.enable(logsConfig) + // val logsConfig = LogsConfiguration.Builder().build() + // Logs.enable(logsConfig) - val sessionReplayConfig = createSessionReplayConfiguration() - SessionReplay.enable(sessionReplayConfig) + // val sessionReplayConfig = createSessionReplayConfiguration() + // SessionReplay.enable(sessionReplayConfig) GlobalRumMonitor.get().debug = true } diff --git a/sample/vendor-lib/build.gradle.kts b/sample/vendor-lib/build.gradle.kts index 317cade45c..e375dafb4c 100644 --- a/sample/vendor-lib/build.gradle.kts +++ b/sample/vendor-lib/build.gradle.kts @@ -70,7 +70,7 @@ android { dependencies { - implementation(project(":features:dd-sdk-android-logs")) + // implementation(project(":features:dd-sdk-android-logs")) implementation(project(":features:dd-sdk-android-trace")) implementation(project(":features:dd-sdk-android-trace-otel")) implementation(project(":integrations:dd-sdk-android-okhttp")) diff --git a/sample/vendor-lib/src/main/kotlin/com/datadog/android/vendor/sample/LocalServer.kt b/sample/vendor-lib/src/main/kotlin/com/datadog/android/vendor/sample/LocalServer.kt index 039ffe35a0..f46e73a32d 100644 --- a/sample/vendor-lib/src/main/kotlin/com/datadog/android/vendor/sample/LocalServer.kt +++ b/sample/vendor-lib/src/main/kotlin/com/datadog/android/vendor/sample/LocalServer.kt @@ -13,9 +13,9 @@ import com.datadog.android.FlashcatSite import com.datadog.android.core.configuration.BatchSize import com.datadog.android.core.configuration.Configuration import com.datadog.android.core.configuration.UploadFrequency -import com.datadog.android.log.Logger -import com.datadog.android.log.Logs -import com.datadog.android.log.LogsConfiguration +// import com.datadog.android.log.Logger +// import com.datadog.android.log.Logs +// import com.datadog.android.log.LogsConfiguration import com.datadog.android.privacy.TrackingConsent import com.datadog.android.trace.Trace import com.datadog.android.trace.TraceConfiguration @@ -75,15 +75,15 @@ public class LocalServer { instance.setUserInfo(id = context.packageName) instance.setAccountInfo(id = context.packageName) - val logsConfig = LogsConfiguration.Builder() - .build() - Logs.enable(logsConfig, instance) + // val logsConfig = LogsConfiguration.Builder() + // .build() + // Logs.enable(logsConfig, instance) val tracesConfig = TraceConfiguration.Builder().build() Trace.enable(tracesConfig) - logger = Logger.Builder(instance) - .setLogcatLogsEnabled(true) - .build() + // logger = Logger.Builder(instance) + // .setLogcatLogsEnabled(true) + // .build() } /** @@ -92,7 +92,7 @@ public class LocalServer { */ @Suppress("MagicNumber") fun start(redirectedUrl: String) { - logger.i("Starting the server") + // logger.i("Starting the server") engine = embeddedServer(Netty, PORT) { val tracerProvider = OtelTracerProvider.Builder().setService(SERVICE_NAME).build() val tracer = tracerProvider.get("ktor") @@ -101,6 +101,7 @@ public class LocalServer { install(SSE) routing { get(GET_PATH) { + /* logger.i( "Redirecting request", attributes = mapOf( @@ -108,6 +109,7 @@ public class LocalServer { "redirection.to" to redirectedUrl ) ) + */ val redirectSpan = tracer.spanBuilder("redirect").startSpan() redirectSpan.setAttribute("redirection.from", LOCAL_URL) redirectSpan.setAttribute("redirection.to", redirectedUrl) @@ -134,10 +136,10 @@ public class LocalServer { * Stop the redirection. */ fun stop() { - logger.i("Stopping the server") + // logger.i("Stopping the server") Thread { engine?.stop(SHUTDOWN_MS, STOP_TIMEOUT_MS) - logger.i("Server stopped") + // logger.i("Server stopped") }.start() } diff --git a/sample/wear/build.gradle.kts b/sample/wear/build.gradle.kts index eb9b8a84c0..447759385f 100644 --- a/sample/wear/build.gradle.kts +++ b/sample/wear/build.gradle.kts @@ -69,7 +69,7 @@ dependencies { implementation(project(":features:dd-sdk-android-ndk")) implementation(project(":features:dd-sdk-android-rum")) - implementation(project(":features:dd-sdk-android-logs")) + // implementation(project(":features:dd-sdk-android-logs")) implementation(project(":features:dd-sdk-android-trace")) implementation(project(":features:dd-sdk-android-trace-otel")) diff --git a/sample/wear/src/main/java/com/datadog/android/wear/sample/WearApplication.kt b/sample/wear/src/main/java/com/datadog/android/wear/sample/WearApplication.kt index 2938a2c5ff..5291f94516 100644 --- a/sample/wear/src/main/java/com/datadog/android/wear/sample/WearApplication.kt +++ b/sample/wear/src/main/java/com/datadog/android/wear/sample/WearApplication.kt @@ -11,8 +11,8 @@ import android.util.Log import com.datadog.android.Datadog import com.datadog.android.FlashcatSite import com.datadog.android.core.configuration.Configuration -import com.datadog.android.log.Logs -import com.datadog.android.log.LogsConfiguration +// import com.datadog.android.log.Logs +// import com.datadog.android.log.LogsConfiguration import com.datadog.android.privacy.TrackingConsent import com.datadog.android.rum.Rum import com.datadog.android.rum.RumConfiguration @@ -59,6 +59,7 @@ class WearApplication : Application() { .build() ) + /* Logs.enable( LogsConfiguration.Builder() .apply { @@ -68,6 +69,7 @@ class WearApplication : Application() { } .build() ) + */ Trace.enable( TraceConfiguration.Builder() diff --git a/settings.gradle.kts b/settings.gradle.kts index dda7ea6251..42630044d7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,16 +13,16 @@ include(":features:dd-sdk-android-trace-api") include(":features:dd-sdk-android-trace-internal") include(":features:dd-sdk-android-rum") include(":features:dd-sdk-android-rum-debug-widget") -include(":features:dd-sdk-android-logs") +// include(":features:dd-sdk-android-logs") include(":features:dd-sdk-android-ndk") include(":features:dd-sdk-android-trace") include(":features:dd-sdk-android-webview") -include(":features:dd-sdk-android-session-replay") -include(":features:dd-sdk-android-session-replay-compose") -include(":features:dd-sdk-android-session-replay-material") +// include(":features:dd-sdk-android-session-replay") +// include(":features:dd-sdk-android-session-replay-compose") +// include(":features:dd-sdk-android-session-replay-material") include(":features:dd-sdk-android-trace-otel") -include(":features:dd-sdk-android-flags") -include(":features:dd-sdk-android-flags-openfeature") +// include(":features:dd-sdk-android-flags") +// include(":features:dd-sdk-android-flags-openfeature") include(":features:dd-sdk-android-profiling") // INTEGRATION LIBRARIES @@ -35,7 +35,7 @@ include(":integrations:dd-sdk-android-fresco") include(":integrations:dd-sdk-android-glide") include(":integrations:dd-sdk-android-rx") include(":integrations:dd-sdk-android-sqldelight") -include(":integrations:dd-sdk-android-timber") +// include(":integrations:dd-sdk-android-timber") include(":integrations:dd-sdk-android-tv") include(":integrations:dd-sdk-android-okhttp") include(":integrations:dd-sdk-android-okhttp-otel") @@ -47,7 +47,7 @@ include(":reliability:stub-core") include(":reliability:stub-feature") // SINGLE FEATURE INTEGRATION TESTS -include(":reliability:single-fit:logs") +// include(":reliability:single-fit:logs") include(":reliability:single-fit:rum") include(":reliability:single-fit:trace") include(":reliability:single-fit:okhttp") @@ -56,15 +56,15 @@ include(":reliability:single-fit:okhttp") include(":reliability:core-it") // LEGACY TESTS -include(":instrumented:integration") +// include(":instrumented:integration") -// SAMPLE PROJECTS -include(":sample:kotlin") -include(":sample:tv") -include(":sample:wear") -include(":sample:vendor-lib") -include(":sample:benchmark") -include(":sample:automotive") +// SAMPLE PROJECTS (Excluded - depend on removed features) +// include(":sample:kotlin") +// include(":sample:tv") +// include(":sample:wear") +// include(":sample:vendor-lib") +// include(":sample:benchmark") +// include(":sample:automotive") // TOOLCHAIN include(":tools:detekt") From 869baa7877c92d5cbaf7d4f98a3a93e31690635b Mon Sep 17 00:00:00 2001 From: Fiona Date: Mon, 26 Jan 2026 15:37:27 +0800 Subject: [PATCH 5/6] feat: add ding notify --- .github/workflows/publish-maven.yml | 73 +++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 14 deletions(-) diff --git a/.github/workflows/publish-maven.yml b/.github/workflows/publish-maven.yml index 5f8152a5a1..16de6be20a 100644 --- a/.github/workflows/publish-maven.yml +++ b/.github/workflows/publish-maven.yml @@ -72,23 +72,68 @@ jobs: echo "✅ Publishing completed" - - name: Notify on success - if: success() + notify-success: + needs: publish + runs-on: ubuntu-latest + if: success() + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Determine version type + id: version run: | if [[ "${{ github.ref }}" == refs/tags/* ]]; then - echo "✅ Released ${{ github.ref_name }} to Maven Central" - echo "⚠️ Next step: Manually publish in Central Portal:" - echo " https://central.sonatype.com/publishing/deployments" + echo "type=正式版" >> $GITHUB_OUTPUT + echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT else - echo "✅ Published snapshot from ${{ github.ref_name }} branch" - echo "📍 Snapshot repository: https://central.sonatype.com/repository/maven-snapshots/" + echo "type=快照版" >> $GITHUB_OUTPUT + echo "version=${{ github.ref_name }}-SNAPSHOT" >> $GITHUB_OUTPUT fi - - name: Notify on failure - if: failure() + - name: Notify deployment success + uses: zcong1993/actions-ding@master + with: + dingToken: ${{ secrets.DING_TALK_TOKEN }} + secret: ${{ secrets.DING_TALK_SECRET }} + body: | + { + "msgtype": "markdown", + "markdown": { + "title": "fc-sdk-android 发布通知", + "text": "### ✅ fc-sdk-android 发布成功\n\n---\n\n 🔖 版本: ${{ steps.version.outputs.version }}\n\n 📦 类型: ${{ steps.version.outputs.type }}\n\n 👨‍💻 发布者: ${{ github.actor }}\n\n 🚀 [查看详情](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})" + } + } + + notify-failure: + needs: publish + runs-on: ubuntu-latest + if: failure() + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Determine version type + id: version run: | - echo "❌ Publishing failed. Check logs for details." - echo "Common issues:" - echo " - GPG key not properly configured" - echo " - Maven Central credentials incorrect" - echo " - Build or test failures" + if [[ "${{ github.ref }}" == refs/tags/* ]]; then + echo "type=正式版" >> $GITHUB_OUTPUT + echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT + else + echo "type=快照版" >> $GITHUB_OUTPUT + echo "version=${{ github.ref_name }}-SNAPSHOT" >> $GITHUB_OUTPUT + fi + + - name: Notify deployment failure + uses: zcong1993/actions-ding@master + with: + dingToken: ${{ secrets.DING_TALK_TOKEN }} + secret: ${{ secrets.DING_TALK_SECRET }} + body: | + { + "msgtype": "markdown", + "markdown": { + "title": "fc-sdk-android 发布通知", + "text": "### ❌ fc-sdk-android 发布失败\n\n---\n\n 🔖 版本: ${{ steps.version.outputs.version }}\n\n 📦 类型: ${{ steps.version.outputs.type }}\n\n 👨‍💻 发布者: ${{ github.actor }}\n\n 🚀 [查看详情](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})" + } + } From 1b1f4d487b3940b210ef638568986425f296fc2d Mon Sep 17 00:00:00 2001 From: Fiona Date: Mon, 26 Jan 2026 16:31:39 +0800 Subject: [PATCH 6/6] chore: update GitHub Actions trigger branch to publish Update workflows to trigger on the publish branch instead of publish-new: - publish-maven.yml: Change publish trigger branch - codeql-analysis.yml: Change push and pull request target branches --- .github/workflows/codeql-analysis.yml | 4 ++-- .github/workflows/publish-maven.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 448c9d2221..736b1c4f52 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -2,10 +2,10 @@ name: "CodeQL" on: push: - branches: ["publish-new"] + branches: ["publish"] pull_request: # The branches below must be a subset of the branches above - branches: ["publish-new"] + branches: ["publish"] jobs: analyze: diff --git a/.github/workflows/publish-maven.yml b/.github/workflows/publish-maven.yml index 16de6be20a..5f903cb8af 100644 --- a/.github/workflows/publish-maven.yml +++ b/.github/workflows/publish-maven.yml @@ -3,7 +3,7 @@ name: Publish to Maven Central on: push: branches: - - publish-new # 推送到 publish-new 分支时触发 snapshot 发布 + - publish # 推送到 publish 分支时触发 snapshot 发布 tags: - "v*" # 推送 tag(如 v0.1.0)时触发正式发布