Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DIA-4057 refactor of cmp class – adding interface #60

Merged
merged 43 commits into from
Jul 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
8f488c4
Implement interface for wrappers
Nevazhnovu Jun 18, 2024
6f72331
Update `CMP`
Nevazhnovu Jun 18, 2024
519fb55
Add wrapper for `editor mode`
Nevazhnovu Jun 18, 2024
ab33ccd
Rename interface
Nevazhnovu Jun 19, 2024
c9ca569
Refactor `CMP` class
Nevazhnovu Jun 20, 2024
1610c11
Micro fix
Nevazhnovu Jun 20, 2024
837fd3e
Update `exampleApp` scripts
Nevazhnovu Jun 20, 2024
71be039
A bit of refactoring: prettify the fields and method names of `CMP`, …
Nevazhnovu Jun 20, 2024
681840e
Remove preprocessor directives
Nevazhnovu Jun 21, 2024
f400a9f
Remove `ISpSdkAndroid` interface
Nevazhnovu Jun 21, 2024
7efa497
Add default state for pm tab
Nevazhnovu Jun 21, 2024
59428d9
Refactor Android wrapper structure
Nevazhnovu Jun 25, 2024
04ec880
Refactor iOS wrapper structure
Nevazhnovu Jun 25, 2024
9697c63
`JsonUnwrapper` separated by platforms
Nevazhnovu Jun 25, 2024
1720903
remove unused using imports and refactor NewtonsoftJson to Newtonsoft…
Nevazhnovu Jun 25, 2024
bf45494
a bunch of renamings
Nevazhnovu Jun 25, 2024
47f606b
micro fix: `Newtonsoft.Json.JsonException` substituted for `Exception…
Nevazhnovu Jun 25, 2024
dee205b
Remove `pmId` from `Initialize` in `ISpSdk`
Nevazhnovu Jun 26, 2024
44f747b
Move `transitionCCPAAuth` and `supportLegacyUSPString` to `SpCampaign`
Nevazhnovu Jun 26, 2024
1d22d1a
Update `PrivacySettings`
Nevazhnovu Jun 26, 2024
ad59265
Refactor `usnat` campaign wrappers
Nevazhnovu Jun 27, 2024
ed5ed3c
a bunch of fixes
Nevazhnovu Jun 27, 2024
11780a4
Sort methods in order
Nevazhnovu Jun 27, 2024
6fac5bb
Merge branch 'develop' into DIA-4057-refactor-cmp-class-abstract
Nevazhnovu Jun 27, 2024
929babc
Merge branch 'DIA-4057-refactor-cmp-class-abstract' into DIA-4059-ref…
Nevazhnovu Jun 27, 2024
d643506
Review fixes
Nevazhnovu Jun 27, 2024
9972bef
Merge pull request #61 from SourcePointUSA/DIA-4059-refactor-android-…
Nevazhnovu Jul 1, 2024
393baf5
Refactor `loadPrivacyManager`
Nevazhnovu Jul 1, 2024
1a86011
Remove `pmIds`, fix `SPMessageLanguage`, add `messageTimeout`
Nevazhnovu Jul 1, 2024
46f51e4
Add `GPPData` to `ccpa` and `usnat` campaigns
Nevazhnovu Jul 2, 2024
86ab430
Rename `CSharp2JavaStringEnumMapper` to `CMPEnumMapper`
Nevazhnovu Jul 2, 2024
6e509db
Add class `Callbacks` in bridge
Nevazhnovu Jul 2, 2024
8a65cae
Micro fixes
Nevazhnovu Jul 3, 2024
2a97fa2
Add `guard let`
Nevazhnovu Jul 3, 2024
aefd883
Merge pull request #63 from SourcePointUSA/DIA-4058-refactor-ios-inte…
Nevazhnovu Jul 4, 2024
04636a7
`MIGRATION.md` guide added to help in migration from 2.x.x to 3.0.0
Nevazhnovu Jul 6, 2024
283d27f
Update `README.md`
Nevazhnovu Jul 8, 2024
fe588c7
rename namespace `ConsentManagementProviderLib` -> `ConsentManagement…
Nevazhnovu Jul 9, 2024
29cc409
Update `MIGRATION.md`
Nevazhnovu Jul 9, 2024
a501ec0
Update MIGRATION.md
tom-win87 Jul 9, 2024
062e9e1
Merge pull request #64 from SourcePointUSA/DIA-4246-migration-guide
Nevazhnovu Jul 11, 2024
3507599
Merge branch 'develop' into DIA-4057-refactor-cmp-class-abstract
Nevazhnovu Jul 12, 2024
a23ebd8
Add validation for pmId and property name
Nevazhnovu Jul 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
using System.IO;
using UnityEditor.iOS.Xcode.Extensions;
using UnityEngine;
using ConsentManagementProviderLib;
using ConsentManagementProvider;

