Skip to content

Commit a0ce9fa

Browse files
Address PR feedback: remove banner Activity-context requirement
BannerView accepts a plain Context since Unity Ads SDK 4.16.2, so drop the Activity checks in collectSignals and the banner load path and pass the context through directly. Also tighten the RoutingTokenListener Javadoc to the implemented behavior. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent f3bb9ce commit a0ce9fa

4 files changed

Lines changed: 18 additions & 49 deletions

File tree

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.google.ads.mediation.unity;
22

3-
import android.app.Activity;
3+
import android.content.Context;
44
import com.unity3d.services.banners.BannerView;
55
import com.unity3d.services.banners.UnityBannerSize;
66

77
/** A factory to create UnityAds {@link BannerView} for Banner Ads */
88
class UnityBannerViewFactory {
99
UnityBannerViewWrapper createBannerView(
10-
Activity activity, String placementId, UnityBannerSize bannerSize) {
11-
BannerView bannerView = new BannerView(activity, placementId, bannerSize);
10+
Context context, String placementId, UnityBannerSize bannerSize) {
11+
BannerView bannerView = new BannerView(context, placementId, bannerSize);
1212
return new UnityBannerViewWrapper(bannerView);
1313
}
1414
}

ThirdPartyAdapters/unity/unity/src/main/java/com/google/ads/mediation/unity/UnityMediationAdapter.java

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import static com.google.ads.mediation.unity.UnityAdsAdapterUtils.createSDKError;
1818
import static com.google.ads.mediation.unity.UnityAdsAdapterUtils.getAdFormat;
1919

