Skip to content

Commit c658ca2

Browse files
[interactive_media_ads] Adds internal wrapper for iOS native IMACompanionAdSlot and IMACompanionDelegate (#7889)
1 parent c8cbd23 commit c658ca2

File tree

14 files changed

+1093
-3
lines changed

14 files changed

+1093
-3
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.2+14
2+
3+
* Adds internal wrapper for iOS native `IMACompanionAdSlot` and `IMACompanionDelegate`.
4+
15
## 0.2.2+13
26

37
* Adds internal wrapper for Android native `Ad`.

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.2+13"
24+
const val pluginVersion = "0.2.2+14"
2525
}
2626

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

packages/interactive_media_ads/example/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
8F977DD92C2C8C6A00A90D4B /* AdLoadingErrorDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F977DD82C2C8C6A00A90D4B /* AdLoadingErrorDataTests.swift */; };
2929
8F977DDB2C2C8D2E00A90D4B /* AdsLoadedDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F977DDA2C2C8D2E00A90D4B /* AdsLoadedDataTests.swift */; };
3030
8FC919922CA5D86F00188068 /* FriendlyObstructionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FC919912CA5D86F00188068 /* FriendlyObstructionTests.swift */; };
31+
8FFF0C182CC1A7F300A7CB98 /* CompanionAdSlotProxyApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FFF0C172CC1A7F300A7CB98 /* CompanionAdSlotProxyApiTests.swift */; };
32+
8FFF0C1A2CC1A97B00A7CB98 /* CompanionDelegateProxyApiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FFF0C192CC1A97B00A7CB98 /* CompanionDelegateProxyApiTests.swift */; };
3133
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
3234
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
3335
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
@@ -87,6 +89,8 @@
8789
8F977DD82C2C8C6A00A90D4B /* AdLoadingErrorDataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdLoadingErrorDataTests.swift; sourceTree = "<group>"; };
8890
8F977DDA2C2C8D2E00A90D4B /* AdsLoadedDataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdsLoadedDataTests.swift; sourceTree = "<group>"; };
8991
8FC919912CA5D86F00188068 /* FriendlyObstructionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendlyObstructionTests.swift; sourceTree = "<group>"; };
92+
8FFF0C172CC1A7F300A7CB98 /* CompanionAdSlotProxyApiTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompanionAdSlotProxyApiTests.swift; sourceTree = "<group>"; };
93+
8FFF0C192CC1A97B00A7CB98 /* CompanionDelegateProxyApiTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompanionDelegateProxyApiTests.swift; sourceTree = "<group>"; };
9094
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9195
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
9296
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -136,6 +140,8 @@
136140
8F599BBC2C332CFE0090A0DF /* ContentPlayheadTests.swift */,
137141
8F599BBE2C3335B40090A0DF /* ViewControllerTests.swift */,
138142
8F8382A22CBDB4A4007F28E0 /* CompanionAdProxyApiTests.swift */,
143+
8FFF0C172CC1A7F300A7CB98 /* CompanionAdSlotProxyApiTests.swift */,
144+
8FFF0C192CC1A97B00A7CB98 /* CompanionDelegateProxyApiTests.swift */,
139145
);
140146
path = RunnerTests;
141147
sourceTree = "<group>";
@@ -423,6 +429,8 @@
423429
8F599BBB2C332C010090A0DF /* AdsRequestTests.swift in Sources */,
424430
8F599BB72C3327F10090A0DF /* AdsManagerDelegateTests.swift in Sources */,
425431
8F599BBD2C332CFE0090A0DF /* ContentPlayheadTests.swift in Sources */,
432+
8FFF0C182CC1A7F300A7CB98 /* CompanionAdSlotProxyApiTests.swift in Sources */,
433+
8FFF0C1A2CC1A97B00A7CB98 /* CompanionDelegateProxyApiTests.swift in Sources */,
426434
8F977DCF2C2B99C600A90D4B /* AdDisplayContainerTests.swift in Sources */,
427435
8F599BB52C2DD8EC0090A0DF /* AdsLoaderDelegateTests.swift in Sources */,
428436
8F599BB92C332A320090A0DF /* AdsRenderingSettingsTests.swift in Sources */,
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import Flutter
6+
import GoogleInteractiveMediaAds
7+
import UIKit
8+
import XCTest
9+
10+
@testable import interactive_media_ads
11+
12+
class CompanionAdSlotProxyApiTests: XCTestCase {
13+
func testPigeonDefaultConstructor() {
14+
let registrar = TestProxyApiRegistrar()
15+
let api = registrar.apiDelegate.pigeonApiIMACompanionAdSlot(registrar)
16+
17+
let view = UIView()
18+
let instance = try! api.pigeonDelegate.pigeonDefaultConstructor(pigeonApi: api, view: view)
19+
XCTAssertEqual(instance.view, view)
20+
}
21+
22+
func testSize() {
23+
let registrar = TestProxyApiRegistrar()
24+
let api = registrar.apiDelegate.pigeonApiIMACompanionAdSlot(registrar)
25+
26+
let view = UIView()
27+
let width = 0
28+
let height = 1
29+
let instance = try! api.pigeonDelegate.size(
30+
pigeonApi: api, view: view, width: Int64(width), height: Int64(height))
31+
XCTAssertEqual(instance.view, view)
32+
XCTAssertEqual(instance.width, width)
33+
XCTAssertEqual(instance.height, height)
34+
}
35+
36+
func testView() {
37+
let registrar = TestProxyApiRegistrar()
38+
let api = registrar.apiDelegate.pigeonApiIMACompanionAdSlot(registrar)
39+
40+
let instance = IMACompanionAdSlot(view: UIView())
41+
let value = try? api.pigeonDelegate.view(pigeonApi: api, pigeonInstance: instance)
42+
43+
XCTAssertEqual(value, instance.view)
44+
}
45+
46+
func testSetDelegate() {
47+
let registrar = TestProxyApiRegistrar()
48+
let api = registrar.apiDelegate.pigeonApiIMACompanionAdSlot(registrar)
49+
50+
let instance = IMACompanionAdSlot(view: UIView())
51+
let delegate = CompanionDelegateImpl(
52+
api: registrar.apiDelegate.pigeonApiIMACompanionDelegate(registrar))
53+
try? api.pigeonDelegate.setDelegate(
54+
pigeonApi: api, pigeonInstance: instance, delegate: delegate)
55+
56+
XCTAssertIdentical(instance.delegate, delegate)
57+
}
58+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import Flutter
6+
import GoogleInteractiveMediaAds
7+
import UIKit
8+
import XCTest
9+
10+
@testable import interactive_media_ads
11+
12+
class CompanionDelegateProxyApiTests: XCTestCase {
13+
func testPigeonDefaultConstructor() {
14+
let registrar = TestProxyApiRegistrar()
15+
let api = registrar.apiDelegate.pigeonApiIMACompanionDelegate(registrar)
16+
17+
let instance = try? api.pigeonDelegate.pigeonDefaultConstructor(pigeonApi: api)
18+
XCTAssertNotNil(instance)
19+
}
20+
21+
func testCompanionAdSlotFilled() {
22+
let api = TestCompanionDelegateApi()
23+
let instance = CompanionDelegateImpl(api: api)
24+
let slot = IMACompanionAdSlot(view: UIView())
25+
let filled = true
26+
instance.companionSlot(slot, filled: filled)
27+
28+
XCTAssertEqual(api.companionAdSlotFilledArgs, [slot, filled])
29+
}
30+
31+
func testCompanionSlotWasClicked() {
32+
let api = TestCompanionDelegateApi()
33+
let instance = CompanionDelegateImpl(api: api)
34+
let slot = IMACompanionAdSlot(view: UIView())
35+
instance.companionSlotWasClicked(slot)
36+
37+
XCTAssertEqual(api.companionSlotWasClickedArgs, [slot])
38+
}
39+
}
40+
41+
class TestCompanionDelegateApi: PigeonApiProtocolIMACompanionDelegate {
42+
var companionAdSlotFilledArgs: [AnyHashable?]? = nil
43+
var companionSlotWasClickedArgs: [AnyHashable?]? = nil
44+
45+
func companionAdSlotFilled(
46+
pigeonInstance pigeonInstanceArg: IMACompanionDelegate, slot slotArg: IMACompanionAdSlot,
47+
filled filledArg: Bool,
48+
completion: @escaping (Result<Void, interactive_media_ads.PigeonError>) -> Void
49+
) {
50+
companionAdSlotFilledArgs = [slotArg, filledArg]
51+
}
52+
53+
func companionSlotWasClicked(
54+
pigeonInstance pigeonInstanceArg: IMACompanionDelegate, slot slotArg: IMACompanionAdSlot,
55+
completion: @escaping (Result<Void, interactive_media_ads.PigeonError>) -> Void
56+
) {
57+
companionSlotWasClickedArgs = [slotArg]
58+
}
59+
}

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.2+13"
16+
static let pluginVersion = "0.2.2+14"
1717

1818
func pigeonDefaultConstructor(
1919
pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import Foundation
6+
import GoogleInteractiveMediaAds
7+
import UIKit
8+
9+
/// ProxyApi implementation for [IMACompanionAdSlot].
10+
///
11+
/// This class may handle instantiating native object instances that are attached to a Dart instance
12+
/// or handle method calls on the associated native class or an instance of that class.
13+
class CompanionAdSlotProxyAPIDelegate: PigeonApiDelegateIMACompanionAdSlot {
14+
func pigeonDefaultConstructor(pigeonApi: PigeonApiIMACompanionAdSlot, view: UIView) throws
15+
-> IMACompanionAdSlot
16+
{
17+
return IMACompanionAdSlot(view: view)
18+
}
19+
20+
func size(pigeonApi: PigeonApiIMACompanionAdSlot, view: UIView, width: Int64, height: Int64)
21+
throws -> IMACompanionAdSlot
22+
{
23+
return IMACompanionAdSlot(view: view, width: Int(width), height: Int(height))
24+
}
25+
26+
func view(pigeonApi: PigeonApiIMACompanionAdSlot, pigeonInstance: IMACompanionAdSlot) throws
27+
-> UIView
28+
{
29+
return pigeonInstance.view
30+
}
31+
32+
func setDelegate(
33+
pigeonApi: PigeonApiIMACompanionAdSlot, pigeonInstance: IMACompanionAdSlot,
34+
delegate: IMACompanionDelegate?
35+
) throws {
36+
pigeonInstance.delegate = delegate
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import Foundation
6+
import GoogleInteractiveMediaAds
7+
8+
/// Implementation of `IMACompanionDelegate` that calls to Dart in callback methods.
9+
class CompanionDelegateImpl: NSObject, IMACompanionDelegate {
10+
let api: PigeonApiProtocolIMACompanionDelegate
11+
12+
init(api: PigeonApiProtocolIMACompanionDelegate) {
13+
self.api = api
14+
}
15+
16+
func companionSlot(_ slot: IMACompanionAdSlot, filled: Bool) {
17+
api.companionAdSlotFilled(pigeonInstance: self, slot: slot, filled: filled) { _ in }
18+
}
19+
20+
func companionSlotWasClicked(_ slot: IMACompanionAdSlot) {
21+
api.companionSlotWasClicked(pigeonInstance: self, slot: slot) { _ in }
22+
}
23+
}
24+
25+
/// ProxyApi implementation for [IMACompanionDelegate].
26+
///
27+
/// This class may handle instantiating native object instances that are attached to a Dart instance
28+
/// or handle method calls on the associated native class or an instance of that class.
29+
class CompanionDelegateProxyAPIDelegate: PigeonApiDelegateIMACompanionDelegate {
30+
func pigeonDefaultConstructor(pigeonApi: PigeonApiIMACompanionDelegate) throws
31+
-> IMACompanionDelegate
32+
{
33+
return CompanionDelegateImpl(api: pigeonApi)
34+
}
35+
}

0 commit comments

Comments
 (0)