Skip to content

Commit 67d60d8

Browse files
authored
Merge pull request #102 from IABTechLab/dave/euid-gma
EUID Support for GMA Plugin
2 parents 4b8a4e5 + 141ae8e commit 67d60d8

File tree

9 files changed

+165
-9
lines changed

9 files changed

+165
-9
lines changed

securesignals-gma-dev-app/src/main/AndroidManifest.xml

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
<!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
1515
<meta-data
1616
android:name="com.google.android.gms.ads.APPLICATION_ID"
17-
android:value="ca-app-pub-3940256099942544~3347511713"/>
17+
android:value="ca-app-pub-9939518381636264~1092563270"/>
18+
19+
<!-- Metadata for toggling UID2 and EUID environments. If true, EUID is used. -->
20+
<meta-data android:name="uid2_environment_euid" android:value="false"/>
1821

1922
<activity
2023
android:exported="true"

securesignals-gma-dev-app/src/main/java/com/uid2/dev/BannerActivity.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.uid2.dev;
22

3+
import static com.uid2.dev.utils.BundleExKt.isEnvironmentEUID;
4+
import static com.uid2.dev.utils.ContextExKt.getMetadata;
5+
36
import android.os.Bundle;
47
import androidx.appcompat.app.AppCompatActivity;
58
import android.util.Log;
@@ -11,9 +14,9 @@
1114
import com.google.android.gms.ads.RequestConfiguration;
1215
import com.google.android.gms.ads.initialization.InitializationStatus;
1316
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;
17+
import com.uid2.EUIDManager;
1418
import com.uid2.UID2Manager;
1519
import com.uid2.data.UID2Identity;
16-
1720
import org.json.JSONObject;
1821

1922
import java.io.BufferedReader;
@@ -101,7 +104,11 @@ private void loadUID2Identity() {
101104
refreshFrom,
102105
refreshExpires,
103106
fromJsonIdentity.getRefreshResponseKey());
104-
UID2Manager.getInstance().setIdentity(identity);
107+
if (isEnvironmentEUID(getMetadata(this))) {
108+
EUIDManager.getInstance().setIdentity(identity);
109+
} else {
110+
UID2Manager.getInstance().setIdentity(identity);
111+
}
105112
} catch (Exception e) {
106113
Log.e(TAG, "Error loading Identity: " + e);
107114
}

securesignals-gma-dev-app/src/main/java/com/uid2/dev/GMADevApplication.kt

+15-5
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ package com.uid2.dev
22

33
import android.app.Application
44
import android.util.Log
5+
import com.uid2.EUIDManager
56
import com.uid2.UID2Manager
67
import com.uid2.UID2Manager.Environment.Production
8+
import com.uid2.dev.utils.getMetadata
9+
import com.uid2.dev.utils.isEnvironmentEUID
710

