Skip to content

Commit

Permalink
Merge pull request #698 from BranchMetrics/gdeluna-branch/INTENG-13785
Browse files Browse the repository at this point in the history
Add content items support in sendBranchEvent
Remove sendCommerceEvent
Fix bug where custom data would clobber other fields when creating event in Android plugin
Update iOS SDK to 1.40.2
Update Android SDK to 5.0.15
  • Loading branch information
gdeluna-branch authored Jan 22, 2022
2 parents eb21b2e + b2725c5 commit 356a36c
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 197 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "branch-cordova-sdk",
"description": "Branch Metrics Cordova SDK",
"main": "src/index.js",
"version": "4.2.4",
"version": "5.0.0",
"homepage": "https://github.com/BranchMetrics/cordova-ionic-phonegap-branch-deep-linking",
"repository": {
"type": "git",
Expand Down
6 changes: 3 additions & 3 deletions plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ SOFTWARE.
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android"
id="branch-cordova-sdk"
version="4.2.4">
version="5.0.0">

<!-- Description -->
<name>branch-cordova-sdk</name>
Expand Down Expand Up @@ -63,7 +63,7 @@ SOFTWARE.
<!-- Manifest configuration is done via a js script. We should move it to this config in the future. -->

<source-file src="src/android/io/branch/BranchSDK.java" target-dir="src/io/branch" />
<framework src="io.branch.sdk.android:library:5.0.8"/>
<framework src="io.branch.sdk.android:library:5.0.15"/>
</platform>

<!-- iOS -->
Expand All @@ -87,7 +87,7 @@ SOFTWARE.
<source url="https://cdn.cocoapods.org/"/>
</config>
<pods>
<pod name="Branch" spec="~> 1.39.2" />
<pod name="Branch" spec="~> 1.40.2" />
</pods>
</podspec>
</platform>
Expand Down
165 changes: 57 additions & 108 deletions src/android/io/branch/BranchSDK.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package io.branch;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.annotation.TargetApi;
import android.net.Uri;
import android.os.Build;
import android.util.Log;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
Expand All @@ -20,22 +19,18 @@

import io.branch.indexing.BranchUniversalObject;
import io.branch.referral.Branch;
import io.branch.referral.PrefHelper;
import io.branch.referral.BranchError;
import io.branch.referral.BranchViewHandler;
import io.branch.referral.ServerRequestGetCPID.BranchCrossPlatformIdListener;
import io.branch.referral.ServerRequestGetLATD.BranchLastAttributedTouchDataListener;
import io.branch.referral.SharingHelper;
import io.branch.referral.util.BRANCH_STANDARD_EVENT;
import io.branch.referral.util.BranchCPID;
import io.branch.referral.util.BranchEvent;
import io.branch.referral.util.CommerceEvent;
import io.branch.referral.util.ContentMetadata;
import io.branch.referral.util.CurrencyType;
import io.branch.referral.util.Product;
import io.branch.referral.util.ProductCategory;
import io.branch.referral.util.ShareSheetStyle;

import io.branch.referral.ServerRequestGetLATD.BranchLastAttributedTouchDataListener;
import io.branch.referral.ServerRequestGetCPID.BranchCrossPlatformIdListener;
import io.branch.referral.util.BranchCPID;

public class BranchSDK extends CordovaPlugin {

static class BranchLinkProperties extends io.branch.referral.util.LinkProperties {
Expand Down Expand Up @@ -147,13 +142,6 @@ public boolean execute(String action, JSONArray args, CallbackContext callbackCo
}
cordova.getActivity().runOnUiThread(r);
return true;
} else if (action.equals("sendCommerceEvent")) {
if (args.length() < 1 && args.length() > 2) {
callbackContext.error(String.format("Parameter mismatched. 1-2 is required but %d is given", args.length()));
return false;
}
cordova.getActivity().runOnUiThread(r);
return true;
} else if (action.equals("sendBranchEvent")) {
if (args.length() < 1 && args.length() > 2) {
callbackContext.error(String.format("Parameter mismatched. 1-2 is required but %d is given", args.length()));
Expand Down Expand Up @@ -627,91 +615,6 @@ private void userCompletedAction(String action, JSONObject metaData, CallbackCon

}

/**
* <p>A void call to indicate that the user has performed a specific commerce event and for that to be
* reported to the Branch API.</p>
*
* @param action A {@link String} value to be passed as an commerce event that the user has
* carried out.
* @param metaData A {@link JSONObject} containing app-defined meta-data to be attached to a
* user action that has just been completed.
* @param callbackContext A callback to execute at the end of this method
*/
private void sendCommerceEvent(JSONObject action, JSONObject metaData, CallbackContext callbackContext) throws JSONException {

CommerceEvent commerce = new CommerceEvent();
Iterator<String> keys = action.keys();
while (keys.hasNext()) {
String key = keys.next();
String val;
try {
val = action.getString(key);
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Invalid key-value for " + key);
return;
}
if (key.equals("revenue")) {
commerce.setRevenue(Double.parseDouble(val));
} else if (key.equals("currency")) {
commerce.setCurrencyType(CurrencyType.values()[Integer.parseInt(val)]);
} else if (key.equals("transactionID")) {
commerce.setTransactionID(val);
} else if (key.equals("coupon")) {
commerce.setCoupon(val);
} else if (key.equals("shipping")) {
commerce.setShipping(Double.parseDouble(val));
} else if (key.equals("tax")) {
commerce.setTax(Double.parseDouble(val));
} else if (key.equals("affiliation")) {
commerce.setAffiliation(val);
} else if (key.equals("products")) {
JSONArray products = new JSONArray();
try {
products = action.getJSONArray(key);
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Invalid key-value for " + key);
return;
}
for (int i = 0; i < products.length(); ++i) {
Product product = new Product();
JSONObject item = products.getJSONObject(i);
keys = item.keys();
while (keys.hasNext()) {
key = keys.next();
try {
val = item.getString(key);
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Invalid key-value for product for " + key);
return;
}
if (key.equals("sku")) {
product.setSku(val);
} else if (key.equals("name")) {
product.setName(val);
} else if (key.equals("price")) {
product.setPrice(Double.parseDouble(val));
} else if (key.equals("quantity")) {
product.setQuantity(Integer.parseInt(val));
} else if (key.equals("brand")) {
product.setBrand(val);
} else if (key.equals("category")) {
product.setCategory(ProductCategory.values()[Integer.parseInt(val)]);
} else if (key.equals("variant")) {
product.setVariant(val);
}
}
commerce.addProduct(product);
}
}
}

this.instance.sendCommerceEvent(commerce, metaData, new BranchViewEventsListener(callbackContext));

}

public void sendBranchEvent(String eventName, CallbackContext callbackContext) throws JSONException {

BranchEvent event;
Expand Down Expand Up @@ -768,19 +671,67 @@ public void sendBranchEvent(String eventName, JSONObject metaData, CallbackConte
event.setCustomerEventAlias(metaData.getString("customerEventAlias"));
} else if (key.equals("customData")) {
JSONObject customData = metaData.getJSONObject("customData");
keys = customData.keys();
Iterator<String> customDataKeys = customData.keys();

while (keys.hasNext()) {
String keyValue = (String) keys.next();
while (customDataKeys.hasNext()) {
String keyValue = (String) customDataKeys.next();
event.addCustomDataProperty(keyValue, customData.getString(keyValue));
}
} else if (key.equals("contentMetadata")) {
JSONArray contentMetadata = metaData.getJSONArray("contentMetadata");
for (int i = 0; i < contentMetadata.length(); i++) {
JSONObject item = contentMetadata.getJSONObject(i);
BranchUniversalObject universalObject = this.getContentItem(item);
event.addContentItems(universalObject);
}
}

}
event.logEvent(this.activity);
//callbackContext.success();
}

private BranchUniversalObject getContentItem(JSONObject item) throws JSONException {
BranchUniversalObject universalObject = new BranchUniversalObject();
ContentMetadata contentMetadata = new ContentMetadata();
Iterator<String> keys = item.keys();
while (keys.hasNext()) {
String key = keys.next();

switch (key) {
case "quantity":
contentMetadata.setQuantity(Double.parseDouble(item.getString(key)));
break;
case "price":
contentMetadata.price = Double.parseDouble(item.getString(key));
break;
case "currency":
String currencyString = item.getString(key);
CurrencyType currency = CurrencyType.getValue(currencyString);
if (currency != null) {
contentMetadata.currencyType = currency;
}
break;
case "productName":
contentMetadata.setProductName(item.getString(key));
break;
case "productBrand":
contentMetadata.setProductBrand(item.getString(key));
break;
case "sku":
contentMetadata.setSku(item.getString(key));
break;
default:
contentMetadata.addCustomMetadata(key, item.getString(key));
break;
}
}

universalObject.setContentMetadata(contentMetadata);

return universalObject;
}

/**
* @access protected
* @class BranchUniversalObjectWrapper
Expand Down Expand Up @@ -1222,8 +1173,6 @@ public void run() {
} else if (this.args.length() == 1) {
userCompletedAction(this.args.getString(0), this.callbackContext);
}
} else if (this.action.equals("sendCommerceEvent")) {
sendCommerceEvent(this.args.getJSONObject(0), this.args.getJSONObject(1), this.callbackContext);
} else if (this.action.equals("sendBranchEvent")) {
if (this.args.length() == 2) {
sendBranchEvent(this.args.getString(0), this.args.getJSONObject(1), this.callbackContext);
Expand Down
94 changes: 9 additions & 85 deletions src/ios/BranchSDK.m
Original file line number Diff line number Diff line change
Expand Up @@ -301,95 +301,19 @@ -(void)sendBranchEvent:(CDVInvokedUrlCommand*)command
else if ([key isEqualToString:@"customData"] && [[metadata objectForKey:key] isKindOfClass:[NSMutableDictionary class]]) {
event.customData = [metadata objectForKey:key];
}
else if ([key isEqualToString:@"contentMetadata"]){
NSMutableArray *mArray = [[NSMutableArray alloc]init];

for (NSDictionary *dataDictionary in [metadata objectForKey:key]){
BranchUniversalObject *contentItem = [BranchUniversalObject objectWithDictionary:(dataDictionary)];
[mArray addObject:contentItem];
}
event.contentItems = [mArray copy];
}
}
[event logEvent];
}

- (void)sendCommerceEvent:(CDVInvokedUrlCommand*)command
{
NSDictionary *data = [command.arguments objectAtIndex:0];
NSDictionary *metadata;
BNCCommerceEvent *commerce = [[BNCCommerceEvent alloc] init];
NSArray *categories = [NSArray arrayWithObjects:BNCProductCategoryAnimalSupplies, BNCProductCategoryApparel, BNCProductCategoryArtsEntertainment, BNCProductCategoryBabyToddler, BNCProductCategoryBusinessIndustrial, BNCProductCategoryCamerasOptics, BNCProductCategoryElectronics, BNCProductCategoryFoodBeverageTobacco, BNCProductCategoryFurniture, BNCProductCategoryHardware, BNCProductCategoryHealthBeauty, BNCProductCategoryHomeGarden, BNCProductCategoryLuggageBags, BNCProductCategoryMature, BNCProductCategoryMedia, BNCProductCategoryOfficeSupplies, BNCProductCategoryReligious, BNCProductCategorySoftware, BNCProductCategorySportingGoods, BNCProductCategoryToysGames, BNCProductCategoryVehiclesParts, nil];
NSArray *currencies = [NSArray arrayWithObjects:@"AED", @"AFN", @"ALL", @"AMD", @"ANG", @"AOA", @"ARS", @"AUD", @"AWG", @"AZN", @"BAM", @"BBD", @"BDT", @"BGN", @"BHD", @"BIF", @"BMD", @"BND", @"BOB", @"BOV", @"BRL", @"BSD", @"BTN", @"BWP", @"BYN", @"BYR", @"BZD", @"CAD", @"CDF", @"CHE", @"CHF", @"CHW", @"CLF", @"CLP", @"CNY", @"COP", @"COU", @"CRC", @"CUC", @"CUP", @"CVE", @"CZK", @"DJF", @"DKK", @"DOP", @"DZD", @"EGP", @"ERN", @"ETB", @"EUR", @"FJD", @"FKP", @"GBP", @"GEL", @"GHS", @"GIP", @"GMD", @"GNF", @"GTQ", @"GYD", @"HKD", @"HNL", @"HRK", @"HTG", @"HUF", @"IDR", @"ILS", @"INR", @"IQD", @"IRR", @"ISK", @"JMD", @"JOD", @"JPY", @"KES", @"KGS", @"KHR", @"KMF", @"KPW", @"KRW", @"KWD", @"KYD", @"KZT", @"LAK", @"LBP", @"LKR", @"LRD", @"LSL", @"LYD", @"MAD", @"MDL", @"MGA", @"MKD", @"MMK", @"MNT", @"MOP", @"MRO", @"MUR", @"MVR", @"MWK", @"MXN", @"MXV", @"MYR", @"MZN", @"NAD", @"NGN", @"NIO", @"NOK", @"NPR", @"NZD", @"OMR", @"PAB", @"PEN", @"PGK", @"PHP", @"PKR", @"PLN", @"PYG", @"QAR", @"RON", @"RSD", @"RUB", @"RWF", @"SAR", @"SBD", @"SCR", @"SDG", @"SEK", @"SGD", @"SHP", @"SLL", @"SOS", @"SRD", @"SSP", @"STD", @"SYP", @"SZL", @"THB", @"TJS", @"TMT", @"TND", @"TOP", @"TRY", @"TTD", @"TWD", @"TZS", @"UAH", @"UGX", @"USD", @"USN", @"UYI", @"UYU", @"UZS", @"VEF", @"VND", @"VUV", @"WST", @"XAF", @"XAG", @"XAU", @"XBA", @"XBB", @"XBC", @"XBD", @"XCD", @"XDR", @"XFU", @"XOF", @"XPD", @"XPF", @"XPT", @"XSU", @"XTS", @"XUA", @"XXX", @"YER", @"ZAR", @"ZMW", nil];

if ([command.arguments count] == 2) {
metadata = [command.arguments objectAtIndex:1];
}

for (id key in data) {
if ([key isEqualToString:@"revenue"]) {
NSString *value = ([[data objectForKey:key] isKindOfClass:[NSString class]]) ? [data objectForKey:key] : [[data objectForKey:key] stringValue];
commerce.revenue = [NSDecimalNumber decimalNumberWithString:value];
}
else if ([key isEqualToString:@"currency"]) {
NSString *value = ([[data objectForKey:key] isKindOfClass:[NSString class]]) ? [data objectForKey:key] : [[data objectForKey:key] stringValue];
commerce.currency = [currencies objectAtIndex:[value intValue]];
}
else if ([key isEqualToString:@"transactionID"]) {
commerce.transactionID = [data objectForKey:key];
}
else if ([key isEqualToString:@"shipping"]) {
NSString *value = ([[data objectForKey:key] isKindOfClass:[NSString class]]) ? [data objectForKey:key] : [[data objectForKey:key] stringValue];
commerce.shipping = [NSDecimalNumber decimalNumberWithString:value];
}
else if ([key isEqualToString:@"tax"]) {
NSString *value = ([[data objectForKey:key] isKindOfClass:[NSString class]]) ? [data objectForKey:key] : [[data objectForKey:key] stringValue];
commerce.tax = [NSDecimalNumber decimalNumberWithString:value];
}
else if ([key isEqualToString:@"coupon"]) {
commerce.coupon = [data objectForKey:key];
}
else if ([key isEqualToString:@"affiliation"]) {
commerce.affiliation = [data objectForKey:key];
}
else if ([key isEqualToString:@"products"] && [[data objectForKey:key] isKindOfClass:[NSArray class]]) {
NSMutableArray *products = [[NSMutableArray alloc] init];
NSArray *dataProducts = [data objectForKey:key];
for (NSDictionary *dataDictionary in dataProducts) {
BNCProduct *product = [[BNCProduct alloc] init];
for (id key in dataDictionary) {
if ([key isEqualToString:@"sku"]) {
product.sku = [dataDictionary objectForKey:key];
}
else if ([key isEqualToString:@"name"]) {
product.name = [dataDictionary objectForKey:key];
}
else if ([key isEqualToString:@"price"]) {
NSString *value = ([[dataDictionary objectForKey:key] isKindOfClass:[NSString class]]) ? [dataDictionary objectForKey:key] : [[dataDictionary objectForKey:key] stringValue];
product.price = [NSDecimalNumber decimalNumberWithString:value];
}
else if ([key isEqualToString:@"quantity"]) {
NSString *value = ([[dataDictionary objectForKey:key] isKindOfClass:[NSString class]]) ? [dataDictionary objectForKey:key] : [[dataDictionary objectForKey:key] stringValue];
product.quantity = [NSNumber numberWithInt:[value intValue]];
}
else if ([key isEqualToString:@"brand"]) {
product.brand = [dataDictionary objectForKey:key];
}
else if ([key isEqualToString:@"category"]) {
NSString *value = ([[dataDictionary objectForKey:key] isKindOfClass:[NSString class]]) ? [dataDictionary objectForKey:key] : [[dataDictionary objectForKey:key] stringValue];
product.category = [categories objectAtIndex:[value intValue]];
}
else if ([key isEqualToString:@"variant"]) {
product.variant = [dataDictionary objectForKey:key];
}
}
[products addObject:product];
}
commerce.products = products;
}
}

[[Branch getInstance] sendCommerceEvent:commerce metadata:metadata withCompletion:^(NSDictionary *response, NSError *error) {
CDVPluginResult *pluginResult = nil;
if (!error) {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: @"Success"];
} else {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:[error localizedDescription]];
}
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}];
}

- (void)logout:(CDVInvokedUrlCommand*)command
{
Expand Down

0 comments on commit 356a36c

Please sign in to comment.