@stream-io/video-react-native-sdk 1.22.3 → 1.23.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.
Files changed (36) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/android/src/main/java/com/streamvideo/reactnative/callmanager/ProximityManager.kt +183 -0
  3. package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt +12 -1
  4. package/dist/commonjs/components/Participant/FloatingParticipantView/index.js +13 -6
  5. package/dist/commonjs/components/Participant/FloatingParticipantView/index.js.map +1 -1
  6. package/dist/commonjs/components/Participant/FloatingParticipantView/useFloatingVideoDimensions.js +30 -0
  7. package/dist/commonjs/components/Participant/FloatingParticipantView/useFloatingVideoDimensions.js.map +1 -0
  8. package/dist/commonjs/constants/index.js +1 -6
  9. package/dist/commonjs/constants/index.js.map +1 -1
  10. package/dist/commonjs/hooks/useTrackDimensions.js +1 -1
  11. package/dist/commonjs/hooks/useTrackDimensions.js.map +1 -1
  12. package/dist/commonjs/version.js +1 -1
  13. package/dist/module/components/Participant/FloatingParticipantView/index.js +14 -7
  14. package/dist/module/components/Participant/FloatingParticipantView/index.js.map +1 -1
  15. package/dist/module/components/Participant/FloatingParticipantView/useFloatingVideoDimensions.js +23 -0
  16. package/dist/module/components/Participant/FloatingParticipantView/useFloatingVideoDimensions.js.map +1 -0
  17. package/dist/module/constants/index.js +0 -5
  18. package/dist/module/constants/index.js.map +1 -1
  19. package/dist/module/hooks/useTrackDimensions.js +1 -1
  20. package/dist/module/hooks/useTrackDimensions.js.map +1 -1
  21. package/dist/module/version.js +1 -1
  22. package/dist/typescript/components/Participant/FloatingParticipantView/index.d.ts.map +1 -1
  23. package/dist/typescript/components/Participant/FloatingParticipantView/useFloatingVideoDimensions.d.ts +9 -0
  24. package/dist/typescript/components/Participant/FloatingParticipantView/useFloatingVideoDimensions.d.ts.map +1 -0
  25. package/dist/typescript/constants/index.d.ts +0 -5
  26. package/dist/typescript/constants/index.d.ts.map +1 -1
  27. package/dist/typescript/hooks/useTrackDimensions.d.ts +1 -1
  28. package/dist/typescript/hooks/useTrackDimensions.d.ts.map +1 -1
  29. package/dist/typescript/version.d.ts +1 -1
  30. package/ios/StreamInCallManager.swift +105 -38
  31. package/package.json +3 -3
  32. package/src/components/Participant/FloatingParticipantView/index.tsx +20 -6
  33. package/src/components/Participant/FloatingParticipantView/useFloatingVideoDimensions.tsx +36 -0
  34. package/src/constants/index.ts +0 -6
  35. package/src/hooks/useTrackDimensions.ts +2 -2
  36. package/src/version.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [1.23.0](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.22.3...@stream-io/video-react-native-sdk-1.23.0) (2025-10-27)
6
+
7
+ ### Dependency Updates
8
+
9
+ - `@stream-io/video-client` updated to version `1.35.1`
10
+ - `@stream-io/video-react-bindings` updated to version `1.10.3`
11
+
12
+ ### Features
13
+
14
+ - adaptive floating video dimensions ([#1969](https://github.com/GetStream/stream-video-js/issues/1969)) ([5a213d2](https://github.com/GetStream/stream-video-js/commit/5a213d2571610846bdcd9b4554a5a8d1a3def6c4))
15
+
16
+ ### Bug Fixes
17
+
18
+ - **react-native:** restore screen wake lock and proximity sensing ([#1971](https://github.com/GetStream/stream-video-js/issues/1971)) ([f20ef70](https://github.com/GetStream/stream-video-js/commit/f20ef70a5958fddf52075233f9f3d64a2ce01895)), closes [#1840](https://github.com/GetStream/stream-video-js/issues/1840)
19
+
5
20
  ## [1.22.3](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.22.2...@stream-io/video-react-native-sdk-1.22.3) (2025-10-24)
6
21
 
7
22
  ### Dependency Updates
@@ -0,0 +1,183 @@
1
+ package com.streamvideo.reactnative.callmanager
2
+
3
+ import android.content.Context
4
+ import android.hardware.Sensor
5
+ import android.hardware.SensorEventListener
6
+ import android.hardware.SensorManager
7
+ import android.media.AudioDeviceInfo
8
+ import android.media.AudioManager
9
+ import android.os.PowerManager
10
+ import android.util.Log
11
+
12
+ /**
13
+ * Encapsulates Android proximity sensor handling for in-call UX.
14
+ *
15
+ * Responsibilities:
16
+ * - Initialize proximity sensor + PowerManager wake lock lazily
17
+ * - Register/unregister sensor listener
18
+ * - Acquire/release PROXIMITY_SCREEN_OFF_WAKE_LOCK when near/away
19
+ * - Provide a simple API: start(), stop(), update()
20
+ */
21
+ class ProximityManager(
22
+ private val context: Context,
23
+ ) {
24
+
25
+ companion object {
26
+ const val TAG = "ProximityManager"
27
+ }
28
+
29
+ private var sensorManager: SensorManager? = null
30
+ private var proximitySensor: Sensor? = null
31
+ private var proximityListener: SensorEventListener? = null
32
+
33
+ private var powerManager: PowerManager? = null
34
+ private var proximityWakeLock: PowerManager.WakeLock? = null
35
+
36
+ private var proximityRegistered = false
37
+ private var initialized = false
38
+
39
+ fun start() {
40
+ this.update()
41
+ }
42
+
43
+ fun stop() {
44
+ // Unregister listener and release wakelock
45
+ disableProximity()
46
+ }
47
+
48
+ fun onDestroy() {
49
+ stop()
50
+ }
51
+
52
+ /**
53
+ * Toggle monitoring state based on higher-level decision.
54
+ */
55
+ fun update() {
56
+ if (!initialized) init()
57
+ if (isOnEarpiece()) enableProximity() else disableProximity()
58
+ }
59
+
60
+ private fun init() {
61
+ if (initialized) return
62
+ try {
63
+ sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
64
+ proximitySensor = sensorManager?.getDefaultSensor(Sensor.TYPE_PROXIMITY)
65
+ } catch (t: Throwable) {
66
+ Log.w(TAG, "Proximity sensor init failed", t)
67
+ }
68
+ try {
69
+ powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
70
+ // Obtain PROXIMITY_SCREEN_OFF_WAKE_LOCK via reflection to avoid compile-time dependency
71
+ val field = PowerManager::class.java.getField("PROXIMITY_SCREEN_OFF_WAKE_LOCK")
72
+ val level = field.getInt(null)
73
+ proximityWakeLock = powerManager?.newWakeLock(level, "$TAG:Proximity")
74
+ } catch (t: Throwable) {
75
+ Log.w(TAG, "Proximity wakelock init failed (may be unsupported on this device)", t)
76
+ proximityWakeLock = null
77
+ }
78
+ initialized = true
79
+ }
80
+
81
+ private fun enableProximity() {
82
+ val sensor = proximitySensor
83
+ if (sensor == null) {
84
+ Log.d(TAG, "No proximity sensor available; skipping enable")
85
+ return
86
+ }
87
+ if (proximityRegistered) return
88
+ if (proximityListener == null) {
89
+ proximityListener = object : SensorEventListener {
90
+ override fun onSensorChanged(event: android.hardware.SensorEvent) {
91
+ val max = sensor.maximumRange
92
+ val value = event.values.firstOrNull() ?: max
93
+ val near = value < max
94
+ onProximityChanged(near)
95
+ }
96
+
97
+ override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {}
98
+ }
99
+ }
100
+ try {
101
+ sensorManager?.registerListener(
102
+ proximityListener,
103
+ sensor,
104
+ SensorManager.SENSOR_DELAY_NORMAL
105
+ )
106
+ proximityRegistered = true
107
+ Log.d(TAG, "Proximity monitoring ENABLED")
108
+ } catch (t: Throwable) {
109
+ Log.w(TAG, "Failed to register proximity listener", t)
110
+ }
111
+ }
112
+
113
+ private fun disableProximity() {
114
+ if (proximityRegistered && proximityListener != null) {
115
+ try {
116
+ sensorManager?.unregisterListener(proximityListener)
117
+ } catch (t: Throwable) {
118
+ Log.w(TAG, "Failed to unregister proximity listener", t)
119
+ }
120
+ }
121
+ proximityRegistered = false
122
+ releaseProximityWakeLock()
123
+ Log.d(TAG, "Proximity monitoring DISABLED")
124
+ }
125
+
126
+ private fun onProximityChanged(near: Boolean) {
127
+ if (near) {
128
+ acquireProximityWakeLock()
129
+ } else {
130
+ releaseProximityWakeLock()
131
+ }
132
+ }
133
+
134
+ private fun acquireProximityWakeLock() {
135
+ try {
136
+ val wl = proximityWakeLock
137
+ if (wl != null && !wl.isHeld) {
138
+ wl.acquire()
139
+ Log.d(TAG, "Proximity wakelock ACQUIRED (screen off near ear)")
140
+ }
141
+ } catch (t: Throwable) {
142
+ Log.w(TAG, "Failed to acquire proximity wakelock", t)
143
+ }
144
+ }
145
+
146
+ private fun releaseProximityWakeLock() {
147
+ try {
148
+ val wl = proximityWakeLock
149
+ if (wl != null && wl.isHeld) {
150
+ wl.release()
151
+ Log.d(TAG, "Proximity wakelock RELEASED (screen on)")
152
+ }
153
+ } catch (t: Throwable) {
154
+ Log.w(TAG, "Failed to release proximity wakelock", t)
155
+ }
156
+ }
157
+
158
+ private fun isOnEarpiece(): Boolean {
159
+ val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
160
+ // If speakerphone is on, not earpiece
161
+ if (audioManager.isSpeakerphoneOn) return false
162
+
163
+ // Check if Bluetooth SCO/A2DP or wired headset is connected
164
+ var hasBt = false
165
+ var hasWired = false
166
+ val outputs = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
167
+ outputs.forEach { dev ->
168
+ val type = dev.type
169
+ if (type == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP ||
170
+ type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO
171
+ ) {
172
+ hasBt = true
173
+ } else if (type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES
174
+ || type == AudioDeviceInfo.TYPE_WIRED_HEADSET
175
+ || type == AudioDeviceInfo.TYPE_USB_HEADSET
176
+ ) {
177
+ hasWired = true
178
+ }
179
+ }
180
+
181
+ return !hasBt && !hasWired
182
+ }
183
+ }
@@ -20,7 +20,7 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
20
20
  private var audioManagerActivated = false
21
21
 
22
22
  private val mAudioDeviceManager = AudioDeviceManager(reactContext)
23
-
23
+ private val proximityManager = ProximityManager(reactContext)
24
24
 
25
25
  override fun getName(): String {
26
26
  return TAG
@@ -40,6 +40,8 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
40
40
  }
41
41
 
42
42
  override fun invalidate() {
43
+ // Ensure we cleanup proximity and screen flags too
44
+ stop()
43
45
  mAudioDeviceManager.close()
44
46
  super.invalidate()
45
47
  }
@@ -87,6 +89,8 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
87
89
  mAudioDeviceManager.start(it)
88
90
  setKeepScreenOn(true)
89
91
  audioManagerActivated = true
92
+ // Initialize and evaluate proximity monitoring via controller
93
+ proximityManager.start()
90
94
  }
91
95
  }
92
96
  }
@@ -99,6 +103,8 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
99
103
  Log.d(TAG, "stop() mAudioDeviceManager")
100
104
  mAudioDeviceManager.stop()
101
105
  setMicrophoneMute(false)
106
+ // Disable proximity monitoring via controller and clear keep-screen-on
107
+ proximityManager.stop()
102
108
  setKeepScreenOn(false)
103
109
  audioManagerActivated = false
104
110
  }
