Skip to content

Commit f7804a7

Browse files
committed
Initial AdLoaderAd type
Add the `AdLoaderAd` component, without the specific configuration items for each of the handled ad types. The component implementation is known as: * `AdLoaderAd` (Flutter) * `FlutterAdLoaderAd` (Android) * `FLTAdLoaderAd` (iOS)
1 parent 341f366 commit f7804a7

18 files changed

Lines changed: 1275 additions & 0 deletions

packages/google_mobile_ads/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdListener.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,14 @@ public void onAdLoaded() {
9494
}
9595
}
9696

97+
/** Listener for adloader ads. */
98+
class FlutterAdLoaderAdListener extends FlutterAdListener {
99+
100+
FlutterAdLoaderAdListener(int adId, AdInstanceManager manager) {
101+
super(adId, manager);
102+
}
103+
}
104+
97105
/** {@link OnNativeAdLoadedListener} for native ads. */
98106
class FlutterNativeAdLoadedListener implements OnNativeAdLoadedListener {
99107

packages/google_mobile_ads/android/src/main/java/io/flutter/plugins/googlemobileads/FlutterAdLoader.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,21 @@ public void loadAdManagerNativeAd(
139139
.build()
140140
.loadAd(adManagerAdRequest);
141141
}
142+
143+
/** Load an ad loader ad. */
144+
public void loadAdLoaderAd(
145+
@NonNull String adUnitId, @NonNull AdListener adListener, @NonNull AdRequest request) {
146+
new AdLoader.Builder(context, adUnitId).withAdListener(adListener).build().loadAd(request);
147+
}
148+
149+
/** Load an ad manager ad loader ad. */
150+
public void loadAdManagerAdLoaderAd(
151+
@NonNull String adUnitId,
152+
@NonNull AdListener adListener,
153+
@NonNull AdManagerAdRequest adManagerAdRequest) {
154+
new AdLoader.Builder(context, adUnitId)
155+
.withAdListener(adListener)
156+
.build()
157+
.loadAd(adManagerAdRequest);
158+
}
142159
}
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
// Copyright 2022 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+
// https://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+
package io.flutter.plugins.googlemobileads;
16+
17+
import android.util.Log;
18+
import androidx.annotation.NonNull;
19+
import androidx.annotation.Nullable;
20+
import com.google.android.gms.ads.AdListener;
21+
22+
/**
23+
* A central wrapper for {@link AdManagerAdView}, {@link NativeCustomFormatAd} and {@link NativeAd}
24+
* instances served for a single {@link AdRequest} or {@link AdManagerAdRequest}
25+
*/
26+
class FlutterAdLoaderAd extends FlutterAd {
27+
private static final String TAG = "FlutterAdLoaderAd";
28+
29+
@NonNull private final AdInstanceManager manager;
30+
@NonNull private final String adUnitId;
31+
@NonNull private final FlutterAdLoader adLoader;
32+
@Nullable private FlutterAdRequest request;
33+
@Nullable private FlutterAdManagerAdRequest adManagerRequest;
34+
@Nullable private AdLoaderAdType type;
35+
@Nullable private String formatId;
36+
37+
static class Builder {
38+
@Nullable private AdInstanceManager manager;
39+
@Nullable private String adUnitId;
40+
@Nullable private FlutterAdRequest request;
41+
@Nullable private FlutterAdManagerAdRequest adManagerRequest;
42+
@Nullable private Integer id;
43+
@Nullable private FlutterAdLoader adLoader;
44+
45+
public Builder setId(int id) {
46+
this.id = id;
47+
return this;
48+
}
49+
50+
public Builder setManager(@NonNull AdInstanceManager manager) {
51+
this.manager = manager;
52+
return this;
53+
}
54+
55+
public Builder setAdUnitId(@NonNull String adUnitId) {
56+
this.adUnitId = adUnitId;
57+
return this;
58+
}
59+
60+
public Builder setRequest(@NonNull FlutterAdRequest request) {
61+
this.request = request;
62+
return this;
63+
}
64+
65+
public Builder setAdManagerRequest(@NonNull FlutterAdManagerAdRequest adManagerRequest) {
66+
this.adManagerRequest = adManagerRequest;
67+
return this;
68+
}
69+
70+
public Builder setFlutterAdLoader(@NonNull FlutterAdLoader adLoader) {
71+
this.adLoader = adLoader;
72+
return this;
73+
}
74+
75+
FlutterAdLoaderAd build() {
76+
if (manager == null) {
77+
throw new IllegalStateException("manager must be provided");
78+
}
79+
80+
if (adUnitId == null) {
81+
throw new IllegalStateException("adUnitId must be provided");
82+
}
83+
84+
if (request == null && adManagerRequest == null) {
85+
throw new IllegalStateException("Either request or adManagerRequest must be provided");
86+
}
87+
88+
final FlutterAdLoaderAd adLoaderAd;
89+
90+
if (request == null) {
91+
adLoaderAd = new FlutterAdLoaderAd(id, manager, adUnitId, adManagerRequest, adLoader);
92+
} else {
93+
adLoaderAd = new FlutterAdLoaderAd(id, manager, adUnitId, request, adLoader);
94+
}
95+
return adLoaderAd;
96+
}
97+
}
98+
99+
enum AdLoaderAdType {
100+
UNKNOWN,
101+
}
102+
103+
protected FlutterAdLoaderAd(
104+
int adId,
105+
@NonNull AdInstanceManager manager,
106+
@NonNull String adUnitId,
107+
@NonNull FlutterAdRequest request,
108+
@NonNull FlutterAdLoader adLoader) {
109+
super(adId);
110+
111+
this.type = AdLoaderAdType.UNKNOWN;
112+
this.formatId = null;
113+
114+
this.manager = manager;
115+
this.adUnitId = adUnitId;
116+
this.request = request;
117+
this.adLoader = adLoader;
118+
}
119+
120+
protected FlutterAdLoaderAd(
121+
int adId,
122+
@NonNull AdInstanceManager manager,
123+
@NonNull String adUnitId,
124+
@NonNull FlutterAdManagerAdRequest adManagerRequest,
125+
@NonNull FlutterAdLoader adLoader) {
126+
super(adId);
127+
128+
this.type = AdLoaderAdType.UNKNOWN;
129+
this.formatId = null;
130+
131+
this.manager = manager;
132+
this.adUnitId = adUnitId;
133+
this.adManagerRequest = adManagerRequest;
134+
this.adLoader = adLoader;
135+
}
136+
137+
@Override
138+
void load() {
139+
final AdListener adListener = new FlutterAdLoaderAdListener(adId, manager);
140+
// Note we delegate loading the ad to FlutterAdLoader mainly for testing purposes.
141+
// As of 20.0.0 of GMA, mockito is unable to mock AdLoader.
142+
if (request != null) {
143+
adLoader.loadAdLoaderAd(adUnitId, adListener, request.asAdRequest(adUnitId));
144+
return;
145+
}
146+
147+
if (adManagerRequest != null) {
148+
adLoader.loadAdManagerAdLoaderAd(
149+
adUnitId, adListener, adManagerRequest.asAdManagerAdRequest(adUnitId));
150+
return;
151+
}
152+
153+
Log.e(TAG, "A null or invalid ad request was provided.");
154+
}
155+
156+
@Nullable
157+
AdLoaderAdType getAdLoaderAdType() {
158+
return type;
159+
}
160+
161+
@Nullable
162+
FlutterAdSize getAdSize() {
163+
return null;
164+
}
165+
166+
@Nullable
167+
String getFormatId() {
168+
return formatId;
169+
}
170+
171+
@Override
172+
void dispose() {}
173+
}

