From 4b126be73f457c72d3c0b12a904bbff975ec55a4 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 2 Jul 2025 16:10:04 -0400 Subject: [PATCH 01/29] start of settings --- .../interactive_media_ads_platform.dart | 6 + .../platform_content_progress_provider.dart | 2 +- .../platform_ima_settings.dart | 129 ++++++++++++++++++ 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 packages/interactive_media_ads/lib/src/platform_interface/platform_ima_settings.dart 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_content_progress_provider.dart b/packages/interactive_media_ads/lib/src/platform_interface/platform_content_progress_provider.dart index fb5c54a563e..7df153f845a 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 [PlatformAdsManagerDelegate]. 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..db2a5fa5f39 --- /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. + void 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. + void 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. + void setFeatureFlags(Map? featureFlags); + + /// Specifies whether to automatically play VMAP and ad rules ad breaks. + /// + /// The default value is true. + void 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. + void 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. + void 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. + void setSessionID(String? sessionID); + + /// Enables and disables the debug mode, which is disabled by default. + void setDebugMode(bool enabled); +} From bb4550eaf2ff3079724ebd58e938127aedaae33b Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 2 Jul 2025 16:18:27 -0400 Subject: [PATCH 02/29] add test stubs --- .../platform_ima_settings.dart | 16 ++-- .../platform_interface.dart | 1 + .../test/test_stubs.dart | 79 +++++++++++++++++++ 3 files changed, 88 insertions(+), 8 deletions(-) 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 index db2a5fa5f39..38f2bbd0075 100644 --- 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 @@ -78,7 +78,7 @@ abstract base class PlatformImaSettings { final PlatformImaSettingsCreationParams params; /// Sets the Publisher Provided Identification (PPID) sent with ads request. - void setPpid(String? ppid); + Future setPpid(String? ppid); /// Specifies maximum number of redirects after which subsequent redirects /// will be denied, and the ad load aborted. @@ -86,19 +86,19 @@ abstract base class PlatformImaSettings { /// In this case, the ad will raise an error with error code 302. /// /// The default value is 4. - void setMaxRedirects(int maxRedirects); + 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. - void setFeatureFlags(Map? featureFlags); + Future setFeatureFlags(Map? featureFlags); /// Specifies whether to automatically play VMAP and ad rules ad breaks. /// /// The default value is true. - void setAutoPlayAdBreaks(bool autoPlayAdBreaks); + Future setAutoPlayAdBreaks(bool autoPlayAdBreaks); /// Sets the partner specified video player that is integrating with the SDK. /// @@ -107,7 +107,7 @@ abstract base class PlatformImaSettings { /// truncated. The player type specified should be short and unique. This is /// an optional setting used to improve SDK usability by tracking player /// types. - void setPlayerType(String? playerType); + Future setPlayerType(String? playerType); /// Sets the partner specified player version that is integrating with the /// SDK. @@ -116,14 +116,14 @@ abstract base class PlatformImaSettings { /// 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. - void setPlayerVersion(String? playerVersion); + 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. - void setSessionID(String? sessionID); + Future setSessionID(String? sessionID); /// Enables and disables the debug mode, which is disabled by default. - void setDebugMode(bool enabled); + 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/test/test_stubs.dart b/packages/interactive_media_ads/test/test_stubs.dart index e8c9964a597..b4d67f1ef86 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); + } +} From c4fc99abb2d3264b89aeef0559ea4b4913895920 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 3 Jul 2025 16:09:29 -0400 Subject: [PATCH 03/29] some android impl work --- .../lib/src/android/android_ads_loader.dart | 11 ++- .../lib/src/android/android_ima_settings.dart | 79 +++++++++++++++++++ .../android_interactive_media_ads.dart | 17 +++- .../platform_ads_loader.dart | 8 ++ 4 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 packages/interactive_media_ads/lib/src/android/android_ima_settings.dart 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..8dfd3029d93 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.sdkSettingsFuture, (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..16208f0d613 --- /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 '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 sdkSettingsFuture = + ImaSdkFactory.instance.createImaSdkSettings().then( + (ImaSdkSettings settings) { + if (params.language case final String language) { + settings.setLanguage(language); + } + return settings; + }, + ); + + @override + Future setAutoPlayAdBreaks(bool autoPlayAdBreaks) async { + final ImaSdkSettings settings = await sdkSettingsFuture; + await settings.setAutoPlayAdBreaks(autoPlayAdBreaks); + } + + @override + Future setDebugMode(bool enabled) async { + final ImaSdkSettings settings = await sdkSettingsFuture; + await settings.setDebugMode(enabled); + } + + @override + Future setFeatureFlags(Map? featureFlags) async { + final ImaSdkSettings settings = await sdkSettingsFuture; + await settings.setFeatureFlags(featureFlags ?? {}); + } + + @override + Future setMaxRedirects(int maxRedirects) async { + final ImaSdkSettings settings = await sdkSettingsFuture; + await settings.setMaxRedirects(maxRedirects); + } + + @override + Future setPlayerType(String? playerType) async { + assert(playerType != null); + final ImaSdkSettings settings = await sdkSettingsFuture; + await settings.setPlayerType(playerType!); + } + + @override + Future setPlayerVersion(String? playerVersion) async { + assert(playerVersion != null); + final ImaSdkSettings settings = await sdkSettingsFuture; + await settings.setPlayerVersion(playerVersion!); + } + + @override + Future setPpid(String? ppid) async { + assert(ppid != null); + final ImaSdkSettings settings = await sdkSettingsFuture; + await settings.setPpid(ppid!); + } + + @override + Future setSessionID(String? sessionID) async { + final ImaSdkSettings settings = await sdkSettingsFuture; + await settings.setSessionId(sessionID ?? ''); + } +} 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/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; From e0c10a25511adbe045e92a9de2a775161f9c305e Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:09:36 -0400 Subject: [PATCH 04/29] ios impl --- .../lib/src/android/android_ads_loader.dart | 2 +- .../lib/src/android/android_ima_settings.dart | 37 +++++----- .../lib/src/ios/ios_ads_loader.dart | 20 ++++-- .../lib/src/ios/ios_ima_settings.dart | 68 +++++++++++++++++++ .../src/ios/ios_interactive_media_ads.dart | 9 +++ 5 files changed, 113 insertions(+), 23 deletions(-) create mode 100644 packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart 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 8dfd3029d93..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 @@ -106,7 +106,7 @@ base class AndroidAdsLoader extends PlatformAdsLoader { }; final ima.AdsLoader adsLoader = await _sdkFactory.createAdsLoader( - await settings.sdkSettingsFuture, + 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 index 16208f0d613..6c33d3cd8a5 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart @@ -2,6 +2,8 @@ // 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'; @@ -16,64 +18,65 @@ final class AndroidImaSettings extends PlatformImaSettings { /// /// Defines general SDK settings that are used when creating an `AdsLoader`. @internal - late final Future sdkSettingsFuture = - ImaSdkFactory.instance.createImaSdkSettings().then( - (ImaSdkSettings settings) { - if (params.language case final String language) { - settings.setLanguage(language); - } - return settings; - }, - ); + late final Future nativeSettingsFuture = _initSettings(); @override Future setAutoPlayAdBreaks(bool autoPlayAdBreaks) async { - final ImaSdkSettings settings = await sdkSettingsFuture; + final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setAutoPlayAdBreaks(autoPlayAdBreaks); } @override Future setDebugMode(bool enabled) async { - final ImaSdkSettings settings = await sdkSettingsFuture; + final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setDebugMode(enabled); } @override Future setFeatureFlags(Map? featureFlags) async { - final ImaSdkSettings settings = await sdkSettingsFuture; + final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setFeatureFlags(featureFlags ?? {}); } @override Future setMaxRedirects(int maxRedirects) async { - final ImaSdkSettings settings = await sdkSettingsFuture; + final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setMaxRedirects(maxRedirects); } @override Future setPlayerType(String? playerType) async { assert(playerType != null); - final ImaSdkSettings settings = await sdkSettingsFuture; + final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setPlayerType(playerType!); } @override Future setPlayerVersion(String? playerVersion) async { assert(playerVersion != null); - final ImaSdkSettings settings = await sdkSettingsFuture; + final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setPlayerVersion(playerVersion!); } @override Future setPpid(String? ppid) async { assert(ppid != null); - final ImaSdkSettings settings = await sdkSettingsFuture; + final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setPpid(ppid!); } @override Future setSessionID(String? sessionID) async { - final ImaSdkSettings settings = await sdkSettingsFuture; + final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setSessionId(sessionID ?? ''); } + + Future _initSettings() async { + final ImaSdkSettings settings = + await ImaSdkFactory.instance.createImaSdkSettings(); + if (params.language case final String language) { + unawaited(settings.setLanguage(language)); + } + return settings; + } } 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..b78542cd5c9 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 IMAAdsLoader(settings: settings.nativeSetting) + ..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..8cbc1696efd --- /dev/null +++ b/packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart @@ -0,0 +1,68 @@ +// 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 nativeSetting = _initSettings(); + + @override + Future setAutoPlayAdBreaks(bool autoPlayAdBreaks) { + return nativeSetting.setAutoPlayAdBreaks(autoPlayAdBreaks); + } + + @override + Future setDebugMode(bool enabled) { + return nativeSetting.setEnableDebugMode(enabled); + } + + @override + Future setFeatureFlags(Map? featureFlags) { + return nativeSetting.setFeatureFlags(featureFlags ?? {}); + } + + @override + Future setMaxRedirects(int maxRedirects) { + return nativeSetting.setMaxRedirects(maxRedirects); + } + + @override + Future setPlayerType(String? playerType) { + return nativeSetting.setPlayerType(playerType); + } + + @override + Future setPlayerVersion(String? playerVersion) { + return nativeSetting.setPlayerVersion(playerVersion); + } + + @override + Future setPpid(String? ppid) { + return nativeSetting.setPPID(ppid); + } + + @override + Future setSessionID(String? sessionID) { + return nativeSetting.setSessionID(sessionID ?? ''); + } + + IMASettings _initSettings() { + 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); + } } From 171d05043091762033eced715f6b4bc3372f71fe Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:21:35 -0400 Subject: [PATCH 05/29] add app facing class --- .../lib/interactive_media_ads.dart | 1 + .../lib/src/ads_loader.dart | 3 + .../lib/src/ima_settings.dart | 87 +++++++++++++++++++ .../lib/src/ios/ios_ads_loader.dart | 2 +- .../lib/src/ios/ios_ima_settings.dart | 25 ++++-- 5 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 packages/interactive_media_ads/lib/src/ima_settings.dart 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..60c679d7ee6 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? imaSettings, }) : this.fromPlatformCreationParams( PlatformAdsLoaderCreationParams( container: container.platform, + settings: imaSettings?.platform ?? ImaSettings().platform, onAdsLoaded: (PlatformOnAdsLoadedData data) { onAdsLoaded(OnAdsLoadedData._(platform: data)); }, 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..f56bdcbdc4b --- /dev/null +++ b/packages/interactive_media_ads/lib/src/ima_settings.dart @@ -0,0 +1,87 @@ +// 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 'platform_interface/platform_interface.dart'; + +/// Defines general SDK settings that are used when creating an `AdsLoader`. +class ImaSettings { + /// Creates an [ImaSettings]. + ImaSettings({String? language}) + : this.fromPlatform(PlatformImaSettings( + PlatformImaSettingsCreationParams(language: language), + )); + + /// Constructs an [ImaSettings] from a specific platform + /// implementation. + 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); + } +} 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 b78542cd5c9..5714e490c99 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 @@ -119,7 +119,7 @@ base class IOSAdsLoader extends PlatformAdsLoader { _ => IOSImaSettings(_iosParams.settings.params), }; - return IMAAdsLoader(settings: settings.nativeSetting) + return IMAAdsLoader(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 index 8cbc1696efd..831de95e3ca 100644 --- a/packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart @@ -16,46 +16,53 @@ final class IOSImaSettings extends PlatformImaSettings { /// /// Defines general SDK settings that are used when creating an `IMAAdsLoader`. @internal - late final IMASettings nativeSetting = _initSettings(); + late final IMASettings nativeSettings = _initSettings(); @override Future setAutoPlayAdBreaks(bool autoPlayAdBreaks) { - return nativeSetting.setAutoPlayAdBreaks(autoPlayAdBreaks); + return nativeSettings.setAutoPlayAdBreaks(autoPlayAdBreaks); } @override Future setDebugMode(bool enabled) { - return nativeSetting.setEnableDebugMode(enabled); + return nativeSettings.setEnableDebugMode(enabled); } @override Future setFeatureFlags(Map? featureFlags) { - return nativeSetting.setFeatureFlags(featureFlags ?? {}); + return nativeSettings.setFeatureFlags(featureFlags ?? {}); } @override Future setMaxRedirects(int maxRedirects) { - return nativeSetting.setMaxRedirects(maxRedirects); + return nativeSettings.setMaxRedirects(maxRedirects); } @override Future setPlayerType(String? playerType) { - return nativeSetting.setPlayerType(playerType); + return nativeSettings.setPlayerType(playerType); } @override Future setPlayerVersion(String? playerVersion) { - return nativeSetting.setPlayerVersion(playerVersion); + return nativeSettings.setPlayerVersion(playerVersion); } @override Future setPpid(String? ppid) { - return nativeSetting.setPPID(ppid); + return nativeSettings.setPPID(ppid); } @override Future setSessionID(String? sessionID) { - return nativeSetting.setSessionID(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 _initSettings() { From 66c6ec8abdcae41b86821f1119f0c5132fbaa161 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:26:33 -0400 Subject: [PATCH 06/29] make class immuatable and return settings --- .../interactive_media_ads/lib/src/ads_loader.dart | 8 ++++++-- .../interactive_media_ads/lib/src/ima_settings.dart | 12 +++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/interactive_media_ads/lib/src/ads_loader.dart b/packages/interactive_media_ads/lib/src/ads_loader.dart index 60c679d7ee6..6855810c054 100644 --- a/packages/interactive_media_ads/lib/src/ads_loader.dart +++ b/packages/interactive_media_ads/lib/src/ads_loader.dart @@ -43,11 +43,11 @@ class AdsLoader { required AdDisplayContainer container, required void Function(OnAdsLoadedData data) onAdsLoaded, required void Function(AdsLoadErrorData data) onAdsLoadError, - ImaSettings? imaSettings, + ImaSettings? settings, }) : this.fromPlatformCreationParams( PlatformAdsLoaderCreationParams( container: container.platform, - settings: imaSettings?.platform ?? ImaSettings().platform, + settings: settings?.platform ?? ImaSettings().platform, onAdsLoaded: (PlatformOnAdsLoadedData data) { onAdsLoaded(OnAdsLoadedData._(platform: data)); }, @@ -92,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/ima_settings.dart b/packages/interactive_media_ads/lib/src/ima_settings.dart index f56bdcbdc4b..39e34a4b4cd 100644 --- a/packages/interactive_media_ads/lib/src/ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/ima_settings.dart @@ -2,9 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/cupertino.dart'; + import 'platform_interface/platform_interface.dart'; /// Defines general SDK settings that are used when creating an `AdsLoader`. +@immutable class ImaSettings { /// Creates an [ImaSettings]. ImaSettings({String? language}) @@ -14,7 +17,7 @@ class ImaSettings { /// Constructs an [ImaSettings] from a specific platform /// implementation. - ImaSettings.fromPlatform(this.platform); + const ImaSettings.fromPlatform(this.platform); /// Implementation of [PlatformImaSettings] for the current platform. final PlatformImaSettings platform; @@ -84,4 +87,11 @@ class ImaSettings { 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; } From 6ffe107a251d72ace466b8aee8852578e472f0f3 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:28:41 -0400 Subject: [PATCH 07/29] add better docs --- packages/interactive_media_ads/lib/src/ima_settings.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/interactive_media_ads/lib/src/ima_settings.dart b/packages/interactive_media_ads/lib/src/ima_settings.dart index 39e34a4b4cd..e7b1d8c376b 100644 --- a/packages/interactive_media_ads/lib/src/ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/ima_settings.dart @@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'ads_loader.dart'; import 'platform_interface/platform_interface.dart'; -/// Defines general SDK settings that are used when creating an `AdsLoader`. +/// Defines general SDK settings that are used when creating an [AdsLoader]. @immutable class ImaSettings { /// Creates an [ImaSettings]. From a38e789c913cd735b1a0a5896aee3b91134b13a0 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 9 Jul 2025 16:44:01 -0400 Subject: [PATCH 08/29] formatting and updating android --- .../ImaSdkSettingsProxyApi.kt | 15 +++++++----- .../InteractiveMediaAdsLibrary.g.kt | 24 +++++++++---------- .../lib/src/android/android_ima_settings.dart | 12 ++++------ .../src/android/interactive_media_ads.g.dart | 12 +++++----- .../interactive_media_ads_android.dart | 12 +++++----- 5 files changed, 38 insertions(+), 37 deletions(-) diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt index ed91e3e0093..34bf6533aff 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt @@ -22,11 +22,14 @@ class ImaSdkSettingsProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : pigeon_instance.isDebugMode = debugMode } - override fun setFeatureFlags(pigeon_instance: ImaSdkSettings, featureFlags: Map) { + override fun setFeatureFlags( + pigeon_instance: ImaSdkSettings, + featureFlags: Map? + ) { pigeon_instance.featureFlags = featureFlags } - override fun setLanguage(pigeon_instance: ImaSdkSettings, language: String) { + override fun setLanguage(pigeon_instance: ImaSdkSettings, language: String?) { pigeon_instance.language = language } @@ -34,19 +37,19 @@ class ImaSdkSettingsProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : pigeon_instance.maxRedirects = maxRedirects.toInt() } - override fun setPlayerType(pigeon_instance: ImaSdkSettings, playerType: String) { + override fun setPlayerType(pigeon_instance: ImaSdkSettings, playerType: String?) { pigeon_instance.playerType = playerType } - override fun setPlayerVersion(pigeon_instance: ImaSdkSettings, playerVersion: String) { + override fun setPlayerVersion(pigeon_instance: ImaSdkSettings, playerVersion: String?) { pigeon_instance.playerVersion = playerVersion } - override fun setPpid(pigeon_instance: ImaSdkSettings, ppid: String) { + override fun setPpid(pigeon_instance: ImaSdkSettings, ppid: String?) { pigeon_instance.ppid = ppid } - override fun setSessionId(pigeon_instance: ImaSdkSettings, sessionId: String) { + override fun setSessionId(pigeon_instance: ImaSdkSettings, sessionId: String?) { pigeon_instance.sessionId = sessionId } } diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt index eaf4a77c1c7..88c2da7594b 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 @@ -2577,7 +2577,7 @@ abstract class PigeonApiImaSdkSettings( */ abstract fun setFeatureFlags( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - featureFlags: Map + featureFlags: Map? ) /** @@ -2590,7 +2590,7 @@ abstract class PigeonApiImaSdkSettings( */ abstract fun setLanguage( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - language: String + language: String? ) /** @@ -2612,7 +2612,7 @@ abstract class PigeonApiImaSdkSettings( */ abstract fun setPlayerType( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - playerType: String + playerType: String? ) /** @@ -2622,13 +2622,13 @@ abstract class PigeonApiImaSdkSettings( */ abstract fun setPlayerVersion( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - playerVersion: String + playerVersion: String? ) /** Sets the publisher provided ID used for tracking. */ abstract fun setPpid( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - ppid: String + ppid: String? ) /** @@ -2638,7 +2638,7 @@ abstract class PigeonApiImaSdkSettings( */ abstract fun setSessionId( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - sessionId: String + sessionId: String? ) companion object { @@ -2706,7 +2706,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val featureFlagsArg = args[1] as Map + val featureFlagsArg = args[1] as Map? val wrapped: List = try { api.setFeatureFlags(pigeon_instanceArg, featureFlagsArg) @@ -2731,7 +2731,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val languageArg = args[1] as String + val languageArg = args[1] as String? val wrapped: List = try { api.setLanguage(pigeon_instanceArg, languageArg) @@ -2781,7 +2781,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val playerTypeArg = args[1] as String + val playerTypeArg = args[1] as String? val wrapped: List = try { api.setPlayerType(pigeon_instanceArg, playerTypeArg) @@ -2806,7 +2806,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val playerVersionArg = args[1] as String + val playerVersionArg = args[1] as String? val wrapped: List = try { api.setPlayerVersion(pigeon_instanceArg, playerVersionArg) @@ -2831,7 +2831,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val ppidArg = args[1] as String + val ppidArg = args[1] as String? val wrapped: List = try { api.setPpid(pigeon_instanceArg, ppidArg) @@ -2856,7 +2856,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val sessionIdArg = args[1] as String + val sessionIdArg = args[1] as String? val wrapped: List = try { api.setSessionId(pigeon_instanceArg, sessionIdArg) 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 index 6c33d3cd8a5..df36e9a98f3 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart @@ -35,7 +35,7 @@ final class AndroidImaSettings extends PlatformImaSettings { @override Future setFeatureFlags(Map? featureFlags) async { final ImaSdkSettings settings = await nativeSettingsFuture; - await settings.setFeatureFlags(featureFlags ?? {}); + await settings.setFeatureFlags(featureFlags); } @override @@ -46,29 +46,27 @@ final class AndroidImaSettings extends PlatformImaSettings { @override Future setPlayerType(String? playerType) async { - assert(playerType != null); final ImaSdkSettings settings = await nativeSettingsFuture; - await settings.setPlayerType(playerType!); + await settings.setPlayerType(playerType); } @override Future setPlayerVersion(String? playerVersion) async { assert(playerVersion != null); final ImaSdkSettings settings = await nativeSettingsFuture; - await settings.setPlayerVersion(playerVersion!); + await settings.setPlayerVersion(playerVersion); } @override Future setPpid(String? ppid) async { - assert(ppid != null); final ImaSdkSettings settings = await nativeSettingsFuture; - await settings.setPpid(ppid!); + await settings.setPpid(ppid); } @override Future setSessionID(String? sessionID) async { final ImaSdkSettings settings = await nativeSettingsFuture; - await settings.setSessionId(sessionID ?? ''); + await settings.setSessionId(sessionID); } Future _initSettings() async { 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..fe84aa1a09f 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 @@ -2794,7 +2794,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// 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) async { + Future setFeatureFlags(Map? featureFlags) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -2830,7 +2830,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// /// Once the AdsLoader object has been created, using this setter will have no /// effect. - Future setLanguage(String language) async { + Future setLanguage(String? language) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -2896,7 +2896,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// /// Player type greater than 20 characters will be truncated. The player type /// specified should be short and unique. - Future setPlayerType(String playerType) async { + Future setPlayerType(String? playerType) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -2928,7 +2928,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// Sets the partner provided player version. /// /// Player versions greater than 20 characters will be truncated. - Future setPlayerVersion(String playerVersion) async { + Future setPlayerVersion(String? playerVersion) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -2958,7 +2958,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { } /// Sets the publisher provided ID used for tracking. - Future setPpid(String ppid) async { + Future setPpid(String? ppid) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -2991,7 +2991,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// /// A session ID must be a UUID, or an empty string if the SDK should not send /// a session ID. - Future setSessionId(String sessionId) async { + Future setSessionId(String? sessionId) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; diff --git a/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart b/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart index e87b292f8d0..00a7ff8981b 100644 --- a/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart +++ b/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart @@ -503,7 +503,7 @@ abstract class ImaSdkSettings { /// 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. - void setFeatureFlags(Map featureFlags); + void setFeatureFlags(Map? featureFlags); /// Sets the preferred language for the ad UI. /// @@ -512,7 +512,7 @@ abstract class ImaSdkSettings { /// /// Once the AdsLoader object has been created, using this setter will have no /// effect. - void setLanguage(String language); + void setLanguage(String? language); /// Specifies the maximum number of redirects before the subsequent redirects /// will be denied and the ad load aborted. @@ -524,21 +524,21 @@ abstract class ImaSdkSettings { /// /// Player type greater than 20 characters will be truncated. The player type /// specified should be short and unique. - void setPlayerType(String playerType); + void setPlayerType(String? playerType); /// Sets the partner provided player version. /// /// Player versions greater than 20 characters will be truncated. - void setPlayerVersion(String playerVersion); + void setPlayerVersion(String? playerVersion); /// Sets the publisher provided ID used for tracking. - void setPpid(String ppid); + void setPpid(String? ppid); /// Session ID is a temporary random ID. /// /// A session ID must be a UUID, or an empty string if the SDK should not send /// a session ID. - void setSessionId(String sessionId); + void setSessionId(String? sessionId); } /// Defines an update to the video's progress. From d94cb5b5094470a4a0ba36b787bead81689db182 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 9 Jul 2025 16:48:10 -0400 Subject: [PATCH 09/29] fix app facing test --- packages/interactive_media_ads/test/ads_loader_test.dart | 2 ++ 1 file changed, 2 insertions(+) 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) {}, ), From b6235d6ba0f1742e2a15a4a878fd3e554801598d Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:14:53 -0400 Subject: [PATCH 10/29] update pigeon --- .../InteractiveMediaAdsLibrary.g.kt | 2 +- .../InteractiveMediaAdsLibrary.g.swift | 2 +- .../src/android/interactive_media_ads.g.dart | 380 +++++++++++++- .../lib/src/ios/interactive_media_ads.g.dart | 475 +++++++++++++++++- packages/interactive_media_ads/pubspec.yaml | 2 +- 5 files changed, 829 insertions(+), 32 deletions(-) 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 88c2da7594b..878f6bbafd1 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/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/src/android/interactive_media_ads.g.dart b/packages/interactive_media_ads/lib/src/android/interactive_media_ads.g.dart index fe84aa1a09f..fc0d202a4f4 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/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/pubspec.yaml b/packages/interactive_media_ads/pubspec.yaml index d5b2f374c7e..94d55805b2f 100644 --- a/packages/interactive_media_ads/pubspec.yaml +++ b/packages/interactive_media_ads/pubspec.yaml @@ -31,7 +31,7 @@ dev_dependencies: flutter_test: sdk: flutter mockito: ^5.4.4 - pigeon: ^25.5.0 + pigeon: ^26.0.0 topics: - ads From 032d8e7ea59d393263db753e42c4df17e8ecc5ce Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:57:13 -0400 Subject: [PATCH 11/29] fix android adsloader test --- .../test/android/ads_loader_test.dart | 42 +++++++-- .../test/android/ads_loader_test.mocks.dart | 93 +++++++++++++++++++ 2 files changed, 129 insertions(+), 6 deletions(-) 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..808d60c5c77 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,6 +42,10 @@ 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); @@ -48,6 +53,9 @@ void main() { AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, + settings: AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, ), @@ -65,6 +73,9 @@ void main() { final AndroidAdsLoader loader = AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, + settings: AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, ), @@ -102,6 +113,9 @@ void main() { final AndroidAdsLoader adsLoader = AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, + settings: AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, proxy: proxy, @@ -171,6 +185,9 @@ void main() { AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, + settings: AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ), onAdsLoaded: expectAsync1((_) {}), onAdsLoadError: (_) {}, proxy: proxy, @@ -229,6 +246,9 @@ void main() { AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, + settings: AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ), onAdsLoaded: (_) {}, onAdsLoadError: expectAsync1((_) {}), proxy: proxy, @@ -262,12 +282,6 @@ Future _pumpAdDisplayContainer( dynamic onCompletion, }) => MockVideoView(), - createAdDisplayContainerImaSdkFactory: ( - _, - __, - ) async { - return MockAdDisplayContainer(); - }, newVideoAdPlayer: ({ required void Function( ima.VideoAdPlayer, @@ -286,6 +300,22 @@ Future _pumpAdDisplayContainer( return MockVideoAdPlayer(); }, ); + final MockImaSdkFactory mockImaSdkFactory = MockImaSdkFactory(); + final MockImaSdkSettings mockImaSdkSettings = MockImaSdkSettings(); + final MockAdDisplayContainer mockAdDisplayContainer = + MockAdDisplayContainer(); + when(mockImaSdkFactory.createImaSdkSettings()).thenAnswer( + (_) async => mockImaSdkSettings, + ); + when(mockImaSdkFactory.createAdsLoader( + mockImaSdkSettings, mockAdDisplayContainer)) + .thenAnswer( + (_) async => MockAdsLoader(), + ); + ima.PigeonOverrides.imaSdkFactory_instance = mockImaSdkFactory; + ima.PigeonOverrides.imaSdkFactory_createAdDisplayContainer = (_, __) async { + return mockAdDisplayContainer; + }; final MockPlatformViewsServiceProxy mockPlatformViewsProxy = MockPlatformViewsServiceProxy(); 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( From b2c2a60bf4bb5e3f773d4662b4e8180bffbfbcba Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 17 Jul 2025 19:10:11 -0400 Subject: [PATCH 12/29] revert changes to android ads loader test --- .../test/android/ads_loader_test.dart | 42 +++---------------- 1 file changed, 6 insertions(+), 36 deletions(-) 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 808d60c5c77..ae25fdde99f 100644 --- a/packages/interactive_media_ads/test/android/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/android/ads_loader_test.dart @@ -10,7 +10,6 @@ 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'; @@ -42,10 +41,6 @@ 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); @@ -53,9 +48,6 @@ void main() { AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, - settings: AndroidImaSettings( - const PlatformImaSettingsCreationParams(), - ), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, ), @@ -73,9 +65,6 @@ void main() { final AndroidAdsLoader loader = AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, - settings: AndroidImaSettings( - const PlatformImaSettingsCreationParams(), - ), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, ), @@ -113,9 +102,6 @@ void main() { final AndroidAdsLoader adsLoader = AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, - settings: AndroidImaSettings( - const PlatformImaSettingsCreationParams(), - ), onAdsLoaded: (PlatformOnAdsLoadedData data) {}, onAdsLoadError: (AdsLoadErrorData data) {}, proxy: proxy, @@ -185,9 +171,6 @@ void main() { AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, - settings: AndroidImaSettings( - const PlatformImaSettingsCreationParams(), - ), onAdsLoaded: expectAsync1((_) {}), onAdsLoadError: (_) {}, proxy: proxy, @@ -246,9 +229,6 @@ void main() { AndroidAdsLoader( AndroidAdsLoaderCreationParams( container: container, - settings: AndroidImaSettings( - const PlatformImaSettingsCreationParams(), - ), onAdsLoaded: (_) {}, onAdsLoadError: expectAsync1((_) {}), proxy: proxy, @@ -282,6 +262,12 @@ Future _pumpAdDisplayContainer( dynamic onCompletion, }) => MockVideoView(), + createAdDisplayContainerImaSdkFactory: ( + _, + __, + ) async { + return MockAdDisplayContainer(); + }, newVideoAdPlayer: ({ required void Function( ima.VideoAdPlayer, @@ -300,22 +286,6 @@ Future _pumpAdDisplayContainer( return MockVideoAdPlayer(); }, ); - final MockImaSdkFactory mockImaSdkFactory = MockImaSdkFactory(); - final MockImaSdkSettings mockImaSdkSettings = MockImaSdkSettings(); - final MockAdDisplayContainer mockAdDisplayContainer = - MockAdDisplayContainer(); - when(mockImaSdkFactory.createImaSdkSettings()).thenAnswer( - (_) async => mockImaSdkSettings, - ); - when(mockImaSdkFactory.createAdsLoader( - mockImaSdkSettings, mockAdDisplayContainer)) - .thenAnswer( - (_) async => MockAdsLoader(), - ); - ima.PigeonOverrides.imaSdkFactory_instance = mockImaSdkFactory; - ima.PigeonOverrides.imaSdkFactory_createAdDisplayContainer = (_, __) async { - return mockAdDisplayContainer; - }; final MockPlatformViewsServiceProxy mockPlatformViewsProxy = MockPlatformViewsServiceProxy(); From 7b1712915e9a80e40de6311a695ad639f5db67f0 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 17 Jul 2025 20:46:48 -0400 Subject: [PATCH 13/29] fix android tests --- .../test/android/ads_loader_test.dart | 93 ++++++++++++------- 1 file changed, 60 insertions(+), 33 deletions(-) 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..1c16cf81717 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, From de045bfb76648c1f489609a6c03d48130ebb31dc Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 11:57:05 -0400 Subject: [PATCH 14/29] fix ios loader tests --- .../lib/src/ios/ios_ads_loader.dart | 2 +- .../test/android/ads_loader_test.dart | 2 +- .../test/ios/ads_loader_test.dart | 27 ++- .../test/ios/ads_loader_test.mocks.dart | 181 +++++++++++++++++- 4 files changed, 204 insertions(+), 8 deletions(-) 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 5714e490c99..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 @@ -119,7 +119,7 @@ base class IOSAdsLoader extends PlatformAdsLoader { _ => IOSImaSettings(_iosParams.settings.params), }; - return IMAAdsLoader(settings: settings.nativeSettings) + return _iosParams._proxy.newIMAAdsLoader(settings: settings.nativeSettings) ..setDelegate(_delegate); } } 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 1c16cf81717..084ad3edef3 100644 --- a/packages/interactive_media_ads/test/android/ads_loader_test.dart +++ b/packages/interactive_media_ads/test/android/ads_loader_test.dart @@ -45,7 +45,7 @@ void main() { setUp(() { ima.PigeonOverrides.pigeon_reset(); }); - + testWidgets('instantiate AndroidAdsLoader', (WidgetTester tester) async { final AndroidAdDisplayContainer container = await _pumpAdDisplayContainer(tester); 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, From 2798ecf809885f9c383d1ac9de042a6f2928b543 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 12:25:40 -0400 Subject: [PATCH 15/29] android ima settings test --- .../test/android/ima_settings_test.dart | 144 +++++++ .../test/android/ima_settings_test.mocks.dart | 403 ++++++++++++++++++ 2 files changed, 547 insertions(+) create mode 100644 packages/interactive_media_ads/test/android/ima_settings_test.dart create mode 100644 packages/interactive_media_ads/test/android/ima_settings_test.mocks.dart 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..b2fe30181b1 --- /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('autoPlayAdBreaks', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const bool autoPlayAdBreaks = true; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setAutoPlayAdBreaks(autoPlayAdBreaks); + + verify(mockImaSdkSettings.setAutoPlayAdBreaks(autoPlayAdBreaks)); + }); + + test('debugMode', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const bool debugMode = false; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setDebugMode(debugMode); + + verify(mockImaSdkSettings.setDebugMode(debugMode)); + }); + + test('featureFlags', () 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('maxRedirects', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const int maxRedirects = 12; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setMaxRedirects(maxRedirects); + + verify(mockImaSdkSettings.setMaxRedirects(maxRedirects)); + }); + + test('playerType', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const String playerType = 'playerType'; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPlayerType(playerType); + + verify(mockImaSdkSettings.setPlayerType(playerType)); + }); + + test('playerVersion', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const String playerVersion = 'playerVersion'; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPlayerVersion(playerVersion); + + verify(mockImaSdkSettings.setPlayerVersion(playerVersion)); + }); + + test('ppid', () async { + final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); + + const String ppid = 'ppid'; + final AndroidImaSettings settings = AndroidImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPpid(ppid); + + verify(mockImaSdkSettings.setPpid(ppid)); + }); + + test('sessionID', () 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); +} From c0b52fd26e8867758ff1450e085de87e6d2ba14c Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 12:30:24 -0400 Subject: [PATCH 16/29] add ios settings --- .../test/ios/ima_settings_test.dart | 141 ++++++++++++ .../test/ios/ima_settings_test.mocks.dart | 208 ++++++++++++++++++ 2 files changed, 349 insertions(+) create mode 100644 packages/interactive_media_ads/test/ios/ima_settings_test.dart create mode 100644 packages/interactive_media_ads/test/ios/ima_settings_test.mocks.dart 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..3c24f468e4c --- /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('autoPlayAdBreaks', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const bool autoPlayAdBreaks = true; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setAutoPlayAdBreaks(autoPlayAdBreaks); + + verify(mockIMASettings.setAutoPlayAdBreaks(autoPlayAdBreaks)); + }); + + test('debugMode', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const bool debugMode = false; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setDebugMode(debugMode); + + verify(mockIMASettings.setEnableDebugMode(debugMode)); + }); + + test('featureFlags', () 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('maxRedirects', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const int maxRedirects = 12; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setMaxRedirects(maxRedirects); + + verify(mockIMASettings.setMaxRedirects(maxRedirects)); + }); + + test('playerType', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const String playerType = 'playerType'; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPlayerType(playerType); + + verify(mockIMASettings.setPlayerType(playerType)); + }); + + test('playerVersion', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const String playerVersion = 'playerVersion'; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPlayerVersion(playerVersion); + + verify(mockIMASettings.setPlayerVersion(playerVersion)); + }); + + test('ppid', () async { + final MockIMASettings mockIMASettings = _mockIMASettings(); + + const String ppid = 'ppid'; + final IOSImaSettings settings = IOSImaSettings( + const PlatformImaSettingsCreationParams(), + ); + await settings.setPpid(ppid); + + verify(mockIMASettings.setPPID(ppid)); + }); + + test('sessionID', () 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); +} From 6ad5d1a78455657a445e02070d342121d95fde8f Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 12:52:27 -0400 Subject: [PATCH 17/29] ima settings test for app-facing --- .../test/android/ima_settings_test.dart | 16 +-- .../test/ima_settings_test.dart | 115 ++++++++++++++++++ .../test/ios/ima_settings_test.dart | 16 +-- 3 files changed, 131 insertions(+), 16 deletions(-) create mode 100644 packages/interactive_media_ads/test/ima_settings_test.dart diff --git a/packages/interactive_media_ads/test/android/ima_settings_test.dart b/packages/interactive_media_ads/test/android/ima_settings_test.dart index b2fe30181b1..e1286b51743 100644 --- a/packages/interactive_media_ads/test/android/ima_settings_test.dart +++ b/packages/interactive_media_ads/test/android/ima_settings_test.dart @@ -34,7 +34,7 @@ void main() { verify(mockImaSdkSettings.setLanguage(language)); }); - test('autoPlayAdBreaks', () async { + test('setAutoPlayAdBreaks', () async { final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); const bool autoPlayAdBreaks = true; @@ -46,7 +46,7 @@ void main() { verify(mockImaSdkSettings.setAutoPlayAdBreaks(autoPlayAdBreaks)); }); - test('debugMode', () async { + test('setDebugMode', () async { final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); const bool debugMode = false; @@ -58,7 +58,7 @@ void main() { verify(mockImaSdkSettings.setDebugMode(debugMode)); }); - test('featureFlags', () async { + test('setFeatureFlags', () async { final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); const Map featureFlags = {'a': 'flag'}; @@ -70,7 +70,7 @@ void main() { verify(mockImaSdkSettings.setFeatureFlags(featureFlags)); }); - test('maxRedirects', () async { + test('setMaxRedirects', () async { final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); const int maxRedirects = 12; @@ -82,7 +82,7 @@ void main() { verify(mockImaSdkSettings.setMaxRedirects(maxRedirects)); }); - test('playerType', () async { + test('setPlayerType', () async { final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); const String playerType = 'playerType'; @@ -94,7 +94,7 @@ void main() { verify(mockImaSdkSettings.setPlayerType(playerType)); }); - test('playerVersion', () async { + test('setPlayerVersion', () async { final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); const String playerVersion = 'playerVersion'; @@ -106,7 +106,7 @@ void main() { verify(mockImaSdkSettings.setPlayerVersion(playerVersion)); }); - test('ppid', () async { + test('setPpid', () async { final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); const String ppid = 'ppid'; @@ -118,7 +118,7 @@ void main() { verify(mockImaSdkSettings.setPpid(ppid)); }); - test('sessionID', () async { + test('setSessionID', () async { final MockImaSdkSettings mockImaSdkSettings = _mockImaSdkSettings(); const String sessionID = 'sessionID'; 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..4b4b051604c --- /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/ima_settings_test.dart b/packages/interactive_media_ads/test/ios/ima_settings_test.dart index 3c24f468e4c..5f97779268a 100644 --- a/packages/interactive_media_ads/test/ios/ima_settings_test.dart +++ b/packages/interactive_media_ads/test/ios/ima_settings_test.dart @@ -35,7 +35,7 @@ void main() { verify(mockIMASettings.setLanguage(language)); }); - test('autoPlayAdBreaks', () async { + test('setAutoPlayAdBreaks', () async { final MockIMASettings mockIMASettings = _mockIMASettings(); const bool autoPlayAdBreaks = true; @@ -47,7 +47,7 @@ void main() { verify(mockIMASettings.setAutoPlayAdBreaks(autoPlayAdBreaks)); }); - test('debugMode', () async { + test('setDebugMode', () async { final MockIMASettings mockIMASettings = _mockIMASettings(); const bool debugMode = false; @@ -59,7 +59,7 @@ void main() { verify(mockIMASettings.setEnableDebugMode(debugMode)); }); - test('featureFlags', () async { + test('setFeatureFlags', () async { final MockIMASettings mockIMASettings = _mockIMASettings(); const Map featureFlags = {'a': 'flag'}; @@ -71,7 +71,7 @@ void main() { verify(mockIMASettings.setFeatureFlags(featureFlags)); }); - test('maxRedirects', () async { + test('setMaxRedirects', () async { final MockIMASettings mockIMASettings = _mockIMASettings(); const int maxRedirects = 12; @@ -83,7 +83,7 @@ void main() { verify(mockIMASettings.setMaxRedirects(maxRedirects)); }); - test('playerType', () async { + test('setPlayerType', () async { final MockIMASettings mockIMASettings = _mockIMASettings(); const String playerType = 'playerType'; @@ -95,7 +95,7 @@ void main() { verify(mockIMASettings.setPlayerType(playerType)); }); - test('playerVersion', () async { + test('setPlayerVersion', () async { final MockIMASettings mockIMASettings = _mockIMASettings(); const String playerVersion = 'playerVersion'; @@ -107,7 +107,7 @@ void main() { verify(mockIMASettings.setPlayerVersion(playerVersion)); }); - test('ppid', () async { + test('setPpid', () async { final MockIMASettings mockIMASettings = _mockIMASettings(); const String ppid = 'ppid'; @@ -119,7 +119,7 @@ void main() { verify(mockIMASettings.setPPID(ppid)); }); - test('sessionID', () async { + test('setSessionID', () async { final MockIMASettings mockIMASettings = _mockIMASettings(); const String sessionID = 'sessionID'; From 8792a509a79831a7c5138da8c51e0f8ec944d713 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 12:55:02 -0400 Subject: [PATCH 18/29] version bump --- packages/interactive_media_ads/CHANGELOG.md | 4 ++++ .../packages/interactive_media_ads/AdsRequestProxyApi.kt | 2 +- .../interactive_media_ads/AdsRequestProxyAPIDelegate.swift | 2 +- packages/interactive_media_ads/pubspec.yaml | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/interactive_media_ads/CHANGELOG.md b/packages/interactive_media_ads/CHANGELOG.md index 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/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/pubspec.yaml b/packages/interactive_media_ads/pubspec.yaml index 53024d7a1bd..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` From bfa41ee73f304a7b7e343458c47953ed89e6f4e6 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:04:04 -0400 Subject: [PATCH 19/29] remove html brackets --- .../lib/src/platform_interface/ad_error.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 9962724d0e67fa786554e325a82b4cf02e056a99 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:35:10 -0400 Subject: [PATCH 20/29] gemini code assist review --- .../lib/src/android/android_ima_settings.dart | 1 - .../interactive_media_ads/lib/src/ios/ios_ima_settings.dart | 2 +- .../platform_interface/platform_content_progress_provider.dart | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) 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 index df36e9a98f3..25d00b416d7 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart @@ -52,7 +52,6 @@ final class AndroidImaSettings extends PlatformImaSettings { @override Future setPlayerVersion(String? playerVersion) async { - assert(playerVersion != null); final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setPlayerVersion(playerVersion); } 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 index 831de95e3ca..0558a8febd5 100644 --- a/packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart @@ -55,7 +55,7 @@ final class IOSImaSettings extends PlatformImaSettings { @override Future setSessionID(String? sessionID) { - return nativeSettings.setSessionID(sessionID ?? ''); + return nativeSettings.setSessionID(sessionID); } /// Enable background audio playback for the SDK. 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 7df153f845a..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, ) { From 377d7f5145169a581ccc818ff2870664458d68f5 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:41:03 -0400 Subject: [PATCH 21/29] update android to take nonnull values --- .../ImaSdkSettingsProxyApi.kt | 12 +++++----- .../InteractiveMediaAdsLibrary.g.kt | 24 +++++++++---------- .../src/android/interactive_media_ads.g.dart | 12 +++++----- .../interactive_media_ads_android.dart | 12 +++++----- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt index 34bf6533aff..79060c94434 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt @@ -24,12 +24,12 @@ class ImaSdkSettingsProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : override fun setFeatureFlags( pigeon_instance: ImaSdkSettings, - featureFlags: Map? + featureFlags: Map ) { pigeon_instance.featureFlags = featureFlags } - override fun setLanguage(pigeon_instance: ImaSdkSettings, language: String?) { + override fun setLanguage(pigeon_instance: ImaSdkSettings, language: String) { pigeon_instance.language = language } @@ -37,19 +37,19 @@ class ImaSdkSettingsProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : pigeon_instance.maxRedirects = maxRedirects.toInt() } - override fun setPlayerType(pigeon_instance: ImaSdkSettings, playerType: String?) { + override fun setPlayerType(pigeon_instance: ImaSdkSettings, playerType: String) { pigeon_instance.playerType = playerType } - override fun setPlayerVersion(pigeon_instance: ImaSdkSettings, playerVersion: String?) { + override fun setPlayerVersion(pigeon_instance: ImaSdkSettings, playerVersion: String) { pigeon_instance.playerVersion = playerVersion } - override fun setPpid(pigeon_instance: ImaSdkSettings, ppid: String?) { + override fun setPpid(pigeon_instance: ImaSdkSettings, ppid: String) { pigeon_instance.ppid = ppid } - override fun setSessionId(pigeon_instance: ImaSdkSettings, sessionId: String?) { + override fun setSessionId(pigeon_instance: ImaSdkSettings, sessionId: String) { pigeon_instance.sessionId = sessionId } } diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt index 878f6bbafd1..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 @@ -2577,7 +2577,7 @@ abstract class PigeonApiImaSdkSettings( */ abstract fun setFeatureFlags( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - featureFlags: Map? + featureFlags: Map ) /** @@ -2590,7 +2590,7 @@ abstract class PigeonApiImaSdkSettings( */ abstract fun setLanguage( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - language: String? + language: String ) /** @@ -2612,7 +2612,7 @@ abstract class PigeonApiImaSdkSettings( */ abstract fun setPlayerType( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - playerType: String? + playerType: String ) /** @@ -2622,13 +2622,13 @@ abstract class PigeonApiImaSdkSettings( */ abstract fun setPlayerVersion( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - playerVersion: String? + playerVersion: String ) /** Sets the publisher provided ID used for tracking. */ abstract fun setPpid( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - ppid: String? + ppid: String ) /** @@ -2638,7 +2638,7 @@ abstract class PigeonApiImaSdkSettings( */ abstract fun setSessionId( pigeon_instance: com.google.ads.interactivemedia.v3.api.ImaSdkSettings, - sessionId: String? + sessionId: String ) companion object { @@ -2706,7 +2706,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val featureFlagsArg = args[1] as Map? + val featureFlagsArg = args[1] as Map val wrapped: List = try { api.setFeatureFlags(pigeon_instanceArg, featureFlagsArg) @@ -2731,7 +2731,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val languageArg = args[1] as String? + val languageArg = args[1] as String val wrapped: List = try { api.setLanguage(pigeon_instanceArg, languageArg) @@ -2781,7 +2781,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val playerTypeArg = args[1] as String? + val playerTypeArg = args[1] as String val wrapped: List = try { api.setPlayerType(pigeon_instanceArg, playerTypeArg) @@ -2806,7 +2806,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val playerVersionArg = args[1] as String? + val playerVersionArg = args[1] as String val wrapped: List = try { api.setPlayerVersion(pigeon_instanceArg, playerVersionArg) @@ -2831,7 +2831,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val ppidArg = args[1] as String? + val ppidArg = args[1] as String val wrapped: List = try { api.setPpid(pigeon_instanceArg, ppidArg) @@ -2856,7 +2856,7 @@ abstract class PigeonApiImaSdkSettings( val args = message as List val pigeon_instanceArg = args[0] as com.google.ads.interactivemedia.v3.api.ImaSdkSettings - val sessionIdArg = args[1] as String? + val sessionIdArg = args[1] as String val wrapped: List = try { api.setSessionId(pigeon_instanceArg, sessionIdArg) 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 fc0d202a4f4..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 @@ -2941,7 +2941,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// 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) async { + Future setFeatureFlags(Map featureFlags) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -2977,7 +2977,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// /// Once the AdsLoader object has been created, using this setter will have no /// effect. - Future setLanguage(String? language) async { + Future setLanguage(String language) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -3043,7 +3043,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// /// Player type greater than 20 characters will be truncated. The player type /// specified should be short and unique. - Future setPlayerType(String? playerType) async { + Future setPlayerType(String playerType) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -3075,7 +3075,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// Sets the partner provided player version. /// /// Player versions greater than 20 characters will be truncated. - Future setPlayerVersion(String? playerVersion) async { + Future setPlayerVersion(String playerVersion) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -3105,7 +3105,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { } /// Sets the publisher provided ID used for tracking. - Future setPpid(String? ppid) async { + Future setPpid(String ppid) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; @@ -3138,7 +3138,7 @@ class ImaSdkSettings extends PigeonInternalProxyApiBaseClass { /// /// A session ID must be a UUID, or an empty string if the SDK should not send /// a session ID. - Future setSessionId(String? sessionId) async { + Future setSessionId(String sessionId) async { final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec = _pigeonVar_codecImaSdkSettings; final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger; diff --git a/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart b/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart index 00a7ff8981b..e87b292f8d0 100644 --- a/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart +++ b/packages/interactive_media_ads/pigeons/interactive_media_ads_android.dart @@ -503,7 +503,7 @@ abstract class ImaSdkSettings { /// 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. - void setFeatureFlags(Map? featureFlags); + void setFeatureFlags(Map featureFlags); /// Sets the preferred language for the ad UI. /// @@ -512,7 +512,7 @@ abstract class ImaSdkSettings { /// /// Once the AdsLoader object has been created, using this setter will have no /// effect. - void setLanguage(String? language); + void setLanguage(String language); /// Specifies the maximum number of redirects before the subsequent redirects /// will be denied and the ad load aborted. @@ -524,21 +524,21 @@ abstract class ImaSdkSettings { /// /// Player type greater than 20 characters will be truncated. The player type /// specified should be short and unique. - void setPlayerType(String? playerType); + void setPlayerType(String playerType); /// Sets the partner provided player version. /// /// Player versions greater than 20 characters will be truncated. - void setPlayerVersion(String? playerVersion); + void setPlayerVersion(String playerVersion); /// Sets the publisher provided ID used for tracking. - void setPpid(String? ppid); + void setPpid(String ppid); /// Session ID is a temporary random ID. /// /// A session ID must be a UUID, or an empty string if the SDK should not send /// a session ID. - void setSessionId(String? sessionId); + void setSessionId(String sessionId); } /// Defines an update to the video's progress. From 215b38a0460f005946ef3b79b51cc80c66665417 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:43:49 -0400 Subject: [PATCH 22/29] make android nonnull --- .../lib/src/android/android_ima_settings.dart | 10 +++++----- .../interactive_media_ads/lib/src/ima_settings.dart | 10 +++++----- .../src/platform_interface/platform_ima_settings.dart | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) 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 index 25d00b416d7..bc173c4cbae 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart @@ -33,7 +33,7 @@ final class AndroidImaSettings extends PlatformImaSettings { } @override - Future setFeatureFlags(Map? featureFlags) async { + Future setFeatureFlags(Map featureFlags) async { final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setFeatureFlags(featureFlags); } @@ -45,25 +45,25 @@ final class AndroidImaSettings extends PlatformImaSettings { } @override - Future setPlayerType(String? playerType) async { + Future setPlayerType(String playerType) async { final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setPlayerType(playerType); } @override - Future setPlayerVersion(String? playerVersion) async { + Future setPlayerVersion(String playerVersion) async { final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setPlayerVersion(playerVersion); } @override - Future setPpid(String? ppid) async { + Future setPpid(String ppid) async { final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setPpid(ppid); } @override - Future setSessionID(String? sessionID) async { + Future setSessionID(String sessionID) async { final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setSessionId(sessionID); } diff --git a/packages/interactive_media_ads/lib/src/ima_settings.dart b/packages/interactive_media_ads/lib/src/ima_settings.dart index e7b1d8c376b..8d559c45fc7 100644 --- a/packages/interactive_media_ads/lib/src/ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/ima_settings.dart @@ -40,7 +40,7 @@ class ImaSettings { /// 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) { + Future setFeatureFlags(Map featureFlags) { return platform.setFeatureFlags(featureFlags); } @@ -61,7 +61,7 @@ class ImaSettings { /// 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) { + Future setPlayerType(String playerType) { return platform.setPlayerType(playerType); } @@ -72,12 +72,12 @@ class ImaSettings { /// 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) { + Future setPlayerVersion(String playerVersion) { return platform.setPlayerVersion(playerVersion); } /// Sets the Publisher Provided Identification (PPID) sent with ads request. - Future setPpid(String? ppid) { + Future setPpid(String ppid) { return platform.setPpid(ppid); } @@ -85,7 +85,7 @@ class ImaSettings { /// /// This must be a UUID. It is used exclusively for frequency capping across /// the user session. - Future setSessionID(String? sessionID) { + Future setSessionID(String sessionID) { return platform.setSessionID(sessionID); } 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 index 38f2bbd0075..42cedd36a11 100644 --- 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 @@ -78,7 +78,7 @@ abstract base class PlatformImaSettings { final PlatformImaSettingsCreationParams params; /// Sets the Publisher Provided Identification (PPID) sent with ads request. - Future setPpid(String? ppid); + Future setPpid(String ppid); /// Specifies maximum number of redirects after which subsequent redirects /// will be denied, and the ad load aborted. @@ -93,7 +93,7 @@ abstract base class PlatformImaSettings { /// 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); + Future setFeatureFlags(Map featureFlags); /// Specifies whether to automatically play VMAP and ad rules ad breaks. /// @@ -107,7 +107,7 @@ abstract base class PlatformImaSettings { /// 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); + Future setPlayerType(String playerType); /// Sets the partner specified player version that is integrating with the /// SDK. @@ -116,13 +116,13 @@ abstract base class PlatformImaSettings { /// 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); + 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); + Future setSessionID(String sessionID); /// Enables and disables the debug mode, which is disabled by default. Future setDebugMode(bool enabled); From 09f7205b515e1ac6b82d5f6a5f2dcf74b353f916 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:45:47 -0400 Subject: [PATCH 23/29] update ima settings tests --- .../test/ima_settings_test.dart | 10 +++++----- .../test/test_stubs.dart | 20 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/interactive_media_ads/test/ima_settings_test.dart b/packages/interactive_media_ads/test/ima_settings_test.dart index 4b4b051604c..1901ebcd28a 100644 --- a/packages/interactive_media_ads/test/ima_settings_test.dart +++ b/packages/interactive_media_ads/test/ima_settings_test.dart @@ -39,7 +39,7 @@ void main() { const Map featureFlags = {}; final TestImaSettings platformSettings = TestImaSettings( const PlatformImaSettingsCreationParams(), - onSetFeatureFlags: expectAsync1((Map? value) { + onSetFeatureFlags: expectAsync1((Map value) { expect(featureFlags, value); }), ); @@ -65,7 +65,7 @@ void main() { const String playerType = 'playerType'; final TestImaSettings platformSettings = TestImaSettings( const PlatformImaSettingsCreationParams(), - onSetPlayerType: expectAsync1((String? value) { + onSetPlayerType: expectAsync1((String value) { expect(playerType, value); }), ); @@ -78,7 +78,7 @@ void main() { const String playerVersion = 'playerVersion'; final TestImaSettings platformSettings = TestImaSettings( const PlatformImaSettingsCreationParams(), - onSetPlayerVersion: expectAsync1((String? value) { + onSetPlayerVersion: expectAsync1((String value) { expect(playerVersion, value); }), ); @@ -91,7 +91,7 @@ void main() { const String ppid = 'ppid'; final TestImaSettings platformSettings = TestImaSettings( const PlatformImaSettingsCreationParams(), - onSetPpid: expectAsync1((String? value) { + onSetPpid: expectAsync1((String value) { expect(ppid, value); }), ); @@ -104,7 +104,7 @@ void main() { const String sessionID = 'session'; final TestImaSettings platformSettings = TestImaSettings( const PlatformImaSettingsCreationParams(), - onSetSessionID: expectAsync1((String? value) { + onSetSessionID: expectAsync1((String value) { expect(sessionID, value); }), ); diff --git a/packages/interactive_media_ads/test/test_stubs.dart b/packages/interactive_media_ads/test/test_stubs.dart index b4d67f1ef86..b2359e33ee9 100644 --- a/packages/interactive_media_ads/test/test_stubs.dart +++ b/packages/interactive_media_ads/test/test_stubs.dart @@ -261,24 +261,24 @@ final class TestImaSettings extends PlatformImaSettings { this.onSetDebugMode, }) : super.implementation(); - void Function(String? ppid)? onSetPpid; + void Function(String ppid)? onSetPpid; void Function(int maxRedirects)? onSetMaxRedirects; - void Function(Map? featureFlags)? onSetFeatureFlags; + void Function(Map featureFlags)? onSetFeatureFlags; void Function(bool autoPlayAdBreaks)? onSetAutoPlayAdBreaks; - void Function(String? playerType)? onSetPlayerType; + void Function(String playerType)? onSetPlayerType; - void Function(String? playerVersion)? onSetPlayerVersion; + void Function(String playerVersion)? onSetPlayerVersion; - void Function(String? sessionID)? onSetSessionID; + void Function(String sessionID)? onSetSessionID; void Function(bool enableDebugMode)? onSetDebugMode; @override - Future setPpid(String? ppid) async => onSetPpid?.call(ppid); + Future setPpid(String ppid) async => onSetPpid?.call(ppid); @override Future setMaxRedirects(int maxRedirects) async { @@ -286,7 +286,7 @@ final class TestImaSettings extends PlatformImaSettings { } @override - Future setFeatureFlags(Map? featureFlags) async { + Future setFeatureFlags(Map featureFlags) async { onSetFeatureFlags?.call(featureFlags); } @@ -296,17 +296,17 @@ final class TestImaSettings extends PlatformImaSettings { } @override - Future setPlayerType(String? playerType) async { + Future setPlayerType(String playerType) async { onSetPlayerType?.call(playerType); } @override - Future setPlayerVersion(String? playerVersion) async { + Future setPlayerVersion(String playerVersion) async { onSetPlayerVersion?.call(playerVersion); } @override - Future setSessionID(String? sessionID) async { + Future setSessionID(String sessionID) async { onSetSessionID?.call(sessionID); } From eb8bdb5dd568a23a311d2331230dc05c558605b0 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:51:31 -0400 Subject: [PATCH 24/29] fix formatting --- packages/interactive_media_ads/lib/src/ima_settings.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/interactive_media_ads/lib/src/ima_settings.dart b/packages/interactive_media_ads/lib/src/ima_settings.dart index 8d559c45fc7..d0db3e60214 100644 --- a/packages/interactive_media_ads/lib/src/ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/ima_settings.dart @@ -16,8 +16,7 @@ class ImaSettings { PlatformImaSettingsCreationParams(language: language), )); - /// Constructs an [ImaSettings] from a specific platform - /// implementation. + /// Constructs an [ImaSettings] from a specific platform implementation. const ImaSettings.fromPlatform(this.platform); /// Implementation of [PlatformImaSettings] for the current platform. From 7ecb8c196602c6419574ef69d9d8fab3afb56f2f Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:53:29 -0400 Subject: [PATCH 25/29] formatting --- .../packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt index 79060c94434..ed91e3e0093 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ImaSdkSettingsProxyApi.kt @@ -22,10 +22,7 @@ class ImaSdkSettingsProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : pigeon_instance.isDebugMode = debugMode } - override fun setFeatureFlags( - pigeon_instance: ImaSdkSettings, - featureFlags: Map - ) { + override fun setFeatureFlags(pigeon_instance: ImaSdkSettings, featureFlags: Map) { pigeon_instance.featureFlags = featureFlags } From 85d6f6242da1962eae78e910a0af2bb0bc5fb6c7 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Mon, 21 Jul 2025 13:35:04 -0400 Subject: [PATCH 26/29] improve settings docs --- .../lib/src/ima_settings.dart | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/packages/interactive_media_ads/lib/src/ima_settings.dart b/packages/interactive_media_ads/lib/src/ima_settings.dart index d0db3e60214..e9e41133bd7 100644 --- a/packages/interactive_media_ads/lib/src/ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/ima_settings.dart @@ -8,13 +8,65 @@ 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.fromPlatform(PlatformImaSettings( + : 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); From ed438ae7cde6c21b93b72f9b599bf3f8a09bbe13 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:51:26 -0400 Subject: [PATCH 27/29] use await --- .../lib/src/android/android_ima_settings.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index bc173c4cbae..10ddce273b5 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart @@ -72,7 +72,7 @@ final class AndroidImaSettings extends PlatformImaSettings { final ImaSdkSettings settings = await ImaSdkFactory.instance.createImaSdkSettings(); if (params.language case final String language) { - unawaited(settings.setLanguage(language)); + await settings.setLanguage(language); } return settings; } From 427e3070cb2f9aa040116d0475ac0534277239e8 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:54:33 -0400 Subject: [PATCH 28/29] use create instead of init --- .../lib/src/android/android_ima_settings.dart | 6 +++--- .../interactive_media_ads/lib/src/ios/ios_ima_settings.dart | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) 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 index 10ddce273b5..92a3103860d 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart @@ -18,7 +18,7 @@ final class AndroidImaSettings extends PlatformImaSettings { /// /// Defines general SDK settings that are used when creating an `AdsLoader`. @internal - late final Future nativeSettingsFuture = _initSettings(); + late final Future nativeSettingsFuture = _createSettings(); @override Future setAutoPlayAdBreaks(bool autoPlayAdBreaks) async { @@ -67,8 +67,8 @@ final class AndroidImaSettings extends PlatformImaSettings { final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setSessionId(sessionID); } - - Future _initSettings() async { +g + Future _createSettings() async { final ImaSdkSettings settings = await ImaSdkFactory.instance.createImaSdkSettings(); if (params.language case final String language) { 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 index 0558a8febd5..82f5821e728 100644 --- a/packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/ios/ios_ima_settings.dart @@ -16,7 +16,7 @@ final class IOSImaSettings extends PlatformImaSettings { /// /// Defines general SDK settings that are used when creating an `IMAAdsLoader`. @internal - late final IMASettings nativeSettings = _initSettings(); + late final IMASettings nativeSettings = _createSettings(); @override Future setAutoPlayAdBreaks(bool autoPlayAdBreaks) { @@ -65,7 +65,7 @@ final class IOSImaSettings extends PlatformImaSettings { return nativeSettings.setEnableBackgroundPlayback(enabled); } - IMASettings _initSettings() { + IMASettings _createSettings() { final IMASettings settings = IMASettings(); if (params.language case final String language) { settings.setLanguage(language); From 3f08cfc6c7c62b223c1dd3cdac5e753d195e8d87 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 24 Jul 2025 15:02:26 -0400 Subject: [PATCH 29/29] remove g --- .../lib/src/android/android_ima_settings.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 92a3103860d..f3554909a1b 100644 --- a/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart +++ b/packages/interactive_media_ads/lib/src/android/android_ima_settings.dart @@ -67,7 +67,7 @@ final class AndroidImaSettings extends PlatformImaSettings { final ImaSdkSettings settings = await nativeSettingsFuture; await settings.setSessionId(sessionID); } -g + Future _createSettings() async { final ImaSdkSettings settings = await ImaSdkFactory.instance.createImaSdkSettings();