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 ;
@@ -42,6 +47,7 @@ class FlutterAdLoaderAd extends FlutterAd implements OnAdManagerAdViewLoadedList
4247 @ Nullable private String formatId ;
4348 @ Nullable private View view ;
4449 @ Nullable protected BannerParameters bannerParameters ;
50+ @ Nullable protected CustomParameters customParameters ;
4551
4652 static class Builder {
4753 @ Nullable private AdInstanceManager manager ;
@@ -51,6 +57,8 @@ static class Builder {
5157 @ Nullable private Integer id ;
5258 @ Nullable private FlutterAdLoader adLoader ;
5359 @ Nullable private FlutterBannerParameters bannerParameters ;
60+ @ Nullable private FlutterCustomParameters customParameters ;
61+ @ Nullable private Map <String , CustomAdFactory > customFactories ;
5462
5563 public Builder setId (int id ) {
5664 this .id = id ;
@@ -87,6 +95,17 @@ public Builder setBanner(@Nullable FlutterBannerParameters bannerParameters) {
8795 return this ;
8896 }
8997
98+ public Builder setCustom (@ Nullable FlutterCustomParameters customParameters ) {
99+ this .customParameters = customParameters ;
100+ return this ;
101+ }
102+
103+ public Builder withAvailableCustomFactories (
104+ @ NonNull Map <String , CustomAdFactory > customFactories ) {
105+ this .customFactories = customFactories ;
106+ return this ;
107+ }
108+
90109 FlutterAdLoaderAd build () {
91110 if (manager == null ) {
92111 throw new IllegalStateException ("manager must be provided" );
@@ -114,13 +133,20 @@ FlutterAdLoaderAd build() {
114133 new FlutterAdManagerAdViewLoadedListener (adLoaderAd ));
115134 }
116135
136+ if (customParameters != null ) {
137+ adLoaderAd .customParameters =
138+ customParameters .asCustomParameters (
139+ new FlutterCustomFormatAdLoadedListener (adLoaderAd ), customFactories );
140+ }
141+
117142 return adLoaderAd ;
118143 }
119144 }
120145
121146 enum AdLoaderAdType {
122147 UNKNOWN ,
123148 BANNER ,
149+ CUSTOM ,
124150 }
125151
126152 static class BannerParameters {
@@ -138,6 +164,21 @@ static class BannerParameters {
138164 }
139165 }
140166
167+ static class CustomParameters {
168+ @ NonNull final OnCustomFormatAdLoadedListener listener ;
169+ @ NonNull final Map <String , CustomAdFactory > factories ;
170+ @ Nullable final Map <String , Object > viewOptions ;
171+
172+ CustomParameters (
173+ @ NonNull OnCustomFormatAdLoadedListener listener ,
174+ @ NonNull Map <String , CustomAdFactory > factories ,
175+ @ Nullable Map <String , Object > viewOptions ) {
176+ this .listener = listener ;
177+ this .factories = factories ;
178+ this .viewOptions = viewOptions ;
179+ }
180+ }
181+
141182 protected FlutterAdLoaderAd (
142183 int adId ,
143184 @ NonNull AdInstanceManager manager ,
@@ -179,13 +220,17 @@ void load() {
179220 // As of 20.0.0 of GMA, mockito is unable to mock AdLoader.
180221 if (request != null ) {
181222 adLoader .loadAdLoaderAd (
182- adUnitId , adListener , request .asAdRequest (adUnitId ), bannerParameters );
223+ adUnitId , adListener , request .asAdRequest (adUnitId ), bannerParameters , customParameters );
183224 return ;
184225 }
185226
186227 if (adManagerRequest != null ) {
187228 adLoader .loadAdManagerAdLoaderAd (
188- adUnitId , adListener , adManagerRequest .asAdManagerAdRequest (adUnitId ), bannerParameters );
229+ adUnitId ,
230+ adListener ,
231+ adManagerRequest .asAdManagerAdRequest (adUnitId ),
232+ bannerParameters ,
233+ customParameters );
189234 return ;
190235 }
191236
@@ -227,6 +272,15 @@ public void onAdManagerAdViewLoaded(@NonNull AdManagerAdView adView) {
227272 manager .onAdLoaded (adId , adView .getResponseInfo ());
228273 }
229274
275+ @ Override
276+ public void onCustomFormatAdLoaded (@ NonNull NativeCustomFormatAd ad ) {
277+ formatId = ad .getCustomFormatId ();
278+ view =
279+ customParameters .factories .get (formatId ).createCustomAd (ad , customParameters .viewOptions );
280+ type = AdLoaderAdType .CUSTOM ;
281+ manager .onAdLoaded (adId , null );
282+ }
283+
230284 @ Override
231285 void dispose () {
232286 if (view == null ) {
0 commit comments