diff --git a/CHANGELOG.md b/CHANGELOG.md index 794fcf18..6e882986 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ + +6.1.0 Feb 28, 2024 +* Update Android SDK to 5.9.0 +* Update iOS SDK to 3.2.0 +* Added new method, setDMAParamsForEEA(), for setting DMA compliance parameters. +* Removed the deprecated setDebug() method + 6.0.0 Dec 1, 2023 * Update Android SDK to 5.7.5 * Update iOS SDK to 3.0.1 diff --git a/package.json b/package.json index d454c3ea..3324cc5e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "branch-cordova-sdk", "description": "Branch Metrics Cordova SDK", "main": "src/index.js", - "version": "6.0.0", + "version": "6.1.0", "homepage": "https://github.com/BranchMetrics/cordova-ionic-phonegap-branch-deep-linking", "repository": { "type": "git", diff --git a/plugin.xml b/plugin.xml index 252f6edb..63904104 100644 --- a/plugin.xml +++ b/plugin.xml @@ -24,7 +24,7 @@ SOFTWARE. + version="6.1.0"> branch-cordova-sdk @@ -63,7 +63,7 @@ SOFTWARE. - + @@ -87,7 +87,7 @@ SOFTWARE. - + diff --git a/src/android/io/branch/BranchSDK.java b/src/android/io/branch/BranchSDK.java index 12f9c89b..4827f0e9 100644 --- a/src/android/io/branch/BranchSDK.java +++ b/src/android/io/branch/BranchSDK.java @@ -199,6 +199,13 @@ public boolean execute(String action, JSONArray args, CallbackContext callbackCo } cordova.getActivity().runOnUiThread(r); return true; + } else if (action.equals("setDMAParamsForEEA")) { + if (args.length() != 3) { + callbackContext.error("Parameter count mismatch"); + return false; + } + cordova.getActivity().runOnUiThread(r); + return true; } return true; @@ -680,6 +687,17 @@ public void sendBranchEvent(String eventName, JSONObject metaData, CallbackConte //callbackContext.success(); } + /** + *

Configures the handling of DMA parameters for users in the EEA region based on their consent.

+ * + * @param eeaRegion A {@link Boolean} value indicating if the user is from the European Economic Area (EEA). + * @param adPersonalizationConsent A {@link Boolean} value indicating if the user has consented to ad personalization. + * @param adUserDataUsageConsent A {@link Boolean} value indicating if the user has consented to the usage of their data for ads. + */ + public void setDMAParamsForEEA(boolean eeaRegion, boolean adPersonalizationConsent, boolean adUserDataUsageConsent) { + Branch.getInstance().setDMAParamsForEEA(eeaRegion, adPersonalizationConsent, adUserDataUsageConsent); + } + private BranchUniversalObject getContentItem(JSONObject item) throws JSONException { BranchUniversalObject universalObject = new BranchUniversalObject(); ContentMetadata contentMetadata = new ContentMetadata(); @@ -1129,6 +1147,8 @@ public void run() { localization.put("shareWith", "Share With"); } showShareSheet(this.args.getInt(0), this.args.getJSONObject(1), this.args.getJSONObject(2), localization); + } else if (this.action.equals("setDMAParamsForEEA")) { + setDMAParamsForEEA(this.args.getBoolean(0), this.args.getBoolean(1), this.args.getBoolean(2)); } } } catch (JSONException e) { diff --git a/src/index.js b/src/index.js index a82a98b5..f538434a 100644 --- a/src/index.js +++ b/src/index.js @@ -29,8 +29,8 @@ const standardEvent = { STANDARD_EVENT_INVITE: "INVITE", STANDARD_EVENT_LOGIN: "LOGIN", STANDARD_EVENT_SUBSCRIBE: "SUBSCRIBE", - STANDARD_EVENT_START_TRIAL: "START_TRIAL" -} + STANDARD_EVENT_START_TRIAL: "START_TRIAL", +}; // Branch prototype var Branch = function Branch() { @@ -45,7 +45,7 @@ function execute(method, params) { if (method == "getStandardEvents") { return new Promise(function promise(resolve, reject) { - resolve(standardEvent); + resolve(standardEvent); }); } @@ -93,7 +93,9 @@ Branch.prototype.disableTracking = function disableTracking(isEnabled) { Branch.prototype.enableTestMode = function initSession() { if (this.sessionInitialized) { - return executeReject("[enableTestMode] should be called before [initSession]"); + return executeReject( + "[enableTestMode] should be called before [initSession]" + ); } return execute("enableTestMode"); }; @@ -113,13 +115,6 @@ Branch.prototype.setRequestMetadata = function setRequestMetadata(key, val) { return execute("setRequestMetadata", [key, val]); }; -// Deprecated. Replaced by setLogging(isEnabled) and test devices. https://help.branch.io/using-branch/docs/adding-test-devices -Branch.prototype.setDebug = function setDebug(isEnabled) { - return new Promise(function promise(resolve, reject) { - resolve(false); - }); -}; - // For early lifecycle logging, we recommend you enable logging in the native iOS or Android code. Branch.prototype.setLogging = function setLogging(isEnabled) { var value = typeof isEnabled !== "boolean" ? false : isEnabled; @@ -137,26 +132,26 @@ Branch.prototype.setCookieBasedMatching = function setCookieBasedMatching( }; //DEPRECATED -Branch.prototype.delayInitToCheckForSearchAds = function delayInitToCheckForSearchAds( - isEnabled -) { - // stub call from known issue calling it from JS - return new Promise(function promise(resolve, reject) { - resolve(false); - }); +Branch.prototype.delayInitToCheckForSearchAds = + function delayInitToCheckForSearchAds(isEnabled) { + // stub call from known issue calling it from JS + return new Promise(function promise(resolve, reject) { + resolve(false); + }); - // var value = typeof isEnabled !== "boolean" ? false : isEnabled; + // var value = typeof isEnabled !== "boolean" ? false : isEnabled; - // return execute("delayInitToCheckForSearchAds", [value]); -}; + // return execute("delayInitToCheckForSearchAds", [value]); + }; Branch.prototype.getFirstReferringParams = function getFirstReferringParams() { return execute("getFirstReferringParams"); }; -Branch.prototype.getLatestReferringParams = function getLatestReferringParams() { - return execute("getLatestReferringParams"); -}; +Branch.prototype.getLatestReferringParams = + function getLatestReferringParams() { + return execute("getLatestReferringParams"); + }; Branch.prototype.setIdentity = function setIdentity(identity) { if (identity) { @@ -171,13 +166,9 @@ Branch.prototype.logout = function logout() { Branch.prototype.getStandardEvents = function getStandardEvents() { return execute("getStandardEvents"); - }; -Branch.prototype.sendBranchEvent = function sendBranchEvent( - action, - metaData -) { +Branch.prototype.sendBranchEvent = function sendBranchEvent(action, metaData) { var args = [action]; if (!action) { return executeReject("Please set a standard event"); @@ -190,86 +181,85 @@ Branch.prototype.sendBranchEvent = function sendBranchEvent( return execute("sendBranchEvent", args); }; -Branch.prototype.createBranchUniversalObject = function createBranchUniversalObject( - options -) { - return new Promise(function promise(resolve, reject) { - execute("createBranchUniversalObject", [options]).then( - function success(res) { - var obj = { - message: res.message, - instanceId: res.branchUniversalObjectId - }; - - obj.registerView = function registerView() { - return execute("registerView", [obj.instanceId]); - }; - - obj.generateShortUrl = function generateShortUrl( - analytics, - properties - ) { - return execute("generateShortUrl", [ - obj.instanceId, +Branch.prototype.createBranchUniversalObject = + function createBranchUniversalObject(options) { + return new Promise(function promise(resolve, reject) { + execute("createBranchUniversalObject", [options]).then( + function success(res) { + var obj = { + message: res.message, + instanceId: res.branchUniversalObjectId, + }; + + obj.registerView = function registerView() { + return execute("registerView", [obj.instanceId]); + }; + + obj.generateShortUrl = function generateShortUrl( analytics, properties - ]); - }; - - obj.showShareSheet = function showShareSheet( - analytics, - properties, - shareText - ) { - var message = !shareText ? "This stuff is awesome: " : shareText; - - return execute("showShareSheet", [ - obj.instanceId, + ) { + return execute("generateShortUrl", [ + obj.instanceId, + analytics, + properties, + ]); + }; + + obj.showShareSheet = function showShareSheet( analytics, properties, - message - ]); - }; - - obj.onShareSheetLaunched = function onShareSheetLaunched(callback) { - if (deviceVendor.indexOf("Apple") < 0) { - executeCallback("onShareLinkDialogLaunched", callback, [ - obj.instanceId + shareText + ) { + var message = !shareText ? "This stuff is awesome: " : shareText; + + return execute("showShareSheet", [ + obj.instanceId, + analytics, + properties, + message, ]); - } - }; - - obj.onShareSheetDismissed = function onShareSheetDismissed(callback) { - executeCallback("onShareLinkDialogDismissed", callback, [ - obj.instanceId - ]); - }; - - obj.onLinkShareResponse = function onLinkShareResponse(callback) { - executeCallback("onLinkShareResponse", callback, [obj.instanceId]); - }; - - obj.onChannelSelected = function onChannelSelected(callback) { - if (deviceVendor.indexOf("Apple") < 0) { - executeCallback("onChannelSelected", callback, [obj.instanceId]); - } - }; - - obj.listOnSpotlight = function listOnSpotlight() { - if (!(deviceVendor.indexOf("Apple") < 0)) { - return execute("listOnSpotlight", [obj.instanceId]); - } - return executeReject("iOS Spotlight only"); - }; - - resolve(obj); - }, - function failure(err) { - reject(err); - } - ); - }); -}; + }; + + obj.onShareSheetLaunched = function onShareSheetLaunched(callback) { + if (deviceVendor.indexOf("Apple") < 0) { + executeCallback("onShareLinkDialogLaunched", callback, [ + obj.instanceId, + ]); + } + }; + + obj.onShareSheetDismissed = function onShareSheetDismissed(callback) { + executeCallback("onShareLinkDialogDismissed", callback, [ + obj.instanceId, + ]); + }; + + obj.onLinkShareResponse = function onLinkShareResponse(callback) { + executeCallback("onLinkShareResponse", callback, [obj.instanceId]); + }; + + obj.onChannelSelected = function onChannelSelected(callback) { + if (deviceVendor.indexOf("Apple") < 0) { + executeCallback("onChannelSelected", callback, [obj.instanceId]); + } + }; + + obj.listOnSpotlight = function listOnSpotlight() { + if (!(deviceVendor.indexOf("Apple") < 0)) { + return execute("listOnSpotlight", [obj.instanceId]); + } + return executeReject("iOS Spotlight only"); + }; + + resolve(obj); + }, + function failure(err) { + reject(err); + } + ); + }); + }; Branch.prototype.crossPlatformIds = function crossPlatformIds() { return execute("crossPlatformIds"); @@ -302,6 +292,35 @@ Branch.prototype.getBranchQRCode = function getBranchQRCode( return execute("getBranchQRCode", args); }; +Branch.prototype.setDMAParamsForEEA = function setDMAParamsForEEA( + eeaRegion, + adPersonalizationConsent, + adUserDataUsageConsent +) { + const isValid = + validateParam(eeaRegion, "eeaRegion") && + validateParam(adPersonalizationConsent, "adPersonalizationConsent") && + validateParam(adUserDataUsageConsent, "adUserDataUsageConsent"); + + if (isValid) { + var args = [eeaRegion, adPersonalizationConsent, adUserDataUsageConsent]; + return execute("setDMAParamsForEEA", args); + } else { + return executeReject("Unable to set DMA Params"); + } +}; + +const validateParam = (param, paramName) => { + if (param === true || param === false) { + return true; + } else { + console.warn( + `setDMAParamsForEEA: ${paramName} must be boolean, but got ${param}` + ); + + return false; + } +}; // export Branch object module.exports = new Branch(); diff --git a/src/ios/BranchSDK.h b/src/ios/BranchSDK.h index a7286ff4..ac3e2dca 100644 --- a/src/ios/BranchSDK.h +++ b/src/ios/BranchSDK.h @@ -40,6 +40,7 @@ - (void)setIdentity:(CDVInvokedUrlCommand*)command; - (void)registerDeepLinkController:(CDVInvokedUrlCommand*)command; - (void)logout:(CDVInvokedUrlCommand*)command; +- (void)setDMAParamsForEEA:(CDVInvokedUrlCommand*)command; // Branch Universal Object Methods - (void)createBranchUniversalObject:(CDVInvokedUrlCommand*)command; diff --git a/src/ios/BranchSDK.m b/src/ios/BranchSDK.m index 8148ce5c..a45d835e 100644 --- a/src/ios/BranchSDK.m +++ b/src/ios/BranchSDK.m @@ -302,6 +302,24 @@ - (void)logout:(CDVInvokedUrlCommand*)command self.branchUniversalObjArray = [[NSMutableArray alloc] init]; } +- (void)setDMAParamsForEEA:(CDVInvokedUrlCommand*)command { + if (command.arguments.count < 3) { + CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Insufficient arguments"]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + return; + } + + BOOL eeaRegion = [[command.arguments objectAtIndex:0] boolValue]; + BOOL adPersonalizationConsent = [[command.arguments objectAtIndex:1] boolValue]; + BOOL adUserDataUsageConsent = [[command.arguments objectAtIndex:2] boolValue]; + + [Branch setDMAParamsForEEA:eeaRegion AdPersonalizationConsent:adPersonalizationConsent AdUserDataUsageConsent:adUserDataUsageConsent]; + + CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; +} + + #pragma mark - Branch Universal Object Methods - (void)createBranchUniversalObject:(CDVInvokedUrlCommand*)command @@ -474,20 +492,19 @@ - (void)showShareSheet:(CDVInvokedUrlCommand*)command [linkProperties addControlParam:key withValue:[arg2 objectForKey:key]]; } } - - [branchUniversalObj showShareSheetWithLinkProperties:linkProperties andShareText:shareText fromViewController:self.viewController completion:^(NSString *activityType, BOOL completed) { - - int listenerCallbackId = [[command.arguments objectAtIndex:0] intValue]; - - if (completed) { - NSLog(@"Share link complete"); - [branchUniversalObj getShortUrlWithLinkProperties:linkProperties andCallback:^(NSString *url, NSError *error) { - if (!error) { - NSDictionary *response = [[NSDictionary alloc] initWithObjectsAndKeys:url, @"sharedLink", activityType, @"sharedChannel", nil]; - [self doShareLinkResponse:listenerCallbackId sendResponse:response]; + [branchUniversalObj showShareSheetWithLinkProperties:linkProperties andShareText:shareText fromViewController:self.viewController completionWithError:^(NSString * _Nullable activityType, BOOL completed, NSError * _Nullable error) { + + int listenerCallbackId = [[command.arguments objectAtIndex:0] intValue]; + + if (completed) { + NSLog(@"Share link complete"); + [branchUniversalObj getShortUrlWithLinkProperties:linkProperties andCallback:^(NSString *url, NSError *error) { + if (!error) { + NSDictionary *response = [[NSDictionary alloc] initWithObjectsAndKeys:url, @"sharedLink", activityType, @"sharedChannel", nil]; + [self doShareLinkResponse:listenerCallbackId sendResponse:response]; + } + }]; } - }]; - } CDVPluginResult *shareDialogDismissed = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];