Skip to content

Commit 4efc3d1

Browse files
[interactive_media_ads] Adds remaining methods for internal wrapper of the iOS native IMAAdDisplayContainer. (#8153)
1 parent 03f83cf commit 4efc3d1

File tree

10 files changed

+441
-28
lines changed

10 files changed

+441
-28
lines changed

packages/interactive_media_ads/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.2.3+4
2+
3+
* Adds remaining methods for internal wrapper of the iOS native `IMAAdDisplayContainer`.
4+
15
## 0.2.3+3
26

37
* Adds internal wrapper for Android native `CompanionAdSlot` and `CompanionAdSlot.ClickListener`.

packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class AdsRequestProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) :
2121
*
2222
* This must match the version in pubspec.yaml.
2323
*/
24-
const val pluginVersion = "0.2.3+3"
24+
const val pluginVersion = "0.2.3+4"
2525
}
2626

2727
override fun setAdTagUrl(pigeon_instance: AdsRequest, adTagUrl: String) {

packages/interactive_media_ads/example/ios/RunnerTests/AdDisplayContainerTests.swift

Lines changed: 99 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// found in the LICENSE file.
44

55
import Flutter
6+
import GoogleInteractiveMediaAds
67
import XCTest
78

89
@testable import interactive_media_ads
@@ -13,8 +14,104 @@ final class AdDisplayContainerTests: XCTestCase {
1314
let api = registrar.apiDelegate.pigeonApiIMAAdDisplayContainer(registrar)
1415

1516
let instance = try? api.pigeonDelegate.pigeonDefaultConstructor(
16-
pigeonApi: api, adContainer: UIView(), adContainerViewController: UIViewController())
17-
17+
pigeonApi: api, adContainer: UIView(), companionSlots: [],
18+
adContainerViewController: UIViewController())
1819
XCTAssertNotNil(instance)
1920
}
21+
22+
func testAdContainer() {
23+
let registrar = TestProxyApiRegistrar()
24+
let api = registrar.apiDelegate.pigeonApiIMAAdDisplayContainer(registrar)
25+
26+
let instance = TestAdDisplayContainer()
27+
let value = try? api.pigeonDelegate.adContainer(pigeonApi: api, pigeonInstance: instance)
28+
29+
XCTAssertEqual(value, instance.adContainer)
30+
}
31+
32+
func testCompanionSlots() {
33+
let registrar = TestProxyApiRegistrar()
34+
let api = registrar.apiDelegate.pigeonApiIMAAdDisplayContainer(registrar)
35+
36+
let instance = TestAdDisplayContainer()
37+
let value = try? api.pigeonDelegate.companionSlots(pigeonApi: api, pigeonInstance: instance)
38+
39+
XCTAssertEqual(value, instance.companionSlots)
40+
}
41+
42+
func testSetAdContainerViewController() {
43+
let registrar = TestProxyApiRegistrar()
44+
let api = registrar.apiDelegate.pigeonApiIMAAdDisplayContainer(registrar)
45+
46+
let instance = TestAdDisplayContainer()
47+
let controller = UIViewController()
48+
try? api.pigeonDelegate.setAdContainerViewController(
49+
pigeonApi: api, pigeonInstance: instance, controller: controller)
50+
51+
XCTAssertEqual(instance.adContainerViewController, controller)
52+
}
53+
54+
func testGetAdContainerViewController() {
55+
let registrar = TestProxyApiRegistrar()
56+
let api = registrar.apiDelegate.pigeonApiIMAAdDisplayContainer(registrar)
57+
58+
let instance = TestAdDisplayContainer()
59+
let adContainerViewController = UIViewController()
60+
instance.adContainerViewController = adContainerViewController
61+
let value = try? api.pigeonDelegate.getAdContainerViewController(
62+
pigeonApi: api, pigeonInstance: instance)
63+
64+
XCTAssertEqual(value, adContainerViewController)
65+
}
66+
67+
func testRegisterFriendlyObstruction() {
68+
let registrar = TestProxyApiRegistrar()
69+
let api = registrar.apiDelegate.pigeonApiIMAAdDisplayContainer(registrar)
70+
71+
let instance = TestAdDisplayContainer()
72+
let friendlyObstruction = IMAFriendlyObstruction(
73+
view: UIView(), purpose: IMAFriendlyObstructionPurpose.closeAd, detailedReason: "reason")
74+
try? api.pigeonDelegate.registerFriendlyObstruction(
75+
pigeonApi: api, pigeonInstance: instance, friendlyObstruction: friendlyObstruction)
76+
77+
XCTAssertEqual(instance.registerFriendlyObstructionArgs, [friendlyObstruction])
78+
}
79+
80+
func testUnregisterAllFriendlyObstructions() {
81+
let registrar = TestProxyApiRegistrar()
82+
let api = registrar.apiDelegate.pigeonApiIMAAdDisplayContainer(registrar)
83+
84+
let instance = TestAdDisplayContainer()
85+
try? api.pigeonDelegate.unregisterAllFriendlyObstructions(
86+
pigeonApi: api, pigeonInstance: instance)
87+
88+
XCTAssertTrue(instance.unregisterAllFriendlyObstructionsCalled)
89+
}
90+
}
91+
92+
class TestAdDisplayContainer: IMAAdDisplayContainer {
93+
private var adContainerTestValue = UIView()
94+
private var companionSlotsTestValue = [IMACompanionAdSlot(view: UIView())]
95+
var registerFriendlyObstructionArgs: [AnyHashable?]? = nil
96+
var unregisterAllFriendlyObstructionsCalled = false
97+
98+
convenience init() {
99+
self.init(adContainer: UIView(), viewController: UIViewController())
100+
}
101+
102+
override var adContainer: UIView {
103+
return adContainerTestValue
104+
}
105+
106+
override var companionSlots: [IMACompanionAdSlot] {
107+
return companionSlotsTestValue
108+
}
109+
110+
override func register(_ friendlyObstruction: IMAFriendlyObstruction) {
111+
registerFriendlyObstructionArgs = [friendlyObstruction]
112+
}
113+
114+
override func unregisterAllFriendlyObstructions() {
115+
unregisterAllFriendlyObstructionsCalled = true
116+
}
20117
}

packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdDisplayContainerProxyAPIDelegate.swift

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,48 @@ import GoogleInteractiveMediaAds
1212
class AdDisplayContainerProxyAPIDelegate: PigeonApiDelegateIMAAdDisplayContainer {
1313
func pigeonDefaultConstructor(
1414
pigeonApi: PigeonApiIMAAdDisplayContainer, adContainer: UIView,
15-
adContainerViewController: UIViewController?
15+
companionSlots: [IMACompanionAdSlot]?, adContainerViewController: UIViewController?
1616
) throws -> IMAAdDisplayContainer {
1717
return IMAAdDisplayContainer(
18-
adContainer: adContainer, viewController: adContainerViewController)
18+
adContainer: adContainer, viewController: adContainerViewController,
19+
companionSlots: companionSlots)
20+
}
21+
22+
func adContainer(pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer)
23+
throws -> UIView
24+
{
25+
return pigeonInstance.adContainer
26+
}
27+
28+
func companionSlots(
29+
pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer
30+
) throws -> [IMACompanionAdSlot]? {
31+
return pigeonInstance.companionSlots
32+
}
33+
34+
func setAdContainerViewController(
35+
pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer,
36+
controller: UIViewController?
37+
) throws {
38+
pigeonInstance.adContainerViewController = controller
39+
}
40+
41+
func getAdContainerViewController(
42+
pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer
43+
) throws -> UIViewController? {
44+
return pigeonInstance.adContainerViewController
45+
}
46+
47+
func registerFriendlyObstruction(
48+
pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer,
49+
friendlyObstruction: IMAFriendlyObstruction
50+
) throws {
51+
pigeonInstance.register(friendlyObstruction)
52+
}
53+
54+
func unregisterAllFriendlyObstructions(
55+
pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer
56+
) throws {
57+
pigeonInstance.unregisterAllFriendlyObstructions()
1958
}
2059
}

packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class AdsRequestProxyAPIDelegate: PigeonApiDelegateIMAAdsRequest {
1313
/// The current version of the `interactive_media_ads` plugin.
1414
///
1515
/// This must match the version in pubspec.yaml.
16-
static let pluginVersion = "0.2.3+3"
16+
static let pluginVersion = "0.2.3+4"
1717

1818
func pigeonDefaultConstructor(
1919
pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer,

packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/InteractiveMediaAdsLibrary.g.swift

Lines changed: 118 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright 2013 The Flutter Authors. All rights reserved.
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
4-
// Autogenerated from Pigeon (v22.5.0), do not edit directly.
4+
// Autogenerated from Pigeon (v22.6.2), do not edit directly.
55
// See also: https://pub.dev/packages/pigeon
66

77
import Foundation
@@ -1200,10 +1200,38 @@ class InteractiveMediaAdsLibraryPigeonCodec: FlutterStandardMessageCodec, @unche
12001200
}
12011201

12021202
protocol PigeonApiDelegateIMAAdDisplayContainer {
1203+
/// Initializes IMAAdDisplayContainer for rendering the ad and displaying the
1204+
/// sad UI.
12031205
func pigeonDefaultConstructor(
12041206
pigeonApi: PigeonApiIMAAdDisplayContainer, adContainer: UIView,
1205-
adContainerViewController: UIViewController?
1207+
companionSlots: [IMACompanionAdSlot]?, adContainerViewController: UIViewController?
12061208
) throws -> IMAAdDisplayContainer
1209+
/// View containing the video display and ad related UI.
1210+
///
1211+
/// This view must be present in the view hierarchy in order to make ad or
1212+
/// stream requests.
1213+
func adContainer(pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer)
1214+
throws -> UIView
1215+
/// List of companion ad slots.
1216+
func companionSlots(
1217+
pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer
1218+
) throws -> [IMACompanionAdSlot]?
1219+
/// View controller containing the ad container.
1220+
func setAdContainerViewController(
1221+
pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer,
1222+
controller: UIViewController?) throws
1223+
/// View controller containing the ad container.
1224+
func getAdContainerViewController(
1225+
pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer
1226+
) throws -> UIViewController?
1227+
/// Registers a view that overlays or obstructs this container as “friendly”
1228+
/// for viewability measurement purposes.
1229+
func registerFriendlyObstruction(
1230+
pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer,
1231+
friendlyObstruction: IMAFriendlyObstruction) throws
1232+
/// Unregisters all previously registered friendly obstructions.
1233+
func unregisterAllFriendlyObstructions(
1234+
pigeonApi: PigeonApiIMAAdDisplayContainer, pigeonInstance: IMAAdDisplayContainer) throws
12071235
}
12081236

12091237
protocol PigeonApiProtocolIMAAdDisplayContainer {
@@ -1242,11 +1270,12 @@ final class PigeonApiIMAAdDisplayContainer: PigeonApiProtocolIMAAdDisplayContain
12421270
let args = message as! [Any?]
12431271
let pigeonIdentifierArg = args[0] as! Int64
12441272
let adContainerArg = args[1] as! UIView
1245-
let adContainerViewControllerArg: UIViewController? = nilOrValue(args[2])
1273+
let companionSlotsArg: [IMACompanionAdSlot]? = nilOrValue(args[2])
1274+
let adContainerViewControllerArg: UIViewController? = nilOrValue(args[3])
12461275
do {
12471276
api.pigeonRegistrar.instanceManager.addDartCreatedInstance(
12481277
try api.pigeonDelegate.pigeonDefaultConstructor(
1249-
pigeonApi: api, adContainer: adContainerArg,
1278+
pigeonApi: api, adContainer: adContainerArg, companionSlots: companionSlotsArg,
12501279
adContainerViewController: adContainerViewControllerArg),
12511280
withIdentifier: pigeonIdentifierArg)
12521281
reply(wrapResult(nil))
@@ -1257,6 +1286,85 @@ final class PigeonApiIMAAdDisplayContainer: PigeonApiProtocolIMAAdDisplayContain
12571286
} else {
12581287
pigeonDefaultConstructorChannel.setMessageHandler(nil)
12591288
}
1289+
let setAdContainerViewControllerChannel = FlutterBasicMessageChannel(
1290+
name:
1291+
"dev.flutter.pigeon.interactive_media_ads.IMAAdDisplayContainer.setAdContainerViewController",
1292+
binaryMessenger: binaryMessenger, codec: codec)
1293+
if let api = api {
1294+
setAdContainerViewControllerChannel.setMessageHandler { message, reply in
1295+
let args = message as! [Any?]
1296+
let pigeonInstanceArg = args[0] as! IMAAdDisplayContainer
1297+
let controllerArg: UIViewController? = nilOrValue(args[1])
1298+
do {
1299+
try api.pigeonDelegate.setAdContainerViewController(
1300+
pigeonApi: api, pigeonInstance: pigeonInstanceArg, controller: controllerArg)
1301+
reply(wrapResult(nil))
1302+
} catch {
1303+
reply(wrapError(error))
1304+
}
1305+
}
1306+
} else {
1307+
setAdContainerViewControllerChannel.setMessageHandler(nil)
1308+
}
1309+
let getAdContainerViewControllerChannel = FlutterBasicMessageChannel(
1310+
name:
1311+
"dev.flutter.pigeon.interactive_media_ads.IMAAdDisplayContainer.getAdContainerViewController",
1312+
binaryMessenger: binaryMessenger, codec: codec)
1313+
if let api = api {
1314+
getAdContainerViewControllerChannel.setMessageHandler { message, reply in
1315+
let args = message as! [Any?]
1316+
let pigeonInstanceArg = args[0] as! IMAAdDisplayContainer
1317+
do {
1318+
let result = try api.pigeonDelegate.getAdContainerViewController(
1319+
pigeonApi: api, pigeonInstance: pigeonInstanceArg)
1320+
reply(wrapResult(result))
1321+
} catch {
1322+
reply(wrapError(error))
1323+
}
1324+
}
1325+
} else {
1326+
getAdContainerViewControllerChannel.setMessageHandler(nil)
1327+
}
1328+
let registerFriendlyObstructionChannel = FlutterBasicMessageChannel(
1329+
name:
1330+
"dev.flutter.pigeon.interactive_media_ads.IMAAdDisplayContainer.registerFriendlyObstruction",
1331+
binaryMessenger: binaryMessenger, codec: codec)
1332+
if let api = api {
1333+
registerFriendlyObstructionChannel.setMessageHandler { message, reply in
1334+
let args = message as! [Any?]
1335+
let pigeonInstanceArg = args[0] as! IMAAdDisplayContainer
1336+
let friendlyObstructionArg = args[1] as! IMAFriendlyObstruction
1337+
do {
1338+
try api.pigeonDelegate.registerFriendlyObstruction(
1339+
pigeonApi: api, pigeonInstance: pigeonInstanceArg,
1340+
friendlyObstruction: friendlyObstructionArg)
1341+
reply(wrapResult(nil))
1342+
} catch {
1343+
reply(wrapError(error))
1344+
}
1345+
}
1346+
} else {
1347+
registerFriendlyObstructionChannel.setMessageHandler(nil)
1348+
}
1349+
let unregisterAllFriendlyObstructionsChannel = FlutterBasicMessageChannel(
1350+
name:
1351+
"dev.flutter.pigeon.interactive_media_ads.IMAAdDisplayContainer.unregisterAllFriendlyObstructions",
1352+
binaryMessenger: binaryMessenger, codec: codec)
1353+
if let api = api {
1354+
unregisterAllFriendlyObstructionsChannel.setMessageHandler { message, reply in
1355+
let args = message as! [Any?]
1356+
let pigeonInstanceArg = args[0] as! IMAAdDisplayContainer
1357+
do {
1358+
try api.pigeonDelegate.unregisterAllFriendlyObstructions(
1359+
pigeonApi: api, pigeonInstance: pigeonInstanceArg)
1360+
reply(wrapResult(nil))
1361+
} catch {
1362+
reply(wrapError(error))
1363+
}
1364+
}
1365+
} else {
1366+
unregisterAllFriendlyObstructionsChannel.setMessageHandler(nil)
1367+
}
12601368
}
12611369

12621370
///Creates a Dart instance of IMAAdDisplayContainer and attaches it to [pigeonInstance].
@@ -1277,13 +1385,18 @@ final class PigeonApiIMAAdDisplayContainer: PigeonApiProtocolIMAAdDisplayContain
12771385
}
12781386
let pigeonIdentifierArg = pigeonRegistrar.instanceManager.addHostCreatedInstance(
12791387
pigeonInstance as AnyObject)
1388+
let adContainerArg = try! pigeonDelegate.adContainer(
1389+
pigeonApi: self, pigeonInstance: pigeonInstance)
1390+
let companionSlotsArg = try! pigeonDelegate.companionSlots(
1391+
pigeonApi: self, pigeonInstance: pigeonInstance)
12801392
let binaryMessenger = pigeonRegistrar.binaryMessenger
12811393
let codec = pigeonRegistrar.codec
12821394
let channelName: String =
12831395
"dev.flutter.pigeon.interactive_media_ads.IMAAdDisplayContainer.pigeon_newInstance"
12841396
let channel = FlutterBasicMessageChannel(
12851397
name: channelName, binaryMessenger: binaryMessenger, codec: codec)
1286-
channel.sendMessage([pigeonIdentifierArg] as [Any?]) { response in
1398+
channel.sendMessage([pigeonIdentifierArg, adContainerArg, companionSlotsArg] as [Any?]) {
1399+
response in
12871400
guard let listResponse = response as? [Any?] else {
12881401
completion(.failure(createConnectionError(withChannelName: channelName)))
12891402
return

0 commit comments

Comments
 (0)