From d3284578159682eff80be966ff5f9005f5226529 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 29 Jul 2025 17:17:21 +0000 Subject: [PATCH 1/9] feat(interactive_media_ads): add remaining methods to AdsRequest --- .../lib/src/ads_request.dart | 67 ++++++++++++++++--- .../lib/src/android/android_ads_loader.dart | 21 ++++++ .../lib/src/ios/ios_ads_loader.dart | 38 ++++++++++- .../platform_ads_request.dart | 45 +++++++++++++ .../test/ads_loader_test.dart | 25 ++++++- .../test/android/ads_loader_test.dart | 20 ++++++ .../test/ios/ads_loader_test.dart | 24 ++++++- 7 files changed, 228 insertions(+), 12 deletions(-) diff --git a/packages/interactive_media_ads/lib/src/ads_request.dart b/packages/interactive_media_ads/lib/src/ads_request.dart index ecc8e2f2ccc5..93b676292628 100644 --- a/packages/interactive_media_ads/lib/src/ads_request.dart +++ b/packages/interactive_media_ads/lib/src/ads_request.dart @@ -9,11 +9,31 @@ import 'platform_interface/platform_interface.dart'; class AdsRequest { /// Creates an [AdsRequest]. AdsRequest({ - required String adTagUrl, - ContentProgressProvider? contentProgressProvider, + required this.adTagUrl, + this.adsResponse, + this.adWillAutoPlay, + this.adWillPlayMuted, + this.continuousPlayback, + this.contentDuration, + this.contentKeywords, + this.contentTitle, + this.liveStreamPrefetchSeconds, + this.vastLoadTimeout, + this.contentUrl, + this.contentProgressProvider, }) : this.fromPlatform( PlatformAdsRequest( adTagUrl: adTagUrl, + adsResponse: adsResponse, + adWillAutoPlay: adWillAutoPlay, + adWillPlayMuted: adWillPlayMuted, + continuousPlayback: continuousPlayback, + contentDuration: contentDuration, + contentKeywords: contentKeywords, + contentTitle: contentTitle, + liveStreamPrefetchSeconds: liveStreamPrefetchSeconds, + vastLoadTimeout: vastLoadTimeout, + contentUrl: contentUrl, contentProgressProvider: contentProgressProvider?.platform, ), ); @@ -25,13 +45,44 @@ class AdsRequest { final PlatformAdsRequest platform; /// The URL from which ads will be requested. - String get adTagUrl => platform.adTagUrl; + final String adTagUrl; + + /// Specifies a VAST, VMAP, or ad rules response to be used instead of making + /// a request through an ad tag URL. + final String? adsResponse; + + /// Notifies the SDK whether the player intends to start the content and ad in + /// response to a user action or whether it will be automatically played. + final bool? adWillAutoPlay; + + /// Notifies the SDK whether the player intends to start the content and ad + /// while muted. + final bool? adWillPlayMuted; + + /// Notifies the SDK whether the player intends to continuously play the + /// content videos one after another similar to TV broadcast. + final bool? continuousPlayback; + + /// Specifies the duration of the content in seconds to be shown. + final double? contentDuration; + + /// Specifies the keywords used to describe the content to be shown. + final List? contentKeywords; + + /// Specifies the title of the content to be shown. + final String? contentTitle; + + /// Specifies the maximum amount of time to wait in seconds, after calling + /// requestAds, before requesting the ad tag URL. + final double? liveStreamPrefetchSeconds; + + /// Specifies the VAST load timeout in milliseconds for a single wrapper. + final double? vastLoadTimeout; + + /// Specifies the universal link to the content’s screen. + final String? contentUrl; /// A [ContentProgressProvider] instance to allow scheduling of ad breaks /// based on content progress (cue points). - ContentProgressProvider? get contentProgressProvider => platform - .contentProgressProvider != - null - ? ContentProgressProvider.fromPlatform(platform.contentProgressProvider!) - : null; + final ContentProgressProvider? contentProgressProvider; } diff --git a/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart b/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart index b0e0902f086d..9881b872295a 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart @@ -90,6 +90,27 @@ base class AndroidAdsLoader extends PlatformAdsLoader { await Future.wait(>[ androidRequest.setAdTagUrl(request.adTagUrl), + if (request.adsResponse != null) + androidRequest.setAdsResponse(request.adsResponse!), + if (request.adWillAutoPlay != null) + androidRequest.setAdWillAutoPlay(request.adWillAutoPlay!), + if (request.adWillPlayMuted != null) + androidRequest.setAdWillPlayMuted(request.adWillPlayMuted!), + if (request.continuousPlayback != null) + androidRequest.setContinuousPlayback(request.continuousPlayback!), + if (request.contentDuration != null) + androidRequest.setContentDuration(request.contentDuration!), + if (request.contentKeywords != null) + androidRequest.setContentKeywords(request.contentKeywords!), + if (request.contentTitle != null) + androidRequest.setContentTitle(request.contentTitle!), + if (request.liveStreamPrefetchSeconds != null) + androidRequest + .setLiveStreamPrefetchSeconds(request.liveStreamPrefetchSeconds!), + if (request.vastLoadTimeout != null) + androidRequest.setVastLoadTimeout(request.vastLoadTimeout!), + if (request.contentUrl != null) + androidRequest.setContentUrl(request.contentUrl!), if (request.contentProgressProvider != null) androidRequest.setContentProgressProvider( (request.contentProgressProvider! as AndroidContentProgressProvider) diff --git a/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart b/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart index 276faead7cf9..cd9b9373bd4f 100644 --- a/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart @@ -74,7 +74,7 @@ base class IOSAdsLoader extends PlatformAdsLoader { @override Future requestAds(PlatformAdsRequest request) async { - return _adsLoader.requestAds(_iosParams._proxy.newIMAAdsRequest( + final IMAAdsRequest adsRequest = _iosParams._proxy.newIMAAdsRequest( adTagUrl: request.adTagUrl, adDisplayContainer: (_iosParams.container as IOSAdDisplayContainer).adDisplayContainer!, @@ -82,7 +82,41 @@ base class IOSAdsLoader extends PlatformAdsLoader { ? (request.contentProgressProvider! as IOSContentProgressProvider) .contentPlayhead : null, - )); + ); + + if (request.adsResponse != null) { + await adsRequest.setAdsResponse(request.adsResponse!); + } + if (request.adWillAutoPlay != null) { + await adsRequest.setAdWillAutoPlay(request.adWillAutoPlay!); + } + if (request.adWillPlayMuted != null) { + await adsRequest.setAdWillPlayMuted(request.adWillPlayMuted!); + } + if (request.continuousPlayback != null) { + await adsRequest.setContinuousPlayback(request.continuousPlayback!); + } + if (request.contentDuration != null) { + await adsRequest.setContentDuration(request.contentDuration!); + } + if (request.contentKeywords != null) { + await adsRequest.setContentKeywords(request.contentKeywords!); + } + if (request.contentTitle != null) { + await adsRequest.setContentTitle(request.contentTitle!); + } + if (request.liveStreamPrefetchSeconds != null) { + await adsRequest + .setLiveStreamPrefetchSeconds(request.liveStreamPrefetchSeconds!); + } + if (request.vastLoadTimeout != null) { + await adsRequest.setVastLoadTimeout(request.vastLoadTimeout!); + } + if (request.contentUrl != null) { + await adsRequest.setContentURL(request.contentUrl!); + } + + return _adsLoader.requestAds(adsRequest); } // This value is created in a static method because the callback methods for diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart index b9ef51b0ec8c..5643a9a615f1 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart @@ -9,12 +9,57 @@ class PlatformAdsRequest { /// Creates an [PlatformAdsRequest]. PlatformAdsRequest({ required this.adTagUrl, + this.adsResponse, + this.adWillAutoPlay, + this.adWillPlayMuted, + this.continuousPlayback, + this.contentDuration, + this.contentKeywords, + this.contentTitle, + this.liveStreamPrefetchSeconds, + this.vastLoadTimeout, + this.contentUrl, this.contentProgressProvider, }); /// The URL from which ads will be requested. final String adTagUrl; + /// Specifies a VAST, VMAP, or ad rules response to be used instead of making + /// a request through an ad tag URL. + final String? adsResponse; + + /// Notifies the SDK whether the player intends to start the content and ad in + /// response to a user action or whether it will be automatically played. + final bool? adWillAutoPlay; + + /// Notifies the SDK whether the player intends to start the content and ad + /// while muted. + final bool? adWillPlayMuted; + + /// Notifies the SDK whether the player intends to continuously play the + /// content videos one after another similar to TV broadcast. + final bool? continuousPlayback; + + /// Specifies the duration of the content in seconds to be shown. + final double? contentDuration; + + /// Specifies the keywords used to describe the content to be shown. + final List? contentKeywords; + + /// Specifies the title of the content to be shown. + final String? contentTitle; + + /// Specifies the maximum amount of time to wait in seconds, after calling + /// requestAds, before requesting the ad tag URL. + final double? liveStreamPrefetchSeconds; + + /// Specifies the VAST load timeout in milliseconds for a single wrapper. + final double? vastLoadTimeout; + + /// Specifies the universal link to the content’s screen. + final String? contentUrl; + /// A [PlatformContentProgressProvider] instance to allow scheduling of ad /// breaks based on content progress (cue points). final PlatformContentProgressProvider? contentProgressProvider; diff --git a/packages/interactive_media_ads/test/ads_loader_test.dart b/packages/interactive_media_ads/test/ads_loader_test.dart index 736895a8f8a7..45b825e6dab4 100644 --- a/packages/interactive_media_ads/test/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/ads_loader_test.dart @@ -29,6 +29,16 @@ void main() { test('requestAds', () async { final PlatformAdsRequest platformRequest = PlatformAdsRequest( adTagUrl: 'adTagUrl', + adsResponse: 'adsResponse', + adWillAutoPlay: true, + adWillPlayMuted: false, + continuousPlayback: true, + contentDuration: 2.0, + contentKeywords: ['keyword1', 'keyword2'], + contentTitle: 'contentTitle', + liveStreamPrefetchSeconds: 3.0, + vastLoadTimeout: 4.0, + contentUrl: 'contentUrl', contentProgressProvider: TestContentProgressProvider( const PlatformContentProgressProviderCreationParams(), ), @@ -42,7 +52,20 @@ void main() { onAdsLoadError: (AdsLoadErrorData data) {}, ), onRequestAds: expectAsync1((PlatformAdsRequest request) async { - expect(request, platformRequest); + expect(request.adTagUrl, platformRequest.adTagUrl); + expect(request.adsResponse, platformRequest.adsResponse); + expect(request.adWillAutoPlay, platformRequest.adWillAutoPlay); + expect(request.adWillPlayMuted, platformRequest.adWillPlayMuted); + expect(request.continuousPlayback, platformRequest.continuousPlayback); + expect(request.contentDuration, platformRequest.contentDuration); + expect(request.contentKeywords, platformRequest.contentKeywords); + expect(request.contentTitle, platformRequest.contentTitle); + expect(request.liveStreamPrefetchSeconds, + platformRequest.liveStreamPrefetchSeconds); + expect(request.vastLoadTimeout, platformRequest.vastLoadTimeout); + expect(request.contentUrl, platformRequest.contentUrl); + expect(request.contentProgressProvider, + platformRequest.contentProgressProvider); }), onContentComplete: () async {}, ); diff --git a/packages/interactive_media_ads/test/android/ads_loader_test.dart b/packages/interactive_media_ads/test/android/ads_loader_test.dart index 084ad3edef3a..2662229f4bf0 100644 --- a/packages/interactive_media_ads/test/android/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/android/ads_loader_test.dart @@ -135,12 +135,32 @@ void main() { await adsLoader.requestAds( PlatformAdsRequest( adTagUrl: 'url', + adsResponse: 'adsResponse', + adWillAutoPlay: true, + adWillPlayMuted: false, + continuousPlayback: true, + contentDuration: 2.0, + contentKeywords: ['keyword1', 'keyword2'], + contentTitle: 'contentTitle', + liveStreamPrefetchSeconds: 3.0, + vastLoadTimeout: 4.0, + contentUrl: 'contentUrl', contentProgressProvider: progressProvider, ), ); verifyInOrder(>[ mockAdsRequest.setAdTagUrl('url'), + mockAdsRequest.setAdsResponse('adsResponse'), + mockAdsRequest.setAdWillAutoPlay(true), + mockAdsRequest.setAdWillPlayMuted(false), + mockAdsRequest.setContinuousPlayback(true), + mockAdsRequest.setContentDuration(2.0), + mockAdsRequest.setContentKeywords(['keyword1', 'keyword2']), + mockAdsRequest.setContentTitle('contentTitle'), + mockAdsRequest.setLiveStreamPrefetchSeconds(3.0), + mockAdsRequest.setVastLoadTimeout(4.0), + mockAdsRequest.setContentUrl('contentUrl'), mockAdsRequest.setContentProgressProvider( progressProvider.progressProvider, ), diff --git a/packages/interactive_media_ads/test/ios/ads_loader_test.dart b/packages/interactive_media_ads/test/ios/ads_loader_test.dart index 812878726d8d..4e50abb4e3d9 100644 --- a/packages/interactive_media_ads/test/ios/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/ios/ads_loader_test.dart @@ -85,6 +85,7 @@ void main() { final MockIMAAdsLoader mockLoader = MockIMAAdsLoader(); final ima.IMAContentPlayhead contentPlayheadInstance = ima.IMAContentPlayhead(); + final MockIMAAdsRequest mockRequest = MockIMAAdsRequest(); final InteractiveMediaAdsProxy imaProxy = InteractiveMediaAdsProxy( newIMAAdsLoader: ({ima.IMASettings? settings}) => mockLoader, newIMAAdsRequest: ({ @@ -95,7 +96,7 @@ void main() { expect(adTagUrl, adTag); expect(adDisplayContainer, container.adDisplayContainer); expect(contentPlayhead, contentPlayheadInstance); - return MockIMAAdsRequest(); + return mockRequest; }, newIMAContentPlayhead: () => contentPlayheadInstance, ); @@ -116,9 +117,30 @@ void main() { await loader.requestAds(PlatformAdsRequest( adTagUrl: adTag, + adsResponse: 'adsResponse', + adWillAutoPlay: true, + adWillPlayMuted: false, + continuousPlayback: true, + contentDuration: 2.0, + contentKeywords: ['keyword1', 'keyword2'], + contentTitle: 'contentTitle', + liveStreamPrefetchSeconds: 3.0, + vastLoadTimeout: 4.0, + contentUrl: 'contentUrl', contentProgressProvider: provider, )); + verify(mockRequest.setAdsResponse('adsResponse')); + verify(mockRequest.setAdWillAutoPlay(true)); + verify(mockRequest.setAdWillPlayMuted(false)); + verify(mockRequest.setContinuousPlayback(true)); + verify(mockRequest.setContentDuration(2.0)); + verify(mockRequest.setContentKeywords(['keyword1', 'keyword2'])); + verify(mockRequest.setContentTitle('contentTitle')); + verify(mockRequest.setLiveStreamPrefetchSeconds(3.0)); + verify(mockRequest.setVastLoadTimeout(4.0)); + verify(mockRequest.setContentURL('contentUrl')); + verify(mockLoader.requestAds(any)); }); From 31c8b8d4813824cc129dbb89297e9bf259dc2d21 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 30 Jul 2025 20:52:01 -0400 Subject: [PATCH 2/9] fix ads request implementation --- .../lib/src/ads_request.dart | 94 ++++++++++----- .../lib/src/android/android_ads_loader.dart | 51 ++++---- .../lib/src/ios/ios_ads_loader.dart | 86 +++++++------- .../platform_ads_request.dart | 112 +++++++++++++++--- 4 files changed, 227 insertions(+), 116 deletions(-) diff --git a/packages/interactive_media_ads/lib/src/ads_request.dart b/packages/interactive_media_ads/lib/src/ads_request.dart index 93b676292628..441391a12a3b 100644 --- a/packages/interactive_media_ads/lib/src/ads_request.dart +++ b/packages/interactive_media_ads/lib/src/ads_request.dart @@ -9,22 +9,20 @@ import 'platform_interface/platform_interface.dart'; class AdsRequest { /// Creates an [AdsRequest]. AdsRequest({ - required this.adTagUrl, - this.adsResponse, - this.adWillAutoPlay, - this.adWillPlayMuted, - this.continuousPlayback, - this.contentDuration, - this.contentKeywords, - this.contentTitle, - this.liveStreamPrefetchSeconds, - this.vastLoadTimeout, - this.contentUrl, - this.contentProgressProvider, + required String adTagUrl, + ContentProgressProvider? contentProgressProvider, + bool? adWillAutoPlay, + bool? adWillPlayMuted, + bool? continuousPlayback, + double? contentDuration, + List? contentKeywords, + String? contentTitle, + double? liveStreamPrefetchSeconds, + double? vastLoadTimeout, }) : this.fromPlatform( - PlatformAdsRequest( + PlatformAdsRequest.withAdTagUrl( adTagUrl: adTagUrl, - adsResponse: adsResponse, + contentProgressProvider: contentProgressProvider?.platform, adWillAutoPlay: adWillAutoPlay, adWillPlayMuted: adWillPlayMuted, continuousPlayback: continuousPlayback, @@ -33,8 +31,33 @@ class AdsRequest { contentTitle: contentTitle, liveStreamPrefetchSeconds: liveStreamPrefetchSeconds, vastLoadTimeout: vastLoadTimeout, - contentUrl: contentUrl, + ), + ); + + /// Creates an [AdsRequest]. + AdsRequest.withAdsResponse({ + required String adsResponse, + ContentProgressProvider? contentProgressProvider, + bool? adWillAutoPlay, + bool? adWillPlayMuted, + bool? continuousPlayback, + double? contentDuration, + List? contentKeywords, + String? contentTitle, + double? liveStreamPrefetchSeconds, + double? vastLoadTimeout, + }) : this.fromPlatform( + PlatformAdsRequest.withAdsResponse( + adsResponse: adsResponse, contentProgressProvider: contentProgressProvider?.platform, + adWillAutoPlay: adWillAutoPlay, + adWillPlayMuted: adWillPlayMuted, + continuousPlayback: continuousPlayback, + contentDuration: contentDuration, + contentKeywords: contentKeywords, + contentTitle: contentTitle, + liveStreamPrefetchSeconds: liveStreamPrefetchSeconds, + vastLoadTimeout: vastLoadTimeout, ), ); @@ -45,44 +68,51 @@ class AdsRequest { final PlatformAdsRequest platform; /// The URL from which ads will be requested. - final String adTagUrl; + String get adTagUrl => switch (platform) { + final PlatformAdsRequestWithAdTagUrl request => request.adTagUrl, + PlatformAdsRequestWithAdsResponse() => '', + }; /// Specifies a VAST, VMAP, or ad rules response to be used instead of making /// a request through an ad tag URL. - final String? adsResponse; + String? get adsResponse => switch (platform) { + final PlatformAdsRequestWithAdsResponse request => request.adsResponse, + PlatformAdsRequestWithAdTagUrl() => null, + }; + + /// A [ContentProgressProvider] instance to allow scheduling of ad breaks + /// based on content progress (cue points). + ContentProgressProvider? get contentProgressProvider => platform + .contentProgressProvider != + null + ? ContentProgressProvider.fromPlatform(platform.contentProgressProvider!) + : null; /// Notifies the SDK whether the player intends to start the content and ad in /// response to a user action or whether it will be automatically played. - final bool? adWillAutoPlay; + bool? get adWillAutoPlay => platform.adWillAutoPlay; /// Notifies the SDK whether the player intends to start the content and ad /// while muted. - final bool? adWillPlayMuted; + bool? get adWillPlayMuted => platform.adWillPlayMuted; /// Notifies the SDK whether the player intends to continuously play the /// content videos one after another similar to TV broadcast. - final bool? continuousPlayback; + bool? get continuousPlayback => platform.continuousPlayback; /// Specifies the duration of the content in seconds to be shown. - final double? contentDuration; + double? get contentDuration => platform.contentDuration; /// Specifies the keywords used to describe the content to be shown. - final List? contentKeywords; + List? get contentKeywords => platform.contentKeywords; /// Specifies the title of the content to be shown. - final String? contentTitle; + String? get contentTitle => platform.contentTitle; /// Specifies the maximum amount of time to wait in seconds, after calling /// requestAds, before requesting the ad tag URL. - final double? liveStreamPrefetchSeconds; + double? get liveStreamPrefetchSeconds => platform.liveStreamPrefetchSeconds; /// Specifies the VAST load timeout in milliseconds for a single wrapper. - final double? vastLoadTimeout; - - /// Specifies the universal link to the content’s screen. - final String? contentUrl; - - /// A [ContentProgressProvider] instance to allow scheduling of ad breaks - /// based on content progress (cue points). - final ContentProgressProvider? contentProgressProvider; + double? get vastLoadTimeout => platform.vastLoadTimeout; } diff --git a/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart b/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart index 9881b872295a..32f88df2c141 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart @@ -89,32 +89,33 @@ base class AndroidAdsLoader extends PlatformAdsLoader { final ima.AdsRequest androidRequest = await _sdkFactory.createAdsRequest(); await Future.wait(>[ - androidRequest.setAdTagUrl(request.adTagUrl), - if (request.adsResponse != null) - androidRequest.setAdsResponse(request.adsResponse!), - if (request.adWillAutoPlay != null) - androidRequest.setAdWillAutoPlay(request.adWillAutoPlay!), - if (request.adWillPlayMuted != null) - androidRequest.setAdWillPlayMuted(request.adWillPlayMuted!), - if (request.continuousPlayback != null) - androidRequest.setContinuousPlayback(request.continuousPlayback!), - if (request.contentDuration != null) - androidRequest.setContentDuration(request.contentDuration!), - if (request.contentKeywords != null) - androidRequest.setContentKeywords(request.contentKeywords!), - if (request.contentTitle != null) - androidRequest.setContentTitle(request.contentTitle!), - if (request.liveStreamPrefetchSeconds != null) - androidRequest - .setLiveStreamPrefetchSeconds(request.liveStreamPrefetchSeconds!), - if (request.vastLoadTimeout != null) - androidRequest.setVastLoadTimeout(request.vastLoadTimeout!), - if (request.contentUrl != null) - androidRequest.setContentUrl(request.contentUrl!), - if (request.contentProgressProvider != null) + if (request case final PlatformAdsRequestWithAdTagUrl request) + androidRequest.setAdTagUrl(request.adTagUrl), + if (request case final PlatformAdsRequestWithAdsResponse request) + androidRequest.setAdTagUrl(request.adsResponse), + if (request.adWillAutoPlay case final bool adWillAutoPlay) + androidRequest.setAdWillAutoPlay(adWillAutoPlay), + if (request.adWillPlayMuted case final bool adWillPlayMuted) + androidRequest.setAdWillPlayMuted(adWillPlayMuted), + if (request.continuousPlayback case final bool continuousPlayback) + androidRequest.setContinuousPlayback(continuousPlayback), + if (request.contentDuration case final double contentDuration) + androidRequest.setContentDuration(contentDuration), + if (request.contentKeywords case final List contentKeywords) + androidRequest.setContentKeywords(contentKeywords), + if (request.contentTitle case final String contentTitle) + androidRequest.setContentTitle(contentTitle), + if (request.liveStreamPrefetchSeconds + case final double liveStreamPrefetchSeconds) + androidRequest.setLiveStreamPrefetchSeconds( + liveStreamPrefetchSeconds, + ), + if (request.vastLoadTimeout case final double vastLoadTimeout) + androidRequest.setVastLoadTimeout(vastLoadTimeout), + if (request.contentProgressProvider + case final AndroidContentProgressProvider contentProgressProvider) androidRequest.setContentProgressProvider( - (request.contentProgressProvider! as AndroidContentProgressProvider) - .progressProvider, + contentProgressProvider.progressProvider, ), adsLoader.requestAds(androidRequest), ]); diff --git a/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart b/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart index cd9b9373bd4f..8131be4166bd 100644 --- a/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart @@ -73,50 +73,50 @@ base class IOSAdsLoader extends PlatformAdsLoader { } @override - Future requestAds(PlatformAdsRequest request) async { - final IMAAdsRequest adsRequest = _iosParams._proxy.newIMAAdsRequest( - adTagUrl: request.adTagUrl, - adDisplayContainer: - (_iosParams.container as IOSAdDisplayContainer).adDisplayContainer!, - contentPlayhead: request.contentProgressProvider != null - ? (request.contentProgressProvider! as IOSContentProgressProvider) - .contentPlayhead - : null, - ); + Future requestAds(PlatformAdsRequest request) { + final IMAAdDisplayContainer adDisplayContainer = + (_iosParams.container as IOSAdDisplayContainer).adDisplayContainer!; + final IMAContentPlayhead? contentProgressProvider = + request.contentProgressProvider != null + ? (request.contentProgressProvider! as IOSContentProgressProvider) + .contentPlayhead + : null; + + final IMAAdsRequest adsRequest = switch (request) { + final PlatformAdsRequestWithAdTagUrl request => IMAAdsRequest( + adTagUrl: request.adTagUrl, + adDisplayContainer: adDisplayContainer, + contentPlayhead: contentProgressProvider, + ), + PlatformAdsRequestWithAdsResponse() => IMAAdsRequest.withAdsResponse( + adsResponse: request.adsResponse, + adDisplayContainer: adDisplayContainer, + contentPlayhead: contentProgressProvider, + ), + }; - if (request.adsResponse != null) { - await adsRequest.setAdsResponse(request.adsResponse!); - } - if (request.adWillAutoPlay != null) { - await adsRequest.setAdWillAutoPlay(request.adWillAutoPlay!); - } - if (request.adWillPlayMuted != null) { - await adsRequest.setAdWillPlayMuted(request.adWillPlayMuted!); - } - if (request.continuousPlayback != null) { - await adsRequest.setContinuousPlayback(request.continuousPlayback!); - } - if (request.contentDuration != null) { - await adsRequest.setContentDuration(request.contentDuration!); - } - if (request.contentKeywords != null) { - await adsRequest.setContentKeywords(request.contentKeywords!); - } - if (request.contentTitle != null) { - await adsRequest.setContentTitle(request.contentTitle!); - } - if (request.liveStreamPrefetchSeconds != null) { - await adsRequest - .setLiveStreamPrefetchSeconds(request.liveStreamPrefetchSeconds!); - } - if (request.vastLoadTimeout != null) { - await adsRequest.setVastLoadTimeout(request.vastLoadTimeout!); - } - if (request.contentUrl != null) { - await adsRequest.setContentURL(request.contentUrl!); - } - - return _adsLoader.requestAds(adsRequest); + return Future.wait(>[ + if (request.adWillAutoPlay case final bool adWillAutoPlay) + adsRequest.setAdWillAutoPlay(adWillAutoPlay), + if (request.adWillPlayMuted case final bool adWillPlayMuted) + adsRequest.setAdWillPlayMuted(adWillPlayMuted), + if (request.continuousPlayback case final bool continuousPlayback) + adsRequest.setContinuousPlayback(continuousPlayback), + if (request.contentDuration case final double contentDuration) + adsRequest.setContentDuration(contentDuration), + if (request.contentKeywords case final List contentKeywords) + adsRequest.setContentKeywords(contentKeywords), + if (request.contentTitle case final String contentTitle) + adsRequest.setContentTitle(contentTitle), + if (request.liveStreamPrefetchSeconds + case final double liveStreamPrefetchSeconds) + adsRequest.setLiveStreamPrefetchSeconds( + liveStreamPrefetchSeconds, + ), + if (request.vastLoadTimeout case final double vastLoadTimeout) + adsRequest.setVastLoadTimeout(vastLoadTimeout), + _adsLoader.requestAds(adsRequest), + ]); } // This value is created in a static method because the callback methods for diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart index 5643a9a615f1..22b3f9a5df27 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart @@ -5,11 +5,10 @@ import 'platform_content_progress_provider.dart'; /// An object containing the data used to request ads from the server. -class PlatformAdsRequest { +sealed class PlatformAdsRequest { /// Creates an [PlatformAdsRequest]. - PlatformAdsRequest({ - required this.adTagUrl, - this.adsResponse, + PlatformAdsRequest._({ + this.contentProgressProvider, this.adWillAutoPlay, this.adWillPlayMuted, this.continuousPlayback, @@ -18,16 +17,61 @@ class PlatformAdsRequest { this.contentTitle, this.liveStreamPrefetchSeconds, this.vastLoadTimeout, - this.contentUrl, - this.contentProgressProvider, }); - /// The URL from which ads will be requested. - final String adTagUrl; + factory PlatformAdsRequest.withAdTagUrl({ + required String adTagUrl, + PlatformContentProgressProvider? contentProgressProvider, + bool? adWillAutoPlay, + bool? adWillPlayMuted, + bool? continuousPlayback, + double? contentDuration, + List? contentKeywords, + String? contentTitle, + double? liveStreamPrefetchSeconds, + double? vastLoadTimeout, + }) => + PlatformAdsRequestWithAdTagUrl._( + adTagUrl: adTagUrl, + contentProgressProvider: contentProgressProvider, + adWillAutoPlay: adWillAutoPlay, + adWillPlayMuted: adWillPlayMuted, + continuousPlayback: continuousPlayback, + contentDuration: contentDuration, + contentKeywords: contentKeywords, + contentTitle: contentTitle, + liveStreamPrefetchSeconds: liveStreamPrefetchSeconds, + vastLoadTimeout: vastLoadTimeout, + ); - /// Specifies a VAST, VMAP, or ad rules response to be used instead of making - /// a request through an ad tag URL. - final String? adsResponse; + factory PlatformAdsRequest.withAdsResponse({ + required String adsResponse, + PlatformContentProgressProvider? contentProgressProvider, + bool? adWillAutoPlay, + bool? adWillPlayMuted, + bool? continuousPlayback, + double? contentDuration, + List? contentKeywords, + String? contentTitle, + double? liveStreamPrefetchSeconds, + double? vastLoadTimeout, + }) => + PlatformAdsRequestWithAdsResponse._( + adsResponse: adsResponse, + contentProgressProvider: contentProgressProvider, + adWillAutoPlay: adWillAutoPlay, + adWillPlayMuted: adWillPlayMuted, + continuousPlayback: continuousPlayback, + contentDuration: contentDuration, + contentKeywords: contentKeywords, + contentTitle: contentTitle, + liveStreamPrefetchSeconds: liveStreamPrefetchSeconds, + vastLoadTimeout: vastLoadTimeout, + ); + + /// A [PlatformContentProgressProvider] instance to allow scheduling of ad + /// breaks based on content progress (cue points). + final PlatformContentProgressProvider? contentProgressProvider; /// Notifies the SDK whether the player intends to start the content and ad in /// response to a user action or whether it will be automatically played. @@ -56,11 +100,47 @@ class PlatformAdsRequest { /// Specifies the VAST load timeout in milliseconds for a single wrapper. final double? vastLoadTimeout; +} - /// Specifies the universal link to the content’s screen. - final String? contentUrl; +/// An object containing the data used to request ads from the server with an +/// ad tag URL. +class PlatformAdsRequestWithAdTagUrl extends PlatformAdsRequest { + /// Constructs a [PlatformAdsRequestWithAdTagUrl]. + PlatformAdsRequestWithAdTagUrl._({ + required this.adTagUrl, + super.contentProgressProvider, + super.adWillAutoPlay, + super.adWillPlayMuted, + super.continuousPlayback, + super.contentDuration, + super.contentKeywords, + super.contentTitle, + super.liveStreamPrefetchSeconds, + super.vastLoadTimeout, + }) : super._(); - /// A [PlatformContentProgressProvider] instance to allow scheduling of ad - /// breaks based on content progress (cue points). - final PlatformContentProgressProvider? contentProgressProvider; + /// The URL from which ads will be requested. + final String adTagUrl; +} + +/// An object containing the data used to request ads from the server with an +/// ad rules response. +class PlatformAdsRequestWithAdsResponse extends PlatformAdsRequest { + /// Constructs a [PlatformAdsRequestWithAdsResponse]. + PlatformAdsRequestWithAdsResponse._({ + required this.adsResponse, + super.contentProgressProvider, + super.adWillAutoPlay, + super.adWillPlayMuted, + super.continuousPlayback, + super.contentDuration, + super.contentKeywords, + super.contentTitle, + super.liveStreamPrefetchSeconds, + super.vastLoadTimeout, + }) : super._(); + + /// Specifies a VAST, VMAP, or ad rules response to be used instead of making + /// a request through an ad tag URL. + final String adsResponse; } From 8d6b8ffaa268b9de50cf6a58e8877b6848ffb5ee Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 30 Jul 2025 21:11:25 -0400 Subject: [PATCH 3/9] fix tests --- .../test/ads_loader_test.dart | 38 +++-- .../test/android/ads_loader_test.dart | 6 +- .../test/android/ads_loader_test.mocks.dart | 95 ++++++++++++ .../test/ios/ads_loader_test.dart | 27 ++-- .../test/ios/ads_loader_test.mocks.dart | 140 ++++++++++++++++++ 5 files changed, 275 insertions(+), 31 deletions(-) diff --git a/packages/interactive_media_ads/test/ads_loader_test.dart b/packages/interactive_media_ads/test/ads_loader_test.dart index 45b825e6dab4..4dcf6962e99c 100644 --- a/packages/interactive_media_ads/test/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/ads_loader_test.dart @@ -27,9 +27,8 @@ void main() { }); test('requestAds', () async { - final PlatformAdsRequest platformRequest = PlatformAdsRequest( + final PlatformAdsRequest platformRequest = PlatformAdsRequest.withAdTagUrl( adTagUrl: 'adTagUrl', - adsResponse: 'adsResponse', adWillAutoPlay: true, adWillPlayMuted: false, continuousPlayback: true, @@ -38,7 +37,6 @@ void main() { contentTitle: 'contentTitle', liveStreamPrefetchSeconds: 3.0, vastLoadTimeout: 4.0, - contentUrl: 'contentUrl', contentProgressProvider: TestContentProgressProvider( const PlatformContentProgressProviderCreationParams(), ), @@ -52,26 +50,44 @@ void main() { onAdsLoadError: (AdsLoadErrorData data) {}, ), onRequestAds: expectAsync1((PlatformAdsRequest request) async { - expect(request.adTagUrl, platformRequest.adTagUrl); - expect(request.adsResponse, platformRequest.adsResponse); + expect( + (request as PlatformAdsRequestWithAdTagUrl).adTagUrl, + (platformRequest as PlatformAdsRequestWithAdTagUrl).adTagUrl, + ); expect(request.adWillAutoPlay, platformRequest.adWillAutoPlay); expect(request.adWillPlayMuted, platformRequest.adWillPlayMuted); expect(request.continuousPlayback, platformRequest.continuousPlayback); expect(request.contentDuration, platformRequest.contentDuration); expect(request.contentKeywords, platformRequest.contentKeywords); expect(request.contentTitle, platformRequest.contentTitle); - expect(request.liveStreamPrefetchSeconds, - platformRequest.liveStreamPrefetchSeconds); + expect( + request.liveStreamPrefetchSeconds, + platformRequest.liveStreamPrefetchSeconds, + ); expect(request.vastLoadTimeout, platformRequest.vastLoadTimeout); - expect(request.contentUrl, platformRequest.contentUrl); - expect(request.contentProgressProvider, - platformRequest.contentProgressProvider); + expect( + request.contentProgressProvider, + platformRequest.contentProgressProvider, + ); }), onContentComplete: () async {}, ); final AdsLoader loader = AdsLoader.fromPlatform(adsLoader); - await loader.requestAds(AdsRequest.fromPlatform(platformRequest)); + await loader.requestAds(AdsRequest( + adTagUrl: (platformRequest as PlatformAdsRequestWithAdTagUrl).adTagUrl, + adWillAutoPlay: platformRequest.adWillAutoPlay, + adWillPlayMuted: platformRequest.adWillPlayMuted, + continuousPlayback: platformRequest.continuousPlayback, + contentDuration: platformRequest.contentDuration, + contentKeywords: platformRequest.contentKeywords, + contentTitle: platformRequest.contentTitle, + liveStreamPrefetchSeconds: platformRequest.liveStreamPrefetchSeconds, + vastLoadTimeout: platformRequest.vastLoadTimeout, + contentProgressProvider: ContentProgressProvider.fromPlatform( + platformRequest.contentProgressProvider!, + ), + )); }); } diff --git a/packages/interactive_media_ads/test/android/ads_loader_test.dart b/packages/interactive_media_ads/test/android/ads_loader_test.dart index 2662229f4bf0..30a3acd02ab4 100644 --- a/packages/interactive_media_ads/test/android/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/android/ads_loader_test.dart @@ -133,9 +133,8 @@ void main() { AndroidContentProgressProviderCreationParams(proxy: proxy), ); await adsLoader.requestAds( - PlatformAdsRequest( + PlatformAdsRequest.withAdTagUrl( adTagUrl: 'url', - adsResponse: 'adsResponse', adWillAutoPlay: true, adWillPlayMuted: false, continuousPlayback: true, @@ -144,14 +143,12 @@ void main() { contentTitle: 'contentTitle', liveStreamPrefetchSeconds: 3.0, vastLoadTimeout: 4.0, - contentUrl: 'contentUrl', contentProgressProvider: progressProvider, ), ); verifyInOrder(>[ mockAdsRequest.setAdTagUrl('url'), - mockAdsRequest.setAdsResponse('adsResponse'), mockAdsRequest.setAdWillAutoPlay(true), mockAdsRequest.setAdWillPlayMuted(false), mockAdsRequest.setContinuousPlayback(true), @@ -160,7 +157,6 @@ void main() { mockAdsRequest.setContentTitle('contentTitle'), mockAdsRequest.setLiveStreamPrefetchSeconds(3.0), mockAdsRequest.setVastLoadTimeout(4.0), - mockAdsRequest.setContentUrl('contentUrl'), mockAdsRequest.setContentProgressProvider( progressProvider.progressProvider, ), diff --git a/packages/interactive_media_ads/test/android/ads_loader_test.mocks.dart b/packages/interactive_media_ads/test/android/ads_loader_test.mocks.dart index b5375b6e5e58..beb7cf9d8e44 100644 --- a/packages/interactive_media_ads/test/android/ads_loader_test.mocks.dart +++ b/packages/interactive_media_ads/test/android/ads_loader_test.mocks.dart @@ -918,6 +918,101 @@ class MockAdsRequest extends _i1.Mock implements _i2.AdsRequest { returnValueForMissingStub: _i5.Future.value(), ) as _i5.Future); + @override + _i5.Future setAdWillAutoPlay(bool? willAutoPlay) => (super.noSuchMethod( + Invocation.method( + #setAdWillAutoPlay, + [willAutoPlay], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setAdWillPlayMuted(bool? willPlayMuted) => + (super.noSuchMethod( + Invocation.method( + #setAdWillPlayMuted, + [willPlayMuted], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setAdsResponse(String? cannedAdResponse) => + (super.noSuchMethod( + Invocation.method( + #setAdsResponse, + [cannedAdResponse], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setContentDuration(double? duration) => (super.noSuchMethod( + Invocation.method( + #setContentDuration, + [duration], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setContentKeywords(List? keywords) => + (super.noSuchMethod( + Invocation.method( + #setContentKeywords, + [keywords], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setContentTitle(String? title) => (super.noSuchMethod( + Invocation.method( + #setContentTitle, + [title], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setContinuousPlayback(bool? continuousPlayback) => + (super.noSuchMethod( + Invocation.method( + #setContinuousPlayback, + [continuousPlayback], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setLiveStreamPrefetchSeconds(double? prefetchTime) => + (super.noSuchMethod( + Invocation.method( + #setLiveStreamPrefetchSeconds, + [prefetchTime], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setVastLoadTimeout(double? timeout) => (super.noSuchMethod( + Invocation.method( + #setVastLoadTimeout, + [timeout], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override _i2.AdsRequest pigeon_copy() => (super.noSuchMethod( Invocation.method( diff --git a/packages/interactive_media_ads/test/ios/ads_loader_test.dart b/packages/interactive_media_ads/test/ios/ads_loader_test.dart index 4e50abb4e3d9..bfdac72cee42 100644 --- a/packages/interactive_media_ads/test/ios/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/ios/ads_loader_test.dart @@ -88,19 +88,20 @@ void main() { final MockIMAAdsRequest mockRequest = MockIMAAdsRequest(); final InteractiveMediaAdsProxy imaProxy = InteractiveMediaAdsProxy( newIMAAdsLoader: ({ima.IMASettings? settings}) => mockLoader, - newIMAAdsRequest: ({ - required String adTagUrl, - required ima.IMAAdDisplayContainer adDisplayContainer, - ima.IMAContentPlayhead? contentPlayhead, - }) { - expect(adTagUrl, adTag); - expect(adDisplayContainer, container.adDisplayContainer); - expect(contentPlayhead, contentPlayheadInstance); - return mockRequest; - }, newIMAContentPlayhead: () => contentPlayheadInstance, ); + ima.PigeonOverrides.iMAAdsRequest_new = ({ + required String adTagUrl, + required ima.IMAAdDisplayContainer adDisplayContainer, + ima.IMAContentPlayhead? contentPlayhead, + }) { + expect(adTagUrl, adTag); + expect(adDisplayContainer, container.adDisplayContainer); + expect(contentPlayhead, contentPlayheadInstance); + return mockRequest; + }; + final IOSAdsLoader loader = IOSAdsLoader( IOSAdsLoaderCreationParams( container: container, @@ -115,9 +116,8 @@ void main() { IOSContentProgressProviderCreationParams(proxy: imaProxy), ); - await loader.requestAds(PlatformAdsRequest( + await loader.requestAds(PlatformAdsRequest.withAdTagUrl( adTagUrl: adTag, - adsResponse: 'adsResponse', adWillAutoPlay: true, adWillPlayMuted: false, continuousPlayback: true, @@ -126,11 +126,9 @@ void main() { contentTitle: 'contentTitle', liveStreamPrefetchSeconds: 3.0, vastLoadTimeout: 4.0, - contentUrl: 'contentUrl', contentProgressProvider: provider, )); - verify(mockRequest.setAdsResponse('adsResponse')); verify(mockRequest.setAdWillAutoPlay(true)); verify(mockRequest.setAdWillPlayMuted(false)); verify(mockRequest.setContinuousPlayback(true)); @@ -139,7 +137,6 @@ void main() { verify(mockRequest.setContentTitle('contentTitle')); verify(mockRequest.setLiveStreamPrefetchSeconds(3.0)); verify(mockRequest.setVastLoadTimeout(4.0)); - verify(mockRequest.setContentURL('contentUrl')); verify(mockLoader.requestAds(any)); }); diff --git a/packages/interactive_media_ads/test/ios/ads_loader_test.mocks.dart b/packages/interactive_media_ads/test/ios/ads_loader_test.mocks.dart index 0976c9b8e419..f847c4e50f47 100644 --- a/packages/interactive_media_ads/test/ios/ads_loader_test.mocks.dart +++ b/packages/interactive_media_ads/test/ios/ads_loader_test.mocks.dart @@ -515,6 +515,146 @@ class MockIMAAdsRequest extends _i1.Mock implements _i2.IMAAdsRequest { ), ) as _i2.PigeonInstanceManager); + @override + _i3.Future getAdTagUrl() => (super.noSuchMethod( + Invocation.method( + #getAdTagUrl, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future getAdsResponse() => (super.noSuchMethod( + Invocation.method( + #getAdsResponse, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future<_i2.IMAAdDisplayContainer> getAdDisplayContainer() => + (super.noSuchMethod( + Invocation.method( + #getAdDisplayContainer, + [], + ), + returnValue: _i3.Future<_i2.IMAAdDisplayContainer>.value( + _FakeIMAAdDisplayContainer_2( + this, + Invocation.method( + #getAdDisplayContainer, + [], + ), + )), + returnValueForMissingStub: _i3.Future<_i2.IMAAdDisplayContainer>.value( + _FakeIMAAdDisplayContainer_2( + this, + Invocation.method( + #getAdDisplayContainer, + [], + ), + )), + ) as _i3.Future<_i2.IMAAdDisplayContainer>); + + @override + _i3.Future setAdWillAutoPlay(bool? adWillAutoPlay) => + (super.noSuchMethod( + Invocation.method( + #setAdWillAutoPlay, + [adWillAutoPlay], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setAdWillPlayMuted(bool? adWillPlayMuted) => + (super.noSuchMethod( + Invocation.method( + #setAdWillPlayMuted, + [adWillPlayMuted], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setContinuousPlayback(bool? continuousPlayback) => + (super.noSuchMethod( + Invocation.method( + #setContinuousPlayback, + [continuousPlayback], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setContentDuration(double? duration) => (super.noSuchMethod( + Invocation.method( + #setContentDuration, + [duration], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setContentKeywords(List? keywords) => + (super.noSuchMethod( + Invocation.method( + #setContentKeywords, + [keywords], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setContentTitle(String? title) => (super.noSuchMethod( + Invocation.method( + #setContentTitle, + [title], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setContentURL(String? contentURL) => (super.noSuchMethod( + Invocation.method( + #setContentURL, + [contentURL], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setVastLoadTimeout(double? timeout) => (super.noSuchMethod( + Invocation.method( + #setVastLoadTimeout, + [timeout], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setLiveStreamPrefetchSeconds(double? seconds) => + (super.noSuchMethod( + Invocation.method( + #setLiveStreamPrefetchSeconds, + [seconds], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override _i2.IMAAdsRequest pigeon_copy() => (super.noSuchMethod( Invocation.method( From c5123111c2aea2ba3f2acce9979837f791a6c98e Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 30 Jul 2025 21:19:18 -0400 Subject: [PATCH 4/9] version bump --- packages/interactive_media_ads/CHANGELOG.md | 4 ++++ .../packages/interactive_media_ads/AdsRequestProxyApi.kt | 2 +- .../interactive_media_ads/AdsRequestProxyAPIDelegate.swift | 2 +- packages/interactive_media_ads/pubspec.yaml | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/interactive_media_ads/CHANGELOG.md b/packages/interactive_media_ads/CHANGELOG.md index 1bb1057597ca..23158645b32b 100644 --- a/packages/interactive_media_ads/CHANGELOG.md +++ b/packages/interactive_media_ads/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.6 + +* Adds support to configure ad requests. See `AdsRequest`. + ## 0.2.5+1 * Adds remaining methods for internal wrapper of the Android native `AdsRequest`. diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt index 6cfcd96e731c..8e2349807d65 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt @@ -21,7 +21,7 @@ class AdsRequestProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : * * This must match the version in pubspec.yaml. */ - const val pluginVersion = "0.2.5+1" + const val pluginVersion = "0.2.6" } override fun setAdTagUrl(pigeon_instance: AdsRequest, adTagUrl: String) { diff --git a/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift b/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift index 38a24e8564db..87a74cf065d0 100644 --- a/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift +++ b/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift @@ -13,7 +13,7 @@ class AdsRequestProxyAPIDelegate: PigeonApiDelegateIMAAdsRequest { /// The current version of the `interactive_media_ads` plugin. /// /// This must match the version in pubspec.yaml. - static let pluginVersion = "0.2.5+1" + static let pluginVersion = "0.2.6" func pigeonDefaultConstructor( pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer, diff --git a/packages/interactive_media_ads/pubspec.yaml b/packages/interactive_media_ads/pubspec.yaml index 5996d4391d45..5215dce3ee49 100644 --- a/packages/interactive_media_ads/pubspec.yaml +++ b/packages/interactive_media_ads/pubspec.yaml @@ -2,7 +2,7 @@ name: interactive_media_ads description: A Flutter plugin for using the Interactive Media Ads SDKs on Android and iOS. repository: https://github.com/flutter/packages/tree/main/packages/interactive_media_ads issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+interactive_media_ads%22 -version: 0.2.5+1 # This must match the version in +version: 0.2.6 # This must match the version in # `android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt` and # `ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift` From 540d0ca5c4f1a88383f25267c69fa345ddd96b37 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 30 Jul 2025 21:23:11 -0400 Subject: [PATCH 5/9] todo add --- packages/interactive_media_ads/lib/src/ads_request.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/interactive_media_ads/lib/src/ads_request.dart b/packages/interactive_media_ads/lib/src/ads_request.dart index 441391a12a3b..c1385f17cfa6 100644 --- a/packages/interactive_media_ads/lib/src/ads_request.dart +++ b/packages/interactive_media_ads/lib/src/ads_request.dart @@ -70,6 +70,9 @@ class AdsRequest { /// The URL from which ads will be requested. String get adTagUrl => switch (platform) { final PlatformAdsRequestWithAdTagUrl request => request.adTagUrl, + // TODO(bparrishMines): This returns an empty string rather than null + // to prevent a breaking change. This should be updated to return null + // on the next major release. PlatformAdsRequestWithAdsResponse() => '', }; From 4ec66f1fb69eb0d5b45878f87a00510267661c3b Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 30 Jul 2025 21:27:44 -0400 Subject: [PATCH 6/9] make the subclasses base --- .../lib/src/platform_interface/platform_ads_request.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart index 22b3f9a5df27..9f0e56f5234b 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart @@ -104,7 +104,7 @@ sealed class PlatformAdsRequest { /// An object containing the data used to request ads from the server with an /// ad tag URL. -class PlatformAdsRequestWithAdTagUrl extends PlatformAdsRequest { +base class PlatformAdsRequestWithAdTagUrl extends PlatformAdsRequest { /// Constructs a [PlatformAdsRequestWithAdTagUrl]. PlatformAdsRequestWithAdTagUrl._({ required this.adTagUrl, @@ -125,7 +125,7 @@ class PlatformAdsRequestWithAdTagUrl extends PlatformAdsRequest { /// An object containing the data used to request ads from the server with an /// ad rules response. -class PlatformAdsRequestWithAdsResponse extends PlatformAdsRequest { +base class PlatformAdsRequestWithAdsResponse extends PlatformAdsRequest { /// Constructs a [PlatformAdsRequestWithAdsResponse]. PlatformAdsRequestWithAdsResponse._({ required this.adsResponse, From 42ccb1a14dd1168ab2c3e5f8a861f96a8d4a2578 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 1 Aug 2025 12:30:11 -0400 Subject: [PATCH 7/9] use duration to represent intervals --- .../lib/src/ads_request.dart | 29 +++++++-------- .../lib/src/android/android_ads_loader.dart | 17 +++++---- .../lib/src/ios/ios_ads_loader.dart | 19 ++++++---- .../platform_ads_request.dart | 36 +++++++++---------- .../test/ads_loader_test.dart | 13 +++---- .../test/android/ads_loader_test.dart | 8 ++--- .../test/ios/ads_loader_test.dart | 8 ++--- 7 files changed, 70 insertions(+), 60 deletions(-) diff --git a/packages/interactive_media_ads/lib/src/ads_request.dart b/packages/interactive_media_ads/lib/src/ads_request.dart index c1385f17cfa6..d730eadac81d 100644 --- a/packages/interactive_media_ads/lib/src/ads_request.dart +++ b/packages/interactive_media_ads/lib/src/ads_request.dart @@ -14,11 +14,11 @@ class AdsRequest { bool? adWillAutoPlay, bool? adWillPlayMuted, bool? continuousPlayback, - double? contentDuration, + Duration? contentDuration, List? contentKeywords, String? contentTitle, - double? liveStreamPrefetchSeconds, - double? vastLoadTimeout, + Duration? liveStreamPrefetchMaxWaitTime, + Duration? vastLoadTimeout, }) : this.fromPlatform( PlatformAdsRequest.withAdTagUrl( adTagUrl: adTagUrl, @@ -29,7 +29,7 @@ class AdsRequest { contentDuration: contentDuration, contentKeywords: contentKeywords, contentTitle: contentTitle, - liveStreamPrefetchSeconds: liveStreamPrefetchSeconds, + liveStreamPrefetchMaxWaitTime: liveStreamPrefetchMaxWaitTime, vastLoadTimeout: vastLoadTimeout, ), ); @@ -41,11 +41,11 @@ class AdsRequest { bool? adWillAutoPlay, bool? adWillPlayMuted, bool? continuousPlayback, - double? contentDuration, + Duration? contentDuration, List? contentKeywords, String? contentTitle, - double? liveStreamPrefetchSeconds, - double? vastLoadTimeout, + Duration? liveStreamPrefetchMaxWaitTime, + Duration? vastLoadTimeout, }) : this.fromPlatform( PlatformAdsRequest.withAdsResponse( adsResponse: adsResponse, @@ -56,7 +56,7 @@ class AdsRequest { contentDuration: contentDuration, contentKeywords: contentKeywords, contentTitle: contentTitle, - liveStreamPrefetchSeconds: liveStreamPrefetchSeconds, + liveStreamPrefetchMaxWaitTime: liveStreamPrefetchMaxWaitTime, vastLoadTimeout: vastLoadTimeout, ), ); @@ -103,8 +103,8 @@ class AdsRequest { /// content videos one after another similar to TV broadcast. bool? get continuousPlayback => platform.continuousPlayback; - /// Specifies the duration of the content in seconds to be shown. - double? get contentDuration => platform.contentDuration; + /// Specifies the duration of the content to be shown. + Duration? get contentDuration => platform.contentDuration; /// Specifies the keywords used to describe the content to be shown. List? get contentKeywords => platform.contentKeywords; @@ -112,10 +112,11 @@ class AdsRequest { /// Specifies the title of the content to be shown. String? get contentTitle => platform.contentTitle; - /// Specifies the maximum amount of time to wait in seconds, after calling - /// requestAds, before requesting the ad tag URL. - double? get liveStreamPrefetchSeconds => platform.liveStreamPrefetchSeconds; + /// Specifies the maximum amount of time to wait, after calling requestAds, + /// before requesting the ad tag URL. + Duration? get liveStreamPrefetchMaxWaitTime => + platform.liveStreamPrefetchMaxWaitTime; /// Specifies the VAST load timeout in milliseconds for a single wrapper. - double? get vastLoadTimeout => platform.vastLoadTimeout; + Duration? get vastLoadTimeout => platform.vastLoadTimeout; } diff --git a/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart b/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart index 32f88df2c141..490601934e6c 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart @@ -99,19 +99,22 @@ base class AndroidAdsLoader extends PlatformAdsLoader { androidRequest.setAdWillPlayMuted(adWillPlayMuted), if (request.continuousPlayback case final bool continuousPlayback) androidRequest.setContinuousPlayback(continuousPlayback), - if (request.contentDuration case final double contentDuration) - androidRequest.setContentDuration(contentDuration), + if (request.contentDuration case final Duration contentDuration) + androidRequest.setContentDuration( + contentDuration.inMilliseconds / Duration.millisecondsPerSecond), if (request.contentKeywords case final List contentKeywords) androidRequest.setContentKeywords(contentKeywords), if (request.contentTitle case final String contentTitle) androidRequest.setContentTitle(contentTitle), - if (request.liveStreamPrefetchSeconds - case final double liveStreamPrefetchSeconds) + if (request.liveStreamPrefetchMaxWaitTime + case final Duration liveStreamPrefetchMaxWaitTime) androidRequest.setLiveStreamPrefetchSeconds( - liveStreamPrefetchSeconds, + liveStreamPrefetchMaxWaitTime.inMilliseconds / + Duration.millisecondsPerSecond, ), - if (request.vastLoadTimeout case final double vastLoadTimeout) - androidRequest.setVastLoadTimeout(vastLoadTimeout), + if (request.vastLoadTimeout case final Duration vastLoadTimeout) + androidRequest + .setVastLoadTimeout(vastLoadTimeout.inMilliseconds.toDouble()), if (request.contentProgressProvider case final AndroidContentProgressProvider contentProgressProvider) androidRequest.setContentProgressProvider( diff --git a/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart b/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart index 8131be4166bd..5fbca3d22929 100644 --- a/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart @@ -102,19 +102,24 @@ base class IOSAdsLoader extends PlatformAdsLoader { adsRequest.setAdWillPlayMuted(adWillPlayMuted), if (request.continuousPlayback case final bool continuousPlayback) adsRequest.setContinuousPlayback(continuousPlayback), - if (request.contentDuration case final double contentDuration) - adsRequest.setContentDuration(contentDuration), + if (request.contentDuration case final Duration contentDuration) + adsRequest.setContentDuration( + contentDuration.inMilliseconds / Duration.millisecondsPerSecond, + ), if (request.contentKeywords case final List contentKeywords) adsRequest.setContentKeywords(contentKeywords), if (request.contentTitle case final String contentTitle) adsRequest.setContentTitle(contentTitle), - if (request.liveStreamPrefetchSeconds - case final double liveStreamPrefetchSeconds) + if (request.liveStreamPrefetchMaxWaitTime + case final Duration liveStreamPrefetchMaxWaitTime) adsRequest.setLiveStreamPrefetchSeconds( - liveStreamPrefetchSeconds, + liveStreamPrefetchMaxWaitTime.inMilliseconds / + Duration.millisecondsPerSecond, + ), + if (request.vastLoadTimeout case final Duration vastLoadTimeout) + adsRequest.setVastLoadTimeout( + vastLoadTimeout.inMilliseconds.toDouble(), ), - if (request.vastLoadTimeout case final double vastLoadTimeout) - adsRequest.setVastLoadTimeout(vastLoadTimeout), _adsLoader.requestAds(adsRequest), ]); } diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart index 9f0e56f5234b..681e4865edb0 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart @@ -15,7 +15,7 @@ sealed class PlatformAdsRequest { this.contentDuration, this.contentKeywords, this.contentTitle, - this.liveStreamPrefetchSeconds, + this.liveStreamPrefetchMaxWaitTime, this.vastLoadTimeout, }); @@ -25,11 +25,11 @@ sealed class PlatformAdsRequest { bool? adWillAutoPlay, bool? adWillPlayMuted, bool? continuousPlayback, - double? contentDuration, + Duration? contentDuration, List? contentKeywords, String? contentTitle, - double? liveStreamPrefetchSeconds, - double? vastLoadTimeout, + Duration? liveStreamPrefetchMaxWaitTime, + Duration? vastLoadTimeout, }) => PlatformAdsRequestWithAdTagUrl._( adTagUrl: adTagUrl, @@ -40,7 +40,7 @@ sealed class PlatformAdsRequest { contentDuration: contentDuration, contentKeywords: contentKeywords, contentTitle: contentTitle, - liveStreamPrefetchSeconds: liveStreamPrefetchSeconds, + liveStreamPrefetchMaxWaitTime: liveStreamPrefetchMaxWaitTime, vastLoadTimeout: vastLoadTimeout, ); @@ -50,11 +50,11 @@ sealed class PlatformAdsRequest { bool? adWillAutoPlay, bool? adWillPlayMuted, bool? continuousPlayback, - double? contentDuration, + Duration? contentDuration, List? contentKeywords, String? contentTitle, - double? liveStreamPrefetchSeconds, - double? vastLoadTimeout, + Duration? liveStreamPrefetchMaxWaitTime, + Duration? vastLoadTimeout, }) => PlatformAdsRequestWithAdsResponse._( adsResponse: adsResponse, @@ -65,7 +65,7 @@ sealed class PlatformAdsRequest { contentDuration: contentDuration, contentKeywords: contentKeywords, contentTitle: contentTitle, - liveStreamPrefetchSeconds: liveStreamPrefetchSeconds, + liveStreamPrefetchMaxWaitTime: liveStreamPrefetchMaxWaitTime, vastLoadTimeout: vastLoadTimeout, ); @@ -85,8 +85,8 @@ sealed class PlatformAdsRequest { /// content videos one after another similar to TV broadcast. final bool? continuousPlayback; - /// Specifies the duration of the content in seconds to be shown. - final double? contentDuration; + /// Specifies the duration of the content to be shown. + final Duration? contentDuration; /// Specifies the keywords used to describe the content to be shown. final List? contentKeywords; @@ -94,12 +94,12 @@ sealed class PlatformAdsRequest { /// Specifies the title of the content to be shown. final String? contentTitle; - /// Specifies the maximum amount of time to wait in seconds, after calling - /// requestAds, before requesting the ad tag URL. - final double? liveStreamPrefetchSeconds; + /// Specifies the maximum amount of time to wait, after calling requestAds, + /// before requesting the ad tag URL. + final Duration? liveStreamPrefetchMaxWaitTime; - /// Specifies the VAST load timeout in milliseconds for a single wrapper. - final double? vastLoadTimeout; + /// Specifies the VAST load timeout for a single wrapper. + final Duration? vastLoadTimeout; } /// An object containing the data used to request ads from the server with an @@ -115,7 +115,7 @@ base class PlatformAdsRequestWithAdTagUrl extends PlatformAdsRequest { super.contentDuration, super.contentKeywords, super.contentTitle, - super.liveStreamPrefetchSeconds, + super.liveStreamPrefetchMaxWaitTime, super.vastLoadTimeout, }) : super._(); @@ -136,7 +136,7 @@ base class PlatformAdsRequestWithAdsResponse extends PlatformAdsRequest { super.contentDuration, super.contentKeywords, super.contentTitle, - super.liveStreamPrefetchSeconds, + super.liveStreamPrefetchMaxWaitTime, super.vastLoadTimeout, }) : super._(); diff --git a/packages/interactive_media_ads/test/ads_loader_test.dart b/packages/interactive_media_ads/test/ads_loader_test.dart index 4dcf6962e99c..2eb2d4bd1667 100644 --- a/packages/interactive_media_ads/test/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/ads_loader_test.dart @@ -32,11 +32,11 @@ void main() { adWillAutoPlay: true, adWillPlayMuted: false, continuousPlayback: true, - contentDuration: 2.0, + contentDuration: const Duration(seconds: 2), contentKeywords: ['keyword1', 'keyword2'], contentTitle: 'contentTitle', - liveStreamPrefetchSeconds: 3.0, - vastLoadTimeout: 4.0, + liveStreamPrefetchMaxWaitTime: const Duration(seconds: 3), + vastLoadTimeout: const Duration(milliseconds: 5000), contentProgressProvider: TestContentProgressProvider( const PlatformContentProgressProviderCreationParams(), ), @@ -61,8 +61,8 @@ void main() { expect(request.contentKeywords, platformRequest.contentKeywords); expect(request.contentTitle, platformRequest.contentTitle); expect( - request.liveStreamPrefetchSeconds, - platformRequest.liveStreamPrefetchSeconds, + request.liveStreamPrefetchMaxWaitTime, + platformRequest.liveStreamPrefetchMaxWaitTime, ); expect(request.vastLoadTimeout, platformRequest.vastLoadTimeout); expect( @@ -82,7 +82,8 @@ void main() { contentDuration: platformRequest.contentDuration, contentKeywords: platformRequest.contentKeywords, contentTitle: platformRequest.contentTitle, - liveStreamPrefetchSeconds: platformRequest.liveStreamPrefetchSeconds, + liveStreamPrefetchMaxWaitTime: + platformRequest.liveStreamPrefetchMaxWaitTime, vastLoadTimeout: platformRequest.vastLoadTimeout, contentProgressProvider: ContentProgressProvider.fromPlatform( platformRequest.contentProgressProvider!, diff --git a/packages/interactive_media_ads/test/android/ads_loader_test.dart b/packages/interactive_media_ads/test/android/ads_loader_test.dart index 30a3acd02ab4..a721a40ba0d2 100644 --- a/packages/interactive_media_ads/test/android/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/android/ads_loader_test.dart @@ -138,11 +138,11 @@ void main() { adWillAutoPlay: true, adWillPlayMuted: false, continuousPlayback: true, - contentDuration: 2.0, + contentDuration: const Duration(seconds: 2), contentKeywords: ['keyword1', 'keyword2'], contentTitle: 'contentTitle', - liveStreamPrefetchSeconds: 3.0, - vastLoadTimeout: 4.0, + liveStreamPrefetchMaxWaitTime: const Duration(seconds: 3), + vastLoadTimeout: const Duration(milliseconds: 5000), contentProgressProvider: progressProvider, ), ); @@ -156,7 +156,7 @@ void main() { mockAdsRequest.setContentKeywords(['keyword1', 'keyword2']), mockAdsRequest.setContentTitle('contentTitle'), mockAdsRequest.setLiveStreamPrefetchSeconds(3.0), - mockAdsRequest.setVastLoadTimeout(4.0), + mockAdsRequest.setVastLoadTimeout(5000.0), mockAdsRequest.setContentProgressProvider( progressProvider.progressProvider, ), diff --git a/packages/interactive_media_ads/test/ios/ads_loader_test.dart b/packages/interactive_media_ads/test/ios/ads_loader_test.dart index bfdac72cee42..ae96c774539c 100644 --- a/packages/interactive_media_ads/test/ios/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/ios/ads_loader_test.dart @@ -121,11 +121,11 @@ void main() { adWillAutoPlay: true, adWillPlayMuted: false, continuousPlayback: true, - contentDuration: 2.0, + contentDuration: const Duration(seconds: 2), contentKeywords: ['keyword1', 'keyword2'], contentTitle: 'contentTitle', - liveStreamPrefetchSeconds: 3.0, - vastLoadTimeout: 4.0, + liveStreamPrefetchMaxWaitTime: const Duration(seconds: 3), + vastLoadTimeout: const Duration(milliseconds: 5000), contentProgressProvider: provider, )); @@ -136,7 +136,7 @@ void main() { verify(mockRequest.setContentKeywords(['keyword1', 'keyword2'])); verify(mockRequest.setContentTitle('contentTitle')); verify(mockRequest.setLiveStreamPrefetchSeconds(3.0)); - verify(mockRequest.setVastLoadTimeout(4.0)); + verify(mockRequest.setVastLoadTimeout(5000.0)); verify(mockLoader.requestAds(any)); }); From dcfa60eef413330e0b6b6096885b709f1170bb08 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 1 Aug 2025 12:34:36 -0400 Subject: [PATCH 8/9] dont accidentally skip --- .../lib/src/android/android_ads_loader.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart b/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart index 490601934e6c..7969893cd690 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart @@ -116,9 +116,10 @@ base class AndroidAdsLoader extends PlatformAdsLoader { androidRequest .setVastLoadTimeout(vastLoadTimeout.inMilliseconds.toDouble()), if (request.contentProgressProvider - case final AndroidContentProgressProvider contentProgressProvider) + case final PlatformContentProgressProvider contentProgressProvider) androidRequest.setContentProgressProvider( - contentProgressProvider.progressProvider, + (contentProgressProvider as AndroidContentProgressProvider) + .progressProvider, ), adsLoader.requestAds(androidRequest), ]); From 295bc1d1a77e1aa077f1164babbb8b489a22fe50 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 1 Aug 2025 12:40:32 -0400 Subject: [PATCH 9/9] improve docs --- packages/interactive_media_ads/lib/src/ads_request.dart | 4 ++-- .../lib/src/platform_interface/platform_ads_request.dart | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/interactive_media_ads/lib/src/ads_request.dart b/packages/interactive_media_ads/lib/src/ads_request.dart index d730eadac81d..a22d69320c11 100644 --- a/packages/interactive_media_ads/lib/src/ads_request.dart +++ b/packages/interactive_media_ads/lib/src/ads_request.dart @@ -7,7 +7,7 @@ import 'platform_interface/platform_interface.dart'; /// An object containing the data used to request ads from the server. class AdsRequest { - /// Creates an [AdsRequest]. + /// Creates an [AdsRequest] with the given ad tag URL. AdsRequest({ required String adTagUrl, ContentProgressProvider? contentProgressProvider, @@ -34,7 +34,7 @@ class AdsRequest { ), ); - /// Creates an [AdsRequest]. + /// Creates an [AdsRequest] with the given canned ads response. AdsRequest.withAdsResponse({ required String adsResponse, ContentProgressProvider? contentProgressProvider, diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart index 681e4865edb0..2bf8605d3cc4 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_request.dart @@ -6,7 +6,6 @@ import 'platform_content_progress_provider.dart'; /// An object containing the data used to request ads from the server. sealed class PlatformAdsRequest { - /// Creates an [PlatformAdsRequest]. PlatformAdsRequest._({ this.contentProgressProvider, this.adWillAutoPlay, @@ -19,6 +18,7 @@ sealed class PlatformAdsRequest { this.vastLoadTimeout, }); + /// Creates a [PlatformAdsRequest] with the given ad tag URL. factory PlatformAdsRequest.withAdTagUrl({ required String adTagUrl, PlatformContentProgressProvider? contentProgressProvider, @@ -44,6 +44,7 @@ sealed class PlatformAdsRequest { vastLoadTimeout: vastLoadTimeout, ); + /// Creates a [PlatformAdsRequest] with the given canned ads response. factory PlatformAdsRequest.withAdsResponse({ required String adsResponse, PlatformContentProgressProvider? contentProgressProvider,