diff --git a/build.gradle b/build.gradle index a1001ac..1372252 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,6 @@ plugins { alias libs.plugins.androidApplication apply false alias libs.plugins.androidLibrary apply false - alias libs.plugins.kotlinAndroid apply false alias libs.plugins.composeCompiler apply false alias libs.plugins.dokka apply false alias libs.plugins.mavenPublish apply false diff --git a/common.gradle b/common.gradle index 8ac933f..663d010 100644 --- a/common.gradle +++ b/common.gradle @@ -19,10 +19,6 @@ android { } } - kotlinOptions { - jvmTarget = '1.8' - } - lint { abortOnError = true warningsAsErrors = true diff --git a/dev-app/build.gradle b/dev-app/build.gradle index 46f9f27..735d319 100644 --- a/dev-app/build.gradle +++ b/dev-app/build.gradle @@ -1,6 +1,5 @@ plugins { alias libs.plugins.androidApplication - alias libs.plugins.kotlinAndroid alias libs.plugins.composeCompiler } @@ -22,7 +21,7 @@ android { minifyEnabled = true proguardFiles = [ "okhttp3-proguard-rules.txt", - getDefaultProguardFile('proguard-android.txt') + getDefaultProguardFile('proguard-android-optimize.txt') ] signingConfig = signingConfigs.debug } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f5a1913..b349dbe 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.13.0" +agp = "9.0.0" kotlin = "2.1.21" core-ktx = "1.16.0" junit = "4.13.2" @@ -35,7 +35,6 @@ okhttp-core = { group = "com.squareup.okhttp3", name = "okhttp", version = "4.12 # GMA / IMA gma-ads = { group = "com.google.android.gms", name = "play-services-ads", version.ref = "gma" } ima-ads = { group = "com.google.ads.interactivemedia.v3", name = "interactivemedia", version.ref = "ima" } -androidx-multidex = { group = "androidx.multidex", name = "multidex", version = "2.0.1" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version = "2.2.1" } androidx-media = { group = "androidx.media", name = "media", version = "1.7.0" } androidx-browser = { group = "androidx.browser", name = "browser", version = "1.8.0" } @@ -54,7 +53,6 @@ mockk-agent = { group = "io.mockk", name = "mockk-agent", version.ref = "mockkVe [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" } androidLibrary = { id = "com.android.library", version.ref = "agp" } -kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } spotless = { id = "com.diffplug.spotless", version = "7.0.4" } dokka = { id = "org.jetbrains.dokka", version = "2.0.0" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55..f8e1ee3 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bad7c24..19a6bde 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a9..adff685 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index 5eed7ee..e509b2d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/prebid/build.gradle b/prebid/build.gradle index 4f52e52..af9acb3 100644 --- a/prebid/build.gradle +++ b/prebid/build.gradle @@ -1,6 +1,7 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias libs.plugins.androidLibrary - alias libs.plugins.kotlinAndroid alias libs.plugins.dokka alias libs.plugins.mavenPublish } @@ -15,10 +16,10 @@ android { kotlin { explicitApi() - } - - kotlinOptions { - freeCompilerArgs += [ "-opt-in=com.uid2.InternalUID2Api" ] + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + optIn.add("com.uid2.InternalUID2Api") + } } } diff --git a/prebid/src/main/java/com/uid2/prebid/UID2Prebid.kt b/prebid/src/main/java/com/uid2/prebid/UID2Prebid.kt index a1b277c..d5277c7 100644 --- a/prebid/src/main/java/com/uid2/prebid/UID2Prebid.kt +++ b/prebid/src/main/java/com/uid2/prebid/UID2Prebid.kt @@ -121,14 +121,20 @@ public class UID2Prebid internal constructor( * Extension function to build a list containing the single [ExternalUserId] that is associated with UID2. */ private fun String.toExternalUserIdList(): List { + val source = if (manager.isEuid) { + USER_ID_SOURCE_EUID + } else { + USER_ID_SOURCE_UID2 + } return listOf( - ExternalUserId(USER_ID_SOURCE, listOf(ExternalUserId.UniqueId(this, AGENT_TYPE_PERSON_ID))), + ExternalUserId(source, listOf(ExternalUserId.UniqueId(this, AGENT_TYPE_PERSON_ID))), ) } private companion object { const val TAG = "UID2Prebid" - const val USER_ID_SOURCE = "uidapi.com" + const val USER_ID_SOURCE_UID2 = "uidapi.com" + const val USER_ID_SOURCE_EUID = "euid.eu" /** * "A person-based ID, i.e., that is the same across devices." diff --git a/prebid/src/test/java/com/uid2/prebid/UID2PrebidTest.kt b/prebid/src/test/java/com/uid2/prebid/UID2PrebidTest.kt index fec61fb..95771c0 100644 --- a/prebid/src/test/java/com/uid2/prebid/UID2PrebidTest.kt +++ b/prebid/src/test/java/com/uid2/prebid/UID2PrebidTest.kt @@ -48,6 +48,7 @@ class UID2PrebidTest { every { manager.getAdvertisingToken() }.returns(currentAdvertisingToken) every { manager.state }.returns(state) every { manager.logger }.returns(logger) + every { manager.isEuid }.returns(false) } @Test @@ -73,7 +74,7 @@ class UID2PrebidTest { advanceUntilIdle() // Verify it was set on Prebid. - prebidExternalUserIdInteractor.assertLastToken(newToken1) + prebidExternalUserIdInteractor.assertLastToken(newToken1, "uidapi.com") // Refresh the token. val newToken2 = "refreshed-token-1" @@ -81,7 +82,7 @@ class UID2PrebidTest { advanceUntilIdle() // Verify it was set on Prebid. - prebidExternalUserIdInteractor.assertLastToken(newToken2) + prebidExternalUserIdInteractor.assertLastToken(newToken2, "uidapi.com") // Refresh the token again. val newToken3 = "refreshed-token-2" @@ -89,7 +90,40 @@ class UID2PrebidTest { advanceUntilIdle() // Verify it was set on Prebid. - prebidExternalUserIdInteractor.assertLastToken(newToken3) + prebidExternalUserIdInteractor.assertLastToken(newToken3, "uidapi.com") + } + + @Test + fun `sets the source for EUID`() = runTest(testDispatcher) { + every { manager.isEuid }.returns(true) + + val prebid = withPrebid().apply { + initialize() + } + + // Start with an established token. + val newToken1 = "established-token" + state.emit(withEstablished(newToken1)) + advanceUntilIdle() + + // Verify it was set on Prebid. + prebidExternalUserIdInteractor.assertLastToken(newToken1, "euid.eu") + + // Refresh the token. + val newToken2 = "refreshed-token-1" + state.emit(withRefreshed(newToken2)) + advanceUntilIdle() + + // Verify it was set on Prebid. + prebidExternalUserIdInteractor.assertLastToken(newToken2, "euid.eu") + + // Refresh the token again. + val newToken3 = "refreshed-token-2" + state.emit(withRefreshed(newToken3)) + advanceUntilIdle() + + // Verify it was set on Prebid. + prebidExternalUserIdInteractor.assertLastToken(newToken3, "euid.eu") } @Test @@ -111,7 +145,7 @@ class UID2PrebidTest { advanceUntilIdle() // Verify that it's been set on Prebid. - prebidExternalUserIdInteractor.assertLastToken(token) + prebidExternalUserIdInteractor.assertLastToken(token, "uidapi.com") // Emit the new state. state.emit(managerState) @@ -148,10 +182,10 @@ class UID2PrebidTest { refreshResponseKey = "", ) - private fun FakePrebidExternalUserIdInteractor.assertLastToken(advertisingToken: String) { + private fun FakePrebidExternalUserIdInteractor.assertLastToken(advertisingToken: String, source: String) { assertTrue(lastIds.isNotEmpty()) lastIds.last().let { - assertEquals("uidapi.com", it.source) + assertEquals(source, it.source) assertEquals(1, it.uniqueIds.size) val id = it.uniqueIds[0] assertEquals(advertisingToken, id.id) diff --git a/sdk/build.gradle b/sdk/build.gradle index f4657a0..c9931b2 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -1,6 +1,7 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias libs.plugins.androidLibrary - alias libs.plugins.kotlinAndroid alias libs.plugins.dokka alias libs.plugins.mavenPublish } @@ -29,10 +30,10 @@ android { kotlin { explicitApi() - } - - kotlinOptions { - freeCompilerArgs += [ "-opt-in=com.uid2.InternalUID2Api" ] + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + optIn.add("com.uid2.InternalUID2Api") + } } } diff --git a/sdk/src/main/java/com/uid2/EUIDManager.kt b/sdk/src/main/java/com/uid2/EUIDManager.kt index 10c8559..dbac326 100644 --- a/sdk/src/main/java/com/uid2/EUIDManager.kt +++ b/sdk/src/main/java/com/uid2/EUIDManager.kt @@ -100,18 +100,19 @@ public object EUIDManager { val logger = Logger(isLoggingEnabled) return instance ?: UID2Manager( - UID2Client( + client = UID2Client( apiUrl = serverUrl, session = networkSession, applicationId = applicationId, logger = logger, ), - storage, - TimeUtils, - InputUtils(), - Dispatchers.Default, - true, - logger, + storageManager = storage, + timeUtils = TimeUtils, + inputUtils = InputUtils(), + defaultDispatcher = Dispatchers.Default, + initialAutomaticRefreshEnabled = true, + isEuid = true, + logger = logger, ).apply { instance = this } diff --git a/sdk/src/main/java/com/uid2/UID2Manager.kt b/sdk/src/main/java/com/uid2/UID2Manager.kt index afa0691..4a7f70a 100644 --- a/sdk/src/main/java/com/uid2/UID2Manager.kt +++ b/sdk/src/main/java/com/uid2/UID2Manager.kt @@ -95,6 +95,7 @@ public class UID2Manager internal constructor( private val inputUtils: InputUtils, defaultDispatcher: CoroutineDispatcher, initialAutomaticRefreshEnabled: Boolean, + @property:InternalUID2Api public val isEuid: Boolean, @property:InternalUID2Api public val logger: Logger, ) { private val scope = CoroutineScope(defaultDispatcher + SupervisorJob()) @@ -614,6 +615,7 @@ public class UID2Manager internal constructor( private const val EXPIRATION_CHECK_TOLERANCE_MS = 50 private var serverUrl: String = UID2_API_URL_PRODUCTION + private var isEuid: Boolean = true private var applicationId: String = APPLICATION_ID_DEFAULT private var networkSession: NetworkSession = DefaultNetworkSession() private var storageManager: StorageManager? = null @@ -694,18 +696,19 @@ public class UID2Manager internal constructor( val logger = Logger(isLoggingEnabled) return instance ?: UID2Manager( - UID2Client( + client = UID2Client( apiUrl = serverUrl, session = networkSession, applicationId = applicationId, logger = logger, ), - storage, - TimeUtils, - InputUtils(), - Dispatchers.Default, - true, - logger, + storageManager = storage, + timeUtils = TimeUtils, + inputUtils = InputUtils(), + defaultDispatcher = Dispatchers.Default, + initialAutomaticRefreshEnabled = true, + isEuid = false, + logger = logger, ).apply { instance = this } diff --git a/sdk/src/test/java/com/uid2/UID2ManagerTest.kt b/sdk/src/test/java/com/uid2/UID2ManagerTest.kt index 32baba1..7407bad 100644 --- a/sdk/src/test/java/com/uid2/UID2ManagerTest.kt +++ b/sdk/src/test/java/com/uid2/UID2ManagerTest.kt @@ -87,7 +87,16 @@ class UID2ManagerTest { } } - val manager = UID2Manager(client, storageManager, timeUtils, inputUtils, testDispatcher, false, logger).apply { + val manager = UID2Manager( + client = client, + storageManager = storageManager, + timeUtils = timeUtils, + inputUtils = inputUtils, + defaultDispatcher = testDispatcher, + initialAutomaticRefreshEnabled = false, + isEuid = false, + logger = logger, + ).apply { this.checkExpiration = false // Add the required listeners. @@ -238,7 +247,16 @@ class UID2ManagerTest { @Test fun `resets identity immediately after initialisation`() = runTest(testDispatcher) { // Create a new instance of the manager but *don't* allow it to finish initialising (loading previous identity) - val manager = UID2Manager(client, storageManager, timeUtils, inputUtils, testDispatcher, false, logger).apply { + val manager = UID2Manager( + client = client, + storageManager = storageManager, + timeUtils = timeUtils, + inputUtils = inputUtils, + defaultDispatcher = testDispatcher, + initialAutomaticRefreshEnabled = false, + isEuid = false, + logger = logger, + ).apply { onIdentityChangedListener = listener checkExpiration = false } @@ -556,13 +574,14 @@ class UID2ManagerTest { initialCheckExpiration: Boolean = false, ): UID2Manager { return UID2Manager( - client, - storageManager, - timeUtils, - inputUtils, - dispatcher, - initialAutomaticRefreshEnabled, - logger, + client = client, + storageManager = storageManager, + timeUtils = timeUtils, + inputUtils = inputUtils, + defaultDispatcher = dispatcher, + initialAutomaticRefreshEnabled = initialAutomaticRefreshEnabled, + isEuid = false, + logger = logger, ).apply { onIdentityChangedListener = listener checkExpiration = initialCheckExpiration diff --git a/securesignals-gma-dev-app/build.gradle b/securesignals-gma-dev-app/build.gradle index 1a72d29..2c26d38 100644 --- a/securesignals-gma-dev-app/build.gradle +++ b/securesignals-gma-dev-app/build.gradle @@ -1,6 +1,7 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias libs.plugins.androidApplication - alias libs.plugins.kotlinAndroid } apply from: rootProject.file("$rootDir/common.gradle") @@ -22,6 +23,12 @@ android { } } + kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + } + } + lint { disable 'GradleDependency' } @@ -33,7 +40,6 @@ dependencies { implementation project(path: ':securesignals-gma') implementation(libs.gma.ads) - implementation(libs.androidx.multidex) implementation(libs.androidx.appcompat) implementation(libs.androidx.constraintlayout) } diff --git a/securesignals-gma/build.gradle b/securesignals-gma/build.gradle index 3de7a80..8322c7e 100644 --- a/securesignals-gma/build.gradle +++ b/securesignals-gma/build.gradle @@ -1,6 +1,7 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias libs.plugins.androidLibrary - alias libs.plugins.kotlinAndroid alias libs.plugins.mavenPublish } @@ -21,6 +22,9 @@ android { kotlin { explicitApi() + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + } } } diff --git a/securesignals-ima-dev-app/build.gradle b/securesignals-ima-dev-app/build.gradle index eaaf95d..86733ec 100644 --- a/securesignals-ima-dev-app/build.gradle +++ b/securesignals-ima-dev-app/build.gradle @@ -1,6 +1,7 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias libs.plugins.androidApplication - alias libs.plugins.kotlinAndroid } apply from: rootProject.file("$rootDir/common.gradle") @@ -22,6 +23,12 @@ android { } } + kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + } + } + lint { disable 'GradleDependency', 'IconDipSize', 'IconDensities', 'RtlEnabled' } @@ -38,7 +45,6 @@ dependencies { implementation(libs.androidx.activity.ktx) implementation(libs.androidx.constraintlayout) - implementation(libs.androidx.multidex) implementation(libs.androidx.browser) implementation(libs.androidx.media) } diff --git a/securesignals-ima/build.gradle b/securesignals-ima/build.gradle index c201329..bb1c6d5 100644 --- a/securesignals-ima/build.gradle +++ b/securesignals-ima/build.gradle @@ -1,6 +1,7 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias libs.plugins.androidLibrary - alias libs.plugins.kotlinAndroid alias libs.plugins.mavenPublish } @@ -21,6 +22,9 @@ android { kotlin { explicitApi() + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + } } }