diff --git a/packages/interactive_media_ads/CHANGELOG.md b/packages/interactive_media_ads/CHANGELOG.md index 9220cc30a88..6d70b9d3425 100644 --- a/packages/interactive_media_ads/CHANGELOG.md +++ b/packages/interactive_media_ads/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.5 + +* Adds support to set general SDK settings. See `ImaSettings` and `AdsLoader.settings`. + ## 0.2.4+2 * Bumps gradle from 8.9.0 to 8.11.1. 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 0ca9b70e286..e791cc7cbe0 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.4+2" + const val pluginVersion = "0.2.5" } 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/InteractiveMediaAdsLibrary.g.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt index eaf4a77c1c7..25faa199418 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.5.0), do not edit directly. +// Autogenerated from Pigeon (v26.0.0), do not edit directly. // See also: https://pub.dev/packages/pigeon @file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") 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 06920e5ec5b..e65e1041bac 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.4+2" + static let pluginVersion = "0.2.5" func pigeonDefaultConstructor( pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer, 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 4a2d1684c0d..f283a3b6773 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 (v25.5.0), do not edit directly. +// Autogenerated from Pigeon (v26.0.0), do not edit directly. // See also: https://pub.dev/packages/pigeon import Foundation diff --git a/packages/interactive_media_ads/lib/interactive_media_ads.dart b/packages/interactive_media_ads/lib/interactive_media_ads.dart index 99948a8ccb6..40fb2842ff1 100644 --- a/packages/interactive_media_ads/lib/interactive_media_ads.dart +++ b/packages/interactive_media_ads/lib/interactive_media_ads.dart @@ -11,6 +11,7 @@ export 'src/android/android_interactive_media_ads.dart' show AndroidInteractiveMediaAds; export 'src/companion_ad_slot.dart'; export 'src/content_progress_provider.dart'; +export 'src/ima_settings.dart'; export 'src/ios/ios_interactive_media_ads.dart' show IOSInteractiveMediaAds; export 'src/platform_interface/platform_interface.dart' show diff --git a/packages/interactive_media_ads/lib/src/ads_loader.dart b/packages/interactive_media_ads/lib/src/ads_loader.dart index 4d05b6db34d..6855810c054 100644 --- a/packages/interactive_media_ads/lib/src/ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/ads_loader.dart @@ -8,6 +8,7 @@ import 'ad_display_container.dart'; import 'ads_manager_delegate.dart'; import 'ads_rendering_settings.dart'; import 'ads_request.dart'; +import 'ima_settings.dart'; import 'platform_interface/platform_interface.dart'; /// Allows publishers to request ads from ad servers or a dynamic ad insertion @@ -42,9 +43,11 @@ class AdsLoader { required AdDisplayContainer container, required void Function(OnAdsLoadedData data) onAdsLoaded, required void Function(AdsLoadErrorData data) onAdsLoadError, + ImaSettings? settings, }) : this.fromPlatformCreationParams( PlatformAdsLoaderCreationParams( container: container.platform, + settings: settings?.platform ?? ImaSettings().platform, onAdsLoaded: (PlatformOnAdsLoadedData data) { onAdsLoaded(OnAdsLoadedData._(platform: data)); }, @@ -89,6 +92,10 @@ class AdsLoader { /// Implementation of [PlatformAdsLoader] for the current platform. final PlatformAdsLoader platform; + /// Defines general SDK settings. + ImaSettings get settings => + ImaSettings.fromPlatform(platform.params.settings); + /// Signals to the SDK that the content has completed. Future contentComplete() { return platform.contentComplete(); diff --git a/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart b/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart index 2ccbd4b62e0..b0e0902f086 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ads_loader.dart @@ -10,6 +10,7 @@ import '../platform_interface/platform_interface.dart'; import 'android_ad_display_container.dart'; import 'android_ads_manager.dart'; import 'android_content_progress_provider.dart'; +import 'android_ima_settings.dart'; import 'enum_converter_utils.dart'; import 'interactive_media_ads.g.dart' as ima; import 'interactive_media_ads_proxy.dart'; @@ -19,6 +20,7 @@ final class AndroidAdsLoaderCreationParams extends PlatformAdsLoaderCreationParams { /// Constructs a [AndroidAdsLoaderCreationParams]. const AndroidAdsLoaderCreationParams({ + required super.settings, required super.container, required super.onAdsLoaded, required super.onAdsLoadError, @@ -33,6 +35,7 @@ final class AndroidAdsLoaderCreationParams @visibleForTesting InteractiveMediaAdsProxy? proxy, }) { return AndroidAdsLoaderCreationParams( + settings: params.settings, container: params.container, onAdsLoaded: params.onAdsLoaded, onAdsLoadError: params.onAdsLoadError, @@ -97,11 +100,13 @@ base class AndroidAdsLoader extends PlatformAdsLoader { } Future _createAdsLoader() async { - final ima.ImaSdkSettings settings = - await _sdkFactory.createImaSdkSettings(); + final AndroidImaSettings settings = switch (_androidParams.settings) { + final AndroidImaSettings androidSettings => androidSettings, + _ => AndroidImaSettings(_androidParams.settings.params), + }; final ima.AdsLoader adsLoader = await _sdkFactory.createAdsLoader( - settings, + await settings.nativeSettingsFuture, (params.container as AndroidAdDisplayContainer).adDisplayContainer!, ); diff --git a/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart b/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart new file mode 100644 index 00000000000..f3554909a1b --- /dev/null +++ b/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart @@ -0,0 +1,79 @@ +// 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:meta/meta.dart'; + +import '../platform_interface/platform_ima_settings.dart'; +import 'interactive_media_ads.g.dart'; + +/// Android implementation of [PlatformImaSettings]. +final class AndroidImaSettings extends PlatformImaSettings { + /// Constructs an [AndroidImaSettings]. + AndroidImaSettings(super.params) : super.implementation(); + + /// The native Android ImaSdkSettings. + /// + /// Defines general SDK settings that are used when creating an `AdsLoader`. + @internal + late final Future nativeSettingsFuture = _createSettings(); + + @override + Future setAutoPlayAdBreaks(bool autoPlayAdBreaks) async { + final ImaSdkSettings settings = await nativeSettingsFuture; + await settings.setAutoPlayAdBreaks(autoPlayAdBreaks); + } + + @override + Future setDebugMode(bool enabled) async { + final ImaSdkSettings settings = await nativeSettingsFuture; + await settings.setDebugMode(enabled); + } + + @override + Future setFeatureFlags(Map featureFlags) async { + final ImaSdkSettings settings = await nativeSettingsFuture; + await settings.setFeatureFlags(featureFlags); + } + + @override + Future setMaxRedirects(int maxRedirects) async { + final ImaSdkSettings settings = await nativeSettingsFuture; + await settings.setMaxRedirects(maxRedirects); + } + + @override + Future setPlayerType(String playerType) async { + final ImaSdkSettings settings = await nativeSettingsFuture; + await settings.setPlayerType(playerType); + } + + @override + Future setPlayerVersion(String playerVersion) async { + final ImaSdkSettings settings = await nativeSettingsFuture; + await settings.setPlayerVersion(playerVersion); + } + + @override + Future setPpid(String ppid) async { + final ImaSdkSettings settings = await nativeSettingsFuture; + await settings.setPpid(ppid); + } + + @override + Future setSessionID(String sessionID) async { + final ImaSdkSettings settings = await nativeSettingsFuture; + await settings.setSessionId(sessionID); + } + + Future _createSettings() async { + final ImaSdkSettings settings = + await ImaSdkFactory.instance.createImaSdkSettings(); + if (params.language case final String language) { + await settings.setLanguage(language); + } + return settings; + } +} 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 b6f59eb081a..ddf4280caea 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 @@ -9,12 +9,14 @@ 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 '../platform_interface/platform_ima_settings.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'; +import 'android_ima_settings.dart'; /// Android implementation of [InteractiveMediaAdsPlatform]. final class AndroidInteractiveMediaAds extends InteractiveMediaAdsPlatform { @@ -24,28 +26,28 @@ final class AndroidInteractiveMediaAds extends InteractiveMediaAdsPlatform { } @override - PlatformAdDisplayContainer createPlatformAdDisplayContainer( + AndroidAdDisplayContainer createPlatformAdDisplayContainer( PlatformAdDisplayContainerCreationParams params, ) { return AndroidAdDisplayContainer(params); } @override - PlatformAdsLoader createPlatformAdsLoader( + AndroidAdsLoader createPlatformAdsLoader( PlatformAdsLoaderCreationParams params, ) { return AndroidAdsLoader(params); } @override - PlatformAdsManagerDelegate createPlatformAdsManagerDelegate( + AndroidAdsManagerDelegate createPlatformAdsManagerDelegate( PlatformAdsManagerDelegateCreationParams params, ) { return AndroidAdsManagerDelegate(params); } @override - PlatformContentProgressProvider createPlatformContentProgressProvider( + AndroidContentProgressProvider createPlatformContentProgressProvider( PlatformContentProgressProviderCreationParams params, ) { return AndroidContentProgressProvider(params); @@ -64,4 +66,11 @@ final class AndroidInteractiveMediaAds extends InteractiveMediaAdsPlatform { ) { return AndroidCompanionAdSlot(params); } + + @override + AndroidImaSettings createPlatformImaSettings( + PlatformImaSettingsCreationParams params, + ) { + return AndroidImaSettings(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 9b3946995c5..ab07c7a8cb2 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.5.0), do not edit directly. +// Autogenerated from Pigeon (v26.0.0), 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 @@ -10,7 +10,7 @@ import 'dart:io' show Platform; import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; import 'package:flutter/foundation.dart' - show ReadBuffer, WriteBuffer, immutable, protected; + show ReadBuffer, WriteBuffer, immutable, protected, visibleForTesting; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart' show WidgetsFlutterBinding; @@ -32,6 +32,130 @@ List wrapResponse( return [error.code, error.message, error.details]; } +/// Provides overrides for the constructors and static members of each proxy +/// API. +/// +/// This is only intended to be used with unit tests to prevent errors from +/// making message calls in a unit test. +/// +/// See [PigeonOverrides.pigeon_reset] to set all overrides back to null. +@visibleForTesting +class PigeonOverrides { + /// Overrides [ContentProgressProvider.new]. + static ContentProgressProvider Function()? contentProgressProvider_new; + + /// Overrides [VideoProgressUpdate.new]. + static VideoProgressUpdate Function({ + required int currentTimeMs, + required int durationMs, + })? videoProgressUpdate_new; + + /// Overrides [FrameLayout.new]. + static FrameLayout Function()? frameLayout_new; + + /// Overrides [VideoView.new]. + static VideoView Function({ + required void Function( + VideoView pigeon_instance, + MediaPlayer player, + int what, + int extra, + ) onError, + void Function( + VideoView pigeon_instance, + MediaPlayer player, + )? onPrepared, + void Function( + VideoView pigeon_instance, + MediaPlayer player, + )? onCompletion, + })? videoView_new; + + /// Overrides [VideoAdPlayer.new]. + static VideoAdPlayer Function({ + required void Function( + VideoAdPlayer pigeon_instance, + VideoAdPlayerCallback callback, + ) addCallback, + required void Function( + VideoAdPlayer pigeon_instance, + AdMediaInfo adMediaInfo, + AdPodInfo adPodInfo, + ) loadAd, + required void Function( + VideoAdPlayer pigeon_instance, + AdMediaInfo adMediaInfo, + ) pauseAd, + required void Function( + VideoAdPlayer pigeon_instance, + AdMediaInfo adMediaInfo, + ) playAd, + required void Function(VideoAdPlayer pigeon_instance) release, + required void Function( + VideoAdPlayer pigeon_instance, + VideoAdPlayerCallback callback, + ) removeCallback, + required void Function( + VideoAdPlayer pigeon_instance, + AdMediaInfo adMediaInfo, + ) stopAd, + })? videoAdPlayer_new; + + /// Overrides [AdsLoadedListener.new]. + static AdsLoadedListener Function( + {required void Function( + AdsLoadedListener pigeon_instance, + AdsManagerLoadedEvent event, + ) onAdsManagerLoaded})? adsLoadedListener_new; + + /// Overrides [AdErrorListener.new]. + static AdErrorListener Function( + {required void Function( + AdErrorListener pigeon_instance, + AdErrorEvent event, + ) onAdError})? adErrorListener_new; + + /// Overrides [AdEventListener.new]. + static AdEventListener Function( + {required void Function( + AdEventListener pigeon_instance, + AdEvent event, + ) onAdEvent})? adEventListener_new; + + /// Overrides [CompanionAdSlotClickListener.new]. + static CompanionAdSlotClickListener Function( + {required void Function(CompanionAdSlotClickListener pigeon_instance) + onCompanionAdClick})? companionAdSlotClickListener_new; + + /// Overrides [ImaSdkFactory.instance]. + static ImaSdkFactory? imaSdkFactory_instance; + + /// Overrides [VideoProgressUpdate.videoTimeNotReady]. + static VideoProgressUpdate? videoProgressUpdate_videoTimeNotReady; + + /// Overrides [ImaSdkFactory.createAdDisplayContainer]. + static Future Function( + ViewGroup, + VideoAdPlayer, + )? imaSdkFactory_createAdDisplayContainer; + + /// Sets all overridden ProxyApi class members to null. + static void pigeon_reset() { + contentProgressProvider_new = null; + imaSdkFactory_instance = null; + imaSdkFactory_createAdDisplayContainer = null; + videoProgressUpdate_new = null; + videoProgressUpdate_videoTimeNotReady = null; + frameLayout_new = null; + videoView_new = null; + videoAdPlayer_new = null; + adsLoadedListener_new = null; + adErrorListener_new = null; + adEventListener_new = null; + companionAdSlotClickListener_new = null; + } +} + /// An immutable object that serves as the base class for all ProxyApis and /// can provide functional copies of itself. /// @@ -1483,7 +1607,21 @@ class AdsRequest extends PigeonInternalProxyApiBaseClass { /// /// See https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/android/api/reference/com/google/ads/interactivemedia/v3/api/player/ContentProgressProvider.html. class ContentProgressProvider extends PigeonInternalProxyApiBaseClass { - ContentProgressProvider({ + factory ContentProgressProvider({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + }) { + if (PigeonOverrides.contentProgressProvider_new != null) { + return PigeonOverrides.contentProgressProvider_new!(); + } + return ContentProgressProvider.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + ); + } + + @protected + ContentProgressProvider.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, }) { @@ -2347,7 +2485,10 @@ class ImaSdkFactory extends PigeonInternalProxyApiBaseClass { late final _PigeonInternalProxyApiBaseCodec _pigeonVar_codecImaSdkFactory = _PigeonInternalProxyApiBaseCodec(pigeon_instanceManager); - static final ImaSdkFactory instance = pigeonVar_instance(); + static final ImaSdkFactory _instance = pigeonVar_instance(); + + static ImaSdkFactory get instance => + PigeonOverrides.imaSdkFactory_instance ?? _instance; static void pigeon_setUpMessageHandlers({ bool pigeon_clearHandlers = false, @@ -2440,6 +2581,12 @@ class ImaSdkFactory extends PigeonInternalProxyApiBaseClass { BinaryMessenger? pigeon_binaryMessenger, PigeonInstanceManager? pigeon_instanceManager, }) async { + if (PigeonOverrides.imaSdkFactory_createAdDisplayContainer != null) { + return PigeonOverrides.imaSdkFactory_createAdDisplayContainer!( + container, + player, + ); + } final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _PigeonInternalProxyApiBaseCodec( pigeon_instanceManager ?? PigeonInstanceManager.instance); @@ -3033,7 +3180,28 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/player/VideoProgressUpdate.html. class VideoProgressUpdate extends PigeonInternalProxyApiBaseClass { - VideoProgressUpdate({ + factory VideoProgressUpdate({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required int currentTimeMs, + required int durationMs, + }) { + if (PigeonOverrides.videoProgressUpdate_new != null) { + return PigeonOverrides.videoProgressUpdate_new!( + currentTimeMs: currentTimeMs, + durationMs: durationMs, + ); + } + return VideoProgressUpdate.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + currentTimeMs: currentTimeMs, + durationMs: durationMs, + ); + } + + @protected + VideoProgressUpdate.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required int currentTimeMs, @@ -3087,9 +3255,15 @@ class VideoProgressUpdate extends PigeonInternalProxyApiBaseClass { /// Value to use for cases when progress is not yet defined, such as video /// initialization. - static final VideoProgressUpdate videoTimeNotReady = + static final VideoProgressUpdate _videoTimeNotReady = pigeonVar_videoTimeNotReady(); + /// Value to use for cases when progress is not yet defined, such as video + /// initialization. + static VideoProgressUpdate get videoTimeNotReady => + PigeonOverrides.videoProgressUpdate_videoTimeNotReady ?? + _videoTimeNotReady; + static void pigeon_setUpMessageHandlers({ bool pigeon_clearHandlers = false, BinaryMessenger? pigeon_binaryMessenger, @@ -3418,7 +3592,21 @@ class AdPodInfo extends PigeonInternalProxyApiBaseClass { /// /// See https://developer.android.com/reference/android/widget/FrameLayout. class FrameLayout extends ViewGroup { - FrameLayout({ + factory FrameLayout({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + }) { + if (PigeonOverrides.frameLayout_new != null) { + return PigeonOverrides.frameLayout_new!(); + } + return FrameLayout.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + ); + } + + @protected + FrameLayout.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, }) : super.pigeon_detached() { @@ -3666,7 +3854,42 @@ class ViewGroup extends View { /// /// See https://developer.android.com/reference/android/widget/VideoView. class VideoView extends View { - VideoView({ + factory VideoView({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + void Function( + VideoView pigeon_instance, + MediaPlayer player, + )? onPrepared, + void Function( + VideoView pigeon_instance, + MediaPlayer player, + )? onCompletion, + required void Function( + VideoView pigeon_instance, + MediaPlayer player, + int what, + int extra, + ) onError, + }) { + if (PigeonOverrides.videoView_new != null) { + return PigeonOverrides.videoView_new!( + onPrepared: onPrepared, + onCompletion: onCompletion, + onError: onError, + ); + } + return VideoView.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + onPrepared: onPrepared, + onCompletion: onCompletion, + onError: onError, + ); + } + + @protected + VideoView.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, this.onPrepared, @@ -4694,7 +4917,62 @@ class VideoAdPlayerCallback extends PigeonInternalProxyApiBaseClass { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/player/VideoAdPlayer.html. class VideoAdPlayer extends PigeonInternalProxyApiBaseClass { - VideoAdPlayer({ + factory VideoAdPlayer({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required void Function( + VideoAdPlayer pigeon_instance, + VideoAdPlayerCallback callback, + ) addCallback, + required void Function( + VideoAdPlayer pigeon_instance, + AdMediaInfo adMediaInfo, + AdPodInfo adPodInfo, + ) loadAd, + required void Function( + VideoAdPlayer pigeon_instance, + AdMediaInfo adMediaInfo, + ) pauseAd, + required void Function( + VideoAdPlayer pigeon_instance, + AdMediaInfo adMediaInfo, + ) playAd, + required void Function(VideoAdPlayer pigeon_instance) release, + required void Function( + VideoAdPlayer pigeon_instance, + VideoAdPlayerCallback callback, + ) removeCallback, + required void Function( + VideoAdPlayer pigeon_instance, + AdMediaInfo adMediaInfo, + ) stopAd, + }) { + if (PigeonOverrides.videoAdPlayer_new != null) { + return PigeonOverrides.videoAdPlayer_new!( + addCallback: addCallback, + loadAd: loadAd, + pauseAd: pauseAd, + playAd: playAd, + release: release, + removeCallback: removeCallback, + stopAd: stopAd, + ); + } + return VideoAdPlayer.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + addCallback: addCallback, + loadAd: loadAd, + pauseAd: pauseAd, + playAd: playAd, + release: release, + removeCallback: removeCallback, + stopAd: stopAd, + ); + } + + @protected + VideoAdPlayer.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.addCallback, @@ -5283,7 +5561,27 @@ class VideoAdPlayer extends PigeonInternalProxyApiBaseClass { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/AdsLoader.AdsLoadedListener.html. class AdsLoadedListener extends PigeonInternalProxyApiBaseClass { - AdsLoadedListener({ + factory AdsLoadedListener({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required void Function( + AdsLoadedListener pigeon_instance, + AdsManagerLoadedEvent event, + ) onAdsManagerLoaded, + }) { + if (PigeonOverrides.adsLoadedListener_new != null) { + return PigeonOverrides.adsLoadedListener_new!( + onAdsManagerLoaded: onAdsManagerLoaded); + } + return AdsLoadedListener.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + onAdsManagerLoaded: onAdsManagerLoaded, + ); + } + + @protected + AdsLoadedListener.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.onAdsManagerLoaded, @@ -5423,7 +5721,26 @@ class AdsLoadedListener extends PigeonInternalProxyApiBaseClass { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/AdErrorEvent.AdErrorListener.html. class AdErrorListener extends PigeonInternalProxyApiBaseClass { - AdErrorListener({ + factory AdErrorListener({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required void Function( + AdErrorListener pigeon_instance, + AdErrorEvent event, + ) onAdError, + }) { + if (PigeonOverrides.adErrorListener_new != null) { + return PigeonOverrides.adErrorListener_new!(onAdError: onAdError); + } + return AdErrorListener.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + onAdError: onAdError, + ); + } + + @protected + AdErrorListener.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.onAdError, @@ -5561,7 +5878,26 @@ class AdErrorListener extends PigeonInternalProxyApiBaseClass { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/AdEvent.AdEventListener.html. class AdEventListener extends PigeonInternalProxyApiBaseClass { - AdEventListener({ + factory AdEventListener({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required void Function( + AdEventListener pigeon_instance, + AdEvent event, + ) onAdEvent, + }) { + if (PigeonOverrides.adEventListener_new != null) { + return PigeonOverrides.adEventListener_new!(onAdEvent: onAdEvent); + } + return AdEventListener.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + onAdEvent: onAdEvent, + ); + } + + @protected + AdEventListener.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.onAdEvent, @@ -6943,7 +7279,25 @@ class Ad extends PigeonInternalProxyApiBaseClass { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/CompanionAdSlot.ClickListener.html. class CompanionAdSlotClickListener extends PigeonInternalProxyApiBaseClass { - CompanionAdSlotClickListener({ + factory CompanionAdSlotClickListener({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required void Function(CompanionAdSlotClickListener pigeon_instance) + onCompanionAdClick, + }) { + if (PigeonOverrides.companionAdSlotClickListener_new != null) { + return PigeonOverrides.companionAdSlotClickListener_new!( + onCompanionAdClick: onCompanionAdClick); + } + return CompanionAdSlotClickListener.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + onCompanionAdClick: onCompanionAdClick, + ); + } + + @protected + CompanionAdSlotClickListener.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.onCompanionAdClick, diff --git a/packages/interactive_media_ads/lib/src/ima_settings.dart b/packages/interactive_media_ads/lib/src/ima_settings.dart new file mode 100644 index 00000000000..e9e41133bd7 --- /dev/null +++ b/packages/interactive_media_ads/lib/src/ima_settings.dart @@ -0,0 +1,149 @@ +// 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'; + +import 'ads_loader.dart'; +import 'platform_interface/platform_interface.dart'; + +/// Defines general SDK settings that are used when creating an [AdsLoader]. +/// +/// ## 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.ImaSettings.fromPlatformCreationParams} +/// +/// Below is an example of accessing the platform-specific implementation for +/// iOS and Android: +/// +/// ```dart +/// final ImaSettings settings = ImaSettings(); +/// +/// switch (settings.platform) { +/// case final IOSImaSettings iosSettings: +/// // ... +/// case final AndroidImaSettings androidSettings: +/// // ... +/// } +/// ``` +@immutable +class ImaSettings { + /// Creates an [ImaSettings]. + ImaSettings({String? language}) + : this.fromPlatformCreationParams( + PlatformImaSettingsCreationParams(language: language), + ); + + /// Constructs an [ImaSettings] from creation params for a specific platform. + /// + /// {@template interactive_media_ads.ImaSettings.fromPlatformCreationParams} + /// Below is an example of setting platform-specific creation parameters for + /// iOS and Android: + /// + /// ```dart + /// PlatformImaSettingsCreationParams params = + /// const PlatformImaSettingsCreationParams(); + /// + /// if (InteractiveMediaAdsPlatform.instance is IOSInteractiveMediaAdsPlatform) { + /// params = IOSImaSettingsCreationParams + /// .fromPlatformImaSettingsCreationParams( + /// params, + /// ); + /// } else if (InteractiveMediaAdsPlatform.instance is AndroidInteractiveMediaAdsPlatform) { + /// params = AndroidImaSettingsCreationParams + /// .fromPlatformImaSettingsCreationParams( + /// params, + /// ); + /// } + /// + /// final ImaSettings settings = ImaSettings.fromPlatformCreationParams( + /// params, + /// ); + /// ``` + /// {@endtemplate} + ImaSettings.fromPlatformCreationParams( + PlatformImaSettingsCreationParams params, + ) : this.fromPlatform(PlatformImaSettings(params)); + + /// Constructs an [ImaSettings] from a specific platform implementation. + const ImaSettings.fromPlatform(this.platform); + + /// Implementation of [PlatformImaSettings] for the current platform. + final PlatformImaSettings platform; + + /// Specifies whether to automatically play VMAP and ad rules ad breaks. + /// + /// The default value is true. + Future setAutoPlayAdBreaks(bool autoPlayAdBreaks) { + return platform.setAutoPlayAdBreaks(autoPlayAdBreaks); + } + + /// Enables and disables the debug mode, which is disabled by default. + Future setDebugMode(bool enabled) { + return platform.setDebugMode(enabled); + } + + /// Sets the feature flags and their states to control experimental features. + /// + /// This should be set as early as possible, before requesting ads. Settings + /// will remain constant until the next ad request. Calling this method again + /// will reset any feature flags for the next ad request. + Future setFeatureFlags(Map featureFlags) { + return platform.setFeatureFlags(featureFlags); + } + + /// Specifies maximum number of redirects after which subsequent redirects + /// will be denied, and the ad load aborted. + /// + /// In this case, the ad will raise an error with error code 302. + /// + /// The default value is 4. + Future setMaxRedirects(int maxRedirects) { + return platform.setMaxRedirects(maxRedirects); + } + + /// Sets the partner specified video player that is integrating with the SDK. + /// + /// This setting should be used to specify the name of the player being + /// integrated with the SDK. Player type greater than 20 characters will be + /// truncated. The player type specified should be short and unique. This is + /// an optional setting used to improve SDK usability by tracking player + /// types. + Future setPlayerType(String playerType) { + return platform.setPlayerType(playerType); + } + + /// Sets the partner specified player version that is integrating with the + /// SDK. + /// + /// This setting should be usegd to specify the version of the partner player + /// being integrated with the SDK. Player versions greater than 20 characters + /// will be truncated. This is an optional setting used to improve SDK + /// usability by tracking player version. + Future setPlayerVersion(String playerVersion) { + return platform.setPlayerVersion(playerVersion); + } + + /// Sets the Publisher Provided Identification (PPID) sent with ads request. + Future setPpid(String ppid) { + return platform.setPpid(ppid); + } + + /// Sets the session ID to identify a single user session. + /// + /// This must be a UUID. It is used exclusively for frequency capping across + /// the user session. + Future setSessionID(String sessionID) { + return platform.setSessionID(sessionID); + } + + @override + bool operator ==(Object other) => + other is ImaSettings && other.platform == platform; + + @override + int get hashCode => platform.hashCode; +} 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 39db77824e9..2f5b6212637 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 (v25.5.0), do not edit directly. +// Autogenerated from Pigeon (v26.0.0), 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 @@ -10,7 +10,7 @@ import 'dart:io' show Platform; import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; import 'package:flutter/foundation.dart' - show ReadBuffer, WriteBuffer, immutable, protected; + show ReadBuffer, WriteBuffer, immutable, protected, visibleForTesting; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart' show WidgetsFlutterBinding; @@ -32,6 +32,137 @@ List wrapResponse( return [error.code, error.message, error.details]; } +/// Provides overrides for the constructors and static members of each proxy +/// API. +/// +/// This is only intended to be used with unit tests to prevent errors from +/// making message calls in a unit test. +/// +/// See [PigeonOverrides.pigeon_reset] to set all overrides back to null. +@visibleForTesting +class PigeonOverrides { + /// Overrides [IMAAdDisplayContainer.new]. + static IMAAdDisplayContainer Function({ + required UIView adContainer, + List? companionSlots, + UIViewController? adContainerViewController, + })? iMAAdDisplayContainer_new; + + /// Overrides [UIView.new]. + static UIView Function()? uIView_new; + + /// Overrides [UIViewController.new]. + static UIViewController Function( + {void Function( + UIViewController pigeon_instance, + bool animated, + )? viewDidAppear})? uIViewController_new; + + /// Overrides [IMAContentPlayhead.new]. + static IMAContentPlayhead Function()? iMAContentPlayhead_new; + + /// Overrides [IMAAdsLoader.new]. + static IMAAdsLoader Function({IMASettings? settings})? iMAAdsLoader_new; + + /// Overrides [IMASettings.new]. + static IMASettings Function()? iMASettings_new; + + /// Overrides [IMAAdsRequest.new]. + static IMAAdsRequest Function({ + required String adTagUrl, + required IMAAdDisplayContainer adDisplayContainer, + IMAContentPlayhead? contentPlayhead, + })? iMAAdsRequest_new; + + /// Overrides [IMAAdsLoaderDelegate.new]. + static IMAAdsLoaderDelegate Function({ + required void Function( + IMAAdsLoaderDelegate pigeon_instance, + IMAAdsLoader loader, + IMAAdsLoadedData adsLoadedData, + ) adLoaderLoadedWith, + required void Function( + IMAAdsLoaderDelegate pigeon_instance, + IMAAdsLoader loader, + IMAAdLoadingErrorData adErrorData, + ) adsLoaderFailedWithErrorData, + })? iMAAdsLoaderDelegate_new; + + /// Overrides [IMAAdsManagerDelegate.new]. + static IMAAdsManagerDelegate Function({ + required void Function( + IMAAdsManagerDelegate pigeon_instance, + IMAAdsManager adsManager, + IMAAdEvent event, + ) didReceiveAdEvent, + required void Function( + IMAAdsManagerDelegate pigeon_instance, + IMAAdsManager adsManager, + IMAAdError error, + ) didReceiveAdError, + required void Function( + IMAAdsManagerDelegate pigeon_instance, + IMAAdsManager adsManager, + ) didRequestContentPause, + required void Function( + IMAAdsManagerDelegate pigeon_instance, + IMAAdsManager adsManager, + ) didRequestContentResume, + })? iMAAdsManagerDelegate_new; + + /// Overrides [IMAAdsRenderingSettings.new]. + static IMAAdsRenderingSettings Function()? iMAAdsRenderingSettings_new; + + /// Overrides [IMAFriendlyObstruction.new]. + static IMAFriendlyObstruction Function({ + required UIView view, + required FriendlyObstructionPurpose purpose, + String? detailedReason, + })? iMAFriendlyObstruction_new; + + /// Overrides [IMACompanionAdSlot.new]. + static IMACompanionAdSlot Function({required UIView view})? + iMACompanionAdSlot_new; + + /// Overrides [IMACompanionAdSlot.size]. + static IMACompanionAdSlot Function({ + required UIView view, + required int width, + required int height, + })? iMACompanionAdSlot_size; + + /// Overrides [IMACompanionDelegate.new]. + static IMACompanionDelegate Function({ + void Function( + IMACompanionDelegate pigeon_instance, + IMACompanionAdSlot slot, + bool filled, + )? companionAdSlotFilled, + void Function( + IMACompanionDelegate pigeon_instance, + IMACompanionAdSlot slot, + )? companionSlotWasClicked, + })? iMACompanionDelegate_new; + + /// Sets all overridden ProxyApi class members to null. + static void pigeon_reset() { + iMAAdDisplayContainer_new = null; + uIView_new = null; + uIViewController_new = null; + iMAContentPlayhead_new = null; + iMAAdsLoader_new = null; + iMASettings_new = null; + iMAAdsRequest_new = null; + iMAAdsLoaderDelegate_new = null; + iMAAdsManagerDelegate_new = null; + iMAAdsRenderingSettings_new = null; + iMAFriendlyObstruction_new = null; + iMACompanionAdSlot_new = null; + iMACompanionAdSlot_size = null; + iMACompanionDelegate_new = null; + } +} + /// An immutable object that serves as the base class for all ProxyApis and /// can provide functional copies of itself. /// @@ -807,7 +938,33 @@ class _PigeonCodec extends StandardMessageCodec { class IMAAdDisplayContainer extends NSObject { /// Initializes IMAAdDisplayContainer for rendering the ad and displaying the /// sad UI. - IMAAdDisplayContainer({ + factory IMAAdDisplayContainer({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required UIView adContainer, + List? companionSlots, + UIViewController? adContainerViewController, + }) { + if (PigeonOverrides.iMAAdDisplayContainer_new != null) { + return PigeonOverrides.iMAAdDisplayContainer_new!( + adContainer: adContainer, + companionSlots: companionSlots, + adContainerViewController: adContainerViewController, + ); + } + return IMAAdDisplayContainer.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + adContainer: adContainer, + companionSlots: companionSlots, + adContainerViewController: adContainerViewController, + ); + } + + /// Initializes IMAAdDisplayContainer for rendering the ad and displaying the + /// sad UI. + @protected + IMAAdDisplayContainer.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.adContainer, @@ -1073,7 +1230,21 @@ class IMAAdDisplayContainer extends NSObject { /// /// See https://developer.apple.com/documentation/uikit/uiview. class UIView extends NSObject { - UIView({ + factory UIView({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + }) { + if (PigeonOverrides.uIView_new != null) { + return PigeonOverrides.uIView_new!(); + } + return UIView.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + ); + } + + @protected + UIView.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, }) : super.pigeon_detached() { @@ -1184,7 +1355,27 @@ class UIView extends NSObject { /// /// See https://developer.apple.com/documentation/uikit/uiviewcontroller. class UIViewController extends NSObject { - UIViewController({ + factory UIViewController({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + void Function( + UIViewController pigeon_instance, + bool animated, + )? viewDidAppear, + }) { + if (PigeonOverrides.uIViewController_new != null) { + return PigeonOverrides.uIViewController_new!( + viewDidAppear: viewDidAppear); + } + return UIViewController.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + viewDidAppear: viewDidAppear, + ); + } + + @protected + UIViewController.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, this.viewDidAppear, @@ -1408,7 +1599,21 @@ class UIViewController extends NSObject { /// /// See https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/ios/reference/Protocols/IMAContentPlayhead. class IMAContentPlayhead extends NSObject { - IMAContentPlayhead({ + factory IMAContentPlayhead({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + }) { + if (PigeonOverrides.iMAContentPlayhead_new != null) { + return PigeonOverrides.iMAContentPlayhead_new!(); + } + return IMAContentPlayhead.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + ); + } + + @protected + IMAContentPlayhead.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, }) : super.pigeon_detached() { @@ -1550,7 +1755,23 @@ class IMAContentPlayhead extends NSObject { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes/IMAAdsLoader. class IMAAdsLoader extends NSObject { - IMAAdsLoader({ + factory IMAAdsLoader({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + IMASettings? settings, + }) { + if (PigeonOverrides.iMAAdsLoader_new != null) { + return PigeonOverrides.iMAAdsLoader_new!(settings: settings); + } + return IMAAdsLoader.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + settings: settings, + ); + } + + @protected + IMAAdsLoader.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, IMASettings? settings, @@ -1754,7 +1975,21 @@ class IMAAdsLoader extends NSObject { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes/IMASettings.html. class IMASettings extends NSObject { - IMASettings({ + factory IMASettings({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + }) { + if (PigeonOverrides.iMASettings_new != null) { + return PigeonOverrides.iMASettings_new!(); + } + return IMASettings.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + ); + } + + @protected + IMASettings.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, }) : super.pigeon_detached() { @@ -2262,7 +2497,33 @@ class IMASettings extends NSObject { class IMAAdsRequest extends NSObject { /// Initializes an ads request instance with the given ad tag URL and ad /// display container. - IMAAdsRequest({ + factory IMAAdsRequest({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required String adTagUrl, + required IMAAdDisplayContainer adDisplayContainer, + IMAContentPlayhead? contentPlayhead, + }) { + if (PigeonOverrides.iMAAdsRequest_new != null) { + return PigeonOverrides.iMAAdsRequest_new!( + adTagUrl: adTagUrl, + adDisplayContainer: adDisplayContainer, + contentPlayhead: contentPlayhead, + ); + } + return IMAAdsRequest.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + adTagUrl: adTagUrl, + adDisplayContainer: adDisplayContainer, + contentPlayhead: contentPlayhead, + ); + } + + /// Initializes an ads request instance with the given ad tag URL and ad + /// display container. + @protected + IMAAdsRequest.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required String adTagUrl, @@ -2381,7 +2642,36 @@ class IMAAdsRequest extends NSObject { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Protocols/IMAAdsLoaderDelegate.html. class IMAAdsLoaderDelegate extends NSObject { - IMAAdsLoaderDelegate({ + factory IMAAdsLoaderDelegate({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required void Function( + IMAAdsLoaderDelegate pigeon_instance, + IMAAdsLoader loader, + IMAAdsLoadedData adsLoadedData, + ) adLoaderLoadedWith, + required void Function( + IMAAdsLoaderDelegate pigeon_instance, + IMAAdsLoader loader, + IMAAdLoadingErrorData adErrorData, + ) adsLoaderFailedWithErrorData, + }) { + if (PigeonOverrides.iMAAdsLoaderDelegate_new != null) { + return PigeonOverrides.iMAAdsLoaderDelegate_new!( + adLoaderLoadedWith: adLoaderLoadedWith, + adsLoaderFailedWithErrorData: adsLoaderFailedWithErrorData, + ); + } + return IMAAdsLoaderDelegate.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + adLoaderLoadedWith: adLoaderLoadedWith, + adsLoaderFailedWithErrorData: adsLoaderFailedWithErrorData, + ); + } + + @protected + IMAAdsLoaderDelegate.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.adLoaderLoadedWith, @@ -3178,7 +3468,48 @@ class IMAAdsManager extends NSObject { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Protocols/IMAAdsManagerDelegate.html. class IMAAdsManagerDelegate extends NSObject { - IMAAdsManagerDelegate({ + factory IMAAdsManagerDelegate({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required void Function( + IMAAdsManagerDelegate pigeon_instance, + IMAAdsManager adsManager, + IMAAdEvent event, + ) didReceiveAdEvent, + required void Function( + IMAAdsManagerDelegate pigeon_instance, + IMAAdsManager adsManager, + IMAAdError error, + ) didReceiveAdError, + required void Function( + IMAAdsManagerDelegate pigeon_instance, + IMAAdsManager adsManager, + ) didRequestContentPause, + required void Function( + IMAAdsManagerDelegate pigeon_instance, + IMAAdsManager adsManager, + ) didRequestContentResume, + }) { + if (PigeonOverrides.iMAAdsManagerDelegate_new != null) { + return PigeonOverrides.iMAAdsManagerDelegate_new!( + didReceiveAdEvent: didReceiveAdEvent, + didReceiveAdError: didReceiveAdError, + didRequestContentPause: didRequestContentPause, + didRequestContentResume: didRequestContentResume, + ); + } + return IMAAdsManagerDelegate.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + didReceiveAdEvent: didReceiveAdEvent, + didReceiveAdError: didReceiveAdError, + didRequestContentPause: didRequestContentPause, + didRequestContentResume: didRequestContentResume, + ); + } + + @protected + IMAAdsManagerDelegate.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.didReceiveAdEvent, @@ -3630,7 +3961,21 @@ class IMAAdEvent extends NSObject { /// /// See https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/ios/reference/Classes/IMAAdsRenderingSettings. class IMAAdsRenderingSettings extends NSObject { - IMAAdsRenderingSettings({ + factory IMAAdsRenderingSettings({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + }) { + if (PigeonOverrides.iMAAdsRenderingSettings_new != null) { + return PigeonOverrides.iMAAdsRenderingSettings_new!(); + } + return IMAAdsRenderingSettings.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + ); + } + + @protected + IMAAdsRenderingSettings.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, }) : super.pigeon_detached() { @@ -4037,7 +4382,32 @@ class NSObject extends PigeonInternalProxyApiBaseClass { /// See https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/ios/reference/Classes/IMAFriendlyObstruction.html. class IMAFriendlyObstruction extends NSObject { /// Initializes a friendly obstruction. - IMAFriendlyObstruction({ + factory IMAFriendlyObstruction({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required UIView view, + required FriendlyObstructionPurpose purpose, + String? detailedReason, + }) { + if (PigeonOverrides.iMAFriendlyObstruction_new != null) { + return PigeonOverrides.iMAFriendlyObstruction_new!( + view: view, + purpose: purpose, + detailedReason: detailedReason, + ); + } + return IMAFriendlyObstruction.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + view: view, + purpose: purpose, + detailedReason: detailedReason, + ); + } + + /// Initializes a friendly obstruction. + @protected + IMAFriendlyObstruction.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.view, @@ -4302,7 +4672,24 @@ class IMACompanionAd extends NSObject { /// See https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes/IMACompanionAdSlot. class IMACompanionAdSlot extends PigeonInternalProxyApiBaseClass { /// Initializes an instance of a IMACompanionAdSlot with fluid size. - IMACompanionAdSlot({ + factory IMACompanionAdSlot({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required UIView view, + }) { + if (PigeonOverrides.iMACompanionAdSlot_new != null) { + return PigeonOverrides.iMACompanionAdSlot_new!(view: view); + } + return IMACompanionAdSlot.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + view: view, + ); + } + + /// Initializes an instance of a IMACompanionAdSlot with fluid size. + @protected + IMACompanionAdSlot.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.view, @@ -4343,7 +4730,35 @@ class IMACompanionAdSlot extends PigeonInternalProxyApiBaseClass { /// height. /// /// `width` and `height` are in pixels. - IMACompanionAdSlot.size({ + factory IMACompanionAdSlot.size({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + required UIView view, + required int width, + required int height, + }) { + if (PigeonOverrides.iMACompanionAdSlot_size != null) { + return PigeonOverrides.iMACompanionAdSlot_size!( + view: view, + width: width, + height: height, + ); + } + return IMACompanionAdSlot.pigeon_size( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + view: view, + width: width, + height: height, + ); + } + + /// Initializes an instance of a IMACompanionAdSlot with design ad width and + /// height. + /// + /// `width` and `height` are in pixels. + @protected + IMACompanionAdSlot.pigeon_size({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, required this.view, @@ -4572,7 +4987,35 @@ class IMACompanionAdSlot extends PigeonInternalProxyApiBaseClass { /// /// See https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Protocols/IMACompanionDelegate.html. class IMACompanionDelegate extends NSObject { - IMACompanionDelegate({ + factory IMACompanionDelegate({ + BinaryMessenger? pigeon_binaryMessenger, + PigeonInstanceManager? pigeon_instanceManager, + void Function( + IMACompanionDelegate pigeon_instance, + IMACompanionAdSlot slot, + bool filled, + )? companionAdSlotFilled, + void Function( + IMACompanionDelegate pigeon_instance, + IMACompanionAdSlot slot, + )? companionSlotWasClicked, + }) { + if (PigeonOverrides.iMACompanionDelegate_new != null) { + return PigeonOverrides.iMACompanionDelegate_new!( + companionAdSlotFilled: companionAdSlotFilled, + companionSlotWasClicked: companionSlotWasClicked, + ); + } + return IMACompanionDelegate.pigeon_new( + pigeon_binaryMessenger: pigeon_binaryMessenger, + pigeon_instanceManager: pigeon_instanceManager, + companionAdSlotFilled: companionAdSlotFilled, + companionSlotWasClicked: companionSlotWasClicked, + ); + } + + @protected + IMACompanionDelegate.pigeon_new({ super.pigeon_binaryMessenger, super.pigeon_instanceManager, this.companionAdSlotFilled, diff --git a/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart b/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart index 606cfb6c835..276faead7cf 100644 --- a/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/ios/ios_ads_loader.dart @@ -13,12 +13,14 @@ import 'interactive_media_ads_proxy.dart'; import 'ios_ad_display_container.dart'; import 'ios_ads_manager.dart'; import 'ios_content_progress_provider.dart'; +import 'ios_ima_settings.dart'; /// Implementation of [PlatformAdsLoaderCreationParams] for iOS. final class IOSAdsLoaderCreationParams extends PlatformAdsLoaderCreationParams { /// Constructs a [IOSAdsLoaderCreationParams]. const IOSAdsLoaderCreationParams({ required super.container, + required super.settings, required super.onAdsLoaded, required super.onAdsLoadError, @visibleForTesting InteractiveMediaAdsProxy? proxy, @@ -33,6 +35,7 @@ final class IOSAdsLoaderCreationParams extends PlatformAdsLoaderCreationParams { }) { return IOSAdsLoaderCreationParams( container: params.container, + settings: params.settings, onAdsLoaded: params.onAdsLoaded, onAdsLoadError: params.onAdsLoadError, proxy: proxy, @@ -52,12 +55,9 @@ base class IOSAdsLoader extends PlatformAdsLoader { null, 'Ensure the AdDisplayContainer has been added to the Widget tree before creating an AdsLoader.', ), - super.implementation() { - _adsLoader = _iosParams._proxy.newIMAAdsLoader(); - _adsLoader.setDelegate(_delegate); - } + super.implementation(); - late final IMAAdsLoader _adsLoader; + late final IMAAdsLoader _adsLoader = _initAdsLoader(); late final IMAAdsLoaderDelegate _delegate = _createAdsLoaderDelegate( WeakReference(this), ); @@ -112,4 +112,14 @@ base class IOSAdsLoader extends PlatformAdsLoader { }, ); } + + IMAAdsLoader _initAdsLoader() { + final IOSImaSettings settings = switch (_iosParams.settings) { + final IOSImaSettings iosSettings => iosSettings, + _ => IOSImaSettings(_iosParams.settings.params), + }; + + return _iosParams._proxy.newIMAAdsLoader(settings: settings.nativeSettings) + ..setDelegate(_delegate); + } } diff --git a/packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart b/packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart new file mode 100644 index 00000000000..82f5821e728 --- /dev/null +++ b/packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart @@ -0,0 +1,75 @@ +// 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:meta/meta.dart'; + +import '../platform_interface/platform_ima_settings.dart'; +import 'interactive_media_ads.g.dart'; + +/// Implementation of [PlatformImaSettings] for iOS. +final class IOSImaSettings extends PlatformImaSettings { + /// Constructs an [IosImaSettings]. + IOSImaSettings(super.params) : super.implementation(); + + /// The native iOS ImaSdkSettings. + /// + /// Defines general SDK settings that are used when creating an `IMAAdsLoader`. + @internal + late final IMASettings nativeSettings = _createSettings(); + + @override + Future setAutoPlayAdBreaks(bool autoPlayAdBreaks) { + return nativeSettings.setAutoPlayAdBreaks(autoPlayAdBreaks); + } + + @override + Future setDebugMode(bool enabled) { + return nativeSettings.setEnableDebugMode(enabled); + } + + @override + Future setFeatureFlags(Map? featureFlags) { + return nativeSettings.setFeatureFlags(featureFlags ?? {}); + } + + @override + Future setMaxRedirects(int maxRedirects) { + return nativeSettings.setMaxRedirects(maxRedirects); + } + + @override + Future setPlayerType(String? playerType) { + return nativeSettings.setPlayerType(playerType); + } + + @override + Future setPlayerVersion(String? playerVersion) { + return nativeSettings.setPlayerVersion(playerVersion); + } + + @override + Future setPpid(String? ppid) { + return nativeSettings.setPPID(ppid); + } + + @override + Future setSessionID(String? sessionID) { + return nativeSettings.setSessionID(sessionID); + } + + /// Enable background audio playback for the SDK. + /// + /// The default value is false. + Future setEnableBackgroundPlayback(bool enabled) { + return nativeSettings.setEnableBackgroundPlayback(enabled); + } + + IMASettings _createSettings() { + final IMASettings settings = IMASettings(); + if (params.language case final String language) { + settings.setLanguage(language); + } + return settings; + } +} 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 9bd724087b6..d87494b7f6e 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 @@ -9,12 +9,14 @@ 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 '../platform_interface/platform_ima_settings.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'; +import 'ios_ima_settings.dart'; /// Implementation of [InteractiveMediaAdsPlatform] for iOS. final class IOSInteractiveMediaAds extends InteractiveMediaAdsPlatform { @@ -62,4 +64,11 @@ final class IOSInteractiveMediaAds extends InteractiveMediaAdsPlatform { ) { return IOSCompanionAdSlot(params); } + + @override + IOSImaSettings createPlatformImaSettings( + PlatformImaSettingsCreationParams params, + ) { + return IOSImaSettings(params); + } } diff --git a/packages/interactive_media_ads/lib/src/platform_interface/ad_error.dart b/packages/interactive_media_ads/lib/src/platform_interface/ad_error.dart index ca89e967307..5eb2e240bf6 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/ad_error.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/ad_error.dart @@ -74,7 +74,7 @@ enum AdErrorCode { /// No assets were found in the VAST ad response. vastAssetNotFound, - /// A VAST response containing a single tag with no child tags. + /// A VAST response containing a single VAST tag with no child tags. vastEmptyResponse, /// Assets were found in the VAST ad response for a linear ad, but none of 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 2eb3710fd8b..94089e100bd 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 @@ -8,6 +8,7 @@ import 'platform_ads_manager_delegate.dart'; import 'platform_ads_rendering_settings.dart'; import 'platform_companion_ad_slot.dart'; import 'platform_content_progress_provider.dart'; +import 'platform_ima_settings.dart'; /// Interface for a platform implementation of the Interactive Media Ads SDKs. abstract base class InteractiveMediaAdsPlatform { @@ -47,4 +48,9 @@ abstract base class InteractiveMediaAdsPlatform { PlatformCompanionAdSlot createPlatformCompanionAdSlot( PlatformCompanionAdSlotCreationParams params, ); + + /// Creates a new [PlatformImaSettings]. + PlatformImaSettings createPlatformImaSettings( + PlatformImaSettingsCreationParams params, + ); } diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_loader.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_loader.dart index 51ed2a64e68..dea71a828b3 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_ads_loader.dart @@ -9,6 +9,7 @@ import 'interactive_media_ads_platform.dart'; import 'platform_ad_display_container.dart'; import 'platform_ads_manager.dart'; import 'platform_ads_request.dart'; +import 'platform_ima_settings.dart'; /// Object specifying creation parameters for creating a [PlatformAdsLoader]. /// @@ -45,11 +46,18 @@ import 'platform_ads_request.dart'; base class PlatformAdsLoaderCreationParams { /// Used by the platform implementation to create a new [PlatformAdsLoader]. const PlatformAdsLoaderCreationParams({ + required this.settings, required this.container, required this.onAdsLoaded, required this.onAdsLoadError, }); + /// Defines general SDK settings. + /// + /// Note that certain settings will only be evaluated during initialization of + /// the adsLoader. + final PlatformImaSettings settings; + /// A container object where ads are rendered. final PlatformAdDisplayContainer container; diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_content_progress_provider.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_content_progress_provider.dart index fb5c54a563e..f49da231af6 100644 --- a/packages/interactive_media_ads/lib/src/platform_interface/platform_content_progress_provider.dart +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_content_progress_provider.dart @@ -49,7 +49,7 @@ base class PlatformContentProgressProviderCreationParams { /// /// Provides updates required to enable triggering ads at configured cue points. abstract class PlatformContentProgressProvider { - /// Creates a new [PlatformAdsManagerDelegate] + /// Creates a new [PlatformContentProgressProvider]. factory PlatformContentProgressProvider( PlatformContentProgressProviderCreationParams params, ) { diff --git a/packages/interactive_media_ads/lib/src/platform_interface/platform_ima_settings.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_ima_settings.dart new file mode 100644 index 00000000000..42cedd36a11 --- /dev/null +++ b/packages/interactive_media_ads/lib/src/platform_interface/platform_ima_settings.dart @@ -0,0 +1,129 @@ +// 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'; + +import 'interactive_media_ads_platform.dart'; + +/// Object specifying creation parameters for creating a [PlatformImaSettings]. +/// +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// This example demonstrates how to extend the +/// [PlatformImaSettingsCreationParams] to provide additional +/// platform specific parameters. +/// +/// When extending [PlatformImaSettingsCreationParams] additional +/// parameters should always accept `null` or have a default value to prevent +/// breaking changes. +/// +/// ```dart +/// class AndroidPlatformImaSettingsCreationParams +/// extends PlatformImaSettingsCreationParams { +/// AndroidPlatformImaSettingsCreationParams({ +/// super.language, +/// this.androidSpecificValue, +/// }); +/// +/// factory AndroidPlatformImaSettingsCreationParams.fromPlatformImaSettingsCreationParams( +/// PlatformImaSettingsCreationParams params, { +/// String? androidSpecificValue, +/// }) { +/// return AndroidPlatformImaSettingsCreationParams._( +/// params, +/// androidSpecificValue: androidSpecificValue +/// ); +/// } +/// +/// final String? androidSpecificValue; +/// } +/// ``` +@immutable +base class PlatformImaSettingsCreationParams { + /// Used by the platform implementation to create a new [PlatformImaSettings]. + const PlatformImaSettingsCreationParams({this.language}); + + /// Language specification used for localization. + /// + /// For Android, the supported codes can be found in the Localization guide + /// and are closely related to the two-letter ISO 639-1 language codes. + /// + /// For iOS, `language` must be formatted as a canonicalized IETF BCP 47 + /// language identifier such as would be returned by + /// `[NSLocale preferredLanguages]`. + final String? language; +} + +/// Defines general SDK settings that are used when creating a +/// `PlatformAdsLoader`. +abstract base class PlatformImaSettings { + /// Creates a new [PlatformImaSettings]. + factory PlatformImaSettings(PlatformImaSettingsCreationParams params) { + assert(InteractiveMediaAdsPlatform.instance != null); + final PlatformImaSettings implementation = + InteractiveMediaAdsPlatform.instance!.createPlatformImaSettings(params); + return implementation; + } + + /// Used by the platform implementation to create a new [PlatformImaSettings]. + /// + /// Should only be used by platform implementations because they can't extend + /// a class that only contains a factory constructor. + @protected + PlatformImaSettings.implementation(this.params); + + /// The parameters used to initialize the [PlatformImaSettings]. + final PlatformImaSettingsCreationParams params; + + /// Sets the Publisher Provided Identification (PPID) sent with ads request. + Future setPpid(String ppid); + + /// Specifies maximum number of redirects after which subsequent redirects + /// will be denied, and the ad load aborted. + /// + /// In this case, the ad will raise an error with error code 302. + /// + /// The default value is 4. + Future setMaxRedirects(int maxRedirects); + + /// Sets the feature flags and their states to control experimental features. + /// + /// This should be set as early as possible, before requesting ads. Settings + /// will remain constant until the next ad request. Calling this method again + /// will reset any feature flags for the next ad request. + Future setFeatureFlags(Map featureFlags); + + /// Specifies whether to automatically play VMAP and ad rules ad breaks. + /// + /// The default value is true. + Future setAutoPlayAdBreaks(bool autoPlayAdBreaks); + + /// Sets the partner specified video player that is integrating with the SDK. + /// + /// This setting should be used to specify the name of the player being + /// integrated with the SDK. Player type greater than 20 characters will be + /// truncated. The player type specified should be short and unique. This is + /// an optional setting used to improve SDK usability by tracking player + /// types. + Future setPlayerType(String playerType); + + /// Sets the partner specified player version that is integrating with the + /// SDK. + /// + /// This setting should be usegd to specify the version of the partner player + /// being integrated with the SDK. Player versions greater than 20 characters + /// will be truncated. This is an optional setting used to improve SDK + /// usability by tracking player version. + Future setPlayerVersion(String playerVersion); + + /// Sets the session ID to identify a single user session. + /// + /// This must be a UUID. It is used exclusively for frequency capping across + /// the user session. + Future setSessionID(String sessionID); + + /// Enables and disables the debug mode, which is disabled by default. + Future setDebugMode(bool enabled); +} 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 5f724f48b6d..27ac8ef1743 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 @@ -16,3 +16,4 @@ export 'platform_ads_rendering_settings.dart'; export 'platform_ads_request.dart'; export 'platform_companion_ad_slot.dart'; export 'platform_content_progress_provider.dart'; +export 'platform_ima_settings.dart'; diff --git a/packages/interactive_media_ads/pubspec.yaml b/packages/interactive_media_ads/pubspec.yaml index f93ed3661d2..ac88478e118 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.4+2 # This must match the version in +version: 0.2.5 # 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.5.0 + pigeon: ^26.0.0 topics: - ads diff --git a/packages/interactive_media_ads/test/ads_loader_test.dart b/packages/interactive_media_ads/test/ads_loader_test.dart index c571830fc4f..736895a8f8a 100644 --- a/packages/interactive_media_ads/test/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/ads_loader_test.dart @@ -14,6 +14,7 @@ void main() { final TestPlatformAdsLoader adsLoader = TestPlatformAdsLoader( PlatformAdsLoaderCreationParams( container: createTestAdDisplayContainer(), + settings: TestImaSettings(const PlatformImaSettingsCreationParams()), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, ), @@ -36,6 +37,7 @@ void main() { final TestPlatformAdsLoader adsLoader = TestPlatformAdsLoader( PlatformAdsLoaderCreationParams( container: createTestAdDisplayContainer(), + settings: TestImaSettings(const PlatformImaSettingsCreationParams()), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, ), diff --git a/packages/interactive_media_ads/test/android/ads_loader_test.dart b/packages/interactive_media_ads/test/android/ads_loader_test.dart index ae25fdde99f..084ad3edef3 100644 --- a/packages/interactive_media_ads/test/android/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/android/ads_loader_test.dart @@ -10,6 +10,7 @@ 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_ads_loader.dart'; import 'package:interactive_media_ads/src/android/android_content_progress_provider.dart'; +import 'package:interactive_media_ads/src/android/android_ima_settings.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'; @@ -41,17 +42,37 @@ import 'ads_loader_test.mocks.dart'; ]) void main() { group('AndroidAdsLoader', () { + setUp(() { + ima.PigeonOverrides.pigeon_reset(); + }); + testWidgets('instantiate AndroidAdsLoader', (WidgetTester tester) async { final AndroidAdDisplayContainer container = await _pumpAdDisplayContainer(tester); + final MockImaSdkSettings mockImaSdkSettings = MockImaSdkSettings(); + final MockImaSdkFactory mockSdkFactory = _mockImaSdkFactoryInstance( + imaSdkSettings: mockImaSdkSettings, + ); + + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, + settings: settings, onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, ), ); + + expect(await settings.nativeSettingsFuture, mockImaSdkSettings); + verify(mockSdkFactory.createAdsLoader( + mockImaSdkSettings, + container.adDisplayContainer, + )); }); testWidgets('contentComplete', (WidgetTester tester) async { @@ -62,9 +83,14 @@ void main() { mockAdPlayerCallback: mockAdPlayerCallback, ); + _mockImaSdkFactoryInstance(); + final AndroidAdsLoader loader = AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, + settings: AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, ), @@ -78,23 +104,14 @@ void main() { final AndroidAdDisplayContainer container = await _pumpAdDisplayContainer(tester); - final MockImaSdkFactory mockSdkFactory = MockImaSdkFactory(); - when(mockSdkFactory.createImaSdkSettings()).thenAnswer((_) async { - return MockImaSdkSettings(); - }); - final MockAdsLoader mockAdsLoader = MockAdsLoader(); - when(mockSdkFactory.createAdsLoader(any, any)).thenAnswer((_) async { - return mockAdsLoader; - }); - final MockAdsRequest mockAdsRequest = MockAdsRequest(); - when(mockSdkFactory.createAdsRequest()).thenAnswer((_) async { - return mockAdsRequest; - }); + _mockImaSdkFactoryInstance( + adsRequest: mockAdsRequest, + adsLoader: mockAdsLoader, + ); final InteractiveMediaAdsProxy proxy = InteractiveMediaAdsProxy( - instanceImaSdkFactory: () => mockSdkFactory, newContentProgressProvider: () => ima.ContentProgressProvider.pigeon_detached(), ); @@ -102,6 +119,9 @@ void main() { final AndroidAdsLoader adsLoader = AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, + settings: AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, proxy: proxy, @@ -132,20 +152,12 @@ void main() { final AndroidAdDisplayContainer container = await _pumpAdDisplayContainer(tester); - final MockImaSdkFactory mockSdkFactory = MockImaSdkFactory(); - when(mockSdkFactory.createImaSdkSettings()).thenAnswer((_) async { - return MockImaSdkSettings(); - }); - final MockAdsLoader mockAdsLoader = MockAdsLoader(); final Completer addEventListenerCompleter = Completer(); when(mockAdsLoader.addAdsLoadedListener(any)).thenAnswer((_) async { addEventListenerCompleter.complete(); }); - - when(mockSdkFactory.createAdsLoader(any, any)).thenAnswer((_) async { - return mockAdsLoader; - }); + _mockImaSdkFactoryInstance(adsLoader: mockAdsLoader); late final void Function( ima.AdsLoadedListener, @@ -153,7 +165,6 @@ void main() { ) onAdsManagerLoadedCallback; final InteractiveMediaAdsProxy proxy = InteractiveMediaAdsProxy( - instanceImaSdkFactory: () => mockSdkFactory, newAdsLoadedListener: ({ required void Function( ima.AdsLoadedListener, @@ -171,6 +182,9 @@ void main() { AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, + settings: AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ), onAdsLoaded: expectAsync1((_) {}), onAdsLoadError: (_) {}, proxy: proxy, @@ -190,20 +204,12 @@ void main() { final AndroidAdDisplayContainer container = await _pumpAdDisplayContainer(tester); - final MockImaSdkFactory mockSdkFactory = MockImaSdkFactory(); - when(mockSdkFactory.createImaSdkSettings()).thenAnswer((_) async { - return MockImaSdkSettings(); - }); - final MockAdsLoader mockAdsLoader = MockAdsLoader(); final Completer addErrorListenerCompleter = Completer(); when(mockAdsLoader.addAdErrorListener(any)).thenAnswer((_) async { addErrorListenerCompleter.complete(); }); - - when(mockSdkFactory.createAdsLoader(any, any)).thenAnswer((_) async { - return mockAdsLoader; - }); + _mockImaSdkFactoryInstance(adsLoader: mockAdsLoader); late final void Function( ima.AdErrorListener, @@ -211,7 +217,6 @@ void main() { ) onAdErrorCallback; final InteractiveMediaAdsProxy proxy = InteractiveMediaAdsProxy( - instanceImaSdkFactory: () => mockSdkFactory, newAdsLoadedListener: ({required dynamic onAdsManagerLoaded}) { return MockAdsLoadedListener(); }, @@ -229,6 +234,9 @@ void main() { AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, + settings: AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ), onAdsLoaded: (_) {}, onAdsLoadError: expectAsync1((_) {}), proxy: proxy, @@ -250,6 +258,25 @@ void main() { }); } +MockImaSdkFactory _mockImaSdkFactoryInstance({ + MockImaSdkSettings? imaSdkSettings, + MockAdsRequest? adsRequest, + MockAdsLoader? adsLoader, +}) { + final MockImaSdkFactory mockSdkFactory = MockImaSdkFactory(); + when(mockSdkFactory.createImaSdkSettings()).thenAnswer((_) async { + return imaSdkSettings ?? MockImaSdkSettings(); + }); + when(mockSdkFactory.createAdsRequest()).thenAnswer((_) async { + return adsRequest ?? MockAdsRequest(); + }); + when(mockSdkFactory.createAdsLoader(any, any)).thenAnswer((_) async { + return adsLoader ?? MockAdsLoader(); + }); + ima.PigeonOverrides.imaSdkFactory_instance = mockSdkFactory; + return mockSdkFactory; +} + Future _pumpAdDisplayContainer( WidgetTester tester, { MockVideoAdPlayerCallback? mockAdPlayerCallback, 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 620ffe04c7d..b5375b6e5e5 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 @@ -1191,6 +1191,99 @@ class MockImaSdkSettings extends _i1.Mock implements _i2.ImaSdkSettings { ), ) as _i2.PigeonInstanceManager); + @override + _i5.Future setAutoPlayAdBreaks(bool? autoPlayAdBreaks) => + (super.noSuchMethod( + Invocation.method( + #setAutoPlayAdBreaks, + [autoPlayAdBreaks], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setDebugMode(bool? debugMode) => (super.noSuchMethod( + Invocation.method( + #setDebugMode, + [debugMode], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setFeatureFlags(Map? featureFlags) => + (super.noSuchMethod( + Invocation.method( + #setFeatureFlags, + [featureFlags], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setLanguage(String? language) => (super.noSuchMethod( + Invocation.method( + #setLanguage, + [language], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setMaxRedirects(int? maxRedirects) => (super.noSuchMethod( + Invocation.method( + #setMaxRedirects, + [maxRedirects], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setPlayerType(String? playerType) => (super.noSuchMethod( + Invocation.method( + #setPlayerType, + [playerType], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setPlayerVersion(String? playerVersion) => + (super.noSuchMethod( + Invocation.method( + #setPlayerVersion, + [playerVersion], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setPpid(String? ppid) => (super.noSuchMethod( + Invocation.method( + #setPpid, + [ppid], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future setSessionId(String? sessionId) => (super.noSuchMethod( + Invocation.method( + #setSessionId, + [sessionId], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override _i2.ImaSdkSettings pigeon_copy() => (super.noSuchMethod( Invocation.method( diff --git a/packages/interactive_media_ads/test/android/ima_settings_test.dart b/packages/interactive_media_ads/test/android/ima_settings_test.dart new file mode 100644 index 00000000000..e1286b51743 --- /dev/null +++ b/packages/interactive_media_ads/test/android/ima_settings_test.dart @@ -0,0 +1,144 @@ +// 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_ima_settings.dart'; +import 'package:interactive_media_ads/src/android/interactive_media_ads.g.dart' + as ima; +import 'package:interactive_media_ads/src/platform_interface/platform_ima_settings.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'ima_settings_test.mocks.dart'; + +@GenerateNiceMocks(>[ + MockSpec(), + MockSpec(), +]) +void main() { + group('AndroidImaSettings', () { + setUp(() { + ima.PigeonOverrides.pigeon_reset(); + }); + + test('language', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const String language = 'en'; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(language: language), + ); + + await settings.nativeSettingsFuture; + verify(mockImaSdkSettings.setLanguage(language)); + }); + + test('setAutoPlayAdBreaks', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const bool autoPlayAdBreaks = true; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setAutoPlayAdBreaks(autoPlayAdBreaks); + + verify(mockImaSdkSettings.setAutoPlayAdBreaks(autoPlayAdBreaks)); + }); + + test('setDebugMode', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const bool debugMode = false; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setDebugMode(debugMode); + + verify(mockImaSdkSettings.setDebugMode(debugMode)); + }); + + test('setFeatureFlags', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const Map featureFlags = {'a': 'flag'}; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setFeatureFlags(featureFlags); + + verify(mockImaSdkSettings.setFeatureFlags(featureFlags)); + }); + + test('setMaxRedirects', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const int maxRedirects = 12; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setMaxRedirects(maxRedirects); + + verify(mockImaSdkSettings.setMaxRedirects(maxRedirects)); + }); + + test('setPlayerType', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const String playerType = 'playerType'; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPlayerType(playerType); + + verify(mockImaSdkSettings.setPlayerType(playerType)); + }); + + test('setPlayerVersion', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const String playerVersion = 'playerVersion'; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPlayerVersion(playerVersion); + + verify(mockImaSdkSettings.setPlayerVersion(playerVersion)); + }); + + test('setPpid', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const String ppid = 'ppid'; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPpid(ppid); + + verify(mockImaSdkSettings.setPpid(ppid)); + }); + + test('setSessionID', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const String sessionID = 'sessionID'; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setSessionID(sessionID); + + verify(mockImaSdkSettings.setSessionId(sessionID)); + }); + }); +} + +MockImaSdkSettings _mockImaSdkSettings() { + final MockImaSdkFactory mockImaSdkFactory = MockImaSdkFactory(); + final MockImaSdkSettings mockImaSdkSettings = MockImaSdkSettings(); + when(mockImaSdkFactory.createImaSdkSettings()).thenAnswer( + (_) async => mockImaSdkSettings, + ); + ima.PigeonOverrides.imaSdkFactory_instance = mockImaSdkFactory; + + return mockImaSdkSettings; +} diff --git a/packages/interactive_media_ads/test/android/ima_settings_test.mocks.dart b/packages/interactive_media_ads/test/android/ima_settings_test.mocks.dart new file mode 100644 index 00000000000..31b3e692934 --- /dev/null +++ b/packages/interactive_media_ads/test/android/ima_settings_test.mocks.dart @@ -0,0 +1,403 @@ +// Mocks generated by Mockito 5.4.6 from annotations +// in interactive_media_ads/test/android/ima_settings_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 _FakeCompanionAdSlot_1 extends _i1.SmartFake + implements _i2.CompanionAdSlot { + _FakeCompanionAdSlot_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeImaSdkSettings_2 extends _i1.SmartFake + implements _i2.ImaSdkSettings { + _FakeImaSdkSettings_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAdsLoader_3 extends _i1.SmartFake implements _i2.AdsLoader { + _FakeAdsLoader_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAdsRequest_4 extends _i1.SmartFake implements _i2.AdsRequest { + _FakeAdsRequest_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAdsRenderingSettings_5 extends _i1.SmartFake + implements _i2.AdsRenderingSettings { + _FakeAdsRenderingSettings_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeImaSdkFactory_6 extends _i1.SmartFake implements _i2.ImaSdkFactory { + _FakeImaSdkFactory_6( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// 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_1( + this, + Invocation.method( + #createCompanionAdSlot, + [], + ), + )), + returnValueForMissingStub: + _i3.Future<_i2.CompanionAdSlot>.value(_FakeCompanionAdSlot_1( + 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_2( + this, + Invocation.method( + #createImaSdkSettings, + [], + ), + )), + returnValueForMissingStub: + _i3.Future<_i2.ImaSdkSettings>.value(_FakeImaSdkSettings_2( + 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_3( + this, + Invocation.method( + #createAdsLoader, + [ + settings, + container, + ], + ), + )), + returnValueForMissingStub: + _i3.Future<_i2.AdsLoader>.value(_FakeAdsLoader_3( + 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_4( + this, + Invocation.method( + #createAdsRequest, + [], + ), + )), + returnValueForMissingStub: + _i3.Future<_i2.AdsRequest>.value(_FakeAdsRequest_4( + 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_5( + this, + Invocation.method( + #createAdsRenderingSettings, + [], + ), + )), + returnValueForMissingStub: _i3.Future<_i2.AdsRenderingSettings>.value( + _FakeAdsRenderingSettings_5( + this, + Invocation.method( + #createAdsRenderingSettings, + [], + ), + )), + ) as _i3.Future<_i2.AdsRenderingSettings>); + + @override + _i2.ImaSdkFactory pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeImaSdkFactory_6( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeImaSdkFactory_6( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.ImaSdkFactory); +} + +/// A class which mocks [ImaSdkSettings]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockImaSdkSettings extends _i1.Mock implements _i2.ImaSdkSettings { + @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 setAutoPlayAdBreaks(bool? autoPlayAdBreaks) => + (super.noSuchMethod( + Invocation.method( + #setAutoPlayAdBreaks, + [autoPlayAdBreaks], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setDebugMode(bool? debugMode) => (super.noSuchMethod( + Invocation.method( + #setDebugMode, + [debugMode], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setFeatureFlags(Map? featureFlags) => + (super.noSuchMethod( + Invocation.method( + #setFeatureFlags, + [featureFlags], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setLanguage(String? language) => (super.noSuchMethod( + Invocation.method( + #setLanguage, + [language], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setMaxRedirects(int? maxRedirects) => (super.noSuchMethod( + Invocation.method( + #setMaxRedirects, + [maxRedirects], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setPlayerType(String? playerType) => (super.noSuchMethod( + Invocation.method( + #setPlayerType, + [playerType], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setPlayerVersion(String? playerVersion) => + (super.noSuchMethod( + Invocation.method( + #setPlayerVersion, + [playerVersion], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setPpid(String? ppid) => (super.noSuchMethod( + Invocation.method( + #setPpid, + [ppid], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setSessionId(String? sessionId) => (super.noSuchMethod( + Invocation.method( + #setSessionId, + [sessionId], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i2.ImaSdkSettings pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeImaSdkSettings_2( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeImaSdkSettings_2( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.ImaSdkSettings); +} diff --git a/packages/interactive_media_ads/test/ima_settings_test.dart b/packages/interactive_media_ads/test/ima_settings_test.dart new file mode 100644 index 00000000000..1901ebcd28a --- /dev/null +++ b/packages/interactive_media_ads/test/ima_settings_test.dart @@ -0,0 +1,115 @@ +// 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/interactive_media_ads.dart'; +import 'package:interactive_media_ads/src/platform_interface/platform_ima_settings.dart'; + +import 'test_stubs.dart'; + +void main() { + test('setAutoPlayAdBreaks', () async { + const bool autoPlayAdBreaks = false; + final TestImaSettings platformSettings = TestImaSettings( + const PlatformImaSettingsCreationParams(), + onSetAutoPlayAdBreaks: expectAsync1((bool value) { + expect(autoPlayAdBreaks, value); + }), + ); + + final ImaSettings settings = ImaSettings.fromPlatform(platformSettings); + await settings.setAutoPlayAdBreaks(autoPlayAdBreaks); + }); + + test('setDebugMode', () async { + const bool debugMode = true; + final TestImaSettings platformSettings = TestImaSettings( + const PlatformImaSettingsCreationParams(), + onSetDebugMode: expectAsync1((bool value) { + expect(debugMode, value); + }), + ); + + final ImaSettings settings = ImaSettings.fromPlatform(platformSettings); + await settings.setDebugMode(debugMode); + }); + + test('setFeatureFlags', () async { + const Map featureFlags = {}; + final TestImaSettings platformSettings = TestImaSettings( + const PlatformImaSettingsCreationParams(), + onSetFeatureFlags: expectAsync1((Map value) { + expect(featureFlags, value); + }), + ); + + final ImaSettings settings = ImaSettings.fromPlatform(platformSettings); + await settings.setFeatureFlags(featureFlags); + }); + + test('setMaxRedirects', () async { + const int maxRedirects = 11; + final TestImaSettings platformSettings = TestImaSettings( + const PlatformImaSettingsCreationParams(), + onSetMaxRedirects: expectAsync1((int value) { + expect(maxRedirects, value); + }), + ); + + final ImaSettings settings = ImaSettings.fromPlatform(platformSettings); + await settings.setMaxRedirects(maxRedirects); + }); + + test('setPlayerType', () async { + const String playerType = 'playerType'; + final TestImaSettings platformSettings = TestImaSettings( + const PlatformImaSettingsCreationParams(), + onSetPlayerType: expectAsync1((String value) { + expect(playerType, value); + }), + ); + + final ImaSettings settings = ImaSettings.fromPlatform(platformSettings); + await settings.setPlayerType(playerType); + }); + + test('setPlayerVersion', () async { + const String playerVersion = 'playerVersion'; + final TestImaSettings platformSettings = TestImaSettings( + const PlatformImaSettingsCreationParams(), + onSetPlayerVersion: expectAsync1((String value) { + expect(playerVersion, value); + }), + ); + + final ImaSettings settings = ImaSettings.fromPlatform(platformSettings); + await settings.setPlayerVersion(playerVersion); + }); + + test('setPpid', () async { + const String ppid = 'ppid'; + final TestImaSettings platformSettings = TestImaSettings( + const PlatformImaSettingsCreationParams(), + onSetPpid: expectAsync1((String value) { + expect(ppid, value); + }), + ); + + final ImaSettings settings = ImaSettings.fromPlatform(platformSettings); + await settings.setPpid(ppid); + }); + + test('setSessionID', () async { + const String sessionID = 'session'; + final TestImaSettings platformSettings = TestImaSettings( + const PlatformImaSettingsCreationParams(), + onSetSessionID: expectAsync1((String value) { + expect(sessionID, value); + }), + ); + + final ImaSettings settings = ImaSettings.fromPlatform(platformSettings); + await settings.setSessionID(sessionID); + }); +} 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 1934cb34977..812878726d8 100644 --- a/packages/interactive_media_ads/test/ios/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/ios/ads_loader_test.dart @@ -10,6 +10,7 @@ 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_ads_loader.dart'; import 'package:interactive_media_ads/src/ios/ios_content_progress_provider.dart'; +import 'package:interactive_media_ads/src/ios/ios_ima_settings.dart'; import 'package:interactive_media_ads/src/platform_interface/platform_interface.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; @@ -22,11 +23,16 @@ import 'ads_loader_test.mocks.dart'; MockSpec(), MockSpec(), MockSpec(), + MockSpec(), MockSpec(), MockSpec(), ]) void main() { group('IOSAdsLoader', () { + setUp(() { + ima.PigeonOverrides.pigeon_reset(); + }); + testWidgets('instantiate IOSAdsLoader', (WidgetTester tester) async { final IOSAdDisplayContainer container = await _pumpAdDisplayContainer(tester); @@ -34,6 +40,7 @@ void main() { IOSAdsLoader( IOSAdsLoaderCreationParams( container: container, + settings: IOSImaSettings(const PlatformImaSettingsCreationParams()), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, ), @@ -45,6 +52,8 @@ void main() { tester, ); + ima.PigeonOverrides.iMASettings_new = () => MockIMASettings(); + final MockIMAAdsLoader mockLoader = MockIMAAdsLoader(); final InteractiveMediaAdsProxy imaProxy = InteractiveMediaAdsProxy( newIMAAdsLoader: ({ima.IMASettings? settings}) => mockLoader, @@ -53,6 +62,7 @@ void main() { final IOSAdsLoader loader = IOSAdsLoader( IOSAdsLoaderCreationParams( container: container, + settings: IOSImaSettings(const PlatformImaSettingsCreationParams()), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, proxy: imaProxy, @@ -68,6 +78,8 @@ void main() { tester, ); + ima.PigeonOverrides.iMASettings_new = () => MockIMASettings(); + const String adTag = 'myAdTag'; final MockIMAAdsLoader mockLoader = MockIMAAdsLoader(); @@ -91,6 +103,7 @@ void main() { final IOSAdsLoader loader = IOSAdsLoader( IOSAdsLoaderCreationParams( container: container, + settings: IOSImaSettings(const PlatformImaSettingsCreationParams()), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, proxy: imaProxy, @@ -113,6 +126,8 @@ void main() { final IOSAdDisplayContainer container = await _pumpAdDisplayContainer(tester); + ima.PigeonOverrides.iMASettings_new = () => MockIMASettings(); + late final void Function( ima.IMAAdsLoaderDelegate, ima.IMAAdsLoader, @@ -134,14 +149,17 @@ void main() { }, ); - IOSAdsLoader( + final IOSAdsLoader adsLoader = IOSAdsLoader( IOSAdsLoaderCreationParams( container: container, + settings: IOSImaSettings(const PlatformImaSettingsCreationParams()), onAdsLoaded: expectAsync1((_) {}), onAdsLoadError: (AdsLoadErrorData data) {}, proxy: imaProxy, ), ); + // Trigger lazy initialization of native IMAAdsLoader + await adsLoader.contentComplete(); adLoaderLoadedWithCallback( MockIMAAdsLoaderDelegate(), @@ -159,6 +177,8 @@ void main() { final IOSAdDisplayContainer container = await _pumpAdDisplayContainer(tester); + ima.PigeonOverrides.iMASettings_new = () => MockIMASettings(); + late final void Function( ima.IMAAdsLoaderDelegate, ima.IMAAdsLoader, @@ -180,9 +200,10 @@ void main() { }, ); - IOSAdsLoader( + final IOSAdsLoader adsLoader = IOSAdsLoader( IOSAdsLoaderCreationParams( container: container, + settings: IOSImaSettings(const PlatformImaSettingsCreationParams()), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: expectAsync1((AdsLoadErrorData data) { expect(data.error.type, AdErrorType.loading); @@ -191,6 +212,8 @@ void main() { proxy: imaProxy, ), ); + // Trigger lazy initialization of native IMAAdsLoader + await adsLoader.contentComplete(); final ima.PigeonInstanceManager instanceManager = ima.PigeonInstanceManager( 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 786ae126a73..0976c9b8e41 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 @@ -96,9 +96,19 @@ class _FakeIMAAdsRequest_6 extends _i1.SmartFake implements _i2.IMAAdsRequest { ); } -class _FakeUIViewController_7 extends _i1.SmartFake +class _FakeIMASettings_7 extends _i1.SmartFake implements _i2.IMASettings { + _FakeIMASettings_7( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeUIViewController_8 extends _i1.SmartFake implements _i2.UIViewController { - _FakeUIViewController_7( + _FakeUIViewController_8( Object parent, Invocation parentInvocation, ) : super( @@ -528,6 +538,169 @@ class MockIMAAdsRequest extends _i1.Mock implements _i2.IMAAdsRequest { ) as _i2.IMAAdsRequest); } +/// A class which mocks [IMASettings]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockIMASettings extends _i1.Mock implements _i2.IMASettings { + @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 setPPID(String? ppid) => (super.noSuchMethod( + Invocation.method( + #setPPID, + [ppid], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setLanguage(String? language) => (super.noSuchMethod( + Invocation.method( + #setLanguage, + [language], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setMaxRedirects(int? max) => (super.noSuchMethod( + Invocation.method( + #setMaxRedirects, + [max], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setFeatureFlags(Map? flags) => + (super.noSuchMethod( + Invocation.method( + #setFeatureFlags, + [flags], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setEnableBackgroundPlayback(bool? enabled) => + (super.noSuchMethod( + Invocation.method( + #setEnableBackgroundPlayback, + [enabled], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setAutoPlayAdBreaks(bool? autoPlay) => (super.noSuchMethod( + Invocation.method( + #setAutoPlayAdBreaks, + [autoPlay], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setDisableNowPlayingInfo(bool? disable) => + (super.noSuchMethod( + Invocation.method( + #setDisableNowPlayingInfo, + [disable], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setPlayerType(String? type) => (super.noSuchMethod( + Invocation.method( + #setPlayerType, + [type], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setPlayerVersion(String? version) => (super.noSuchMethod( + Invocation.method( + #setPlayerVersion, + [version], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setSessionID(String? sessionID) => (super.noSuchMethod( + Invocation.method( + #setSessionID, + [sessionID], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setSameAppKeyEnabled(bool? enabled) => (super.noSuchMethod( + Invocation.method( + #setSameAppKeyEnabled, + [enabled], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setEnableDebugMode(bool? enable) => (super.noSuchMethod( + Invocation.method( + #setEnableDebugMode, + [enable], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i2.IMASettings pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeIMASettings_7( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeIMASettings_7( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.IMASettings); +} + /// A class which mocks [UIView]. /// /// See the documentation for Mockito's code generation for more information. @@ -626,14 +799,14 @@ class MockUIViewController extends _i1.Mock implements _i2.UIViewController { #pigeon_copy, [], ), - returnValue: _FakeUIViewController_7( + returnValue: _FakeUIViewController_8( this, Invocation.method( #pigeon_copy, [], ), ), - returnValueForMissingStub: _FakeUIViewController_7( + returnValueForMissingStub: _FakeUIViewController_8( this, Invocation.method( #pigeon_copy, diff --git a/packages/interactive_media_ads/test/ios/ima_settings_test.dart b/packages/interactive_media_ads/test/ios/ima_settings_test.dart new file mode 100644 index 00000000000..5f97779268a --- /dev/null +++ b/packages/interactive_media_ads/test/ios/ima_settings_test.dart @@ -0,0 +1,141 @@ +// 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/ios_ima_settings.dart'; +import 'package:interactive_media_ads/src/platform_interface/platform_ima_settings.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'ima_settings_test.mocks.dart'; + +@GenerateNiceMocks(>[ + MockSpec(), +]) +void main() { + group('IOSImaSettings', () { + setUp(() { + PigeonOverrides.pigeon_reset(); + }); + + test('language', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const String language = 'en'; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(language: language), + ); + + // Trigger lazy initialization. + // ignore: unnecessary_statements + settings.nativeSettings; + + verify(mockIMASettings.setLanguage(language)); + }); + + test('setAutoPlayAdBreaks', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const bool autoPlayAdBreaks = true; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setAutoPlayAdBreaks(autoPlayAdBreaks); + + verify(mockIMASettings.setAutoPlayAdBreaks(autoPlayAdBreaks)); + }); + + test('setDebugMode', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const bool debugMode = false; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setDebugMode(debugMode); + + verify(mockIMASettings.setEnableDebugMode(debugMode)); + }); + + test('setFeatureFlags', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const Map featureFlags = {'a': 'flag'}; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setFeatureFlags(featureFlags); + + verify(mockIMASettings.setFeatureFlags(featureFlags)); + }); + + test('setMaxRedirects', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const int maxRedirects = 12; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setMaxRedirects(maxRedirects); + + verify(mockIMASettings.setMaxRedirects(maxRedirects)); + }); + + test('setPlayerType', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const String playerType = 'playerType'; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPlayerType(playerType); + + verify(mockIMASettings.setPlayerType(playerType)); + }); + + test('setPlayerVersion', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const String playerVersion = 'playerVersion'; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPlayerVersion(playerVersion); + + verify(mockIMASettings.setPlayerVersion(playerVersion)); + }); + + test('setPpid', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const String ppid = 'ppid'; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPpid(ppid); + + verify(mockIMASettings.setPPID(ppid)); + }); + + test('setSessionID', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const String sessionID = 'sessionID'; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setSessionID(sessionID); + + verify(mockIMASettings.setSessionID(sessionID)); + }); + }); +} + +MockIMASettings _mockIMASettings() { + final MockIMASettings mockIMASettings = MockIMASettings(); + PigeonOverrides.iMASettings_new = () => mockIMASettings; + + return mockIMASettings; +} diff --git a/packages/interactive_media_ads/test/ios/ima_settings_test.mocks.dart b/packages/interactive_media_ads/test/ios/ima_settings_test.mocks.dart new file mode 100644 index 00000000000..e62fe39d833 --- /dev/null +++ b/packages/interactive_media_ads/test/ios/ima_settings_test.mocks.dart @@ -0,0 +1,208 @@ +// Mocks generated by Mockito 5.4.6 from annotations +// in interactive_media_ads/test/ios/ima_settings_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 _FakePigeonInstanceManager_0 extends _i1.SmartFake + implements _i2.PigeonInstanceManager { + _FakePigeonInstanceManager_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeIMASettings_1 extends _i1.SmartFake implements _i2.IMASettings { + _FakeIMASettings_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [IMASettings]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockIMASettings extends _i1.Mock implements _i2.IMASettings { + @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 setPPID(String? ppid) => (super.noSuchMethod( + Invocation.method( + #setPPID, + [ppid], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setLanguage(String? language) => (super.noSuchMethod( + Invocation.method( + #setLanguage, + [language], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setMaxRedirects(int? max) => (super.noSuchMethod( + Invocation.method( + #setMaxRedirects, + [max], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setFeatureFlags(Map? flags) => + (super.noSuchMethod( + Invocation.method( + #setFeatureFlags, + [flags], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setEnableBackgroundPlayback(bool? enabled) => + (super.noSuchMethod( + Invocation.method( + #setEnableBackgroundPlayback, + [enabled], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setAutoPlayAdBreaks(bool? autoPlay) => (super.noSuchMethod( + Invocation.method( + #setAutoPlayAdBreaks, + [autoPlay], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setDisableNowPlayingInfo(bool? disable) => + (super.noSuchMethod( + Invocation.method( + #setDisableNowPlayingInfo, + [disable], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setPlayerType(String? type) => (super.noSuchMethod( + Invocation.method( + #setPlayerType, + [type], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setPlayerVersion(String? version) => (super.noSuchMethod( + Invocation.method( + #setPlayerVersion, + [version], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setSessionID(String? sessionID) => (super.noSuchMethod( + Invocation.method( + #setSessionID, + [sessionID], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setSameAppKeyEnabled(bool? enabled) => (super.noSuchMethod( + Invocation.method( + #setSameAppKeyEnabled, + [enabled], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future setEnableDebugMode(bool? enable) => (super.noSuchMethod( + Invocation.method( + #setEnableDebugMode, + [enable], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i2.IMASettings pigeon_copy() => (super.noSuchMethod( + Invocation.method( + #pigeon_copy, + [], + ), + returnValue: _FakeIMASettings_1( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + returnValueForMissingStub: _FakeIMASettings_1( + this, + Invocation.method( + #pigeon_copy, + [], + ), + ), + ) as _i2.IMASettings); +} diff --git a/packages/interactive_media_ads/test/test_stubs.dart b/packages/interactive_media_ads/test/test_stubs.dart index e8c9964a597..b2359e33ee9 100644 --- a/packages/interactive_media_ads/test/test_stubs.dart +++ b/packages/interactive_media_ads/test/test_stubs.dart @@ -39,6 +39,10 @@ final class TestInteractiveMediaAdsPlatform PlatformCompanionAdSlotCreationParams params, )? onCreatePlatformCompanionAdSlot; + PlatformImaSettings Function( + PlatformImaSettingsCreationParams params, + )? onCreatePlatformImaSettings; + @override PlatformAdsLoader createPlatformAdsLoader( PlatformAdsLoaderCreationParams params, @@ -85,6 +89,13 @@ final class TestInteractiveMediaAdsPlatform onBuildWidget: (_) => Container(), ); } + + @override + PlatformImaSettings createPlatformImaSettings( + PlatformImaSettingsCreationParams params, + ) { + return onCreatePlatformImaSettings?.call(params) ?? TestImaSettings(params); + } } final class TestPlatformAdDisplayContainer extends PlatformAdDisplayContainer { @@ -236,3 +247,71 @@ final class TestCompanionAdSlot extends PlatformCompanionAdSlot { return onBuildWidget(params); } } + +final class TestImaSettings extends PlatformImaSettings { + TestImaSettings( + super.params, { + this.onSetPpid, + this.onSetMaxRedirects, + this.onSetFeatureFlags, + this.onSetAutoPlayAdBreaks, + this.onSetPlayerType, + this.onSetPlayerVersion, + this.onSetSessionID, + this.onSetDebugMode, + }) : super.implementation(); + + void Function(String ppid)? onSetPpid; + + void Function(int maxRedirects)? onSetMaxRedirects; + + void Function(Map featureFlags)? onSetFeatureFlags; + + void Function(bool autoPlayAdBreaks)? onSetAutoPlayAdBreaks; + + void Function(String playerType)? onSetPlayerType; + + void Function(String playerVersion)? onSetPlayerVersion; + + void Function(String sessionID)? onSetSessionID; + + void Function(bool enableDebugMode)? onSetDebugMode; + + @override + Future setPpid(String ppid) async => onSetPpid?.call(ppid); + + @override + Future setMaxRedirects(int maxRedirects) async { + onSetMaxRedirects?.call(maxRedirects); + } + + @override + Future setFeatureFlags(Map featureFlags) async { + onSetFeatureFlags?.call(featureFlags); + } + + @override + Future setAutoPlayAdBreaks(bool autoPlayAdBreaks) async { + onSetAutoPlayAdBreaks?.call(autoPlayAdBreaks); + } + + @override + Future setPlayerType(String playerType) async { + onSetPlayerType?.call(playerType); + } + + @override + Future setPlayerVersion(String playerVersion) async { + onSetPlayerVersion?.call(playerVersion); + } + + @override + Future setSessionID(String sessionID) async { + onSetSessionID?.call(sessionID); + } + + @override + Future setDebugMode(bool enableDebugMode) async { + onSetDebugMode?.call(enableDebugMode); + } +}