From 8cbfd26d3dc87f3ab78d42b1e048076251de461b Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:30:02 -0400 Subject: [PATCH 1/5] fix for ad tag url --- packages/interactive_media_ads/CHANGELOG.md | 4 ++++ .../interactive_media_ads/AdsRequestProxyApi.kt | 7 ++++--- .../AdsRequestProxyApiTest.kt | 11 +++++++++++ .../ios/RunnerTests/AdsRequestTests.swift | 17 +++++++++++++++++ .../AdsRequestProxyAPIDelegate.swift | 6 +++--- packages/interactive_media_ads/pubspec.yaml | 2 +- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/packages/interactive_media_ads/CHANGELOG.md b/packages/interactive_media_ads/CHANGELOG.md index 20b13ddb8282..1092b3bdddb9 100644 --- a/packages/interactive_media_ads/CHANGELOG.md +++ b/packages/interactive_media_ads/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.3+12 + +* Fixes support for ad tag URLs that do not contain a query. + ## 0.2.3+11 * Updates pigeon generated code to fix `ImplicitSamInstance` and `SyntheticAccessor` Kotlin lint 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 d5229e4aa476..fc7c4ab3e4e2 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt @@ -21,15 +21,16 @@ class AdsRequestProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : * * This must match the version in pubspec.yaml. */ - const val pluginVersion = "0.2.3+11" + const val pluginVersion = "0.2.3+12" } override fun setAdTagUrl(pigeon_instance: AdsRequest, adTagUrl: String) { // Ensure adTag can append a custom parameter. - require(adTagUrl.contains("?")) require(!adTagUrl.contains("#")) - pigeon_instance.adTagUrl = "$adTagUrl&request_agent=Flutter-IMA-$pluginVersion" + val urlHasQuery = adTagUrl.contains("?") + pigeon_instance.adTagUrl = + "$adTagUrl${if (urlHasQuery) "&" else "?"}request_agent=Flutter-IMA-$pluginVersion" } override fun setContentProgressProvider( diff --git a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt index 42f0cc88b84e..10d9e6ad2f4e 100644 --- a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt +++ b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt @@ -22,6 +22,17 @@ class AdsRequestProxyApiTest { "adTag?&request_agent=Flutter-IMA-${AdsRequestProxyApi.pluginVersion}" } + @Test + fun setAdTagUrlHandlesAUrlWithoutAQuery() { + val api = TestProxyApiRegistrar().getPigeonApiAdsRequest() + + val instance = mock() + api.setAdTagUrl(instance, "adTag") + + verify(instance).adTagUrl = + "adTag?request_agent=Flutter-IMA-${AdsRequestProxyApi.pluginVersion}" + } + @Test fun setContentProgressProvider() { val api = TestProxyApiRegistrar().getPigeonApiAdsRequest() diff --git a/packages/interactive_media_ads/example/ios/RunnerTests/AdsRequestTests.swift b/packages/interactive_media_ads/example/ios/RunnerTests/AdsRequestTests.swift index 21b52654ad9d..f4c53c113a75 100644 --- a/packages/interactive_media_ads/example/ios/RunnerTests/AdsRequestTests.swift +++ b/packages/interactive_media_ads/example/ios/RunnerTests/AdsRequestTests.swift @@ -25,4 +25,21 @@ final class AdsRequestTests: XCTestCase { "adTag?&request_agent=Flutter-IMA-\(AdsRequestProxyAPIDelegate.pluginVersion)") XCTAssertIdentical(instance?.adDisplayContainer, container) } + + func testPigeonDefaultConstructorHandlesURLWithoutAQuery() { + let registrar = TestProxyApiRegistrar() + let api = registrar.apiDelegate.pigeonApiIMAAdsRequest(registrar) + + let container = IMAAdDisplayContainer(adContainer: UIView(), viewController: nil) + let contentPlayhead = ContentPlayheadImpl() + let instance = try? api.pigeonDelegate.pigeonDefaultConstructor( + pigeonApi: api, adTagUrl: "adTag", adDisplayContainer: container, + contentPlayhead: contentPlayhead) + + XCTAssertNotNil(instance) + XCTAssertEqual( + instance?.adTagUrl, + "adTag?request_agent=Flutter-IMA-\(AdsRequestProxyAPIDelegate.pluginVersion)") + XCTAssertIdentical(instance?.adDisplayContainer, container) + } } 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 8f926613c6ea..3f8aa4674db5 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,18 +13,18 @@ class AdsRequestProxyAPIDelegate: PigeonApiDelegateIMAAdsRequest { /// The current version of the `interactive_media_ads` plugin. /// /// This must match the version in pubspec.yaml. - static let pluginVersion = "0.2.3+11" + static let pluginVersion = "0.2.3+12" func pigeonDefaultConstructor( pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer, contentPlayhead: IMAContentPlayhead? ) throws -> IMAAdsRequest { // Ensure adTag can append a custom parameter. - assert(adTagUrl.contains("?")) assert(!adTagUrl.contains("#")) + let urlHasQuery = adTagUrl.contains("?") let adTagWithRequestAgent = - "\(adTagUrl)&request_agent=Flutter-IMA-\(AdsRequestProxyAPIDelegate.pluginVersion)" + "\(adTagUrl)\(urlHasQuery ? "&" : "?")request_agent=Flutter-IMA-\(AdsRequestProxyAPIDelegate.pluginVersion)" return IMAAdsRequest( adTagUrl: adTagWithRequestAgent, adDisplayContainer: adDisplayContainer, contentPlayhead: contentPlayhead as? ContentPlayheadImpl, userContext: nil) diff --git a/packages/interactive_media_ads/pubspec.yaml b/packages/interactive_media_ads/pubspec.yaml index 2c4a1d24cd45..69a19874a871 100644 --- a/packages/interactive_media_ads/pubspec.yaml +++ b/packages/interactive_media_ads/pubspec.yaml @@ -2,7 +2,7 @@ name: interactive_media_ads description: A Flutter plugin for using the Interactive Media Ads SDKs on Android and iOS. repository: https://github.com/flutter/packages/tree/main/packages/interactive_media_ads issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+interactive_media_ads%22 -version: 0.2.3+11 # This must match the version in +version: 0.2.3+12 # 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 106db503027b8be5d729be8b460fce933bca749d Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 6 May 2025 17:47:40 -0400 Subject: [PATCH 2/5] update to only add under correct condition --- .../interactive_media_ads/AdsRequestProxyApi.kt | 12 ++++++------ .../AdsRequestProxyApiTest.kt | 10 ++++++---- .../ios/RunnerTests/AdsRequestTests.swift | 17 ++++++++++++----- .../AdsRequestProxyAPIDelegate.swift | 16 ++++++++++------ 4 files changed, 34 insertions(+), 21 deletions(-) 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 fc7c4ab3e4e2..2e46d3435d50 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 @@ -25,12 +25,12 @@ class AdsRequestProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : } override fun setAdTagUrl(pigeon_instance: AdsRequest, adTagUrl: String) { - // Ensure adTag can append a custom parameter. - require(!adTagUrl.contains("#")) - - val urlHasQuery = adTagUrl.contains("?") - pigeon_instance.adTagUrl = - "$adTagUrl${if (urlHasQuery) "&" else "?"}request_agent=Flutter-IMA-$pluginVersion" + // Add a request agent only if the adTagUrl can append a custom parameter. + if (!adTagUrl.contains("#") && adTagUrl.contains("?")) { + pigeon_instance.adTagUrl = "$adTagUrl&request_agent=Flutter-IMA-$pluginVersion" + } else { + pigeon_instance.adTagUrl = adTagUrl + } } override fun setContentProgressProvider( diff --git a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt index 10d9e6ad2f4e..e3e9e2baf557 100644 --- a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt +++ b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApiTest.kt @@ -23,14 +23,16 @@ class AdsRequestProxyApiTest { } @Test - fun setAdTagUrlHandlesAUrlWithoutAQuery() { + fun setAdTagUrlDoesNotAddRequestAgentToIncompatibleUrls() { val api = TestProxyApiRegistrar().getPigeonApiAdsRequest() val instance = mock() - api.setAdTagUrl(instance, "adTag") - verify(instance).adTagUrl = - "adTag?request_agent=Flutter-IMA-${AdsRequestProxyApi.pluginVersion}" + api.setAdTagUrl(instance, "adTag#") + verify(instance).adTagUrl = "adTag#" + + api.setAdTagUrl(instance, "adTag?#") + verify(instance).adTagUrl = "adTag?#" } @Test diff --git a/packages/interactive_media_ads/example/ios/RunnerTests/AdsRequestTests.swift b/packages/interactive_media_ads/example/ios/RunnerTests/AdsRequestTests.swift index f4c53c113a75..c7b6c0b4ed63 100644 --- a/packages/interactive_media_ads/example/ios/RunnerTests/AdsRequestTests.swift +++ b/packages/interactive_media_ads/example/ios/RunnerTests/AdsRequestTests.swift @@ -26,20 +26,27 @@ final class AdsRequestTests: XCTestCase { XCTAssertIdentical(instance?.adDisplayContainer, container) } - func testPigeonDefaultConstructorHandlesURLWithoutAQuery() { + func testPigeonDefaultConstructorDoesNotAddRequestAgentToIncompatibleURLs() { let registrar = TestProxyApiRegistrar() let api = registrar.apiDelegate.pigeonApiIMAAdsRequest(registrar) let container = IMAAdDisplayContainer(adContainer: UIView(), viewController: nil) let contentPlayhead = ContentPlayheadImpl() - let instance = try? api.pigeonDelegate.pigeonDefaultConstructor( - pigeonApi: api, adTagUrl: "adTag", adDisplayContainer: container, + + var instance = try? api.pigeonDelegate.pigeonDefaultConstructor( + pigeonApi: api, adTagUrl: "adTag#", adDisplayContainer: container, contentPlayhead: contentPlayhead) + XCTAssertNotNil(instance) + XCTAssertEqual( + instance?.adTagUrl, + "adTag#") + instance = try? api.pigeonDelegate.pigeonDefaultConstructor( + pigeonApi: api, adTagUrl: "adTag#?", adDisplayContainer: container, + contentPlayhead: contentPlayhead) XCTAssertNotNil(instance) XCTAssertEqual( instance?.adTagUrl, - "adTag?request_agent=Flutter-IMA-\(AdsRequestProxyAPIDelegate.pluginVersion)") - XCTAssertIdentical(instance?.adDisplayContainer, container) + "adTag#?") } } 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 3f8aa4674db5..3c3606205cba 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 @@ -19,14 +19,18 @@ class AdsRequestProxyAPIDelegate: PigeonApiDelegateIMAAdsRequest { pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer, contentPlayhead: IMAContentPlayhead? ) throws -> IMAAdsRequest { - // Ensure adTag can append a custom parameter. - assert(!adTagUrl.contains("#")) + var modifiedURL: String? + + // Add a request agent only if the adTagUrl can append a custom parameter. + if !adTagUrl.contains("#") && adTagUrl.contains("?") { + modifiedURL = + "\(adTagUrl)&request_agent=Flutter-IMA-\(AdsRequestProxyAPIDelegate.pluginVersion)" + } else { + modifiedURL = adTagUrl + } - let urlHasQuery = adTagUrl.contains("?") - let adTagWithRequestAgent = - "\(adTagUrl)\(urlHasQuery ? "&" : "?")request_agent=Flutter-IMA-\(AdsRequestProxyAPIDelegate.pluginVersion)" return IMAAdsRequest( - adTagUrl: adTagWithRequestAgent, adDisplayContainer: adDisplayContainer, + adTagUrl: modifiedURL!, adDisplayContainer: adDisplayContainer, contentPlayhead: contentPlayhead as? ContentPlayheadImpl, userContext: nil) } } From a5118781413ee1fe8a0f41ec32ccc28fc1ac46d7 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 6 May 2025 17:51:14 -0400 Subject: [PATCH 3/5] update changelog --- packages/interactive_media_ads/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/interactive_media_ads/CHANGELOG.md b/packages/interactive_media_ads/CHANGELOG.md index 1092b3bdddb9..347340ae32bc 100644 --- a/packages/interactive_media_ads/CHANGELOG.md +++ b/packages/interactive_media_ads/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.2.3+12 -* Fixes support for ad tag URLs that do not contain a query. +* Fixes appending request agent to ad tags that contain a query. ## 0.2.3+11 From 85ae7e847403c56543cc4066739fc3ce199ada55 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 7 May 2025 14:45:13 -0400 Subject: [PATCH 4/5] ternary operator --- .../AdsRequestProxyAPIDelegate.swift | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) 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 3c3606205cba..52fc109cb461 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 @@ -19,18 +19,14 @@ class AdsRequestProxyAPIDelegate: PigeonApiDelegateIMAAdsRequest { pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer, contentPlayhead: IMAContentPlayhead? ) throws -> IMAAdsRequest { - var modifiedURL: String? - // Add a request agent only if the adTagUrl can append a custom parameter. - if !adTagUrl.contains("#") && adTagUrl.contains("?") { - modifiedURL = - "\(adTagUrl)&request_agent=Flutter-IMA-\(AdsRequestProxyAPIDelegate.pluginVersion)" - } else { - modifiedURL = adTagUrl - } + var modifiedURL = + !adTagUrl.contains("#") && adTagUrl.contains("?") + ? "\(adTagUrl)&request_agent=Flutter-IMA-\(AdsRequestProxyAPIDelegate.pluginVersion)" + : adTagUrl return IMAAdsRequest( - adTagUrl: modifiedURL!, adDisplayContainer: adDisplayContainer, + adTagUrl: modifiedURL, adDisplayContainer: adDisplayContainer, contentPlayhead: contentPlayhead as? ContentPlayheadImpl, userContext: nil) } } From 35b93e253a3fa51981c640e00da95b1331aa7bbd Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 7 May 2025 15:14:08 -0400 Subject: [PATCH 5/5] fix lint --- .../interactive_media_ads/AdsRequestProxyAPIDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 52fc109cb461..c6ce12f4793e 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 @@ -20,7 +20,7 @@ class AdsRequestProxyAPIDelegate: PigeonApiDelegateIMAAdsRequest { contentPlayhead: IMAContentPlayhead? ) throws -> IMAAdsRequest { // Add a request agent only if the adTagUrl can append a custom parameter. - var modifiedURL = + let modifiedURL = !adTagUrl.contains("#") && adTagUrl.contains("?") ? "\(adTagUrl)&request_agent=Flutter-IMA-\(AdsRequestProxyAPIDelegate.pluginVersion)" : adTagUrl