Skip to content

Commit 304ecd0

Browse files
committed
iOS and Initial Android functions
1 parent 103cfb5 commit 304ecd0

File tree

5 files changed

+197
-4
lines changed

5 files changed

+197
-4
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "branch-cordova-sdk",
33
"description": "Branch Metrics Cordova SDK",
44
"main": "src/index.js",
5-
"version": "5.1.0",
5+
"version": "5.2.0",
66
"homepage": "https://github.com/BranchMetrics/cordova-ionic-phonegap-branch-deep-linking",
77
"repository": {
88
"type": "git",

plugin.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ SOFTWARE.
6363
<!-- Manifest configuration is done via a js script. We should move it to this config in the future. -->
6464

6565
<source-file src="src/android/io/branch/BranchSDK.java" target-dir="src/io/branch" />
66-
<framework src="io.branch.sdk.android:library:5.1.5"/>
66+
<framework src="io.branch.sdk.android:library:5.2.0"/>
6767
</platform>
6868

6969
<!-- iOS -->
@@ -87,7 +87,7 @@ SOFTWARE.
8787
<source url="https://cdn.cocoapods.org/"/>
8888
</config>
8989
<pods>
90-
<pod name="Branch" spec="~> 1.42.0" />
90+
<pod name="Branch" spec="~> 1.43.1" />
9191
</pods>
9292
</podspec>
9393
</platform>

src/android/io/branch/BranchSDK.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,9 @@ public boolean execute(String action, JSONArray args, CallbackContext callbackCo
223223

224224
branchObjectWrappers.set(args.getInt(0), branchObjWrapper);
225225

226+
} else if (action.equals("getBranchQRCode")) {
227+
cordova.getActivity().runOnUiThread(r);
228+
return true;
226229
}
227230

228231
return true;
@@ -508,6 +511,45 @@ private void generateShortUrl(int instanceIdx, JSONObject options, JSONObject co
508511

509512
}
510513

514+
/**
515+
* Generate a QR code.
516+
*
517+
* @param qrCodeSettings A {@link JSONObject} value to set QR cide options.
518+
* @param instanceIdx The instance index from branchObjects array
519+
* @param options A {@link JSONObject} value to set URL options.
520+
* @param controlParams A {@link JSONObject} value to set the URL control parameters.
521+
*/
522+
private void getBranchQRCode(JSONObject qrCodeSettings, int instanceIdx, JSONObject options, JSONObject controlParams, CallbackContext callbackContext) throws JSONException {
523+
524+
BranchLinkProperties linkProperties = createLinkProperties(options, controlParams);
525+
526+
BranchUniversalObjectWrapper branchUniversalWrapper = (BranchUniversalObjectWrapper) this.branchObjectWrappers.get(instanceIdx);
527+
BranchUniversalObject buo = branchUniversalWrapper.branchUniversalObj;
528+
529+
try {
530+
qrCode.getQRCodeAsData(getReactApplicationContext().getCurrentActivity(), branchUniversalObject, linkProperties, new BranchQRCode.BranchQRCodeDataHandler() {
531+
@Override
532+
public void onSuccess(byte[] qrCodeData) {
533+
String qrCodeString = Base64.encodeToString(qrCodeData, Base64.DEFAULT);
534+
promise.resolve(qrCodeString);
535+
}
536+
537+
@Override
538+
public void onFailure(Exception e) {
539+
Log.d("Failed to get QR Code", e.getMessage());
540+
promise.reject("Failed to get QR Code", e.getMessage());
541+
}
542+
});
543+
} catch (IOException e) {
544+
e.printStackTrace();
545+
Log.d("Failed to get QR Code", e.getMessage());
546+
promise.reject("Failed to get QR Code", e.getMessage());
547+
}
548+
549+
//branchUniversalWrapper.branchUniversalObj.generateShortUrl(this.activity, linkProperties, new GenerateShortUrlListener(callbackContext));
550+
551+
}
552+
511553
/**
512554
* <p>Sets the cookie based matching for all incoming requests.</p>
513555
* <p>If you want cookie based matching, call this <b>before</b> initUserSession</p>

src/index.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ var Branch = function Branch() {
3939
this.sessionInitialized = false;
4040
};
4141

42-
// JavsSript to SDK wrappers
42+
// JavaScript to SDK wrappers
4343
function execute(method, params) {
4444
var output = !params ? [] : params;
4545

@@ -314,5 +314,29 @@ Branch.prototype.lastAttributedTouchData = function lastAttributedTouchData() {
314314
return execute("lastAttributedTouchData");
315315
};
316316

317+
Branch.prototype.getBranchQRCode = function getBranchQRCode(
318+
qrCodeSettings,
319+
branchUniversalObject,
320+
analytics,
321+
properties
322+
) {
323+
var args = [];
324+
if (qrCodeSettings) {
325+
args.push(qrCodeSettings);
326+
}
327+
if (branchUniversalObject) {
328+
args.push(branchUniversalObject.instanceId);
329+
}
330+
if (analytics) {
331+
args.push(analytics);
332+
}
333+
if (properties) {
334+
args.push(properties);
335+
}
336+
337+
return execute("getBranchQRCode", args);
338+
};
339+
340+
317341
// export Branch object
318342
module.exports = new Branch();

src/ios/BranchSDK.m

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,133 @@ - (void)lastAttributedTouchData:(CDVInvokedUrlCommand *)command {
648648
}];
649649
}
650650

651+
- (void)getBranchQRCode:(CDVInvokedUrlCommand*)command
652+
{
653+
int branchUniversalObjectId = [[command.arguments objectAtIndex:1] intValue];
654+
NSMutableDictionary *branchUniversalObjDict = [self.branchUniversalObjArray objectAtIndex:branchUniversalObjectId];
655+
BranchUniversalObject *branchUniversalObj = [branchUniversalObjDict objectForKey:@"branchUniversalObj"];
656+
//BranchUniversalObject *branchUniversalObj = [BranchUniversalObject new];//[[BranchUniversalObject alloc] initWithMap:universalObjectProperties];
657+
658+
BranchLinkProperties *linkProperties = [BranchLinkProperties new];//[self createLinkProperties:linkPropertiesMap withControlParams:controlParamsMap];
659+
660+
NSDictionary *arg1 = [command.arguments objectAtIndex:2];
661+
NSDictionary *arg2 = [command.arguments objectAtIndex:3];
662+
663+
for (id key in arg1) {
664+
if ([key isEqualToString:@"duration"]) {
665+
linkProperties.matchDuration = (NSUInteger)[((NSNumber *)[arg1 objectForKey:key]) integerValue];
666+
}
667+
else if ([key isEqualToString:@"feature"]) {
668+
linkProperties.feature = [arg1 objectForKey:key];
669+
}
670+
else if ([key isEqualToString:@"stage"]) {
671+
linkProperties.stage = [arg1 objectForKey:key];
672+
}
673+
else if ([key isEqualToString:@"campaign"]) {
674+
linkProperties.campaign = [arg1 objectForKey:key];
675+
}
676+
else if ([key isEqualToString:@"alias"]) {
677+
linkProperties.alias = [arg1 objectForKey:key];
678+
}
679+
else if ([key isEqualToString:@"channel"]) {
680+
linkProperties.channel = [arg1 objectForKey:key];
681+
}
682+
else if ([key isEqualToString:@"tags"] && [[arg1 objectForKey:key] isKindOfClass:[NSArray class]]) {
683+
linkProperties.tags = [arg1 objectForKey:key];
684+
}
685+
}
686+
if (arg2) {
687+
for (id key in arg2) {
688+
[linkProperties addControlParam:key withValue:[arg2 objectForKey:key]];
689+
}
690+
}
691+
692+
693+
NSMutableDictionary *qrCodeSettingsMap = [command.arguments objectAtIndex:0];
694+
695+
BranchQRCode *qrCode = [BranchQRCode new];
696+
697+
if (qrCodeSettingsMap[@"codeColor"]) {
698+
qrCode.codeColor = [self colorWithHexString:qrCodeSettingsMap[@"codeColor"]];
699+
}
700+
if (qrCodeSettingsMap[@"backgroundColor"]) {
701+
qrCode.backgroundColor = [self colorWithHexString:qrCodeSettingsMap[@"backgroundColor"]];
702+
}
703+
if (qrCodeSettingsMap[@"centerLogo"]) {
704+
qrCode.centerLogo = qrCodeSettingsMap[@"centerLogo"];
705+
}
706+
if (qrCodeSettingsMap[@"width"]) {
707+
qrCode.width = qrCodeSettingsMap[@"width"];
708+
}
709+
if (qrCodeSettingsMap[@"margin"]) {
710+
qrCode.margin = qrCodeSettingsMap[@"margin"];
711+
}
712+
if (qrCodeSettingsMap[@"imageFormat"]) {
713+
if ([qrCodeSettingsMap[@"imageFormat"] isEqual:@"JPEG"]) {
714+
qrCode.imageFormat = BranchQRCodeImageFormatJPEG;
715+
} else {
716+
qrCode.imageFormat = BranchQRCodeImageFormatPNG;
717+
}
718+
}
719+
720+
[qrCode getQRCodeAsData:branchUniversalObj linkProperties:linkProperties completion:^(NSData * _Nonnull qrCodeData, NSError * _Nonnull error) {
721+
CDVPluginResult* pluginResult = nil;
722+
723+
if (!error) {
724+
NSString* imageString = [qrCodeData base64EncodedStringWithOptions:nil];
725+
NSLog(@"Success");
726+
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:imageString];
727+
} else {
728+
NSLog(@"Error");
729+
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:[error localizedDescription]];
730+
}
731+
732+
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
733+
}];
734+
}
735+
736+
- (UIColor *) colorWithHexString: (NSString *) hexString {
737+
NSString *colorString = [[hexString stringByReplacingOccurrencesOfString: @"#" withString: @""] uppercaseString];
738+
CGFloat alpha, red, blue, green;
739+
switch ([colorString length]) {
740+
case 3: // #RGB
741+
alpha = 1.0f;
742+
red = [self colorComponentFrom: colorString start: 0 length: 1];
743+
green = [self colorComponentFrom: colorString start: 1 length: 1];
744+
blue = [self colorComponentFrom: colorString start: 2 length: 1];
745+
break;
746+
case 4: // #ARGB
747+
alpha = [self colorComponentFrom: colorString start: 0 length: 1];
748+
red = [self colorComponentFrom: colorString start: 1 length: 1];
749+
green = [self colorComponentFrom: colorString start: 2 length: 1];
750+
blue = [self colorComponentFrom: colorString start: 3 length: 1];
751+
break;
752+
case 6: // #RRGGBB
753+
alpha = 1.0f;
754+
red = [self colorComponentFrom: colorString start: 0 length: 2];
755+
green = [self colorComponentFrom: colorString start: 2 length: 2];
756+
blue = [self colorComponentFrom: colorString start: 4 length: 2];
757+
break;
758+
case 8: // #AARRGGBB
759+
alpha = [self colorComponentFrom: colorString start: 0 length: 2];
760+
red = [self colorComponentFrom: colorString start: 2 length: 2];
761+
green = [self colorComponentFrom: colorString start: 4 length: 2];
762+
blue = [self colorComponentFrom: colorString start: 6 length: 2];
763+
break;
764+
default:
765+
NSLog(@"Error: Invalid color value. It should be a hex value of the form #RBG, #ARGB, #RRGGBB, or #AARRGGBB");
766+
break;
767+
}
768+
return [UIColor colorWithRed: red green: green blue: blue alpha: alpha];
769+
}
770+
771+
- (CGFloat) colorComponentFrom: (NSString *) string start: (NSUInteger) start length: (NSUInteger) length {
772+
NSString *substring = [string substringWithRange: NSMakeRange(start, length)];
773+
NSString *fullHex = length == 2 ? substring : [NSString stringWithFormat: @"%@%@", substring, substring];
774+
unsigned hexComponent;
775+
[[NSScanner scannerWithString: fullHex] scanHexInt: &hexComponent];
776+
return hexComponent / 255.0;
777+
}
651778

652779
#pragma mark - URL Methods (not fully implemented YET!)
653780

0 commit comments

Comments
 (0)