diff --git a/android/src/main/java/com/stringeereactnative/RNStringeeClientModule.java b/android/src/main/java/com/stringeereactnative/RNStringeeClientModule.java index 005d737..41ba30c 100755 --- a/android/src/main/java/com/stringeereactnative/RNStringeeClientModule.java +++ b/android/src/main/java/com/stringeereactnative/RNStringeeClientModule.java @@ -43,9 +43,9 @@ public void init() { mClient = mStringeeManager.getClient(); if (mClient == null) { mClient = new StringeeClient(getReactApplicationContext()); - mClient.setConnectionListener(this); } + mClient.setConnectionListener(this); mStringeeManager.setClient(mClient); } diff --git a/ios/RNStringeeCall.h b/ios/RNStringeeCall.h index 1031afe..d703592 100755 --- a/ios/RNStringeeCall.h +++ b/ios/RNStringeeCall.h @@ -18,6 +18,8 @@ @interface RNStringeeCall : RCTEventEmitter +@property(strong, nonatomic) StringeeCall *stringeeCall; + - (void)addRenderToView:(UIView *)view callId:(NSString *)callId isLocal:(BOOL)isLocal; @end diff --git a/ios/RNStringeeCall.m b/ios/RNStringeeCall.m index b538e1a..3e97385 100755 --- a/ios/RNStringeeCall.m +++ b/ios/RNStringeeCall.m @@ -2,6 +2,7 @@ #import "RNStringeeCall.h" #import "RNStringeeInstanceManager.h" #import +#import static NSString *didChangeSignalingState = @"didChangeSignalingState"; static NSString *didChangeMediaState = @"didChangeMediaState"; @@ -12,6 +13,12 @@ static NSString *didReceiveCallInfo = @"didReceiveCallInfo"; static NSString *didHandleOnAnotherDevice = @"didHandleOnAnotherDevice"; +@implementation NSString (Helpers) + ++(BOOL)stringIsNilOrEmpty:(NSString*)aString { + return !aString || ![aString length] || [aString length] == 0; +} +@end @implementation RNStringeeCall { NSMutableArray *jsEvents; @@ -45,6 +52,48 @@ + (BOOL)requiresMainQueueSetup { return YES; } +void updateStringeeClzz() { + SEL selectorOrigin = NSSelectorFromString(@"originalAddAllCandidate:"); + if (![StringeeCall respondsToSelector: selectorOrigin]) { + SEL selector = @selector(addAllCandidate:); + Class clzStringeeCall = [StringeeCall class]; + Class clzSelf = [RNStringeeCall class]; + + Method overrideAddAllCandidate = class_getInstanceMethod(clzSelf, selector); + Method originalAddAllCandidate = class_getInstanceMethod(clzStringeeCall, selector); + + BOOL success = class_addMethod(clzStringeeCall, selectorOrigin, method_getImplementation(originalAddAllCandidate), method_getTypeEncoding(originalAddAllCandidate)); + + if (success) { + class_replaceMethod(clzStringeeCall, @selector(addAllCandidate:), method_getImplementation(overrideAddAllCandidate), method_getTypeEncoding(overrideAddAllCandidate)); + } + } +} + +- (void)addAllCandidate: (NSMutableArray*) candidates { + BOOL isNullorEmpty = candidates == nil || [candidates count] == 0; + if (!isNullorEmpty) { + NSUInteger total = [candidates count] - 1; + for (NSUInteger i = total; i > NSIntegerMax; i--) { + NSString* sdp = (NSString*) [[candidates objectAtIndex: i] valueForKey:@"_sdp"]; + if ([NSString stringIsNilOrEmpty: sdp]) { + [candidates removeObjectAtIndex: i]; + } + } + } + SEL originalAddAllCandidate = NSSelectorFromString(@"originalAddAllCandidate:"); + StringeeCall* call = _stringeeCall; + if (call != nil && [call respondsToSelector: originalAddAllCandidate]) + { + NSMethodSignature * methodSignature = [[call class] instanceMethodSignatureForSelector: originalAddAllCandidate]; + NSInvocation * delegateInvocation = [NSInvocation invocationWithMethodSignature:methodSignature]; + [delegateInvocation setSelector: originalAddAllCandidate]; + [delegateInvocation setTarget:call]; + [delegateInvocation setArgument:&candidates atIndex:2]; + [delegateInvocation invoke]; + } +} + // TODO: - Publish Functions RCT_EXPORT_METHOD(setNativeEvent:(NSString *)event) { @@ -127,6 +176,8 @@ + (BOOL)requiresMainQueueSetup { RCT_EXPORT_METHOD(answer:(NSString *)callId callback:(RCTResponseSenderBlock)callback) { if (callId.length) { StringeeCall *call = [[RNStringeeInstanceManager instance].calls objectForKey:callId]; + _stringeeCall = call; + updateStringeeClzz(); if (call) { [call answerCallWithCompletionHandler:^(BOOL status, int code, NSString *message) { callback(@[@(status), @(code), message]);