public static class CMPPostProcessBuild
{
Expand Down
166 changes: 69 additions & 97 deletions Assets/ConsentManagementProvider/Plugins/iOS/Source/SwiftBridge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ import UIKit
@objc public class SwiftBridge: NSObject {
public override init() {
config = Config(
gdprPmId: nil,
ccpaPmId: nil,
usnatPmId: nil,
transitionCCPAAuth: nil,
supportLegacyUSPString: nil,
vendors: [],
Expand Down Expand Up @@ -45,7 +42,6 @@ import UIKit
}

struct Config {
var gdprPmId, ccpaPmId, usnatPmId: String?
var transitionCCPAAuth, supportLegacyUSPString: Bool?
var vendors: [String] = []
var categories: [String] = []
Expand Down Expand Up @@ -73,6 +69,7 @@ import UIKit
var callbackOnSPFinished: СallbackCharMessage? = nil
var callbackOnSPUIFinished: СallbackCharMessage? = nil
var callbackOnCustomConsent: СallbackCharMessage? = nil
let callbacks = Callbacks()

// MARK: - Bridge config
@objc public func addTargetingParam(campaignType: Int, key: String, value: String){
Expand Down Expand Up @@ -108,14 +105,9 @@ import UIKit
ccpa: Bool,
usnat: Bool,
language: String,
gdprPmId: String,
ccpaPmId: String,
usnatPmId: String) {
self.config.gdprPmId = gdprPmId
self.config.ccpaPmId = ccpaPmId
self.config.usnatPmId = usnatPmId
messageTimeoutInSeconds: Double) {
guard let propName = try? SPPropertyName(propertyName) else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "`propertyName` invalid!")
self.callbacks.RunCallback(callbackType: .OnErrorCallback, arg: "`propertyName` invalid!")
return
}
self.consentManager = { SPConsentManager(
Expand All @@ -131,6 +123,7 @@ import UIKit
language: SPMessageLanguage.init(rawValue: language) ?? SPMessageLanguage.BrowserDefault,
delegate: self
)}()
self.consentManager?.messageTimeoutInSeconds = messageTimeoutInSeconds
}

@objc public func addCustomVendor(vendor: String) {
Expand All @@ -152,23 +145,15 @@ import UIKit
}

@objc public func dispose() {
callbackDefault = nil
callbackOnConsentReady = nil
callbackOnConsentUIReady = nil
callbackOnConsentAction = nil
callbackOnConsentUIFinished = nil
callbackOnErrorCallback = nil
callbackOnSPFinished = nil
callbackOnSPUIFinished = nil
callbackOnCustomConsent = nil
callbacks.CleanCallbacks()
}

// MARK: - Manage lib
@objc public func loadMessage(authId: String? = nil) {
print("PURE SWIFT loadMessage with authId="+(authId ?? "nil"))
(consentManager != nil) ?
consentManager?.loadMessage(forAuthId: authId) :
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
self.callbacks.RunCallback(callbackType: .OnErrorCallback, arg: "Library was not initialized correctly!")
}

@objc public func onClearConsentTap() {
Expand All @@ -177,33 +162,17 @@ import UIKit
myVendorAccepted = .Unknown
}

@objc public func onGDPRPrivacyManagerTap() {
if config.gdprPmId != nil {
(consentManager != nil) ?
consentManager?.loadGDPRPrivacyManager(withId: config.gdprPmId!) :
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
} else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Tried to load GDPR pm without gdpr pm id")
}
}

@objc public func onCCPAPrivacyManagerTap() {
if config.ccpaPmId != nil {
(consentManager != nil) ?
consentManager?.loadCCPAPrivacyManager(withId: config.ccpaPmId!) :
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
} else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Tried to load CCPA pm without ccpa pm id")
@objc public func loadPrivacyManager(campaignType: Int, pmId: String, tab: SPPrivacyManagerTab) {
guard let consentManager = consentManager else {
self.callbacks.RunCallback(callbackType: .OnErrorCallback, arg: "Library was not initialized correctly!")
return
}
}

@objc public func onUSNATPrivacyManagerTap() {
if config.usnatPmId != nil {
(consentManager != nil) ?
consentManager?.loadUSNatPrivacyManager(withId: config.usnatPmId!) :
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
} else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Tried to load USNAT pm without usnat pm id")
switch CAMPAIGN_TYPE(rawValue: campaignType) {
case .GDPR: consentManager.loadGDPRPrivacyManager(withId: pmId, tab: tab)
case .CCPA: consentManager.loadCCPAPrivacyManager(withId: pmId, tab: tab)
case .USNAT: consentManager.loadUSNatPrivacyManager(withId: pmId, tab: tab)
case .IOS14: break
case .none: print("Incorrect campaignType on loadPrivacyManager")
}
}

Expand All @@ -214,10 +183,10 @@ import UIKit
categories: config.categories,
legIntCategories: config.legIntCategories){contents in
self.print(contents)
self.runCallback(callback: self.callbackOnCustomConsent, arg: contents.toJSON())
self.callbacks.RunCallback(callbackType: .OnCustomConsent, arg: contents.toJSON())
}
} else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
self.callbacks.RunCallback(callbackType: .OnErrorCallback, arg: "Library was not initialized correctly!")
}
}

Expand All @@ -228,10 +197,10 @@ import UIKit
categories: config.categories,
legIntCategories: config.legIntCategories){contents in
self.print(contents)
self.runCallback(callback: self.callbackOnCustomConsent, arg: contents.toJSON())
self.callbacks.RunCallback(callbackType: .OnCustomConsent, arg: contents.toJSON())
}
} else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
self.callbacks.RunCallback(callbackType: .OnErrorCallback, arg: "Library was not initialized correctly!")
}
}
}
Expand All @@ -243,7 +212,7 @@ extension SwiftBridge: SPDelegate {
controller.modalPresentationStyle = UIModalPresentationStyle.overFullScreen
top?.present(controller, animated: true)
logger.log("PURE SWIFT onSPUIReady")
runCallback(callback: callbackOnConsentUIReady, arg: "onSPUIReady")
callbacks.RunCallback(callbackType: .OnConsentUIReady, arg: "onSPUIReady")
}

public func onAction(_ action: SPAction, from controller: UIViewController) {
Expand All @@ -257,88 +226,91 @@ extension SwiftBridge: SPDelegate {
if let data = try? JSONEncoder().encode(responce) {
resp = String(data: data, encoding: .utf8) ?? ""
}
runCallback(callback: callbackOnConsentAction, arg: resp)
callbacks.RunCallback(callbackType: .OnConsentAction, arg: resp)
}

public func onSPUIFinished(_ controller: UIViewController) {
UIApplication.shared.firstKeyWindow?.rootViewController?.dismiss(animated: true)
logger.log("PURE SWIFT onSPUIFinished")
runCallback(callback: callbackOnSPUIFinished, arg: "onSPUIFinished")
callbacks.RunCallback(callbackType: .OnSPUIFinished, arg: "onSPUIFinished")
}

public func onConsentReady(userData: SPUserData) {
print("onConsentReady:", userData)
logger.log("PURE SWIFT onConsentReady")
runCallback(callback: callbackOnConsentReady, arg: userData.toJSON())
callbacks.RunCallback(callbackType: .OnConsentReady, arg: userData.toJSON())
}

public func onSPFinished(userData: SPUserData) {
logger.log("SDK DONE")
logger.log("PURE SWIFT onSPFinished")
runCallback(callback: callbackOnSPFinished, arg: userData.toJSON())
callbacks.RunCallback(callbackType: .OnSPFinished, arg: userData.toJSON())
}

public func onError(error: SPError) {
printLog("Something went wrong: ", error)
logger.log("PURE SWIFT onError")
runCallback(callback: callbackOnErrorCallback, arg: error.toJSON())
callbacks.RunCallback(callbackType: .OnErrorCallback, arg: error.toJSON())
}
}

