-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #101 from IABTechLab/dave/euid-ima
EUID Support for IMA Plugin
- Loading branch information
Showing
8 changed files
with
157 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
securesignals-ima-dev-app/src/main/java/com/uid2/dev/utils/BundleEx.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package com.uid2.dev.utils | ||
|
||
import android.os.Bundle | ||
|
||
private const val UID2_ENVIRONMENT_EUID = "uid2_environment_euid" | ||
|
||
fun Bundle.isEnvironmentEUID(): Boolean = getBoolean(UID2_ENVIRONMENT_EUID, false) |
10 changes: 10 additions & 0 deletions
10
securesignals-ima-dev-app/src/main/java/com/uid2/dev/utils/ContextEx.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package com.uid2.dev.utils | ||
|
||
import android.content.Context | ||
import android.content.pm.PackageManager | ||
import android.os.Bundle | ||
|
||
fun Context.getMetadata(): Bundle = packageManager.getApplicationInfoCompat( | ||
packageName, | ||
PackageManager.GET_META_DATA, | ||
).metaData |
14 changes: 14 additions & 0 deletions
14
securesignals-ima-dev-app/src/main/java/com/uid2/dev/utils/PackageManagerEx.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package com.uid2.dev.utils | ||
|
||
import android.content.pm.ApplicationInfo | ||
import android.content.pm.PackageManager | ||
import android.os.Build | ||
|
||
fun PackageManager.getApplicationInfoCompat(packageName: String, flags: Int = 0): ApplicationInfo = | ||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { | ||
@Suppress("WrongConstant") | ||
getApplicationInfo(packageName, PackageManager.ApplicationInfoFlags.of(flags.toLong())) | ||
} else { | ||
@Suppress("DEPRECATION") | ||
getApplicationInfo(packageName, flags) | ||
} |
70 changes: 70 additions & 0 deletions
70
securesignals-ima/src/main/java/com/uid2/securesignals/ima/EUIDSecureSignalsAdapter.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
package com.uid2.securesignals.ima | ||
|
||
import android.content.Context | ||
import com.google.ads.interactivemedia.v3.api.VersionInfo | ||
import com.google.ads.interactivemedia.v3.api.signals.SecureSignalsAdapter | ||
import com.google.ads.interactivemedia.v3.api.signals.SecureSignalsCollectSignalsCallback | ||
import com.google.ads.interactivemedia.v3.api.signals.SecureSignalsInitializeCallback | ||
import com.uid2.EUIDManager | ||
import com.uid2.UID2 | ||
|
||
/** | ||
* A custom exception type that is used to report failures from the EUIDSecureSignalsAdapter when an error has occurred. | ||
*/ | ||
public class EUIDSecureSignalsException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) | ||
|
||
/** | ||
* An implementation of Google's IMA SecureSignalsAdapter that integrates UID2 tokens, accessed via the UID2Manager. | ||
*/ | ||
public class EUIDSecureSignalsAdapter : SecureSignalsAdapter { | ||
|
||
/** | ||
* Gets the version of the UID2 SDK. | ||
*/ | ||
public override fun getSDKVersion(): VersionInfo = UID2.getVersionInfo().let { | ||
VersionInfo(it.major, it.minor, it.patch) | ||
} | ||
|
||
/** | ||
* Gets the version of the UID2 Secure Signals plugin. | ||
*/ | ||
public override fun getVersion(): VersionInfo = PluginVersion.getVersionInfo().let { | ||
VersionInfo(it.major, it.minor, it.patch) | ||
} | ||
|
||
/** | ||
* Initialises the UID2 SDK with the given Context. | ||
*/ | ||
public override fun initialize(context: Context, callback: SecureSignalsInitializeCallback) { | ||
// It's possible that the EUIDManager is already initialised. If so, it's a no-op. | ||
if (!EUIDManager.isInitialized()) { | ||
EUIDManager.init(context) | ||
} | ||
|
||
// After we've asked to initialize the manager, we should wait until it's complete before reporting success. | ||
// This will potentially allow any previously persisted identity to be fully restored before we allow any | ||
// signals to be collected. | ||
EUIDManager.getInstance().addOnInitializedListener(callback::onSuccess) | ||
} | ||
|
||
/** | ||
* Collects the UID2 advertising token, if available. | ||
*/ | ||
public override fun collectSignals(context: Context, callback: SecureSignalsCollectSignalsCallback) { | ||
EUIDManager.getInstance().let { manager -> | ||
val token = manager.getAdvertisingToken() | ||
if (token != null) { | ||
callback.onSuccess(token) | ||
} else { | ||
// We include the IdentityStatus in the "error" to have better visibility on why the Advertising Token | ||
// was not present. There are a number of valid reasons why we don't have a token, but we are still | ||
// required to report these as "failures". | ||
callback.onFailure( | ||
EUIDSecureSignalsException( | ||
"No Advertising Token available (Status: ${manager.currentIdentityStatus.value})", | ||
), | ||
) | ||
} | ||
} | ||
} | ||
} |
29 changes: 29 additions & 0 deletions
29
securesignals-ima/src/test/java/com/uid2/securesignals/ima/EUIDSecureSignalsAdapterTest.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package com.uid2.securesignals.ima | ||
|
||
import com.uid2.UID2 | ||
import org.junit.Assert.assertEquals | ||
import org.junit.Test | ||
|
||
class EUIDSecureSignalsAdapterTest { | ||
@Test | ||
fun `test SDK version`() { | ||
val adapter = UID2SecureSignalsAdapter() | ||
val version = adapter.sdkVersion | ||
val expectedVersion = UID2.getVersionInfo() | ||
|
||
assertEquals(expectedVersion.major, version.majorVersion) | ||
assertEquals(expectedVersion.minor, version.minorVersion) | ||
assertEquals(expectedVersion.patch, version.microVersion) | ||
} | ||
|
||
@Test | ||
fun `test plugin version`() { | ||
val adapter = UID2SecureSignalsAdapter() | ||
val version = adapter.version | ||
val expectedVersion = PluginVersion.getVersionInfo() | ||
|
||
assertEquals(expectedVersion.major, version.majorVersion) | ||
assertEquals(expectedVersion.minor, version.minorVersion) | ||
assertEquals(expectedVersion.patch, version.microVersion) | ||
} | ||
} |