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 50e90e59c2..c060408506 100644 --- a/buildSrc/src/main/kotlin/com/datadog/gradle/config/MavenConfig.kt +++ b/buildSrc/src/main/kotlin/com/datadog/gradle/config/MavenConfig.kt @@ -7,11 +7,15 @@ package com.datadog.gradle.config import com.vanniktech.maven.publish.AndroidSingleVariantLibrary +import com.vanniktech.maven.publish.JavaLibrary +import com.vanniktech.maven.publish.JavadocJar 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.configure import org.gradle.kotlin.dsl.findByType +import org.gradle.kotlin.dsl.get import org.gradle.plugins.signing.SigningExtension object MavenConfig { @@ -23,13 +27,7 @@ fun Project.publishingConfig( projectDescription: String, customArtifactId: String = name ) { - val projectName = name - - // Apply Vanniktech plugin - pluginManager.apply("com.vanniktech.maven.publish.base") - - // Configure Android Library publishing (sources + javadoc) - configure { + basePublishingConfig(projectDescription, customArtifactId) { configure( AndroidSingleVariantLibrary( variant = "release", @@ -37,6 +35,39 @@ fun Project.publishingConfig( publishJavadocJar = true ) ) + } +} + +fun Project.publishingJavaConfig( + projectDescription: String, + customArtifactId: String = name, + useJavaLibraryPlatform: Boolean = true +) { + basePublishingConfig(projectDescription, customArtifactId) { + if (useJavaLibraryPlatform) { + configure( + JavaLibrary( + sourcesJar = true, + javadocJar = JavadocJar.Javadoc() + ) + ) + } + } +} + +private fun Project.basePublishingConfig( + projectDescription: String, + customArtifactId: String, + platformConfig: MavenPublishBaseExtension.() -> Unit +) { + val projectName = name + + // Apply Vanniktech plugin + pluginManager.apply("com.vanniktech.maven.publish.base") + + // Configure publishing + configure { + platformConfig() // Coordinates coordinates( diff --git a/dd-sdk-android-dependencies/build.gradle.kts b/dd-sdk-android-dependencies/build.gradle.kts index a4a3e46b33..365a3c3b0c 100644 --- a/dd-sdk-android-dependencies/build.gradle.kts +++ b/dd-sdk-android-dependencies/build.gradle.kts @@ -4,17 +4,14 @@ * Copyright 2016-Present Datadog, Inc. */ -import com.datadog.gradle.config.AndroidConfig import com.datadog.gradle.config.MavenConfig -import com.vanniktech.maven.publish.MavenPublishBaseExtension -import java.util.Base64 +import com.datadog.gradle.config.publishingJavaConfig plugins { `java-library` id("com.gradleup.shadow") `maven-publish` signing - id("com.vanniktech.maven.publish.base") } dependencies { @@ -38,83 +35,22 @@ tasks.shadowJar { configurations = listOf(project.configurations.runtimeClasspath.get()) } -// Use Vanniktech plugin ONLY for Maven Central Portal repository setup (not for artifact configuration) -// This ensures the same publishToSonatype / Central Portal API is used as other modules -configure { - publishToMavenCentral(automaticRelease = false) -} +// Configure publishing using common helper +// useJavaLibraryPlatform = false because we manually configure the publication to use shadowJar +publishingJavaConfig( + projectDescription = "Shaded dependencies for FlashCat Android SDK", + useJavaLibraryPlatform = false +) // Manual publication configuration with shadow jar as the artifact publishing { publications { - register("maven") { - groupId = MavenConfig.GROUP_ID - artifactId = project.name - version = AndroidConfig.VERSION.name - + register(MavenConfig.PUBLICATION) { artifact(tasks.shadowJar) - - pom { - name.set(project.name) - description.set("Shaded dependencies for FlashCat Android SDK") - 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") - } - } } } } -// Signing configuration (consistent with MavenConfig.publishingConfig()) -signing { - val isLocalPublish = gradle.startParameter.taskNames.any { - it.contains("publishToMavenLocal", ignoreCase = true) - } - isRequired = !hasProperty("dd-skip-signing") && !isLocalPublish - - val privateKey = System.getenv("GPG_PRIVATE_KEY") - val password = System.getenv("GPG_PASSWORD") - - if (privateKey != null && password != null) { - val decodedKey = try { - String(Base64.getDecoder().decode(privateKey)) - } catch (e: Exception) { - privateKey // Already decoded / plain text - } - useInMemoryPgpKeys(decodedKey, password) - } - - sign(publishing.publications["maven"]) -} - // Force the shadowJar to be the ONLY exported artifact for this module // This prevents R8 duplicate class errors while ensuring the file exists for KSP configurations.apiElements { diff --git a/features/dd-sdk-android-session-replay-noop/src/main/kotlin/com/datadog/android/sessionreplay/SessionReplayConfiguration.kt b/features/dd-sdk-android-session-replay-noop/src/main/kotlin/com/datadog/android/sessionreplay/SessionReplayConfiguration.kt index 52b4f2c344..ea44e39e7c 100644 --- a/features/dd-sdk-android-session-replay-noop/src/main/kotlin/com/datadog/android/sessionreplay/SessionReplayConfiguration.kt +++ b/features/dd-sdk-android-session-replay-noop/src/main/kotlin/com/datadog/android/sessionreplay/SessionReplayConfiguration.kt @@ -6,6 +6,9 @@ package com.datadog.android.sessionreplay +import androidx.annotation.FloatRange +import com.datadog.android.api.InternalLogger + /** * Describes configuration to be used for the Session Replay feature. */ @@ -16,6 +19,25 @@ class SessionReplayConfiguration internal constructor() { * A Builder class for a [SessionReplayConfiguration]. */ class Builder { + /** + * Calling this constructor will default to a 100% session sampling rate. + */ + constructor() : this(100.0f, InternalLogger.UNBOUND) + + /** + * @param sampleRate must be a value between 0 and 100. A value of 0 + * means no session will be recorded, 100 means all sessions will be recorded. + * If this value is not provided then Session Replay will default to a 100 sample rate. + */ + constructor( + @FloatRange(from = 0.0, to = 100.0) sampleRate: Float = 100.0f + ) : this(sampleRate, InternalLogger.UNBOUND) + + internal constructor( + @FloatRange(from = 0.0, to = 100.0) sampleRate: Float, + logger: InternalLogger + ) { + } /** * Sets the sample rate for this feature. @@ -87,6 +109,34 @@ class SessionReplayConfiguration internal constructor() { return this } + /** + * This option controls whether optimization is enabled or disabled for recording Session Replay data. + * By default the value is true, meaning the dynamic optimization is enabled. + */ + fun setDynamicOptimizationEnabled(dynamicOptimizationEnabled: Boolean): Builder { + return this + } + + /** + * Defines the minimum system requirements for enabling the Session Replay feature. + * When [SessionReplay.enable] is invoked, the system configuration is verified against these requirements. + * If the system meets the specified criteria, Session Replay will be successfully enabled. + * If this function is not invoked, no minimum requirements will be enforced, and Session Replay will be + * enabled on all devices. + */ + fun setSystemRequirements(systemRequirementsConfiguration: SystemRequirementsConfiguration): Builder { + return this + } + + /** + * Should recording start automatically (or be manually started). + * If not specified then by default it starts automatically. + * @param enabled whether recording should start automatically or not. + */ + fun startRecordingImmediately(enabled: Boolean): Builder { + return this + } + /** * Builds a [SessionReplayConfiguration] based on the current state of this Builder. */