// MARK: - Callback Set Up
extension SwiftBridge {
@objc public func setCallbackDefault(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackDefault")
callbackDefault = callback
}

@objc public func setCallbackOnConsentReady(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnConsentReady")
callbackOnConsentReady = callback
@objc public func setCallback(callback: @escaping СallbackCharMessage, typeCallback: String) -> Void{
callbacks.AddCallback(callback: callback, callbackType: Callbacks.CallbackType.init(rawValue: typeCallback) ?? Callbacks.CallbackType.NotSet)
}

@objc public func setCallbackOnConsentUIReady(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnConsentUIReady")
callbackOnConsentUIReady = callback
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
if OSLogger.defaultLevel == .debug {
printLog(items)
}
}
}

@objc public func setCallbackOnConsentAction(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnConsentAction")
callbackOnConsentAction = callback
}

@objc public func setCallbackOnConsentUIFinished(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnConsentUIFinished")
callbackOnConsentUIFinished = callback
// MARK: - callbacks class
class Callbacks: NSObject {
public typealias СallbackCharMessage = @convention(c) (UnsafePointer<CChar>?) -> Void

enum CallbackType: String {
case NotSet = "CallbackNotSet"
case System = "System"
case Default = "Default"
case OnConsentReady = "OnConsentReady"
case OnConsentUIReady = "OnConsentUIReady"
case OnConsentAction = "OnConsentAction"
case OnConsentUIFinished = "OnConsentUIFinished"
case OnErrorCallback = "OnErrorCallback"
case OnSPFinished = "OnSPFinished"
case OnSPUIFinished = "OnSPUIFinished"
case OnCustomConsent = "OnCustomConsent"
}

var Callbacks: [CallbackType:CallbackSwift] = [:]

@objc public func setCallbackOnErrorCallback(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnErrorCallback")
callbackOnErrorCallback = callback
func AddCallback(callback: @escaping СallbackCharMessage, callbackType: CallbackType) {
printLog("Add callback type: \(callbackType.rawValue)")
Callbacks[callbackType] = CallbackSwift.init(callback: callback, callbackType: callbackType)
}
@objc public func setCallbackOnSPFinished(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnSPFinished")
callbackOnSPFinished = callback

func RunCallback(callbackType: CallbackType, arg: String?) {
printLog("Run callback type: \(callbackType.rawValue) Callback set up:\(String(Callbacks[callbackType] != nil))")
(Callbacks[callbackType]?.callback ?? printChar)(arg ?? "")
}

@objc public func setCallbackOnCustomConsent(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnCustomConsent")
callbackOnCustomConsent = callback
func CleanCallbacks() {
Callbacks = [:]
}
}

func runCallback(callback: СallbackCharMessage?, arg: String?) {
if callback != nil {
callback!(arg)
}else{
(callbackDefault ?? callbackSystem)("onError not set:"+(arg ?? ""))
}
}
public class CallbackSwift {
var callback: Callbacks.СallbackCharMessage
var callbackType: Callbacks.CallbackType

public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
if OSLogger.defaultLevel == .debug {
printLog(items)
}
init(
callback: @escaping Callbacks.СallbackCharMessage = printChar,
callbackType: Callbacks.CallbackType = .NotSet) {
self.callback = callback
self.callbackType = callbackType
}
}

Expand Down
67 changes: 7 additions & 60 deletions Assets/ConsentManagementProvider/Plugins/iOS/Source/Unity.mm
Original file line number Diff line number Diff line change
Expand Up @@ -12,52 +12,10 @@

extern "C"
{
void _setCallbackDefault (СallbackCharMessage callback){
void _setCallback (СallbackCharMessage callback, char* typeCallback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackDefaultWithCallback:callback];
}

void _setCallbackOnConsentReady (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnConsentReadyWithCallback:callback];
}

void _setCallbackOnConsentUIReady (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnConsentUIReadyWithCallback:callback];
}

void _setCallbackOnConsentAction (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnConsentActionWithCallback:callback];
}

void _setCallbackOnConsentUIFinished (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnConsentUIFinishedWithCallback:callback];
}

void _setCallbackOnErrorCallback (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnErrorCallbackWithCallback:callback];
}

void _setCallbackOnSPFinished (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnSPFinishedWithCallback:callback];
}

