Skip to content

Commit 2e4b25f

Browse files
Mobile Ads Developer Relationscopybara-github
authored andcommitted
Implement Ad Preloading for Interstitial Ads using NextGen SDK
PiperOrigin-RevId: 862498360
1 parent 19a28ec commit 2e4b25f

4 files changed

Lines changed: 155 additions & 29 deletions

File tree

source/plugin/Assets/GoogleMobileAds/Platforms/Android/GoogleMobileAdsClientFactory.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,12 +187,18 @@ public IAppOpenAdPreloaderClient BuildAppOpenAdPreloaderClient()
187187
return new GoogleMobileAds.Android.AppOpenAdPreloaderClient();
188188
}
189189

190-
public IInterstitialAdPreloaderClient BuildInterstitialAdPreloaderClient() {
191-
if (Application.platform == RuntimePlatform.Android) {
190+
public IInterstitialAdPreloaderClient BuildInterstitialAdPreloaderClient()
191+
{
192+
if (Application.platform != RuntimePlatform.Android)
193+
{
194+
throw new InvalidOperationException(@"Called " + MethodBase.GetCurrentMethod().Name +
195+
" on non-Android runtime");
196+
}
197+
if (IsNextGenEnabled())
198+
{
199+
return new GoogleMobileAds.Android.NextGenInterstitialAdPreloaderClient();
200+
}
192201
return new GoogleMobileAds.Android.InterstitialAdPreloaderClient();
193-
}
194-
throw new InvalidOperationException(@"Called " + MethodBase.GetCurrentMethod().Name +
195-
" on non-Android runtime");
196202
}
197203

198204
public IRewardedAdPreloaderClient BuildRewardedAdPreloaderClient()

source/plugin/Assets/GoogleMobileAds/Platforms/Android/NextGenInterstitialAdClient.cs

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,15 @@ namespace GoogleMobileAds.Android
2222
{
2323
public class NextGenInterstitialAdClient : AndroidJavaProxy, IInterstitialClient
2424
{
25-
internal AndroidJavaObject _androidInterstitialAd;
25+
internal AndroidJavaObject androidInterstitialAd;
2626

27-
public NextGenInterstitialAdClient()
28-
: base(NextGenUtils.UnityInterstitialAdCallbackClassName)
29-
{
30-
AndroidJavaClass playerClass = new AndroidJavaClass(Utils.UnityActivityClassName);
31-
AndroidJavaObject activity =
32-
playerClass.GetStatic<AndroidJavaObject>("currentActivity");
33-
_androidInterstitialAd =
34-
new AndroidJavaObject(NextGenUtils.UnityInterstitialAdClassName, activity, this);
35-
}
27+
public NextGenInterstitialAdClient()
28+
: base(NextGenUtils.UnityInterstitialAdCallbackClassName) {
29+
AndroidJavaClass playerClass = new AndroidJavaClass(Utils.UnityActivityClassName);
30+
AndroidJavaObject activity = playerClass.GetStatic<AndroidJavaObject>("currentActivity");
31+
androidInterstitialAd =
32+
new AndroidJavaObject(NextGenUtils.UnityInterstitialAdClassName, activity, this);
33+
}
3634

3735
public event EventHandler<EventArgs> OnAdLoaded;
3836

@@ -61,14 +59,14 @@ public void CreateInterstitialAd()
6159
// Loads an ad.
6260
public void LoadAd(string adUnitId, AdRequest request)
6361
{
64-
_androidInterstitialAd.Call("load",
65-
NextGenUtils.GetAdRequestJavaObject(request, adUnitId));
62+
androidInterstitialAd.Call("load",
63+
NextGenUtils.GetAdRequestJavaObject(request, adUnitId));
6664
}
6765

6866
// Presents the interstitial ad on the screen.
6967
public void Show()
7068
{
71-
_androidInterstitialAd.Call("show");
69+
androidInterstitialAd.Call("show");
7270
}
7371

7472
// Destroys the interstitial ad.
@@ -86,22 +84,16 @@ public string GetAdUnitID()
8684

8785
public long PlacementId
8886
{
89-
get
90-
{
91-
return _androidInterstitialAd.Call<long>("getPlacementId");
92-
}
93-
set
94-
{
95-
_androidInterstitialAd.Call("setPlacementId", value);
96-
}
87+
get { return androidInterstitialAd.Call<long>("getPlacementId"); }
88+
set { androidInterstitialAd.Call("setPlacementId", value); }
9789
}
9890

9991
// Returns ad request response info
10092
public IResponseInfoClient GetResponseInfoClient()
10193
{
102-
var responseInfoJavaObject
103-
= _androidInterstitialAd.Call<AndroidJavaObject>("getResponseInfo");
104-
return new NextGenResponseInfoClient(responseInfoJavaObject);
94+
var responseInfoJavaObject =
95+
androidInterstitialAd.Call<AndroidJavaObject>("getResponseInfo");
96+
return new NextGenResponseInfoClient(responseInfoJavaObject);
10597
}
10698

10799
#endregion
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Copyright (C) 2026 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#if GMA_PREVIEW_FEATURES
16+
17+
using System;
18+
using System.Collections.Generic;
19+
using UnityEngine;
20+
21+
using GoogleMobileAds.Api;
22+
using GoogleMobileAds.Common;
23+
24+
namespace GoogleMobileAds.Android {
25+
public class NextGenInterstitialAdPreloaderClient : AndroidJavaProxy,
26+
IInterstitialAdPreloaderClient {
27+
private readonly AndroidJavaObject _unityInterstitialAdPreloader;
28+
29+
private Action<string, IResponseInfoClient> _onAdPreloaded;
30+
private Action<string, IAdErrorClient> _onAdFailedToPreload;
31+
private Action<string> _onAdsExhausted;
32+
33+
public NextGenInterstitialAdPreloaderClient() : base(NextGenUtils.UnityPreloadCallbackClassName) {
34+
var playerClass = new AndroidJavaClass(Utils.UnityActivityClassName);
35+
var activity = playerClass.GetStatic<AndroidJavaObject>("currentActivity");
36+
_unityInterstitialAdPreloader =
37+
new AndroidJavaObject(NextGenUtils.UnityInterstitialAdPreloaderClassName, activity, this);
38+
}
39+
40+
public bool Preload(string preloadId, PreloadConfiguration preloadConfiguration,
41+
Action<string, IResponseInfoClient> onAdPreloaded,
42+
Action<string, IAdErrorClient> onAdFailedToPreload,
43+
Action<string> onAdsExhausted) {
44+
_onAdFailedToPreload = onAdFailedToPreload;
45+
_onAdPreloaded = onAdPreloaded;
46+
_onAdsExhausted = onAdsExhausted;
47+
return _unityInterstitialAdPreloader.Call<bool>(
48+
"start", preloadId, NextGenUtils.GetPreloadConfigurationJavaObject(preloadConfiguration));
49+
}
50+
51+
public bool IsAdAvailable(string preloadId) {
52+
return _unityInterstitialAdPreloader.Call<bool>("isAdAvailable", preloadId);
53+
}
54+
55+
public IInterstitialClient DequeueAd(string preloadId) {
56+
var interstitialAdClient = new NextGenInterstitialAdClient();
57+
var unityInterstitialAd = _unityInterstitialAdPreloader.Call<AndroidJavaObject>(
58+
"pollAd", preloadId, interstitialAdClient);
59+
if (unityInterstitialAd == null) {
60+
return null;
61+
}
62+
interstitialAdClient.androidInterstitialAd = unityInterstitialAd;
63+
return interstitialAdClient;
64+
}
65+
66+
public int GetNumAdsAvailable(string preloadId) {
67+
return _unityInterstitialAdPreloader.Call<int>("getNumAdsAvailable", preloadId);
68+
}
69+
70+
public PreloadConfiguration GetConfiguration(string preloadId) {
71+
return NextGenUtils.GetPreloadConfiguration(
72+
_unityInterstitialAdPreloader.Call<AndroidJavaObject>("getConfiguration", preloadId));
73+
}
74+
75+
public Dictionary<string, PreloadConfiguration> GetConfigurations() {
76+
var configurations = new Dictionary<string, PreloadConfiguration>();
77+
var androidConfigurations =
78+
_unityInterstitialAdPreloader.Call<AndroidJavaObject>("getConfigurations");
79+
var keySet = androidConfigurations.Call<AndroidJavaObject>("keySet");
80+
var iterator = keySet.Call<AndroidJavaObject>("iterator");
81+
82+
while (iterator.Call<bool>("hasNext")) {
83+
var key = iterator.Call<AndroidJavaObject>("next");
84+
var keyString = key.Call<string>("toString");
85+
var androidPreloadConfiguration = androidConfigurations.Call<AndroidJavaObject>("get", key);
86+
configurations.Add(keyString,
87+
NextGenUtils.GetPreloadConfiguration(androidPreloadConfiguration));
88+
}
89+
90+
return configurations;
91+
}
92+
93+
public void Destroy(string preloadId) {
94+
_unityInterstitialAdPreloader.Call("destroy", preloadId);
95+
}
96+
97+
public void DestroyAll() {
98+
_unityInterstitialAdPreloader.Call("destroyAll");
99+
}
100+
101+
#region Callbacks from UnityPreloadCallback
102+
103+
void onAdPreloaded(string preloadId, AndroidJavaObject responseInfo) {
104+
if (_onAdPreloaded != null) {
105+
_onAdPreloaded(preloadId,
106+
new ResponseInfoClient(ResponseInfoClientType.AdLoaded, responseInfo));
107+
}
108+
}
109+
110+
void onAdFailedToPreload(string preloadId, AndroidJavaObject error) {
111+
if (_onAdFailedToPreload != null) {
112+
_onAdFailedToPreload(preloadId, new AdErrorClient(error));
113+
}
114+
}
115+
116+
void onAdsExhausted(string preloadId) {
117+
if (_onAdsExhausted != null) {
118+
_onAdsExhausted(preloadId);
119+
}
120+
}
121+
122+
#endregion
123+
}
124+
}
125+
126+
#endif // GMA_PREVIEW_FEATURES

source/plugin/Assets/GoogleMobileAds/Platforms/Android/NextGenUtils.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ internal class NextGenUtils {
9999
"com.google.unity.ads.nextgen.UnityRewardedInterstitialAd";
100100
public const string UnityRewardedInterstitialAdCallbackClassName =
101101
"com.google.unity.ads.nextgen.UnityRewardedInterstitialAdCallback";
102+
public const string UnityInterstitialAdPreloaderClassName =
103+
"com.google.unity.ads.nextgen.UnityInterstitialAdPreloader";
102104
#endregion
103105

104106
/// <summary>

0 commit comments

Comments
 (0)