Skip to content
9 changes: 9 additions & 0 deletions ThirdPartyAdapters/unity/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
## Unity Ads Android Mediation Adapter Changelog

#### Version 4.19.0.0
- Migrated to Unity Ads SDK public APIs.
- Verified compatibility with Unity Ads SDK 4.19.0.

Built and tested with:
- Google Mobile Ads SDK version 25.3.0.
- Google Mobile Ads Next-Gen SDK version 1.2.1.
- Unity Ads SDK version 4.19.0.

#### Version 4.18.1.0
- Removed old API implementation for interstitial ads. Adapter will start using
the new API implementation.
Expand Down
6 changes: 3 additions & 3 deletions ThirdPartyAdapters/unity/unity/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ ext {
// String property to store the proper name of the mediation network adapter.
adapterName = "UnityAds"
// String property to store version name.
stringVersion = "4.18.1.0"
stringVersion = "4.19.0"
// String property to store group id.
stringGroupId = "com.google.ads.mediation"
// Jacoco version to generate code coverage data
Expand All @@ -29,7 +29,7 @@ android {
minSdk 23
}
targetSdk 33
versionCode 4180100
versionCode 4190000
versionName stringVersion
buildConfigField("String", "ADAPTER_VERSION", "\"${stringVersion}\"")
android.buildFeatures.buildConfig true
Expand Down Expand Up @@ -122,7 +122,7 @@ task jacocoTestReport(type: JacocoReport,
}

dependencies {
implementation 'com.unity3d.ads:unity-ads:4.18.1'
implementation 'com.unity3d.ads:unity-ads:4.19.0'
implementation 'androidx.annotation:annotation:1.5.0'
// Check for a 'useNextGenGma' flag to use the next generation GMA SDK.
if (project.hasProperty('useNextGenGma')) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,35 +14,7 @@

package com.google.ads.mediation.unity;

import static com.google.ads.mediation.unity.UnityAdsAdapterUtils.AdEvent;
import static com.google.ads.mediation.unity.UnityAdsAdapterUtils.createAdError;
import static com.google.ads.mediation.unity.UnityAdsAdapterUtils.createSDKError;
import static com.google.ads.mediation.unity.UnityAdsAdapterUtils.setUnityAdsPrivacy;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.ads.mediation.unity.eventadapters.UnityInterstitialEventAdapter;
import com.google.android.gms.ads.AdError;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.mediation.MediationAdRequest;
import com.google.android.gms.ads.mediation.MediationInterstitialAdapter;
import com.google.android.gms.ads.mediation.MediationInterstitialListener;
import com.unity3d.ads.IUnityAdsInitializationListener;
import com.unity3d.ads.IUnityAdsLoadListener;
import com.unity3d.ads.IUnityAdsShowListener;
import com.unity3d.ads.UnityAds;
import com.unity3d.ads.UnityAds.UnityAdsLoadError;
import com.unity3d.ads.UnityAds.UnityAdsShowError;
import com.unity3d.ads.UnityAdsLoadOptions;
import com.unity3d.ads.UnityAdsShowOptions;
import com.unity3d.ads.metadata.MetaData;
import java.lang.ref.WeakReference;
import java.util.UUID;

/**
* The {@link UnityAdapter} is used to load Unity ads and mediate the callbacks between Google
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,28 @@
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.google.android.gms.ads.AdError;
import com.google.android.gms.ads.AdFormat;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.RequestConfiguration;
import com.google.android.gms.ads.mediation.MediationConfiguration;
import com.google.android.gms.ads.mediation.rtb.RtbSignalData;
import com.unity3d.ads.BannerSize;
import com.unity3d.ads.MediationInfo;
import com.unity3d.ads.UnityAds;
import com.unity3d.ads.UnityAds.UnityAdsInitializationError;
import com.unity3d.ads.UnityAdsError;
import com.unity3d.ads.metadata.MetaData;
import com.unity3d.services.banners.BannerErrorInfo;
import com.unity3d.services.banners.UnityBannerSize;
import java.util.ArrayList;

/** Utility class for the Unity adapter. */
public class UnityAdsAdapterUtils {

static final String ADMOB = "AdMob";

static final String WATERMARK = "watermark";

/** Enumeration of ad events that get forwarded to AdMob */
public enum AdEvent {
LOADED,
Expand All @@ -57,43 +63,45 @@ public enum AdEvent {
private UnityAdsAdapterUtils() {}

/**
* Creates an {@link AdError} object based on the specified {@link
* UnityAds.UnityAdsInitializationError}.
* Creates an {@link AdError} object based on the specified Initialization {@link
* UnityAdsError}.
*
* @param unityAdsError error object from Unity.
* @param description the error message.
* @return the {@link AdError} object.
*/
@NonNull
static AdError createSDKError(
@NonNull UnityAds.UnityAdsInitializationError unityAdsError, @NonNull String description) {
return createAdError(getMediationErrorCode(unityAdsError), description);
static AdError createSDKInitializationError(
@NonNull UnityAdsError unityAdsError, @NonNull String description) {
return createAdError(getMediationInitializationErrorCode(unityAdsError), description);
}

/**
* Creates an {@link AdError} object based on the specified {@link UnityAds.UnityAdsLoadError}.
* Creates an {@link AdError} object based on the specified load {@link
* UnityAdsError}.
*
* @param unityAdsError error object from Unity.
* @param description the error message.
* @return the {@link AdError} object.
*/
@NonNull
static AdError createSDKError(
@NonNull UnityAds.UnityAdsLoadError unityAdsError, @NonNull String description) {
return createAdError(getMediationErrorCode(unityAdsError), description);
static AdError createSDKLoadError(
@NonNull UnityAdsError unityAdsError, @NonNull String description) {
return createAdError(getMediationLoadErrorCode(unityAdsError), description);
}

/**
* Creates an {@link AdError} object based on the specified {@link UnityAds.UnityAdsShowError}.
* Creates an {@link AdError} object based on the specified show {@link
* UnityAdsError}.
*
* @param unityAdsError error object from Unity.
* @param description the error message.
* @return the {@link AdError} object.
*/
@NonNull
static AdError createSDKError(
@NonNull UnityAds.UnityAdsShowError unityAdsError, @NonNull String description) {
return createAdError(getMediationErrorCode(unityAdsError), description);
static AdError createSDKShowError(
@NonNull UnityAdsError unityAdsError, @NonNull String description) {
return createAdError(getMediationShowErrorCode(unityAdsError), description);
}

/**
Expand All @@ -109,47 +117,26 @@ static AdError createAdError(int errorCode, @NonNull String description) {
}

/**
* Gets the mediation specific error code for the specified {@link BannerErrorInfo}.
*
* @param errorInfo error object from Unity.
* @return mediation specific banner error code.
*/
static int getMediationErrorCode(@NonNull BannerErrorInfo errorInfo) {
int errorCode = 200;
switch (errorInfo.errorCode) {
case UNKNOWN:
errorCode = 201;
break;
case NATIVE_ERROR:
errorCode = 202;
break;
case WEBVIEW_ERROR:
errorCode = 203;
break;
case NO_FILL:
errorCode = 204;
break;
}
return errorCode;
}

/**
* Gets the mediation specific error code for the specified {@link
* UnityAds.UnityAdsInitializationError}.
* Gets the mediation specific error code for the specified {@link UnityAds.UnityAdsLoadError}.
*
* @param unityAdsError error object from Unity.
* @return mediation specific initialization error code.
* @return mediation specific load error code.
*/
static int getMediationErrorCode(@NonNull UnityAdsInitializationError unityAdsError) {
switch (unityAdsError) {
case INTERNAL_ERROR:
static int getMediationInitializationErrorCode(@NonNull UnityAdsError unityAdsError) {
switch (unityAdsError.getCode()) {
case 2:
case 52000:
case 52003:
case 52004:
case 52005:
case 52006: // Internal Error
return 301;
case INVALID_ARGUMENT:
case 52001:
case 52002: // Invalid argument
return 302;
case AD_BLOCKER_DETECTED:
return 303;
// Excluding default to allow for compile warnings if UnityAdsInitializationError is
// expanded in the future.

// Excluding default to allow for compile warnings if UnityAdsInitializationError is
// expanded in the future.
}
return 300;
}
Expand All @@ -160,56 +147,53 @@ static int getMediationErrorCode(@NonNull UnityAdsInitializationError unityAdsEr
* @param unityAdsError error object from Unity.
* @return mediation specific load error code.
*/
static int getMediationErrorCode(@NonNull UnityAds.UnityAdsLoadError unityAdsError) {
switch (unityAdsError) {
case INITIALIZE_FAILED:
static int getMediationLoadErrorCode(@NonNull UnityAdsError unityAdsError) {
switch (unityAdsError.getCode()) {
case 52101: // Not initialized
return 401;
case INTERNAL_ERROR:
return 402;
case INVALID_ARGUMENT:
case 52102:
case 52104: // Invalid arguments
return 403;
case NO_FILL:
case 52100: // No fill
return 404;
case TIMEOUT:
case 2: // Time out
return 405;
// Excluding default to allow for compile warnings if UnityAdsLoadError is expanded
// in the future.
case 52103:
case 52105:
case 52106:
case 52107:// Internal error
return 402;
// Excluding default to allow for compile warnings if UnityAdsLoadError is expanded
// in the future.
}

return 400;
}

/**
* Gets the mediation specific error code for the specified {@link UnityAds.UnityAdsShowError}.
* Gets the mediation specific error code for the specified {@link UnityAds.UnityAdsLoadError}.
*
* @param unityAdsError error object from Unity.
* @return mediation specific show error code.
* @return mediation specific load error code.
*/
static int getMediationErrorCode(@NonNull UnityAds.UnityAdsShowError unityAdsError) {
switch (unityAdsError) {
case NOT_INITIALIZED:
return 501;
case NOT_READY:
return 502;
case VIDEO_PLAYER_ERROR:
return 503;
case INVALID_ARGUMENT:
return 504;
case NO_CONNECTION:
return 505;
case ALREADY_SHOWING:
static int getMediationShowErrorCode(@NonNull UnityAdsError unityAdsError) {
switch (unityAdsError.getCode()) {
case 52201: // already showing
return 506;
case INTERNAL_ERROR:
case 52200: // Expired
case 52202: // internal error:
return 507;
case TIMEOUT:
case 2: // timeout:
return 508;
// Excluding default to allow for compile warnings if UnityAdsShowError is expanded
// in the future.

// Excluding default to allow for compile warnings if UnityAdsShowError is expanded
// in the future.
}
return 500;
}

@Nullable
public static UnityBannerSize getUnityBannerSize(
public static BannerSize getUnityBannerSize(
@NonNull Context context,
@NonNull AdSize adSize,
boolean isRtb,
Expand All @@ -220,11 +204,11 @@ public static UnityBannerSize getUnityBannerSize(

AdSize closestSize = mediationUtils.findClosestSize(context, adSize, potentials);
if (closestSize != null) {
return new UnityBannerSize(closestSize.getWidth(), closestSize.getHeight());
return new BannerSize(closestSize.getWidth(), closestSize.getHeight());
}

if (isRtb) {
return new UnityBannerSize(adSize.getWidth(), adSize.getHeight());
return new BannerSize(adSize.getWidth(), adSize.getHeight());
} else {
return null;
}
Expand All @@ -235,21 +219,9 @@ public static UnityBannerSize getUnityBannerSize(
*
* @param requestConfiguration used to read the value that indicates whether the app should be
* treated as child-directed for purposes of the COPPA or under age consent.
* @param userMetaData used to save changes on configuration values in the Unity3D SDK.
*/
public static void setUnityAdsPrivacy(
RequestConfiguration requestConfiguration, MetaData userMetaData) {

if (shouldTreatAsAdult(requestConfiguration)) {
// If no signal is tagged as child and one signal indicates adult session is treated as an
// adult.
userMetaData.set("user.nonbehavioral", false);
} else {
// Otherwise, if any signal is child or signals are conflicting or both are UNSPECIFIED,
// session is treated as a child.
userMetaData.set("user.nonbehavioral", true);
}
userMetaData.commit();
public static void setUnityAdsPrivacy(RequestConfiguration requestConfiguration) {
UnityAds.setNonBehavioral(!shouldTreatAsAdult(requestConfiguration));
}

/**
Expand Down Expand Up @@ -288,4 +260,18 @@ private static boolean shouldTreatAsAdult(RequestConfiguration requestConfigurat
&& (tagForChildDirectedTreatment == TAG_FOR_CHILD_DIRECTED_TREATMENT_FALSE
|| tagForUnderAgeOfConsent == TAG_FOR_UNDER_AGE_OF_CONSENT_FALSE);
}

/**
* Creates a MediationInfo object with Google mediation information.
* This duplicates the logic from UnityAdsWrapper for convenience.
*
* @return MediationInfo object with Google mediation details
*/
public static MediationInfo getMediationInfo() {
return new MediationInfo(
ADMOB, // Mediation name
MobileAds.getVersion().toString(), // Google mediation SDK version
BuildConfig.ADAPTER_VERSION // Adapter version
);
}
}
Loading
Loading