void _setCallbackOnCustomConsent (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnCustomConsentWithCallback:callback];
[swiftBridge setCallbackWithCallback:callback typeCallback:[NSString stringWithFormat:@"%s", typeCallback]];
}

void _initLib()
Expand All @@ -81,9 +39,9 @@ void _setSupportLegacyUSPString(bool value)
[swiftBridge setSupportLegacyUSPStringWithValue:value];
}

void _configLib(int accountId, int propertyId, char* propertyName, bool gdpr, bool ccpa, bool usnat, char* language, char* gdprPmId, char* ccpaPmId, char* usnatPmId)
void _configLib(int accountId, int propertyId, char* propertyName, bool gdpr, bool ccpa, bool usnat, char* language, int messageTimeoutInSeconds)
{
[swiftBridge configLibWithAccountId:accountId propertyId:propertyId propertyName:[NSString stringWithFormat:@"%s", propertyName] gdpr:gdpr ccpa:ccpa usnat:usnat language:[NSString stringWithFormat:@"%s", language] gdprPmId:[NSString stringWithFormat:@"%s", gdprPmId] ccpaPmId:[NSString stringWithFormat:@"%s", ccpaPmId] usnatPmId:[NSString stringWithFormat:@"%s", usnatPmId]];
[swiftBridge configLibWithAccountId:accountId propertyId:propertyId propertyName:[NSString stringWithFormat:@"%s", propertyName] gdpr:gdpr ccpa:ccpa usnat:usnat language:[NSString stringWithFormat:@"%s", language] messageTimeoutInSeconds:messageTimeoutInSeconds];
}

void _loadMessage()
Expand All @@ -95,23 +53,12 @@ void _loadMessageWithAuthId(char * authId)
{
[swiftBridge loadMessageWithAuthId:[NSString stringWithFormat:@"%s", authId]];
}

void _loadGDPRPrivacyManager()
{
[swiftBridge onGDPRPrivacyManagerTap];
}

void _loadCCPAPrivacyManager()

void _loadPrivacyManager(int campaignType, char* pmId, int tab)
{
[swiftBridge onCCPAPrivacyManagerTap];
[swiftBridge loadPrivacyManagerWithCampaignType:campaignType pmId:[NSString stringWithFormat:@"%s", pmId] tab:(SPPrivacyManagerTab)tab];
}

void _loadUSNATPrivacyManager()
{
[swiftBridge onUSNATPrivacyManagerTap];
}


void _cleanConsent()
{
[swiftBridge onClearConsentTap];
Expand Down
Loading