Add full audio support

This commit is contained in:
Tiago Jacobs
2022-04-19 20:44:38 -03:00
parent e6824a10b2
commit e28b3ddeae
20 changed files with 634 additions and 37 deletions

View File

@@ -0,0 +1,12 @@
import type { MutableRefObject } from 'react';
import nativeEmitter from '../native-messaging/emitter';
export function setupListener(_webViewRef: MutableRefObject<any>) {
// Resolve promise when SDP offer is available
nativeEmitter.addListener('onBroadcastFinished', () => {
console.log(`Broadcast finished`);
_webViewRef.current.injectJavaScript(
`window.bbbMobileScreenShareBroadcastFinishedCallback && window.bbbMobileScreenShareBroadcastFinishedCallback();`
);
});
}

View File

@@ -12,7 +12,7 @@ export function setupListener(_webViewRef: MutableRefObject<any>) {
}
const event = { candidate: iceCandidate };
_webViewRef.current.injectJavaScript(
`window.bbbMobileScreenShareIceCandidateCallback(${JSON.stringify(
`window.bbbMobileScreenShareIceCandidateCallback && window.bbbMobileScreenShareIceCandidateCallback(${JSON.stringify(
event
)});`
);

View File

@@ -6,7 +6,7 @@ export function setupListener(_webViewRef: MutableRefObject<any>) {
nativeEmitter.addListener('onScreenShareSignalingStateChange', (newState) => {
console.log(`Temos um novo state: ${newState}`);
_webViewRef.current.injectJavaScript(
`window.bbbMobileScreenShareSignalingStateChangeCallback(${JSON.stringify(
`window.bbbMobileScreenShareSignalingStateChangeCallback && window.bbbMobileScreenShareSignalingStateChangeCallback(${JSON.stringify(
newState
)});`
);

View File

@@ -5,6 +5,7 @@ import { WebView } from 'react-native-webview';
import { handleWebviewMessage } from './webview/message-handler';
import * as onScreenShareLocalIceCandidate from './events/onScreenShareLocalIceCandidate';
import * as onScreenShareSignalingStateChange from './events/onScreenShareSignalingStateChange';
import * as onBroadcastFinished from './events/onBroadcastFinished';
type BigbluebuttonMobileSdkProps = {
url: string;
@@ -30,6 +31,7 @@ export const BigBlueButtonMobile = ({
useEffect(() => {
onScreenShareLocalIceCandidate.setupListener(webViewRef);
onScreenShareSignalingStateChange.setupListener(webViewRef);
onBroadcastFinished.setupListener(webViewRef);
}, [webViewRef]);
return (

View File

@@ -0,0 +1,32 @@
import { createFullAudioOffer as nativeCreateFullAudioOffer } from '../native-components/BBBN_FullAudioService';
import nativeEmitter from '../native-messaging/emitter';
// Reference to the resolver of last call
let resolve = (a: String) => {
console.log(
`default resolve function called, this should never happen: ${a}`
);
};
// Resolve promise when SDP offer is available
nativeEmitter.addListener('onFullAudioOfferCreated', (sdp) => {
resolve(sdp);
});
// Entry point of this method
function createFullAudioOffer() {
return new Promise((res, rej) => {
// store the resolver for later call (when event is received)
resolve = res;
try {
console.log(`>nativeCreateFullAudioOffer`);
// call native swift method that triggers the broadcast popup
nativeCreateFullAudioOffer();
} catch (e) {
rej(`Call to nativeCreateFullAudioOffer failed`);
}
});
}
export default createFullAudioOffer;

View File

@@ -0,0 +1,32 @@
import { setFullAudioRemoteSDP as nativeSetFullAudioRemoteSDP } from '../native-components/BBBN_FullAudioService';
import nativeEmitter from '../native-messaging/emitter';
// Reference to the resolver of last call
let resolve = (value: unknown) => {
console.log(
`default resolve function called, this should never happen: ${value}`
);
};
// Resolve promise when SDP offer is available
nativeEmitter.addListener('onSetFullAudioRemoteSDPCompleted', () => {
resolve(undefined);
});
// Entry point of this method
function setFullAudioRemoteSDP(remoteSdp: string) {
return new Promise((res, rej) => {
// store the resolver for later call (when event is received)
resolve = res;
try {
console.log(`>nativeSetFullAudioRemoteSDP ${remoteSdp}`);
// call native swift method that triggers the broadcast popup
nativeSetFullAudioRemoteSDP(remoteSdp);
} catch (e) {
rej(`Call to nativeSetFullAudioRemoteSDP failed`);
}
});
}
export default setFullAudioRemoteSDP;

View File

@@ -0,0 +1,19 @@
import { NativeModules } from 'react-native';
const FullAudioService = NativeModules.BBBN_FullAudioService;
// export function initializeFullAudio() {
// FullAudioService.initializeFullAudio();
// }
export function createFullAudioOffer() {
FullAudioService.createFullAudioOffer();
}
export function setFullAudioRemoteSDP(remoteSDP: string) {
FullAudioService.setFullAudioRemoteSDP(remoteSDP);
}
// export function addFullAudioRemoteIceCandidate(remoteCandidateJson: string) {
// FullAudioService.addFullAudioRemoteIceCandidate(remoteCandidateJson);
// }

View File

@@ -3,7 +3,9 @@ import type { WebView, WebViewMessageEvent } from 'react-native-webview';
import initializeScreenShare from '../methods/initializeScreenShare';
import createScreenShareOffer from '../methods/createScreenShareOffer';
import setScreenShareRemoteSDP from '../methods/setScreenShareRemoteSDP';
import setFullAudioRemoteSDP from '../methods/setFullAudioRemoteSDP';
import addScreenShareRemoteIceCandidate from '../methods/addScreenShareRemoteIceCandidate';
import createFullAudioOffer from '../methods/createFullAudioOffer';
function observePromiseResult(
webViewRef: MutableRefObject<WebView>,
@@ -42,12 +44,18 @@ export function handleWebviewMessage(
case 'initializeScreenShare':
promise = initializeScreenShare();
break;
case 'createOffer':
case 'createFullAudioOffer':
promise = createFullAudioOffer();
break;
case 'createScreenShareOffer':
promise = createScreenShareOffer();
break;
case 'setRemoteDescription':
case 'setScreenShareRemoteSDP':
promise = setScreenShareRemoteSDP(data?.arguments[0].sdp);
break;
case 'setFullAudioRemoteSDP':
promise = setFullAudioRemoteSDP(data?.arguments[0].sdp);
break;
case 'addRemoteIceCandidate':
promise = addScreenShareRemoteIceCandidate(
JSON.stringify(data?.arguments[0])