@@ -127,6 +133,8 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
127
133
  return
128
134
  }
129
135
  mAudioDeviceManager.setSpeakerphoneOn(enable)
136
+ // Re-evaluate proximity monitoring when route may change
137
+ this.proximityManager.update()
130
138
  }
131
139
 
132
140
  @ReactMethod
@@ -152,6 +160,8 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
152
160
  mAudioDeviceManager.switchDeviceFromDeviceName(
153
161
  endpointDeviceName
154
162
  )
163
+ // Re-evaluate proximity monitoring when endpoint changes
164
+ this.proximityManager.update()
155
165
  }
156
166
 
157
167
  @ReactMethod
@@ -164,6 +174,7 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
164
174
  mAudioDeviceManager.unmuteAudioOutput()
165
175
  }
166
176
 
177
+
167
178
  override fun onHostResume() {
168
179
  }
169
180
 
@@ -13,6 +13,7 @@ var _FloatingView = _interopRequireDefault(require("./FloatingView"));
13
13
  var _common = require("./FloatingView/common");
14
14
  var _ParticipantView = require("../ParticipantView");
15
15
  var _ThemeContext = require("../../../contexts/ThemeContext");
16
+ var _useFloatingVideoDimensions = require("./useFloatingVideoDimensions");
16
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
18
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
18
19
  /**
@@ -66,7 +67,10 @@ const FloatingParticipantView = ({
66
67
  const {
67
68
  theme: {
68
69
  colors,
69
- floatingParticipantsView
70
+ floatingParticipantsView,
71
+ variants: {
72
+ spacingSizes
73
+ }
70
74
  }
71
75
  } = (0, _ThemeContext.useTheme)();
72
76
  const floatingAlignmentMap = {
@@ -76,6 +80,7 @@ const FloatingParticipantView = ({
76
80
  'bottom-right': _common.FloatingViewAlignment.bottomRight
77
81
  };
78
82
  const [containerDimensions, setContainerDimensions] = _react.default.useState();
83
+ const floatingVideoDimensions = (0, _useFloatingVideoDimensions.useFloatingVideoDimensions)(containerDimensions, participant, 'videoTrack');
79
84
  const participantViewProps = {
80
85
  ParticipantLabel: null,
81
86
  ParticipantNetworkQualityIndicator,
@@ -108,7 +113,7 @@ const FloatingParticipantView = ({
108
113
  };
109
114
  });
110
115
  }
111
- }, containerDimensions && /*#__PURE__*/_react.default.createElement(_FloatingView.default, {
116
+ }, containerDimensions && floatingVideoDimensions && /*#__PURE__*/_react.default.createElement(_FloatingView.default, {
112
117
  containerHeight: containerDimensions.height,
113
118
  containerWidth: containerDimensions.width,
114
119
  initialAlignment: floatingAlignmentMap[alignment]
@@ -117,7 +122,12 @@ const FloatingParticipantView = ({
117
122
  }, ParticipantView && /*#__PURE__*/_react.default.createElement(ParticipantView, _extends({
118
123
  participant: participant,
119
124
  trackType: "videoTrack",
120
- style: [styles.participantViewContainer, participantViewStyle, {
125
+ style: [styles.participantViewContainer, {
126
+ width: floatingVideoDimensions.width,
127
+ height: floatingVideoDimensions.height,
128
+ borderRadius: floatingVideoDimensions.width * 0.1,
129
+ marginHorizontal: spacingSizes.md
130
+ }, participantViewStyle, {
121
131
  shadowColor: colors.sheetPrimary
122
132
  }, floatingParticipantsView.participantViewContainer]
123
133
  // video z order must be one above the one used in grid view
@@ -136,9 +146,6 @@ const styles = _reactNative.StyleSheet.create({
136
146
  flex: 1
137
147
  },
138
148
  participantViewContainer: {
139
- height: _constants.FLOATING_VIDEO_VIEW_STYLE.height,
140
- width: _constants.FLOATING_VIDEO_VIEW_STYLE.width,
141
- borderRadius: _constants.FLOATING_VIDEO_VIEW_STYLE.borderRadius,
142
149
  shadowOffset: {
143
150
  width: 0,
144
151
  height: 2
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_constants","_TestIds","_icons","_FloatingView","_common","_ParticipantView","_ThemeContext","e","__esModule","default","_extends","Object","assign","bind","n","arguments","length","t","r","hasOwnProperty","call","apply","DefaultLocalParticipantViewVideoFallback","theme","colors","floatingParticipantsView","variants","iconSizes","defaults","useTheme","createElement","View","style","styles","videoFallback","backgroundColor","sheetSecondary","height","md","width","VideoSlash","color","iconPrimary","size","iconSize","FloatingParticipantView","alignment","onPressHandler","participant","participantViewStyle","draggableContainerStyle","ParticipantView","DefaultParticipantView","ParticipantNetworkQualityIndicator","ParticipantVideoFallback","ParticipantReaction","VideoRenderer","supportedReactions","videoZOrder","objectFit","floatingAlignmentMap","FloatingViewAlignment","topLeft","topRight","bottomLeft","bottomRight","containerDimensions","setContainerDimensions","React","useState","participantViewProps","ParticipantLabel","testID","ComponentTestIds","LOCAL_PARTICIPANT","container","pointerEvents","onLayout","event","nativeEvent","layout","prev","containerHeight","containerWidth","initialAlignment","Pressable","onPress","trackType","participantViewContainer","shadowColor","sheetPrimary","exports","StyleSheet","create","zIndex","Z_INDEX","IN_MIDDLE","flex","FLOATING_VIDEO_VIEW_STYLE","borderRadius","shadowOffset","shadowOpacity","shadowRadius","elevation","absoluteFillObject","alignItems","justifyContent"],"sourceRoot":"../../../../../src","sources":["components/Participant/FloatingParticipantView/index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_constants","_TestIds","_icons","_FloatingView","_common","_ParticipantView","_ThemeContext","_useFloatingVideoDimensions","e","__esModule","default","_extends","Object","assign","bind","n","arguments","length","t","r","hasOwnProperty","call","apply","DefaultLocalParticipantViewVideoFallback","theme","colors","floatingParticipantsView","variants","iconSizes","defaults","useTheme","createElement","View","style","styles","videoFallback","backgroundColor","sheetSecondary","height","md","width","VideoSlash","color","iconPrimary","size","iconSize","FloatingParticipantView","alignment","onPressHandler","participant","participantViewStyle","draggableContainerStyle","ParticipantView","DefaultParticipantView","ParticipantNetworkQualityIndicator","ParticipantVideoFallback","ParticipantReaction","VideoRenderer","supportedReactions","videoZOrder","objectFit","spacingSizes","floatingAlignmentMap","FloatingViewAlignment","topLeft","topRight","bottomLeft","bottomRight","containerDimensions","setContainerDimensions","React","useState","floatingVideoDimensions","useFloatingVideoDimensions","participantViewProps","ParticipantLabel","testID","ComponentTestIds","LOCAL_PARTICIPANT","container","pointerEvents","onLayout","event","nativeEvent","layout","prev","containerHeight","containerWidth","initialAlignment","Pressable","onPress","trackType","participantViewContainer","borderRadius","marginHorizontal","shadowColor","sheetPrimary","exports","StyleSheet","create","zIndex","Z_INDEX","IN_MIDDLE","flex","shadowOffset","shadowOpacity","shadowRadius","elevation","absoluteFillObject","alignItems","justifyContent"],"sourceRoot":"../../../../../src","sources":["components/Participant/FloatingParticipantView/index.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useFloatingVideoDimensions = void 0;
7
+ var _useTrackDimensions = require("../../../hooks/useTrackDimensions");
8
+ const useFloatingVideoDimensions = (containerDimensions, participant, trackType) => {
9
+ const containerWidth = containerDimensions?.width ?? 0;
10
+ const {
11
+ width,
12
+ height
13
+ } = (0, _useTrackDimensions.useTrackDimensions)(participant, trackType);
14
+ if (width === 0 || height === 0 || containerWidth === 0) {
15
+ return undefined;
16
+ }
17
+ const aspectRatio = width / height;
18
+
19
+ // based on Android AOSP PiP mode default dimensions algorithm
20
+ // 23% of the container width
21
+ const floatingVideoWidth = containerWidth * 0.23;
22
+ // the height is calculated based on the aspect ratio
23
+ const floatingVideoHeight = floatingVideoWidth / aspectRatio;
24
+ return {
25
+ width: floatingVideoWidth,
26
+ height: floatingVideoHeight
27
+ };
28
+ };
29
+ exports.useFloatingVideoDimensions = useFloatingVideoDimensions;
30
+ //# sourceMappingURL=useFloatingVideoDimensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_useTrackDimensions","require","useFloatingVideoDimensions","containerDimensions","participant","trackType","containerWidth","width","height","useTrackDimensions","undefined","aspectRatio","floatingVideoWidth","floatingVideoHeight","exports"],"sourceRoot":"../../../../../src","sources":["components/Participant/FloatingParticipantView/useFloatingVideoDimensions.tsx"],"mappings":";;;;;;AAIA,IAAAA,mBAAA,GAAAC,OAAA;AAEO,MAAMC,0BAA0B,GAAGA,CACxCC,mBAKa,EACbC,WAA+C,EAC/CC,SAAyB,KACtB;EACH,MAAMC,cAAc,GAAGH,mBAAmB,EAAEI,KAAK,IAAI,CAAC;EACtD,MAAM;IAAEA,KAAK;IAAEC;EAAO,CAAC,GAAG,IAAAC,sCAAkB,EAACL,WAAW,EAAEC,SAAS,CAAC;EAEpE,IAAIE,KAAK,KAAK,CAAC,IAAIC,MAAM,KAAK,CAAC,IAAIF,cAAc,KAAK,CAAC,EAAE;IACvD,OAAOI,SAAS;EAClB;EAEA,MAAMC,WAAW,GAAGJ,KAAK,GAAGC,MAAM;;EAElC;EACA;EACA,MAAMI,kBAAkB,GAAGN,cAAc,GAAG,IAAI;EAChD;EACA,MAAMO,mBAAmB,GAAGD,kBAAkB,GAAGD,WAAW;EAE5D,OAAO;IACLJ,KAAK,EAAEK,kBAAkB;IACzBJ,MAAM,EAAEK;EACV,CAAC;AACH,CAAC;AAACC,OAAA,CAAAZ,0BAAA,GAAAA,0BAAA","ignoreList":[]}
@@ -3,12 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.defaultEmojiReactions = exports.Z_INDEX = exports.FLOATING_VIDEO_VIEW_STYLE = void 0;
7
- const FLOATING_VIDEO_VIEW_STYLE = exports.FLOATING_VIDEO_VIEW_STYLE = {
8
- height: 140,
9
- width: 80,
10
- borderRadius: 10
11
- };
6
+ exports.defaultEmojiReactions = exports.Z_INDEX = void 0;
12
7
  const defaultEmojiReactions = exports.defaultEmojiReactions = [{
13
8
  type: 'reaction',
14
9
  emoji_code: ':rolling_on_the_floor_laughing:',
@@ -1 +1 @@
1
- {"version":3,"names":["FLOATING_VIDEO_VIEW_STYLE","exports","height","width","borderRadius","defaultEmojiReactions","type","emoji_code","custom","icon","Z_INDEX","IN_BACK","IN_MIDDLE","IN_FRONT"],"sourceRoot":"../../../src","sources":["constants/index.ts"],"mappings":";;;;;;AAEO,MAAMA,yBAAyB,GAAAC,OAAA,CAAAD,yBAAA,GAAG;EACvCE,MAAM,EAAE,GAAG;EACXC,KAAK,EAAE,EAAE;EACTC,YAAY,EAAE;AAChB,CAAC;AAEM,MAAMC,qBAA2C,GAAAJ,OAAA,CAAAI,qBAAA,GAAG,CACzD;EACEC,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,iCAAiC;EAC7CC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,QAAQ;EACpBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,UAAU;EACtBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,WAAW;EACvBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,aAAa;EACzBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,gBAAgB;EAC5BC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,aAAa;EACnBC,UAAU,EAAE,eAAe;EAC3BC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,CACF;AAEM,MAAMC,OAAO,GAAAT,OAAA,CAAAS,OAAA,GAAG;EACrBC,OAAO,EAAE,CAAC;EACVC,SAAS,EAAE,CAAC;EACZC,QAAQ,EAAE;AACZ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["defaultEmojiReactions","exports","type","emoji_code","custom","icon","Z_INDEX","IN_BACK","IN_MIDDLE","IN_FRONT"],"sourceRoot":"../../../src","sources":["constants/index.ts"],"mappings":";;;;;;AAEO,MAAMA,qBAA2C,GAAAC,OAAA,CAAAD,qBAAA,GAAG,CACzD;EACEE,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,iCAAiC;EAC7CC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,QAAQ;EACpBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,UAAU;EACtBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,WAAW;EACvBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,aAAa;EACzBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,gBAAgB;EAC5BC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,aAAa;EACnBC,UAAU,EAAE,eAAe;EAC3BC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,CACF;AAEM,MAAMC,OAAO,GAAAL,OAAA,CAAAK,OAAA,GAAG;EACrBC,OAAO,EAAE,CAAC;EACVC,SAAS,EAAE,CAAC;EACZC,QAAQ,EAAE;AACZ,CAAC","ignoreList":[]}
@@ -15,7 +15,7 @@ function useTrackDimensions(participant, trackType) {
15
15
  const {
16
16
  videoStream,
17
17
  screenShareStream
18
- } = participant;
18
+ } = participant || {};
19
19
  const stream = trackType === 'screenShareTrack' ? screenShareStream : videoStream;
20
20
  const [track] = stream?.getVideoTracks() ?? [];
21
21
  const trackId = track?.id;
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_reactNative","useTrackDimensions","participant","trackType","videoStream","screenShareStream","stream","track","getVideoTracks","trackId","id","trackDimensions","setTrackDimensions","useState","settings","getSettings","width","height","useEffect","handleVideoTrackDimensionChanged","eventData","prev","webRTCEventEmitter","NativeEventEmitter","NativeModules","WebRTCModule","subscription","addListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useTrackDimensions.ts"],"mappings":";;;;;;AAIA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASE,kBAAkBA,CAChCC,WAAmC,EACnCC,SAAyB,EACzB;EACA,MAAM;IAAEC,WAAW;IAAEC;EAAkB,CAAC,GAAGH,WAAW;EACtD,MAAMI,MAAM,GACVH,SAAS,KAAK,kBAAkB,GAAGE,iBAAiB,GAAGD,WAAW;EACpE,MAAM,CAACG,KAAK,CAAC,GAAGD,MAAM,EAAEE,cAAc,CAAC,CAAC,IAAI,EAAE;EAC9C,MAAMC,OAAO,GAAGF,KAAK,EAAEG,EAAE;EAEzB,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAC,eAAQ,EAAC,MAAM;IAC3D,MAAMC,QAAQ,GAAGP,KAAK,EAAEQ,WAAW,CAAC,CAAC;IACrC,MAAMC,KAAK,GAAGF,QAAQ,EAAEE,KAAK,IAAI,CAAC;IAClC,MAAMC,MAAM,GAAGH,QAAQ,EAAEG,MAAM,IAAI,CAAC;IACpC,OAAO;MACLD,KAAK;MACLC;IACF,CAAC;EACH,CAAC,CAAC;;EAEF;EACA,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAI,CAACT,OAAO,IAAI,CAACF,KAAK,EAAE;IAExB,MAAMY,gCAAgC,GAAIC,SAKzC,IAAK;MACJ;MACA,IAAIA,SAAS,CAACX,OAAO,KAAKA,OAAO,EAAE;QACjCG,kBAAkB,CAAES,IAAI,IAAK;UAC3B,IACEA,IAAI,CAACL,KAAK,KAAKI,SAAS,CAACJ,KAAK,IAC9BK,IAAI,CAACJ,MAAM,KAAKG,SAAS,CAACH,MAAM,EAChC;YACA,OAAOI,IAAI;UACb;UACA,OAAO;YAAEL,KAAK,EAAEI,SAAS,CAACJ,KAAK;YAAEC,MAAM,EAAEG,SAAS,CAACH;UAAO,CAAC;QAC7D,CAAC,CAAC;MACJ;IACF,CAAC;IAED,MAAM;MAAED,KAAK;MAAEC;IAAO,CAAC,GAAGV,KAAK,CAACQ,WAAW,CAAC,CAAC;IAC7CH,kBAAkB,CAAES,IAAI,IAAK;MAC3B,IAAIA,IAAI,CAACL,KAAK,KAAKA,KAAK,IAAIK,IAAI,CAACJ,MAAM,KAAKA,MAAM,EAAE;QAClD,OAAOI,IAAI;MACb;MACA,OAAO;QACLL,KAAK,EAAEA,KAAK,IAAI,CAAC;QACjBC,MAAM,EAAEA,MAAM,IAAI;MACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAMK,kBAAkB,GAAG,IAAIC,+BAAkB,CAC/CC,0BAAa,CAACC,YAChB,CAAC;IACD,MAAMC,YAAY,GAAGJ,kBAAkB,CAACK,WAAW,CACjD,4BAA4B,EAC5BR,gCACF,CAAC;IAED,OAAO,MAAM;MACXO,YAAY,CAACE,MAAM,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACnB,OAAO,EAAEF,KAAK,CAAC,CAAC;EAEpB,OAAOI,eAAe;AACxB","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_reactNative","useTrackDimensions","participant","trackType","videoStream","screenShareStream","stream","track","getVideoTracks","trackId","id","trackDimensions","setTrackDimensions","useState","settings","getSettings","width","height","useEffect","handleVideoTrackDimensionChanged","eventData","prev","webRTCEventEmitter","NativeEventEmitter","NativeModules","WebRTCModule","subscription","addListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useTrackDimensions.ts"],"mappings":";;;;;;AAIA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASE,kBAAkBA,CAChCC,WAA+C,EAC/CC,SAAyB,EACzB;EACA,MAAM;IAAEC,WAAW;IAAEC;EAAkB,CAAC,GAAGH,WAAW,IAAI,CAAC,CAAC;EAC5D,MAAMI,MAAM,GACVH,SAAS,KAAK,kBAAkB,GAAGE,iBAAiB,GAAGD,WAAW;EACpE,MAAM,CAACG,KAAK,CAAC,GAAGD,MAAM,EAAEE,cAAc,CAAC,CAAC,IAAI,EAAE;EAC9C,MAAMC,OAAO,GAAGF,KAAK,EAAEG,EAAE;EAEzB,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAC,eAAQ,EAAC,MAAM;IAC3D,MAAMC,QAAQ,GAAGP,KAAK,EAAEQ,WAAW,CAAC,CAAC;IACrC,MAAMC,KAAK,GAAGF,QAAQ,EAAEE,KAAK,IAAI,CAAC;IAClC,MAAMC,MAAM,GAAGH,QAAQ,EAAEG,MAAM,IAAI,CAAC;IACpC,OAAO;MACLD,KAAK;MACLC;IACF,CAAC;EACH,CAAC,CAAC;;EAEF;EACA,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAI,CAACT,OAAO,IAAI,CAACF,KAAK,EAAE;IAExB,MAAMY,gCAAgC,GAAIC,SAKzC,IAAK;MACJ;MACA,IAAIA,SAAS,CAACX,OAAO,KAAKA,OAAO,EAAE;QACjCG,kBAAkB,CAAES,IAAI,IAAK;UAC3B,IACEA,IAAI,CAACL,KAAK,KAAKI,SAAS,CAACJ,KAAK,IAC9BK,IAAI,CAACJ,MAAM,KAAKG,SAAS,CAACH,MAAM,EAChC;YACA,OAAOI,IAAI;UACb;UACA,OAAO;YAAEL,KAAK,EAAEI,SAAS,CAACJ,KAAK;YAAEC,MAAM,EAAEG,SAAS,CAACH;UAAO,CAAC;QAC7D,CAAC,CAAC;MACJ;IACF,CAAC;IAED,MAAM;MAAED,KAAK;MAAEC;IAAO,CAAC,GAAGV,KAAK,CAACQ,WAAW,CAAC,CAAC;IAC7CH,kBAAkB,CAAES,IAAI,IAAK;MAC3B,IAAIA,IAAI,CAACL,KAAK,KAAKA,KAAK,IAAIK,IAAI,CAACJ,MAAM,KAAKA,MAAM,EAAE;QAClD,OAAOI,IAAI;MACb;MACA,OAAO;QACLL,KAAK,EAAEA,KAAK,IAAI,CAAC;QACjBC,MAAM,EAAEA,MAAM,IAAI;MACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAMK,kBAAkB,GAAG,IAAIC,+BAAkB,CAC/CC,0BAAa,CAACC,YAChB,CAAC;IACD,MAAMC,YAAY,GAAGJ,kBAAkB,CAACK,WAAW,CACjD,4BAA4B,EAC5BR,gCACF,CAAC;IAED,OAAO,MAAM;MACXO,YAAY,CAACE,MAAM,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACnB,OAAO,EAAEF,KAAK,CAAC,CAAC;EAEpB,OAAOI,eAAe;AACxB","ignoreList":[]}
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = void 0;
7
- const version = exports.version = '1.22.3';
7
+ const version = exports.version = '1.23.0';
8
8
  //# sourceMappingURL=version.js.map
@@ -1,13 +1,14 @@
1
1
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
2
  import React from 'react';
3
3
  import { Pressable, StyleSheet, View } from 'react-native';
4
- import { FLOATING_VIDEO_VIEW_STYLE, Z_INDEX } from '../../../constants';
4
+ import { Z_INDEX } from '../../../constants';
5
5
  import { ComponentTestIds } from '../../../constants/TestIds';
6
6
  import { VideoSlash } from '../../../icons';
7
7
  import FloatingView from './FloatingView';
8
8
  import { FloatingViewAlignment } from './FloatingView/common';
9
9
  import { ParticipantView as DefaultParticipantView } from '../ParticipantView';
10
10
  import { useTheme } from '../../../contexts/ThemeContext';
11
+ import { useFloatingVideoDimensions } from './useFloatingVideoDimensions';
11
12
 
12
13
  /**
13
14
  * Props to be passed for the LocalVideoView component.
@@ -60,7 +61,10 @@ export const FloatingParticipantView = ({
60
61
  const {
61
62
  theme: {
62
63
  colors,
63
- floatingParticipantsView
64
+ floatingParticipantsView,
65
+ variants: {
66
+ spacingSizes
67
+ }
64
68
  }
65
69
  } = useTheme();
66
70
  const floatingAlignmentMap = {
@@ -70,6 +74,7 @@ export const FloatingParticipantView = ({
70
74
  'bottom-right': FloatingViewAlignment.bottomRight
71
75
  };
72
76
  const [containerDimensions, setContainerDimensions] = React.useState();
77
+ const floatingVideoDimensions = useFloatingVideoDimensions(containerDimensions, participant, 'videoTrack');
73
78
  const participantViewProps = {
74
79
  ParticipantLabel: null,
75
80
  ParticipantNetworkQualityIndicator,
@@ -102,7 +107,7 @@ export const FloatingParticipantView = ({
102
107
  };
103
108
  });
104
109
  }
105
- }, containerDimensions && /*#__PURE__*/React.createElement(FloatingView, {
110
+ }, containerDimensions && floatingVideoDimensions && /*#__PURE__*/React.createElement(FloatingView, {
106
111
  containerHeight: containerDimensions.height,
107
112
  containerWidth: containerDimensions.width,
108
113
  initialAlignment: floatingAlignmentMap[alignment]
@@ -111,7 +116,12 @@ export const FloatingParticipantView = ({
111
116
  }, ParticipantView && /*#__PURE__*/React.createElement(ParticipantView, _extends({
112
117
  participant: participant,
113
118
  trackType: "videoTrack",
114
- style: [styles.participantViewContainer, participantViewStyle, {
119
+ style: [styles.participantViewContainer, {
120
+ width: floatingVideoDimensions.width,
121
+ height: floatingVideoDimensions.height,
122
+ borderRadius: floatingVideoDimensions.width * 0.1,
123
+ marginHorizontal: spacingSizes.md
124
+ }, participantViewStyle, {
115
125
  shadowColor: colors.sheetPrimary
116
126
  }, floatingParticipantsView.participantViewContainer]
117
127
  // video z order must be one above the one used in grid view
@@ -129,9 +139,6 @@ const styles = StyleSheet.create({
129
139
  flex: 1
130
140
  },
131
141
  participantViewContainer: {
132
- height: FLOATING_VIDEO_VIEW_STYLE.height,
133
- width: FLOATING_VIDEO_VIEW_STYLE.width,
134
- borderRadius: FLOATING_VIDEO_VIEW_STYLE.borderRadius,
135
142
  shadowOffset: {
136
143
  width: 0,
137
144
  height: 2
@@ -1 +1 @@
1
- {"version":3,"names":["React","Pressable","StyleSheet","View","FLOATING_VIDEO_VIEW_STYLE","Z_INDEX","ComponentTestIds","VideoSlash","FloatingView","FloatingViewAlignment","ParticipantView","DefaultParticipantView","useTheme","DefaultLocalParticipantViewVideoFallback","theme","colors","floatingParticipantsView","variants","iconSizes","defaults","createElement","style","styles","videoFallback","backgroundColor","sheetSecondary","height","md","width","color","iconPrimary","size","iconSize","FloatingParticipantView","alignment","onPressHandler","participant","participantViewStyle","draggableContainerStyle","ParticipantNetworkQualityIndicator","ParticipantVideoFallback","ParticipantReaction","VideoRenderer","supportedReactions","videoZOrder","objectFit","floatingAlignmentMap","topLeft","topRight","bottomLeft","bottomRight","containerDimensions","setContainerDimensions","useState","participantViewProps","ParticipantLabel","testID","LOCAL_PARTICIPANT","container","pointerEvents","onLayout","event","nativeEvent","layout","prev","containerHeight","containerWidth","initialAlignment","onPress","_extends","trackType","participantViewContainer","shadowColor","sheetPrimary","create","zIndex","IN_MIDDLE","flex","borderRadius","shadowOffset","shadowOpacity","shadowRadius","elevation","absoluteFillObject","alignItems","justifyContent"],"sourceRoot":"../../../../../src","sources":["components/Participant/FloatingParticipantView/index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","Pressable","StyleSheet","View","Z_INDEX","ComponentTestIds","VideoSlash","FloatingView","FloatingViewAlignment","ParticipantView","DefaultParticipantView","useTheme","useFloatingVideoDimensions","DefaultLocalParticipantViewVideoFallback","theme","colors","floatingParticipantsView","variants","iconSizes","defaults","createElement","style","styles","videoFallback","backgroundColor","sheetSecondary","height","md","width","color","iconPrimary","size","iconSize","FloatingParticipantView","alignment","onPressHandler","participant","participantViewStyle","draggableContainerStyle","ParticipantNetworkQualityIndicator","ParticipantVideoFallback","ParticipantReaction","VideoRenderer","supportedReactions","videoZOrder","objectFit","spacingSizes","floatingAlignmentMap","topLeft","topRight","bottomLeft","bottomRight","containerDimensions","setContainerDimensions","useState","floatingVideoDimensions","participantViewProps","ParticipantLabel","testID","LOCAL_PARTICIPANT","container","pointerEvents","onLayout","event","nativeEvent","layout","prev","containerHeight","containerWidth","initialAlignment","onPress","_extends","trackType","participantViewContainer","borderRadius","marginHorizontal","shadowColor","sheetPrimary","create","zIndex","IN_MIDDLE","flex","shadowOffset","shadowOpacity","shadowRadius","elevation","absoluteFillObject","alignItems","justifyContent"],"sourceRoot":"../../../../../src","sources":["components/Participant/FloatingParticipantView/index.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,23 @@
1
+ import { useTrackDimensions } from '../../../hooks/useTrackDimensions';
2
+ export const useFloatingVideoDimensions = (containerDimensions, participant, trackType) => {
3
+ const containerWidth = containerDimensions?.width ?? 0;
4
+ const {
5
+ width,
6
+ height
7
+ } = useTrackDimensions(participant, trackType);
8
+ if (width === 0 || height === 0 || containerWidth === 0) {
9
+ return undefined;
10
+ }
11
+ const aspectRatio = width / height;
12
+
13
+ // based on Android AOSP PiP mode default dimensions algorithm
14
+ // 23% of the container width
15
+ const floatingVideoWidth = containerWidth * 0.23;
16
+ // the height is calculated based on the aspect ratio
17
+ const floatingVideoHeight = floatingVideoWidth / aspectRatio;
18
+ return {
19
+ width: floatingVideoWidth,
20
+ height: floatingVideoHeight
21
+ };
22
+ };
23
+ //# sourceMappingURL=useFloatingVideoDimensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useTrackDimensions","useFloatingVideoDimensions","containerDimensions","participant","trackType","containerWidth","width","height","undefined","aspectRatio","floatingVideoWidth","floatingVideoHeight"],"sourceRoot":"../../../../../src","sources":["components/Participant/FloatingParticipantView/useFloatingVideoDimensions.tsx"],"mappings":"AAIA,SAASA,kBAAkB,QAAQ,mCAAmC;AAEtE,OAAO,MAAMC,0BAA0B,GAAGA,CACxCC,mBAKa,EACbC,WAA+C,EAC/CC,SAAyB,KACtB;EACH,MAAMC,cAAc,GAAGH,mBAAmB,EAAEI,KAAK,IAAI,CAAC;EACtD,MAAM;IAAEA,KAAK;IAAEC;EAAO,CAAC,GAAGP,kBAAkB,CAACG,WAAW,EAAEC,SAAS,CAAC;EAEpE,IAAIE,KAAK,KAAK,CAAC,IAAIC,MAAM,KAAK,CAAC,IAAIF,cAAc,KAAK,CAAC,EAAE;IACvD,OAAOG,SAAS;EAClB;EAEA,MAAMC,WAAW,GAAGH,KAAK,GAAGC,MAAM;;EAElC;EACA;EACA,MAAMG,kBAAkB,GAAGL,cAAc,GAAG,IAAI;EAChD;EACA,MAAMM,mBAAmB,GAAGD,kBAAkB,GAAGD,WAAW;EAE5D,OAAO;IACLH,KAAK,EAAEI,kBAAkB;IACzBH,MAAM,EAAEI;EACV,CAAC;AACH,CAAC","ignoreList":[]}
@@ -1,8 +1,3 @@
1
- export const FLOATING_VIDEO_VIEW_STYLE = {
2
- height: 140,
3
- width: 80,
4
- borderRadius: 10
5
- };
6
1
  export const defaultEmojiReactions = [{
7
2
  type: 'reaction',
8
3
  emoji_code: ':rolling_on_the_floor_laughing:',
@@ -1 +1 @@
1
- {"version":3,"names":["FLOATING_VIDEO_VIEW_STYLE","height","width","borderRadius","defaultEmojiReactions","type","emoji_code","custom","icon","Z_INDEX","IN_BACK","IN_MIDDLE","IN_FRONT"],"sourceRoot":"../../../src","sources":["constants/index.ts"],"mappings":"AAEA,OAAO,MAAMA,yBAAyB,GAAG;EACvCC,MAAM,EAAE,GAAG;EACXC,KAAK,EAAE,EAAE;EACTC,YAAY,EAAE;AAChB,CAAC;AAED,OAAO,MAAMC,qBAA2C,GAAG,CACzD;EACEC,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,iCAAiC;EAC7CC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,QAAQ;EACpBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,UAAU;EACtBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,WAAW;EACvBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,aAAa;EACzBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,gBAAgB;EAC5BC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,aAAa;EACnBC,UAAU,EAAE,eAAe;EAC3BC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,CACF;AAED,OAAO,MAAMC,OAAO,GAAG;EACrBC,OAAO,EAAE,CAAC;EACVC,SAAS,EAAE,CAAC;EACZC,QAAQ,EAAE;AACZ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["defaultEmojiReactions","type","emoji_code","custom","icon","Z_INDEX","IN_BACK","IN_MIDDLE","IN_FRONT"],"sourceRoot":"../../../src","sources":["constants/index.ts"],"mappings":"AAEA,OAAO,MAAMA,qBAA2C,GAAG,CACzD;EACEC,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,iCAAiC;EAC7CC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,QAAQ;EACpBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,UAAU;EACtBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,WAAW;EACvBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,aAAa;EACzBC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,UAAU;EAChBC,UAAU,EAAE,gBAAgB;EAC5BC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,EACD;EACEH,IAAI,EAAE,aAAa;EACnBC,UAAU,EAAE,eAAe;EAC3BC,MAAM,EAAE,CAAC,CAAC;EACVC,IAAI,EAAE;AACR,CAAC,CACF;AAED,OAAO,MAAMC,OAAO,GAAG;EACrBC,OAAO,EAAE,CAAC;EACVC,SAAS,EAAE,CAAC;EACZC,QAAQ,EAAE;AACZ,CAAC","ignoreList":[]}
@@ -10,7 +10,7 @@ export function useTrackDimensions(participant, trackType) {
10
10
  const {
11
11
  videoStream,
12
12
  screenShareStream
13
- } = participant;
13
+ } = participant || {};
14
14
  const stream = trackType === 'screenShareTrack' ? screenShareStream : videoStream;
15
15
  const [track] = stream?.getVideoTracks() ?? [];
16
16
  const trackId = track?.id;
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useState","NativeEventEmitter","NativeModules","useTrackDimensions","participant","trackType","videoStream","screenShareStream","stream","track","getVideoTracks","trackId","id","trackDimensions","setTrackDimensions","settings","getSettings","width","height","handleVideoTrackDimensionChanged","eventData","prev","webRTCEventEmitter","WebRTCModule","subscription","addListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useTrackDimensions.ts"],"mappings":"AAIA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,SAASC,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;;AAEhE;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,WAAmC,EACnCC,SAAyB,EACzB;EACA,MAAM;IAAEC,WAAW;IAAEC;EAAkB,CAAC,GAAGH,WAAW;EACtD,MAAMI,MAAM,GACVH,SAAS,KAAK,kBAAkB,GAAGE,iBAAiB,GAAGD,WAAW;EACpE,MAAM,CAACG,KAAK,CAAC,GAAGD,MAAM,EAAEE,cAAc,CAAC,CAAC,IAAI,EAAE;EAC9C,MAAMC,OAAO,GAAGF,KAAK,EAAEG,EAAE;EAEzB,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAGd,QAAQ,CAAC,MAAM;IAC3D,MAAMe,QAAQ,GAAGN,KAAK,EAAEO,WAAW,CAAC,CAAC;IACrC,MAAMC,KAAK,GAAGF,QAAQ,EAAEE,KAAK,IAAI,CAAC;IAClC,MAAMC,MAAM,GAAGH,QAAQ,EAAEG,MAAM,IAAI,CAAC;IACpC,OAAO;MACLD,KAAK;MACLC;IACF,CAAC;EACH,CAAC,CAAC;;EAEF;EACAnB,SAAS,CAAC,MAAM;IACd,IAAI,CAACY,OAAO,IAAI,CAACF,KAAK,EAAE;IAExB,MAAMU,gCAAgC,GAAIC,SAKzC,IAAK;MACJ;MACA,IAAIA,SAAS,CAACT,OAAO,KAAKA,OAAO,EAAE;QACjCG,kBAAkB,CAAEO,IAAI,IAAK;UAC3B,IACEA,IAAI,CAACJ,KAAK,KAAKG,SAAS,CAACH,KAAK,IAC9BI,IAAI,CAACH,MAAM,KAAKE,SAAS,CAACF,MAAM,EAChC;YACA,OAAOG,IAAI;UACb;UACA,OAAO;YAAEJ,KAAK,EAAEG,SAAS,CAACH,KAAK;YAAEC,MAAM,EAAEE,SAAS,CAACF;UAAO,CAAC;QAC7D,CAAC,CAAC;MACJ;IACF,CAAC;IAED,MAAM;MAAED,KAAK;MAAEC;IAAO,CAAC,GAAGT,KAAK,CAACO,WAAW,CAAC,CAAC;IAC7CF,kBAAkB,CAAEO,IAAI,IAAK;MAC3B,IAAIA,IAAI,CAACJ,KAAK,KAAKA,KAAK,IAAII,IAAI,CAACH,MAAM,KAAKA,MAAM,EAAE;QAClD,OAAOG,IAAI;MACb;MACA,OAAO;QACLJ,KAAK,EAAEA,KAAK,IAAI,CAAC;QACjBC,MAAM,EAAEA,MAAM,IAAI;MACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAMI,kBAAkB,GAAG,IAAIrB,kBAAkB,CAC/CC,aAAa,CAACqB,YAChB,CAAC;IACD,MAAMC,YAAY,GAAGF,kBAAkB,CAACG,WAAW,CACjD,4BAA4B,EAC5BN,gCACF,CAAC;IAED,OAAO,MAAM;MACXK,YAAY,CAACE,MAAM,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACf,OAAO,EAAEF,KAAK,CAAC,CAAC;EAEpB,OAAOI,eAAe;AACxB","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useState","NativeEventEmitter","NativeModules","useTrackDimensions","participant","trackType","videoStream","screenShareStream","stream","track","getVideoTracks","trackId","id","trackDimensions","setTrackDimensions","settings","getSettings","width","height","handleVideoTrackDimensionChanged","eventData","prev","webRTCEventEmitter","WebRTCModule","subscription","addListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useTrackDimensions.ts"],"mappings":"AAIA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,SAASC,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;;AAEhE;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,WAA+C,EAC/CC,SAAyB,EACzB;EACA,MAAM;IAAEC,WAAW;IAAEC;EAAkB,CAAC,GAAGH,WAAW,IAAI,CAAC,CAAC;EAC5D,MAAMI,MAAM,GACVH,SAAS,KAAK,kBAAkB,GAAGE,iBAAiB,GAAGD,WAAW;EACpE,MAAM,CAACG,KAAK,CAAC,GAAGD,MAAM,EAAEE,cAAc,CAAC,CAAC,IAAI,EAAE;EAC9C,MAAMC,OAAO,GAAGF,KAAK,EAAEG,EAAE;EAEzB,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAGd,QAAQ,CAAC,MAAM;IAC3D,MAAMe,QAAQ,GAAGN,KAAK,EAAEO,WAAW,CAAC,CAAC;IACrC,MAAMC,KAAK,GAAGF,QAAQ,EAAEE,KAAK,IAAI,CAAC;IAClC,MAAMC,MAAM,GAAGH,QAAQ,EAAEG,MAAM,IAAI,CAAC;IACpC,OAAO;MACLD,KAAK;MACLC;IACF,CAAC;EACH,CAAC,CAAC;;EAEF;EACAnB,SAAS,CAAC,MAAM;IACd,IAAI,CAACY,OAAO,IAAI,CAACF,KAAK,EAAE;IAExB,MAAMU,gCAAgC,GAAIC,SAKzC,IAAK;MACJ;MACA,IAAIA,SAAS,CAACT,OAAO,KAAKA,OAAO,EAAE;QACjCG,kBAAkB,CAAEO,IAAI,IAAK;UAC3B,IACEA,IAAI,CAACJ,KAAK,KAAKG,SAAS,CAACH,KAAK,IAC9BI,IAAI,CAACH,MAAM,KAAKE,SAAS,CAACF,MAAM,EAChC;YACA,OAAOG,IAAI;UACb;UACA,OAAO;YAAEJ,KAAK,EAAEG,SAAS,CAACH,KAAK;YAAEC,MAAM,EAAEE,SAAS,CAACF;UAAO,CAAC;QAC7D,CAAC,CAAC;MACJ;IACF,CAAC;IAED,MAAM;MAAED,KAAK;MAAEC;IAAO,CAAC,GAAGT,KAAK,CAACO,WAAW,CAAC,CAAC;IAC7CF,kBAAkB,CAAEO,IAAI,IAAK;MAC3B,IAAIA,IAAI,CAACJ,KAAK,KAAKA,KAAK,IAAII,IAAI,CAACH,MAAM,KAAKA,MAAM,EAAE;QAClD,OAAOG,IAAI;MACb;MACA,OAAO;QACLJ,KAAK,EAAEA,KAAK,IAAI,CAAC;QACjBC,MAAM,EAAEA,MAAM,IAAI;MACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAMI,kBAAkB,GAAG,IAAIrB,kBAAkB,CAC/CC,aAAa,CAACqB,YAChB,CAAC;IACD,MAAMC,YAAY,GAAGF,kBAAkB,CAACG,WAAW,CACjD,4BAA4B,EAC5BN,gCACF,CAAC;IAED,OAAO,MAAM;MACXK,YAAY,CAACE,MAAM,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACf,OAAO,EAAEF,KAAK,CAAC,CAAC;EAEpB,OAAOI,eAAe;AACxB","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- export const version = '1.22.3';
1
+ export const version = '1.23.0';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Participant/FloatingParticipantView/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,SAAS,EAGd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAKtB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kCAAkC,EACxC,MAAM,YAAY,CAAC;AAEpB,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,MAAM,gCAAgC,GACxC,UAAU,GACV,WAAW,GACX,aAAa,GACb,cAAc,CAAC;AAEnB;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,6BAA6B,GACtE,IAAI,CAAC,kCAAkC,EAAE,iBAAiB,CAAC,GAC3D,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,GAC5C,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,aAAa,CAAC,GAAG;IACxD;;OAEG;IACH,SAAS,CAAC,EAAE,gCAAgC,CAAC;IAC7C;;OAEG;IACH,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC;;OAEG;IACH,oBAAoB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5C;;;OAGG;IACH,uBAAuB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AA2BJ;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,2PAcrC,4BAA4B,6BAsF9B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Participant/FloatingParticipantView/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,SAAS,EAGd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAKtB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kCAAkC,EACxC,MAAM,YAAY,CAAC;AAEpB,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,MAAM,gCAAgC,GACxC,UAAU,GACV,WAAW,GACX,aAAa,GACb,cAAc,CAAC;AAEnB;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,6BAA6B,GACtE,IAAI,CAAC,kCAAkC,EAAE,iBAAiB,CAAC,GAC3D,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,GAC5C,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,aAAa,CAAC,GAAG;IACxD;;OAEG;IACH,SAAS,CAAC,EAAE,gCAAgC,CAAC;IAC7C;;OAEG;IACH,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC;;OAEG;IACH,oBAAoB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5C;;;OAGG;IACH,uBAAuB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AA2BJ;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,2PAcrC,4BAA4B,6BAsG9B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { StreamVideoParticipant, VideoTrackType } from '@stream-io/video-client';
2
+ export declare const useFloatingVideoDimensions: (containerDimensions: {
3
+ width: number;
4
+ height: number;
5
+ } | undefined, participant: StreamVideoParticipant | undefined, trackType: VideoTrackType) => {
6
+ width: number;
7
+ height: number;
8
+ } | undefined;
9
+ //# sourceMappingURL=useFloatingVideoDimensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFloatingVideoDimensions.d.ts","sourceRoot":"","sources":["../../../../../src/components/Participant/FloatingParticipantView/useFloatingVideoDimensions.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAGjC,eAAO,MAAM,0BAA0B,GACrC,qBACI;IACE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GACD,SAAS,EACb,aAAa,sBAAsB,GAAG,SAAS,EAC/C,WAAW,cAAc;;;aAqB1B,CAAC"}
@@ -1,9 +1,4 @@
1
1
  import { type StreamReactionType } from '../components';
2
- export declare const FLOATING_VIDEO_VIEW_STYLE: {
3
- height: number;
4
- width: number;
5
- borderRadius: number;
6
- };
7
2
  export declare const defaultEmojiReactions: StreamReactionType[];
8
3
  export declare const Z_INDEX: {
9
4
  IN_BACK: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,eAAO,MAAM,yBAAyB;;;;CAIrC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,kBAAkB,EA2CrD,CAAC;AAEF,eAAO,MAAM,OAAO;;;;CAInB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,eAAO,MAAM,qBAAqB,EAAE,kBAAkB,EA2CrD,CAAC;AAEF,eAAO,MAAM,OAAO;;;;CAInB,CAAC"}
@@ -4,7 +4,7 @@ import { type StreamVideoParticipant, type VideoTrackType } from '@stream-io/vid
4
4
  * Note: the `tracktype` is used only for local participants.
5
5
  * `tracktype` should be 'videoTrack' for video track and 'screenShareTrack' for screen share track.
6
6
  */
7
- export declare function useTrackDimensions(participant: StreamVideoParticipant, trackType: VideoTrackType): {
7
+ export declare function useTrackDimensions(participant: StreamVideoParticipant | undefined, trackType: VideoTrackType): {
8
8
  width: number;
9
9
  height: number;
10
10
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useTrackDimensions.d.ts","sourceRoot":"","sources":["../../../src/hooks/useTrackDimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAIjC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,sBAAsB,EACnC,SAAS,EAAE,cAAc;;;EAmE1B"}
1
+ {"version":3,"file":"useTrackDimensions.d.ts","sourceRoot":"","sources":["../../../src/hooks/useTrackDimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAIjC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,sBAAsB,GAAG,SAAS,EAC/C,SAAS,EAAE,cAAc;;;EAmE1B"}
@@ -1,2 +1,2 @@
1
- export declare const version = "1.22.3";
1
+ export declare const version = "1.23.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -18,32 +18,32 @@ enum DefaultAudioDevice {
18
18
 
19
19
  @objc(StreamInCallManager)
20
20
  class StreamInCallManager: RCTEventEmitter {
21
-
21
+
22
22
  private let audioSessionQueue = DispatchQueue(label: "io.getstream.rn.audioSessionQueue")
23
-
23
+
24
24
  private var audioManagerActivated = false
25
25
  private var callAudioRole: CallAudioRole = .communicator
26
26
  private var defaultAudioDevice: DefaultAudioDevice = .speaker
27
27
  private var previousVolume: Float = 0.75
28
-
28
+
29
29
  private struct AudioSessionState {
30
30
  let category: AVAudioSession.Category
31
31
  let mode: AVAudioSession.Mode
32
32
  let options: AVAudioSession.CategoryOptions
33
33
  }
34
-
34
+
35
35
  private var previousAudioSessionState: AudioSessionState?
36
-
36
+ private var hasRegisteredRouteObserver = false
37
+
37
38
  override func invalidate() {
38
39
  stop()
39
40
  super.invalidate()
40
41
  }
41
-
42
+
42
43
  override static func requiresMainQueueSetup() -> Bool {
43
44
  return false
44
45
  }
45
-
46
-
46
+
47
47
  @objc(setAudioRole:)
48
48
  func setAudioRole(audioRole: String) {
49
49
  audioSessionQueue.async { [self] in
@@ -54,7 +54,7 @@ class StreamInCallManager: RCTEventEmitter {
54
54
  self.callAudioRole = audioRole.lowercased() == "listener" ? .listener : .communicator
55
55
  }
56
56
  }
57
-
57
+
58
58
  @objc(setDefaultAudioDeviceEndpointType:)
59
59
  func setDefaultAudioDeviceEndpointType(endpointType: String) {
60
60
  audioSessionQueue.async { [self] in
@@ -65,7 +65,7 @@ class StreamInCallManager: RCTEventEmitter {
65
65
  self.defaultAudioDevice = endpointType.lowercased() == "earpiece" ? .earpiece : .speaker
66
66
  }
67
67
  }
68
-
68
+
69
69
  @objc
70
70
  func start() {
71
71
  audioSessionQueue.async { [self] in
@@ -79,10 +79,17 @@ class StreamInCallManager: RCTEventEmitter {
79
79
  options: session.categoryOptions
80
80
  )
81
81
  configureAudioSession()
82
+ // Enable wake lock to prevent the screen from dimming/locking during a call
83
+ DispatchQueue.main.async {
84
+ UIApplication.shared.isIdleTimerDisabled = true
85
+ self.registerAudioRouteObserver()
86
+ self.updateProximityMonitoring()
87
+ self.log("Wake lock enabled (idle timer disabled)")
88
+ }
82
89
  audioManagerActivated = true
83
90
  }
84
91
  }
85
-
92
+
86
93
  @objc
87
94
  func stop() {
88
95
  audioSessionQueue.async { [self] in
@@ -100,13 +107,20 @@ class StreamInCallManager: RCTEventEmitter {
100
107
  }
101
108
  audioManagerActivated = false
102
109
  }
110
+ // Disable wake lock and proximity when call manager stops so the device can sleep again
111
+ DispatchQueue.main.async {
112
+ self.setProximityMonitoringEnabled(false)
113
+ self.unregisterAudioRouteObserver()
114
+ UIApplication.shared.isIdleTimerDisabled = false
115
+ self.log("Wake lock disabled (idle timer enabled)")
116
+ }
103
117
  }
104
-
118
+
105
119
  private func configureAudioSession() {
106
120
  let intendedCategory: AVAudioSession.Category!
107
121
  let intendedMode: AVAudioSession.Mode!
108
122
  let intendedOptions: AVAudioSession.CategoryOptions!
109
-
123
+
110
124
  if (callAudioRole == .listener) {
111
125
  // enables high quality audio playback but disables microphone
112
126
  intendedCategory = .playback
@@ -115,16 +129,16 @@ class StreamInCallManager: RCTEventEmitter {
115
129
  } else {
116
130
  intendedCategory = .playAndRecord
117
131
  intendedMode = .voiceChat
118
-
132
+
119
133
  if (defaultAudioDevice == .speaker) {
120
134
  // defaultToSpeaker will route to speaker if nothing else is connected
121
- intendedOptions = [.allowBluetooth, .defaultToSpeaker]
135
+ intendedOptions = [.allowBluetoothHFP, .defaultToSpeaker]
122
136
  } else {
123
137
  // having no defaultToSpeaker makes sure audio goes to earpiece if nothing is connected
124
- intendedOptions = [.allowBluetooth]
138
+ intendedOptions = [.allowBluetoothHFP]
125
139
  }
126
140
  }
127
-
141
+
128
142
  // START: set the config that webrtc must use when it takes control
129
143
  let rtcConfig = RTCAudioSessionConfiguration.webRTC()
130
144
  rtcConfig.category = intendedCategory.rawValue
@@ -132,14 +146,14 @@ class StreamInCallManager: RCTEventEmitter {
132
146
  rtcConfig.categoryOptions = intendedOptions
133
147
  RTCAudioSessionConfiguration.setWebRTC(rtcConfig)
134
148
  // END
135
-
149
+
136
150
  // START: compare current audio session with intended, and update if different
137
151
  let session = RTCAudioSession.sharedInstance()
138
152
  let currentCategory = session.category
139
153
  let currentMode = session.mode
140
154
  let currentOptions = session.categoryOptions
141
155
  let currentIsActive = session.isActive
142
-
156
+
143
157
  if currentCategory != intendedCategory.rawValue || currentMode != intendedMode.rawValue || currentOptions != intendedOptions || !currentIsActive {
144
158
  session.lockForConfiguration()
145
159
  do {
@@ -162,7 +176,7 @@ class StreamInCallManager: RCTEventEmitter {
162
176
  }
163
177
  // END
164
178
  }
165
-
179
+
166
180
  @objc(showAudioRoutePicker)
167
181
  public func showAudioRoutePicker() {
168
182
  guard #available(iOS 11.0, tvOS 11.0, macOS 10.15, *) else {
@@ -177,7 +191,7 @@ class StreamInCallManager: RCTEventEmitter {
177
191
  .sendActions(for: .touchUpInside)
178
192
  }
179
193
  }
180
-
194
+
181
195
  @objc(setForceSpeakerphoneOn:)
182
196
  func setForceSpeakerphoneOn(enable: Bool) {
183
197
  let session = AVAudioSession.sharedInstance()
@@ -188,12 +202,12 @@ class StreamInCallManager: RCTEventEmitter {
188
202
  log("Error setting speakerphone: \(error)")
189
203
  }
190
204
  }
191
-
205
+
192
206
  @objc(setMicrophoneMute:)
193
207
  func setMicrophoneMute(enable: Bool) {
194
208
  log("iOS does not support setMicrophoneMute()")
195
209
  }
196
-
210
+
197
211
  @objc
198
212
  func logAudioState() {
199
213
  let session = AVAudioSession.sharedInstance()
@@ -209,17 +223,17 @@ class StreamInCallManager: RCTEventEmitter {
209
223
  """
210
224
  log(logString)
211
225
  }
212
-
226
+
213
227
  @objc(muteAudioOutput)
214
228
  func muteAudioOutput() {
215
229
  DispatchQueue.main.async { [self] in
216
230
  let volumeView = MPVolumeView()
217
-
231
+
218
232
  // Add to a temporary view hierarchy to make it functional
219
233
  if let window = getCurrentWindow() {
220
234
  volumeView.frame = CGRect(x: -1000, y: -1000, width: 1, height: 1)
221
235
  window.addSubview(volumeView)
222
-
236
+
223
237
  // Give it a moment to initialize
224
238
  DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
225
239
  if let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider {
@@ -230,24 +244,24 @@ class StreamInCallManager: RCTEventEmitter {
230
244
  } else {
231
245
  self.log("Could not find volume slider")
232
246
  }
233
-
247
+
234
248
  // Remove from view hierarchy after use
235
249
  volumeView.removeFromSuperview()
236
250
  }
237
251
  }
238
252
  }
239
253
  }
240
-
254
+
241
255
  @objc(unmuteAudioOutput)
242
256
  func unmuteAudioOutput() {
243
257
  DispatchQueue.main.async { [self] in
244
258
  let volumeView = MPVolumeView()
245
-
259
+
246
260
  // Add to a temporary view hierarchy to make it functional
247
261
  if let window = getCurrentWindow() {
248
262
  volumeView.frame = CGRect(x: -1000, y: -1000, width: 1, height: 1)
249
263
  window.addSubview(volumeView)
250
-
264
+
251
265
  // Give it a moment to initialize
252
266
  DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
253
267
  if let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider {
@@ -258,31 +272,84 @@ class StreamInCallManager: RCTEventEmitter {
258
272
  } else {
259
273
  self.log("Could not find volume slider")
260
274
  }
261
-
275
+
262
276
  // Remove from view hierarchy after use
263
277
  volumeView.removeFromSuperview()
264
278
  }
265
279
  }
266
280
  }
267
281
  }
268
-
282
+
283
+ // MARK: - Proximity Handling
284
+ private func registerAudioRouteObserver() {
285
+ if hasRegisteredRouteObserver { return }
286
+ NotificationCenter.default.addObserver(
287
+ self,
288
+ selector: #selector(handleAudioRouteChange(_:)),
289
+ name: AVAudioSession.routeChangeNotification,
290
+ object: nil
291
+ )
292
+ hasRegisteredRouteObserver = true
293
+ log("Registered AVAudioSession.routeChangeNotification observer")
294
+ }
295
+
296
+ private func unregisterAudioRouteObserver() {
297
+ if !hasRegisteredRouteObserver { return }
298
+ NotificationCenter.default.removeObserver(self, name: AVAudioSession.routeChangeNotification, object: nil)
299
+ hasRegisteredRouteObserver = false
300
+ log("Unregistered AVAudioSession.routeChangeNotification observer")
301
+ }
302
+
303
+ @objc private func handleAudioRouteChange(_ notification: Notification) {
304
+ // Route changes can arrive on arbitrary queues; ensure UI-safe work on main
305
+ DispatchQueue.main.async { [weak self] in
306
+ self?.updateProximityMonitoring()
307
+ }
308
+ }
309
+
310
+ private func updateProximityMonitoring() {
311
+ // Proximity is only meaningful while a call is active
312
+ guard audioManagerActivated else {
313
+ setProximityMonitoringEnabled(false)
314
+ return
315
+ }
316
+ let session = AVAudioSession.sharedInstance()
317
+ let port = session.currentRoute.outputs.first?.portType
318
+ let isEarpiece = (port == .builtInReceiver)
319
+ setProximityMonitoringEnabled(isEarpiece)
320
+ }
321
+
322
+ private func setProximityMonitoringEnabled(_ enabled: Bool) {
323
+ // Always toggle on the main thread
324
+ if Thread.isMainThread {
325
+ if UIDevice.current.isProximityMonitoringEnabled != enabled {
326
+ UIDevice.current.isProximityMonitoringEnabled = enabled
327
+ log("Proximity monitoring \(enabled ? "ENABLED" : "DISABLED")")
328
+ }
329
+ } else {
330
+ DispatchQueue.main.async { [weak self] in
331
+ self?.setProximityMonitoringEnabled(enabled)
332
+ }
333
+ }
334
+ }
335
+
269
336
  // MARK: - RCTEventEmitter
270
-
337
+
271
338
  override func supportedEvents() -> [String]! {
272
339
  // TODO: list events that can be sent to JS
273
340
  return []
274
341
  }
275
-
342
+
276
343
  @objc
277
344
  override func addListener(_ eventName: String!) {
278
345
  super.addListener(eventName)
279
346
  }
280
-
347
+
281
348
  @objc
282
349
  override func removeListeners(_ count: Double) {
283
350
  super.removeListeners(count)
284
351
  }
285
-
352
+
286
353
  // MARK: - Helper Methods
287
354
  private func getCurrentWindow() -> UIWindow? {
288
355
  if #available(iOS 13.0, *) {
@@ -294,10 +361,10 @@ class StreamInCallManager: RCTEventEmitter {
294
361
  return UIApplication.shared.keyWindow
295
362
  }
296
363
  }
297
-
364
+
298
365
  // MARK: - Logging Helper
299
366
  private func log(_ message: String) {
300
367
  NSLog("InCallManager: %@", message)
301
368
  }
302
-
369
+
303
370
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stream-io/video-react-native-sdk",
3
- "version": "1.22.3",
3
+ "version": "1.23.0",
4
4
  "description": "Stream Video SDK for React Native",
5
5
  "author": "https://getstream.io",
6
6
  "homepage": "https://getstream.io/video/docs/react-native/",
@@ -45,8 +45,8 @@
45
45
  "!**/.*"
46
46
  ],
47
47
  "dependencies": {
48
- "@stream-io/video-client": "1.35.0",
49
- "@stream-io/video-react-bindings": "1.10.2",
48
+ "@stream-io/video-client": "1.35.1",
49
+ "@stream-io/video-react-bindings": "1.10.3",
50
50
  "intl-pluralrules": "2.0.1",
51
51
  "lodash.merge": "^4.6.2",
52
52
  "react-native-url-polyfill": "^3.0.0",
@@ -6,7 +6,7 @@ import {
6
6
  View,
7
7
  type ViewStyle,
8
8
  } from 'react-native';
9
- import { FLOATING_VIDEO_VIEW_STYLE, Z_INDEX } from '../../../constants';
9
+ import { Z_INDEX } from '../../../constants';
10
10
  import { ComponentTestIds } from '../../../constants/TestIds';
11
11
  import { VideoSlash } from '../../../icons';
12
12
  import FloatingView from './FloatingView';
@@ -21,6 +21,7 @@ import {
21
21
  type ParticipantViewProps,
22
22
  } from '../ParticipantView';
23
23
  import { useTheme } from '../../../contexts/ThemeContext';
24
+ import { useFloatingVideoDimensions } from './useFloatingVideoDimensions';
24
25
  import { type StreamVideoParticipant } from '@stream-io/video-client';
25
26
 
26
27
  export type FloatingParticipantViewAlignment =
@@ -104,7 +105,11 @@ export const FloatingParticipantView = ({
104
105
  objectFit,
105
106
  }: FloatingParticipantViewProps) => {
106
107
  const {
107
- theme: { colors, floatingParticipantsView },
108
+ theme: {
109
+ colors,
110
+ floatingParticipantsView,
111
+ variants: { spacingSizes },
112
+ },
108
113
  } = useTheme();
109
114
 
110
115
  const floatingAlignmentMap: Record<
@@ -122,6 +127,12 @@ export const FloatingParticipantView = ({
122
127
  height: number;
123
128
  }>();
124
129
 
130
+ const floatingVideoDimensions = useFloatingVideoDimensions(
131
+ containerDimensions,
132
+ participant,
133
+ 'videoTrack',
134
+ );
135
+
125
136
  const participantViewProps: ParticipantViewComponentProps = {
126
137
  ParticipantLabel: null,
127
138
  ParticipantNetworkQualityIndicator,
@@ -158,7 +169,7 @@ export const FloatingParticipantView = ({
158
169
  });
159
170
  }}
160
171
  >
161
- {containerDimensions && (
172
+ {containerDimensions && floatingVideoDimensions && (
162
173
  <FloatingView
163
174
  containerHeight={containerDimensions.height}
164
175
  containerWidth={containerDimensions.width}
@@ -171,6 +182,12 @@ export const FloatingParticipantView = ({
171
182
  trackType="videoTrack"
172
183
  style={[
173
184
  styles.participantViewContainer,
185
+ {
186
+ width: floatingVideoDimensions.width,
187
+ height: floatingVideoDimensions.height,
188
+ borderRadius: floatingVideoDimensions.width * 0.1,
189
+ marginHorizontal: spacingSizes.md,
190
+ },
174
191
  participantViewStyle,
175
192
  { shadowColor: colors.sheetPrimary },
176
193
  floatingParticipantsView.participantViewContainer,
@@ -197,9 +214,6 @@ const styles = StyleSheet.create({
197
214
  flex: 1,
198
215
  },
199
216
  participantViewContainer: {
200
- height: FLOATING_VIDEO_VIEW_STYLE.height,
201
- width: FLOATING_VIDEO_VIEW_STYLE.width,
202
- borderRadius: FLOATING_VIDEO_VIEW_STYLE.borderRadius,
203
217
  shadowOffset: {
204
218
  width: 0,
205
219
  height: 2,
@@ -0,0 +1,36 @@
1
+ import {
2
+ StreamVideoParticipant,
3
+ VideoTrackType,
4
+ } from '@stream-io/video-client';
5
+ import { useTrackDimensions } from '../../../hooks/useTrackDimensions';
6
+
7
+ export const useFloatingVideoDimensions = (
8
+ containerDimensions:
9
+ | {
10
+ width: number;
11
+ height: number;
12
+ }
13
+ | undefined,
14
+ participant: StreamVideoParticipant | undefined,
15
+ trackType: VideoTrackType,
16
+ ) => {
17
+ const containerWidth = containerDimensions?.width ?? 0;
18
+ const { width, height } = useTrackDimensions(participant, trackType);
19
+
20
+ if (width === 0 || height === 0 || containerWidth === 0) {
21
+ return undefined;
22
+ }
23
+
24
+ const aspectRatio = width / height;
25
+
26
+ // based on Android AOSP PiP mode default dimensions algorithm
27
+ // 23% of the container width
28
+ const floatingVideoWidth = containerWidth * 0.23;
29
+ // the height is calculated based on the aspect ratio
30
+ const floatingVideoHeight = floatingVideoWidth / aspectRatio;
31
+
32
+ return {
33
+ width: floatingVideoWidth,
34
+ height: floatingVideoHeight,
35
+ };
36
+ };
@@ -1,11 +1,5 @@
1
1
  import { type StreamReactionType } from '../components';
2
2
 
3
- export const FLOATING_VIDEO_VIEW_STYLE = {
4
- height: 140,
5
- width: 80,
6
- borderRadius: 10,
7
- };
8
-
9
3
  export const defaultEmojiReactions: StreamReactionType[] = [
10
4
  {
11
5
  type: 'reaction',
@@ -11,10 +11,10 @@ import { NativeEventEmitter, NativeModules } from 'react-native';
11
11
  * `tracktype` should be 'videoTrack' for video track and 'screenShareTrack' for screen share track.
12
12
  */
13
13
  export function useTrackDimensions(
14
- participant: StreamVideoParticipant,
14
+ participant: StreamVideoParticipant | undefined,
15
15
  trackType: VideoTrackType,
16
16
  ) {
17
- const { videoStream, screenShareStream } = participant;
17
+ const { videoStream, screenShareStream } = participant || {};
18
18
  const stream =
19
19
  trackType === 'screenShareTrack' ? screenShareStream : videoStream;
20
20
  const [track] = stream?.getVideoTracks() ?? [];
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '1.22.3';
1
+ export const version = '1.23.0';