Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 0 additions & 4 deletions common.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@ android {
}
}

kotlinOptions {
jvmTarget = '1.8'
}

lint {
abortOnError = true
warningsAsErrors = true
Expand Down
3 changes: 1 addition & 2 deletions dev-app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
plugins {
alias libs.plugins.androidApplication
alias libs.plugins.kotlinAndroid
alias libs.plugins.composeCompiler
}

Expand All @@ -22,7 +21,7 @@ android {
minifyEnabled = true
proguardFiles = [
"okhttp3-proguard-rules.txt",
getDefaultProguardFile('proguard-android.txt')
getDefaultProguardFile('proguard-android-optimize.txt')
]
signingConfig = signingConfigs.debug
}
Expand Down
4 changes: 1 addition & 3 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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" }
Expand All @@ -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" }
Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
Expand Down
5 changes: 1 addition & 4 deletions gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 6 additions & 5 deletions prebid/build.gradle
Original file line number Diff line number Diff line change
@@ -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
}
Expand All @@ -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")
}
}
}

Expand Down
10 changes: 8 additions & 2 deletions prebid/src/main/java/com/uid2/prebid/UID2Prebid.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<ExternalUserId> {
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."
Expand Down
46 changes: 40 additions & 6 deletions prebid/src/test/java/com/uid2/prebid/UID2PrebidTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -73,23 +74,56 @@ 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"
state.emit(withRefreshed(newToken2))
advanceUntilIdle()

// Verify it was set on Prebid.
prebidExternalUserIdInteractor.assertLastToken(newToken2)
prebidExternalUserIdInteractor.assertLastToken(newToken2, "uidapi.com")

// Refresh the token again.
val newToken3 = "refreshed-token-2"
state.emit(withRefreshed(newToken3))
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
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
11 changes: 6 additions & 5 deletions sdk/build.gradle
Original file line number Diff line number Diff line change
@@ -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
}
Expand Down Expand Up @@ -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")
}
}
}

Expand Down
15 changes: 8 additions & 7 deletions sdk/src/main/java/com/uid2/EUIDManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
17 changes: 10 additions & 7 deletions sdk/src/main/java/com/uid2/UID2Manager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}
Expand Down
Loading
Loading