811
class GMADevApplication : Application() {
912

@@ -13,11 +16,18 @@ class GMADevApplication : Application() {
1316
// Initialise the UID2Manager class. We will use it's DefaultNetworkSession rather than providing our own
1417
// custom implementation. This can be done to allow wrapping something like OkHttp.
1518
try {
16-
UID2Manager.init(
17-
context = this,
18-
environment = Production,
19-
isLoggingEnabled = true,
20-
)
19+
if (getMetadata().isEnvironmentEUID()) {
20+
EUIDManager.init(
21+
context = this,
22+
isLoggingEnabled = true,
23+
)
24+
} else {
25+
UID2Manager.init(
26+
context = this,
27+
environment = Production,
28+
isLoggingEnabled = true,
29+
)
30+
}
2131
} catch (ex: Exception) {
2232
Log.e("GMADevApplication", "Error initialising UID2Manager", ex)
2333
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.uid2.dev.utils
2+
3+
import android.os.Bundle
4+
5+
private const val UID2_ENVIRONMENT_EUID = "uid2_environment_euid"
6+
7+
fun Bundle.isEnvironmentEUID(): Boolean = getBoolean(UID2_ENVIRONMENT_EUID, false)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.uid2.dev.utils
2+
3+
import android.content.Context
4+
import android.content.pm.PackageManager
5+
import android.os.Bundle
6+
7+
fun Context.getMetadata(): Bundle = packageManager.getApplicationInfoCompat(
8+
packageName,
9+
PackageManager.GET_META_DATA,
10+
).metaData
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.uid2.dev.utils
2+
3+
import android.content.pm.ApplicationInfo
4+
import android.content.pm.PackageManager
5+
import android.os.Build
6+
7+
fun PackageManager.getApplicationInfoCompat(packageName: String, flags: Int = 0): ApplicationInfo =
8+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
9+
@Suppress("WrongConstant")
10+
getApplicationInfo(packageName, PackageManager.ApplicationInfoFlags.of(flags.toLong()))
11+
} else {
12+
@Suppress("DEPRECATION")
13+
getApplicationInfo(packageName, flags)
14+
}

securesignals-gma-dev-app/src/main/res/values/strings.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
<string name="action_settings">Settings</string>
77

88
<!-- This is an ad unit ID for a test ad. Replace with your own banner ad unit id. -->
9-
<string name="banner_ad_unit_id">ca-app-pub-3940256099942544/6300978111</string>
9+
<string name="banner_ad_unit_id">/21775744923/example/fixed-size-banner</string>
1010

1111
</resources>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.uid2.securesignals.gma
2+
3+
import android.content.Context
4+
import com.google.android.gms.ads.AdError
5+
import com.google.android.gms.ads.mediation.InitializationCompleteCallback
6+
import com.google.android.gms.ads.mediation.MediationConfiguration
7+
import com.google.android.gms.ads.mediation.rtb.RtbAdapter
8+
import com.google.android.gms.ads.mediation.rtb.RtbSignalData
9+
import com.google.android.gms.ads.mediation.rtb.SignalCallbacks
10+
import com.uid2.EUIDManager
11+
import com.uid2.UID2
12+
import com.google.android.gms.ads.mediation.VersionInfo as GmaVersionInfo
13+
14+
/**
15+
* An implementation of Google's GMS RtbAdapter that integrates UID2 tokens, accessed via the UID2Manager.
16+
*/
17+
public class EUIDMediationAdapter : RtbAdapter() {
18+
19+
/**
20+
* Gets the version of the UID2 SDK.
21+
*/
22+
@Suppress("DEPRECATION")
23+
public override fun getSDKVersionInfo(): GmaVersionInfo = UID2.getVersionInfo().let {
24+
GmaVersionInfo(it.major, it.minor, it.patch)
25+
}
26+
27+
/**
28+
* Gets the version of the UID2 Secure Signals plugin.
29+
*/
30+
@Suppress("DEPRECATION")
31+
public override fun getVersionInfo(): GmaVersionInfo = PluginVersion.getVersionInfo().let {
32+
GmaVersionInfo(it.major, it.minor, it.patch)
33+
}
34+
35+
/**
36+
* Initialises the UID2 SDK with the given Context.
37+
*/
38+
override fun initialize(
39+
context: Context,
40+
initializationCompleteCallback: InitializationCompleteCallback,
41+
mediationConfigurations: MutableList<MediationConfiguration>,
42+
) {
43+
// It's possible that the UID2Manager is already initialised. If so, it's a no-op.
44+
if (!EUIDManager.isInitialized()) {
45+
EUIDManager.init(context)
46+
}
47+
48+
// After we've asked to initialize the manager, we should wait until it's complete before reporting success.
49+
// This will potentially allow any previously persisted identity to be fully restored before we allow any
50+
// signals to be collected.
51+
EUIDManager.getInstance().addOnInitializedListener(initializationCompleteCallback::onInitializationSucceeded)
52+
}
53+
54+
/**
55+
* Collects the UID2 advertising token, if available.
56+
*/
57+
override fun collectSignals(rtbSignalData: RtbSignalData, signalCallbacks: SignalCallbacks) {
58+
EUIDManager.getInstance().let { manager ->
59+
val token = manager.getAdvertisingToken()
60+
if (token != null) {
61+
signalCallbacks.onSuccess(token)
62+
} else {
63+
// We include the IdentityStatus in the "error" to have better visibility on why the Advertising Token
64+
// was not present. There are a number of valid reasons why we don't have a token, but we are still
65+
// required to report these as "failures".
66+
signalCallbacks.onFailure(
67+
AdError(
68+
manager.currentIdentityStatus.value,
69+
"No Advertising Token",
70+
"UID2",
71+
),
72+
)
73+
}
74+
}
75+
}
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.uid2.securesignals.gma
2+
3+
import com.uid2.UID2
4+
import org.junit.Assert
5+
import org.junit.Test
6+
7+
class EUIDMediationAdapterTest {
8+
@Test
9+
fun `test SDK version`() {
10+
val adapter = EUIDMediationAdapter()
11+
val version = adapter.versionInfo
12+
val expectedVersion = UID2.getVersionInfo()
13+
14+
Assert.assertEquals(expectedVersion.major, version.majorVersion)
15+
Assert.assertEquals(expectedVersion.minor, version.minorVersion)
16+
Assert.assertEquals(expectedVersion.patch, version.microVersion)
17+
}
18+
19+
@Test
20+
fun `test plugin version`() {
21+
val adapter = EUIDMediationAdapter()
22+
val version = adapter.sdkVersionInfo
23+
val expectedVersion = PluginVersion.getVersionInfo()
24+
25+
Assert.assertEquals(expectedVersion.major, version.majorVersion)
26+
Assert.assertEquals(expectedVersion.minor, version.minorVersion)
27+
Assert.assertEquals(expectedVersion.patch, version.microVersion)
28+
}
29+
}

0 commit comments

Comments
 (0)