diff --git a/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java b/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java index d93f9bdea..070f32b50 100644 --- a/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java +++ b/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java @@ -21,8 +21,6 @@ import com.facebook.react.bridge.WritableMap; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.modules.core.DeviceEventManagerModule; -import com.oney.WebRTCModule.audio.AudioProcessingFactoryProvider; -import com.oney.WebRTCModule.audio.AudioProcessingController; import com.oney.WebRTCModule.webrtcutils.SelectiveVideoDecoderFactory; import org.webrtc.*; @@ -66,7 +64,6 @@ public WebRTCModule(ReactApplicationContext reactContext) { VideoDecoderFactory decoderFactory = options.videoDecoderFactory; Loggable injectableLogger = options.injectableLogger; Logging.Severity loggingSeverity = options.loggingSeverity; - AudioProcessingFactoryProvider audioProcessingFactoryProvider = options.audioProcessingFactoryProvider; String fieldTrials = options.fieldTrials; @@ -92,19 +89,28 @@ public WebRTCModule(ReactApplicationContext reactContext) { adm = JavaAudioDeviceModule.builder(reactContext).createAudioDeviceModule(); } + AudioProcessingFactory audioProcessingFactory = null; + try { + if (options.audioProcessingFactoryProvider != null) { + audioProcessingFactory = options.audioProcessingFactoryProvider.getFactory(); + } + } catch (Exception e) { + // do nothing. + } + Log.d(TAG, "Using video encoder factory: " + encoderFactory.getClass().getCanonicalName()); Log.d(TAG, "Using video decoder factory: " + decoderFactory.getClass().getCanonicalName()); - if(audioProcessingFactoryProvider == null) { - audioProcessingFactoryProvider = new AudioProcessingController(); + PeerConnectionFactory.Builder pcFactoryBuilder = PeerConnectionFactory.builder() + .setAudioDeviceModule(adm) + .setVideoEncoderFactory(encoderFactory) + .setVideoDecoderFactory(decoderFactory); + + if (audioProcessingFactory != null) { + pcFactoryBuilder.setAudioProcessingFactory(audioProcessingFactory); } - mFactory = PeerConnectionFactory.builder() - .setAudioDeviceModule(adm) - .setVideoEncoderFactory(encoderFactory) - .setVideoDecoderFactory(decoderFactory) - .setAudioProcessingFactory(audioProcessingFactoryProvider.getFactory()) - .createPeerConnectionFactory(); + mFactory = pcFactoryBuilder.createPeerConnectionFactory(); // PeerConnectionFactory now owns the adm native pointer, and we don't need it anymore. adm.release(); @@ -127,6 +133,10 @@ public AudioDeviceModule getAudioDeviceModule() { return mAudioDeviceModule; } + public PeerConnectionObserver getPeerConnectionObserver(int id) { + return mPeerConnectionObservers.get(id); + } + private PeerConnection getPeerConnection(int id) { PeerConnectionObserver pco = mPeerConnectionObservers.get(id); return (pco == null) ? null : pco.getPeerConnection(); diff --git a/package-lock.json b/package-lock.json index 07b448d12..5211c7568 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@stream-io/react-native-webrtc", - "version": "137.0.0", + "version": "137.0.1-alpha.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@stream-io/react-native-webrtc", - "version": "137.0.0", + "version": "137.0.1-alpha.1", "license": "MIT", "dependencies": { "base64-js": "1.5.1", diff --git a/package.json b/package.json index 7c49555ca..6287074af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@stream-io/react-native-webrtc", - "version": "137.0.0", + "version": "137.0.1-alpha.1", "repository": { "type": "git", "url": "git+https://github.com/GetStream/react-native-webrtc.git" diff --git a/src/Permissions.ts b/src/Permissions.ts index b3dcd4e8f..e35bab93a 100644 --- a/src/Permissions.ts +++ b/src/Permissions.ts @@ -45,9 +45,31 @@ class Permissions { */ _requestPermissionAndroid(perm: Permission) { return new Promise(resolve => { + let isResolved = false; + + // Set a timeout to handle hanging promise (e.g., "Never ask again" case) + const timeout = setTimeout(() => { + if (!isResolved) { + isResolved = true; + resolve(false); + } + }, 5000); // 5 second timeout + PermissionsAndroid.request(perm).then( - granted => resolve(granted === PermissionsAndroid.RESULTS.GRANTED), - () => resolve(false) + granted => { + if (!isResolved) { + clearTimeout(timeout); + isResolved = true; + resolve(granted === PermissionsAndroid.RESULTS.GRANTED); + } + }, + () => { + if (!isResolved) { + clearTimeout(timeout); + isResolved = true; + resolve(false); + } + } ); }); } @@ -55,7 +77,7 @@ class Permissions { /** * Validates the given permission descriptor. */ - _validatePermissionDescriptior(permissionDesc) { + _validatePermissionDescriptor(permissionDesc) { if (typeof permissionDesc !== 'object') { throw new TypeError('Argument 1 of Permissions.query is not an object.'); } @@ -77,7 +99,7 @@ class Permissions { */ query(permissionDesc: PermissionDescriptor) { try { - this._validatePermissionDescriptior(permissionDesc); + this._validatePermissionDescriptor(permissionDesc); } catch (e) { return Promise.reject(e); } @@ -107,7 +129,7 @@ class Permissions { */ request(permissionDesc: PermissionDescriptor) { try { - this._validatePermissionDescriptior(permissionDesc); + this._validatePermissionDescriptor(permissionDesc); } catch (e) { return Promise.reject(e); } @@ -130,4 +152,4 @@ class Permissions { } } -export default new Permissions(); +export default new Permissions(); \ No newline at end of file diff --git a/src/getUserMedia.ts b/src/getUserMedia.ts index 6ebad9159..310482c2b 100644 --- a/src/getUserMedia.ts +++ b/src/getUserMedia.ts @@ -108,4 +108,4 @@ export default function getUserMedia(constraints: Constraints = {}): Promise