2424import com .google .android .gms .ads .admanager .AdManagerAdView ;
2525import com .google .android .gms .ads .formats .AdManagerAdViewOptions ;
2626import com .google .android .gms .ads .formats .OnAdManagerAdViewLoadedListener ;
27+ import com .google .android .gms .ads .nativead .NativeCustomFormatAd ;
28+ import com .google .android .gms .ads .nativead .NativeCustomFormatAd .OnCustomFormatAdLoadedListener ;
2729import io .flutter .plugin .platform .PlatformView ;
30+ import io .flutter .plugins .googlemobileads .GoogleMobileAdsPlugin .CustomAdFactory ;
31+ import java .util .Map ;
2832
2933/**
3034 * A central wrapper for {@link AdManagerAdView}, {@link NativeCustomFormatAd} and {@link NativeAd}
3135 * instances served for a single {@link AdRequest} or {@link AdManagerAdRequest}
3236 */
33- class FlutterAdLoaderAd extends FlutterAd implements OnAdManagerAdViewLoadedListener {
37+ class FlutterAdLoaderAd extends FlutterAd
38+ implements OnAdManagerAdViewLoadedListener , OnCustomFormatAdLoadedListener {
3439 private static final String TAG = "FlutterAdLoaderAd" ;
3540
3641 @ NonNull private final AdInstanceManager manager ;
@@ -41,6 +46,7 @@ class FlutterAdLoaderAd extends FlutterAd implements OnAdManagerAdViewLoadedList
4146 @ Nullable private AdLoaderAdType type ;
4247 @ Nullable private View view ;
4348 @ Nullable protected BannerParameters bannerParameters ;
49+ @ Nullable protected CustomParameters customParameters ;
4450
4551 static class Builder {
4652 @ Nullable private AdInstanceManager manager ;
@@ -50,6 +56,8 @@ static class Builder {
5056 @ Nullable private Integer id ;
5157 @ Nullable private FlutterAdLoader adLoader ;
5258 @ Nullable private FlutterBannerParameters bannerParameters ;
59+ @ Nullable private FlutterCustomParameters customParameters ;
60+ @ Nullable private Map <String , CustomAdFactory > customFactories ;
5361
5462 public Builder setId (int id ) {
5563 this .id = id ;
@@ -86,6 +94,17 @@ public Builder setBanner(@Nullable FlutterBannerParameters bannerParameters) {
8694 return this ;
8795 }
8896
97+ public Builder setCustom (@ Nullable FlutterCustomParameters customParameters ) {
98+ this .customParameters = customParameters ;
99+ return this ;
100+ }
101+
102+ public Builder withAvailableCustomFactories (
103+ @ NonNull Map <String , CustomAdFactory > customFactories ) {
104+ this .customFactories = customFactories ;
105+ return this ;
106+ }
107+
89108 FlutterAdLoaderAd build () {
90109 if (manager == null ) {
91110 throw new IllegalStateException ("manager must be provided" );
@@ -113,13 +132,20 @@ FlutterAdLoaderAd build() {
113132 new FlutterAdManagerAdViewLoadedListener (adLoaderAd ));
114133 }
115134
135+ if (customParameters != null ) {
136+ adLoaderAd .customParameters =
137+ customParameters .asCustomParameters (
138+ new FlutterCustomFormatAdLoadedListener (adLoaderAd ), customFactories );
139+ }
140+
116141 return adLoaderAd ;
117142 }
118143 }
119144
120145 enum AdLoaderAdType {
121146 UNKNOWN ,
122147 BANNER ,
148+ CUSTOM ,
123149 }
124150
125151 static class BannerParameters {
@@ -137,6 +163,21 @@ static class BannerParameters {
137163 }
138164 }
139165
166+ static class CustomParameters {
167+ @ NonNull final OnCustomFormatAdLoadedListener listener ;
168+ @ NonNull final Map <String , CustomAdFactory > factories ;
169+ @ Nullable final Map <String , Object > viewOptions ;
170+
171+ CustomParameters (
172+ @ NonNull OnCustomFormatAdLoadedListener listener ,
173+ @ NonNull Map <String , CustomAdFactory > factories ,
174+ @ Nullable Map <String , Object > viewOptions ) {
175+ this .listener = listener ;
176+ this .factories = factories ;
177+ this .viewOptions = viewOptions ;
178+ }
179+ }
180+
140181 protected FlutterAdLoaderAd (
141182 int adId ,
142183 @ NonNull AdInstanceManager manager ,
@@ -176,13 +217,17 @@ void load() {
176217 // As of 20.0.0 of GMA, mockito is unable to mock AdLoader.
177218 if (request != null ) {
178219 adLoader .loadAdLoaderAd (
179- adUnitId , adListener , request .asAdRequest (adUnitId ), bannerParameters );
220+ adUnitId , adListener , request .asAdRequest (adUnitId ), bannerParameters , customParameters );
180221 return ;
181222 }
182223
183224 if (adManagerRequest != null ) {
184225 adLoader .loadAdManagerAdLoaderAd (
185- adUnitId , adListener , adManagerRequest .asAdManagerAdRequest (adUnitId ), bannerParameters );
226+ adUnitId ,
227+ adListener ,
228+ adManagerRequest .asAdManagerAdRequest (adUnitId ),
229+ bannerParameters ,
230+ customParameters );
186231 return ;
187232 }
188233
@@ -219,6 +264,15 @@ public void onAdManagerAdViewLoaded(@NonNull AdManagerAdView adView) {
219264 manager .onAdLoaded (adId , adView .getResponseInfo ());
220265 }
221266
267+ @ Override
268+ public void onCustomFormatAdLoaded (@ NonNull NativeCustomFormatAd ad ) {
269+ String formatId = ad .getCustomFormatId ();
270+ view =
271+ customParameters .factories .get (formatId ).createCustomAd (ad , customParameters .viewOptions );
272+ type = AdLoaderAdType .CUSTOM ;
273+ manager .onAdLoaded (adId , null );
274+ }
275+
222276 @ Override
223277 void dispose () {
224278 if (view == null ) {
0 commit comments