packages/google_mobile_ads/android/src/main/java/io/flutter/plugins/googlemobileads/GoogleMobileAdsPlugin.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,23 @@ public void onAdInspectorClosed(@Nullable AdInspectorError adInspectorError) {
433433
nativeAd.load();
434434
result.success(null);
435435
break;
436+
case "loadAdLoaderAd":
437+
final FlutterAdLoaderAd adLoaderAd =
438+
new FlutterAdLoaderAd.Builder()
439+
.setManager(instanceManager)
440+
.setAdUnitId(call.<String>argument("adUnitId"))
441+
.setRequest(call.<FlutterAdRequest>argument("request"))
442+
.setAdManagerRequest(call.<FlutterAdManagerAdRequest>argument("adManagerRequest"))
443+
.setId(call.<Integer>argument("adId"))
444+
.setFlutterAdLoader(
445+
adLoaderSupplier != null
446+
? adLoaderSupplier.get()
447+
: new FlutterAdLoader(context))
448+
.build();
449+
instanceManager.trackAd(adLoaderAd, call.<Integer>argument("adId"));
450+
adLoaderAd.load();
451+
result.success(null);
452+
break;
436453
case "loadInterstitialAd":
437454
final FlutterInterstitialAd interstitial =
438455
new FlutterInterstitialAd(
@@ -613,6 +630,22 @@ public void onAdInspectorClosed(@Nullable AdInspectorError adInspectorError) {
613630
flutterMobileAds.openDebugMenu(context, adUnitId);
614631
result.success(null);
615632
break;
633+
case "getAdLoaderAdType":
634+
{
635+
FlutterAd ad = instanceManager.adForId(call.<Integer>argument("adId"));
636+
if (ad == null) {
637+
// This was called on a dart ad container that hasn't been loaded yet.
638+
result.success(null);
639+
} else if (ad instanceof FlutterAdLoaderAd) {
640+
result.success(((FlutterAdLoaderAd) ad).getAdLoaderAdType().ordinal());
641+
} else {
642+
result.error(
643+
Constants.ERROR_CODE_UNEXPECTED_AD_TYPE,
644+
"Unexpected ad type for getAdLoaderAdType: " + ad,
645+
null);
646+
}
647+
break;
648+
}
616649
case "getAdSize":
617650
{
618651
FlutterAd ad = instanceManager.adForId(call.<Integer>argument("adId"));
@@ -623,6 +656,8 @@ public void onAdInspectorClosed(@Nullable AdInspectorError adInspectorError) {
623656
result.success(((FlutterBannerAd) ad).getAdSize());
624657
} else if (ad instanceof FlutterAdManagerBannerAd) {
625658
result.success(((FlutterAdManagerBannerAd) ad).getAdSize());
659+
} else if (ad instanceof FlutterAdLoaderAd) {
660+
result.success(((FlutterAdLoaderAd) ad).getAdSize());
626661
} else {
627662
result.error(
628663
Constants.ERROR_CODE_UNEXPECTED_AD_TYPE,
@@ -631,6 +666,22 @@ public void onAdInspectorClosed(@Nullable AdInspectorError adInspectorError) {
631666
}
632667
break;
633668
}
669+
case "getFormatId":
670+
{
671+
FlutterAd ad = instanceManager.adForId(call.<Integer>argument("adId"));
672+
if (ad == null) {
673+
// This was called on a dart ad container that hasn't been loaded yet.
674+
result.success(null);
675+
} else if (ad instanceof FlutterAdLoaderAd) {
676+
result.success(((FlutterAdLoaderAd) ad).getFormatId());
677+
} else {
678+
result.error(
679+
Constants.ERROR_CODE_UNEXPECTED_AD_TYPE,
680+
"Unexpected ad type for getFormatId: " + ad,
681+
null);
682+
}
683+
break;
684+
}
634685
case "setServerSideVerificationOptions":
635686
{
636687
FlutterAd ad = instanceManager.adForId(call.<Integer>argument("adId"));

0 commit comments

Comments
 (0)