20-
import android.app.Activity;
2120
import android.content.Context;
2221
import android.os.Bundle;
2322
import android.text.TextUtils;
@@ -211,18 +210,6 @@ public void collectSignals(
211210
AdFormat adFormat = getAdFormat(rtbSignalData);
212211
com.unity3d.ads.AdFormat unityAdFormat = null;
213212

214-
// For banner ad format, Unity Ads SDK requires an activity context to load the banner ad. So,
215-
// fail here so that Unity bidder will not bid if the ad request was made with a non-activity
216-
// context.
217-
if (adFormat == AdFormat.BANNER && !(rtbSignalData.getContext() instanceof Activity)) {
218-
signalCallbacks.onFailure(
219-
new AdError(
220-
ERROR_CONTEXT_NOT_ACTIVITY,
221-
"Unity Ads RTB Banner ads require activity context",
222-
ADAPTER_ERROR_DOMAIN));
223-
return;
224-
}
225-
226213
if (adFormat == AdFormat.BANNER) {
227214
unityAdFormat = com.unity3d.ads.AdFormat.BANNER;
228215
} else if (adFormat == AdFormat.REWARDED || adFormat == AdFormat.REWARDED_INTERSTITIAL) {
@@ -242,7 +229,7 @@ public void collectSignals(
242229
}
243230
}
244231

245-
/** Routes a null/empty token or a token failure to onFailure, invoking signalCallbacks once. */
232+
/** Routes a null or empty token to onFailure and a non-empty token to onSuccess. */
246233
@VisibleForTesting
247234
static final class RoutingTokenListener implements IUnityAdsTokenListener {
248235
private final SignalCallbacks signalCallbacks;

ThirdPartyAdapters/unity/unity/src/main/java/com/google/ads/mediation/unity/UnityMediationBannerAd.java

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@
1919
import static com.google.ads.mediation.unity.UnityAdsAdapterUtils.getMediationErrorCode;
2020
import static com.google.ads.mediation.unity.UnityMediationAdapter.ADAPTER_ERROR_DOMAIN;
2121
import static com.google.ads.mediation.unity.UnityMediationAdapter.ERROR_MSG_MISSING_PARAMETERS;
22-
import static com.google.ads.mediation.unity.UnityMediationAdapter.ERROR_MSG_NON_ACTIVITY;
2322
import static com.google.ads.mediation.unity.UnityMediationAdapter.KEY_WATERMARK;
2423

25-
import android.app.Activity;
2624
import android.content.Context;
2725
import android.os.Bundle;
2826
import android.text.TextUtils;
@@ -176,18 +174,6 @@ public void loadAd(
176174
return;
177175
}
178176

179-
if (!(context instanceof Activity)) {
180-
AdError adError =
181-
new AdError(
182-
UnityMediationAdapter.ERROR_CONTEXT_NOT_ACTIVITY,
183-
ERROR_MSG_NON_ACTIVITY,
184-
ADAPTER_ERROR_DOMAIN);
185-
Log.w(UnityMediationAdapter.TAG, adError.toString());
186-
mediationBannerAdLoadCallback.onFailure(adError);
187-
return;
188-
}
189-
final Activity activity = (Activity) context;
190-
191177
final String adMarkup = mediationBannerAdConfiguration.getBidResponse();
192178

193179
// It is RTB if adMarkup is not empty.
@@ -224,7 +210,7 @@ public void onInitializationComplete() {
224210
if (unityBannerViewWrapper == null) {
225211
unityBannerViewWrapper =
226212
unityBannerViewFactory.createBannerView(
227-
activity, bannerPlacementId, unityBannerSize);
213+
context, bannerPlacementId, unityBannerSize);
228214
}
229215

230216
unityBannerViewWrapper.setListener(UnityMediationBannerAd.this);

ThirdPartyAdapters/unity/unity/src/test/kotlin/com/google/ads/mediation/unity/UnityMediationAdapterTest.kt

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,9 @@ import com.google.ads.mediation.unity.UnityInitializer.KEY_ADAPTER_VERSION
1212
import com.google.ads.mediation.unity.UnityInterstitialAd.ERROR_MSG_INTERSTITIAL_INITIALIZATION_FAILED
1313
import com.google.ads.mediation.unity.UnityMediationAdapter.ADAPTER_ERROR_DOMAIN
1414
import com.google.ads.mediation.unity.UnityMediationAdapter.ERROR_BANNER_SIZE_MISMATCH
15-
import com.google.ads.mediation.unity.UnityMediationAdapter.ERROR_CONTEXT_NOT_ACTIVITY
1615
import com.google.ads.mediation.unity.UnityMediationAdapter.ERROR_INVALID_SERVER_PARAMETERS
1716
import com.google.ads.mediation.unity.UnityMediationAdapter.ERROR_MSG_INITIALIZATION_FAILURE
1817
import com.google.ads.mediation.unity.UnityMediationAdapter.ERROR_MSG_MISSING_PARAMETERS
19-
import com.google.ads.mediation.unity.UnityMediationAdapter.ERROR_MSG_NON_ACTIVITY
2018
import com.google.ads.mediation.unity.UnityMediationAdapter.ERROR_TOKEN_GENERATION_FAILED
2119
import com.google.ads.mediation.unity.UnityMediationAdapter.SDK_ERROR_DOMAIN
2220
import com.google.ads.mediation.unity.UnityMediationBannerAd.ERROR_MSG_INITIALIZATION_FAILED_FOR_GAME_ID
@@ -219,7 +217,13 @@ class UnityMediationAdapterTest {
219217
}
220218

221219
@Test
222-
fun collectSignals_forBannerFormatAndNonActivityContext_fails() {
220+
fun collectSignals_forBannerFormatAndNonActivityContext_invokesSignalCallbacks() {
221+
whenever(unityAdsWrapper.getToken(any(), any())) doAnswer
222+
{ invocation ->
223+
val callback = invocation.arguments[1] as IUnityAdsTokenListener
224+
callback.onUnityAdsTokenReady(TEST_TOKEN)
225+
}
226+
223227
val rtbSignalData =
224228
RtbSignalData(
225229
nonActivityContext,
@@ -230,12 +234,7 @@ class UnityMediationAdapterTest {
230234

231235
unityMediationAdapter.collectSignals(rtbSignalData, signalCallbacks)
232236

233-
val adErrorCaptor = argumentCaptor<AdError>()
234-
verify(signalCallbacks).onFailure(adErrorCaptor.capture())
235-
val adError = adErrorCaptor.firstValue
236-
assertThat(adError.code).isEqualTo(ERROR_CONTEXT_NOT_ACTIVITY)
237-
assertThat(adError.domain).isEqualTo(ADAPTER_ERROR_DOMAIN)
238-
verifyNoMoreInteractions(signalCallbacks)
237+
verify(signalCallbacks).onSuccess(TEST_TOKEN)
239238
}
240239

241240
@Test
@@ -500,20 +499,17 @@ class UnityMediationAdapterTest {
500499
}
501500

502501
@Test
503-
fun loadBannerAd_withNonActivityContext_failsWithAdError() {
504-
mediationBannerAdConfiguration = initializeBannerAd(ApplicationProvider.getApplicationContext())
502+
fun loadBannerAd_withNonActivityContext_callsInitializeUnityAds() {
503+
mediationBannerAdConfiguration = initializeBannerAd(nonActivityContext)
504+
whenever(mediationUtils.findClosestSize(eq(nonActivityContext), eq(AdSize.BANNER), any())) doReturn
505+
AdSize.BANNER
505506

506507
unityMediationAdapter.loadBannerAd(
507508
mediationBannerAdConfiguration,
508509
mediationBannerAdLoadCallback,
509510
)
510511

511-
val adErrorCaptor = argumentCaptor<AdError>()
512-
verify(mediationBannerAdLoadCallback).onFailure(adErrorCaptor.capture())
513-
val capturedError = adErrorCaptor.firstValue
514-
assertThat(capturedError.code).isEqualTo(ERROR_CONTEXT_NOT_ACTIVITY)
515-
assertThat(capturedError.message).isEqualTo(ERROR_MSG_NON_ACTIVITY)
516-
assertThat(capturedError.domain).isEqualTo(ADAPTER_ERROR_DOMAIN)
512+
verify(unityInitializer).initializeUnityAds(any(), any(), any())
517513
}
518514

519515
@Test

0 commit comments

Comments
 (0)