diff --git a/packages/interactive_media_ads/CHANGELOG.md b/packages/interactive_media_ads/CHANGELOG.md index 347340ae32b..1065335d5b6 100644 --- a/packages/interactive_media_ads/CHANGELOG.md +++ b/packages/interactive_media_ads/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.4 + +* Adds support for companion ads. See `CompanionAdSlot` and `AdDisplayContainer(companionAds)`. + ## 0.2.3+12 * Fixes appending request agent to ad tags that contain a query. diff --git a/packages/interactive_media_ads/README.md b/packages/interactive_media_ads/README.md index e558e0c8ba4..b80b5a10d5f 100644 --- a/packages/interactive_media_ads/README.md +++ b/packages/interactive_media_ads/README.md @@ -55,7 +55,7 @@ If building on Android, add the user permissions required by the IMA SDK for req Add the import statements for the `interactive_media_ads` and [video_player][7]. Both plugins should already be added to your `pubspec.yaml`. - + ```dart import 'package:interactive_media_ads/interactive_media_ads.dart'; import 'package:video_player/video_player.dart'; @@ -66,7 +66,7 @@ import 'package:video_player/video_player.dart'; Create a new [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) that handles displaying Ads and playing content. - + ```dart /// Example widget displaying an Ad before a video. class AdExampleWidget extends StatefulWidget { @@ -120,7 +120,7 @@ Instantiate the [AdDisplayContainer][3] for playing Ads and the [VideoPlayerController](https://pub.dev/documentation/video_player/latest/video_player/VideoPlayerController-class.html) for playing content. - + ```dart late final AdDisplayContainer _adDisplayContainer = AdDisplayContainer( onContainerAdded: (AdDisplayContainer container) { @@ -194,7 +194,7 @@ void initState() { Return a `Widget` that contains the ad player and the content player. - + ```dart @override Widget build(BuildContext context) { @@ -244,7 +244,7 @@ Widget build(BuildContext context) { Handle requesting ads and add event listeners to handle when content should be displayed or hidden. - + ```dart Future _requestAds(AdDisplayContainer container) { return _adsLoader.requestAds(AdsRequest( @@ -292,7 +292,7 @@ Future _pauseContent() { Dispose the content player and destroy the [AdsManager][6]. - + ```dart @override void dispose() { 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 2e46d3435d5..6352bd50d15 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.3+12" + const val pluginVersion = "0.2.4" } override fun setAdTagUrl(pigeon_instance: AdsRequest, adTagUrl: String) { diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/BaseDisplayContainerProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/BaseDisplayContainerProxyApi.kt index 6499138ad9c..1baa52fd438 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/BaseDisplayContainerProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/BaseDisplayContainerProxyApi.kt @@ -4,6 +4,9 @@ package dev.flutter.packages.interactive_media_ads +import com.google.ads.interactivemedia.v3.api.BaseDisplayContainer +import com.google.ads.interactivemedia.v3.api.CompanionAdSlot + /** * ProxyApi implementation for [com.google.ads.interactivemedia.v3.api.BaseDisplayContainer]. * @@ -11,4 +14,11 @@ package dev.flutter.packages.interactive_media_ads * instance or handle method calls on the associated native class or an instance of that class. */ class BaseDisplayContainerProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : - PigeonApiBaseDisplayContainer(pigeonRegistrar) + PigeonApiBaseDisplayContainer(pigeonRegistrar) { + override fun setCompanionSlots( + pigeon_instance: BaseDisplayContainer, + companionSlots: List? + ) { + return pigeon_instance.setCompanionSlots(companionSlots) + } +} diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdSlotProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdSlotProxyApi.kt index ec0bdafdbd2..b8687135a3a 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdSlotProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdSlotProxyApi.kt @@ -47,4 +47,8 @@ class CompanionAdSlotProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : override fun setSize(pigeon_instance: CompanionAdSlot, width: Long, height: Long) { pigeon_instance.setSize(width.toInt(), height.toInt()) } + + override fun setFluidSize(pigeon_instance: CompanionAdSlot) { + pigeon_instance.setSize(CompanionAdSlot.FLUID_SIZE, CompanionAdSlot.FLUID_SIZE) + } } diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkFactoryProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkFactoryProxyApi.kt index 00ee7a23e71..dfb3bb5f857 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkFactoryProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkFactoryProxyApi.kt @@ -9,6 +9,7 @@ import com.google.ads.interactivemedia.v3.api.AdDisplayContainer import com.google.ads.interactivemedia.v3.api.AdsLoader import com.google.ads.interactivemedia.v3.api.AdsRenderingSettings import com.google.ads.interactivemedia.v3.api.AdsRequest +import com.google.ads.interactivemedia.v3.api.CompanionAdSlot import com.google.ads.interactivemedia.v3.api.ImaSdkFactory import com.google.ads.interactivemedia.v3.api.ImaSdkSettings import com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer @@ -32,6 +33,10 @@ class ImaSdkFactoryProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : return ImaSdkFactory.createAdDisplayContainer(container, player) } + override fun createCompanionAdSlot(pigeon_instance: ImaSdkFactory): CompanionAdSlot { + return pigeon_instance.createCompanionAdSlot() + } + override fun createImaSdkSettings(pigeon_instance: ImaSdkFactory): ImaSdkSettings { return pigeon_instance.createImaSdkSettings() } 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 ecf6ebbe025..259eaf4ce76 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 @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v25.3.1), do not edit directly. +// Autogenerated from Pigeon (v25.3.2), do not edit directly. // See also: https://pub.dev/packages/pigeon @file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") @@ -387,9 +387,7 @@ abstract class InteractiveMediaAdsLibraryPigeonProxyApiRegistrar( * An implementation of [PigeonApiBaseDisplayContainer] used to add a new Dart instance of * `BaseDisplayContainer` to the Dart `InstanceManager`. */ - open fun getPigeonApiBaseDisplayContainer(): PigeonApiBaseDisplayContainer { - return PigeonApiBaseDisplayContainer(this) - } + abstract fun getPigeonApiBaseDisplayContainer(): PigeonApiBaseDisplayContainer /** * An implementation of [PigeonApiAdDisplayContainer] used to add a new Dart instance of @@ -592,6 +590,8 @@ abstract class InteractiveMediaAdsLibraryPigeonProxyApiRegistrar( fun setUp() { InteractiveMediaAdsLibraryPigeonInstanceManagerApi.setUpMessageHandlers( binaryMessenger, instanceManager) + PigeonApiBaseDisplayContainer.setUpMessageHandlers( + binaryMessenger, getPigeonApiBaseDisplayContainer()) PigeonApiAdsLoader.setUpMessageHandlers(binaryMessenger, getPigeonApiAdsLoader()) PigeonApiAdsRequest.setUpMessageHandlers(binaryMessenger, getPigeonApiAdsRequest()) PigeonApiContentProgressProvider.setUpMessageHandlers( @@ -621,6 +621,7 @@ abstract class InteractiveMediaAdsLibraryPigeonProxyApiRegistrar( fun tearDown() { InteractiveMediaAdsLibraryPigeonInstanceManagerApi.setUpMessageHandlers(binaryMessenger, null) + PigeonApiBaseDisplayContainer.setUpMessageHandlers(binaryMessenger, null) PigeonApiAdsLoader.setUpMessageHandlers(binaryMessenger, null) PigeonApiAdsRequest.setUpMessageHandlers(binaryMessenger, null) PigeonApiContentProgressProvider.setUpMessageHandlers(binaryMessenger, null) @@ -1004,9 +1005,55 @@ private open class InteractiveMediaAdsLibraryPigeonCodec : StandardMessageCodec( * https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/BaseDisplayContainer.html. */ @Suppress("UNCHECKED_CAST") -open class PigeonApiBaseDisplayContainer( +abstract class PigeonApiBaseDisplayContainer( open val pigeonRegistrar: InteractiveMediaAdsLibraryPigeonProxyApiRegistrar ) { + /** + * Sets slots for displaying companions. + * + * Passing null will reset the container to having no companion slots. + */ + abstract fun setCompanionSlots( + pigeon_instance: com.google.ads.interactivemedia.v3.api.BaseDisplayContainer, + companionSlots: List? + ) + + companion object { + @Suppress("LocalVariableName") + fun setUpMessageHandlers( + binaryMessenger: BinaryMessenger, + api: PigeonApiBaseDisplayContainer? + ) { + val codec = api?.pigeonRegistrar?.codec ?: InteractiveMediaAdsLibraryPigeonCodec() + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.interactive_media_ads.BaseDisplayContainer.setCompanionSlots", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val pigeon_instanceArg = + args[0] as com.google.ads.interactivemedia.v3.api.BaseDisplayContainer + val companionSlotsArg = + args[1] as List? + val wrapped: List = + try { + api.setCompanionSlots(pigeon_instanceArg, companionSlotsArg) + listOf(null) + } catch (exception: Throwable) { + InteractiveMediaAdsLibraryPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + } + } + @Suppress("LocalVariableName", "FunctionName") /** Creates a Dart instance of BaseDisplayContainer and attaches it to [pigeon_instanceArg]. */ fun pigeon_newInstance( @@ -2267,6 +2314,11 @@ abstract class PigeonApiImaSdkFactory( player: com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer ): com.google.ads.interactivemedia.v3.api.AdDisplayContainer + /** Creates a CompanionAdSlot for the SDK to fill with companion ads. */ + abstract fun createCompanionAdSlot( + pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkFactory + ): com.google.ads.interactivemedia.v3.api.CompanionAdSlot + /** Creates an `ImaSdkSettings` object for configuring the IMA SDK. */ abstract fun createImaSdkSettings( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkFactory @@ -2343,6 +2395,28 @@ abstract class PigeonApiImaSdkFactory( channel.setMessageHandler(null) } } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.interactive_media_ads.ImaSdkFactory.createCompanionAdSlot", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkFactory + val wrapped: List = + try { + listOf(api.createCompanionAdSlot(pigeon_instanceArg)) + } catch (exception: Throwable) { + InteractiveMediaAdsLibraryPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } run { val channel = BasicMessageChannel( @@ -5561,6 +5635,14 @@ abstract class PigeonApiCompanionAdSlot( height: Long ) + /** + * Sets the size of the slot as fluid. + * + * This is a convenience method that sets both parameters of [setSize] to + * [CompanionAdSlot.FLUID_SIZE](https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/CompanionAdSlot#FLUID_SIZE()). + */ + abstract fun setFluidSize(pigeon_instance: com.google.ads.interactivemedia.v3.api.CompanionAdSlot) + companion object { @Suppress("LocalVariableName") fun setUpMessageHandlers(binaryMessenger: BinaryMessenger, api: PigeonApiCompanionAdSlot?) { @@ -5760,6 +5842,30 @@ abstract class PigeonApiCompanionAdSlot( channel.setMessageHandler(null) } } + run { + val channel = + BasicMessageChannel( + binaryMessenger, + "dev.flutter.pigeon.interactive_media_ads.CompanionAdSlot.setFluidSize", + codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val pigeon_instanceArg = + args[0] as com.google.ads.interactivemedia.v3.api.CompanionAdSlot + val wrapped: List = + try { + api.setFluidSize(pigeon_instanceArg) + listOf(null) + } catch (exception: Throwable) { + InteractiveMediaAdsLibraryPigeonUtils.wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } } } diff --git a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/BaseDisplayContainerProxyApiTest.kt b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/BaseDisplayContainerProxyApiTest.kt new file mode 100644 index 00000000000..d161130d895 --- /dev/null +++ b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/BaseDisplayContainerProxyApiTest.kt @@ -0,0 +1,24 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package dev.flutter.packages.interactive_media_ads + +import com.google.ads.interactivemedia.v3.api.BaseDisplayContainer +import com.google.ads.interactivemedia.v3.api.CompanionAdSlot +import kotlin.test.Test +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify + +class BaseDisplayContainerProxyApiTest { + @Test + fun setCompanionSlots() { + val api = TestProxyApiRegistrar().getPigeonApiBaseDisplayContainer() + + val instance = mock() + val companionSlots = listOf(mock()) + api.setCompanionSlots(instance, companionSlots) + + verify(instance).setCompanionSlots(companionSlots) + } +} diff --git a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdSlotProxyApiTest.kt b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdSlotProxyApiTest.kt index 9e85e402c14..720d03b8978 100644 --- a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdSlotProxyApiTest.kt +++ b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/CompanionAdSlotProxyApiTest.kt @@ -101,4 +101,14 @@ class CompanionAdSlotProxyApiTest { verify(instance).setSize(width.toInt(), height.toInt()) } + + @Test + fun setFluidSize() { + val api = TestProxyApiRegistrar().getPigeonApiCompanionAdSlot() + + val instance = mock() + api.setFluidSize(instance) + + verify(instance).setSize(CompanionAdSlot.FLUID_SIZE, CompanionAdSlot.FLUID_SIZE) + } } diff --git a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkFactoryProxyApiTest.kt b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkFactoryProxyApiTest.kt index 092340d5b47..da0100b0dfe 100644 --- a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkFactoryProxyApiTest.kt +++ b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkFactoryProxyApiTest.kt @@ -8,6 +8,7 @@ import com.google.ads.interactivemedia.v3.api.AdDisplayContainer import com.google.ads.interactivemedia.v3.api.AdsLoader import com.google.ads.interactivemedia.v3.api.AdsRenderingSettings import com.google.ads.interactivemedia.v3.api.AdsRequest +import com.google.ads.interactivemedia.v3.api.CompanionAdSlot import com.google.ads.interactivemedia.v3.api.ImaSdkFactory import com.google.ads.interactivemedia.v3.api.ImaSdkSettings import kotlin.test.Test @@ -42,6 +43,17 @@ class ImaSdkFactoryProxyApiTest { assertEquals(mockAdsLoader, api.createAdsLoader(instance, mockSettings, mockContainer)) } + @Test + fun createCompanionAdSlot() { + val api = TestProxyApiRegistrar().getPigeonApiImaSdkFactory() + + val instance = mock() + val mockAdSlot = mock() + whenever(instance.createCompanionAdSlot()).thenReturn(mockAdSlot) + + assertEquals(mockAdSlot, api.createCompanionAdSlot(instance)) + } + @Test fun createAdsRequest() { val api = TestProxyApiRegistrar().getPigeonApiImaSdkFactory() diff --git a/packages/interactive_media_ads/example/ios/RunnerTests/ViewTests.swift b/packages/interactive_media_ads/example/ios/RunnerTests/ViewTests.swift new file mode 100644 index 00000000000..15ed93e0322 --- /dev/null +++ b/packages/interactive_media_ads/example/ios/RunnerTests/ViewTests.swift @@ -0,0 +1,20 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import Flutter +import XCTest + +@testable import interactive_media_ads + +final class ViewTests: XCTestCase { + func testPigeonDefaultConstructor() { + let registrar = TestProxyApiRegistrar() + let api = registrar.apiDelegate.pigeonApiUIView(registrar) + + let instance = try? api.pigeonDelegate.pigeonDefaultConstructor( + pigeonApi: api) + + XCTAssertNotNil(instance) + } +} diff --git a/packages/interactive_media_ads/example/lib/main.dart b/packages/interactive_media_ads/example/lib/main.dart index 49c080f7e54..1f591fc49ea 100644 --- a/packages/interactive_media_ads/example/lib/main.dart +++ b/packages/interactive_media_ads/example/lib/main.dart @@ -6,10 +6,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_driver/driver_extension.dart'; -// #docregion imports import 'package:interactive_media_ads/interactive_media_ads.dart'; import 'package:video_player/video_player.dart'; -// #enddocregion imports /// Entry point for integration tests that require espresso. @pragma('vm:entry-point') @@ -22,7 +20,6 @@ void main() { runApp(const MaterialApp(home: AdExampleWidget())); } -// #docregion example_widget /// Example widget displaying an Ad before a video. class AdExampleWidget extends StatefulWidget { /// Constructs an [AdExampleWidget]. @@ -45,11 +42,9 @@ class _AdExampleWidgetState extends State // AdsManager exposes methods to control ad playback and listen to ad events. AdsManager? _adsManager; - // #enddocregion example_widget // Last state received in `didChangeAppLifecycleState`. AppLifecycleState _lastLifecycleState = AppLifecycleState.resumed; - // #docregion example_widget // Whether the widget should be displaying the content video. The content // player is hidden while Ads are playing. bool _shouldShowContentVideo = false; @@ -65,10 +60,14 @@ class _AdExampleWidgetState extends State // This is required to support mid-roll ads. final ContentProgressProvider _contentProgressProvider = ContentProgressProvider(); - // #enddocregion example_widget - // #docregion ad_and_content_players + late final CompanionAdSlot companionAd = CompanionAdSlot( + size: CompanionAdSlotSize.fixed(width: 300, height: 250), + onClicked: () => debugPrint('Companion Ad Clicked'), + ); + late final AdDisplayContainer _adDisplayContainer = AdDisplayContainer( + companionSlots: [companionAd], onContainerAdded: (AdDisplayContainer container) { _adsLoader = AdsLoader( container: container, @@ -117,11 +116,9 @@ class _AdExampleWidgetState extends State @override void initState() { super.initState(); - // #enddocregion ad_and_content_players // Adds this instance as an observer for `AppLifecycleState` changes. WidgetsBinding.instance.addObserver(this); - // #docregion ad_and_content_players _contentVideoController = VideoPlayerController.networkUrl( Uri.parse( 'https://storage.googleapis.com/gvabox/media/samples/stock.mp4', @@ -138,7 +135,6 @@ class _AdExampleWidgetState extends State setState(() {}); }); } - // #enddocregion ad_and_content_players @override void didChangeAppLifecycleState(AppLifecycleState state) { @@ -163,7 +159,6 @@ class _AdExampleWidgetState extends State _lastLifecycleState = state; } - // #docregion request_ads Future _requestAds(AdDisplayContainer container) { return _adsLoader.requestAds(AdsRequest( adTagUrl: _adTagUrl, @@ -204,45 +199,51 @@ class _AdExampleWidgetState extends State _contentProgressTimer = null; return _contentVideoController.pause(); } - // #enddocregion request_ads - // #docregion dispose @override void dispose() { super.dispose(); _contentProgressTimer?.cancel(); _contentVideoController.dispose(); _adsManager?.destroy(); - // #enddocregion dispose WidgetsBinding.instance.removeObserver(this); - // #docregion dispose } - // #enddocregion dispose - // #docregion example_widget - // #docregion widget_build @override Widget build(BuildContext context) { - // #enddocregion example_widget return Scaffold( body: Center( - child: SizedBox( - width: 300, - child: !_contentVideoController.value.isInitialized - ? Container() - : AspectRatio( - aspectRatio: _contentVideoController.value.aspectRatio, - child: Stack( - children: [ - // The display container must be on screen before any Ads can be - // loaded and can't be removed between ads. This handles clicks for - // ads. - _adDisplayContainer, - if (_shouldShowContentVideo) - VideoPlayer(_contentVideoController) - ], - ), - ), + child: Column( + spacing: 100, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 300, + child: !_contentVideoController.value.isInitialized + ? Container() + : AspectRatio( + aspectRatio: _contentVideoController.value.aspectRatio, + child: Stack( + children: [ + // The display container must be on screen before any Ads can be + // loaded and can't be removed between ads. This handles clicks for + // ads. + _adDisplayContainer, + if (_shouldShowContentVideo) + VideoPlayer(_contentVideoController) + ], + ), + ), + ), + ColoredBox( + color: Colors.green, + child: SizedBox( + width: 300, + height: 250, + child: companionAd.buildWidget(context), + ), + ), + ], ), ), floatingActionButton: @@ -263,8 +264,5 @@ class _AdExampleWidgetState extends State ) : null, ); - // #docregion example_widget } - // #enddocregion widget_build } -// #enddocregion example_widget diff --git a/packages/interactive_media_ads/example/lib/readme_example.dart b/packages/interactive_media_ads/example/lib/readme_example.dart new file mode 100644 index 00000000000..1c2c5f42f60 --- /dev/null +++ b/packages/interactive_media_ads/example/lib/readme_example.dart @@ -0,0 +1,258 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:flutter/material.dart'; +// #docregion imports +import 'package:interactive_media_ads/interactive_media_ads.dart'; +import 'package:video_player/video_player.dart'; +// #enddocregion imports + +// #docregion example_widget +/// Example widget displaying an Ad before a video. +class AdExampleWidget extends StatefulWidget { + /// Constructs an [AdExampleWidget]. + const AdExampleWidget({super.key}); + + @override + State createState() => _AdExampleWidgetState(); +} + +class _AdExampleWidgetState extends State + with WidgetsBindingObserver { + // IMA sample tag for a pre-, mid-, and post-roll, single inline video ad. See more IMA sample + // tags at https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/tags + static const String _adTagUrl = + 'https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/vmap_ad_samples&sz=640x480&cust_params=sample_ar%3Dpremidpost&ciu_szs=300x250&gdfp_req=1&ad_rule=1&output=vmap&unviewed_position_start=1&env=vp&impl=s&cmsid=496&vid=short_onecue&correlator='; + + // The AdsLoader instance exposes the request ads method. + late final AdsLoader _adsLoader; + + // AdsManager exposes methods to control ad playback and listen to ad events. + AdsManager? _adsManager; + + // #enddocregion example_widget + // Last state received in `didChangeAppLifecycleState`. + AppLifecycleState _lastLifecycleState = AppLifecycleState.resumed; + + // #docregion example_widget + // Whether the widget should be displaying the content video. The content + // player is hidden while Ads are playing. + bool _shouldShowContentVideo = false; + + // Controls the content video player. + late final VideoPlayerController _contentVideoController; + + // Periodically updates the SDK of the current playback progress of the + // content video. + Timer? _contentProgressTimer; + + // Provides the SDK with the current playback progress of the content video. + // This is required to support mid-roll ads. + final ContentProgressProvider _contentProgressProvider = + ContentProgressProvider(); + // #enddocregion example_widget + + // #docregion ad_and_content_players + late final AdDisplayContainer _adDisplayContainer = AdDisplayContainer( + onContainerAdded: (AdDisplayContainer container) { + _adsLoader = AdsLoader( + container: container, + onAdsLoaded: (OnAdsLoadedData data) { + final AdsManager manager = data.manager; + _adsManager = data.manager; + + manager.setAdsManagerDelegate(AdsManagerDelegate( + onAdEvent: (AdEvent event) { + debugPrint('OnAdEvent: ${event.type} => ${event.adData}'); + switch (event.type) { + case AdEventType.loaded: + manager.start(); + case AdEventType.contentPauseRequested: + _pauseContent(); + case AdEventType.contentResumeRequested: + _resumeContent(); + case AdEventType.allAdsCompleted: + manager.destroy(); + _adsManager = null; + case AdEventType.clicked: + case AdEventType.complete: + case _: + } + }, + onAdErrorEvent: (AdErrorEvent event) { + debugPrint('AdErrorEvent: ${event.error.message}'); + _resumeContent(); + }, + )); + + manager.init(settings: AdsRenderingSettings(enablePreloading: true)); + }, + onAdsLoadError: (AdsLoadErrorData data) { + debugPrint('OnAdsLoadError: ${data.error.message}'); + _resumeContent(); + }, + ); + + // Ads can't be requested until the `AdDisplayContainer` has been added to + // the native View hierarchy. + _requestAds(container); + }, + ); + + @override + void initState() { + super.initState(); + // #enddocregion ad_and_content_players + // Adds this instance as an observer for `AppLifecycleState` changes. + WidgetsBinding.instance.addObserver(this); + + // #docregion ad_and_content_players + _contentVideoController = VideoPlayerController.networkUrl( + Uri.parse( + 'https://storage.googleapis.com/gvabox/media/samples/stock.mp4', + ), + ) + ..addListener(() { + if (_contentVideoController.value.isCompleted) { + _adsLoader.contentComplete(); + } + setState(() {}); + }) + ..initialize().then((_) { + // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed. + setState(() {}); + }); + } + // #enddocregion ad_and_content_players + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + switch (state) { + case AppLifecycleState.resumed: + if (!_shouldShowContentVideo) { + _adsManager?.resume(); + } + case AppLifecycleState.inactive: + // Pausing the Ad video player on Android can only be done in this state + // because it corresponds to `Activity.onPause`. This state is also + // triggered before resume, so this will only pause the Ad if the app is + // in the process of being sent to the background. + if (!_shouldShowContentVideo && + _lastLifecycleState == AppLifecycleState.resumed) { + _adsManager?.pause(); + } + case AppLifecycleState.hidden: + case AppLifecycleState.paused: + case AppLifecycleState.detached: + } + _lastLifecycleState = state; + } + + // #docregion request_ads + Future _requestAds(AdDisplayContainer container) { + return _adsLoader.requestAds(AdsRequest( + adTagUrl: _adTagUrl, + contentProgressProvider: _contentProgressProvider, + )); + } + + Future _resumeContent() async { + setState(() { + _shouldShowContentVideo = true; + }); + + if (_adsManager != null) { + _contentProgressTimer = Timer.periodic( + const Duration(milliseconds: 200), + (Timer timer) async { + if (_contentVideoController.value.isInitialized) { + final Duration? progress = await _contentVideoController.position; + if (progress != null) { + await _contentProgressProvider.setProgress( + progress: progress, + duration: _contentVideoController.value.duration, + ); + } + } + }, + ); + } + + await _contentVideoController.play(); + } + + Future _pauseContent() { + setState(() { + _shouldShowContentVideo = false; + }); + _contentProgressTimer?.cancel(); + _contentProgressTimer = null; + return _contentVideoController.pause(); + } + // #enddocregion request_ads + + // #docregion dispose + @override + void dispose() { + super.dispose(); + _contentProgressTimer?.cancel(); + _contentVideoController.dispose(); + _adsManager?.destroy(); + // #enddocregion dispose + WidgetsBinding.instance.removeObserver(this); + // #docregion dispose + } + // #enddocregion dispose + + // #docregion example_widget + // #docregion widget_build + @override + Widget build(BuildContext context) { + // #enddocregion example_widget + return Scaffold( + body: Center( + child: SizedBox( + width: 300, + child: !_contentVideoController.value.isInitialized + ? Container() + : AspectRatio( + aspectRatio: _contentVideoController.value.aspectRatio, + child: Stack( + children: [ + // The display container must be on screen before any Ads can be + // loaded and can't be removed between ads. This handles clicks for + // ads. + _adDisplayContainer, + if (_shouldShowContentVideo) + VideoPlayer(_contentVideoController) + ], + ), + ), + ), + ), + floatingActionButton: + _contentVideoController.value.isInitialized && _shouldShowContentVideo + ? FloatingActionButton( + onPressed: () { + setState(() { + _contentVideoController.value.isPlaying + ? _contentVideoController.pause() + : _contentVideoController.play(); + }); + }, + child: Icon( + _contentVideoController.value.isPlaying + ? Icons.pause + : Icons.play_arrow, + ), + ) + : null, + ); + // #docregion example_widget + } +// #enddocregion widget_build +} +// #enddocregion example_widget 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 c6ce12f4793..96be7e5b716 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.3+12" + static let pluginVersion = "0.2.4" func pigeonDefaultConstructor( pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer, diff --git a/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/CompanionAdSlotProxyAPIDelegate.swift b/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/CompanionAdSlotProxyAPIDelegate.swift index 263063221a5..1c3cd510e5e 100644 --- a/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/CompanionAdSlotProxyAPIDelegate.swift +++ b/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/CompanionAdSlotProxyAPIDelegate.swift @@ -35,4 +35,16 @@ class CompanionAdSlotProxyAPIDelegate: PigeonApiDelegateIMACompanionAdSlot { ) throws { pigeonInstance.delegate = delegate } + + func width(pigeonApi: PigeonApiIMACompanionAdSlot, pigeonInstance: IMACompanionAdSlot) throws + -> Int64 + { + return Int64(pigeonInstance.width) + } + + func height(pigeonApi: PigeonApiIMACompanionAdSlot, pigeonInstance: IMACompanionAdSlot) throws + -> Int64 + { + return Int64(pigeonInstance.height) + } } diff --git a/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/InteractiveMediaAdsLibrary.g.swift b/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/InteractiveMediaAdsLibrary.g.swift index 5f5211ca0c1..abda0e15bd6 100644 --- a/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/InteractiveMediaAdsLibrary.g.swift +++ b/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/InteractiveMediaAdsLibrary.g.swift @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v22.7.2), do not edit directly. +// Autogenerated from Pigeon (v25.3.2), do not edit directly. // See also: https://pub.dev/packages/pigeon import Foundation @@ -20,9 +20,9 @@ import UIKit final class PigeonError: Error { let code: String let message: String? - let details: Any? + let details: Sendable? - init(code: String, message: String?, details: Any?) { + init(code: String, message: String?, details: Sendable?) { self.code = code self.message = message self.details = details @@ -74,6 +74,7 @@ private func nilOrValue(_ value: Any?) -> T? { if value is NSNull { return nil } return value as! T? } + /// Handles the callback when an object is deallocated. protocol InteractiveMediaAdsLibraryPigeonInternalFinalizerDelegate: AnyObject { /// Invoked when the strong reference of an object is deallocated in an `InstanceManager`. @@ -82,12 +83,12 @@ protocol InteractiveMediaAdsLibraryPigeonInternalFinalizerDelegate: AnyObject { // Attaches to an object to receive a callback when the object is deallocated. internal final class InteractiveMediaAdsLibraryPigeonInternalFinalizer { - private static let associatedObjectKey = malloc(1)! + internal static let associatedObjectKey = malloc(1)! private let identifier: Int64 // Reference to the delegate is weak because the callback should be ignored if the // `InstanceManager` is deallocated. - private weak var delegate: InteractiveMediaAdsLibraryPigeonInternalFinalizerDelegate? + internal weak var delegate: InteractiveMediaAdsLibraryPigeonInternalFinalizerDelegate? private init( identifier: Int64, delegate: InteractiveMediaAdsLibraryPigeonInternalFinalizerDelegate @@ -106,7 +107,13 @@ internal final class InteractiveMediaAdsLibraryPigeonInternalFinalizer { } static func detach(from instance: AnyObject) { - objc_setAssociatedObject(instance, associatedObjectKey, nil, .OBJC_ASSOCIATION_ASSIGN) + let finalizer = + objc_getAssociatedObject(instance, associatedObjectKey) + as? InteractiveMediaAdsLibraryPigeonInternalFinalizer + if let finalizer = finalizer { + finalizer.delegate = nil + objc_setAssociatedObject(instance, associatedObjectKey, nil, .OBJC_ASSOCIATION_ASSIGN) + } } deinit { @@ -264,6 +271,10 @@ final class InteractiveMediaAdsLibraryPigeonInstanceManager { /// The manager will be empty after this call returns. func removeAllObjects() throws { lockQueue.sync { + let weakInstancesEnumerator = weakInstances.objectEnumerator()! + while let instance = weakInstancesEnumerator.nextObject() { + InteractiveMediaAdsLibraryPigeonInternalFinalizer.detach(from: instance as AnyObject) + } identifiers.removeAllObjects() weakInstances.removeAllObjects() strongInstances.removeAllObjects() @@ -366,7 +377,7 @@ private class InteractiveMediaAdsLibraryPigeonInstanceManagerApi { let details: String? = nilOrValue(listResponse[2]) completion(.failure(PigeonError(code: code, message: message, details: details))) } else { - completion(.success(Void())) + completion(.success(())) } } } @@ -464,11 +475,6 @@ protocol InteractiveMediaAdsLibraryPigeonProxyApiDelegate { } extension InteractiveMediaAdsLibraryPigeonProxyApiDelegate { - func pigeonApiUIView(_ registrar: InteractiveMediaAdsLibraryPigeonProxyApiRegistrar) - -> PigeonApiUIView - { - return PigeonApiUIView(pigeonRegistrar: registrar, delegate: PigeonApiDelegateUIView()) - } func pigeonApiIMASettings(_ registrar: InteractiveMediaAdsLibraryPigeonProxyApiRegistrar) -> PigeonApiIMASettings { @@ -530,6 +536,8 @@ open class InteractiveMediaAdsLibraryPigeonProxyApiRegistrar { binaryMessenger: binaryMessenger, instanceManager: instanceManager) PigeonApiIMAAdDisplayContainer.setUpMessageHandlers( binaryMessenger: binaryMessenger, api: apiDelegate.pigeonApiIMAAdDisplayContainer(self)) + PigeonApiUIView.setUpMessageHandlers( + binaryMessenger: binaryMessenger, api: apiDelegate.pigeonApiUIView(self)) PigeonApiUIViewController.setUpMessageHandlers( binaryMessenger: binaryMessenger, api: apiDelegate.pigeonApiUIViewController(self)) PigeonApiIMAContentPlayhead.setUpMessageHandlers( @@ -557,6 +565,7 @@ open class InteractiveMediaAdsLibraryPigeonProxyApiRegistrar { InteractiveMediaAdsLibraryPigeonInstanceManagerApi.setUpMessageHandlers( binaryMessenger: binaryMessenger, instanceManager: nil) PigeonApiIMAAdDisplayContainer.setUpMessageHandlers(binaryMessenger: binaryMessenger, api: nil) + PigeonApiUIView.setUpMessageHandlers(binaryMessenger: binaryMessenger, api: nil) PigeonApiUIViewController.setUpMessageHandlers(binaryMessenger: binaryMessenger, api: nil) PigeonApiIMAContentPlayhead.setUpMessageHandlers(binaryMessenger: binaryMessenger, api: nil) PigeonApiIMAAdsLoader.setUpMessageHandlers(binaryMessenger: binaryMessenger, api: nil) @@ -592,6 +601,9 @@ private class InteractiveMediaAdsLibraryPigeonInternalProxyApiCodecReaderWriter: let identifier = self.readValue() let instance: AnyObject? = pigeonRegistrar.instanceManager.instance( forIdentifier: identifier is Int64 ? identifier as! Int64 : Int64(identifier as! Int32)) + if instance == nil { + print("Failed to find instance with identifier: \(identifier!)") + } return instance default: return super.readValue(ofType: type) @@ -1392,42 +1404,41 @@ final class PigeonApiIMAAdDisplayContainer: PigeonApiProtocolIMAAdDisplayContain PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let adContainerArg = try! pigeonDelegate.adContainer( - pigeonApi: self, pigeonInstance: pigeonInstance) - let companionSlotsArg = try! pigeonDelegate.companionSlots( - pigeonApi: self, pigeonInstance: pigeonInstance) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAAdDisplayContainer.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg, adContainerArg, companionSlotsArg] as [Any?]) { - response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let adContainerArg = try! pigeonDelegate.adContainer( + pigeonApi: self, pigeonInstance: pigeonInstance) + let companionSlotsArg = try! pigeonDelegate.companionSlots( + pigeonApi: self, pigeonInstance: pigeonInstance) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAAdDisplayContainer.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg, adContainerArg, companionSlotsArg] as [Any?]) { + response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } } -open class PigeonApiDelegateUIView { +protocol PigeonApiDelegateUIView { + func pigeonDefaultConstructor(pigeonApi: PigeonApiUIView) throws -> UIView } protocol PigeonApiProtocolUIView { @@ -1448,6 +1459,34 @@ final class PigeonApiUIView: PigeonApiProtocolUIView { self.pigeonRegistrar = pigeonRegistrar self.pigeonDelegate = delegate } + static func setUpMessageHandlers(binaryMessenger: FlutterBinaryMessenger, api: PigeonApiUIView?) { + let codec: FlutterStandardMessageCodec = + api != nil + ? FlutterStandardMessageCodec( + readerWriter: InteractiveMediaAdsLibraryPigeonInternalProxyApiCodecReaderWriter( + pigeonRegistrar: api!.pigeonRegistrar)) + : FlutterStandardMessageCodec.sharedInstance() + let pigeonDefaultConstructorChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.interactive_media_ads.UIView.pigeon_defaultConstructor", + binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + pigeonDefaultConstructorChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let pigeonIdentifierArg = args[0] as! Int64 + do { + api.pigeonRegistrar.instanceManager.addDartCreatedInstance( + try api.pigeonDelegate.pigeonDefaultConstructor(pigeonApi: api), + withIdentifier: pigeonIdentifierArg) + reply(wrapResult(nil)) + } catch { + reply(wrapError(error)) + } + } + } else { + pigeonDefaultConstructorChannel.setMessageHandler(nil) + } + } + ///Creates a Dart instance of UIView and attaches it to [pigeonInstance]. func pigeonNewInstance( pigeonInstance: UIView, completion: @escaping (Result) -> Void @@ -1458,31 +1497,29 @@ final class PigeonApiUIView: PigeonApiProtocolUIView { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = "dev.flutter.pigeon.interactive_media_ads.UIView.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = "dev.flutter.pigeon.interactive_media_ads.UIView.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -1580,32 +1617,30 @@ final class PigeonApiUIViewController: PigeonApiProtocolUIViewController { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.UIViewController.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.UIViewController.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -1639,7 +1674,7 @@ final class PigeonApiUIViewController: PigeonApiProtocolUIViewController { let details: String? = nilOrValue(listResponse[2]) completion(.failure(PigeonError(code: code, message: message, details: details))) } else { - completion(.success(Void())) + completion(.success(())) } } } @@ -1730,32 +1765,30 @@ final class PigeonApiIMAContentPlayhead: PigeonApiProtocolIMAContentPlayhead { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAContentPlayhead.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAContentPlayhead.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -1890,32 +1923,30 @@ final class PigeonApiIMAAdsLoader: PigeonApiProtocolIMAAdsLoader { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAAdsLoader.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAAdsLoader.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -1951,32 +1982,30 @@ final class PigeonApiIMASettings: PigeonApiProtocolIMASettings { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMASettings.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMASettings.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -2053,32 +2082,30 @@ final class PigeonApiIMAAdsRequest: PigeonApiProtocolIMAAdsRequest { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAAdsRequest.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAAdsRequest.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -2157,15 +2184,17 @@ final class PigeonApiIMAAdsLoaderDelegate: PigeonApiProtocolIMAAdsLoaderDelegate PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + completion( + .failure( + PigeonError( + code: "new-instance-error", + message: + "Error: Attempting to create a new Dart instance of IMAAdsLoaderDelegate, but the class has a nonnull callback method.", + details: ""))) } - print( - "Error: Attempting to create a new Dart instance of IMAAdsLoaderDelegate, but the class has a nonnull callback method." - ) } /// Called when ads are successfully loaded from the ad servers by the loader. func adLoaderLoadedWith( @@ -2198,7 +2227,7 @@ final class PigeonApiIMAAdsLoaderDelegate: PigeonApiProtocolIMAAdsLoaderDelegate let details: String? = nilOrValue(listResponse[2]) completion(.failure(PigeonError(code: code, message: message, details: details))) } else { - completion(.success(Void())) + completion(.success(())) } } } @@ -2234,7 +2263,7 @@ final class PigeonApiIMAAdsLoaderDelegate: PigeonApiProtocolIMAAdsLoaderDelegate let details: String? = nilOrValue(listResponse[2]) completion(.failure(PigeonError(code: code, message: message, details: details))) } else { - completion(.success(Void())) + completion(.success(())) } } } @@ -2276,34 +2305,32 @@ final class PigeonApiIMAAdsLoadedData: PigeonApiProtocolIMAAdsLoadedData { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let adsManagerArg = try! pigeonDelegate.adsManager( - pigeonApi: self, pigeonInstance: pigeonInstance) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAAdsLoadedData.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg, adsManagerArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let adsManagerArg = try! pigeonDelegate.adsManager( + pigeonApi: self, pigeonInstance: pigeonInstance) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAAdsLoadedData.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg, adsManagerArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -2342,33 +2369,31 @@ final class PigeonApiIMAAdLoadingErrorData: PigeonApiProtocolIMAAdLoadingErrorDa PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let adErrorArg = try! pigeonDelegate.adError(pigeonApi: self, pigeonInstance: pigeonInstance) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAAdLoadingErrorData.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg, adErrorArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let adErrorArg = try! pigeonDelegate.adError(pigeonApi: self, pigeonInstance: pigeonInstance) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAAdLoadingErrorData.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg, adErrorArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -2410,35 +2435,34 @@ final class PigeonApiIMAAdError: PigeonApiProtocolIMAAdError { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let typeArg = try! pigeonDelegate.type(pigeonApi: self, pigeonInstance: pigeonInstance) - let codeArg = try! pigeonDelegate.code(pigeonApi: self, pigeonInstance: pigeonInstance) - let messageArg = try! pigeonDelegate.message(pigeonApi: self, pigeonInstance: pigeonInstance) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAAdError.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg, typeArg, codeArg, messageArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let typeArg = try! pigeonDelegate.type(pigeonApi: self, pigeonInstance: pigeonInstance) + let codeArg = try! pigeonDelegate.code(pigeonApi: self, pigeonInstance: pigeonInstance) + let messageArg = try! pigeonDelegate.message(pigeonApi: self, pigeonInstance: pigeonInstance) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAAdError.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg, typeArg, codeArg, messageArg] as [Any?]) { + response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -2647,32 +2671,30 @@ final class PigeonApiIMAAdsManager: PigeonApiProtocolIMAAdsManager { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAAdsManager.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAAdsManager.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -2761,15 +2783,17 @@ final class PigeonApiIMAAdsManagerDelegate: PigeonApiProtocolIMAAdsManagerDelega PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + completion( + .failure( + PigeonError( + code: "new-instance-error", + message: + "Error: Attempting to create a new Dart instance of IMAAdsManagerDelegate, but the class has a nonnull callback method.", + details: ""))) } - print( - "Error: Attempting to create a new Dart instance of IMAAdsManagerDelegate, but the class has a nonnull callback method." - ) } /// Called when there is an IMAAdEvent. func didReceiveAdEvent( @@ -2802,7 +2826,7 @@ final class PigeonApiIMAAdsManagerDelegate: PigeonApiProtocolIMAAdsManagerDelega let details: String? = nilOrValue(listResponse[2]) completion(.failure(PigeonError(code: code, message: message, details: details))) } else { - completion(.success(Void())) + completion(.success(())) } } } @@ -2838,7 +2862,7 @@ final class PigeonApiIMAAdsManagerDelegate: PigeonApiProtocolIMAAdsManagerDelega let details: String? = nilOrValue(listResponse[2]) completion(.failure(PigeonError(code: code, message: message, details: details))) } else { - completion(.success(Void())) + completion(.success(())) } } } @@ -2874,7 +2898,7 @@ final class PigeonApiIMAAdsManagerDelegate: PigeonApiProtocolIMAAdsManagerDelega let details: String? = nilOrValue(listResponse[2]) completion(.failure(PigeonError(code: code, message: message, details: details))) } else { - completion(.success(Void())) + completion(.success(())) } } } @@ -2910,7 +2934,7 @@ final class PigeonApiIMAAdsManagerDelegate: PigeonApiProtocolIMAAdsManagerDelega let details: String? = nilOrValue(listResponse[2]) completion(.failure(PigeonError(code: code, message: message, details: details))) } else { - completion(.success(Void())) + completion(.success(())) } } } @@ -2953,37 +2977,35 @@ final class PigeonApiIMAAdEvent: PigeonApiProtocolIMAAdEvent { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let typeArg = try! pigeonDelegate.type(pigeonApi: self, pigeonInstance: pigeonInstance) - let typeStringArg = try! pigeonDelegate.typeString( - pigeonApi: self, pigeonInstance: pigeonInstance) - let adDataArg = try! pigeonDelegate.adData(pigeonApi: self, pigeonInstance: pigeonInstance) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAAdEvent.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg, typeArg, typeStringArg, adDataArg] as [Any?]) { - response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let typeArg = try! pigeonDelegate.type(pigeonApi: self, pigeonInstance: pigeonInstance) + let typeStringArg = try! pigeonDelegate.typeString( + pigeonApi: self, pigeonInstance: pigeonInstance) + let adDataArg = try! pigeonDelegate.adData(pigeonApi: self, pigeonInstance: pigeonInstance) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAAdEvent.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg, typeArg, typeStringArg, adDataArg] as [Any?]) { + response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -3223,32 +3245,30 @@ final class PigeonApiIMAAdsRenderingSettings: PigeonApiProtocolIMAAdsRenderingSe PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAAdsRenderingSettings.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAAdsRenderingSettings.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -3279,31 +3299,30 @@ final class PigeonApiNSObject: PigeonApiProtocolNSObject { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = "dev.flutter.pigeon.interactive_media_ads.NSObject.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.NSObject.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -3394,37 +3413,35 @@ final class PigeonApiIMAFriendlyObstruction: PigeonApiProtocolIMAFriendlyObstruc PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let viewArg = try! pigeonDelegate.view(pigeonApi: self, pigeonInstance: pigeonInstance) - let purposeArg = try! pigeonDelegate.purpose(pigeonApi: self, pigeonInstance: pigeonInstance) - let detailedReasonArg = try! pigeonDelegate.detailedReason( - pigeonApi: self, pigeonInstance: pigeonInstance) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAFriendlyObstruction.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg, viewArg, purposeArg, detailedReasonArg] as [Any?]) { - response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let viewArg = try! pigeonDelegate.view(pigeonApi: self, pigeonInstance: pigeonInstance) + let purposeArg = try! pigeonDelegate.purpose(pigeonApi: self, pigeonInstance: pigeonInstance) + let detailedReasonArg = try! pigeonDelegate.detailedReason( + pigeonApi: self, pigeonInstance: pigeonInstance) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAFriendlyObstruction.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg, viewArg, purposeArg, detailedReasonArg] as [Any?]) { + response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -3474,40 +3491,38 @@ final class PigeonApiIMACompanionAd: PigeonApiProtocolIMACompanionAd { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let resourceValueArg = try! pigeonDelegate.resourceValue( - pigeonApi: self, pigeonInstance: pigeonInstance) - let apiFrameworkArg = try! pigeonDelegate.apiFramework( - pigeonApi: self, pigeonInstance: pigeonInstance) - let widthArg = try! pigeonDelegate.width(pigeonApi: self, pigeonInstance: pigeonInstance) - let heightArg = try! pigeonDelegate.height(pigeonApi: self, pigeonInstance: pigeonInstance) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMACompanionAd.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage( - [pigeonIdentifierArg, resourceValueArg, apiFrameworkArg, widthArg, heightArg] as [Any?] - ) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let resourceValueArg = try! pigeonDelegate.resourceValue( + pigeonApi: self, pigeonInstance: pigeonInstance) + let apiFrameworkArg = try! pigeonDelegate.apiFramework( + pigeonApi: self, pigeonInstance: pigeonInstance) + let widthArg = try! pigeonDelegate.width(pigeonApi: self, pigeonInstance: pigeonInstance) + let heightArg = try! pigeonDelegate.height(pigeonApi: self, pigeonInstance: pigeonInstance) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMACompanionAd.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage( + [pigeonIdentifierArg, resourceValueArg, apiFrameworkArg, widthArg, heightArg] as [Any?] + ) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -3534,6 +3549,10 @@ protocol PigeonApiDelegateIMACompanionAdSlot { func setDelegate( pigeonApi: PigeonApiIMACompanionAdSlot, pigeonInstance: IMACompanionAdSlot, delegate: IMACompanionDelegate?) throws + func width(pigeonApi: PigeonApiIMACompanionAdSlot, pigeonInstance: IMACompanionAdSlot) throws + -> Int64 + func height(pigeonApi: PigeonApiIMACompanionAdSlot, pigeonInstance: IMACompanionAdSlot) throws + -> Int64 } protocol PigeonApiProtocolIMACompanionAdSlot { @@ -3620,6 +3639,42 @@ final class PigeonApiIMACompanionAdSlot: PigeonApiProtocolIMACompanionAdSlot { } else { setDelegateChannel.setMessageHandler(nil) } + let widthChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.interactive_media_ads.IMACompanionAdSlot.width", + binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + widthChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let pigeonInstanceArg = args[0] as! IMACompanionAdSlot + do { + let result = try api.pigeonDelegate.width( + pigeonApi: api, pigeonInstance: pigeonInstanceArg) + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + widthChannel.setMessageHandler(nil) + } + let heightChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.interactive_media_ads.IMACompanionAdSlot.height", + binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + heightChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let pigeonInstanceArg = args[0] as! IMACompanionAdSlot + do { + let result = try api.pigeonDelegate.height( + pigeonApi: api, pigeonInstance: pigeonInstanceArg) + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + heightChannel.setMessageHandler(nil) + } } ///Creates a Dart instance of IMACompanionAdSlot and attaches it to [pigeonInstance]. @@ -3632,33 +3687,31 @@ final class PigeonApiIMACompanionAdSlot: PigeonApiProtocolIMACompanionAdSlot { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let viewArg = try! pigeonDelegate.view(pigeonApi: self, pigeonInstance: pigeonInstance) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMACompanionAdSlot.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg, viewArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let viewArg = try! pigeonDelegate.view(pigeonApi: self, pigeonInstance: pigeonInstance) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMACompanionAdSlot.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg, viewArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -3736,32 +3789,30 @@ final class PigeonApiIMACompanionDelegate: PigeonApiProtocolIMACompanionDelegate PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMACompanionDelegate.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMACompanionDelegate.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } @@ -3795,7 +3846,7 @@ final class PigeonApiIMACompanionDelegate: PigeonApiProtocolIMACompanionDelegate let details: String? = nilOrValue(listResponse[2]) completion(.failure(PigeonError(code: code, message: message, details: details))) } else { - completion(.success(Void())) + completion(.success(())) } } } @@ -3831,7 +3882,7 @@ final class PigeonApiIMACompanionDelegate: PigeonApiProtocolIMACompanionDelegate let details: String? = nilOrValue(listResponse[2]) completion(.failure(PigeonError(code: code, message: message, details: details))) } else { - completion(.success(Void())) + completion(.success(())) } } } @@ -3898,46 +3949,47 @@ final class PigeonApiIMAAdPodInfo: PigeonApiProtocolIMAAdPodInfo { PigeonError( code: "ignore-calls-error", message: "Calls to Dart are being ignored.", details: ""))) - return - } - if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { - completion(.success(Void())) - return - } - let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( - pigeonInstance as AnyObject) - let adPositionArg = try! pigeonDelegate.adPosition( - pigeonApi: self, pigeonInstance: pigeonInstance) - let maxDurationArg = try! pigeonDelegate.maxDuration( - pigeonApi: self, pigeonInstance: pigeonInstance) - let podIndexArg = try! pigeonDelegate.podIndex(pigeonApi: self, pigeonInstance: pigeonInstance) - let timeOffsetArg = try! pigeonDelegate.timeOffset( - pigeonApi: self, pigeonInstance: pigeonInstance) - let totalAdsArg = try! pigeonDelegate.totalAds(pigeonApi: self, pigeonInstance: pigeonInstance) - let isBumperArg = try! pigeonDelegate.isBumper(pigeonApi: self, pigeonInstance: pigeonInstance) - let binaryMessenger = pigeonRegistrar.binaryMessenger - let codec = pigeonRegistrar.codec - let channelName: String = - "dev.flutter.pigeon.interactive_media_ads.IMAAdPodInfo.pigeon_newInstance" - let channel = FlutterBasicMessageChannel( - name: channelName, binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage( - [ - pigeonIdentifierArg, adPositionArg, maxDurationArg, podIndexArg, timeOffsetArg, totalAdsArg, - isBumperArg, - ] as [Any?] - ) { response in - guard let listResponse = response as? [Any?] else { - completion(.failure(createConnectionError(withChannelName: channelName))) - return - } - if listResponse.count > 1 { - let code: String = listResponse[0] as! String - let message: String? = nilOrValue(listResponse[1]) - let details: String? = nilOrValue(listResponse[2]) - completion(.failure(PigeonError(code: code, message: message, details: details))) - } else { - completion(.success(Void())) + } else if pigeonRegistrar.instanceManager.containsInstance(pigeonInstance as AnyObject) { + completion(.success(())) + } else { + let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance( + pigeonInstance as AnyObject) + let adPositionArg = try! pigeonDelegate.adPosition( + pigeonApi: self, pigeonInstance: pigeonInstance) + let maxDurationArg = try! pigeonDelegate.maxDuration( + pigeonApi: self, pigeonInstance: pigeonInstance) + let podIndexArg = try! pigeonDelegate.podIndex( + pigeonApi: self, pigeonInstance: pigeonInstance) + let timeOffsetArg = try! pigeonDelegate.timeOffset( + pigeonApi: self, pigeonInstance: pigeonInstance) + let totalAdsArg = try! pigeonDelegate.totalAds( + pigeonApi: self, pigeonInstance: pigeonInstance) + let isBumperArg = try! pigeonDelegate.isBumper( + pigeonApi: self, pigeonInstance: pigeonInstance) + let binaryMessenger = pigeonRegistrar.binaryMessenger + let codec = pigeonRegistrar.codec + let channelName: String = + "dev.flutter.pigeon.interactive_media_ads.IMAAdPodInfo.pigeon_newInstance" + let channel = FlutterBasicMessageChannel( + name: channelName, binaryMessenger: binaryMessenger, codec: codec) + channel.sendMessage( + [ + pigeonIdentifierArg, adPositionArg, maxDurationArg, podIndexArg, timeOffsetArg, + totalAdsArg, isBumperArg, + ] as [Any?] + ) { response in + guard let listResponse = response as? [Any?] else { + completion(.failure(createConnectionError(withChannelName: channelName))) + return + } + if listResponse.count > 1 { + let code: String = listResponse[0] as! String + let message: String? = nilOrValue(listResponse[1]) + let details: String? = nilOrValue(listResponse[2]) + completion(.failure(PigeonError(code: code, message: message, details: details))) + } else { + completion(.success(())) + } } } } diff --git a/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/ViewProxyAPIDelegate.swift b/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/ViewProxyAPIDelegate.swift index 1352a6fa269..a06353c3583 100644 --- a/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/ViewProxyAPIDelegate.swift +++ b/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/ViewProxyAPIDelegate.swift @@ -10,7 +10,7 @@ import UIKit /// This class may handle instantiating native object instances that are attached to a Dart /// instance or handle method calls on the associated native class or an instance of that class. class ViewProxyAPIDelegate: PigeonApiDelegateUIView { - func getWindow(pigeonApi: PigeonApiUIView, pigeonInstance: UIView) throws -> UIWindow? { - return pigeonInstance.window + func pigeonDefaultConstructor(pigeonApi: PigeonApiUIView) throws -> UIView { + return UIView() } } diff --git a/packages/interactive_media_ads/lib/interactive_media_ads.dart b/packages/interactive_media_ads/lib/interactive_media_ads.dart index f8355bba41c..99948a8ccb6 100644 --- a/packages/interactive_media_ads/lib/interactive_media_ads.dart +++ b/packages/interactive_media_ads/lib/interactive_media_ads.dart @@ -9,6 +9,7 @@ export 'src/ads_rendering_settings.dart'; export 'src/ads_request.dart'; export 'src/android/android_interactive_media_ads.dart' show AndroidInteractiveMediaAds; +export 'src/companion_ad_slot.dart'; export 'src/content_progress_provider.dart'; export 'src/ios/ios_interactive_media_ads.dart' show IOSInteractiveMediaAds; export 'src/platform_interface/platform_interface.dart' @@ -20,4 +21,7 @@ export 'src/platform_interface/platform_interface.dart' AdEvent, AdEventType, AdUIElement, - AdsLoadErrorData; + AdsLoadErrorData, + CompanionAdSlotSize, + CompanionAdSlotSizeFixed, + CompanionAdSlotSizeFluid; diff --git a/packages/interactive_media_ads/lib/src/ad_display_container.dart b/packages/interactive_media_ads/lib/src/ad_display_container.dart index 9c4aeed9387..6a814f1b365 100644 --- a/packages/interactive_media_ads/lib/src/ad_display_container.dart +++ b/packages/interactive_media_ads/lib/src/ad_display_container.dart @@ -4,7 +4,7 @@ import 'package:flutter/cupertino.dart'; -import 'platform_interface/platform_ad_display_container.dart'; +import 'companion_ad_slot.dart'; import 'platform_interface/platform_interface.dart'; /// A [Widget] for displaying loaded ads. @@ -37,6 +37,7 @@ class AdDisplayContainer extends StatelessWidget { AdDisplayContainer({ Key? key, required void Function(AdDisplayContainer container) onContainerAdded, + Iterable companionSlots = const [], TextDirection layoutDirection = TextDirection.ltr, }) : this.fromPlatformCreationParams( key: key, @@ -46,6 +47,9 @@ class AdDisplayContainer extends StatelessWidget { platform: container, )); }, + companionSlots: companionSlots.map( + (CompanionAdSlot slot) => slot.platform, + ), layoutDirection: layoutDirection, ), ); @@ -97,6 +101,12 @@ class AdDisplayContainer extends StatelessWidget { void Function(PlatformAdDisplayContainer container) get onContainerAdded => platform.params.onContainerAdded; + /// List of companion ad slots. + Iterable get companionSlots => + platform.params.companionSlots.map( + (PlatformCompanionAdSlot slot) => CompanionAdSlot.fromPlatform(slot), + ); + /// The layout direction to use for the embedded AdDisplayContainer. TextDirection get layoutDirection => platform.params.layoutDirection; diff --git a/packages/interactive_media_ads/lib/src/android/android_ad_display_container.dart b/packages/interactive_media_ads/lib/src/android/android_ad_display_container.dart index 1c3a63dd965..57751746173 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ad_display_container.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ad_display_container.dart @@ -8,6 +8,7 @@ import 'package:flutter/widgets.dart'; import 'package:meta/meta.dart'; import '../platform_interface/platform_interface.dart'; +import 'android_companion_ad_slot.dart'; import 'android_view_widget.dart'; import 'interactive_media_ads.g.dart' as ima; import 'interactive_media_ads_proxy.dart'; @@ -20,6 +21,7 @@ final class AndroidAdDisplayContainerCreationParams const AndroidAdDisplayContainerCreationParams({ super.key, required super.onContainerAdded, + super.companionSlots, @visibleForTesting InteractiveMediaAdsProxy? imaProxy, @visibleForTesting PlatformViewsServiceProxy? platformViewsProxy, }) : _imaProxy = imaProxy ?? const InteractiveMediaAdsProxy(), @@ -37,6 +39,7 @@ final class AndroidAdDisplayContainerCreationParams return AndroidAdDisplayContainerCreationParams( key: params.key, onContainerAdded: params.onContainerAdded, + companionSlots: params.companionSlots, imaProxy: imaProxy, platformViewsProxy: platformViewsProxy, ); @@ -144,6 +147,18 @@ base class AndroidAdDisplayContainer extends PlatformAdDisplayContainer { _frameLayout, _videoAdPlayer, ); + final Iterable nativeCompanionSlots = + await Future.wait( + _androidParams.companionSlots.map( + (PlatformCompanionAdSlot slot) { + return (slot as AndroidCompanionAdSlot) + .getNativeCompanionAdSlot(); + }, + ), + ); + await adDisplayContainer!.setCompanionSlots( + nativeCompanionSlots.toList(), + ); params.onContainerAdded(this); }, ); diff --git a/packages/interactive_media_ads/lib/src/android/android_companion_ad_slot.dart b/packages/interactive_media_ads/lib/src/android/android_companion_ad_slot.dart new file mode 100644 index 00000000000..2ce3fbf2bbc --- /dev/null +++ b/packages/interactive_media_ads/lib/src/android/android_companion_ad_slot.dart @@ -0,0 +1,124 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/cupertino.dart'; +import 'package:meta/meta.dart'; + +import '../platform_interface/build_widget_creation_params.dart'; +import '../platform_interface/companion_ad_slot_size.dart'; +import '../platform_interface/platform_companion_ad_slot.dart'; +import 'android_view_widget.dart'; +import 'interactive_media_ads.g.dart' as ima; +import 'interactive_media_ads_proxy.dart'; +import 'platform_views_service_proxy.dart'; + +/// Android implementation of [PlatformCompanionAdSlotCreationParams]. +final class AndroidCompanionAdSlotCreationParams + extends PlatformCompanionAdSlotCreationParams { + /// Constructs an [AndroidCompanionAdSlotCreationParams]. + const AndroidCompanionAdSlotCreationParams({ + required super.size, + super.onClicked, + @visibleForTesting InteractiveMediaAdsProxy? proxy, + @visibleForTesting PlatformViewsServiceProxy? platformViewsProxy, + }) : _proxy = proxy ?? const InteractiveMediaAdsProxy(), + _platformViewsProxy = + platformViewsProxy ?? const PlatformViewsServiceProxy(), + super(); + + /// Creates a [AndroidCompanionAdSlotCreationParams] from an instance of + /// [PlatformCompanionAdSlotCreationParams]. + factory AndroidCompanionAdSlotCreationParams.fromPlatformCompanionAdSlotCreationParamsSize( + PlatformCompanionAdSlotCreationParams params, { + @visibleForTesting InteractiveMediaAdsProxy? proxy, + @visibleForTesting PlatformViewsServiceProxy? platformViewsProxy, + }) { + return AndroidCompanionAdSlotCreationParams( + size: params.size, + onClicked: params.onClicked, + proxy: proxy, + platformViewsProxy: platformViewsProxy, + ); + } + + final InteractiveMediaAdsProxy _proxy; + final PlatformViewsServiceProxy _platformViewsProxy; +} + +/// Android implementation of [PlatformCompanionAdSlot]. +base class AndroidCompanionAdSlot extends PlatformCompanionAdSlot { + /// Constructs an [AndroidCompanionAdSlot]. + AndroidCompanionAdSlot(super.params) : super.implementation(); + + late final AndroidCompanionAdSlotCreationParams _androidParams = + _initAndroidParams(params); + + // ViewGroup used to display the Ad. + late final ima.ViewGroup _frameLayout = + _androidParams._proxy.newFrameLayout(); + + late final Future _adSlotFuture = _initCompanionAdSlot(); + + /// The future returning the native CompanionAdSlot. + @internal + Future getNativeCompanionAdSlot() => _adSlotFuture; + + @override + Widget buildWidget(BuildWidgetCreationParams params) { + return AndroidViewWidget( + key: params.key, + view: _frameLayout, + platformViewsServiceProxy: _androidParams._platformViewsProxy, + layoutDirection: params.layoutDirection, + ); + } + + AndroidCompanionAdSlotCreationParams _initAndroidParams( + PlatformCompanionAdSlotCreationParams params, + ) { + if (params is AndroidCompanionAdSlotCreationParams) { + return params; + } + + return AndroidCompanionAdSlotCreationParams + .fromPlatformCompanionAdSlotCreationParamsSize(params); + } + + Future _initCompanionAdSlot() async { + final ima.CompanionAdSlot adSlot = await _androidParams._proxy + .instanceImaSdkFactory() + .createCompanionAdSlot(); + + await Future.wait(>[ + adSlot.setContainer(_frameLayout), + switch (params.size) { + final CompanionAdSlotSizeFixed size => + adSlot.setSize(size.width, size.height), + CompanionAdSlotSizeFluid() => adSlot.setFluidSize(), + }, + if (params.onClicked != null) + adSlot.addClickListener( + _createAdSlotClickListener( + WeakReference(this), + ), + ), + ]); + + return adSlot; + } + + // This value is created in a static method because the callback methods for + // any wrapped classes must not reference the encapsulating object. This is to + // prevent a circular reference that prevents garbage collection. + static ima.CompanionAdSlotClickListener _createAdSlotClickListener( + WeakReference weakThis, + ) { + return weakThis.target!._androidParams._proxy + .newCompanionAdSlotClickListener( + onCompanionAdClick: (_) { + weakThis.target?.params.onClicked!.call(); + }, + ); + } +} diff --git a/packages/interactive_media_ads/lib/src/android/android_interactive_media_ads.dart b/packages/interactive_media_ads/lib/src/android/android_interactive_media_ads.dart index 8e77520a07f..b6f59eb081a 100644 --- a/packages/interactive_media_ads/lib/src/android/android_interactive_media_ads.dart +++ b/packages/interactive_media_ads/lib/src/android/android_interactive_media_ads.dart @@ -7,11 +7,13 @@ import '../platform_interface/platform_ad_display_container.dart'; import '../platform_interface/platform_ads_loader.dart'; import '../platform_interface/platform_ads_manager_delegate.dart'; import '../platform_interface/platform_ads_rendering_settings.dart'; +import '../platform_interface/platform_companion_ad_slot.dart'; import '../platform_interface/platform_content_progress_provider.dart'; import 'android_ad_display_container.dart'; import 'android_ads_loader.dart'; import 'android_ads_manager_delegate.dart'; import 'android_ads_rendering_settings.dart'; +import 'android_companion_ad_slot.dart'; import 'android_content_progress_provider.dart'; /// Android implementation of [InteractiveMediaAdsPlatform]. @@ -55,4 +57,11 @@ final class AndroidInteractiveMediaAds extends InteractiveMediaAdsPlatform { ) { return AndroidAdsRenderingSettings(params); } + + @override + AndroidCompanionAdSlot createPlatformCompanionAdSlot( + PlatformCompanionAdSlotCreationParams params, + ) { + return AndroidCompanionAdSlot(params); + } } 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 5c96a97db60..4c4aed56752 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 @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v25.3.1), do not edit directly. +// Autogenerated from Pigeon (v25.3.2), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers @@ -213,8 +213,17 @@ class PigeonInstanceManager { /// /// Returns the randomly generated id of the [instance] added. int addDartCreatedInstance(PigeonInternalProxyApiBaseClass instance) { + assert(getIdentifier(instance) == null); + final int identifier = _nextUniqueIdentifier(); - _addInstanceWithIdentifier(instance, identifier); + _identifiers[instance] = identifier; + _weakInstances[identifier] = + WeakReference(instance); + _finalizer.attach(instance, identifier, detach: instance); + + final PigeonInternalProxyApiBaseClass copy = instance.pigeon_copy(); + _identifiers[copy] = identifier; + _strongInstances[identifier] = copy; return identifier; } @@ -246,9 +255,15 @@ class PigeonInstanceManager { /// it was removed. Returns `null` if [identifier] was not associated with /// any strong reference. /// - /// This does not remove the weak referenced instance associated with - /// [identifier]. This can be done with [removeWeakReference]. + /// Throws an `AssertionError` if the weak referenced instance associated with + /// [identifier] is not removed first. This can be done with + /// [removeWeakReference]. T? remove(int identifier) { + final T? instance = _weakInstances[identifier]?.target as T?; + assert( + instance == null, + 'A strong instance with identifier $identifier is being removed despite the weak reference still existing: $instance', + ); return _strongInstances.remove(identifier) as T?; } @@ -299,27 +314,14 @@ class PigeonInstanceManager { /// /// Throws assertion error if the instance or its identifier has already been /// added. - /// - /// Returns unique identifier of the [instance] added. void addHostCreatedInstance( PigeonInternalProxyApiBaseClass instance, int identifier) { - _addInstanceWithIdentifier(instance, identifier); - } - - void _addInstanceWithIdentifier( - PigeonInternalProxyApiBaseClass instance, int identifier) { assert(!containsIdentifier(identifier)); assert(getIdentifier(instance) == null); assert(identifier >= 0); _identifiers[instance] = identifier; - _weakInstances[identifier] = - WeakReference(instance); - _finalizer.attach(instance, identifier, detach: instance); - - final PigeonInternalProxyApiBaseClass copy = instance.pigeon_copy(); - _identifiers[copy] = identifier; - _strongInstances[identifier] = copy; + _strongInstances[identifier] = instance; } /// Whether this manager contains the given [identifier]. @@ -727,6 +729,10 @@ class BaseDisplayContainer extends PigeonInternalProxyApiBaseClass { super.pigeon_instanceManager, }); + late final _PigeonInternalProxyApiBaseCodec + _pigeonVar_codecBaseDisplayContainer = + _PigeonInternalProxyApiBaseCodec(pigeon_instanceManager); + static void pigeon_setUpMessageHandlers({ bool pigeon_clearHandlers = false, BinaryMessenger? pigeon_binaryMessenger, @@ -776,6 +782,38 @@ class BaseDisplayContainer extends PigeonInternalProxyApiBaseClass { } } + /// Sets slots for displaying companions. + /// + /// Passing null will reset the container to having no companion slots. + Future setCompanionSlots(List? companionSlots) async { + final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = + _pigeonVar_codecBaseDisplayContainer; + final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.BaseDisplayContainer.setCompanionSlots'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, companionSlots]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + @override BaseDisplayContainer pigeon_copy() { return BaseDisplayContainer.pigeon_detached( @@ -788,8 +826,7 @@ class BaseDisplayContainer extends PigeonInternalProxyApiBaseClass { /// A container in which to display the ads. /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/AdDisplayContainer. -class AdDisplayContainer extends PigeonInternalProxyApiBaseClass - implements BaseDisplayContainer { +class AdDisplayContainer extends BaseDisplayContainer { /// Constructs [AdDisplayContainer] without creating the associated native object. /// /// This should only be used by subclasses created by this library or to @@ -798,7 +835,7 @@ class AdDisplayContainer extends PigeonInternalProxyApiBaseClass AdDisplayContainer.pigeon_detached({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, - }); + }) : super.pigeon_detached(); static void pigeon_setUpMessageHandlers({ bool pigeon_clearHandlers = false, @@ -2433,6 +2470,41 @@ class ImaSdkFactory extends PigeonInternalProxyApiBaseClass { } } + /// Creates a CompanionAdSlot for the SDK to fill with companion ads. + Future createCompanionAdSlot() async { + final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = + _pigeonVar_codecImaSdkFactory; + final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.ImaSdkFactory.createCompanionAdSlot'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + 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 CompanionAdSlot?)!; + } + } + /// Creates an `ImaSdkSettings` object for configuring the IMA SDK. Future createImaSdkSettings() async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = @@ -7036,6 +7108,39 @@ class CompanionAdSlot extends PigeonInternalProxyApiBaseClass { } } + /// Sets the size of the slot as fluid. + /// + /// This is a convenience method that sets both parameters of [setSize] to + /// [CompanionAdSlot.FLUID_SIZE](https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/CompanionAdSlot#FLUID_SIZE()). + Future setFluidSize() async { + final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = + _pigeonVar_codecCompanionAdSlot; + final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.CompanionAdSlot.setFluidSize'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + @override CompanionAdSlot pigeon_copy() { return CompanionAdSlot.pigeon_detached( diff --git a/packages/interactive_media_ads/lib/src/android/interactive_media_ads_proxy.dart b/packages/interactive_media_ads/lib/src/android/interactive_media_ads_proxy.dart index 7aa120654e8..e2349ec2fa8 100644 --- a/packages/interactive_media_ads/lib/src/android/interactive_media_ads_proxy.dart +++ b/packages/interactive_media_ads/lib/src/android/interactive_media_ads_proxy.dart @@ -24,6 +24,7 @@ class InteractiveMediaAdsProxy { this.newAdsLoadedListener = AdsLoadedListener.new, this.newAdErrorListener = AdErrorListener.new, this.newAdEventListener = AdEventListener.new, + this.newCompanionAdSlotClickListener = CompanionAdSlotClickListener.new, this.createAdDisplayContainerImaSdkFactory = ImaSdkFactory.createAdDisplayContainer, this.instanceImaSdkFactory = _instanceImaSdkFactory, @@ -77,6 +78,11 @@ class InteractiveMediaAdsProxy { required void Function(AdEventListener, AdEvent) onAdEvent, }) newAdEventListener; + /// Constructs [CompanionAdSlotClickListener]. + final CompanionAdSlotClickListener Function({ + required void Function(CompanionAdSlotClickListener) onCompanionAdClick, + }) newCompanionAdSlotClickListener; + /// Calls to [ImaSdkFactory.createAdDisplayContainer]. final Future Function(ViewGroup, VideoAdPlayer) createAdDisplayContainerImaSdkFactory; diff --git a/packages/interactive_media_ads/lib/src/companion_ad_slot.dart b/packages/interactive_media_ads/lib/src/companion_ad_slot.dart new file mode 100644 index 00000000000..407bf2332df --- /dev/null +++ b/packages/interactive_media_ads/lib/src/companion_ad_slot.dart @@ -0,0 +1,92 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import 'platform_interface/platform_interface.dart'; + +/// Ad slot for companion ads. +/// +/// ## Platform-Specific Features +/// This class contains an underlying implementation provided by the current +/// platform. Once a platform implementation is imported, the examples below +/// can be followed to use features provided by a platform's implementation. +/// +/// {@macro interactive_media_ads.CompanionAdSlot.fromPlatformCreationParams} +/// +/// Below is an example of accessing the platform-specific implementation for +/// iOS and Android: +/// +/// ```dart +/// final CompanionAdSlot slot = CompanionAdSlot.size(width: 100, height: 100); +/// +/// if (InteractiveMediaAdsPlatform.instance is IOSInteractiveMediaAdsPlatform) { +/// final IOSCompanionAdSlot iosSlot = slot.platform as IOSCompanionAdSlot; +/// } else if (InteractiveMediaAdsPlatform.instance is AndroidInteractiveMediaAdsPlatform) { +/// final AndroidCompanionAdSlot androidSlot = +/// slot.platform as AndroidCompanionAdSlot; +/// } +/// ``` +class CompanionAdSlot { + /// Constructs an instance of a [CompanionAdSlot]. + /// + /// See [CompanionAdSlot.fromPlatformCreationParams] for setting parameters + /// for a specific platform. + CompanionAdSlot({ + required CompanionAdSlotSize size, + void Function()? onClicked, + }) : this.fromPlatformCreationParams( + params: PlatformCompanionAdSlotCreationParams( + size: size, + onClicked: onClicked, + ), + ); + + /// Constructs a [CompanionAdSlot] from creation params for a specific + /// platform. + /// + /// {@template interactive_media_ads.CompanionAdSlot.fromPlatformCreationParams} + /// Below is an example of setting platform-specific creation parameters for + /// iOS and Android: + /// + /// ```dart + /// PlatformCompanionAdSlotCreationParams params = + /// const PlatformCompanionAdSlotCreationParams(); + /// + /// if (InteractiveMediaAdsPlatform.instance is IOSInteractiveMediaAdsPlatform) { + /// params = IOSCompanionAdSlotCreationParams + /// .fromPlatformCompanionAdSlotCreationParams( + /// params, + /// ); + /// } else if (InteractiveMediaAdsPlatform.instance is AndroidInteractiveMediaAdsPlatform) { + /// params = AndroidCompanionAdSlotCreationParams + /// .fromPlatformCompanionAdSlotCreationParams( + /// params, + /// ); + /// } + /// + /// final CompanionAdSlot slot = CompanionAdSlot.fromPlatformCreationParams( + /// params, + /// ); + /// ``` + /// {@endtemplate} + CompanionAdSlot.fromPlatformCreationParams({ + required PlatformCompanionAdSlotCreationParams params, + }) : this.fromPlatform(PlatformCompanionAdSlot(params)); + + /// Constructs a [CompanionAdSlot] from a specific platform implementation. + const CompanionAdSlot.fromPlatform(this.platform); + + /// Implementation of [PlatformCompanionAdSlot] for the current platform. + final PlatformCompanionAdSlot platform; + + /// Called when the slot is clicked on by the user and will successfully + /// navigate away. + void Function()? get onClicked => platform.params.onClicked; + + /// Builds the Widget that contains the native View. + Widget buildWidget(BuildContext context) { + return platform.buildWidget(BuildWidgetCreationParams(context: context)); + } +} diff --git a/packages/interactive_media_ads/lib/src/ios/interactive_media_ads.g.dart b/packages/interactive_media_ads/lib/src/ios/interactive_media_ads.g.dart index f37cfb166f9..622941f9836 100644 --- a/packages/interactive_media_ads/lib/src/ios/interactive_media_ads.g.dart +++ b/packages/interactive_media_ads/lib/src/ios/interactive_media_ads.g.dart @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v22.7.2), do not edit directly. +// Autogenerated from Pigeon (v25.3.2), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers @@ -190,8 +190,17 @@ class PigeonInstanceManager { /// /// Returns the randomly generated id of the [instance] added. int addDartCreatedInstance(PigeonInternalProxyApiBaseClass instance) { + assert(getIdentifier(instance) == null); + final int identifier = _nextUniqueIdentifier(); - _addInstanceWithIdentifier(instance, identifier); + _identifiers[instance] = identifier; + _weakInstances[identifier] = + WeakReference(instance); + _finalizer.attach(instance, identifier, detach: instance); + + final PigeonInternalProxyApiBaseClass copy = instance.pigeon_copy(); + _identifiers[copy] = identifier; + _strongInstances[identifier] = copy; return identifier; } @@ -223,9 +232,15 @@ class PigeonInstanceManager { /// it was removed. Returns `null` if [identifier] was not associated with /// any strong reference. /// - /// This does not remove the weak referenced instance associated with - /// [identifier]. This can be done with [removeWeakReference]. + /// Throws an `AssertionError` if the weak referenced instance associated with + /// [identifier] is not removed first. This can be done with + /// [removeWeakReference]. T? remove(int identifier) { + final T? instance = _weakInstances[identifier]?.target as T?; + assert( + instance == null, + 'A strong instance with identifier $identifier is being removed despite the weak reference still existing: $instance', + ); return _strongInstances.remove(identifier) as T?; } @@ -276,27 +291,14 @@ class PigeonInstanceManager { /// /// Throws assertion error if the instance or its identifier has already been /// added. - /// - /// Returns unique identifier of the [instance] added. void addHostCreatedInstance( PigeonInternalProxyApiBaseClass instance, int identifier) { - _addInstanceWithIdentifier(instance, identifier); - } - - void _addInstanceWithIdentifier( - PigeonInternalProxyApiBaseClass instance, int identifier) { assert(!containsIdentifier(identifier)); assert(getIdentifier(instance) == null); assert(identifier >= 0); _identifiers[instance] = identifier; - _weakInstances[identifier] = - WeakReference(instance); - _finalizer.attach(instance, identifier, detach: instance); - - final PigeonInternalProxyApiBaseClass copy = instance.pigeon_copy(); - _identifiers[copy] = identifier; - _strongInstances[identifier] = copy; + _strongInstances[identifier] = instance; } /// Whether this manager contains the given [identifier]. @@ -371,8 +373,10 @@ class _PigeonInternalInstanceManagerApi { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([identifier]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([identifier]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -398,8 +402,9 @@ class _PigeonInternalInstanceManagerApi { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); final List? pigeonVar_replyList = - await pigeonVar_channel.send(null) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -810,22 +815,24 @@ class IMAAdDisplayContainer extends NSObject { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMAAdDisplayContainer; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMAAdDisplayContainer.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([ + pigeonVar_instanceIdentifier, + adContainer, + companionSlots, + adContainerViewController + ]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMAAdDisplayContainer.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); final List? pigeonVar_replyList = - await pigeonVar_channel.send([ - pigeonVar_instanceIdentifier, - adContainer, - companionSlots, - adContainerViewController - ]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -938,8 +945,10 @@ class IMAAdDisplayContainer extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, controller]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, controller]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -966,8 +975,10 @@ class IMAAdDisplayContainer extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -996,8 +1007,10 @@ class IMAAdDisplayContainer extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, friendlyObstruction]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, friendlyObstruction]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1024,8 +1037,10 @@ class IMAAdDisplayContainer extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1054,6 +1069,42 @@ class IMAAdDisplayContainer extends NSObject { /// /// See https://developer.apple.com/documentation/uikit/uiview. class UIView extends NSObject { + UIView({ + super.pigeon_binaryMessenger, + super.pigeon_instanceManager, + }) : super.pigeon_detached() { + final int pigeonVar_instanceIdentifier = + pigeon_instanceManager.addDartCreatedInstance(this); + final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = + _pigeonVar_codecUIView; + final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.UIView.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([pigeonVar_instanceIdentifier]); + () async { + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + }(); + } + /// Constructs [UIView] without creating the associated native object. /// /// This should only be used by subclasses created by this library or to @@ -1064,6 +1115,9 @@ class UIView extends NSObject { super.pigeon_instanceManager, }) : super.pigeon_detached(); + late final _PigeonInternalProxyApiBaseCodec _pigeonVar_codecUIView = + _PigeonInternalProxyApiBaseCodec(pigeon_instanceManager); + static void pigeon_setUpMessageHandlers({ bool pigeon_clearHandlers = false, BinaryMessenger? pigeon_binaryMessenger, @@ -1136,17 +1190,19 @@ class UIViewController extends NSObject { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecUIViewController; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.UIViewController.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([pigeonVar_instanceIdentifier]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.UIViewController.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([pigeonVar_instanceIdentifier]) as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1314,9 +1370,10 @@ class UIViewController extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, pigeonVar_instanceIdentifier]) - as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, pigeonVar_instanceIdentifier]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1356,17 +1413,19 @@ class IMAContentPlayhead extends NSObject { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMAContentPlayhead; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMAContentPlayhead.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([pigeonVar_instanceIdentifier]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMAContentPlayhead.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([pigeonVar_instanceIdentifier]) as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1457,8 +1516,10 @@ class IMAContentPlayhead extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, timeInterval]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, timeInterval]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1495,18 +1556,19 @@ class IMAAdsLoader extends NSObject { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMAAdsLoader; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMAAdsLoader.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel + .send([pigeonVar_instanceIdentifier, settings]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMAAdsLoader.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([pigeonVar_instanceIdentifier, settings]) - as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1596,8 +1658,10 @@ class IMAAdsLoader extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1624,8 +1688,10 @@ class IMAAdsLoader extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, request]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, request]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1654,8 +1720,10 @@ class IMAAdsLoader extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, delegate]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, delegate]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1768,22 +1836,24 @@ class IMAAdsRequest extends NSObject { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMAAdsRequest; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMAAdsRequest.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel + .send([ + pigeonVar_instanceIdentifier, + adTagUrl, + adDisplayContainer, + contentPlayhead + ]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMAAdsRequest.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([ - pigeonVar_instanceIdentifier, - adTagUrl, - adDisplayContainer, - contentPlayhead - ]) as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -1884,17 +1954,19 @@ class IMAAdsLoaderDelegate extends NSObject { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMAAdsLoaderDelegate; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMAAdsLoaderDelegate.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([pigeonVar_instanceIdentifier]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMAAdsLoaderDelegate.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([pigeonVar_instanceIdentifier]) as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -2427,8 +2499,10 @@ class IMAAdsManager extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, delegate]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, delegate]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -2455,8 +2529,10 @@ class IMAAdsManager extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, adsRenderingSettings]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, adsRenderingSettings]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -2483,8 +2559,10 @@ class IMAAdsManager extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -2511,8 +2589,10 @@ class IMAAdsManager extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -2539,8 +2619,10 @@ class IMAAdsManager extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -2568,8 +2650,10 @@ class IMAAdsManager extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -2596,8 +2680,10 @@ class IMAAdsManager extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -2624,8 +2710,10 @@ class IMAAdsManager extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -2665,17 +2753,19 @@ class IMAAdsManagerDelegate extends NSObject { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMAAdsManagerDelegate; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMAAdsManagerDelegate.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([pigeonVar_instanceIdentifier]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMAAdsManagerDelegate.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([pigeonVar_instanceIdentifier]) as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3111,17 +3201,19 @@ class IMAAdsRenderingSettings extends NSObject { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMAAdsRenderingSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMAAdsRenderingSettings.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([pigeonVar_instanceIdentifier]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMAAdsRenderingSettings.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([pigeonVar_instanceIdentifier]) as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3212,8 +3304,10 @@ class IMAAdsRenderingSettings extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, types]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this, types]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3242,8 +3336,10 @@ class IMAAdsRenderingSettings extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, bitrate]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, bitrate]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3272,8 +3368,10 @@ class IMAAdsRenderingSettings extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, seconds]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, seconds]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3301,8 +3399,10 @@ class IMAAdsRenderingSettings extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, seconds]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, seconds]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3329,8 +3429,10 @@ class IMAAdsRenderingSettings extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, types]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this, types]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3359,8 +3461,10 @@ class IMAAdsRenderingSettings extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, enable]); final List? pigeonVar_replyList = - await pigeonVar_channel.send([this, enable]) as List?; + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3389,8 +3493,10 @@ class IMAAdsRenderingSettings extends NSObject { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, controller]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, controller]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3505,22 +3611,19 @@ class IMAFriendlyObstruction extends NSObject { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMAFriendlyObstruction; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMAFriendlyObstruction.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [pigeonVar_instanceIdentifier, view, purpose, detailedReason]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMAFriendlyObstruction.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([ - pigeonVar_instanceIdentifier, - view, - purpose, - detailedReason - ]) as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3771,18 +3874,19 @@ class IMACompanionAdSlot extends PigeonInternalProxyApiBaseClass { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMACompanionAdSlot; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMACompanionAdSlot.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([pigeonVar_instanceIdentifier, view]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMACompanionAdSlot.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([pigeonVar_instanceIdentifier, view]) - as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3813,18 +3917,19 @@ class IMACompanionAdSlot extends PigeonInternalProxyApiBaseClass { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMACompanionAdSlot; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMACompanionAdSlot.size'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel + .send([pigeonVar_instanceIdentifier, view, width, height]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMACompanionAdSlot.size'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel.send( - [pigeonVar_instanceIdentifier, view, width, height]) - as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3928,8 +4033,10 @@ class IMACompanionAdSlot extends PigeonInternalProxyApiBaseClass { pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([this, delegate]) as List?; + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this, delegate]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -3943,6 +4050,74 @@ class IMACompanionAdSlot extends PigeonInternalProxyApiBaseClass { } } + Future width() async { + final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = + _pigeonVar_codecIMACompanionAdSlot; + final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMACompanionAdSlot.width'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + 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 int?)!; + } + } + + Future height() async { + final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = + _pigeonVar_codecIMACompanionAdSlot; + final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMACompanionAdSlot.height'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([this]); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + 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 int?)!; + } + } + @override IMACompanionAdSlot pigeon_copy() { return IMACompanionAdSlot.pigeon_detached( @@ -3968,17 +4143,19 @@ class IMACompanionDelegate extends NSObject { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecIMACompanionDelegate; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; + const String pigeonVar_channelName = + 'dev.flutter.pigeon.interactive_media_ads.IMACompanionDelegate.pigeon_defaultConstructor'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([pigeonVar_instanceIdentifier]); () async { - const String pigeonVar_channelName = - 'dev.flutter.pigeon.interactive_media_ads.IMACompanionDelegate.pigeon_defaultConstructor'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); - final List? pigeonVar_replyList = await pigeonVar_channel - .send([pigeonVar_instanceIdentifier]) as List?; + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { diff --git a/packages/interactive_media_ads/lib/src/ios/interactive_media_ads_proxy.dart b/packages/interactive_media_ads/lib/src/ios/interactive_media_ads_proxy.dart index 53b472f4fb6..3acc304a261 100644 --- a/packages/interactive_media_ads/lib/src/ios/interactive_media_ads_proxy.dart +++ b/packages/interactive_media_ads/lib/src/ios/interactive_media_ads_proxy.dart @@ -14,6 +14,7 @@ class InteractiveMediaAdsProxy { /// Constructs an [InteractiveMediaAdsProxy]. const InteractiveMediaAdsProxy({ this.newIMAAdDisplayContainer = IMAAdDisplayContainer.new, + this.newUIView = UIView.new, this.newUIViewController = UIViewController.new, this.newIMAContentPlayhead = IMAContentPlayhead.new, this.newIMAAdsLoader = IMAAdsLoader.new, @@ -31,8 +32,12 @@ class InteractiveMediaAdsProxy { final IMAAdDisplayContainer Function({ required UIView adContainer, UIViewController? adContainerViewController, + List? companionSlots, }) newIMAAdDisplayContainer; + /// Constructs [UIView]. + final UIView Function() newUIView; + /// Constructs [UIViewController]. final UIViewController Function({ void Function(UIViewController, bool)? viewDidAppear, @@ -96,5 +101,15 @@ class InteractiveMediaAdsProxy { }) sizeIMACompanionAdSlot; /// Constructs [IMACompanionDelegate]. - final IMACompanionDelegate Function() newIMACompanionDelegate; + final IMACompanionDelegate Function({ + void Function( + IMACompanionDelegate, + IMACompanionAdSlot, + bool, + )? companionAdSlotFilled, + void Function( + IMACompanionDelegate, + IMACompanionAdSlot, + )? companionSlotWasClicked, + }) newIMACompanionDelegate; } diff --git a/packages/interactive_media_ads/lib/src/ios/ios_ad_display_container.dart b/packages/interactive_media_ads/lib/src/ios/ios_ad_display_container.dart index f0780d1a747..002f1ba65c3 100644 --- a/packages/interactive_media_ads/lib/src/ios/ios_ad_display_container.dart +++ b/packages/interactive_media_ads/lib/src/ios/ios_ad_display_container.dart @@ -11,6 +11,7 @@ import 'package:meta/meta.dart'; import '../platform_interface/platform_interface.dart'; import 'interactive_media_ads.g.dart'; import 'interactive_media_ads_proxy.dart'; +import 'ios_companion_ad_slot.dart'; /// Implementation of [PlatformAdDisplayContainerCreationParams] for iOS. final class IOSAdDisplayContainerCreationParams @@ -19,6 +20,7 @@ final class IOSAdDisplayContainerCreationParams const IOSAdDisplayContainerCreationParams({ super.key, required super.onContainerAdded, + super.companionSlots, @visibleForTesting InteractiveMediaAdsProxy? imaProxy, }) : _imaProxy = imaProxy ?? const InteractiveMediaAdsProxy(), super(); @@ -32,6 +34,7 @@ final class IOSAdDisplayContainerCreationParams return IOSAdDisplayContainerCreationParams( key: params.key, onContainerAdded: params.onContainerAdded, + companionSlots: params.companionSlots, imaProxy: imaProxy, ); } @@ -72,6 +75,10 @@ base class IOSAdDisplayContainer extends PlatformAdDisplayContainer { adDisplayContainer = _iosParams._imaProxy.newIMAAdDisplayContainer( adContainer: _controller.view, adContainerViewController: _controller, + companionSlots: _iosParams.companionSlots + .cast() + .map((IOSCompanionAdSlot slot) => slot.nativeCompanionAdSlot) + .toList(), ); await _viewDidAppearCompleter.future; params.onContainerAdded(this); diff --git a/packages/interactive_media_ads/lib/src/ios/ios_companion_ad_slot.dart b/packages/interactive_media_ads/lib/src/ios/ios_companion_ad_slot.dart new file mode 100644 index 00000000000..3bb096bb0fa --- /dev/null +++ b/packages/interactive_media_ads/lib/src/ios/ios_companion_ad_slot.dart @@ -0,0 +1,114 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; +import 'package:meta/meta.dart'; + +import '../platform_interface/build_widget_creation_params.dart'; +import '../platform_interface/companion_ad_slot_size.dart'; +import '../platform_interface/platform_companion_ad_slot.dart'; +import 'interactive_media_ads.g.dart'; +import 'interactive_media_ads_proxy.dart'; + +/// Implementation of [PlatformCompanionAdSlotCreationParams] for iOS. +final class IOSCompanionAdSlotCreationParams + extends PlatformCompanionAdSlotCreationParams { + /// Constructs an [IOSCompanionAdSlotCreationParams]. + const IOSCompanionAdSlotCreationParams({ + required super.size, + super.onClicked, + @visibleForTesting InteractiveMediaAdsProxy? proxy, + }) : _proxy = proxy ?? const InteractiveMediaAdsProxy(), + super(); + + /// Creates an [IOSCompanionAdSlotCreationParams] from an instance of + /// [PlatformCompanionAdSlotCreationParams]. + factory IOSCompanionAdSlotCreationParams.fromPlatformCompanionAdSlotCreationParamsSize( + PlatformCompanionAdSlotCreationParams params, { + @visibleForTesting InteractiveMediaAdsProxy? proxy, + }) { + return IOSCompanionAdSlotCreationParams( + size: params.size, + onClicked: params.onClicked, + proxy: proxy, + ); + } + + final InteractiveMediaAdsProxy _proxy; +} + +/// Implementation of [PlatformCompanionAdSlot] for iOS. +base class IOSCompanionAdSlot extends PlatformCompanionAdSlot { + /// Constructs an [IOSCompanionAdSlot]. + IOSCompanionAdSlot(super.params) : super.implementation(); + + late final IOSCompanionAdSlotCreationParams _iosParams = + _initIOSParams(params); + + // View used to display the Ad. + late final UIView _view = _iosParams._proxy.newUIView(); + + late final IMACompanionDelegate _delegate = _createCompanionDelegate( + WeakReference(this), + ); + + /// The native iOS IMACompanionAdSlot. + @internal + late final IMACompanionAdSlot nativeCompanionAdSlot = _initCompanionAdSlot(); + + @override + Widget buildWidget(BuildWidgetCreationParams params) { + return UiKitView( + key: params.key, + viewType: 'interactive_media_ads.packages.flutter.dev/view', + layoutDirection: params.layoutDirection, + creationParams: _view.pigeon_instanceManager.getIdentifier(_view), + creationParamsCodec: const StandardMessageCodec(), + ); + } + + IOSCompanionAdSlotCreationParams _initIOSParams( + PlatformCompanionAdSlotCreationParams params, + ) { + if (params is IOSCompanionAdSlotCreationParams) { + return params; + } + + return IOSCompanionAdSlotCreationParams + .fromPlatformCompanionAdSlotCreationParamsSize(params); + } + + IMACompanionAdSlot _initCompanionAdSlot() { + final IMACompanionAdSlot adSlot = switch (params.size) { + final CompanionAdSlotSizeFixed size => + _iosParams._proxy.sizeIMACompanionAdSlot( + view: _view, + width: size.width, + height: size.height, + ), + CompanionAdSlotSizeFluid() => + _iosParams._proxy.newIMACompanionAdSlot(view: _view), + }; + + if (params.onClicked != null) { + adSlot.setDelegate(_delegate); + } + + return adSlot; + } + + // This value is created in a static method because the callback methods for + // any wrapped classes must not reference the encapsulating object. This is to + // prevent a circular reference that prevents garbage collection. + static IMACompanionDelegate _createCompanionDelegate( + WeakReference weakThis, + ) { + return weakThis.target!._iosParams._proxy.newIMACompanionDelegate( + companionSlotWasClicked: (_, __) { + weakThis.target?.params.onClicked!.call(); + }, + ); + } +} diff --git a/packages/interactive_media_ads/lib/src/ios/ios_interactive_media_ads.dart b/packages/interactive_media_ads/lib/src/ios/ios_interactive_media_ads.dart index b79928c57a0..9bd724087b6 100644 --- a/packages/interactive_media_ads/lib/src/ios/ios_interactive_media_ads.dart +++ b/packages/interactive_media_ads/lib/src/ios/ios_interactive_media_ads.dart @@ -7,11 +7,13 @@ import '../platform_interface/platform_ad_display_container.dart'; import '../platform_interface/platform_ads_loader.dart'; import '../platform_interface/platform_ads_manager_delegate.dart'; import '../platform_interface/platform_ads_rendering_settings.dart'; +import '../platform_interface/platform_companion_ad_slot.dart'; import '../platform_interface/platform_content_progress_provider.dart'; import 'ios_ad_display_container.dart'; import 'ios_ads_loader.dart'; import 'ios_ads_manager_delegate.dart'; import 'ios_ads_rendering_settings.dart'; +import 'ios_companion_ad_slot.dart'; import 'ios_content_progress_provider.dart'; /// Implementation of [InteractiveMediaAdsPlatform] for iOS. @@ -53,4 +55,11 @@ final class IOSInteractiveMediaAds extends InteractiveMediaAdsPlatform { ) { return IOSAdsRenderingSettings(params); } + + @override + IOSCompanionAdSlot createPlatformCompanionAdSlot( + PlatformCompanionAdSlotCreationParams params, + ) { + return IOSCompanionAdSlot(params); + } } diff --git a/packages/interactive_media_ads/lib/src/platform_interface/build_widget_creation_params.dart b/packages/interactive_media_ads/lib/src/platform_interface/build_widget_creation_params.dart new file mode 100644 index 00000000000..5c2a84371cc --- /dev/null +++ b/packages/interactive_media_ads/lib/src/platform_interface/build_widget_creation_params.dart @@ -0,0 +1,29 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/widgets.dart'; + +/// Object specifying creation parameters for creating a native view. +@immutable +base class BuildWidgetCreationParams { + /// Used by the platform implementation to create a new + /// [BuildWidgetCreationParams]. + const BuildWidgetCreationParams({ + this.key, + required this.context, + this.layoutDirection = TextDirection.ltr, + }); + + /// The [Key] passed to Widget of that represents the native view. + /// + /// See also: + /// * The discussions at [Key] and [GlobalKey]. + final Key? key; + + /// A handle to the location of a widget in the widget tree. + final BuildContext context; + + /// The layout direction to use for the native view. + final TextDirection layoutDirection; +} diff --git a/packages/interactive_media_ads/lib/src/platform_interface/companion_ad_slot_size.dart b/packages/interactive_media_ads/lib/src/platform_interface/companion_ad_slot_size.dart new file mode 100644 index 00000000000..cbaeb4416ca --- /dev/null +++ b/packages/interactive_media_ads/lib/src/platform_interface/companion_ad_slot_size.dart @@ -0,0 +1,47 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/foundation.dart'; + +/// The size of the slot for a companion ad. +@immutable +sealed class CompanionAdSlotSize { + const CompanionAdSlotSize._(); + + /// A slot for a companion ad with a fixed with and height. + factory CompanionAdSlotSize.fixed({ + required int width, + required int height, + }) { + return CompanionAdSlotSizeFixed._(width: width, height: height); + } + + /// A slot for a companion ad with no fixed size, but rather adapts to fit the + /// creative content they display. + factory CompanionAdSlotSize.fluid() { + return const CompanionAdSlotSizeFluid._(); + } +} + +/// A slot for a companion ad with a fixed with and height. +@immutable +class CompanionAdSlotSizeFixed extends CompanionAdSlotSize { + const CompanionAdSlotSizeFixed._({ + required this.width, + required this.height, + }) : super._(); + + /// The width of the ad slot in pixels. + final int width; + + /// The height of the ad slot in pixels. + final int height; +} + +/// A slot for a companion had with no fixed size, but rather adapts to fit the +/// creative content they display. +@immutable +class CompanionAdSlotSizeFluid extends CompanionAdSlotSize { + const CompanionAdSlotSizeFluid._() : super._(); +} diff --git a/packages/interactive_media_ads/lib/src/platform_interface/interactive_media_ads_platform.dart b/packages/interactive_media_ads/lib/src/platform_interface/interactive_media_ads_platform.dart index 15b898e462c..2eb3710fd8b 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/interactive_media_ads_platform.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/interactive_media_ads_platform.dart @@ -6,6 +6,7 @@ import 'platform_ad_display_container.dart'; import 'platform_ads_loader.dart'; import 'platform_ads_manager_delegate.dart'; import 'platform_ads_rendering_settings.dart'; +import 'platform_companion_ad_slot.dart'; import 'platform_content_progress_provider.dart'; /// Interface for a platform implementation of the Interactive Media Ads SDKs. @@ -41,4 +42,9 @@ abstract base class InteractiveMediaAdsPlatform { PlatformAdsRenderingSettings createPlatformAdsRenderingSettings( PlatformAdsRenderingSettingsCreationParams params, ); + + /// Creates a new [PlatformCompanionAdSlot]. + PlatformCompanionAdSlot createPlatformCompanionAdSlot( + PlatformCompanionAdSlotCreationParams params, + ); } diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_ad_display_container.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_ad_display_container.dart index 2f961f9a7cc..9478afbacb3 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/platform_ad_display_container.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_ad_display_container.dart @@ -5,6 +5,7 @@ import 'package:flutter/cupertino.dart'; import 'interactive_media_ads_platform.dart'; +import 'platform_companion_ad_slot.dart'; /// Object specifying creation parameters for creating a /// [PlatformAdDisplayContainer]. @@ -46,6 +47,7 @@ base class PlatformAdDisplayContainerCreationParams { this.key, required this.onContainerAdded, this.layoutDirection = TextDirection.ltr, + this.companionSlots = const [], }); /// Controls how one widget replaces another widget in the tree. @@ -60,6 +62,9 @@ base class PlatformAdDisplayContainerCreationParams { /// The layout direction to use for the embedded AdDisplayContainer. final TextDirection layoutDirection; + + /// List of companion ad slots. + final Iterable companionSlots; } /// The interface for a platform implementation for a container in which to diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_companion_ad_slot.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_companion_ad_slot.dart new file mode 100644 index 00000000000..e47aeef1700 --- /dev/null +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_companion_ad_slot.dart @@ -0,0 +1,96 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/widgets.dart'; + +import 'build_widget_creation_params.dart'; +import 'companion_ad_slot_size.dart'; +import 'interactive_media_ads_platform.dart'; + +/// Object specifying creation parameters for creating a +/// [PlatformCompanionAdSlot]. +/// +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// This example demonstrates how to extend the +/// [PlatformCompanionAdSlotCreationParams] to provide additional platform +/// specific parameters. +/// +/// When extending [PlatformCompanionAdSlotCreationParams], additional +/// parameters should always accept `null` or have a default value to prevent +/// breaking changes. +/// +/// ```dart +/// final class AndroidPlatformCompanionAdSlotCreationParams +/// extends PlatformCompanionAdSlotCreationParams { +/// const AndroidPlatformCompanionAdSlotCreationParams.fluid({ +/// super.key, +/// this.onFilled, +/// }) : super(); +/// +/// factory AndroidPlatformCompanionAdSlotCreationParams.fromPlatformCompanionAdSlotCreationParamsFluid( +/// PlatformCompanionAdSlotCreationParams params, { +/// void Function()? onFilled, +/// }) { +/// return AndroidPlatformCompanionAdSlotCreationParams.fluid( +/// key: params.key, +/// onFilled: onFilled, +/// ); +/// } +/// +/// final void Function()? onFilled; +/// } +/// ``` +@immutable +base class PlatformCompanionAdSlotCreationParams { + /// Used by the platform implementation to create a new + /// [PlatformCompanionAdSlot]. + const PlatformCompanionAdSlotCreationParams({ + required this.size, + this.onClicked, + }); + + /// The size of the slot. + final CompanionAdSlotSize size; + + /// Called when the slot is clicked on by the user and will successfully + /// navigate away. + final void Function()? onClicked; +} + +/// Ad slot for companion ads. +abstract base class PlatformCompanionAdSlot { + /// Creates a new [PlatformCompanionAdSlot] + factory PlatformCompanionAdSlot( + PlatformCompanionAdSlotCreationParams params, + ) { + assert( + InteractiveMediaAdsPlatform.instance != null, + 'A platform implementation for `interactive_media_ads` has not been set. ' + 'Please ensure that an implementation of `InteractiveMediaAdsPlatform` ' + 'has been set to `InteractiveMediaAdsPlatform.instance` before use. For ' + 'unit testing, `InteractiveMediaAdsPlatform.instance` can be set with ' + 'your own test implementation.', + ); + final PlatformCompanionAdSlot implementation = InteractiveMediaAdsPlatform + .instance! + .createPlatformCompanionAdSlot(params); + return implementation; + } + + /// Used by the platform implementation to create a new + /// [PlatformCompanionAdSlot]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + PlatformCompanionAdSlot.implementation(this.params); + + /// The parameters used to initialize the [PlatformCompanionAdSlot]. + final PlatformCompanionAdSlotCreationParams params; + + /// Builds the Widget that contains the native View. + Widget buildWidget(BuildWidgetCreationParams params); +} diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_interface.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_interface.dart index f2b60b7618f..5f724f48b6d 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/platform_interface.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_interface.dart @@ -5,6 +5,8 @@ export 'ad_error.dart'; export 'ad_event.dart'; export 'ad_ui_element.dart'; +export 'build_widget_creation_params.dart'; +export 'companion_ad_slot_size.dart'; export 'interactive_media_ads_platform.dart'; export 'platform_ad_display_container.dart'; export 'platform_ads_loader.dart'; @@ -12,4 +14,5 @@ export 'platform_ads_manager.dart'; export 'platform_ads_manager_delegate.dart'; export 'platform_ads_rendering_settings.dart'; export 'platform_ads_request.dart'; +export 'platform_companion_ad_slot.dart'; export 'platform_content_progress_provider.dart'; 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 46db8d3e2d2..85c520bfc34 100644 --- a/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart +++ b/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart @@ -230,7 +230,12 @@ enum UiElement { 'com.google.ads.interactivemedia.v3.api.BaseDisplayContainer', ), ) -abstract class BaseDisplayContainer {} +abstract class BaseDisplayContainer { + /// Sets slots for displaying companions. + /// + /// Passing null will reset the container to having no companion slots. + void setCompanionSlots(List? companionSlots); +} /// A container in which to display the ads. /// @@ -240,7 +245,7 @@ abstract class BaseDisplayContainer {} fullClassName: 'com.google.ads.interactivemedia.v3.api.AdDisplayContainer', ), ) -abstract class AdDisplayContainer implements BaseDisplayContainer {} +abstract class AdDisplayContainer extends BaseDisplayContainer {} /// An object which allows publishers to request ads from ad servers or a /// dynamic ad insertion stream. @@ -457,6 +462,9 @@ abstract class ImaSdkFactory { VideoAdPlayer player, ); + /// Creates a CompanionAdSlot for the SDK to fill with companion ads. + CompanionAdSlot createCompanionAdSlot(); + /// Creates an `ImaSdkSettings` object for configuring the IMA SDK. ImaSdkSettings createImaSdkSettings(); @@ -1083,4 +1091,10 @@ abstract class CompanionAdSlot { /// /// Only companions matching the slot size will be displayed in the slot. void setSize(int width, int height); + + /// Sets the size of the slot as fluid. + /// + /// This is a convenience method that sets both parameters of [setSize] to + /// [CompanionAdSlot.FLUID_SIZE](https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/CompanionAdSlot#FLUID_SIZE()). + void setFluidSize(); } diff --git a/packages/interactive_media_ads/pigeons/interactive_media_ads_ios.dart b/packages/interactive_media_ads/pigeons/interactive_media_ads_ios.dart index ef6a30f4ad3..dbc1a96bd89 100644 --- a/packages/interactive_media_ads/pigeons/interactive_media_ads_ios.dart +++ b/packages/interactive_media_ads/pigeons/interactive_media_ads_ios.dart @@ -340,7 +340,9 @@ abstract class IMAAdDisplayContainer extends NSObject { /// /// See https://developer.apple.com/documentation/uikit/uiview. @ProxyApi(swiftOptions: SwiftProxyApiOptions(import: 'UIKit')) -abstract class UIView extends NSObject {} +abstract class UIView extends NSObject { + UIView(); +} /// An object that manages a view hierarchy for your UIKit app. /// @@ -654,6 +656,12 @@ abstract class IMACompanionAdSlot { /// This instance only creates a weak reference to the delegate, so the Dart /// instance should create an explicit reference to receive callbacks. void setDelegate(IMACompanionDelegate? delegate); + + /// Width of the slot, in pixels. + int width(); + + /// Height of the slot, in pixels. + int height(); } /// Delegate to receive events from the companion ad slot. diff --git a/packages/interactive_media_ads/pubspec.yaml b/packages/interactive_media_ads/pubspec.yaml index 69a19874a87..12e319b9ec1 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.3+12 # This must match the version in +version: 0.2.4 # 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` @@ -31,7 +31,7 @@ dev_dependencies: flutter_test: sdk: flutter mockito: ^5.4.4 - pigeon: ^25.3.1 + pigeon: ^25.3.2 topics: - ads diff --git a/packages/interactive_media_ads/test/android/ad_display_container_test.dart b/packages/interactive_media_ads/test/android/ad_display_container_test.dart index 5578c338986..460ad337557 100644 --- a/packages/interactive_media_ads/test/android/ad_display_container_test.dart +++ b/packages/interactive_media_ads/test/android/ad_display_container_test.dart @@ -2,14 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:interactive_media_ads/src/android/android_ad_display_container.dart'; +import 'package:interactive_media_ads/src/android/android_companion_ad_slot.dart'; import 'package:interactive_media_ads/src/android/interactive_media_ads.g.dart' as ima; import 'package:interactive_media_ads/src/android/interactive_media_ads_proxy.dart'; import 'package:interactive_media_ads/src/android/platform_views_service_proxy.dart'; +import 'package:interactive_media_ads/src/platform_interface/platform_interface.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; @@ -19,7 +23,9 @@ import 'ad_display_container_test.mocks.dart'; MockSpec(), MockSpec(), MockSpec(), + MockSpec(), MockSpec(), + MockSpec(), MockSpec(), MockSpec(), MockSpec(), @@ -681,5 +687,103 @@ void main() { verify(mockFrameLayout.removeView(mockVideoView)); verify(mockFrameLayout.addView(mockVideoView2)); }); + + testWidgets('AdDisplayContainer adds CompanionAdSlots', + (WidgetTester tester) async { + final MockAdDisplayContainer mockAdDisplayContainer = + MockAdDisplayContainer(); + final MockCompanionAdSlot mockCompanionAdSlot = MockCompanionAdSlot(); + final InteractiveMediaAdsProxy imaProxy = InteractiveMediaAdsProxy( + newFrameLayout: () => MockFrameLayout(), + newVideoView: ({ + required dynamic onError, + dynamic onPrepared, + dynamic onCompletion, + }) => + MockVideoView(), + createAdDisplayContainerImaSdkFactory: ( + _, + __, + ) async { + return mockAdDisplayContainer; + }, + newVideoAdPlayer: ({ + required dynamic addCallback, + required dynamic loadAd, + required dynamic pauseAd, + required dynamic playAd, + required dynamic release, + required dynamic removeCallback, + required dynamic stopAd, + }) => + MockVideoAdPlayer(), + instanceImaSdkFactory: () { + final MockImaSdkFactory mockFactory = MockImaSdkFactory(); + when(mockFactory.createCompanionAdSlot()).thenAnswer( + (_) async => mockCompanionAdSlot, + ); + return mockFactory; + }, + ); + + final MockPlatformViewsServiceProxy mockPlatformViewsProxy = + MockPlatformViewsServiceProxy(); + final MockSurfaceAndroidViewController mockAndroidViewController = + MockSurfaceAndroidViewController(); + + late final int platformViewId; + when( + mockPlatformViewsProxy.initSurfaceAndroidView( + id: anyNamed('id'), + viewType: anyNamed('viewType'), + layoutDirection: anyNamed('layoutDirection'), + creationParams: anyNamed('creationParams'), + creationParamsCodec: anyNamed('creationParamsCodec'), + onFocus: anyNamed('onFocus'), + ), + ).thenAnswer((Invocation invocation) { + platformViewId = invocation.namedArguments[const Symbol('id')] as int; + return mockAndroidViewController; + }); + + final Completer onContainerAddedCompleter = Completer(); + + final AndroidAdDisplayContainer container = AndroidAdDisplayContainer( + AndroidAdDisplayContainerCreationParams( + onContainerAdded: (_) => onContainerAddedCompleter.complete(), + platformViewsProxy: mockPlatformViewsProxy, + companionSlots: [ + AndroidCompanionAdSlot( + AndroidCompanionAdSlotCreationParams( + size: CompanionAdSlotSize.fixed(width: 300, height: 444), + proxy: imaProxy, + ), + ) + ], + imaProxy: imaProxy, + ), + ); + + await tester.pumpWidget(Builder( + builder: (BuildContext context) => container.build(context), + )); + + final void Function(int) onPlatformCreatedCallback = verify( + mockAndroidViewController + .addOnPlatformViewCreatedListener(captureAny)) + .captured[0] as void Function(int); + + onPlatformCreatedCallback(platformViewId); + + await tester.pumpAndSettle(); + + await onContainerAddedCompleter.future; + + verify( + mockAdDisplayContainer.setCompanionSlots( + [mockCompanionAdSlot], + ), + ); + }); }); } diff --git a/packages/interactive_media_ads/test/android/ad_display_container_test.mocks.dart b/packages/interactive_media_ads/test/android/ad_display_container_test.mocks.dart index adedc00cd18..94a84b02604 100644 --- a/packages/interactive_media_ads/test/android/ad_display_container_test.mocks.dart +++ b/packages/interactive_media_ads/test/android/ad_display_container_test.mocks.dart @@ -1,9 +1,9 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in interactive_media_ads/test/android/ad_display_container_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i6; +import 'dart:async' as _i5; import 'dart:ui' as _i3; import 'package:flutter/services.dart' as _i4; @@ -12,7 +12,7 @@ import 'package:interactive_media_ads/src/android/interactive_media_ads.g.dart' import 'package:interactive_media_ads/src/android/platform_views_service_proxy.dart' as _i7; import 'package:mockito/mockito.dart' as _i1; -import 'package:mockito/src/dummies.dart' as _i5; +import 'package:mockito/src/dummies.dart' as _i6; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -22,6 +22,7 @@ import 'package:mockito/src/dummies.dart' as _i5; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types @@ -69,8 +70,8 @@ class _FakeAdPodInfo_3 extends _i1.SmartFake implements _i2.AdPodInfo { ); } -class _FakeFrameLayout_4 extends _i1.SmartFake implements _i2.FrameLayout { - _FakeFrameLayout_4( +class _FakeViewGroup_4 extends _i1.SmartFake implements _i2.ViewGroup { + _FakeViewGroup_4( Object parent, Invocation parentInvocation, ) : super( @@ -79,8 +80,9 @@ class _FakeFrameLayout_4 extends _i1.SmartFake implements _i2.FrameLayout { ); } -class _FakeMediaPlayer_5 extends _i1.SmartFake implements _i2.MediaPlayer { - _FakeMediaPlayer_5( +class _FakeCompanionAdSlot_5 extends _i1.SmartFake + implements _i2.CompanionAdSlot { + _FakeCompanionAdSlot_5( Object parent, Invocation parentInvocation, ) : super( @@ -89,8 +91,8 @@ class _FakeMediaPlayer_5 extends _i1.SmartFake implements _i2.MediaPlayer { ); } -class _FakeVideoAdPlayer_6 extends _i1.SmartFake implements _i2.VideoAdPlayer { - _FakeVideoAdPlayer_6( +class _FakeFrameLayout_6 extends _i1.SmartFake implements _i2.FrameLayout { + _FakeFrameLayout_6( Object parent, Invocation parentInvocation, ) : super( @@ -99,9 +101,81 @@ class _FakeVideoAdPlayer_6 extends _i1.SmartFake implements _i2.VideoAdPlayer { ); } -class _FakeVideoAdPlayerCallback_7 extends _i1.SmartFake +class _FakeImaSdkSettings_7 extends _i1.SmartFake + implements _i2.ImaSdkSettings { + _FakeImaSdkSettings_7( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAdsLoader_8 extends _i1.SmartFake implements _i2.AdsLoader { + _FakeAdsLoader_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAdsRequest_9 extends _i1.SmartFake implements _i2.AdsRequest { + _FakeAdsRequest_9( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAdsRenderingSettings_10 extends _i1.SmartFake + implements _i2.AdsRenderingSettings { + _FakeAdsRenderingSettings_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeImaSdkFactory_11 extends _i1.SmartFake implements _i2.ImaSdkFactory { + _FakeImaSdkFactory_11( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeMediaPlayer_12 extends _i1.SmartFake implements _i2.MediaPlayer { + _FakeMediaPlayer_12( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeVideoAdPlayer_13 extends _i1.SmartFake implements _i2.VideoAdPlayer { + _FakeVideoAdPlayer_13( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeVideoAdPlayerCallback_14 extends _i1.SmartFake implements _i2.VideoAdPlayerCallback { - _FakeVideoAdPlayerCallback_7( + _FakeVideoAdPlayerCallback_14( Object parent, Invocation parentInvocation, ) : super( @@ -110,9 +184,9 @@ class _FakeVideoAdPlayerCallback_7 extends _i1.SmartFake ); } -class _FakeVideoProgressUpdate_8 extends _i1.SmartFake +class _FakeVideoProgressUpdate_15 extends _i1.SmartFake implements _i2.VideoProgressUpdate { - _FakeVideoProgressUpdate_8( + _FakeVideoProgressUpdate_15( Object parent, Invocation parentInvocation, ) : super( @@ -121,8 +195,8 @@ class _FakeVideoProgressUpdate_8 extends _i1.SmartFake ); } -class _FakeVideoView_9 extends _i1.SmartFake implements _i2.VideoView { - _FakeVideoView_9( +class _FakeVideoView_16 extends _i1.SmartFake implements _i2.VideoView { + _FakeVideoView_16( Object parent, Invocation parentInvocation, ) : super( @@ -131,8 +205,8 @@ class _FakeVideoView_9 extends _i1.SmartFake implements _i2.VideoView { ); } -class _FakeOffset_10 extends _i1.SmartFake implements _i3.Offset { - _FakeOffset_10( +class _FakeOffset_17 extends _i1.SmartFake implements _i3.Offset { + _FakeOffset_17( Object parent, Invocation parentInvocation, ) : super( @@ -141,8 +215,8 @@ class _FakeOffset_10 extends _i1.SmartFake implements _i3.Offset { ); } -class _FakeSize_11 extends _i1.SmartFake implements _i3.Size { - _FakeSize_11( +class _FakeSize_18 extends _i1.SmartFake implements _i3.Size { + _FakeSize_18( Object parent, Invocation parentInvocation, ) : super( @@ -151,9 +225,9 @@ class _FakeSize_11 extends _i1.SmartFake implements _i3.Size { ); } -class _FakeExpensiveAndroidViewController_12 extends _i1.SmartFake +class _FakeExpensiveAndroidViewController_19 extends _i1.SmartFake implements _i4.ExpensiveAndroidViewController { - _FakeExpensiveAndroidViewController_12( + _FakeExpensiveAndroidViewController_19( Object parent, Invocation parentInvocation, ) : super( @@ -162,9 +236,9 @@ class _FakeExpensiveAndroidViewController_12 extends _i1.SmartFake ); } -class _FakeSurfaceAndroidViewController_13 extends _i1.SmartFake +class _FakeSurfaceAndroidViewController_20 extends _i1.SmartFake implements _i4.SurfaceAndroidViewController { - _FakeSurfaceAndroidViewController_13( + _FakeSurfaceAndroidViewController_20( Object parent, Invocation parentInvocation, ) : super( @@ -212,6 +286,18 @@ class MockAdDisplayContainer extends _i1.Mock ), ), ) as _i2.AdDisplayContainer); + + @override + _i5.Future setCompanionSlots( + List<_i2.CompanionAdSlot>? companionSlots) => + (super.noSuchMethod( + Invocation.method( + #setCompanionSlots, + [companionSlots], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); } /// A class which mocks [AdMediaInfo]. @@ -221,11 +307,11 @@ class MockAdMediaInfo extends _i1.Mock implements _i2.AdMediaInfo { @override String get url => (super.noSuchMethod( Invocation.getter(#url), - returnValue: _i5.dummyValue( + returnValue: _i6.dummyValue( this, Invocation.getter(#url), ), - returnValueForMissingStub: _i5.dummyValue( + returnValueForMissingStub: _i6.dummyValue( this, Invocation.getter(#url), ), @@ -349,6 +435,161 @@ class MockAdPodInfo extends _i1.Mock implements _i2.AdPodInfo { ) as _i2.AdPodInfo); } +/// A class which mocks [CompanionAdSlot]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockCompanionAdSlot extends _i1.Mock implements _i2.CompanionAdSlot { + @override + _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( + Invocation.getter(#pigeon_instanceManager), + returnValue: _FakePigeonInstanceManager_0( + this, + Invocation.getter(#pigeon_instanceManager), + ), + returnValueForMissingStub: _FakePigeonInstanceManager_0( + this, + Invocation.getter(#pigeon_instanceManager), + ), + ) as _i2.PigeonInstanceManager); + + @override + _i5.Future addClickListener( + _i2.CompanionAdSlotClickListener? clickListener) => + (super.noSuchMethod( + Invocation.method( + #addClickListener, + [clickListener], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future<_i2.ViewGroup> getContainer() => (super.noSuchMethod( + Invocation.method( + #getContainer, + [], + ), + returnValue: _i5.Future<_i2.ViewGroup>.value(_FakeViewGroup_4( + this, + Invocation.method( + #getContainer, + [], + ), + )), + returnValueForMissingStub: + _i5.Future<_i2.ViewGroup>.value(_FakeViewGroup_4( + this, + Invocation.method( + #getContainer, + [], + ), + )), + ) as _i5.Future<_i2.ViewGroup>); + + @override + _i5.Future getHeight() => (super.noSuchMethod( + Invocation.method( + #getHeight, + [], + ), + returnValue: _i5.Future.value(0), + returnValueForMissingStub: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future getWidth() => (super.noSuchMethod( + Invocation.method( + #getWidth, + [], + ), + returnValue: _i5.Future.value(0), + returnValueForMissingStub: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future isFilled() => (super.noSuchMethod( + Invocation.method( + #isFilled, + [], + ), + returnValue: _i5.Future.value(false), + returnValueForMissingStub: _i5.Future.value(false), + ) as _i5.Future); + + @override + _i5.Future removeClickListener( + _i2.CompanionAdSlotClickListener? clickListener) => + (super.noSuchMethod( + Invocation.method( + #removeClickListener, + [clickListener], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setContainer(_i2.ViewGroup? container) => + (super.noSuchMethod( + Invocation.method( + #setContainer, + [container], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setSize( + int? width, + int? height, + ) => + (super.noSuchMethod( + Invocation.method( + #setSize, + [ + width, + height, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setFluidSize() => (super.noSuchMethod( + Invocation.method( + #setFluidSize, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i2.CompanionAdSlot pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeCompanionAdSlot_5( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeCompanionAdSlot_5( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.CompanionAdSlot); +} + /// A class which mocks [FrameLayout]. /// /// See the documentation for Mockito's code generation for more information. @@ -372,14 +613,14 @@ class MockFrameLayout extends _i1.Mock implements _i2.FrameLayout { #pigeon_copy, [], ), - returnValue: _FakeFrameLayout_4( + returnValue: _FakeFrameLayout_6( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeFrameLayout_4( + returnValueForMissingStub: _FakeFrameLayout_6( this, Invocation.method( #pigeon_copy, @@ -389,24 +630,196 @@ class MockFrameLayout extends _i1.Mock implements _i2.FrameLayout { ) as _i2.FrameLayout); @override - _i6.Future addView(_i2.View? view) => (super.noSuchMethod( + _i5.Future addView(_i2.View? view) => (super.noSuchMethod( Invocation.method( #addView, [view], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future removeView(_i2.View? view) => (super.noSuchMethod( + _i5.Future removeView(_i2.View? view) => (super.noSuchMethod( Invocation.method( #removeView, [view], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} + +/// A class which mocks [ImaSdkFactory]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { + @override + _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( + Invocation.getter(#pigeon_instanceManager), + returnValue: _FakePigeonInstanceManager_0( + this, + Invocation.getter(#pigeon_instanceManager), + ), + returnValueForMissingStub: _FakePigeonInstanceManager_0( + this, + Invocation.getter(#pigeon_instanceManager), + ), + ) as _i2.PigeonInstanceManager); + + @override + _i5.Future<_i2.CompanionAdSlot> createCompanionAdSlot() => + (super.noSuchMethod( + Invocation.method( + #createCompanionAdSlot, + [], + ), + returnValue: + _i5.Future<_i2.CompanionAdSlot>.value(_FakeCompanionAdSlot_5( + this, + Invocation.method( + #createCompanionAdSlot, + [], + ), + )), + returnValueForMissingStub: + _i5.Future<_i2.CompanionAdSlot>.value(_FakeCompanionAdSlot_5( + this, + Invocation.method( + #createCompanionAdSlot, + [], + ), + )), + ) as _i5.Future<_i2.CompanionAdSlot>); + + @override + _i5.Future<_i2.ImaSdkSettings> createImaSdkSettings() => (super.noSuchMethod( + Invocation.method( + #createImaSdkSettings, + [], + ), + returnValue: _i5.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_7( + this, + Invocation.method( + #createImaSdkSettings, + [], + ), + )), + returnValueForMissingStub: + _i5.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_7( + this, + Invocation.method( + #createImaSdkSettings, + [], + ), + )), + ) as _i5.Future<_i2.ImaSdkSettings>); + + @override + _i5.Future<_i2.AdsLoader> createAdsLoader( + _i2.ImaSdkSettings? settings, + _i2.AdDisplayContainer? container, + ) => + (super.noSuchMethod( + Invocation.method( + #createAdsLoader, + [ + settings, + container, + ], + ), + returnValue: _i5.Future<_i2.AdsLoader>.value(_FakeAdsLoader_8( + this, + Invocation.method( + #createAdsLoader, + [ + settings, + container, + ], + ), + )), + returnValueForMissingStub: + _i5.Future<_i2.AdsLoader>.value(_FakeAdsLoader_8( + this, + Invocation.method( + #createAdsLoader, + [ + settings, + container, + ], + ), + )), + ) as _i5.Future<_i2.AdsLoader>); + + @override + _i5.Future<_i2.AdsRequest> createAdsRequest() => (super.noSuchMethod( + Invocation.method( + #createAdsRequest, + [], + ), + returnValue: _i5.Future<_i2.AdsRequest>.value(_FakeAdsRequest_9( + this, + Invocation.method( + #createAdsRequest, + [], + ), + )), + returnValueForMissingStub: + _i5.Future<_i2.AdsRequest>.value(_FakeAdsRequest_9( + this, + Invocation.method( + #createAdsRequest, + [], + ), + )), + ) as _i5.Future<_i2.AdsRequest>); + + @override + _i5.Future<_i2.AdsRenderingSettings> createAdsRenderingSettings() => + (super.noSuchMethod( + Invocation.method( + #createAdsRenderingSettings, + [], + ), + returnValue: _i5.Future<_i2.AdsRenderingSettings>.value( + _FakeAdsRenderingSettings_10( + this, + Invocation.method( + #createAdsRenderingSettings, + [], + ), + )), + returnValueForMissingStub: _i5.Future<_i2.AdsRenderingSettings>.value( + _FakeAdsRenderingSettings_10( + this, + Invocation.method( + #createAdsRenderingSettings, + [], + ), + )), + ) as _i5.Future<_i2.AdsRenderingSettings>); + + @override + _i2.ImaSdkFactory pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeImaSdkFactory_11( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeImaSdkFactory_11( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.ImaSdkFactory); } /// A class which mocks [MediaPlayer]. @@ -427,54 +840,54 @@ class MockMediaPlayer extends _i1.Mock implements _i2.MediaPlayer { ) as _i2.PigeonInstanceManager); @override - _i6.Future getDuration() => (super.noSuchMethod( + _i5.Future getDuration() => (super.noSuchMethod( Invocation.method( #getDuration, [], ), - returnValue: _i6.Future.value(0), - returnValueForMissingStub: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i5.Future.value(0), + returnValueForMissingStub: _i5.Future.value(0), + ) as _i5.Future); @override - _i6.Future seekTo(int? mSec) => (super.noSuchMethod( + _i5.Future seekTo(int? mSec) => (super.noSuchMethod( Invocation.method( #seekTo, [mSec], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future start() => (super.noSuchMethod( + _i5.Future start() => (super.noSuchMethod( Invocation.method( #start, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future pause() => (super.noSuchMethod( + _i5.Future pause() => (super.noSuchMethod( Invocation.method( #pause, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future stop() => (super.noSuchMethod( + _i5.Future stop() => (super.noSuchMethod( Invocation.method( #stop, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override _i2.MediaPlayer pigeon_copy() => (super.noSuchMethod( @@ -482,14 +895,14 @@ class MockMediaPlayer extends _i1.Mock implements _i2.MediaPlayer { #pigeon_copy, [], ), - returnValue: _FakeMediaPlayer_5( + returnValue: _FakeMediaPlayer_12( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeMediaPlayer_5( + returnValueForMissingStub: _FakeMediaPlayer_12( this, Invocation.method( #pigeon_copy, @@ -642,25 +1055,25 @@ class MockVideoAdPlayer extends _i1.Mock implements _i2.VideoAdPlayer { ) as _i2.PigeonInstanceManager); @override - _i6.Future setVolume(int? value) => (super.noSuchMethod( + _i5.Future setVolume(int? value) => (super.noSuchMethod( Invocation.method( #setVolume, [value], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future setAdProgress(_i2.VideoProgressUpdate? progress) => + _i5.Future setAdProgress(_i2.VideoProgressUpdate? progress) => (super.noSuchMethod( Invocation.method( #setAdProgress, [progress], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override _i2.VideoAdPlayer pigeon_copy() => (super.noSuchMethod( @@ -668,14 +1081,14 @@ class MockVideoAdPlayer extends _i1.Mock implements _i2.VideoAdPlayer { #pigeon_copy, [], ), - returnValue: _FakeVideoAdPlayer_6( + returnValue: _FakeVideoAdPlayer_13( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeVideoAdPlayer_6( + returnValueForMissingStub: _FakeVideoAdPlayer_13( this, Invocation.method( #pigeon_copy, @@ -704,7 +1117,7 @@ class MockVideoAdPlayerCallback extends _i1.Mock ) as _i2.PigeonInstanceManager); @override - _i6.Future onAdProgress( + _i5.Future onAdProgress( _i2.AdMediaInfo? adMediaInfo, _i2.VideoProgressUpdate? videoProgressUpdate, ) => @@ -716,95 +1129,95 @@ class MockVideoAdPlayerCallback extends _i1.Mock videoProgressUpdate, ], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onBuffering(_i2.AdMediaInfo? adMediaInfo) => + _i5.Future onBuffering(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onBuffering, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onContentComplete() => (super.noSuchMethod( + _i5.Future onContentComplete() => (super.noSuchMethod( Invocation.method( #onContentComplete, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onEnded(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( + _i5.Future onEnded(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onEnded, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onError(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( + _i5.Future onError(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onError, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onLoaded(_i2.AdMediaInfo? adMediaInfo) => + _i5.Future onLoaded(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onLoaded, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onPause(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( + _i5.Future onPause(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onPause, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onPlay(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( + _i5.Future onPlay(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onPlay, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onResume(_i2.AdMediaInfo? adMediaInfo) => + _i5.Future onResume(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onResume, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onVolumeChanged( + _i5.Future onVolumeChanged( _i2.AdMediaInfo? adMediaInfo, int? percentage, ) => @@ -816,9 +1229,9 @@ class MockVideoAdPlayerCallback extends _i1.Mock percentage, ], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override _i2.VideoAdPlayerCallback pigeon_copy() => (super.noSuchMethod( @@ -826,14 +1239,14 @@ class MockVideoAdPlayerCallback extends _i1.Mock #pigeon_copy, [], ), - returnValue: _FakeVideoAdPlayerCallback_7( + returnValue: _FakeVideoAdPlayerCallback_14( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeVideoAdPlayerCallback_7( + returnValueForMissingStub: _FakeVideoAdPlayerCallback_14( this, Invocation.method( #pigeon_copy, @@ -867,14 +1280,14 @@ class MockVideoProgressUpdate extends _i1.Mock #pigeon_copy, [], ), - returnValue: _FakeVideoProgressUpdate_8( + returnValue: _FakeVideoProgressUpdate_15( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeVideoProgressUpdate_8( + returnValueForMissingStub: _FakeVideoProgressUpdate_15( this, Invocation.method( #pigeon_copy, @@ -929,24 +1342,24 @@ class MockVideoView extends _i1.Mock implements _i2.VideoView { ) as _i2.PigeonInstanceManager); @override - _i6.Future setVideoUri(String? uri) => (super.noSuchMethod( + _i5.Future setVideoUri(String? uri) => (super.noSuchMethod( Invocation.method( #setVideoUri, [uri], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future getCurrentPosition() => (super.noSuchMethod( + _i5.Future getCurrentPosition() => (super.noSuchMethod( Invocation.method( #getCurrentPosition, [], ), - returnValue: _i6.Future.value(0), - returnValueForMissingStub: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i5.Future.value(0), + returnValueForMissingStub: _i5.Future.value(0), + ) as _i5.Future); @override _i2.VideoView pigeon_copy() => (super.noSuchMethod( @@ -954,14 +1367,14 @@ class MockVideoView extends _i1.Mock implements _i2.VideoView { #pigeon_copy, [], ), - returnValue: _FakeVideoView_9( + returnValue: _FakeVideoView_16( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeVideoView_9( + returnValueForMissingStub: _FakeVideoView_16( this, Invocation.method( #pigeon_copy, @@ -1000,25 +1413,16 @@ class MockSurfaceAndroidViewController extends _i1.Mock @override _i4.PointTransformer get pointTransformer => (super.noSuchMethod( Invocation.getter(#pointTransformer), - returnValue: (_i3.Offset position) => _FakeOffset_10( + returnValue: (_i3.Offset position) => _FakeOffset_17( this, Invocation.getter(#pointTransformer), ), - returnValueForMissingStub: (_i3.Offset position) => _FakeOffset_10( + returnValueForMissingStub: (_i3.Offset position) => _FakeOffset_17( this, Invocation.getter(#pointTransformer), ), ) as _i4.PointTransformer); - @override - set pointTransformer(_i4.PointTransformer? transformer) => super.noSuchMethod( - Invocation.setter( - #pointTransformer, - transformer, - ), - returnValueForMissingStub: null, - ); - @override bool get isCreated => (super.noSuchMethod( Invocation.getter(#isCreated), @@ -1035,17 +1439,26 @@ class MockSurfaceAndroidViewController extends _i1.Mock ) as List<_i4.PlatformViewCreatedCallback>); @override - _i6.Future setOffset(_i3.Offset? off) => (super.noSuchMethod( + set pointTransformer(_i4.PointTransformer? transformer) => super.noSuchMethod( + Invocation.setter( + #pointTransformer, + transformer, + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future setOffset(_i3.Offset? off) => (super.noSuchMethod( Invocation.method( #setOffset, [off], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future create({ + _i5.Future create({ _i3.Size? size, _i3.Offset? position, }) => @@ -1058,42 +1471,42 @@ class MockSurfaceAndroidViewController extends _i1.Mock #position: position, }, ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future<_i3.Size> setSize(_i3.Size? size) => (super.noSuchMethod( + _i5.Future<_i3.Size> setSize(_i3.Size? size) => (super.noSuchMethod( Invocation.method( #setSize, [size], ), - returnValue: _i6.Future<_i3.Size>.value(_FakeSize_11( + returnValue: _i5.Future<_i3.Size>.value(_FakeSize_18( this, Invocation.method( #setSize, [size], ), )), - returnValueForMissingStub: _i6.Future<_i3.Size>.value(_FakeSize_11( + returnValueForMissingStub: _i5.Future<_i3.Size>.value(_FakeSize_18( this, Invocation.method( #setSize, [size], ), )), - ) as _i6.Future<_i3.Size>); + ) as _i5.Future<_i3.Size>); @override - _i6.Future sendMotionEvent(_i4.AndroidMotionEvent? event) => + _i5.Future sendMotionEvent(_i4.AndroidMotionEvent? event) => (super.noSuchMethod( Invocation.method( #sendMotionEvent, [event], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override void addOnPlatformViewCreatedListener( @@ -1118,46 +1531,46 @@ class MockSurfaceAndroidViewController extends _i1.Mock ); @override - _i6.Future setLayoutDirection(_i3.TextDirection? layoutDirection) => + _i5.Future setLayoutDirection(_i3.TextDirection? layoutDirection) => (super.noSuchMethod( Invocation.method( #setLayoutDirection, [layoutDirection], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future dispatchPointerEvent(_i4.PointerEvent? event) => + _i5.Future dispatchPointerEvent(_i4.PointerEvent? event) => (super.noSuchMethod( Invocation.method( #dispatchPointerEvent, [event], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future clearFocus() => (super.noSuchMethod( + _i5.Future clearFocus() => (super.noSuchMethod( Invocation.method( #clearFocus, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future dispose() => (super.noSuchMethod( + _i5.Future dispose() => (super.noSuchMethod( Invocation.method( #dispose, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); } /// A class which mocks [PlatformViewsServiceProxy]. @@ -1188,7 +1601,7 @@ class MockPlatformViewsServiceProxy extends _i1.Mock #onFocus: onFocus, }, ), - returnValue: _FakeExpensiveAndroidViewController_12( + returnValue: _FakeExpensiveAndroidViewController_19( this, Invocation.method( #initExpensiveAndroidView, @@ -1203,7 +1616,7 @@ class MockPlatformViewsServiceProxy extends _i1.Mock }, ), ), - returnValueForMissingStub: _FakeExpensiveAndroidViewController_12( + returnValueForMissingStub: _FakeExpensiveAndroidViewController_19( this, Invocation.method( #initExpensiveAndroidView, @@ -1242,7 +1655,7 @@ class MockPlatformViewsServiceProxy extends _i1.Mock #onFocus: onFocus, }, ), - returnValue: _FakeSurfaceAndroidViewController_13( + returnValue: _FakeSurfaceAndroidViewController_20( this, Invocation.method( #initSurfaceAndroidView, @@ -1257,7 +1670,7 @@ class MockPlatformViewsServiceProxy extends _i1.Mock }, ), ), - returnValueForMissingStub: _FakeSurfaceAndroidViewController_13( + returnValueForMissingStub: _FakeSurfaceAndroidViewController_20( this, Invocation.method( #initSurfaceAndroidView, 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 d1d3d9f26a8..620ffe04c7d 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 @@ -1,9 +1,9 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in interactive_media_ads/test/android/ads_loader_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i6; +import 'dart:async' as _i5; import 'dart:ui' as _i3; import 'package:flutter/services.dart' as _i4; @@ -12,7 +12,7 @@ import 'package:interactive_media_ads/src/android/interactive_media_ads.g.dart' import 'package:interactive_media_ads/src/android/platform_views_service_proxy.dart' as _i7; import 'package:mockito/mockito.dart' as _i1; -import 'package:mockito/src/dummies.dart' as _i5; +import 'package:mockito/src/dummies.dart' as _i6; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -22,6 +22,7 @@ import 'package:mockito/src/dummies.dart' as _i5; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types @@ -142,9 +143,20 @@ class _FakeFrameLayout_10 extends _i1.SmartFake implements _i2.FrameLayout { ); } -class _FakeImaSdkSettings_11 extends _i1.SmartFake +class _FakeCompanionAdSlot_11 extends _i1.SmartFake + implements _i2.CompanionAdSlot { + _FakeCompanionAdSlot_11( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeImaSdkSettings_12 extends _i1.SmartFake implements _i2.ImaSdkSettings { - _FakeImaSdkSettings_11( + _FakeImaSdkSettings_12( Object parent, Invocation parentInvocation, ) : super( @@ -153,9 +165,9 @@ class _FakeImaSdkSettings_11 extends _i1.SmartFake ); } -class _FakeAdsRenderingSettings_12 extends _i1.SmartFake +class _FakeAdsRenderingSettings_13 extends _i1.SmartFake implements _i2.AdsRenderingSettings { - _FakeAdsRenderingSettings_12( + _FakeAdsRenderingSettings_13( Object parent, Invocation parentInvocation, ) : super( @@ -164,8 +176,8 @@ class _FakeAdsRenderingSettings_12 extends _i1.SmartFake ); } -class _FakeImaSdkFactory_13 extends _i1.SmartFake implements _i2.ImaSdkFactory { - _FakeImaSdkFactory_13( +class _FakeImaSdkFactory_14 extends _i1.SmartFake implements _i2.ImaSdkFactory { + _FakeImaSdkFactory_14( Object parent, Invocation parentInvocation, ) : super( @@ -174,8 +186,8 @@ class _FakeImaSdkFactory_13 extends _i1.SmartFake implements _i2.ImaSdkFactory { ); } -class _FakeVideoAdPlayer_14 extends _i1.SmartFake implements _i2.VideoAdPlayer { - _FakeVideoAdPlayer_14( +class _FakeVideoAdPlayer_15 extends _i1.SmartFake implements _i2.VideoAdPlayer { + _FakeVideoAdPlayer_15( Object parent, Invocation parentInvocation, ) : super( @@ -184,9 +196,9 @@ class _FakeVideoAdPlayer_14 extends _i1.SmartFake implements _i2.VideoAdPlayer { ); } -class _FakeVideoAdPlayerCallback_15 extends _i1.SmartFake +class _FakeVideoAdPlayerCallback_16 extends _i1.SmartFake implements _i2.VideoAdPlayerCallback { - _FakeVideoAdPlayerCallback_15( + _FakeVideoAdPlayerCallback_16( Object parent, Invocation parentInvocation, ) : super( @@ -195,8 +207,8 @@ class _FakeVideoAdPlayerCallback_15 extends _i1.SmartFake ); } -class _FakeVideoView_16 extends _i1.SmartFake implements _i2.VideoView { - _FakeVideoView_16( +class _FakeVideoView_17 extends _i1.SmartFake implements _i2.VideoView { + _FakeVideoView_17( Object parent, Invocation parentInvocation, ) : super( @@ -205,8 +217,8 @@ class _FakeVideoView_16 extends _i1.SmartFake implements _i2.VideoView { ); } -class _FakeOffset_17 extends _i1.SmartFake implements _i3.Offset { - _FakeOffset_17( +class _FakeOffset_18 extends _i1.SmartFake implements _i3.Offset { + _FakeOffset_18( Object parent, Invocation parentInvocation, ) : super( @@ -215,8 +227,8 @@ class _FakeOffset_17 extends _i1.SmartFake implements _i3.Offset { ); } -class _FakeSize_18 extends _i1.SmartFake implements _i3.Size { - _FakeSize_18( +class _FakeSize_19 extends _i1.SmartFake implements _i3.Size { + _FakeSize_19( Object parent, Invocation parentInvocation, ) : super( @@ -225,9 +237,9 @@ class _FakeSize_18 extends _i1.SmartFake implements _i3.Size { ); } -class _FakeExpensiveAndroidViewController_19 extends _i1.SmartFake +class _FakeExpensiveAndroidViewController_20 extends _i1.SmartFake implements _i4.ExpensiveAndroidViewController { - _FakeExpensiveAndroidViewController_19( + _FakeExpensiveAndroidViewController_20( Object parent, Invocation parentInvocation, ) : super( @@ -236,9 +248,9 @@ class _FakeExpensiveAndroidViewController_19 extends _i1.SmartFake ); } -class _FakeSurfaceAndroidViewController_20 extends _i1.SmartFake +class _FakeSurfaceAndroidViewController_21 extends _i1.SmartFake implements _i4.SurfaceAndroidViewController { - _FakeSurfaceAndroidViewController_20( + _FakeSurfaceAndroidViewController_21( Object parent, Invocation parentInvocation, ) : super( @@ -286,6 +298,18 @@ class MockAdDisplayContainer extends _i1.Mock ), ), ) as _i2.AdDisplayContainer); + + @override + _i5.Future setCompanionSlots( + List<_i2.CompanionAdSlot>? companionSlots) => + (super.noSuchMethod( + Invocation.method( + #setCompanionSlots, + [companionSlots], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); } /// A class which mocks [AdError]. @@ -316,11 +340,11 @@ class MockAdError extends _i1.Mock implements _i2.AdError { @override String get message => (super.noSuchMethod( Invocation.getter(#message), - returnValue: _i5.dummyValue( + returnValue: _i6.dummyValue( this, Invocation.getter(#message), ), - returnValueForMissingStub: _i5.dummyValue( + returnValueForMissingStub: _i6.dummyValue( this, Invocation.getter(#message), ), @@ -551,64 +575,64 @@ class MockAdsManager extends _i1.Mock implements _i2.AdsManager { ) as _i2.PigeonInstanceManager); @override - _i6.Future discardAdBreak() => (super.noSuchMethod( + _i5.Future discardAdBreak() => (super.noSuchMethod( Invocation.method( #discardAdBreak, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future pause() => (super.noSuchMethod( + _i5.Future pause() => (super.noSuchMethod( Invocation.method( #pause, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future start() => (super.noSuchMethod( + _i5.Future start() => (super.noSuchMethod( Invocation.method( #start, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future> getAdCuePoints() => (super.noSuchMethod( + _i5.Future> getAdCuePoints() => (super.noSuchMethod( Invocation.method( #getAdCuePoints, [], ), - returnValue: _i6.Future>.value([]), - returnValueForMissingStub: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i5.Future>.value([]), + returnValueForMissingStub: _i5.Future>.value([]), + ) as _i5.Future>); @override - _i6.Future resume() => (super.noSuchMethod( + _i5.Future resume() => (super.noSuchMethod( Invocation.method( #resume, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future skip() => (super.noSuchMethod( + _i5.Future skip() => (super.noSuchMethod( Invocation.method( #skip, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override _i2.AdsManager pigeon_copy() => (super.noSuchMethod( @@ -633,100 +657,100 @@ class MockAdsManager extends _i1.Mock implements _i2.AdsManager { ) as _i2.AdsManager); @override - _i6.Future addAdErrorListener(_i2.AdErrorListener? errorListener) => + _i5.Future addAdErrorListener(_i2.AdErrorListener? errorListener) => (super.noSuchMethod( Invocation.method( #addAdErrorListener, [errorListener], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future addAdEventListener(_i2.AdEventListener? adEventListener) => + _i5.Future addAdEventListener(_i2.AdEventListener? adEventListener) => (super.noSuchMethod( Invocation.method( #addAdEventListener, [adEventListener], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future destroy() => (super.noSuchMethod( + _i5.Future destroy() => (super.noSuchMethod( Invocation.method( #destroy, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future init(_i2.AdsRenderingSettings? settings) => + _i5.Future init(_i2.AdsRenderingSettings? settings) => (super.noSuchMethod( Invocation.method( #init, [settings], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future focus() => (super.noSuchMethod( + _i5.Future focus() => (super.noSuchMethod( Invocation.method( #focus, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future<_i2.AdProgressInfo?> getAdProgressInfo() => (super.noSuchMethod( + _i5.Future<_i2.AdProgressInfo?> getAdProgressInfo() => (super.noSuchMethod( Invocation.method( #getAdProgressInfo, [], ), - returnValue: _i6.Future<_i2.AdProgressInfo?>.value(), - returnValueForMissingStub: _i6.Future<_i2.AdProgressInfo?>.value(), - ) as _i6.Future<_i2.AdProgressInfo?>); + returnValue: _i5.Future<_i2.AdProgressInfo?>.value(), + returnValueForMissingStub: _i5.Future<_i2.AdProgressInfo?>.value(), + ) as _i5.Future<_i2.AdProgressInfo?>); @override - _i6.Future<_i2.Ad?> getCurrentAd() => (super.noSuchMethod( + _i5.Future<_i2.Ad?> getCurrentAd() => (super.noSuchMethod( Invocation.method( #getCurrentAd, [], ), - returnValue: _i6.Future<_i2.Ad?>.value(), - returnValueForMissingStub: _i6.Future<_i2.Ad?>.value(), - ) as _i6.Future<_i2.Ad?>); + returnValue: _i5.Future<_i2.Ad?>.value(), + returnValueForMissingStub: _i5.Future<_i2.Ad?>.value(), + ) as _i5.Future<_i2.Ad?>); @override - _i6.Future removeAdErrorListener(_i2.AdErrorListener? errorListener) => + _i5.Future removeAdErrorListener(_i2.AdErrorListener? errorListener) => (super.noSuchMethod( Invocation.method( #removeAdErrorListener, [errorListener], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future removeAdEventListener( + _i5.Future removeAdEventListener( _i2.AdEventListener? adEventListener) => (super.noSuchMethod( Invocation.method( #removeAdEventListener, [adEventListener], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); } /// A class which mocks [AdsManagerLoadedEvent]. @@ -801,36 +825,36 @@ class MockAdsLoader extends _i1.Mock implements _i2.AdsLoader { ) as _i2.PigeonInstanceManager); @override - _i6.Future addAdErrorListener(_i2.AdErrorListener? listener) => + _i5.Future addAdErrorListener(_i2.AdErrorListener? listener) => (super.noSuchMethod( Invocation.method( #addAdErrorListener, [listener], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future addAdsLoadedListener(_i2.AdsLoadedListener? listener) => + _i5.Future addAdsLoadedListener(_i2.AdsLoadedListener? listener) => (super.noSuchMethod( Invocation.method( #addAdsLoadedListener, [listener], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future requestAds(_i2.AdsRequest? request) => (super.noSuchMethod( + _i5.Future requestAds(_i2.AdsRequest? request) => (super.noSuchMethod( Invocation.method( #requestAds, [request], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override _i2.AdsLoader pigeon_copy() => (super.noSuchMethod( @@ -873,26 +897,26 @@ class MockAdsRequest extends _i1.Mock implements _i2.AdsRequest { ) as _i2.PigeonInstanceManager); @override - _i6.Future setAdTagUrl(String? adTagUrl) => (super.noSuchMethod( + _i5.Future setAdTagUrl(String? adTagUrl) => (super.noSuchMethod( Invocation.method( #setAdTagUrl, [adTagUrl], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future setContentProgressProvider( + _i5.Future setContentProgressProvider( _i2.ContentProgressProvider? provider) => (super.noSuchMethod( Invocation.method( #setContentProgressProvider, [provider], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override _i2.AdsRequest pigeon_copy() => (super.noSuchMethod( @@ -957,24 +981,24 @@ class MockFrameLayout extends _i1.Mock implements _i2.FrameLayout { ) as _i2.FrameLayout); @override - _i6.Future addView(_i2.View? view) => (super.noSuchMethod( + _i5.Future addView(_i2.View? view) => (super.noSuchMethod( Invocation.method( #addView, [view], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future removeView(_i2.View? view) => (super.noSuchMethod( + _i5.Future removeView(_i2.View? view) => (super.noSuchMethod( Invocation.method( #removeView, [view], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); } /// A class which mocks [ImaSdkFactory]. @@ -995,13 +1019,38 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { ) as _i2.PigeonInstanceManager); @override - _i6.Future<_i2.ImaSdkSettings> createImaSdkSettings() => (super.noSuchMethod( + _i5.Future<_i2.CompanionAdSlot> createCompanionAdSlot() => + (super.noSuchMethod( + Invocation.method( + #createCompanionAdSlot, + [], + ), + returnValue: + _i5.Future<_i2.CompanionAdSlot>.value(_FakeCompanionAdSlot_11( + this, + Invocation.method( + #createCompanionAdSlot, + [], + ), + )), + returnValueForMissingStub: + _i5.Future<_i2.CompanionAdSlot>.value(_FakeCompanionAdSlot_11( + this, + Invocation.method( + #createCompanionAdSlot, + [], + ), + )), + ) as _i5.Future<_i2.CompanionAdSlot>); + + @override + _i5.Future<_i2.ImaSdkSettings> createImaSdkSettings() => (super.noSuchMethod( Invocation.method( #createImaSdkSettings, [], ), returnValue: - _i6.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_11( + _i5.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_12( this, Invocation.method( #createImaSdkSettings, @@ -1009,17 +1058,17 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { ), )), returnValueForMissingStub: - _i6.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_11( + _i5.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_12( this, Invocation.method( #createImaSdkSettings, [], ), )), - ) as _i6.Future<_i2.ImaSdkSettings>); + ) as _i5.Future<_i2.ImaSdkSettings>); @override - _i6.Future<_i2.AdsLoader> createAdsLoader( + _i5.Future<_i2.AdsLoader> createAdsLoader( _i2.ImaSdkSettings? settings, _i2.AdDisplayContainer? container, ) => @@ -1031,7 +1080,7 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { container, ], ), - returnValue: _i6.Future<_i2.AdsLoader>.value(_FakeAdsLoader_8( + returnValue: _i5.Future<_i2.AdsLoader>.value(_FakeAdsLoader_8( this, Invocation.method( #createAdsLoader, @@ -1042,7 +1091,7 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { ), )), returnValueForMissingStub: - _i6.Future<_i2.AdsLoader>.value(_FakeAdsLoader_8( + _i5.Future<_i2.AdsLoader>.value(_FakeAdsLoader_8( this, Invocation.method( #createAdsLoader, @@ -1052,15 +1101,15 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { ], ), )), - ) as _i6.Future<_i2.AdsLoader>); + ) as _i5.Future<_i2.AdsLoader>); @override - _i6.Future<_i2.AdsRequest> createAdsRequest() => (super.noSuchMethod( + _i5.Future<_i2.AdsRequest> createAdsRequest() => (super.noSuchMethod( Invocation.method( #createAdsRequest, [], ), - returnValue: _i6.Future<_i2.AdsRequest>.value(_FakeAdsRequest_9( + returnValue: _i5.Future<_i2.AdsRequest>.value(_FakeAdsRequest_9( this, Invocation.method( #createAdsRequest, @@ -1068,39 +1117,39 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { ), )), returnValueForMissingStub: - _i6.Future<_i2.AdsRequest>.value(_FakeAdsRequest_9( + _i5.Future<_i2.AdsRequest>.value(_FakeAdsRequest_9( this, Invocation.method( #createAdsRequest, [], ), )), - ) as _i6.Future<_i2.AdsRequest>); + ) as _i5.Future<_i2.AdsRequest>); @override - _i6.Future<_i2.AdsRenderingSettings> createAdsRenderingSettings() => + _i5.Future<_i2.AdsRenderingSettings> createAdsRenderingSettings() => (super.noSuchMethod( Invocation.method( #createAdsRenderingSettings, [], ), - returnValue: _i6.Future<_i2.AdsRenderingSettings>.value( - _FakeAdsRenderingSettings_12( + returnValue: _i5.Future<_i2.AdsRenderingSettings>.value( + _FakeAdsRenderingSettings_13( this, Invocation.method( #createAdsRenderingSettings, [], ), )), - returnValueForMissingStub: _i6.Future<_i2.AdsRenderingSettings>.value( - _FakeAdsRenderingSettings_12( + returnValueForMissingStub: _i5.Future<_i2.AdsRenderingSettings>.value( + _FakeAdsRenderingSettings_13( this, Invocation.method( #createAdsRenderingSettings, [], ), )), - ) as _i6.Future<_i2.AdsRenderingSettings>); + ) as _i5.Future<_i2.AdsRenderingSettings>); @override _i2.ImaSdkFactory pigeon_copy() => (super.noSuchMethod( @@ -1108,14 +1157,14 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { #pigeon_copy, [], ), - returnValue: _FakeImaSdkFactory_13( + returnValue: _FakeImaSdkFactory_14( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeImaSdkFactory_13( + returnValueForMissingStub: _FakeImaSdkFactory_14( this, Invocation.method( #pigeon_copy, @@ -1148,14 +1197,14 @@ class MockImaSdkSettings extends _i1.Mock implements _i2.ImaSdkSettings { #pigeon_copy, [], ), - returnValue: _FakeImaSdkSettings_11( + returnValue: _FakeImaSdkSettings_12( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeImaSdkSettings_11( + returnValueForMissingStub: _FakeImaSdkSettings_12( this, Invocation.method( #pigeon_copy, @@ -1308,25 +1357,25 @@ class MockVideoAdPlayer extends _i1.Mock implements _i2.VideoAdPlayer { ) as _i2.PigeonInstanceManager); @override - _i6.Future setVolume(int? value) => (super.noSuchMethod( + _i5.Future setVolume(int? value) => (super.noSuchMethod( Invocation.method( #setVolume, [value], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future setAdProgress(_i2.VideoProgressUpdate? progress) => + _i5.Future setAdProgress(_i2.VideoProgressUpdate? progress) => (super.noSuchMethod( Invocation.method( #setAdProgress, [progress], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override _i2.VideoAdPlayer pigeon_copy() => (super.noSuchMethod( @@ -1334,14 +1383,14 @@ class MockVideoAdPlayer extends _i1.Mock implements _i2.VideoAdPlayer { #pigeon_copy, [], ), - returnValue: _FakeVideoAdPlayer_14( + returnValue: _FakeVideoAdPlayer_15( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeVideoAdPlayer_14( + returnValueForMissingStub: _FakeVideoAdPlayer_15( this, Invocation.method( #pigeon_copy, @@ -1370,7 +1419,7 @@ class MockVideoAdPlayerCallback extends _i1.Mock ) as _i2.PigeonInstanceManager); @override - _i6.Future onAdProgress( + _i5.Future onAdProgress( _i2.AdMediaInfo? adMediaInfo, _i2.VideoProgressUpdate? videoProgressUpdate, ) => @@ -1382,95 +1431,95 @@ class MockVideoAdPlayerCallback extends _i1.Mock videoProgressUpdate, ], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onBuffering(_i2.AdMediaInfo? adMediaInfo) => + _i5.Future onBuffering(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onBuffering, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onContentComplete() => (super.noSuchMethod( + _i5.Future onContentComplete() => (super.noSuchMethod( Invocation.method( #onContentComplete, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onEnded(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( + _i5.Future onEnded(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onEnded, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onError(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( + _i5.Future onError(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onError, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onLoaded(_i2.AdMediaInfo? adMediaInfo) => + _i5.Future onLoaded(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onLoaded, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onPause(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( + _i5.Future onPause(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onPause, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onPlay(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( + _i5.Future onPlay(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onPlay, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onResume(_i2.AdMediaInfo? adMediaInfo) => + _i5.Future onResume(_i2.AdMediaInfo? adMediaInfo) => (super.noSuchMethod( Invocation.method( #onResume, [adMediaInfo], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future onVolumeChanged( + _i5.Future onVolumeChanged( _i2.AdMediaInfo? adMediaInfo, int? percentage, ) => @@ -1482,9 +1531,9 @@ class MockVideoAdPlayerCallback extends _i1.Mock percentage, ], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override _i2.VideoAdPlayerCallback pigeon_copy() => (super.noSuchMethod( @@ -1492,14 +1541,14 @@ class MockVideoAdPlayerCallback extends _i1.Mock #pigeon_copy, [], ), - returnValue: _FakeVideoAdPlayerCallback_15( + returnValue: _FakeVideoAdPlayerCallback_16( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeVideoAdPlayerCallback_15( + returnValueForMissingStub: _FakeVideoAdPlayerCallback_16( this, Invocation.method( #pigeon_copy, @@ -1554,24 +1603,24 @@ class MockVideoView extends _i1.Mock implements _i2.VideoView { ) as _i2.PigeonInstanceManager); @override - _i6.Future setVideoUri(String? uri) => (super.noSuchMethod( + _i5.Future setVideoUri(String? uri) => (super.noSuchMethod( Invocation.method( #setVideoUri, [uri], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future getCurrentPosition() => (super.noSuchMethod( + _i5.Future getCurrentPosition() => (super.noSuchMethod( Invocation.method( #getCurrentPosition, [], ), - returnValue: _i6.Future.value(0), - returnValueForMissingStub: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i5.Future.value(0), + returnValueForMissingStub: _i5.Future.value(0), + ) as _i5.Future); @override _i2.VideoView pigeon_copy() => (super.noSuchMethod( @@ -1579,14 +1628,14 @@ class MockVideoView extends _i1.Mock implements _i2.VideoView { #pigeon_copy, [], ), - returnValue: _FakeVideoView_16( + returnValue: _FakeVideoView_17( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeVideoView_16( + returnValueForMissingStub: _FakeVideoView_17( this, Invocation.method( #pigeon_copy, @@ -1625,25 +1674,16 @@ class MockSurfaceAndroidViewController extends _i1.Mock @override _i4.PointTransformer get pointTransformer => (super.noSuchMethod( Invocation.getter(#pointTransformer), - returnValue: (_i3.Offset position) => _FakeOffset_17( + returnValue: (_i3.Offset position) => _FakeOffset_18( this, Invocation.getter(#pointTransformer), ), - returnValueForMissingStub: (_i3.Offset position) => _FakeOffset_17( + returnValueForMissingStub: (_i3.Offset position) => _FakeOffset_18( this, Invocation.getter(#pointTransformer), ), ) as _i4.PointTransformer); - @override - set pointTransformer(_i4.PointTransformer? transformer) => super.noSuchMethod( - Invocation.setter( - #pointTransformer, - transformer, - ), - returnValueForMissingStub: null, - ); - @override bool get isCreated => (super.noSuchMethod( Invocation.getter(#isCreated), @@ -1660,17 +1700,26 @@ class MockSurfaceAndroidViewController extends _i1.Mock ) as List<_i4.PlatformViewCreatedCallback>); @override - _i6.Future setOffset(_i3.Offset? off) => (super.noSuchMethod( + set pointTransformer(_i4.PointTransformer? transformer) => super.noSuchMethod( + Invocation.setter( + #pointTransformer, + transformer, + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future setOffset(_i3.Offset? off) => (super.noSuchMethod( Invocation.method( #setOffset, [off], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future create({ + _i5.Future create({ _i3.Size? size, _i3.Offset? position, }) => @@ -1683,42 +1732,42 @@ class MockSurfaceAndroidViewController extends _i1.Mock #position: position, }, ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future<_i3.Size> setSize(_i3.Size? size) => (super.noSuchMethod( + _i5.Future<_i3.Size> setSize(_i3.Size? size) => (super.noSuchMethod( Invocation.method( #setSize, [size], ), - returnValue: _i6.Future<_i3.Size>.value(_FakeSize_18( + returnValue: _i5.Future<_i3.Size>.value(_FakeSize_19( this, Invocation.method( #setSize, [size], ), )), - returnValueForMissingStub: _i6.Future<_i3.Size>.value(_FakeSize_18( + returnValueForMissingStub: _i5.Future<_i3.Size>.value(_FakeSize_19( this, Invocation.method( #setSize, [size], ), )), - ) as _i6.Future<_i3.Size>); + ) as _i5.Future<_i3.Size>); @override - _i6.Future sendMotionEvent(_i4.AndroidMotionEvent? event) => + _i5.Future sendMotionEvent(_i4.AndroidMotionEvent? event) => (super.noSuchMethod( Invocation.method( #sendMotionEvent, [event], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override void addOnPlatformViewCreatedListener( @@ -1743,46 +1792,46 @@ class MockSurfaceAndroidViewController extends _i1.Mock ); @override - _i6.Future setLayoutDirection(_i3.TextDirection? layoutDirection) => + _i5.Future setLayoutDirection(_i3.TextDirection? layoutDirection) => (super.noSuchMethod( Invocation.method( #setLayoutDirection, [layoutDirection], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future dispatchPointerEvent(_i4.PointerEvent? event) => + _i5.Future dispatchPointerEvent(_i4.PointerEvent? event) => (super.noSuchMethod( Invocation.method( #dispatchPointerEvent, [event], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future clearFocus() => (super.noSuchMethod( + _i5.Future clearFocus() => (super.noSuchMethod( Invocation.method( #clearFocus, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); @override - _i6.Future dispose() => (super.noSuchMethod( + _i5.Future dispose() => (super.noSuchMethod( Invocation.method( #dispose, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); } /// A class which mocks [PlatformViewsServiceProxy]. @@ -1813,7 +1862,7 @@ class MockPlatformViewsServiceProxy extends _i1.Mock #onFocus: onFocus, }, ), - returnValue: _FakeExpensiveAndroidViewController_19( + returnValue: _FakeExpensiveAndroidViewController_20( this, Invocation.method( #initExpensiveAndroidView, @@ -1828,7 +1877,7 @@ class MockPlatformViewsServiceProxy extends _i1.Mock }, ), ), - returnValueForMissingStub: _FakeExpensiveAndroidViewController_19( + returnValueForMissingStub: _FakeExpensiveAndroidViewController_20( this, Invocation.method( #initExpensiveAndroidView, @@ -1867,7 +1916,7 @@ class MockPlatformViewsServiceProxy extends _i1.Mock #onFocus: onFocus, }, ), - returnValue: _FakeSurfaceAndroidViewController_20( + returnValue: _FakeSurfaceAndroidViewController_21( this, Invocation.method( #initSurfaceAndroidView, @@ -1882,7 +1931,7 @@ class MockPlatformViewsServiceProxy extends _i1.Mock }, ), ), - returnValueForMissingStub: _FakeSurfaceAndroidViewController_20( + returnValueForMissingStub: _FakeSurfaceAndroidViewController_21( this, Invocation.method( #initSurfaceAndroidView, 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 4181bca8d7f..8610a224046 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 @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in interactive_media_ads/test/android/ads_manager_test.dart. // Do not manually edit this file. @@ -18,6 +18,7 @@ import 'package:mockito/src/dummies.dart' as _i3; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types @@ -107,9 +108,20 @@ class _FakeAdsRenderingSettings_7 extends _i1.SmartFake ); } -class _FakeImaSdkSettings_8 extends _i1.SmartFake +class _FakeCompanionAdSlot_8 extends _i1.SmartFake + implements _i2.CompanionAdSlot { + _FakeCompanionAdSlot_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeImaSdkSettings_9 extends _i1.SmartFake implements _i2.ImaSdkSettings { - _FakeImaSdkSettings_8( + _FakeImaSdkSettings_9( Object parent, Invocation parentInvocation, ) : super( @@ -118,8 +130,8 @@ class _FakeImaSdkSettings_8 extends _i1.SmartFake ); } -class _FakeAdsLoader_9 extends _i1.SmartFake implements _i2.AdsLoader { - _FakeAdsLoader_9( +class _FakeAdsLoader_10 extends _i1.SmartFake implements _i2.AdsLoader { + _FakeAdsLoader_10( Object parent, Invocation parentInvocation, ) : super( @@ -128,8 +140,8 @@ class _FakeAdsLoader_9 extends _i1.SmartFake implements _i2.AdsLoader { ); } -class _FakeAdsRequest_10 extends _i1.SmartFake implements _i2.AdsRequest { - _FakeAdsRequest_10( +class _FakeAdsRequest_11 extends _i1.SmartFake implements _i2.AdsRequest { + _FakeAdsRequest_11( Object parent, Invocation parentInvocation, ) : super( @@ -138,8 +150,8 @@ class _FakeAdsRequest_10 extends _i1.SmartFake implements _i2.AdsRequest { ); } -class _FakeImaSdkFactory_11 extends _i1.SmartFake implements _i2.ImaSdkFactory { - _FakeImaSdkFactory_11( +class _FakeImaSdkFactory_12 extends _i1.SmartFake implements _i2.ImaSdkFactory { + _FakeImaSdkFactory_12( Object parent, Invocation parentInvocation, ) : super( @@ -830,13 +842,38 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { ), ) as _i2.PigeonInstanceManager); + @override + _i4.Future<_i2.CompanionAdSlot> createCompanionAdSlot() => + (super.noSuchMethod( + Invocation.method( + #createCompanionAdSlot, + [], + ), + returnValue: + _i4.Future<_i2.CompanionAdSlot>.value(_FakeCompanionAdSlot_8( + this, + Invocation.method( + #createCompanionAdSlot, + [], + ), + )), + returnValueForMissingStub: + _i4.Future<_i2.CompanionAdSlot>.value(_FakeCompanionAdSlot_8( + this, + Invocation.method( + #createCompanionAdSlot, + [], + ), + )), + ) as _i4.Future<_i2.CompanionAdSlot>); + @override _i4.Future<_i2.ImaSdkSettings> createImaSdkSettings() => (super.noSuchMethod( Invocation.method( #createImaSdkSettings, [], ), - returnValue: _i4.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_8( + returnValue: _i4.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_9( this, Invocation.method( #createImaSdkSettings, @@ -844,7 +881,7 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { ), )), returnValueForMissingStub: - _i4.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_8( + _i4.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_9( this, Invocation.method( #createImaSdkSettings, @@ -866,7 +903,7 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { container, ], ), - returnValue: _i4.Future<_i2.AdsLoader>.value(_FakeAdsLoader_9( + returnValue: _i4.Future<_i2.AdsLoader>.value(_FakeAdsLoader_10( this, Invocation.method( #createAdsLoader, @@ -877,7 +914,7 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { ), )), returnValueForMissingStub: - _i4.Future<_i2.AdsLoader>.value(_FakeAdsLoader_9( + _i4.Future<_i2.AdsLoader>.value(_FakeAdsLoader_10( this, Invocation.method( #createAdsLoader, @@ -895,7 +932,7 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { #createAdsRequest, [], ), - returnValue: _i4.Future<_i2.AdsRequest>.value(_FakeAdsRequest_10( + returnValue: _i4.Future<_i2.AdsRequest>.value(_FakeAdsRequest_11( this, Invocation.method( #createAdsRequest, @@ -903,7 +940,7 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { ), )), returnValueForMissingStub: - _i4.Future<_i2.AdsRequest>.value(_FakeAdsRequest_10( + _i4.Future<_i2.AdsRequest>.value(_FakeAdsRequest_11( this, Invocation.method( #createAdsRequest, @@ -943,14 +980,14 @@ class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { #pigeon_copy, [], ), - returnValue: _FakeImaSdkFactory_11( + returnValue: _FakeImaSdkFactory_12( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeImaSdkFactory_11( + returnValueForMissingStub: _FakeImaSdkFactory_12( this, Invocation.method( #pigeon_copy, diff --git a/packages/interactive_media_ads/test/android/companion_ad_slot_test.dart b/packages/interactive_media_ads/test/android/companion_ad_slot_test.dart new file mode 100644 index 00000000000..950fdee9d8f --- /dev/null +++ b/packages/interactive_media_ads/test/android/companion_ad_slot_test.dart @@ -0,0 +1,99 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:interactive_media_ads/src/android/android_companion_ad_slot.dart'; +import 'package:interactive_media_ads/src/android/interactive_media_ads.g.dart' + as ima; +import 'package:interactive_media_ads/src/android/interactive_media_ads_proxy.dart'; +import 'package:interactive_media_ads/src/platform_interface/companion_ad_slot_size.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'companion_ad_slot_test.mocks.dart'; + +@GenerateNiceMocks(>[ + MockSpec(), + MockSpec(), + MockSpec(), +]) +void main() { + group('AndroidCompanionAdSlot', () { + test('instantiate CompanionAdSlot with size', () async { + final ima.FrameLayout frameLayout = ima.FrameLayout.pigeon_detached( + pigeon_instanceManager: _TestInstanceManager(), + ); + final MockCompanionAdSlot mockCompanionAdSlot = MockCompanionAdSlot(); + final AndroidCompanionAdSlotCreationParams params = + AndroidCompanionAdSlotCreationParams( + size: CompanionAdSlotSize.fixed(width: 300, height: 400), + proxy: InteractiveMediaAdsProxy( + newFrameLayout: () { + return frameLayout; + }, + instanceImaSdkFactory: () { + final MockImaSdkFactory mockFactory = MockImaSdkFactory(); + when(mockFactory.createCompanionAdSlot()).thenAnswer( + (_) async => mockCompanionAdSlot, + ); + return mockFactory; + }, + ), + ); + + final AndroidCompanionAdSlot adSlot = AndroidCompanionAdSlot(params); + await adSlot.getNativeCompanionAdSlot(); + + verify(mockCompanionAdSlot.setContainer(frameLayout)); + verify(mockCompanionAdSlot.setSize(300, 400)); + }); + + test('AndroidCompanionAdSlot receives onClick', () async { + final MockCompanionAdSlot mockCompanionAdSlot = MockCompanionAdSlot(); + final AndroidCompanionAdSlotCreationParams params = + AndroidCompanionAdSlotCreationParams( + size: CompanionAdSlotSize.fixed(width: 300, height: 400), + onClicked: expectAsync0(() {}), + proxy: InteractiveMediaAdsProxy( + newFrameLayout: () { + return ima.FrameLayout.pigeon_detached( + pigeon_instanceManager: _TestInstanceManager(), + ); + }, + instanceImaSdkFactory: () { + final MockImaSdkFactory mockFactory = MockImaSdkFactory(); + when(mockFactory.createCompanionAdSlot()).thenAnswer( + (_) async => mockCompanionAdSlot, + ); + return mockFactory; + }, + newCompanionAdSlotClickListener: ({ + required void Function( + ima.CompanionAdSlotClickListener, + ) onCompanionAdClick, + }) { + return ima.CompanionAdSlotClickListener.pigeon_detached( + onCompanionAdClick: onCompanionAdClick, + pigeon_instanceManager: _TestInstanceManager(), + ); + }, + ), + ); + + final AndroidCompanionAdSlot adSlot = AndroidCompanionAdSlot(params); + await adSlot.getNativeCompanionAdSlot(); + + final ima.CompanionAdSlotClickListener clickListener = + verify(mockCompanionAdSlot.addClickListener(captureAny)) + .captured + .single as ima.CompanionAdSlotClickListener; + + clickListener.onCompanionAdClick(clickListener); + }); + }); +} + +class _TestInstanceManager extends ima.PigeonInstanceManager { + _TestInstanceManager() : super(onWeakReferenceRemoved: (_) {}); +} diff --git a/packages/interactive_media_ads/test/android/companion_ad_slot_test.mocks.dart b/packages/interactive_media_ads/test/android/companion_ad_slot_test.mocks.dart new file mode 100644 index 00000000000..4a905596e1a --- /dev/null +++ b/packages/interactive_media_ads/test/android/companion_ad_slot_test.mocks.dart @@ -0,0 +1,505 @@ +// Mocks generated by Mockito 5.4.6 from annotations +// in interactive_media_ads/test/android/companion_ad_slot_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i3; + +import 'package:interactive_media_ads/src/android/interactive_media_ads.g.dart' + as _i2; +import 'package:mockito/mockito.dart' as _i1; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakePigeonInstanceManager_0 extends _i1.SmartFake + implements _i2.PigeonInstanceManager { + _FakePigeonInstanceManager_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeViewGroup_1 extends _i1.SmartFake implements _i2.ViewGroup { + _FakeViewGroup_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeCompanionAdSlot_2 extends _i1.SmartFake + implements _i2.CompanionAdSlot { + _FakeCompanionAdSlot_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFrameLayout_3 extends _i1.SmartFake implements _i2.FrameLayout { + _FakeFrameLayout_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeImaSdkSettings_4 extends _i1.SmartFake + implements _i2.ImaSdkSettings { + _FakeImaSdkSettings_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAdsLoader_5 extends _i1.SmartFake implements _i2.AdsLoader { + _FakeAdsLoader_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAdsRequest_6 extends _i1.SmartFake implements _i2.AdsRequest { + _FakeAdsRequest_6( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAdsRenderingSettings_7 extends _i1.SmartFake + implements _i2.AdsRenderingSettings { + _FakeAdsRenderingSettings_7( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeImaSdkFactory_8 extends _i1.SmartFake implements _i2.ImaSdkFactory { + _FakeImaSdkFactory_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [CompanionAdSlot]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockCompanionAdSlot extends _i1.Mock implements _i2.CompanionAdSlot { + @override + _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( + Invocation.getter(#pigeon_instanceManager), + returnValue: _FakePigeonInstanceManager_0( + this, + Invocation.getter(#pigeon_instanceManager), + ), + returnValueForMissingStub: _FakePigeonInstanceManager_0( + this, + Invocation.getter(#pigeon_instanceManager), + ), + ) as _i2.PigeonInstanceManager); + + @override + _i3.Future addClickListener( + _i2.CompanionAdSlotClickListener? clickListener) => + (super.noSuchMethod( + Invocation.method( + #addClickListener, + [clickListener], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future<_i2.ViewGroup> getContainer() => (super.noSuchMethod( + Invocation.method( + #getContainer, + [], + ), + returnValue: _i3.Future<_i2.ViewGroup>.value(_FakeViewGroup_1( + this, + Invocation.method( + #getContainer, + [], + ), + )), + returnValueForMissingStub: + _i3.Future<_i2.ViewGroup>.value(_FakeViewGroup_1( + this, + Invocation.method( + #getContainer, + [], + ), + )), + ) as _i3.Future<_i2.ViewGroup>); + + @override + _i3.Future getHeight() => (super.noSuchMethod( + Invocation.method( + #getHeight, + [], + ), + returnValue: _i3.Future.value(0), + returnValueForMissingStub: _i3.Future.value(0), + ) as _i3.Future); + + @override + _i3.Future getWidth() => (super.noSuchMethod( + Invocation.method( + #getWidth, + [], + ), + returnValue: _i3.Future.value(0), + returnValueForMissingStub: _i3.Future.value(0), + ) as _i3.Future); + + @override + _i3.Future isFilled() => (super.noSuchMethod( + Invocation.method( + #isFilled, + [], + ), + returnValue: _i3.Future.value(false), + returnValueForMissingStub: _i3.Future.value(false), + ) as _i3.Future); + + @override + _i3.Future removeClickListener( + _i2.CompanionAdSlotClickListener? clickListener) => + (super.noSuchMethod( + Invocation.method( + #removeClickListener, + [clickListener], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setContainer(_i2.ViewGroup? container) => + (super.noSuchMethod( + Invocation.method( + #setContainer, + [container], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setSize( + int? width, + int? height, + ) => + (super.noSuchMethod( + Invocation.method( + #setSize, + [ + width, + height, + ], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setFluidSize() => (super.noSuchMethod( + Invocation.method( + #setFluidSize, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i2.CompanionAdSlot pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeCompanionAdSlot_2( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeCompanionAdSlot_2( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.CompanionAdSlot); +} + +/// A class which mocks [FrameLayout]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockFrameLayout extends _i1.Mock implements _i2.FrameLayout { + @override + _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( + Invocation.getter(#pigeon_instanceManager), + returnValue: _FakePigeonInstanceManager_0( + this, + Invocation.getter(#pigeon_instanceManager), + ), + returnValueForMissingStub: _FakePigeonInstanceManager_0( + this, + Invocation.getter(#pigeon_instanceManager), + ), + ) as _i2.PigeonInstanceManager); + + @override + _i2.FrameLayout pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeFrameLayout_3( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeFrameLayout_3( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.FrameLayout); + + @override + _i3.Future addView(_i2.View? view) => (super.noSuchMethod( + Invocation.method( + #addView, + [view], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future removeView(_i2.View? view) => (super.noSuchMethod( + Invocation.method( + #removeView, + [view], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); +} + +/// A class which mocks [ImaSdkFactory]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockImaSdkFactory extends _i1.Mock implements _i2.ImaSdkFactory { + @override + _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( + Invocation.getter(#pigeon_instanceManager), + returnValue: _FakePigeonInstanceManager_0( + this, + Invocation.getter(#pigeon_instanceManager), + ), + returnValueForMissingStub: _FakePigeonInstanceManager_0( + this, + Invocation.getter(#pigeon_instanceManager), + ), + ) as _i2.PigeonInstanceManager); + + @override + _i3.Future<_i2.CompanionAdSlot> createCompanionAdSlot() => + (super.noSuchMethod( + Invocation.method( + #createCompanionAdSlot, + [], + ), + returnValue: + _i3.Future<_i2.CompanionAdSlot>.value(_FakeCompanionAdSlot_2( + this, + Invocation.method( + #createCompanionAdSlot, + [], + ), + )), + returnValueForMissingStub: + _i3.Future<_i2.CompanionAdSlot>.value(_FakeCompanionAdSlot_2( + this, + Invocation.method( + #createCompanionAdSlot, + [], + ), + )), + ) as _i3.Future<_i2.CompanionAdSlot>); + + @override + _i3.Future<_i2.ImaSdkSettings> createImaSdkSettings() => (super.noSuchMethod( + Invocation.method( + #createImaSdkSettings, + [], + ), + returnValue: _i3.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_4( + this, + Invocation.method( + #createImaSdkSettings, + [], + ), + )), + returnValueForMissingStub: + _i3.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_4( + this, + Invocation.method( + #createImaSdkSettings, + [], + ), + )), + ) as _i3.Future<_i2.ImaSdkSettings>); + + @override + _i3.Future<_i2.AdsLoader> createAdsLoader( + _i2.ImaSdkSettings? settings, + _i2.AdDisplayContainer? container, + ) => + (super.noSuchMethod( + Invocation.method( + #createAdsLoader, + [ + settings, + container, + ], + ), + returnValue: _i3.Future<_i2.AdsLoader>.value(_FakeAdsLoader_5( + this, + Invocation.method( + #createAdsLoader, + [ + settings, + container, + ], + ), + )), + returnValueForMissingStub: + _i3.Future<_i2.AdsLoader>.value(_FakeAdsLoader_5( + this, + Invocation.method( + #createAdsLoader, + [ + settings, + container, + ], + ), + )), + ) as _i3.Future<_i2.AdsLoader>); + + @override + _i3.Future<_i2.AdsRequest> createAdsRequest() => (super.noSuchMethod( + Invocation.method( + #createAdsRequest, + [], + ), + returnValue: _i3.Future<_i2.AdsRequest>.value(_FakeAdsRequest_6( + this, + Invocation.method( + #createAdsRequest, + [], + ), + )), + returnValueForMissingStub: + _i3.Future<_i2.AdsRequest>.value(_FakeAdsRequest_6( + this, + Invocation.method( + #createAdsRequest, + [], + ), + )), + ) as _i3.Future<_i2.AdsRequest>); + + @override + _i3.Future<_i2.AdsRenderingSettings> createAdsRenderingSettings() => + (super.noSuchMethod( + Invocation.method( + #createAdsRenderingSettings, + [], + ), + returnValue: _i3.Future<_i2.AdsRenderingSettings>.value( + _FakeAdsRenderingSettings_7( + this, + Invocation.method( + #createAdsRenderingSettings, + [], + ), + )), + returnValueForMissingStub: _i3.Future<_i2.AdsRenderingSettings>.value( + _FakeAdsRenderingSettings_7( + this, + Invocation.method( + #createAdsRenderingSettings, + [], + ), + )), + ) as _i3.Future<_i2.AdsRenderingSettings>); + + @override + _i2.ImaSdkFactory pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeImaSdkFactory_8( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeImaSdkFactory_8( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.ImaSdkFactory); +} diff --git a/packages/interactive_media_ads/test/android/content_progress_provider_test.dart b/packages/interactive_media_ads/test/android/content_progress_provider_test.dart index bf7885bb77c..9566988bf52 100644 --- a/packages/interactive_media_ads/test/android/content_progress_provider_test.dart +++ b/packages/interactive_media_ads/test/android/content_progress_provider_test.dart @@ -32,7 +32,11 @@ void main() { }) { expect(currentTimeMs, 1000); expect(durationMs, 10000); - return ima.VideoProgressUpdate.pigeon_detached(); + return ima.VideoProgressUpdate.pigeon_detached( + pigeon_instanceManager: ima.PigeonInstanceManager( + onWeakReferenceRemoved: (_) {}, + ), + ); }, ), ), diff --git a/packages/interactive_media_ads/test/android/content_progress_provider_test.mocks.dart b/packages/interactive_media_ads/test/android/content_progress_provider_test.mocks.dart index 6d65d647503..c37290e27f3 100644 --- a/packages/interactive_media_ads/test/android/content_progress_provider_test.mocks.dart +++ b/packages/interactive_media_ads/test/android/content_progress_provider_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in interactive_media_ads/test/android/content_progress_provider_test.dart. // Do not manually edit this file. @@ -17,6 +17,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/packages/interactive_media_ads/test/companion_ad_slot_test.dart b/packages/interactive_media_ads/test/companion_ad_slot_test.dart new file mode 100644 index 00000000000..d9066297a25 --- /dev/null +++ b/packages/interactive_media_ads/test/companion_ad_slot_test.dart @@ -0,0 +1,31 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:interactive_media_ads/interactive_media_ads.dart'; +import 'package:interactive_media_ads/src/platform_interface/platform_interface.dart'; + +import 'test_stubs.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('buildWidget', (WidgetTester tester) async { + final TestCompanionAdSlot slot = TestCompanionAdSlot( + PlatformCompanionAdSlotCreationParams(size: CompanionAdSlotSize.fluid()), + onBuildWidget: (_) => Container(), + ); + + await tester.pumpWidget( + Builder( + builder: (BuildContext context) { + return CompanionAdSlot.fromPlatform(slot).buildWidget(context); + }, + ), + ); + + expect(find.byType(Container), findsOneWidget); + }); +} diff --git a/packages/interactive_media_ads/test/ios/ad_display_container_test.dart b/packages/interactive_media_ads/test/ios/ad_display_container_test.dart index b3eb0935639..eb481968620 100644 --- a/packages/interactive_media_ads/test/ios/ad_display_container_test.dart +++ b/packages/interactive_media_ads/test/ios/ad_display_container_test.dart @@ -9,6 +9,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:interactive_media_ads/src/ios/interactive_media_ads.g.dart'; import 'package:interactive_media_ads/src/ios/interactive_media_ads_proxy.dart'; import 'package:interactive_media_ads/src/ios/ios_ad_display_container.dart'; +import 'package:interactive_media_ads/src/ios/ios_companion_ad_slot.dart'; +import 'package:interactive_media_ads/src/platform_interface/platform_interface.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; @@ -16,6 +18,7 @@ import 'ad_display_container_test.mocks.dart'; @GenerateNiceMocks(>[ MockSpec(), + MockSpec(), MockSpec(), MockSpec(), ]) @@ -61,6 +64,7 @@ void main() { newIMAAdDisplayContainer: ({ required UIView adContainer, UIViewController? adContainerViewController, + List? companionSlots, }) => MockIMAAdDisplayContainer(), ); @@ -90,5 +94,90 @@ void main() { expect(onContainerAddedCompleter.isCompleted, isTrue); }); + + testWidgets('AdDisplayContainer ads CompanionAdSlots', + (WidgetTester tester) async { + final PigeonInstanceManager instanceManager = PigeonInstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + + final MockIMACompanionAdSlot mockCompanionAdSlot = + MockIMACompanionAdSlot(); + late final void Function(UIViewController, bool) viewDidAppearCallback; + final Completer?> addedAdSlotsCompleter = + Completer?>(); + final InteractiveMediaAdsProxy imaProxy = InteractiveMediaAdsProxy( + newUIViewController: ({ + void Function(UIViewController, bool)? viewDidAppear, + }) { + viewDidAppearCallback = viewDidAppear!; + + final UIView view = + UIView.pigeon_detached(pigeon_instanceManager: instanceManager); + instanceManager.addDartCreatedInstance(view); + + final MockUIViewController mockController = MockUIViewController(); + when(mockController.view).thenReturn(view); + return mockController; + }, + newIMAAdDisplayContainer: ({ + required UIView adContainer, + UIViewController? adContainerViewController, + List? companionSlots, + }) { + addedAdSlotsCompleter.complete(companionSlots); + return MockIMAAdDisplayContainer(); + }, + sizeIMACompanionAdSlot: ({ + required int width, + required int height, + required UIView view, + }) { + expect(width, 300); + expect(height, 400); + return mockCompanionAdSlot; + }, + newUIView: () { + return UIView.pigeon_detached( + pigeon_instanceManager: instanceManager, + ); + }, + ); + + final Completer onContainerAddedCompleter = Completer(); + + final IOSAdDisplayContainer container = IOSAdDisplayContainer( + IOSAdDisplayContainerCreationParams( + onContainerAdded: (_) => onContainerAddedCompleter.complete(), + companionSlots: [ + IOSCompanionAdSlot( + IOSCompanionAdSlotCreationParams( + size: CompanionAdSlotSize.fixed(width: 300, height: 400), + proxy: imaProxy, + ), + ) + ], + imaProxy: imaProxy, + ), + ); + + await tester.pumpWidget(Builder( + builder: (BuildContext context) => container.build(context), + )); + + final UiKitView view = + find.byType(UiKitView).evaluate().single.widget as UiKitView; + view.onPlatformViewCreated!.call(0); + + viewDidAppearCallback(MockUIViewController(), true); + await tester.pumpAndSettle(); + + await onContainerAddedCompleter.future; + + expect( + await addedAdSlotsCompleter.future, + [mockCompanionAdSlot], + ); + }); }); } diff --git a/packages/interactive_media_ads/test/ios/ad_display_container_test.mocks.dart b/packages/interactive_media_ads/test/ios/ad_display_container_test.mocks.dart index cb8c37e05dc..1bfa309a9e0 100644 --- a/packages/interactive_media_ads/test/ios/ad_display_container_test.mocks.dart +++ b/packages/interactive_media_ads/test/ios/ad_display_container_test.mocks.dart @@ -1,8 +1,10 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in interactive_media_ads/test/ios/ad_display_container_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i3; + import 'package:interactive_media_ads/src/ios/interactive_media_ads.g.dart' as _i2; import 'package:mockito/mockito.dart' as _i1; @@ -15,14 +17,25 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types // ignore_for_file: subtype_of_sealed_class -class _FakePigeonInstanceManager_0 extends _i1.SmartFake +class _FakeUIView_0 extends _i1.SmartFake implements _i2.UIView { + _FakeUIView_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakePigeonInstanceManager_1 extends _i1.SmartFake implements _i2.PigeonInstanceManager { - _FakePigeonInstanceManager_0( + _FakePigeonInstanceManager_1( Object parent, Invocation parentInvocation, ) : super( @@ -31,9 +44,9 @@ class _FakePigeonInstanceManager_0 extends _i1.SmartFake ); } -class _FakeIMAAdDisplayContainer_1 extends _i1.SmartFake +class _FakeIMAAdDisplayContainer_2 extends _i1.SmartFake implements _i2.IMAAdDisplayContainer { - _FakeIMAAdDisplayContainer_1( + _FakeIMAAdDisplayContainer_2( Object parent, Invocation parentInvocation, ) : super( @@ -42,8 +55,9 @@ class _FakeIMAAdDisplayContainer_1 extends _i1.SmartFake ); } -class _FakeUIView_2 extends _i1.SmartFake implements _i2.UIView { - _FakeUIView_2( +class _FakeIMACompanionAdSlot_3 extends _i1.SmartFake + implements _i2.IMACompanionAdSlot { + _FakeIMACompanionAdSlot_3( Object parent, Invocation parentInvocation, ) : super( @@ -52,9 +66,9 @@ class _FakeUIView_2 extends _i1.SmartFake implements _i2.UIView { ); } -class _FakeUIViewController_3 extends _i1.SmartFake +class _FakeUIViewController_4 extends _i1.SmartFake implements _i2.UIViewController { - _FakeUIViewController_3( + _FakeUIViewController_4( Object parent, Invocation parentInvocation, ) : super( @@ -69,32 +83,90 @@ class _FakeUIViewController_3 extends _i1.SmartFake class MockIMAAdDisplayContainer extends _i1.Mock implements _i2.IMAAdDisplayContainer { @override + _i2.UIView get adContainer => (super.noSuchMethod( + Invocation.getter(#adContainer), + returnValue: _FakeUIView_0( + this, + Invocation.getter(#adContainer), + ), + returnValueForMissingStub: _FakeUIView_0( + this, + Invocation.getter(#adContainer), + ), + ) as _i2.UIView); + + @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), - returnValue: _FakePigeonInstanceManager_0( + returnValue: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), - returnValueForMissingStub: _FakePigeonInstanceManager_0( + returnValueForMissingStub: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), ) as _i2.PigeonInstanceManager); + @override + _i3.Future setAdContainerViewController( + _i2.UIViewController? controller) => + (super.noSuchMethod( + Invocation.method( + #setAdContainerViewController, + [controller], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future<_i2.UIViewController?> getAdContainerViewController() => + (super.noSuchMethod( + Invocation.method( + #getAdContainerViewController, + [], + ), + returnValue: _i3.Future<_i2.UIViewController?>.value(), + returnValueForMissingStub: _i3.Future<_i2.UIViewController?>.value(), + ) as _i3.Future<_i2.UIViewController?>); + + @override + _i3.Future registerFriendlyObstruction( + _i2.IMAFriendlyObstruction? friendlyObstruction) => + (super.noSuchMethod( + Invocation.method( + #registerFriendlyObstruction, + [friendlyObstruction], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future unregisterAllFriendlyObstructions() => (super.noSuchMethod( + Invocation.method( + #unregisterAllFriendlyObstructions, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override _i2.IMAAdDisplayContainer pigeon_copy() => (super.noSuchMethod( Invocation.method( #pigeon_copy, [], ), - returnValue: _FakeIMAAdDisplayContainer_1( + returnValue: _FakeIMAAdDisplayContainer_2( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeIMAAdDisplayContainer_1( + returnValueForMissingStub: _FakeIMAAdDisplayContainer_2( this, Invocation.method( #pigeon_copy, @@ -104,6 +176,91 @@ class MockIMAAdDisplayContainer extends _i1.Mock ) as _i2.IMAAdDisplayContainer); } +/// A class which mocks [IMACompanionAdSlot]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockIMACompanionAdSlot extends _i1.Mock + implements _i2.IMACompanionAdSlot { + @override + _i2.UIView get view => (super.noSuchMethod( + Invocation.getter(#view), + returnValue: _FakeUIView_0( + this, + Invocation.getter(#view), + ), + returnValueForMissingStub: _FakeUIView_0( + this, + Invocation.getter(#view), + ), + ) as _i2.UIView); + + @override + _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( + Invocation.getter(#pigeon_instanceManager), + returnValue: _FakePigeonInstanceManager_1( + this, + Invocation.getter(#pigeon_instanceManager), + ), + returnValueForMissingStub: _FakePigeonInstanceManager_1( + this, + Invocation.getter(#pigeon_instanceManager), + ), + ) as _i2.PigeonInstanceManager); + + @override + _i3.Future setDelegate(_i2.IMACompanionDelegate? delegate) => + (super.noSuchMethod( + Invocation.method( + #setDelegate, + [delegate], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future width() => (super.noSuchMethod( + Invocation.method( + #width, + [], + ), + returnValue: _i3.Future.value(0), + returnValueForMissingStub: _i3.Future.value(0), + ) as _i3.Future); + + @override + _i3.Future height() => (super.noSuchMethod( + Invocation.method( + #height, + [], + ), + returnValue: _i3.Future.value(0), + returnValueForMissingStub: _i3.Future.value(0), + ) as _i3.Future); + + @override + _i2.IMACompanionAdSlot pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeIMACompanionAdSlot_3( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeIMACompanionAdSlot_3( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.IMACompanionAdSlot); +} + /// A class which mocks [UIView]. /// /// See the documentation for Mockito's code generation for more information. @@ -111,11 +268,11 @@ class MockUIView extends _i1.Mock implements _i2.UIView { @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), - returnValue: _FakePigeonInstanceManager_0( + returnValue: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), - returnValueForMissingStub: _FakePigeonInstanceManager_0( + returnValueForMissingStub: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), @@ -127,14 +284,14 @@ class MockUIView extends _i1.Mock implements _i2.UIView { #pigeon_copy, [], ), - returnValue: _FakeUIView_2( + returnValue: _FakeUIView_0( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeUIView_2( + returnValueForMissingStub: _FakeUIView_0( this, Invocation.method( #pigeon_copy, @@ -151,11 +308,11 @@ class MockUIViewController extends _i1.Mock implements _i2.UIViewController { @override _i2.UIView get view => (super.noSuchMethod( Invocation.getter(#view), - returnValue: _FakeUIView_2( + returnValue: _FakeUIView_0( this, Invocation.getter(#view), ), - returnValueForMissingStub: _FakeUIView_2( + returnValueForMissingStub: _FakeUIView_0( this, Invocation.getter(#view), ), @@ -164,11 +321,11 @@ class MockUIViewController extends _i1.Mock implements _i2.UIViewController { @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), - returnValue: _FakePigeonInstanceManager_0( + returnValue: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), - returnValueForMissingStub: _FakePigeonInstanceManager_0( + returnValueForMissingStub: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), @@ -180,14 +337,14 @@ class MockUIViewController extends _i1.Mock implements _i2.UIViewController { #pigeonVar_view, [], ), - returnValue: _FakeUIView_2( + returnValue: _FakeUIView_0( this, Invocation.method( #pigeonVar_view, [], ), ), - returnValueForMissingStub: _FakeUIView_2( + returnValueForMissingStub: _FakeUIView_0( this, Invocation.method( #pigeonVar_view, @@ -202,14 +359,14 @@ class MockUIViewController extends _i1.Mock implements _i2.UIViewController { #pigeon_copy, [], ), - returnValue: _FakeUIViewController_3( + returnValue: _FakeUIViewController_4( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeUIViewController_3( + returnValueForMissingStub: _FakeUIViewController_4( this, Invocation.method( #pigeon_copy, 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 633e96e9803..1934cb34977 100644 --- a/packages/interactive_media_ads/test/ios/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/ios/ads_loader_test.dart @@ -235,6 +235,7 @@ Future _pumpAdDisplayContainer( newIMAAdDisplayContainer: ({ required ima.UIView adContainer, ima.UIViewController? adContainerViewController, + List? companionSlots, }) => MockIMAAdDisplayContainer(), ); 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 a19db9487f1..786ae126a73 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 @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in interactive_media_ads/test/ios/ads_loader_test.dart. // Do not manually edit this file. @@ -17,14 +17,14 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types // ignore_for_file: subtype_of_sealed_class -class _FakePigeonInstanceManager_0 extends _i1.SmartFake - implements _i2.PigeonInstanceManager { - _FakePigeonInstanceManager_0( +class _FakeUIView_0 extends _i1.SmartFake implements _i2.UIView { + _FakeUIView_0( Object parent, Invocation parentInvocation, ) : super( @@ -33,9 +33,9 @@ class _FakePigeonInstanceManager_0 extends _i1.SmartFake ); } -class _FakeIMAAdDisplayContainer_1 extends _i1.SmartFake - implements _i2.IMAAdDisplayContainer { - _FakeIMAAdDisplayContainer_1( +class _FakePigeonInstanceManager_1 extends _i1.SmartFake + implements _i2.PigeonInstanceManager { + _FakePigeonInstanceManager_1( Object parent, Invocation parentInvocation, ) : super( @@ -44,8 +44,9 @@ class _FakeIMAAdDisplayContainer_1 extends _i1.SmartFake ); } -class _FakeIMAAdsLoader_2 extends _i1.SmartFake implements _i2.IMAAdsLoader { - _FakeIMAAdsLoader_2( +class _FakeIMAAdDisplayContainer_2 extends _i1.SmartFake + implements _i2.IMAAdDisplayContainer { + _FakeIMAAdDisplayContainer_2( Object parent, Invocation parentInvocation, ) : super( @@ -54,9 +55,8 @@ class _FakeIMAAdsLoader_2 extends _i1.SmartFake implements _i2.IMAAdsLoader { ); } -class _FakeIMAAdsLoaderDelegate_3 extends _i1.SmartFake - implements _i2.IMAAdsLoaderDelegate { - _FakeIMAAdsLoaderDelegate_3( +class _FakeIMAAdsLoader_3 extends _i1.SmartFake implements _i2.IMAAdsLoader { + _FakeIMAAdsLoader_3( Object parent, Invocation parentInvocation, ) : super( @@ -65,8 +65,9 @@ class _FakeIMAAdsLoaderDelegate_3 extends _i1.SmartFake ); } -class _FakeIMAAdsManager_4 extends _i1.SmartFake implements _i2.IMAAdsManager { - _FakeIMAAdsManager_4( +class _FakeIMAAdsLoaderDelegate_4 extends _i1.SmartFake + implements _i2.IMAAdsLoaderDelegate { + _FakeIMAAdsLoaderDelegate_4( Object parent, Invocation parentInvocation, ) : super( @@ -75,8 +76,8 @@ class _FakeIMAAdsManager_4 extends _i1.SmartFake implements _i2.IMAAdsManager { ); } -class _FakeIMAAdsRequest_5 extends _i1.SmartFake implements _i2.IMAAdsRequest { - _FakeIMAAdsRequest_5( +class _FakeIMAAdsManager_5 extends _i1.SmartFake implements _i2.IMAAdsManager { + _FakeIMAAdsManager_5( Object parent, Invocation parentInvocation, ) : super( @@ -85,8 +86,8 @@ class _FakeIMAAdsRequest_5 extends _i1.SmartFake implements _i2.IMAAdsRequest { ); } -class _FakeUIView_6 extends _i1.SmartFake implements _i2.UIView { - _FakeUIView_6( +class _FakeIMAAdsRequest_6 extends _i1.SmartFake implements _i2.IMAAdsRequest { + _FakeIMAAdsRequest_6( Object parent, Invocation parentInvocation, ) : super( @@ -112,32 +113,90 @@ class _FakeUIViewController_7 extends _i1.SmartFake class MockIMAAdDisplayContainer extends _i1.Mock implements _i2.IMAAdDisplayContainer { @override + _i2.UIView get adContainer => (super.noSuchMethod( + Invocation.getter(#adContainer), + returnValue: _FakeUIView_0( + this, + Invocation.getter(#adContainer), + ), + returnValueForMissingStub: _FakeUIView_0( + this, + Invocation.getter(#adContainer), + ), + ) as _i2.UIView); + + @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), - returnValue: _FakePigeonInstanceManager_0( + returnValue: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), - returnValueForMissingStub: _FakePigeonInstanceManager_0( + returnValueForMissingStub: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), ) as _i2.PigeonInstanceManager); + @override + _i3.Future setAdContainerViewController( + _i2.UIViewController? controller) => + (super.noSuchMethod( + Invocation.method( + #setAdContainerViewController, + [controller], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future<_i2.UIViewController?> getAdContainerViewController() => + (super.noSuchMethod( + Invocation.method( + #getAdContainerViewController, + [], + ), + returnValue: _i3.Future<_i2.UIViewController?>.value(), + returnValueForMissingStub: _i3.Future<_i2.UIViewController?>.value(), + ) as _i3.Future<_i2.UIViewController?>); + + @override + _i3.Future registerFriendlyObstruction( + _i2.IMAFriendlyObstruction? friendlyObstruction) => + (super.noSuchMethod( + Invocation.method( + #registerFriendlyObstruction, + [friendlyObstruction], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future unregisterAllFriendlyObstructions() => (super.noSuchMethod( + Invocation.method( + #unregisterAllFriendlyObstructions, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override _i2.IMAAdDisplayContainer pigeon_copy() => (super.noSuchMethod( Invocation.method( #pigeon_copy, [], ), - returnValue: _FakeIMAAdDisplayContainer_1( + returnValue: _FakeIMAAdDisplayContainer_2( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeIMAAdDisplayContainer_1( + returnValueForMissingStub: _FakeIMAAdDisplayContainer_2( this, Invocation.method( #pigeon_copy, @@ -154,11 +213,11 @@ class MockIMAAdsLoader extends _i1.Mock implements _i2.IMAAdsLoader { @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), - returnValue: _FakePigeonInstanceManager_0( + returnValue: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), - returnValueForMissingStub: _FakePigeonInstanceManager_0( + returnValueForMissingStub: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), @@ -202,14 +261,14 @@ class MockIMAAdsLoader extends _i1.Mock implements _i2.IMAAdsLoader { #pigeon_copy, [], ), - returnValue: _FakeIMAAdsLoader_2( + returnValue: _FakeIMAAdsLoader_3( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeIMAAdsLoader_2( + returnValueForMissingStub: _FakeIMAAdsLoader_3( this, Invocation.method( #pigeon_copy, @@ -273,11 +332,11 @@ class MockIMAAdsLoaderDelegate extends _i1.Mock @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), - returnValue: _FakePigeonInstanceManager_0( + returnValue: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), - returnValueForMissingStub: _FakePigeonInstanceManager_0( + returnValueForMissingStub: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), @@ -289,14 +348,14 @@ class MockIMAAdsLoaderDelegate extends _i1.Mock #pigeon_copy, [], ), - returnValue: _FakeIMAAdsLoaderDelegate_3( + returnValue: _FakeIMAAdsLoaderDelegate_4( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeIMAAdsLoaderDelegate_3( + returnValueForMissingStub: _FakeIMAAdsLoaderDelegate_4( this, Invocation.method( #pigeon_copy, @@ -313,11 +372,11 @@ class MockIMAAdsManager extends _i1.Mock implements _i2.IMAAdsManager { @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), - returnValue: _FakePigeonInstanceManager_0( + returnValue: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), - returnValueForMissingStub: _FakePigeonInstanceManager_0( + returnValueForMissingStub: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), @@ -412,14 +471,14 @@ class MockIMAAdsManager extends _i1.Mock implements _i2.IMAAdsManager { #pigeon_copy, [], ), - returnValue: _FakeIMAAdsManager_4( + returnValue: _FakeIMAAdsManager_5( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeIMAAdsManager_4( + returnValueForMissingStub: _FakeIMAAdsManager_5( this, Invocation.method( #pigeon_copy, @@ -436,11 +495,11 @@ class MockIMAAdsRequest extends _i1.Mock implements _i2.IMAAdsRequest { @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), - returnValue: _FakePigeonInstanceManager_0( + returnValue: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), - returnValueForMissingStub: _FakePigeonInstanceManager_0( + returnValueForMissingStub: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), @@ -452,14 +511,14 @@ class MockIMAAdsRequest extends _i1.Mock implements _i2.IMAAdsRequest { #pigeon_copy, [], ), - returnValue: _FakeIMAAdsRequest_5( + returnValue: _FakeIMAAdsRequest_6( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeIMAAdsRequest_5( + returnValueForMissingStub: _FakeIMAAdsRequest_6( this, Invocation.method( #pigeon_copy, @@ -476,11 +535,11 @@ class MockUIView extends _i1.Mock implements _i2.UIView { @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), - returnValue: _FakePigeonInstanceManager_0( + returnValue: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), - returnValueForMissingStub: _FakePigeonInstanceManager_0( + returnValueForMissingStub: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), @@ -492,14 +551,14 @@ class MockUIView extends _i1.Mock implements _i2.UIView { #pigeon_copy, [], ), - returnValue: _FakeUIView_6( + returnValue: _FakeUIView_0( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeUIView_6( + returnValueForMissingStub: _FakeUIView_0( this, Invocation.method( #pigeon_copy, @@ -516,11 +575,11 @@ class MockUIViewController extends _i1.Mock implements _i2.UIViewController { @override _i2.UIView get view => (super.noSuchMethod( Invocation.getter(#view), - returnValue: _FakeUIView_6( + returnValue: _FakeUIView_0( this, Invocation.getter(#view), ), - returnValueForMissingStub: _FakeUIView_6( + returnValueForMissingStub: _FakeUIView_0( this, Invocation.getter(#view), ), @@ -529,11 +588,11 @@ class MockUIViewController extends _i1.Mock implements _i2.UIViewController { @override _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( Invocation.getter(#pigeon_instanceManager), - returnValue: _FakePigeonInstanceManager_0( + returnValue: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), - returnValueForMissingStub: _FakePigeonInstanceManager_0( + returnValueForMissingStub: _FakePigeonInstanceManager_1( this, Invocation.getter(#pigeon_instanceManager), ), @@ -545,14 +604,14 @@ class MockUIViewController extends _i1.Mock implements _i2.UIViewController { #pigeonVar_view, [], ), - returnValue: _FakeUIView_6( + returnValue: _FakeUIView_0( this, Invocation.method( #pigeonVar_view, [], ), ), - returnValueForMissingStub: _FakeUIView_6( + returnValueForMissingStub: _FakeUIView_0( this, Invocation.method( #pigeonVar_view, diff --git a/packages/interactive_media_ads/test/ios/ads_manager_test.mocks.dart b/packages/interactive_media_ads/test/ios/ads_manager_test.mocks.dart index 7214de1d0a5..6b6b945c09c 100644 --- a/packages/interactive_media_ads/test/ios/ads_manager_test.mocks.dart +++ b/packages/interactive_media_ads/test/ios/ads_manager_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in interactive_media_ads/test/ios/ads_manager_test.dart. // Do not manually edit this file. @@ -17,6 +17,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/packages/interactive_media_ads/test/ios/companion_ad_slot_test.dart b/packages/interactive_media_ads/test/ios/companion_ad_slot_test.dart new file mode 100644 index 00000000000..750001baa68 --- /dev/null +++ b/packages/interactive_media_ads/test/ios/companion_ad_slot_test.dart @@ -0,0 +1,102 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:interactive_media_ads/src/ios/interactive_media_ads.g.dart'; +import 'package:interactive_media_ads/src/ios/interactive_media_ads_proxy.dart'; +import 'package:interactive_media_ads/src/ios/ios_companion_ad_slot.dart'; +import 'package:interactive_media_ads/src/platform_interface/companion_ad_slot_size.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'companion_ad_slot_test.mocks.dart'; + +@GenerateNiceMocks(>[ + MockSpec(), +]) +void main() { + group('IOSCompanionAdSlot', () { + test('instantiate CompanionAdSlot with size', () async { + final MockIMACompanionAdSlot mockCompanionAdSlot = + MockIMACompanionAdSlot(); + final IOSCompanionAdSlotCreationParams params = + IOSCompanionAdSlotCreationParams( + size: CompanionAdSlotSize.fixed(width: 300, height: 400), + proxy: InteractiveMediaAdsProxy( + sizeIMACompanionAdSlot: ({ + required int width, + required int height, + required UIView view, + }) { + expect(width, 300); + expect(height, 400); + return mockCompanionAdSlot; + }, + newUIView: () { + return UIView.pigeon_detached( + pigeon_instanceManager: _TestInstanceManager(), + ); + }, + ), + ); + + final IOSCompanionAdSlot adSlot = IOSCompanionAdSlot(params); + expect(adSlot.nativeCompanionAdSlot, mockCompanionAdSlot); + }); + + test('IOSCompanionAdSlot receives onClick', () async { + final MockIMACompanionAdSlot mockCompanionAdSlot = + MockIMACompanionAdSlot(); + final IOSCompanionAdSlotCreationParams params = + IOSCompanionAdSlotCreationParams( + size: CompanionAdSlotSize.fixed(width: 300, height: 400), + onClicked: expectAsync0(() {}), + proxy: InteractiveMediaAdsProxy( + sizeIMACompanionAdSlot: ({ + required int width, + required int height, + required UIView view, + }) { + return mockCompanionAdSlot; + }, + newUIView: () { + return UIView.pigeon_detached( + pigeon_instanceManager: _TestInstanceManager(), + ); + }, + newIMACompanionDelegate: ({ + void Function( + IMACompanionDelegate, + IMACompanionAdSlot, + bool, + )? companionAdSlotFilled, + void Function( + IMACompanionDelegate, + IMACompanionAdSlot, + )? companionSlotWasClicked, + }) { + return IMACompanionDelegate.pigeon_detached( + companionAdSlotFilled: companionAdSlotFilled, + companionSlotWasClicked: companionSlotWasClicked, + pigeon_instanceManager: _TestInstanceManager(), + ); + }, + ), + ); + + final IOSCompanionAdSlot adSlot = IOSCompanionAdSlot(params); + expect(adSlot.nativeCompanionAdSlot, mockCompanionAdSlot); + + final IMACompanionDelegate delegate = + verify(mockCompanionAdSlot.setDelegate(captureAny)).captured.single + as IMACompanionDelegate; + + delegate.companionSlotWasClicked!(delegate, adSlot.nativeCompanionAdSlot); + }); + }); +} + +class _TestInstanceManager extends PigeonInstanceManager { + _TestInstanceManager() : super(onWeakReferenceRemoved: (_) {}); +} diff --git a/packages/interactive_media_ads/test/ios/companion_ad_slot_test.mocks.dart b/packages/interactive_media_ads/test/ios/companion_ad_slot_test.mocks.dart new file mode 100644 index 00000000000..ba82b9c8de8 --- /dev/null +++ b/packages/interactive_media_ads/test/ios/companion_ad_slot_test.mocks.dart @@ -0,0 +1,141 @@ +// Mocks generated by Mockito 5.4.6 from annotations +// in interactive_media_ads/test/ios/companion_ad_slot_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i3; + +import 'package:interactive_media_ads/src/ios/interactive_media_ads.g.dart' + as _i2; +import 'package:mockito/mockito.dart' as _i1; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeUIView_0 extends _i1.SmartFake implements _i2.UIView { + _FakeUIView_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakePigeonInstanceManager_1 extends _i1.SmartFake + implements _i2.PigeonInstanceManager { + _FakePigeonInstanceManager_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeIMACompanionAdSlot_2 extends _i1.SmartFake + implements _i2.IMACompanionAdSlot { + _FakeIMACompanionAdSlot_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [IMACompanionAdSlot]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockIMACompanionAdSlot extends _i1.Mock + implements _i2.IMACompanionAdSlot { + @override + _i2.UIView get view => (super.noSuchMethod( + Invocation.getter(#view), + returnValue: _FakeUIView_0( + this, + Invocation.getter(#view), + ), + returnValueForMissingStub: _FakeUIView_0( + this, + Invocation.getter(#view), + ), + ) as _i2.UIView); + + @override + _i2.PigeonInstanceManager get pigeon_instanceManager => (super.noSuchMethod( + Invocation.getter(#pigeon_instanceManager), + returnValue: _FakePigeonInstanceManager_1( + this, + Invocation.getter(#pigeon_instanceManager), + ), + returnValueForMissingStub: _FakePigeonInstanceManager_1( + this, + Invocation.getter(#pigeon_instanceManager), + ), + ) as _i2.PigeonInstanceManager); + + @override + _i3.Future setDelegate(_i2.IMACompanionDelegate? delegate) => + (super.noSuchMethod( + Invocation.method( + #setDelegate, + [delegate], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future width() => (super.noSuchMethod( + Invocation.method( + #width, + [], + ), + returnValue: _i3.Future.value(0), + returnValueForMissingStub: _i3.Future.value(0), + ) as _i3.Future); + + @override + _i3.Future height() => (super.noSuchMethod( + Invocation.method( + #height, + [], + ), + returnValue: _i3.Future.value(0), + returnValueForMissingStub: _i3.Future.value(0), + ) as _i3.Future); + + @override + _i2.IMACompanionAdSlot pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeIMACompanionAdSlot_2( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeIMACompanionAdSlot_2( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.IMACompanionAdSlot); +} diff --git a/packages/interactive_media_ads/test/ios/content_progress_provider_test.mocks.dart b/packages/interactive_media_ads/test/ios/content_progress_provider_test.mocks.dart index a82fb3fbade..cdb10245a4f 100644 --- a/packages/interactive_media_ads/test/ios/content_progress_provider_test.mocks.dart +++ b/packages/interactive_media_ads/test/ios/content_progress_provider_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.4 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in interactive_media_ads/test/ios/content_progress_provider_test.dart. // Do not manually edit this file. @@ -17,6 +17,7 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types diff --git a/packages/interactive_media_ads/test/test_stubs.dart b/packages/interactive_media_ads/test/test_stubs.dart index ff3ae451215..e8c9964a597 100644 --- a/packages/interactive_media_ads/test/test_stubs.dart +++ b/packages/interactive_media_ads/test/test_stubs.dart @@ -13,6 +13,7 @@ final class TestInteractiveMediaAdsPlatform required this.onCreatePlatformAdDisplayContainer, required this.onCreatePlatformContentProgressProvider, this.onCreatePlatformAdsRenderingSettings, + this.onCreatePlatformCompanionAdSlot, }); PlatformAdsLoader Function(PlatformAdsLoaderCreationParams params) @@ -34,6 +35,10 @@ final class TestInteractiveMediaAdsPlatform PlatformAdsRenderingSettingsCreationParams params, )? onCreatePlatformAdsRenderingSettings; + PlatformCompanionAdSlot Function( + PlatformCompanionAdSlotCreationParams params, + )? onCreatePlatformCompanionAdSlot; + @override PlatformAdsLoader createPlatformAdsLoader( PlatformAdsLoaderCreationParams params, @@ -69,6 +74,17 @@ final class TestInteractiveMediaAdsPlatform return onCreatePlatformAdsRenderingSettings?.call(params) ?? TestAdsRenderingSettings(params); } + + @override + PlatformCompanionAdSlot createPlatformCompanionAdSlot( + PlatformCompanionAdSlotCreationParams params, + ) { + return onCreatePlatformCompanionAdSlot?.call(params) ?? + TestCompanionAdSlot( + params, + onBuildWidget: (_) => Container(), + ); + } } final class TestPlatformAdDisplayContainer extends PlatformAdDisplayContainer { @@ -81,7 +97,7 @@ final class TestPlatformAdDisplayContainer extends PlatformAdDisplayContainer { @override Widget build(BuildContext context) { - return onBuild.call(context); + return onBuild(context); } } @@ -206,3 +222,17 @@ class TestContentProgressProvider extends PlatformContentProgressProvider { final class TestAdsRenderingSettings extends PlatformAdsRenderingSettings { TestAdsRenderingSettings(super.params) : super.implementation(); } + +final class TestCompanionAdSlot extends PlatformCompanionAdSlot { + TestCompanionAdSlot( + super.params, { + required this.onBuildWidget, + }) : super.implementation(); + + Widget Function(BuildWidgetCreationParams params) onBuildWidget; + + @override + Widget buildWidget(BuildWidgetCreationParams params) { + return onBuildWidget(params); + } +}