Skip to content

Commit 9aabf93

Browse files
[interactive_media_ads] Change the location of where the AdsLoader is initialized (#7721)
This moves the creation of `AdsLoader` to the `onContainerAdded` callback. This makes it clearer that the `AdsLoader` only needs to be created once. This also changes the default value for `_shouldShowContentVideo` to `false` to prevent the content video from showing before the first ad. I verified this still works even when no pre-roll ads are loaded.
1 parent a3f1692 commit 9aabf93

File tree

6 files changed

+85
-83
lines changed

6 files changed

+85
-83
lines changed

packages/interactive_media_ads/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.2.2+5
2+
3+
* Changes the example app to initialize the `AdsLoader` in `onContainerAdded`.
4+
15
## 0.2.2+4
26

37
* Adds internal wrapper for Android native `AdProgressInfo`.

packages/interactive_media_ads/README.md

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ a separate video player positioned on top of the app's content video player.
1414
| **Support** | SDK 21+ | 12.0+ |
1515

1616
**NOTE:**
17-
* The initial release for this package supports linear pre-roll video ads on iOS and Android
18-
platforms.
1917
* Companion ads, Background Audio ads and Google Dynamic Ad Insertion methods are currently not
2018
supported.
2119

@@ -95,7 +93,7 @@ class _AdExampleWidgetState extends State<AdExampleWidget>
9593
// ···
9694
// Whether the widget should be displaying the content video. The content
9795
// player is hidden while Ads are playing.
98-
bool _shouldShowContentVideo = true;
96+
bool _shouldShowContentVideo = false;
9997
10098
// Controls the content video player.
10199
late final VideoPlayerController _contentVideoController;
@@ -126,6 +124,44 @@ for playing content.
126124
```dart
127125
late final AdDisplayContainer _adDisplayContainer = AdDisplayContainer(
128126
onContainerAdded: (AdDisplayContainer container) {
127+
_adsLoader = AdsLoader(
128+
container: container,
129+
onAdsLoaded: (OnAdsLoadedData data) {
130+
final AdsManager manager = data.manager;
131+
_adsManager = data.manager;
132+
133+
manager.setAdsManagerDelegate(AdsManagerDelegate(
134+
onAdEvent: (AdEvent event) {
135+
debugPrint('OnAdEvent: ${event.type} => ${event.adData}');
136+
switch (event.type) {
137+
case AdEventType.loaded:
138+
manager.start();
139+
case AdEventType.contentPauseRequested:
140+
_pauseContent();
141+
case AdEventType.contentResumeRequested:
142+
_resumeContent();
143+
case AdEventType.allAdsCompleted:
144+
manager.destroy();
145+
_adsManager = null;
146+
case AdEventType.clicked:
147+
case AdEventType.complete:
148+
case _:
149+
}
150+
},
151+
onAdErrorEvent: (AdErrorEvent event) {
152+
debugPrint('AdErrorEvent: ${event.error.message}');
153+
_resumeContent();
154+
},
155+
));
156+
157+
manager.init();
158+
},
159+
onAdsLoadError: (AdsLoadErrorData data) {
160+
debugPrint('OnAdsLoadError: ${data.error.message}');
161+
_resumeContent();
162+
},
163+
);
164+
129165
// Ads can't be requested until the `AdDisplayContainer` has been added to
130166
// the native View hierarchy.
131167
_requestAds(container);
@@ -211,44 +247,6 @@ Handle requesting ads and add event listeners to handle when content should be d
211247
<?code-excerpt "example/lib/main.dart (request_ads)"?>
212248
```dart
213249
Future<void> _requestAds(AdDisplayContainer container) {
214-
_adsLoader = AdsLoader(
215-
container: container,
216-
onAdsLoaded: (OnAdsLoadedData data) {
217-
final AdsManager manager = data.manager;
218-
_adsManager = data.manager;
219-
220-
manager.setAdsManagerDelegate(AdsManagerDelegate(
221-
onAdEvent: (AdEvent event) {
222-
debugPrint('OnAdEvent: ${event.type} => ${event.adData}');
223-
switch (event.type) {
224-
case AdEventType.loaded:
225-
manager.start();
226-
case AdEventType.contentPauseRequested:
227-
_pauseContent();
228-
case AdEventType.contentResumeRequested:
229-
_resumeContent();
230-
case AdEventType.allAdsCompleted:
231-
manager.destroy();
232-
_adsManager = null;
233-
case AdEventType.clicked:
234-
case AdEventType.complete:
235-
case _:
236-
}
237-
},
238-
onAdErrorEvent: (AdErrorEvent event) {
239-
debugPrint('AdErrorEvent: ${event.error.message}');
240-
_resumeContent();
241-
},
242-
));
243-
244-
manager.init();
245-
},
246-
onAdsLoadError: (AdsLoadErrorData data) {
247-
debugPrint('OnAdsLoadError: ${data.error.message}');
248-
_resumeContent();
249-
},
250-
);
251-
252250
return _adsLoader.requestAds(AdsRequest(
253251
adTagUrl: _adTagUrl,
254252
contentProgressProvider: _contentProgressProvider,

packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class AdsRequestProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) :
2121
*
2222
* This must match the version in pubspec.yaml.
2323
*/
24-
const val pluginVersion = "0.2.2+4"
24+
const val pluginVersion = "0.2.2+5"
2525
}
2626

2727
override fun setAdTagUrl(pigeon_instance: AdsRequest, adTagUrl: String) {

packages/interactive_media_ads/example/lib/main.dart

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class _AdExampleWidgetState extends State<AdExampleWidget>
5252
// #docregion example_widget
5353
// Whether the widget should be displaying the content video. The content
5454
// player is hidden while Ads are playing.
55-
bool _shouldShowContentVideo = true;
55+
bool _shouldShowContentVideo = false;
5656

5757
// Controls the content video player.
5858
late final VideoPlayerController _contentVideoController;
@@ -70,6 +70,44 @@ class _AdExampleWidgetState extends State<AdExampleWidget>
7070
// #docregion ad_and_content_players
7171
late final AdDisplayContainer _adDisplayContainer = AdDisplayContainer(
7272
onContainerAdded: (AdDisplayContainer container) {
73+
_adsLoader = AdsLoader(
74+
container: container,
75+
onAdsLoaded: (OnAdsLoadedData data) {
76+
final AdsManager manager = data.manager;
77+
_adsManager = data.manager;
78+
79+
manager.setAdsManagerDelegate(AdsManagerDelegate(
80+
onAdEvent: (AdEvent event) {
81+
debugPrint('OnAdEvent: ${event.type} => ${event.adData}');
82+
switch (event.type) {
83+
case AdEventType.loaded:
84+
manager.start();
85+
case AdEventType.contentPauseRequested:
86+
_pauseContent();
87+
case AdEventType.contentResumeRequested:
88+
_resumeContent();
89+
case AdEventType.allAdsCompleted:
90+
manager.destroy();
91+
_adsManager = null;
92+
case AdEventType.clicked:
93+
case AdEventType.complete:
94+
case _:
95+
}
96+
},
97+
onAdErrorEvent: (AdErrorEvent event) {
98+
debugPrint('AdErrorEvent: ${event.error.message}');
99+
_resumeContent();
100+
},
101+
));
102+
103+
manager.init();
104+
},
105+
onAdsLoadError: (AdsLoadErrorData data) {
106+
debugPrint('OnAdsLoadError: ${data.error.message}');
107+
_resumeContent();
108+
},
109+
);
110+
73111
// Ads can't be requested until the `AdDisplayContainer` has been added to
74112
// the native View hierarchy.
75113
_requestAds(container);
@@ -127,44 +165,6 @@ class _AdExampleWidgetState extends State<AdExampleWidget>
127165

128166
// #docregion request_ads
129167
Future<void> _requestAds(AdDisplayContainer container) {
130-
_adsLoader = AdsLoader(
131-
container: container,
132-
onAdsLoaded: (OnAdsLoadedData data) {
133-
final AdsManager manager = data.manager;
134-
_adsManager = data.manager;
135-
136-
manager.setAdsManagerDelegate(AdsManagerDelegate(
137-
onAdEvent: (AdEvent event) {
138-
debugPrint('OnAdEvent: ${event.type} => ${event.adData}');
139-
switch (event.type) {
140-
case AdEventType.loaded:
141-
manager.start();
142-
case AdEventType.contentPauseRequested:
143-
_pauseContent();
144-
case AdEventType.contentResumeRequested:
145-
_resumeContent();
146-
case AdEventType.allAdsCompleted:
147-
manager.destroy();
148-
_adsManager = null;
149-
case AdEventType.clicked:
150-
case AdEventType.complete:
151-
case _:
152-
}
153-
},
154-
onAdErrorEvent: (AdErrorEvent event) {
155-
debugPrint('AdErrorEvent: ${event.error.message}');
156-
_resumeContent();
157-
},
158-
));
159-
160-
manager.init();
161-
},
162-
onAdsLoadError: (AdsLoadErrorData data) {
163-
debugPrint('OnAdsLoadError: ${data.error.message}');
164-
_resumeContent();
165-
},
166-
);
167-
168168
return _adsLoader.requestAds(AdsRequest(
169169
adTagUrl: _adTagUrl,
170170
contentProgressProvider: _contentProgressProvider,

packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class AdsRequestProxyAPIDelegate: PigeonApiDelegateIMAAdsRequest {
1313
/// The current version of the `interactive_media_ads` plugin.
1414
///
1515
/// This must match the version in pubspec.yaml.
16-
static let pluginVersion = "0.2.2+4"
16+
static let pluginVersion = "0.2.2+5"
1717

1818
func pigeonDefaultConstructor(
1919
pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer,

packages/interactive_media_ads/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: interactive_media_ads
22
description: A Flutter plugin for using the Interactive Media Ads SDKs on Android and iOS.
33
repository: https://github.com/flutter/packages/tree/main/packages/interactive_media_ads
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+interactive_media_ads%22
5-
version: 0.2.2+4 # This must match the version in
5+
version: 0.2.2+5 # This must match the version in
66
# `android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt` and
77
# `ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift`
88

0 commit comments

Comments
 (0)