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 ;
@@ -40,6 +45,7 @@ class FlutterAdLoaderAd extends FlutterAd implements OnAdManagerAdViewLoadedList
4045 @ Nullable private FlutterAdManagerAdRequest adManagerRequest ;
4146 @ Nullable private View view ;
4247 @ Nullable protected BannerParameters bannerParameters ;
48+ @ Nullable protected CustomParameters customParameters ;
4349
4450 static class Builder {
4551 @ Nullable private AdInstanceManager manager ;
@@ -49,6 +55,8 @@ static class Builder {
4955 @ Nullable private Integer id ;
5056 @ Nullable private FlutterAdLoader adLoader ;
5157 @ Nullable private FlutterBannerParameters bannerParameters ;
58+ @ Nullable private FlutterCustomParameters customParameters ;
59+ @ Nullable private Map <String , CustomAdFactory > customFactories ;
5260
5361 public Builder setId (int id ) {
5462 this .id = id ;
@@ -85,6 +93,17 @@ public Builder setBanner(@Nullable FlutterBannerParameters bannerParameters) {
8593 return this ;
8694 }
8795
96+ public Builder setCustom (@ Nullable FlutterCustomParameters customParameters ) {
97+ this .customParameters = customParameters ;
98+ return this ;
99+ }
100+
101+ public Builder withAvailableCustomFactories (
102+ @ NonNull Map <String , CustomAdFactory > customFactories ) {
103+ this .customFactories = customFactories ;
104+ return this ;
105+ }
106+
88107 FlutterAdLoaderAd build () {
89108 if (manager == null ) {
90109 throw new IllegalStateException ("manager must be provided" );
@@ -112,6 +131,12 @@ FlutterAdLoaderAd build() {
112131 new FlutterAdManagerAdViewLoadedListener (adLoaderAd ));
113132 }
114133
134+ if (customParameters != null ) {
135+ adLoaderAd .customParameters =
136+ customParameters .asCustomParameters (
137+ new FlutterCustomFormatAdLoadedListener (adLoaderAd ), customFactories );
138+ }
139+
115140 return adLoaderAd ;
116141 }
117142 }
@@ -131,6 +156,21 @@ static class BannerParameters {
131156 }
132157 }
133158
159+ static class CustomParameters {
160+ @ NonNull final OnCustomFormatAdLoadedListener listener ;
161+ @ NonNull final Map <String , CustomAdFactory > factories ;
162+ @ Nullable final Map <String , Object > viewOptions ;
163+
164+ CustomParameters (
165+ @ NonNull OnCustomFormatAdLoadedListener listener ,
166+ @ NonNull Map <String , CustomAdFactory > factories ,
167+ @ Nullable Map <String , Object > viewOptions ) {
168+ this .listener = listener ;
169+ this .factories = factories ;
170+ this .viewOptions = viewOptions ;
171+ }
172+ }
173+
134174 protected FlutterAdLoaderAd (
135175 int adId ,
136176 @ NonNull AdInstanceManager manager ,
@@ -164,13 +204,17 @@ void load() {
164204 // As of 20.0.0 of GMA, mockito is unable to mock AdLoader.
165205 if (request != null ) {
166206 adLoader .loadAdLoaderAd (
167- adUnitId , adListener , request .asAdRequest (adUnitId ), bannerParameters );
207+ adUnitId , adListener , request .asAdRequest (adUnitId ), bannerParameters , customParameters );
168208 return ;
169209 }
170210
171211 if (adManagerRequest != null ) {
172212 adLoader .loadAdManagerAdLoaderAd (
173- adUnitId , adListener , adManagerRequest .asAdManagerAdRequest (adUnitId ), bannerParameters );
213+ adUnitId ,
214+ adListener ,
215+ adManagerRequest .asAdManagerAdRequest (adUnitId ),
216+ bannerParameters ,
217+ customParameters );
174218 return ;
175219 }
176220
@@ -193,6 +237,14 @@ public void onAdManagerAdViewLoaded(@NonNull AdManagerAdView adView) {
193237 manager .onAdLoaded (adId , adView .getResponseInfo ());
194238 }
195239
240+ @ Override
241+ public void onCustomFormatAdLoaded (@ NonNull NativeCustomFormatAd ad ) {
242+ String formatId = ad .getCustomFormatId ();
243+ view =
244+ customParameters .factories .get (formatId ).createCustomAd (ad , customParameters .viewOptions );
245+ manager .onAdLoaded (adId , null );
246+ }
247+
196248 @ Override
197249 void dispose () {
198250 if (view == null ) {
0 commit comments