Skip to content

Commit bc4dd46

Browse files
[interactive_media_ads] Adds internal wrapper for iOS native IMAFriendlyObstruction (#7696)
1 parent fe0a3a0 commit bc4dd46

File tree

12 files changed

+1146
-581
lines changed

12 files changed

+1146
-581
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+3
2+
3+
* Adds internal wrapper for iOS native `IMAFriendlyObstruction`.
4+
15
## 0.2.2+2
26

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

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

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

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
8F977DD72C2C89A600A90D4B /* AdEventTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F977DD62C2C89A600A90D4B /* AdEventTests.swift */; };
2727
8F977DD92C2C8C6A00A90D4B /* AdLoadingErrorDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F977DD82C2C8C6A00A90D4B /* AdLoadingErrorDataTests.swift */; };
2828
8F977DDB2C2C8D2E00A90D4B /* AdsLoadedDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F977DDA2C2C8D2E00A90D4B /* AdsLoadedDataTests.swift */; };
29+
8FC919922CA5D86F00188068 /* FriendlyObstructionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FC919912CA5D86F00188068 /* FriendlyObstructionTests.swift */; };
2930
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
3031
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
3132
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
@@ -83,6 +84,7 @@
8384
8F977DD62C2C89A600A90D4B /* AdEventTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdEventTests.swift; sourceTree = "<group>"; };
8485
8F977DD82C2C8C6A00A90D4B /* AdLoadingErrorDataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdLoadingErrorDataTests.swift; sourceTree = "<group>"; };
8586
8F977DDA2C2C8D2E00A90D4B /* AdsLoadedDataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdsLoadedDataTests.swift; sourceTree = "<group>"; };
87+
8FC919912CA5D86F00188068 /* FriendlyObstructionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendlyObstructionTests.swift; sourceTree = "<group>"; };
8688
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
8789
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
8890
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -116,6 +118,7 @@
116118
331C8082294A63A400263BE5 /* RunnerTests */ = {
117119
isa = PBXGroup;
118120
children = (
121+
8FC919912CA5D86F00188068 /* FriendlyObstructionTests.swift */,
119122
8F977DCE2C2B99C600A90D4B /* AdDisplayContainerTests.swift */,
120123
8F977DD22C2BA15100A90D4B /* TestProxyApiRegistrar.swift */,
121124
8F977DD42C2C777600A90D4B /* AdErrorTests.swift */,
@@ -408,6 +411,7 @@
408411
buildActionMask = 2147483647;
409412
files = (
410413
8F599BBF2C3335B40090A0DF /* ViewControllerTests.swift in Sources */,
414+
8FC919922CA5D86F00188068 /* FriendlyObstructionTests.swift in Sources */,
411415
8F977DD92C2C8C6A00A90D4B /* AdLoadingErrorDataTests.swift in Sources */,
412416
8F599BB32C2DD87D0090A0DF /* AdsLoaderTests.swift in Sources */,
413417
8F977DD72C2C89A600A90D4B /* AdEventTests.swift in Sources */,
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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 FriendlyObstructionProxyApiTests: XCTestCase {
13+
func testPigeonDefaultConstructor() {
14+
let registrar = TestProxyApiRegistrar()
15+
let api = registrar.apiDelegate.pigeonApiIMAFriendlyObstruction(registrar)
16+
17+
let instance = try? api.pigeonDelegate.pigeonDefaultConstructor(
18+
pigeonApi: api, view: UIView(), purpose: .mediaControls, detailedReason: "myString")
19+
XCTAssertNotNil(instance)
20+
}
21+
22+
func testPigeonDefaultConstructorWithUnknownPurpose() {
23+
let registrar = TestProxyApiRegistrar()
24+
let api = registrar.apiDelegate.pigeonApiIMAFriendlyObstruction(registrar)
25+
26+
XCTAssertThrowsError(
27+
try api.pigeonDelegate.pigeonDefaultConstructor(
28+
pigeonApi: api, view: UIView(), purpose: .unknown, detailedReason: "myString")
29+
) { error in
30+
XCTAssertTrue(error is PigeonError)
31+
}
32+
}
33+
34+
func testView() {
35+
let registrar = TestProxyApiRegistrar()
36+
let api = registrar.apiDelegate.pigeonApiIMAFriendlyObstruction(registrar)
37+
38+
let instance = IMAFriendlyObstruction(
39+
view: UIView(), purpose: IMAFriendlyObstructionPurpose.closeAd, detailedReason: "reason")
40+
let value = try? api.pigeonDelegate.view(pigeonApi: api, pigeonInstance: instance)
41+
42+
XCTAssertEqual(value, instance.view)
43+
}
44+
45+
func testPurpose() {
46+
let registrar = TestProxyApiRegistrar()
47+
let api = registrar.apiDelegate.pigeonApiIMAFriendlyObstruction(registrar)
48+
49+
let instance = IMAFriendlyObstruction(
50+
view: UIView(), purpose: IMAFriendlyObstructionPurpose.closeAd, detailedReason: "reason")
51+
let value = try? api.pigeonDelegate.purpose(pigeonApi: api, pigeonInstance: instance)
52+
53+
XCTAssertEqual(value, FriendlyObstructionPurpose.closeAd)
54+
}
55+
56+
func testDetailedReason() {
57+
let registrar = TestProxyApiRegistrar()
58+
let api = registrar.apiDelegate.pigeonApiIMAFriendlyObstruction(registrar)
59+
60+
let instance = IMAFriendlyObstruction(
61+
view: UIView(), purpose: IMAFriendlyObstructionPurpose.closeAd, detailedReason: "reason")
62+
let value = try? api.pigeonDelegate.detailedReason(pigeonApi: api, pigeonInstance: instance)
63+
64+
XCTAssertEqual(value, instance.detailedReason)
65+
}
66+
}

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

1818
func pigeonDefaultConstructor(
1919
pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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 [IMAFriendlyObstruction].
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 FriendlyObstructionProxyAPIDelegate: PigeonApiDelegateIMAFriendlyObstruction {
14+
func pigeonDefaultConstructor(
15+
pigeonApi: PigeonApiIMAFriendlyObstruction, view: UIView, purpose: FriendlyObstructionPurpose,
16+
detailedReason: String?
17+
) throws -> IMAFriendlyObstruction {
18+
var nativePurpose: IMAFriendlyObstructionPurpose
19+
switch purpose {
20+
case .mediaControls:
21+
nativePurpose = IMAFriendlyObstructionPurpose.mediaControls
22+
case .closeAd:
23+
nativePurpose = IMAFriendlyObstructionPurpose.closeAd
24+
case .notVisible:
25+
nativePurpose = IMAFriendlyObstructionPurpose.notVisible
26+
case .other:
27+
nativePurpose = IMAFriendlyObstructionPurpose.other
28+
case .unknown:
29+
throw (pigeonApi.pigeonRegistrar.apiDelegate as! ProxyApiDelegate).createUnknownEnumError(
30+
withEnum: purpose)
31+
}
32+
return IMAFriendlyObstruction(
33+
view: view, purpose: nativePurpose, detailedReason: detailedReason)
34+
}
35+
36+
func view(pigeonApi: PigeonApiIMAFriendlyObstruction, pigeonInstance: IMAFriendlyObstruction)
37+
throws -> UIView
38+
{
39+
return pigeonInstance.view
40+
}
41+
42+
func purpose(pigeonApi: PigeonApiIMAFriendlyObstruction, pigeonInstance: IMAFriendlyObstruction)
43+
throws -> FriendlyObstructionPurpose
44+
{
45+
switch pigeonInstance.purpose {
46+
case .mediaControls:
47+
return .mediaControls
48+
case .closeAd:
49+
return .closeAd
50+
case .notVisible:
51+
return .notVisible
52+
case .other:
53+
return .other
54+
@unknown default:
55+
return .unknown
56+
}
57+
}
58+
59+
func detailedReason(
60+
pigeonApi: PigeonApiIMAFriendlyObstruction, pigeonInstance: IMAFriendlyObstruction
61+
) throws -> String? {
62+
return pigeonInstance.detailedReason
63+
}
64+
}

0 commit comments

Comments
 (0)