diff --git a/packages/interactive_media_ads/CHANGELOG.md b/packages/interactive_media_ads/CHANGELOG.md index ea35c591a101..9aacfc840c3b 100644 --- a/packages/interactive_media_ads/CHANGELOG.md +++ b/packages/interactive_media_ads/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.0+10 + +* Bumps `com.google.ads.interactivemedia.v3:interactivemedia` from 3.38.0 to 3.39.0. + ## 0.3.0+9 * Bumps kotlin_version to 2.3.0. diff --git a/packages/interactive_media_ads/android/build.gradle b/packages/interactive_media_ads/android/build.gradle index d6de440f04fc..b706e7a6b360 100644 --- a/packages/interactive_media_ads/android/build.gradle +++ b/packages/interactive_media_ads/android/build.gradle @@ -50,7 +50,7 @@ android { dependencies { implementation("androidx.annotation:annotation:1.9.1") implementation("androidx.core:core-ktx:1.13.0") - implementation("com.google.ads.interactivemedia.v3:interactivemedia:3.38.0") + implementation("com.google.ads.interactivemedia.v3:interactivemedia:3.39.0") testImplementation("junit:junit:4.13.2") testImplementation("org.jetbrains.kotlin:kotlin-test") testImplementation("org.mockito.kotlin:mockito-kotlin:6.1.0") diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsManagerLoadedEventProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsManagerLoadedEventProxyApi.kt index 9d133bd9d5e8..8a2392441173 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsManagerLoadedEventProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsManagerLoadedEventProxyApi.kt @@ -15,7 +15,7 @@ import com.google.ads.interactivemedia.v3.api.AdsManagerLoadedEvent */ class AdsManagerLoadedEventProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : PigeonApiAdsManagerLoadedEvent(pigeonRegistrar) { - override fun manager(pigeon_instance: AdsManagerLoadedEvent): AdsManager { + override fun manager(pigeon_instance: AdsManagerLoadedEvent): AdsManager? { return pigeon_instance.adsManager } } diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRenderingSettingsProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRenderingSettingsProxyApi.kt index 546c4a17ab1b..18c39d938793 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRenderingSettingsProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRenderingSettingsProxyApi.kt @@ -31,7 +31,7 @@ class AdsRenderingSettingsProxyApi(override val pigeonRegistrar: ProxyApiRegistr return pigeon_instance.focusSkipButtonWhenAvailable } - override fun getMimeTypes(pigeon_instance: AdsRenderingSettings): List { + override fun getMimeTypes(pigeon_instance: AdsRenderingSettings): List? { return pigeon_instance.mimeTypes } @@ -65,7 +65,7 @@ class AdsRenderingSettingsProxyApi(override val pigeonRegistrar: ProxyApiRegistr } override fun setMimeTypes(pigeon_instance: AdsRenderingSettings, mimeTypes: List) { - pigeon_instance.mimeTypes = mimeTypes + pigeon_instance.setMimeTypes(mimeTypes) } override fun setPlayAdsAfterTime(pigeon_instance: AdsRenderingSettings, time: Double) { 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 100929dbd193..476ac1b0e16b 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,15 +21,15 @@ class AdsRequestProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : * * This must match the version in pubspec.yaml. */ - const val pluginVersion = "0.3.0+9" + const val pluginVersion = "0.3.0+10" } override fun setAdTagUrl(pigeon_instance: AdsRequest, adTagUrl: String) { // Add a request agent only if the adTagUrl can append a custom parameter. if (!adTagUrl.contains("#") && adTagUrl.contains("?")) { - pigeon_instance.adTagUrl = "$adTagUrl&request_agent=Flutter-IMA-$pluginVersion" + pigeon_instance.setAdTagUrl("$adTagUrl&request_agent=Flutter-IMA-$pluginVersion") } else { - pigeon_instance.adTagUrl = adTagUrl + pigeon_instance.setAdTagUrl(adTagUrl) } } @@ -37,7 +37,7 @@ class AdsRequestProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : pigeon_instance: AdsRequest, provider: ContentProgressProvider ) { - pigeon_instance.contentProgressProvider = provider + pigeon_instance.setContentProgressProvider(provider) } override fun setAdWillAutoPlay(pigeon_instance: AdsRequest, willAutoPlay: Boolean) { @@ -49,7 +49,7 @@ class AdsRequestProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : } override fun setAdsResponse(pigeon_instance: AdsRequest, cannedAdResponse: String) { - pigeon_instance.adsResponse = cannedAdResponse + pigeon_instance.setAdsResponse(cannedAdResponse) } override fun setContentDuration(pigeon_instance: AdsRequest, duration: Double) { diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdProxyApi.kt index 5285ad8a659b..e3cdf75458be 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdProxyApi.kt @@ -22,7 +22,7 @@ class CompanionAdProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : return pigeon_instance.height.toLong() } - override fun resourceValue(pigeon_instance: CompanionAd): String { + override fun resourceValue(pigeon_instance: CompanionAd): String? { return pigeon_instance.resourceValue } diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt index f4c121dabd2b..55f855e29277 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt @@ -23,11 +23,11 @@ class ImaSdkSettingsProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : } override fun setFeatureFlags(pigeon_instance: ImaSdkSettings, featureFlags: Map) { - pigeon_instance.featureFlags = featureFlags + pigeon_instance.setFeatureFlags(featureFlags) } override fun setLanguage(pigeon_instance: ImaSdkSettings, language: String) { - pigeon_instance.language = language + pigeon_instance.setLanguage(language) } override fun setMaxRedirects(pigeon_instance: ImaSdkSettings, maxRedirects: Long) { @@ -35,18 +35,18 @@ class ImaSdkSettingsProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : } override fun setPlayerType(pigeon_instance: ImaSdkSettings, playerType: String) { - pigeon_instance.playerType = playerType + pigeon_instance.setPlayerType(playerType) } override fun setPlayerVersion(pigeon_instance: ImaSdkSettings, playerVersion: String) { - pigeon_instance.playerVersion = playerVersion + pigeon_instance.setPlayerVersion(playerVersion) } override fun setPpid(pigeon_instance: ImaSdkSettings, ppid: String) { - pigeon_instance.ppid = ppid + pigeon_instance.setPpid(ppid) } override fun setSessionId(pigeon_instance: ImaSdkSettings, sessionId: String) { - pigeon_instance.sessionId = sessionId + pigeon_instance.setSessionId(sessionId) } } diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt index daa84bfe9782..605718030ad4 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt @@ -1532,7 +1532,7 @@ abstract class PigeonApiAdsManagerLoadedEvent( */ abstract fun manager( pigeon_instance: com.google.ads.interactivemedia.v3.api.AdsManagerLoadedEvent - ): com.google.ads.interactivemedia.v3.api.AdsManager + ): com.google.ads.interactivemedia.v3.api.AdsManager? @Suppress("LocalVariableName", "FunctionName") /** Creates a Dart instance of AdsManagerLoadedEvent and attaches it to [pigeon_instanceArg]. */ @@ -5569,7 +5569,7 @@ abstract class PigeonApiAdsRenderingSettings( /** The SDK will prioritize the media with MIME type on the list. */ abstract fun getMimeTypes( pigeon_instance: com.google.ads.interactivemedia.v3.api.AdsRenderingSettings - ): List + ): List? /** * Maximum recommended bitrate. diff --git a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRenderingSettingsProxyApiTest.kt b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRenderingSettingsProxyApiTest.kt index 74c72f8f06ba..ddbb762a02c2 100644 --- a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRenderingSettingsProxyApiTest.kt +++ b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRenderingSettingsProxyApiTest.kt @@ -131,7 +131,7 @@ class AdsRenderingSettingsProxyApiTest { val mimeTypes = listOf("myString") api.setMimeTypes(instance, mimeTypes) - verify(instance).mimeTypes = mimeTypes + verify(instance).setMimeTypes(mimeTypes) } @Test diff --git a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt index 366c2efa28fb..7d4601b5fe46 100644 --- a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt +++ b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt @@ -18,8 +18,8 @@ class AdsRequestProxyApiTest { val instance = mock() api.setAdTagUrl(instance, "adTag?") - verify(instance).adTagUrl = - "adTag?&request_agent=Flutter-IMA-${AdsRequestProxyApi.pluginVersion}" + verify(instance) + .setAdTagUrl("adTag?&request_agent=Flutter-IMA-${AdsRequestProxyApi.pluginVersion}") } @Test @@ -29,10 +29,10 @@ class AdsRequestProxyApiTest { val instance = mock() api.setAdTagUrl(instance, "adTag#") - verify(instance).adTagUrl = "adTag#" + verify(instance).setAdTagUrl("adTag#") api.setAdTagUrl(instance, "adTag?#") - verify(instance).adTagUrl = "adTag?#" + verify(instance).setAdTagUrl("adTag?#") } @Test @@ -43,7 +43,7 @@ class AdsRequestProxyApiTest { val mockProvider = mock() api.setContentProgressProvider(instance, mockProvider) - verify(instance).contentProgressProvider = mockProvider + verify(instance).setContentProgressProvider(mockProvider) } @Test @@ -76,7 +76,7 @@ class AdsRequestProxyApiTest { val cannedAdResponse = "response" api.setAdsResponse(instance, cannedAdResponse) - verify(instance).adsResponse = cannedAdResponse + verify(instance).setAdsResponse(cannedAdResponse) } @Test diff --git a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApiTest.kt b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApiTest.kt index dd1dd3c8a843..c4cb266aae74 100644 --- a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApiTest.kt +++ b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApiTest.kt @@ -40,7 +40,7 @@ class ImaSdkSettingsProxyApiTest { val featureFlags = mapOf("myString" to "myString2") api.setFeatureFlags(instance, featureFlags) - verify(instance).featureFlags = featureFlags + verify(instance).setFeatureFlags(featureFlags) } @Test @@ -51,7 +51,7 @@ class ImaSdkSettingsProxyApiTest { val language = "myString" api.setLanguage(instance, language) - verify(instance).language = language + verify(instance).setLanguage(language) } @Test @@ -73,7 +73,7 @@ class ImaSdkSettingsProxyApiTest { val playerType = "myString" api.setPlayerType(instance, playerType) - verify(instance).playerType = playerType + verify(instance).setPlayerType(playerType) } @Test @@ -84,7 +84,7 @@ class ImaSdkSettingsProxyApiTest { val playerVersion = "myString" api.setPlayerVersion(instance, playerVersion) - verify(instance).playerVersion = playerVersion + verify(instance).setPlayerVersion(playerVersion) } @Test @@ -95,7 +95,7 @@ class ImaSdkSettingsProxyApiTest { val ppid = "myString" api.setPpid(instance, ppid) - verify(instance).ppid = ppid + verify(instance).setPpid(ppid) } @Test @@ -106,6 +106,6 @@ class ImaSdkSettingsProxyApiTest { val sessionId = "myString" api.setSessionId(instance, sessionId) - verify(instance).sessionId = sessionId + verify(instance).setSessionId(sessionId) } } 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 9bdc5bb205a1..33c2a9ed2324 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.3.0+9" + static let pluginVersion = "0.3.0+10" func pigeonDefaultConstructor( pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer, 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 a816477c4f86..0dcd067b1eca 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 @@ -4,6 +4,8 @@ import 'dart:async'; +import 'package:flutter/foundation.dart' show debugPrint; + import '../platform_interface/platform_interface.dart'; import 'android_ad_display_container.dart'; import 'android_ads_manager.dart'; @@ -144,11 +146,21 @@ base class AndroidAdsLoader extends PlatformAdsLoader { ..addAdsLoadedListener( ima.AdsLoadedListener( onAdsManagerLoaded: (_, ima.AdsManagerLoadedEvent event) { - weakThis.target?.params.onAdsLoaded( - PlatformOnAdsLoadedData( - manager: AndroidAdsManager(event.manager), - ), - ); + if (event.manager case final ima.AdsManager manager) { + weakThis.target?.params.onAdsLoaded( + PlatformOnAdsLoadedData( + // `manager` is only null when using Dynamic Ad Insertion (DAI), + // which this plugin does not currently support. + // TODO(bparrishMines): Platform interface and app-facing + // interface should be updated to set this value as nullable. + manager: AndroidAdsManager(manager), + ), + ); + } else { + debugPrint( + 'Failed to call `AndroidAdsLoader.onAdsLoaded` because `AdsLoadedListener.onAdsManagerLoaded` was called with a null AdsManager', + ); + } }, ), ) diff --git a/packages/interactive_media_ads/lib/src/android/interactive_media_ads.g.dart b/packages/interactive_media_ads/lib/src/android/interactive_media_ads.g.dart index c1a7a65062f5..a04465afd2d8 100644 --- a/packages/interactive_media_ads/lib/src/android/interactive_media_ads.g.dart +++ b/packages/interactive_media_ads/lib/src/android/interactive_media_ads.g.dart @@ -1300,18 +1300,18 @@ class AdsManagerLoadedEvent extends PigeonInternalProxyApiBaseClass { AdsManagerLoadedEvent.pigeon_detached({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, - required this.manager, + this.manager, }); /// The ads manager that will control playback of the loaded ads, or null when /// using dynamic ad insertion. - final AdsManager manager; + final AdsManager? manager; static void pigeon_setUpMessageHandlers({ bool pigeon_clearHandlers = false, BinaryMessenger? pigeon_binaryMessenger, PigeonInstanceManager? pigeon_instanceManager, - AdsManagerLoadedEvent Function(AdsManager manager)? pigeon_newInstance, + AdsManagerLoadedEvent Function(AdsManager? manager)? pigeon_newInstance, }) { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _PigeonInternalProxyApiBaseCodec( @@ -1339,18 +1339,14 @@ class AdsManagerLoadedEvent extends PigeonInternalProxyApiBaseClass { 'Argument for dev.flutter.pigeon.interactive_media_ads.AdsManagerLoadedEvent.pigeon_newInstance was null, expected non-null int.', ); final AdsManager? arg_manager = (args[1] as AdsManager?); - assert( - arg_manager != null, - 'Argument for dev.flutter.pigeon.interactive_media_ads.AdsManagerLoadedEvent.pigeon_newInstance was null, expected non-null AdsManager.', - ); try { (pigeon_instanceManager ?? PigeonInstanceManager.instance) .addHostCreatedInstance( - pigeon_newInstance?.call(arg_manager!) ?? + pigeon_newInstance?.call(arg_manager) ?? AdsManagerLoadedEvent.pigeon_detached( pigeon_binaryMessenger: pigeon_binaryMessenger, pigeon_instanceManager: pigeon_instanceManager, - manager: arg_manager!, + manager: arg_manager, ), arg_pigeon_instanceIdentifier!, ); @@ -6820,7 +6816,7 @@ class AdsRenderingSettings extends PigeonInternalProxyApiBaseClass { } /// The SDK will prioritize the media with MIME type on the list. - Future> getMimeTypes() async { + Future?> getMimeTypes() async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecAdsRenderingSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -6843,13 +6839,8 @@ class AdsRenderingSettings extends PigeonInternalProxyApiBaseClass { message: pigeonVar_replyList[1] as String?, details: pigeonVar_replyList[2], ); - } else if (pigeonVar_replyList[0] == null) { - throw PlatformException( - code: 'null-error', - message: 'Host platform returned null value for non-null return value.', - ); } else { - return (pigeonVar_replyList[0] as List?)!.cast(); + return (pigeonVar_replyList[0] as List?)?.cast(); } } diff --git a/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart b/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart index f37cf1fe767f..bc5b57bbab6c 100644 --- a/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart +++ b/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart @@ -308,7 +308,7 @@ abstract class AdsLoader { abstract class AdsManagerLoadedEvent { /// The ads manager that will control playback of the loaded ads, or null when /// using dynamic ad insertion. - late final AdsManager manager; + late final AdsManager? manager; } /// An event raised when there is an error loading or playing ads. @@ -961,7 +961,7 @@ abstract class AdsRenderingSettings { bool getFocusSkipButtonWhenAvailable(); /// The SDK will prioritize the media with MIME type on the list. - List getMimeTypes(); + List? getMimeTypes(); /// Maximum recommended bitrate. /// diff --git a/packages/interactive_media_ads/pubspec.yaml b/packages/interactive_media_ads/pubspec.yaml index 779343646712..bd0c580c70ee 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.3.0+9 # This must match the version in +version: 0.3.0+10 # 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` 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 4923255156b5..8c60343409a6 100644 --- a/packages/interactive_media_ads/test/android/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/android/ads_loader_test.dart @@ -278,6 +278,60 @@ void main() { onAdsManagerLoadedCallback(MockAdsLoadedListener(), mockLoadedEvent); }); + testWidgets('onAdsLoaded does not crash with null manager', ( + WidgetTester tester, + ) async { + final AndroidAdDisplayContainer container = await _pumpAdDisplayContainer( + tester, + ); + + final mockAdsLoader = MockAdsLoader(); + final addEventListenerCompleter = Completer(); + when(mockAdsLoader.addAdsLoadedListener(any)).thenAnswer((_) async { + addEventListenerCompleter.complete(); + }); + _mockImaSdkFactoryInstance(adsLoader: mockAdsLoader); + + late final void Function(ima.AdsLoadedListener, ima.AdsManagerLoadedEvent) + onAdsManagerLoadedCallback; + + ima.PigeonOverrides.adsLoadedListener_new = + ({ + required void Function( + ima.AdsLoadedListener, + ima.AdsManagerLoadedEvent, + ) + onAdsManagerLoaded, + }) { + onAdsManagerLoadedCallback = onAdsManagerLoaded; + return MockAdsLoadedListener(); + }; + ima.PigeonOverrides.adErrorListener_new = ({required dynamic onAdError}) { + return MockAdErrorListener(); + }; + + AndroidAdsLoader( + AndroidAdsLoaderCreationParams( + container: container, + settings: AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ), + onAdsLoaded: (_) { + fail('onAdsLoaded should not be called when AdsManager is null'); + }, + onAdsLoadError: (_) {}, + ), + ); + + final mockLoadedEvent = MockAdsManagerLoadedEvent(); + // Sets manager to null. + when(mockLoadedEvent.manager).thenReturn(null); + + await addEventListenerCompleter.future; + + onAdsManagerLoadedCallback(MockAdsLoadedListener(), mockLoadedEvent); + }); + testWidgets('onAdError', (WidgetTester tester) async { final AndroidAdDisplayContainer container = await _pumpAdDisplayContainer( tester, 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 bf165de26ad6..6115bd3b27b0 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 @@ -608,18 +608,6 @@ class MockAdsManager extends _i1.Mock implements _i2.AdsManager { class MockAdsManagerLoadedEvent extends _i1.Mock implements _i2.AdsManagerLoadedEvent { @override - _i2.AdsManager get manager => - (super.noSuchMethod( - Invocation.getter(#manager), - returnValue: _FakeAdsManager_6(this, Invocation.getter(#manager)), - returnValueForMissingStub: _FakeAdsManager_6( - this, - Invocation.getter(#manager), - ), - ) - as _i2.AdsManager); - - @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), diff --git a/packages/interactive_media_ads/test/android/ads_manager_test.mocks.dart b/packages/interactive_media_ads/test/android/ads_manager_test.mocks.dart index 42de4b8c0bce..6b482343914a 100644 --- a/packages/interactive_media_ads/test/android/ads_manager_test.mocks.dart +++ b/packages/interactive_media_ads/test/android/ads_manager_test.mocks.dart @@ -591,15 +591,13 @@ class MockAdsRenderingSettings extends _i1.Mock as _i4.Future); @override - _i4.Future> getMimeTypes() => + _i4.Future?> getMimeTypes() => (super.noSuchMethod( Invocation.method(#getMimeTypes, []), - returnValue: _i4.Future>.value([]), - returnValueForMissingStub: _i4.Future>.value( - [], - ), + returnValue: _i4.Future?>.value(), + returnValueForMissingStub: _i4.Future?>.value(), ) - as _i4.Future>); + as _i4.Future?>); @override _i4.Future setBitrateKbps(int? bitrate) =>