Skip to content

Commit

Permalink
Merge pull request #60 from SourcePointUSA/DIA-4057-refactor-cmp-clas…
Browse files Browse the repository at this point in the history
…s-abstract

DIA-4057 refactor of cmp class – adding interface
  • Loading branch information
Nevazhnovu authored Jul 18, 2024
2 parents 086ef40 + a23ebd8 commit 71456ed
Show file tree
Hide file tree
Showing 101 changed files with 1,393 additions and 1,227 deletions.
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

0 comments on commit 71456ed

Please sign in to comment.