@stream-io/video-react-native-sdk 1.27.3 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/android/build.gradle +1 -0
- package/android/src/main/java/com/streamvideo/reactnative/StreamVideoAppLifecycleModule.kt +86 -0
- package/android/src/main/java/com/streamvideo/reactnative/StreamVideoReactNativePackage.kt +5 -1
- package/android/src/main/java/com/streamvideo/reactnative/audio/AudioDeviceManager.kt +19 -11
- package/android/src/main/java/com/streamvideo/reactnative/audio/utils/AudioFocusUtil.kt +23 -9
- package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt +48 -14
- package/dist/commonjs/index.js +2 -0
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/modules/call-manager/CallManager.js +5 -0
- package/dist/commonjs/modules/call-manager/CallManager.js.map +1 -1
- package/dist/commonjs/providers/StreamCall/AppStateListener.js +74 -16
- package/dist/commonjs/providers/StreamCall/AppStateListener.js.map +1 -1
- package/dist/commonjs/utils/internal/registerSDKGlobals.js +34 -0
- package/dist/commonjs/utils/internal/registerSDKGlobals.js.map +1 -0
- package/dist/commonjs/version.js +1 -1
- package/dist/module/index.js +2 -0
- package/dist/module/index.js.map +1 -1
- package/dist/module/modules/call-manager/CallManager.js +5 -0
- package/dist/module/modules/call-manager/CallManager.js.map +1 -1
- package/dist/module/providers/StreamCall/AppStateListener.js +74 -16
- package/dist/module/providers/StreamCall/AppStateListener.js.map +1 -1
- package/dist/module/utils/internal/registerSDKGlobals.js +28 -0
- package/dist/module/utils/internal/registerSDKGlobals.js.map +1 -0
- package/dist/module/version.js +1 -1
- package/dist/typescript/index.d.ts.map +1 -1
- package/dist/typescript/modules/call-manager/CallManager.d.ts +2 -0
- package/dist/typescript/modules/call-manager/CallManager.d.ts.map +1 -1
- package/dist/typescript/modules/call-manager/types.d.ts +1 -0
- package/dist/typescript/modules/call-manager/types.d.ts.map +1 -1
- package/dist/typescript/providers/StreamCall/AppStateListener.d.ts.map +1 -1
- package/dist/typescript/utils/internal/registerSDKGlobals.d.ts +2 -0
- package/dist/typescript/utils/internal/registerSDKGlobals.d.ts.map +1 -0
- package/dist/typescript/version.d.ts +1 -1
- package/ios/StreamInCallManager.m +4 -0
- package/ios/StreamInCallManager.swift +213 -88
- package/package.json +7 -7
- package/src/index.ts +2 -0
- package/src/modules/call-manager/CallManager.ts +5 -0
- package/src/modules/call-manager/native-module.d.ts +11 -0
- package/src/modules/call-manager/types.ts +1 -0
- package/src/providers/StreamCall/AppStateListener.tsx +116 -17
- package/src/utils/internal/registerSDKGlobals.ts +30 -0
- package/src/version.ts +1 -1
- package/android/src/main/java/com/streamvideo/reactnative/audio/utils/AudioSetupStoreUtil.kt +0 -41
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
|
|
4
4
|
|
|
5
|
+
## [1.28.0](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.27.4...@stream-io/video-react-native-sdk-1.28.0) (2026-01-20)
|
|
6
|
+
|
|
7
|
+
### Dependency Updates
|
|
8
|
+
|
|
9
|
+
- `@stream-io/noise-cancellation-react-native` updated to version `0.5.0`
|
|
10
|
+
- `@stream-io/video-filters-react-native` updated to version `0.10.0`
|
|
11
|
+
- `@stream-io/video-client` updated to version `1.41.0`
|
|
12
|
+
- `@stream-io/video-react-bindings` updated to version `1.13.0`
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- stereo audio output support RN-332 ([#2038](https://github.com/GetStream/stream-video-js/issues/2038)) ([2938037](https://github.com/GetStream/stream-video-js/commit/2938037d18e70ccf112a089eb3ec44cb034aed1d))
|
|
17
|
+
|
|
18
|
+
## [1.27.4](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.27.3...@stream-io/video-react-native-sdk-1.27.4) (2026-01-16)
|
|
19
|
+
|
|
20
|
+
### Dependency Updates
|
|
21
|
+
|
|
22
|
+
- `@stream-io/video-client` updated to version `1.40.3`
|
|
23
|
+
- `@stream-io/video-react-bindings` updated to version `1.12.10`
|
|
24
|
+
|
|
25
|
+
### Bug Fixes
|
|
26
|
+
|
|
27
|
+
- do not disable camera on Android unnecessarily RN-335 ([#2085](https://github.com/GetStream/stream-video-js/issues/2085)) ([e4dfa39](https://github.com/GetStream/stream-video-js/commit/e4dfa39b7a001e60fee73db01d717ed8eb05d9b0))
|
|
28
|
+
|
|
5
29
|
## [1.27.3](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.27.2...@stream-io/video-react-native-sdk-1.27.3) (2026-01-15)
|
|
6
30
|
|
|
7
31
|
### Dependency Updates
|
package/android/build.gradle
CHANGED
|
@@ -97,4 +97,5 @@ dependencies {
|
|
|
97
97
|
implementation project(':stream-io_react-native-webrtc')
|
|
98
98
|
implementation "io.github.crow-misia.libyuv:libyuv-android:0.36.0"
|
|
99
99
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
100
|
+
implementation "androidx.lifecycle:lifecycle-process:2.10.0"
|
|
100
101
|
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
package com.streamvideo.reactnative
|
|
2
|
+
|
|
3
|
+
import androidx.lifecycle.Lifecycle
|
|
4
|
+
import androidx.lifecycle.LifecycleEventObserver
|
|
5
|
+
import androidx.lifecycle.ProcessLifecycleOwner
|
|
6
|
+
import com.facebook.react.bridge.Promise
|
|
7
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
8
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
9
|
+
import com.facebook.react.bridge.ReactMethod
|
|
10
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Emits application *process* lifecycle changes using ProcessLifecycleOwner.
|
|
14
|
+
*
|
|
15
|
+
* Based on:
|
|
16
|
+
* https://developer.android.com/reference/androidx/lifecycle/ProcessLifecycleOwner
|
|
17
|
+
*
|
|
18
|
+
* Notes:
|
|
19
|
+
* - ON_CREATE is dispatched once and ON_DESTROY is never dispatched.
|
|
20
|
+
* - ON_STOP / ON_PAUSE are dispatched with a delay after the last activity stops/pauses.
|
|
21
|
+
*/
|
|
22
|
+
class StreamVideoAppLifecycleModule(reactContext: ReactApplicationContext) :
|
|
23
|
+
ReactContextBaseJavaModule(reactContext) {
|
|
24
|
+
|
|
25
|
+
override fun getName(): String = NAME
|
|
26
|
+
|
|
27
|
+
private var observer: LifecycleEventObserver? = null
|
|
28
|
+
|
|
29
|
+
override fun initialize() {
|
|
30
|
+
super.initialize()
|
|
31
|
+
|
|
32
|
+
val lifecycle = ProcessLifecycleOwner.get().lifecycle
|
|
33
|
+
val lifecycleObserver = LifecycleEventObserver { _, event ->
|
|
34
|
+
when (event) {
|
|
35
|
+
Lifecycle.Event.ON_START -> emitAppState("active")
|
|
36
|
+
Lifecycle.Event.ON_STOP -> emitAppState("background")
|
|
37
|
+
else -> Unit
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
observer = lifecycleObserver
|
|
41
|
+
reactApplicationContext.runOnUiQueueThread {
|
|
42
|
+
lifecycle.addObserver(lifecycleObserver)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
override fun invalidate() {
|
|
47
|
+
observer?.let {
|
|
48
|
+
reactApplicationContext.runOnUiQueueThread {
|
|
49
|
+
ProcessLifecycleOwner.get().lifecycle.removeObserver(it)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
observer = null
|
|
53
|
+
super.invalidate()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private fun emitAppState(appState: String) {
|
|
57
|
+
reactApplicationContext
|
|
58
|
+
.getJSModule(RCTDeviceEventEmitter::class.java)
|
|
59
|
+
.emit(APP_STATE_CHANGED_EVENT, appState)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@ReactMethod
|
|
63
|
+
fun getCurrentAppState(promise: Promise) {
|
|
64
|
+
val state = ProcessLifecycleOwner.get().lifecycle.currentState
|
|
65
|
+
val appState = if (state.isAtLeast(Lifecycle.State.STARTED)) "active" else "background"
|
|
66
|
+
promise.resolve(appState)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@Suppress("UNUSED_PARAMETER")
|
|
70
|
+
@ReactMethod
|
|
71
|
+
fun addListener(eventName: String?) {
|
|
72
|
+
// Required for RN NativeEventEmitter
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@Suppress("UNUSED_PARAMETER")
|
|
76
|
+
@ReactMethod
|
|
77
|
+
fun removeListeners(count: Int) {
|
|
78
|
+
// Required for RN NativeEventEmitter
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
companion object {
|
|
82
|
+
private const val NAME = "StreamVideoAppLifecycle"
|
|
83
|
+
private const val APP_STATE_CHANGED_EVENT = NAME + "_APP_STATE_CHANGED"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
@@ -9,7 +9,11 @@ import com.streamvideo.reactnative.callmanager.StreamInCallManagerModule
|
|
|
9
9
|
|
|
10
10
|
class StreamVideoReactNativePackage : ReactPackage {
|
|
11
11
|
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
|
|
12
|
-
return listOf(
|
|
12
|
+
return listOf(
|
|
13
|
+
StreamVideoReactNativeModule(reactContext),
|
|
14
|
+
StreamVideoAppLifecycleModule(reactContext),
|
|
15
|
+
StreamInCallManagerModule(reactContext),
|
|
16
|
+
)
|
|
13
17
|
}
|
|
14
18
|
|
|
15
19
|
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
|
|
@@ -31,7 +31,6 @@ import com.streamvideo.reactnative.audio.utils.AudioDeviceEndpointUtils
|
|
|
31
31
|
import com.streamvideo.reactnative.audio.utils.AudioFocusUtil
|
|
32
32
|
import com.streamvideo.reactnative.audio.utils.AudioManagerUtil
|
|
33
33
|
import com.streamvideo.reactnative.audio.utils.AudioManagerUtil.Companion.getAvailableAudioDevices
|
|
34
|
-
import com.streamvideo.reactnative.audio.utils.AudioSetupStoreUtil
|
|
35
34
|
import com.streamvideo.reactnative.audio.utils.CallAudioRole
|
|
36
35
|
import com.streamvideo.reactnative.callmanager.ProximityManager
|
|
37
36
|
import com.streamvideo.reactnative.callmanager.StreamInCallManagerModule
|
|
@@ -90,6 +89,8 @@ class AudioDeviceManager(
|
|
|
90
89
|
@EndpointType
|
|
91
90
|
private var userSelectedAudioDevice: Int? = null
|
|
92
91
|
|
|
92
|
+
var enableStereo: Boolean = false
|
|
93
|
+
|
|
93
94
|
private val mAudioManager =
|
|
94
95
|
mReactContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
|
|
95
96
|
|
|
@@ -99,7 +100,6 @@ class AudioDeviceManager(
|
|
|
99
100
|
private var audioFocusLost = false
|
|
100
101
|
|
|
101
102
|
private var audioFocusUtil = AudioFocusUtil(mAudioManager, this)
|
|
102
|
-
private var audioSetupStoreUtil = AudioSetupStoreUtil(mReactContext, mAudioManager, this)
|
|
103
103
|
|
|
104
104
|
var callAudioRole: CallAudioRole = CallAudioRole.Communicator
|
|
105
105
|
|
|
@@ -113,33 +113,38 @@ class AudioDeviceManager(
|
|
|
113
113
|
mAudioManager.registerAudioDeviceCallback(this, null)
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
fun setup() {
|
|
117
|
+
if (callAudioRole == CallAudioRole.Communicator) {
|
|
118
|
+
mAudioManager.mode = AudioManager.MODE_IN_COMMUNICATION
|
|
119
|
+
} else {
|
|
120
|
+
// Audio routing is handled automatically by the system in normal media mode
|
|
121
|
+
// and bluetooth microphones may not work on some devices.
|
|
122
|
+
mAudioManager.mode = AudioManager.MODE_NORMAL
|
|
123
|
+
}
|
|
124
|
+
audioFocusUtil.setup(callAudioRole, mReactContext)
|
|
125
|
+
}
|
|
126
|
+
|
|
116
127
|
fun start(activity: Activity) {
|
|
117
128
|
runInAudioThread {
|
|
129
|
+
setup()
|
|
118
130
|
userSelectedAudioDevice = null
|
|
119
131
|
selectedAudioDeviceEndpoint = null
|
|
120
|
-
audioSetupStoreUtil.storeOriginalAudioSetup()
|
|
121
132
|
if (callAudioRole == CallAudioRole.Communicator) {
|
|
122
133
|
// Audio routing is manually controlled by the SDK in communication media mode
|
|
123
134
|
// and local microphone can be published
|
|
124
|
-
mAudioManager.mode = AudioManager.MODE_IN_COMMUNICATION
|
|
125
135
|
activity.volumeControlStream = AudioManager.STREAM_VOICE_CALL
|
|
126
136
|
bluetoothManager.start()
|
|
127
137
|
mAudioManager.registerAudioDeviceCallback(this, null)
|
|
128
138
|
updateAudioDeviceState()
|
|
129
139
|
proximityManager.start()
|
|
130
140
|
} else {
|
|
131
|
-
// Audio routing is handled automatically by the system in normal media mode
|
|
132
|
-
// and bluetooth microphones may not work on some devices.
|
|
133
|
-
mAudioManager.mode = AudioManager.MODE_NORMAL
|
|
134
141
|
activity.volumeControlStream = AudioManager.USE_DEFAULT_STREAM_TYPE
|
|
135
142
|
}
|
|
136
|
-
|
|
137
|
-
audioSetupStoreUtil.storeOriginalAudioSetup()
|
|
138
143
|
audioFocusUtil.requestFocus(callAudioRole, mReactContext)
|
|
139
144
|
}
|
|
140
145
|
}
|
|
141
146
|
|
|
142
|
-
fun stop() {
|
|
147
|
+
fun stop(activity: Activity) {
|
|
143
148
|
runInAudioThread {
|
|
144
149
|
if (callAudioRole == CallAudioRole.Communicator) {
|
|
145
150
|
if (Build.VERSION.SDK_INT >= 31) {
|
|
@@ -147,10 +152,13 @@ class AudioDeviceManager(
|
|
|
147
152
|
} else {
|
|
148
153
|
mAudioManager.setSpeakerphoneOn(false)
|
|
149
154
|
}
|
|
155
|
+
callAudioRole = CallAudioRole.Communicator
|
|
156
|
+
enableStereo = false
|
|
157
|
+
defaultAudioDevice = AudioDeviceEndpoint.TYPE_SPEAKER
|
|
150
158
|
bluetoothManager.stop()
|
|
151
159
|
proximityManager.stop()
|
|
152
160
|
}
|
|
153
|
-
|
|
161
|
+
activity.volumeControlStream = AudioManager.USE_DEFAULT_STREAM_TYPE
|
|
154
162
|
audioFocusUtil.abandonFocus()
|
|
155
163
|
}
|
|
156
164
|
}
|
|
@@ -4,6 +4,7 @@ import android.media.AudioAttributes
|
|
|
4
4
|
import android.media.AudioFocusRequest
|
|
5
5
|
import android.media.AudioManager
|
|
6
6
|
import android.os.Build
|
|
7
|
+
import androidx.annotation.RequiresApi
|
|
7
8
|
import com.facebook.react.bridge.ReactContext
|
|
8
9
|
import com.oney.WebRTCModule.WebRTCModule
|
|
9
10
|
import org.webrtc.audio.JavaAudioDeviceModule
|
|
@@ -25,18 +26,31 @@ class AudioFocusUtil(
|
|
|
25
26
|
private lateinit var request: AudioFocusRequest
|
|
26
27
|
|
|
27
28
|
|
|
29
|
+
@RequiresApi(26)
|
|
30
|
+
private fun getAudioAttributes(mode: CallAudioRole): AudioAttributes {
|
|
31
|
+
return AudioAttributes.Builder()
|
|
32
|
+
.setUsage(if (mode == CallAudioRole.Communicator) AudioAttributes.USAGE_VOICE_COMMUNICATION else AudioAttributes.USAGE_MEDIA)
|
|
33
|
+
.setContentType(if (mode == CallAudioRole.Communicator) AudioAttributes.CONTENT_TYPE_SPEECH else AudioAttributes.CONTENT_TYPE_MUSIC)
|
|
34
|
+
.build()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private fun setup(audioAttributes: AudioAttributes, reactContext: ReactContext) {
|
|
38
|
+
val webRTCModule = reactContext.getNativeModule(WebRTCModule::class.java)!!
|
|
39
|
+
val adm = webRTCModule.audioDeviceModule as JavaAudioDeviceModule
|
|
40
|
+
WebRtcAudioTrackHelper.setAudioOutputAttributes(adm, audioAttributes)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
fun setup(mode: CallAudioRole, reactContext: ReactContext) {
|
|
44
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
45
|
+
val audioAttributes = getAudioAttributes(mode)
|
|
46
|
+
setup(audioAttributes, reactContext)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
28
49
|
|
|
29
50
|
fun requestFocus(mode: CallAudioRole, reactContext: ReactContext) {
|
|
30
51
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
31
|
-
val audioAttributes =
|
|
32
|
-
|
|
33
|
-
.setContentType(if (mode == CallAudioRole.Communicator) AudioAttributes.CONTENT_TYPE_SPEECH else AudioAttributes.CONTENT_TYPE_MUSIC)
|
|
34
|
-
.build()
|
|
35
|
-
|
|
36
|
-
// 1. set audio attributes to webrtc
|
|
37
|
-
val webRTCModule = reactContext.getNativeModule(WebRTCModule::class.java)!!
|
|
38
|
-
val adm = webRTCModule.audioDeviceModule as JavaAudioDeviceModule
|
|
39
|
-
WebRtcAudioTrackHelper.setAudioOutputAttributes(adm, audioAttributes)
|
|
52
|
+
val audioAttributes = getAudioAttributes(mode)
|
|
53
|
+
setup(audioAttributes, reactContext)
|
|
40
54
|
|
|
41
55
|
// 2. request the audio focus with the audio attributes
|
|
42
56
|
request = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
|
package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt
CHANGED
|
@@ -80,6 +80,24 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
@ReactMethod
|
|
84
|
+
fun setEnableStereoAudioOutput(enabled: Boolean) {
|
|
85
|
+
AudioDeviceManager.runInAudioThread {
|
|
86
|
+
if (audioManagerActivated) {
|
|
87
|
+
Log.e(TAG, "setEnableStereoAudioOutput(): AudioManager is already activated and so enabling stereo audio output cannot be changed")
|
|
88
|
+
return@runInAudioThread
|
|
89
|
+
}
|
|
90
|
+
mAudioDeviceManager.enableStereo = enabled
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@ReactMethod
|
|
95
|
+
fun setup() {
|
|
96
|
+
AudioDeviceManager.runInAudioThread {
|
|
97
|
+
mAudioDeviceManager.setup()
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
83
101
|
@ReactMethod
|
|
84
102
|
fun start() {
|
|
85
103
|
AudioDeviceManager.runInAudioThread {
|
|
@@ -99,10 +117,12 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
|
|
|
99
117
|
AudioDeviceManager.runInAudioThread {
|
|
100
118
|
if (audioManagerActivated) {
|
|
101
119
|
Log.d(TAG, "stop() mAudioDeviceManager")
|
|
102
|
-
|
|
120
|
+
reactApplicationContext.currentActivity?.let {
|
|
121
|
+
mAudioDeviceManager.stop(it)
|
|
122
|
+
audioManagerActivated = false
|
|
123
|
+
}
|
|
103
124
|
setMicrophoneMute(false)
|
|
104
125
|
setKeepScreenOn(false)
|
|
105
|
-
audioManagerActivated = false
|
|
106
126
|
}
|
|
107
127
|
}
|
|
108
128
|
}
|
|
@@ -124,11 +144,16 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
|
|
|
124
144
|
@Suppress("unused")
|
|
125
145
|
@ReactMethod
|
|
126
146
|
fun setForceSpeakerphoneOn(enable: Boolean) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
147
|
+
AudioDeviceManager.runInAudioThread {
|
|
148
|
+
if (mAudioDeviceManager.callAudioRole !== CallAudioRole.Communicator) {
|
|
149
|
+
Log.e(
|
|
150
|
+
TAG,
|
|
151
|
+
"setForceSpeakerphoneOn() is not supported when audio role is not Communicator"
|
|
152
|
+
)
|
|
153
|
+
return@runInAudioThread
|
|
154
|
+
}
|
|
155
|
+
mAudioDeviceManager.setSpeakerphoneOn(enable)
|
|
130
156
|
}
|
|
131
|
-
mAudioDeviceManager.setSpeakerphoneOn(enable)
|
|
132
157
|
}
|
|
133
158
|
|
|
134
159
|
@ReactMethod
|
|
@@ -152,23 +177,32 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
|
|
|
152
177
|
@Suppress("unused")
|
|
153
178
|
@ReactMethod
|
|
154
179
|
fun chooseAudioDeviceEndpoint(endpointDeviceName: String) {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
180
|
+
AudioDeviceManager.runInAudioThread {
|
|
181
|
+
if (mAudioDeviceManager.callAudioRole !== CallAudioRole.Communicator) {
|
|
182
|
+
Log.e(
|
|
183
|
+
TAG,
|
|
184
|
+
"chooseAudioDeviceEndpoint() is not supported when audio role is not Communicator"
|
|
185
|
+
)
|
|
186
|
+
return@runInAudioThread
|
|
187
|
+
}
|
|
188
|
+
mAudioDeviceManager.switchDeviceFromDeviceName(
|
|
189
|
+
endpointDeviceName
|
|
190
|
+
)
|
|
158
191
|
}
|
|
159
|
-
mAudioDeviceManager.switchDeviceFromDeviceName(
|
|
160
|
-
endpointDeviceName
|
|
161
|
-
)
|
|
162
192
|
}
|
|
163
193
|
|
|
164
194
|
@ReactMethod
|
|
165
195
|
fun muteAudioOutput() {
|
|
166
|
-
|
|
196
|
+
AudioDeviceManager.runInAudioThread {
|
|
197
|
+
mAudioDeviceManager.muteAudioOutput()
|
|
198
|
+
}
|
|
167
199
|
}
|
|
168
200
|
|
|
169
201
|
@ReactMethod
|
|
170
202
|
fun unmuteAudioOutput() {
|
|
171
|
-
|
|
203
|
+
AudioDeviceManager.runInAudioThread {
|
|
204
|
+
mAudioDeviceManager.unmuteAudioOutput()
|
|
205
|
+
}
|
|
172
206
|
}
|
|
173
207
|
|
|
174
208
|
|
package/dist/commonjs/index.js
CHANGED
|
@@ -26,6 +26,7 @@ require("intl-pluralrules");
|
|
|
26
26
|
var _reactNativeWebrtc = require("@stream-io/react-native-webrtc");
|
|
27
27
|
var _Logger = _interopRequireDefault(require("@stream-io/react-native-webrtc/src/Logger"));
|
|
28
28
|
var _reactNative = require("react-native");
|
|
29
|
+
var _registerSDKGlobals = require("./utils/internal/registerSDKGlobals");
|
|
29
30
|
var _videoClient = require("@stream-io/video-client");
|
|
30
31
|
Object.keys(_videoClient).forEach(function (key) {
|
|
31
32
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -160,6 +161,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
160
161
|
// Reference: https://github.com/react-native-webrtc/react-native-webrtc/blob/16cff1523da457dbcc27bb0744ee2bad3a987c41/Documentation/BasicUsage.md#registering-globals
|
|
161
162
|
if (_reactNative.Platform.OS !== 'web') {
|
|
162
163
|
(0, _reactNativeWebrtc.registerGlobals)();
|
|
164
|
+
(0, _registerSDKGlobals.registerSDKGlobals)();
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
// only enable warning and error logs from webrtc library
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_setClientDetails","require","_reactNativeWebrtc","_Logger","_interopRequireDefault","_reactNative","_videoClient","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_videoReactBindings","_components","_contexts","_hooks","_theme","_utils","_translations","_callManager","_StreamVideo","_StreamCall","_NoiseCancellation","e","__esModule","default","Platform","OS","registerGlobals","Logger","enable","ROOT_PREFIX","setClientDetails"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AAEAA,OAAA;AAEAA,OAAA;AAEAA,OAAA;AACA,IAAAC,kBAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,YAAA,GAAAJ,OAAA;
|
|
1
|
+
{"version":3,"names":["_setClientDetails","require","_reactNativeWebrtc","_Logger","_interopRequireDefault","_reactNative","_registerSDKGlobals","_videoClient","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_videoReactBindings","_components","_contexts","_hooks","_theme","_utils","_translations","_callManager","_StreamVideo","_StreamCall","_NoiseCancellation","e","__esModule","default","Platform","OS","registerGlobals","registerSDKGlobals","Logger","enable","ROOT_PREFIX","setClientDetails"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -86,6 +86,8 @@ class CallManager {
|
|
|
86
86
|
* @param config.deviceEndpointType The default audio device endpoint type to set. It can be one of the following:
|
|
87
87
|
* - `'speaker'`: (Default) For normal video or voice calls.
|
|
88
88
|
* - `'earpiece'`: For voice-only mobile call type scenarios.
|
|
89
|
+
*
|
|
90
|
+
* @param config.enableStereoAudioOutput Whether to enable stereo audio output. Only supported for listener audio role.
|
|
89
91
|
*/
|
|
90
92
|
start = config => {
|
|
91
93
|
NativeManager.setAudioRole(config?.audioRole ?? 'communicator');
|
|
@@ -93,6 +95,9 @@ class CallManager {
|
|
|
93
95
|
const type = config.deviceEndpointType ?? 'speaker';
|
|
94
96
|
NativeManager.setDefaultAudioDeviceEndpointType(type);
|
|
95
97
|
}
|
|
98
|
+
if (config?.audioRole === 'listener' && config.enableStereoAudioOutput) {
|
|
99
|
+
NativeManager.setEnableStereoAudioOutput(true);
|
|
100
|
+
}
|
|
96
101
|
NativeManager.start();
|
|
97
102
|
};
|
|
98
103
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","NativeManager","NativeModules","StreamInCallManager","invariant","condition","message","Error","AndroidCallManager","getAudioDeviceStatus","Platform","OS","selectAudioDevice","endpointName","chooseAudioDeviceEndpoint","addAudioDeviceChangeListener","onChange","eventEmitter","NativeEventEmitter","s","addListener","remove","IOSCallManager","showDeviceSelector","showAudioRoutePicker","SpeakerManager","setMute","mute","muteAudioOutput","unmuteAudioOutput","setForceSpeakerphoneOn","force","CallManager","android","ios","speaker","start","config","setAudioRole","audioRole","type","deviceEndpointType","setDefaultAudioDeviceEndpointType","stop","logAudioState","exports"],"sourceRoot":"../../../../src","sources":["modules/call-manager/CallManager.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAGA,MAAMC,aAAa,GAAGC,0BAAa,CAACC,mBAAmB;AAEvD,MAAMC,SAAS,GAAGA,CAACC,SAAkB,EAAEC,OAAe,KAAK;EACzD,IAAI,CAACD,SAAS,EAAE,MAAM,IAAIE,KAAK,CAACD,OAAO,CAAC;AAC1C,CAAC;AAED,MAAME,kBAAkB,CAAC;EAGvB;AACF;AACA;EACEC,oBAAoB,GAAG,MAAAA,CAAA,KAAwC;IAC7DL,SAAS,CAACM,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE,2BAA2B,CAAC;IACjE,OAAOV,aAAa,CAACQ,oBAAoB,CAAC,CAAC;EAC7C,CAAC;;EAED;AACF;AACA;AACA;AACA;EACEG,iBAAiB,GAAIC,YAAoB,IAAW;IAClDT,SAAS,CAACM,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE,2BAA2B,CAAC;IACjEV,aAAa,CAACa,yBAAyB,CAACD,YAAY,CAAC;EACvD,CAAC;;EAED;AACF;AACA;AACA;EACEE,4BAA4B,GAC1BC,QAAwD,IACvC;IACjBZ,SAAS,CAACM,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE,2BAA2B,CAAC;IACjE,IAAI,CAACM,YAAY,KAAK,IAAIC,+BAAkB,CAACjB,aAAa,CAAC;IAC3D,MAAMkB,CAAC,GAAG,IAAI,CAACF,YAAY,CAACG,WAAW,CAAC,sBAAsB,EAAEJ,QAAQ,CAAC;IACzE,OAAO,MAAMG,CAAC,CAACE,MAAM,CAAC,CAAC;EACzB,CAAC;AACH;AAEA,MAAMC,cAAc,CAAC;EACnB;AACF;AACA;EACEC,kBAAkB,GAAGA,CAAA,KAAY;IAC/BnB,SAAS,CAACM,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE,uBAAuB,CAAC;IACzDV,aAAa,CAACuB,oBAAoB,CAAC,CAAC;EACtC,CAAC;AACH;AAEA,MAAMC,cAAc,CAAC;EACnB;AACF;AACA;EACEC,OAAO,GAAIC,IAAa,IAAW;IACjC,IAAIA,IAAI,EAAE;MACR1B,aAAa,CAAC2B,eAAe,CAAC,CAAC;IACjC,CAAC,MAAM;MACL3B,aAAa,CAAC4B,iBAAiB,CAAC,CAAC;IACnC;EACF,CAAC;;EAED;AACF;AACA;EACEC,sBAAsB,GAAIC,KAAc,IAAW;IACjD9B,aAAa,CAAC6B,sBAAsB,CAACC,KAAK,CAAC;EAC7C,CAAC;AACH;AAEO,MAAMC,WAAW,CAAC;EACvBC,OAAO,GAAG,IAAIzB,kBAAkB,CAAC,CAAC;EAClC0B,GAAG,GAAG,IAAIZ,cAAc,CAAC,CAAC;EAC1Ba,OAAO,GAAG,IAAIV,cAAc,CAAC,CAAC;;EAE9B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEW,KAAK,GAAIC,MAAkC,IAAW;IACpDpC,aAAa,CAACqC,YAAY,CAACD,MAAM,EAAEE,SAAS,IAAI,cAAc,CAAC;IAC/D,IAAIF,MAAM,EAAEE,SAAS,KAAK,cAAc,EAAE;MACxC,MAAMC,IAAI,GAAGH,MAAM,CAACI,kBAAkB,IAAI,SAAS;MACnDxC,aAAa,CAACyC,iCAAiC,CAACF,IAAI,CAAC;IACvD;
|
|
1
|
+
{"version":3,"names":["_reactNative","require","NativeManager","NativeModules","StreamInCallManager","invariant","condition","message","Error","AndroidCallManager","getAudioDeviceStatus","Platform","OS","selectAudioDevice","endpointName","chooseAudioDeviceEndpoint","addAudioDeviceChangeListener","onChange","eventEmitter","NativeEventEmitter","s","addListener","remove","IOSCallManager","showDeviceSelector","showAudioRoutePicker","SpeakerManager","setMute","mute","muteAudioOutput","unmuteAudioOutput","setForceSpeakerphoneOn","force","CallManager","android","ios","speaker","start","config","setAudioRole","audioRole","type","deviceEndpointType","setDefaultAudioDeviceEndpointType","enableStereoAudioOutput","setEnableStereoAudioOutput","stop","logAudioState","exports"],"sourceRoot":"../../../../src","sources":["modules/call-manager/CallManager.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -11,6 +11,7 @@ var _shouldDisableIOSLocalVideoOnBackground = require("../../utils/internal/shou
|
|
|
11
11
|
var _rxSubjects = require("../../utils/internal/rxSubjects");
|
|
12
12
|
var _videoClient = require("@stream-io/video-client");
|
|
13
13
|
const PIP_CHANGE_EVENT = 'StreamVideoReactNative_PIP_CHANGE_EVENT';
|
|
14
|
+
const ANDROID_APP_STATE_CHANGED_EVENT = 'StreamVideoAppLifecycle_APP_STATE_CHANGED';
|
|
14
15
|
const isAndroid8OrAbove = _reactNative.Platform.OS === 'android' && _reactNative.Platform.Version >= 26;
|
|
15
16
|
|
|
16
17
|
// Does 2 functionalities:
|
|
@@ -44,34 +45,55 @@ const AppStateListener = () => {
|
|
|
44
45
|
};
|
|
45
46
|
}, []);
|
|
46
47
|
(0, _react.useEffect)(() => {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
const logger = _videoClient.videoLoggerSystem.getLogger('AppStateListener');
|
|
49
|
+
const handleAppStateChange = nextAppState => {
|
|
50
|
+
logger.debug('AppState changed to ', nextAppState, ' from ', appState.current);
|
|
51
|
+
|
|
52
|
+
// due to strange behavior in iOS when app goes to "inactive" state
|
|
53
|
+
// we dont check for inactive states
|
|
54
|
+
// ref: https://www.reddit.com/r/reactnative/comments/15kib42/appstate_behavior_in_ios_when_swiping_down_to/
|
|
52
55
|
if (appState.current.match(/background/) && nextAppState === 'active') {
|
|
53
56
|
if (call?.camera?.state.status === 'enabled') {
|
|
57
|
+
logger.debug('attempt to Disable and reenable camera as app came to foreground');
|
|
54
58
|
// Android: when device is locked and resumed, the status isnt made disabled but stays enabled
|
|
55
59
|
// iOS PiP: when local track was replaced by remote track, the local track shown is blank
|
|
56
60
|
// as a workaround we stop the track and enable again if its already in enabled state
|
|
57
|
-
|
|
58
|
-
call?.camera
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
const renableCamera = () => {
|
|
62
|
+
const camera = call?.camera;
|
|
63
|
+
if (!camera) return Promise.resolve();
|
|
64
|
+
return camera.disable(true).then(() => camera.enable()).catch(e => {
|
|
65
|
+
logger.warn('Failed to disable+reenable camera as app came to foreground', e);
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
if (_reactNative.Platform.OS === 'android') {
|
|
69
|
+
_reactNative.NativeModules.StreamVideoReactNative.isCallAliveConfigured().then(isCallAliveConfigured => {
|
|
70
|
+
if (!isCallAliveConfigured) {
|
|
71
|
+
renableCamera();
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
} else {
|
|
75
|
+
renableCamera();
|
|
76
|
+
}
|
|
61
77
|
} else {
|
|
62
78
|
if (cameraDisabledByAppState.current) {
|
|
63
|
-
call?.camera?.resume()
|
|
64
|
-
|
|
65
|
-
|
|
79
|
+
call?.camera?.resume().then(() => {
|
|
80
|
+
cameraDisabledByAppState.current = false;
|
|
81
|
+
logger.debug('Camera resumed as app came to foreground');
|
|
82
|
+
}).catch(e => {
|
|
83
|
+
logger.warn('Failed to resume camera as app came to foreground', e);
|
|
84
|
+
});
|
|
66
85
|
}
|
|
67
86
|
}
|
|
68
87
|
appState.current = nextAppState;
|
|
69
88
|
} else if (appState.current === 'active' && nextAppState.match(/background/)) {
|
|
70
89
|
const disableCameraIfNeeded = () => {
|
|
71
90
|
if (call?.camera?.state.status === 'enabled') {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
91
|
+
call?.camera?.disable().then(() => {
|
|
92
|
+
cameraDisabledByAppState.current = true;
|
|
93
|
+
logger.debug('Camera disabled by app going to background');
|
|
94
|
+
}).catch(e => {
|
|
95
|
+
logger.warn('Failed to disable camera as app went to background', e);
|
|
96
|
+
});
|
|
75
97
|
}
|
|
76
98
|
};
|
|
77
99
|
if (_reactNative.Platform.OS === 'android') {
|
|
@@ -91,7 +113,13 @@ const AppStateListener = () => {
|
|
|
91
113
|
// this happens on foreground push notifications
|
|
92
114
|
return;
|
|
93
115
|
}
|
|
94
|
-
|
|
116
|
+
// check if keep call alive is configured
|
|
117
|
+
// if not, then disable the camera as we are not able to keep the call alive in the background
|
|
118
|
+
_reactNative.NativeModules.StreamVideoReactNative.isCallAliveConfigured().then(isCallAliveConfigured => {
|
|
119
|
+
if (!isCallAliveConfigured) {
|
|
120
|
+
disableCameraIfNeeded();
|
|
121
|
+
}
|
|
122
|
+
});
|
|
95
123
|
}
|
|
96
124
|
});
|
|
97
125
|
} else {
|
|
@@ -105,6 +133,36 @@ const AppStateListener = () => {
|
|
|
105
133
|
}
|
|
106
134
|
appState.current = nextAppState;
|
|
107
135
|
}
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
// for Android use our custom native module to listen to app state changes
|
|
139
|
+
// because the default react-native AppState listener works for activity and ours works for application process
|
|
140
|
+
if (_reactNative.Platform.OS === 'android') {
|
|
141
|
+
const nativeModule = _reactNative.NativeModules.StreamVideoAppLifecycle;
|
|
142
|
+
const eventEmitter = new _reactNative.NativeEventEmitter(nativeModule);
|
|
143
|
+
let cancelled = false;
|
|
144
|
+
nativeModule.getCurrentAppState().then(initialState => {
|
|
145
|
+
if (cancelled) return;
|
|
146
|
+
if (initialState === 'active' || initialState === 'background') {
|
|
147
|
+
appState.current = initialState;
|
|
148
|
+
}
|
|
149
|
+
}).catch(() => {
|
|
150
|
+
logger.warn('Failed to get current app state from native module');
|
|
151
|
+
});
|
|
152
|
+
const subscription = eventEmitter.addListener(ANDROID_APP_STATE_CHANGED_EVENT, nextAppState => {
|
|
153
|
+
if (nextAppState === 'active' || nextAppState === 'background') {
|
|
154
|
+
handleAppStateChange(nextAppState);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
return () => {
|
|
158
|
+
cancelled = true;
|
|
159
|
+
subscription.remove();
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// for iOS use the default react-native AppState listener
|
|
164
|
+
const subscription = _reactNative.AppState.addEventListener('change', nextAppState => {
|
|
165
|
+
handleAppStateChange(nextAppState);
|
|
108
166
|
});
|
|
109
167
|
return () => {
|
|
110
168
|
subscription.remove();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_videoReactBindings","require","_react","_reactNative","_shouldDisableIOSLocalVideoOnBackground","_rxSubjects","_videoClient","PIP_CHANGE_EVENT","isAndroid8OrAbove","Platform","OS","Version","AppStateListener","call","useCall","appState","useRef","AppState","currentState","cameraDisabledByAppState","useEffect","disablePiP","RxUtils","getCurrentValue","disablePiPMode$","logger","videoLoggerSystem","getLogger","initialPipMode","isInPiPMode$","next","debug","NativeModules","StreamVideoReactNative","isInPiPMode","then","isInPiP","eventEmitter","NativeEventEmitter","subscriptionPiPChange","addListener","remove","
|
|
1
|
+
{"version":3,"names":["_videoReactBindings","require","_react","_reactNative","_shouldDisableIOSLocalVideoOnBackground","_rxSubjects","_videoClient","PIP_CHANGE_EVENT","ANDROID_APP_STATE_CHANGED_EVENT","isAndroid8OrAbove","Platform","OS","Version","AppStateListener","call","useCall","appState","useRef","AppState","currentState","cameraDisabledByAppState","useEffect","disablePiP","RxUtils","getCurrentValue","disablePiPMode$","logger","videoLoggerSystem","getLogger","initialPipMode","isInPiPMode$","next","debug","NativeModules","StreamVideoReactNative","isInPiPMode","then","isInPiP","eventEmitter","NativeEventEmitter","subscriptionPiPChange","addListener","remove","handleAppStateChange","nextAppState","current","match","camera","state","status","renableCamera","Promise","resolve","disable","enable","catch","e","warn","isCallAliveConfigured","resume","disableCameraIfNeeded","shouldDisableIOSLocalVideoOnBackgroundRef","nativeModule","StreamVideoAppLifecycle","cancelled","getCurrentAppState","initialState","subscription","addEventListener","exports"],"sourceRoot":"../../../../src","sources":["providers/StreamCall/AppStateListener.tsx"],"mappings":"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","ignoreList":[]}
|