@stream-io/video-react-native-sdk 1.4.22 → 1.5.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 CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [1.5.0](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.4.22...@stream-io/video-react-native-sdk-1.5.0) (2024-12-20)
6
+
7
+ ### Dependency Updates
8
+
9
+ * `@stream-io/video-client` updated to version `1.13.0`
10
+ * `@stream-io/video-react-bindings` updated to version `1.2.15`
11
+
12
+ ### Features
13
+
14
+ * report low power mode and thermal info to stats ([#1583](https://github.com/GetStream/stream-video-js/issues/1583)) ([ef49cee](https://github.com/GetStream/stream-video-js/commit/ef49ceef032fc3e4bb055fbc32c2b5b18c3a24d2))
15
+
5
16
  ## [1.4.22](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.4.21...@stream-io/video-react-native-sdk-1.4.22) (2024-12-19)
6
17
 
7
18
 
@@ -2,4 +2,5 @@
2
2
  package="com.streamvideo.reactnative">
3
3
 
4
4
  <uses-permission android:name="android.permission.INTERNET" />
5
+ <uses-permission android:name="android.permission.DEVICE_POWER" />
5
6
  </manifest>
@@ -4,8 +4,12 @@ import android.app.AppOpsManager
4
4
  import android.app.PictureInPictureParams
5
5
  import android.content.Context
6
6
  import android.content.pm.PackageManager
7
+ import android.content.BroadcastReceiver
8
+ import android.content.Intent
9
+ import android.content.IntentFilter
7
10
  import android.net.Uri
8
11
  import android.os.Build
12
+ import android.os.PowerManager
9
13
  import android.os.Process
10
14
  import android.util.Rational
11
15
  import androidx.annotation.RequiresApi
@@ -23,6 +27,8 @@ class StreamVideoReactNativeModule(reactContext: ReactApplicationContext) : Reac
23
27
  return NAME;
24
28
  }
25
29
 
30
+ private var thermalStatusListener: PowerManager.OnThermalStatusChangedListener? = null
31
+
26
32
  override fun initialize() {
27
33
  super.initialize()
28
34
  StreamVideoReactNative.pipListeners.add { isInPictureInPictureMode ->
@@ -30,6 +36,9 @@ class StreamVideoReactNativeModule(reactContext: ReactApplicationContext) : Reac
30
36
  RCTDeviceEventEmitter::class.java
31
37
  ).emit(PIP_CHANGE_EVENT, isInPictureInPictureMode)
32
38
  }
39
+
40
+ val filter = IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)
41
+ reactApplicationContext.registerReceiver(powerReceiver, filter)
33
42
  }
34
43
 
35
44
  @ReactMethod
@@ -81,6 +90,111 @@ class StreamVideoReactNativeModule(reactContext: ReactApplicationContext) : Reac
81
90
  StreamVideoReactNative.canAutoEnterPictureInPictureMode = value
82
91
  }
83
92
 
93
+ @ReactMethod
94
+ fun startThermalStatusUpdates(promise: Promise) {
95
+ try {
96
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
97
+ val powerManager = reactApplicationContext.getSystemService(ReactApplicationContext.POWER_SERVICE) as PowerManager
98
+
99
+ val listener = PowerManager.OnThermalStatusChangedListener { status ->
100
+ val thermalStatus = when (status) {
101
+ PowerManager.THERMAL_STATUS_NONE -> "NONE"
102
+ PowerManager.THERMAL_STATUS_LIGHT -> "LIGHT"
103
+ PowerManager.THERMAL_STATUS_MODERATE -> "MODERATE"
104
+ PowerManager.THERMAL_STATUS_SEVERE -> "SEVERE"
105
+ PowerManager.THERMAL_STATUS_CRITICAL -> "CRITICAL"
106
+ PowerManager.THERMAL_STATUS_EMERGENCY -> "EMERGENCY"
107
+ PowerManager.THERMAL_STATUS_SHUTDOWN -> "SHUTDOWN"
108
+ else -> "UNKNOWN"
109
+ }
110
+
111
+ reactApplicationContext
112
+ .getJSModule(RCTDeviceEventEmitter::class.java)
113
+ .emit("thermalStateDidChange", thermalStatus)
114
+ }
115
+
116
+ thermalStatusListener = listener
117
+ powerManager.addThermalStatusListener(listener)
118
+ // Get initial status
119
+ currentThermalState(promise)
120
+ } else {
121
+ promise.resolve("NOT_SUPPORTED")
122
+ }
123
+ } catch (e: Exception) {
124
+ promise.reject("THERMAL_ERROR", e.message)
125
+ }
126
+ }
127
+
128
+ @ReactMethod
129
+ fun stopThermalStatusUpdates() {
130
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
131
+ val powerManager = reactApplicationContext.getSystemService(ReactApplicationContext.POWER_SERVICE) as PowerManager
132
+ // Store the current listener in a local val for safe null checking
133
+ val currentListener = thermalStatusListener
134
+ if (currentListener != null) {
135
+ powerManager.removeThermalStatusListener(currentListener)
136
+ thermalStatusListener = null
137
+ }
138
+ }
139
+ }
140
+
141
+ @ReactMethod
142
+ fun currentThermalState(promise: Promise) {
143
+ try {
144
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
145
+ val powerManager = reactApplicationContext.getSystemService(ReactApplicationContext.POWER_SERVICE) as PowerManager
146
+ val status = powerManager.currentThermalStatus
147
+ val thermalStatus = when (status) {
148
+ PowerManager.THERMAL_STATUS_NONE -> "NONE"
149
+ PowerManager.THERMAL_STATUS_LIGHT -> "LIGHT"
150
+ PowerManager.THERMAL_STATUS_MODERATE -> "MODERATE"
151
+ PowerManager.THERMAL_STATUS_SEVERE -> "SEVERE"
152
+ PowerManager.THERMAL_STATUS_CRITICAL -> "CRITICAL"
153
+ PowerManager.THERMAL_STATUS_EMERGENCY -> "EMERGENCY"
154
+ PowerManager.THERMAL_STATUS_SHUTDOWN -> "SHUTDOWN"
155
+ else -> "UNKNOWN"
156
+ }
157
+ promise.resolve(thermalStatus)
158
+ } else {
159
+ promise.resolve("NOT_SUPPORTED")
160
+ }
161
+ } catch (e: Exception) {
162
+ promise.reject("THERMAL_ERROR", e.message)
163
+ }
164
+ }
165
+
166
+ private val powerReceiver = object : BroadcastReceiver() {
167
+ override fun onReceive(context: Context?, intent: Intent?) {
168
+ if (intent?.action == PowerManager.ACTION_POWER_SAVE_MODE_CHANGED) {
169
+ sendPowerModeEvent()
170
+ }
171
+ }
172
+ }
173
+
174
+ override fun onCatalystInstanceDestroy() {
175
+ super.onCatalystInstanceDestroy()
176
+ reactApplicationContext.unregisterReceiver(powerReceiver)
177
+ stopThermalStatusUpdates()
178
+ }
179
+
180
+ private fun sendPowerModeEvent() {
181
+ val powerManager = reactApplicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager
182
+ val isLowPowerMode = powerManager.isPowerSaveMode
183
+ reactApplicationContext
184
+ .getJSModule(RCTDeviceEventEmitter::class.java)
185
+ .emit("isLowPowerModeEnabled", isLowPowerMode)
186
+ }
187
+
188
+ @ReactMethod
189
+ fun isLowPowerModeEnabled(promise: Promise) {
190
+ try {
191
+ val powerManager = reactApplicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager
192
+ promise.resolve(powerManager.isPowerSaveMode)
193
+ } catch (e: Exception) {
194
+ promise.reject("ERROR", e.message)
195
+ }
196
+ }
197
+
84
198
  private fun hasPermission(): Boolean {
85
199
  return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && reactApplicationContext.packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) {
86
200
  val appOps =
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.StreamCall = void 0;
7
7
  var _videoReactBindings = require("@stream-io/video-react-bindings");
8
8
  var _react = _interopRequireWildcard(require("react"));
9
+ var _videoClient = require("@stream-io/video-client");
9
10
  var _useIosCallkeepWithCallingStateEffect = require("../hooks/push/useIosCallkeepWithCallingStateEffect");
10
11
  var _utils = require("../utils/push/internal/utils");
11
12
  var _useAndroidKeepCallAliveEffect = require("../hooks/useAndroidKeepCallAliveEffect");
@@ -26,7 +27,7 @@ const StreamCall = ({
26
27
  }) => {
27
28
  return /*#__PURE__*/_react.default.createElement(_videoReactBindings.StreamCallProvider, {
28
29
  call: call
29
- }, /*#__PURE__*/_react.default.createElement(AppStateListener, null), /*#__PURE__*/_react.default.createElement(AndroidKeepCallAlive, null), /*#__PURE__*/_react.default.createElement(IosInformCallkeepCallEnd, null), /*#__PURE__*/_react.default.createElement(ClearPushWSSubscriptions, null), children);
30
+ }, /*#__PURE__*/_react.default.createElement(AppStateListener, null), /*#__PURE__*/_react.default.createElement(AndroidKeepCallAlive, null), /*#__PURE__*/_react.default.createElement(IosInformCallkeepCallEnd, null), /*#__PURE__*/_react.default.createElement(ClearPushWSSubscriptions, null), /*#__PURE__*/_react.default.createElement(DeviceStats, null), children);
30
31
  };
31
32
 
32
33
  // Resume/Disable video stream tracks when app goes to background/foreground
@@ -118,4 +119,37 @@ const ClearPushWSSubscriptions = () => {
118
119
  }, []);
119
120
  return null;
120
121
  };
122
+ const eventEmitter = _reactNative.NativeModules?.StreamVideoReactNative ? new _reactNative.NativeEventEmitter(_reactNative.NativeModules?.StreamVideoReactNative) : undefined;
123
+
124
+ /**
125
+ * This is a renderless component to get the device stats like thermal state and power saver mode.
126
+ */
127
+ const DeviceStats = () => {
128
+ const {
129
+ useCallCallingState
130
+ } = (0, _videoReactBindings.useCallStateHooks)();
131
+ const callingState = useCallCallingState();
132
+ (0, _react.useEffect)(() => {
133
+ if (callingState !== _videoClient.CallingState.JOINED) {
134
+ return;
135
+ }
136
+ _reactNative.NativeModules?.StreamVideoReactNative.isLowPowerModeEnabled().then(initialPowerMode => (0, _videoClient.setPowerState)(initialPowerMode));
137
+ let powerModeSubscription = eventEmitter?.addListener('isLowPowerModeEnabled', isLowPowerMode => (0, _videoClient.setPowerState)(isLowPowerMode));
138
+ _reactNative.NativeModules?.StreamVideoReactNative.currentThermalState().then(initialState => (0, _videoClient.setThermalState)(initialState));
139
+ let thermalStateSubscription = eventEmitter?.addListener('thermalStateDidChange', thermalState => (0, _videoClient.setThermalState)(thermalState));
140
+
141
+ // on android we need to explicitly start and stop the thermal status updates
142
+ if (_reactNative.Platform.OS === 'android') {
143
+ _reactNative.NativeModules?.StreamVideoReactNative.startThermalStatusUpdates();
144
+ }
145
+ return () => {
146
+ powerModeSubscription?.remove();
147
+ thermalStateSubscription?.remove();
148
+ if (_reactNative.Platform.OS === 'android') {
149
+ _reactNative.NativeModules?.StreamVideoReactNative.stopThermalStatusUpdates();
150
+ }
151
+ };
152
+ }, [callingState]);
153
+ return null;
154
+ };
121
155
  //# sourceMappingURL=StreamCall.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_videoReactBindings","require","_react","_interopRequireWildcard","_useIosCallkeepWithCallingStateEffect","_utils","_useAndroidKeepCallAliveEffect","_reactNative","_shouldDisableIOSLocalVideoOnBackground","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","StreamCall","children","createElement","StreamCallProvider","AppStateListener","AndroidKeepCallAlive","IosInformCallkeepCallEnd","ClearPushWSSubscriptions","exports","useCall","appState","useRef","AppState","currentState","useEffect","subscription","addEventListener","nextAppState","current","match","camera","state","status","Platform","OS","disable","then","enable","resume","NativeModules","StreamVideoReactNative","isInPiPMode","isInPiP","shouldDisableIOSLocalVideoOnBackgroundRef","remove","useAndroidKeepCallAliveEffect","useIosCallkeepWithCallingStateEffect","clearPushWSEventSubscriptions","canAddPushWSSubscriptionsRef"],"sourceRoot":"../../../src","sources":["providers/StreamCall.tsx"],"mappings":";;;;;;AAAA,IAAAA,mBAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,uBAAA,CAAAF,OAAA;AAEA,IAAAG,qCAAA,GAAAH,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AAIA,IAAAK,8BAAA,GAAAL,OAAA;AACA,IAAAM,YAAA,GAAAN,OAAA;AACA,IAAAO,uCAAA,GAAAP,OAAA;AAAqH,SAAAQ,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAP,wBAAAO,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AASrH;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMW,UAAU,GAAGA,CAAC;EACzBH,IAAI;EACJI;AACkC,CAAC,KAAK;EACxC,oBACE5B,MAAA,CAAAa,OAAA,CAAAgB,aAAA,CAAC/B,mBAAA,CAAAgC,kBAAkB;IAACN,IAAI,EAAEA;EAAK,gBAC7BxB,MAAA,CAAAa,OAAA,CAAAgB,aAAA,CAACE,gBAAgB,MAAE,CAAC,eACpB/B,MAAA,CAAAa,OAAA,CAAAgB,aAAA,CAACG,oBAAoB,MAAE,CAAC,eACxBhC,MAAA,CAAAa,OAAA,CAAAgB,aAAA,CAACI,wBAAwB,MAAE,CAAC,eAC5BjC,MAAA,CAAAa,OAAA,CAAAgB,aAAA,CAACK,wBAAwB,MAAE,CAAC,EAC3BN,QACiB,CAAC;AAEzB,CAAC;;AAED;AACA;AAAAO,OAAA,CAAAR,UAAA,GAAAA,UAAA;AACA,MAAMI,gBAAgB,GAAGA,CAAA,KAAM;EAC7B,MAAMP,IAAI,GAAG,IAAAY,2BAAO,EAAC,CAAC;EACtB,MAAMC,QAAQ,GAAG,IAAAC,aAAM,EAACC,qBAAQ,CAACC,YAAY,CAAC;EAC9C,IAAAC,gBAAS,EAAC,MAAM;IACd;IACA;IACA;IACA,MAAMC,YAAY,GAAGH,qBAAQ,CAACI,gBAAgB,CAAC,QAAQ,EAAGC,YAAY,IAAK;MACzE,IAAIP,QAAQ,CAACQ,OAAO,CAACC,KAAK,CAAC,YAAY,CAAC,IAAIF,YAAY,KAAK,QAAQ,EAAE;QACrE,IACEpB,IAAI,EAAEuB,MAAM,EAAEC,KAAK,CAACC,MAAM,KAAK,SAAS,IACxCC,qBAAQ,CAACC,EAAE,KAAK,SAAS,EACzB;UACA;UACA;UACA3B,IAAI,EAAEuB,MAAM,EAAEK,OAAO,CAAC,IAAI,CAAC,CAACC,IAAI,CAAC,MAAM;YACrC7B,IAAI,EAAEuB,MAAM,EAAEO,MAAM,CAAC,CAAC;UACxB,CAAC,CAAC;QACJ,CAAC,MAAM;UACL9B,IAAI,EAAEuB,MAAM,EAAEQ,MAAM,CAAC,CAAC;QACxB;QACAlB,QAAQ,CAACQ,OAAO,GAAGD,YAAY;MACjC,CAAC,MAAM,IACLP,QAAQ,CAACQ,OAAO,KAAK,QAAQ,IAC7BD,YAAY,CAACE,KAAK,CAAC,YAAY,CAAC,EAChC;QACA,IAAII,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;UAC7B;UACA;UACAK,0BAAa,EAAEC,sBAAsB,EAAEC,WAAW,CAAC,CAAC,CAACL,IAAI,CACtDM,OAAmC,IAAK;YACvC,IAAI,CAACA,OAAO,EAAE;cACZ,IAAIpB,qBAAQ,CAACC,YAAY,KAAK,QAAQ,EAAE;gBACtC;gBACA;gBACA;gBACA;cACF;cACA,IAAIhB,IAAI,EAAEuB,MAAM,EAAEC,KAAK,CAACC,MAAM,KAAK,SAAS,EAAE;gBAC5CzB,IAAI,EAAEuB,MAAM,EAAEK,OAAO,CAAC,CAAC;cACzB;YACF;UACF,CACF,CAAC;QACH,CAAC,MAAM;UACL;UACA,IAAIQ,iFAAyC,CAACf,OAAO,EAAE;YACrD,IAAIrB,IAAI,EAAEuB,MAAM,EAAEC,KAAK,CAACC,MAAM,KAAK,SAAS,EAAE;cAC5CzB,IAAI,EAAEuB,MAAM,EAAEK,OAAO,CAAC,CAAC;YACzB;UACF;QACF;QACAf,QAAQ,CAACQ,OAAO,GAAGD,YAAY;MACjC;IACF,CAAC,CAAC;IAEF,OAAO,MAAM;MACXF,YAAY,CAACmB,MAAM,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACrC,IAAI,CAAC,CAAC;EAEV,OAAO,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAMQ,oBAAoB,GAAGA,CAAA,KAAM;EACjC,IAAA8B,4DAA6B,EAAC,CAAC;EAC/B,OAAO,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM7B,wBAAwB,GAAGA,CAAA,KAAM;EACrC,IAAA8B,0EAAoC,EAAC,CAAC;EACtC,OAAO,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM7B,wBAAwB,GAAGA,CAAA,KAAM;EACrC,IAAAO,gBAAS,EAAC,MAAM;IACd,IAAAuB,oCAA6B,EAAC,CAAC;IAC/BC,mCAA4B,CAACpB,OAAO,GAAG,KAAK;IAC5C,OAAO,MAAM;MACXoB,mCAA4B,CAACpB,OAAO,GAAG,IAAI;IAC7C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EACN,OAAO,IAAI;AACb,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_videoReactBindings","require","_react","_interopRequireWildcard","_videoClient","_useIosCallkeepWithCallingStateEffect","_utils","_useAndroidKeepCallAliveEffect","_reactNative","_shouldDisableIOSLocalVideoOnBackground","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","StreamCall","children","createElement","StreamCallProvider","AppStateListener","AndroidKeepCallAlive","IosInformCallkeepCallEnd","ClearPushWSSubscriptions","DeviceStats","exports","useCall","appState","useRef","AppState","currentState","useEffect","subscription","addEventListener","nextAppState","current","match","camera","state","status","Platform","OS","disable","then","enable","resume","NativeModules","StreamVideoReactNative","isInPiPMode","isInPiP","shouldDisableIOSLocalVideoOnBackgroundRef","remove","useAndroidKeepCallAliveEffect","useIosCallkeepWithCallingStateEffect","clearPushWSEventSubscriptions","canAddPushWSSubscriptionsRef","eventEmitter","NativeEventEmitter","undefined","useCallCallingState","useCallStateHooks","callingState","CallingState","JOINED","isLowPowerModeEnabled","initialPowerMode","setPowerState","powerModeSubscription","addListener","isLowPowerMode","currentThermalState","initialState","setThermalState","thermalStateSubscription","thermalState","startThermalStatusUpdates","stopThermalStatusUpdates"],"sourceRoot":"../../../src","sources":["providers/StreamCall.tsx"],"mappings":"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","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.4.22';
7
+ const version = exports.version = '1.5.0';
8
8
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["version","exports"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":";;;;;;AAAO,MAAMA,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG,QAAQ","ignoreList":[]}
1
+ {"version":3,"names":["version","exports"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":";;;;;;AAAO,MAAMA,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG,OAAO","ignoreList":[]}
@@ -1,9 +1,10 @@
1
- import { StreamCallProvider, useCall } from '@stream-io/video-react-bindings';
1
+ import { StreamCallProvider, useCall, useCallStateHooks } from '@stream-io/video-react-bindings';
2
2
  import React, { useEffect, useRef } from 'react';
3
+ import { CallingState, setThermalState, setPowerState } from '@stream-io/video-client';
3
4
  import { useIosCallkeepWithCallingStateEffect } from '../hooks/push/useIosCallkeepWithCallingStateEffect';
4
5
  import { canAddPushWSSubscriptionsRef, clearPushWSEventSubscriptions } from '../utils/push/internal/utils';
5
6
  import { useAndroidKeepCallAliveEffect } from '../hooks/useAndroidKeepCallAliveEffect';
6
- import { AppState, NativeModules, Platform } from 'react-native';
7
+ import { AppState, NativeModules, Platform, NativeEventEmitter } from 'react-native';
7
8
  import { shouldDisableIOSLocalVideoOnBackgroundRef } from '../utils/internal/shouldDisableIOSLocalVideoOnBackground';
8
9
  /**
9
10
  * StreamCall is a wrapper component that orchestrates the call life cycle logic and
@@ -18,7 +19,7 @@ export const StreamCall = ({
18
19
  }) => {
19
20
  return /*#__PURE__*/React.createElement(StreamCallProvider, {
20
21
  call: call
21
- }, /*#__PURE__*/React.createElement(AppStateListener, null), /*#__PURE__*/React.createElement(AndroidKeepCallAlive, null), /*#__PURE__*/React.createElement(IosInformCallkeepCallEnd, null), /*#__PURE__*/React.createElement(ClearPushWSSubscriptions, null), children);
22
+ }, /*#__PURE__*/React.createElement(AppStateListener, null), /*#__PURE__*/React.createElement(AndroidKeepCallAlive, null), /*#__PURE__*/React.createElement(IosInformCallkeepCallEnd, null), /*#__PURE__*/React.createElement(ClearPushWSSubscriptions, null), /*#__PURE__*/React.createElement(DeviceStats, null), children);
22
23
  };
23
24
 
24
25
  // Resume/Disable video stream tracks when app goes to background/foreground
@@ -109,4 +110,37 @@ const ClearPushWSSubscriptions = () => {
109
110
  }, []);
110
111
  return null;
111
112
  };
113
+ const eventEmitter = NativeModules?.StreamVideoReactNative ? new NativeEventEmitter(NativeModules?.StreamVideoReactNative) : undefined;
114
+
115
+ /**
116
+ * This is a renderless component to get the device stats like thermal state and power saver mode.
117
+ */
118
+ const DeviceStats = () => {
119
+ const {
120
+ useCallCallingState
121
+ } = useCallStateHooks();
122
+ const callingState = useCallCallingState();
123
+ useEffect(() => {
124
+ if (callingState !== CallingState.JOINED) {
125
+ return;
126
+ }
127
+ NativeModules?.StreamVideoReactNative.isLowPowerModeEnabled().then(initialPowerMode => setPowerState(initialPowerMode));
128
+ let powerModeSubscription = eventEmitter?.addListener('isLowPowerModeEnabled', isLowPowerMode => setPowerState(isLowPowerMode));
129
+ NativeModules?.StreamVideoReactNative.currentThermalState().then(initialState => setThermalState(initialState));
130
+ let thermalStateSubscription = eventEmitter?.addListener('thermalStateDidChange', thermalState => setThermalState(thermalState));
131
+
132
+ // on android we need to explicitly start and stop the thermal status updates
133
+ if (Platform.OS === 'android') {
134
+ NativeModules?.StreamVideoReactNative.startThermalStatusUpdates();
135
+ }
136
+ return () => {
137
+ powerModeSubscription?.remove();
138
+ thermalStateSubscription?.remove();
139
+ if (Platform.OS === 'android') {
140
+ NativeModules?.StreamVideoReactNative.stopThermalStatusUpdates();
141
+ }
142
+ };
143
+ }, [callingState]);
144
+ return null;
145
+ };
112
146
  //# sourceMappingURL=StreamCall.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["StreamCallProvider","useCall","React","useEffect","useRef","useIosCallkeepWithCallingStateEffect","canAddPushWSSubscriptionsRef","clearPushWSEventSubscriptions","useAndroidKeepCallAliveEffect","AppState","NativeModules","Platform","shouldDisableIOSLocalVideoOnBackgroundRef","StreamCall","call","children","createElement","AppStateListener","AndroidKeepCallAlive","IosInformCallkeepCallEnd","ClearPushWSSubscriptions","appState","currentState","subscription","addEventListener","nextAppState","current","match","camera","state","status","OS","disable","then","enable","resume","StreamVideoReactNative","isInPiPMode","isInPiP","remove"],"sourceRoot":"../../../src","sources":["providers/StreamCall.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["StreamCallProvider","useCall","useCallStateHooks","React","useEffect","useRef","CallingState","setThermalState","setPowerState","useIosCallkeepWithCallingStateEffect","canAddPushWSSubscriptionsRef","clearPushWSEventSubscriptions","useAndroidKeepCallAliveEffect","AppState","NativeModules","Platform","NativeEventEmitter","shouldDisableIOSLocalVideoOnBackgroundRef","StreamCall","call","children","createElement","AppStateListener","AndroidKeepCallAlive","IosInformCallkeepCallEnd","ClearPushWSSubscriptions","DeviceStats","appState","currentState","subscription","addEventListener","nextAppState","current","match","camera","state","status","OS","disable","then","enable","resume","StreamVideoReactNative","isInPiPMode","isInPiP","remove","eventEmitter","undefined","useCallCallingState","callingState","JOINED","isLowPowerModeEnabled","initialPowerMode","powerModeSubscription","addListener","isLowPowerMode","currentThermalState","initialState","thermalStateSubscription","thermalState","startThermalStatusUpdates","stopThermalStatusUpdates"],"sourceRoot":"../../../src","sources":["providers/StreamCall.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- export const version = '1.4.22';
1
+ export const version = '1.5.0';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["version"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":"AAAA,OAAO,MAAMA,OAAO,GAAG,QAAQ","ignoreList":[]}
1
+ {"version":3,"names":["version"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":"AAAA,OAAO,MAAMA,OAAO,GAAG,OAAO","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"StreamCall.d.ts","sourceRoot":"","sources":["../../../src/providers/StreamCall.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAqB,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAU/C,MAAM,MAAM,eAAe,GAAG;IAC5B;;;OAGG;IACH,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AACF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,wBAGpB,iBAAiB,CAAC,eAAe,CAAC,sBAUpC,CAAC"}
1
+ {"version":3,"file":"StreamCall.d.ts","sourceRoot":"","sources":["../../../src/providers/StreamCall.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAqB,MAAM,OAAO,CAAC;AACpE,OAAO,EACL,IAAI,EAIL,MAAM,yBAAyB,CAAC;AAejC,MAAM,MAAM,eAAe,GAAG;IAC5B;;;OAGG;IACH,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AACF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,wBAGpB,iBAAiB,CAAC,eAAe,CAAC,sBAWpC,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const version = "1.4.22";
1
+ export declare const version = "1.5.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -17,7 +17,7 @@ void broadcastNotificationCallback(CFNotificationCenterRef center,
17
17
  StreamVideoReactNative *this = (__bridge StreamVideoReactNative*)observer;
18
18
  NSString *eventName = (__bridge NSString*)name;
19
19
  [this screenShareEventReceived: eventName];
20
-
20
+
21
21
  }
22
22
 
23
23
  @implementation StreamVideoReactNative
@@ -44,10 +44,21 @@ RCT_EXPORT_MODULE();
44
44
  _notificationCenter = CFNotificationCenterGetDarwinNotifyCenter();
45
45
  [self setupObserver];
46
46
  }
47
-
47
+ if (self) {
48
+ [UIDevice currentDevice].batteryMonitoringEnabled = YES;
49
+ }
50
+
48
51
  return self;
49
52
  }
50
53
 
54
+ RCT_EXPORT_METHOD(isLowPowerModeEnabled:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
55
+ resolve(@([NSProcessInfo processInfo].lowPowerModeEnabled));
56
+ }
57
+
58
+ RCT_EXPORT_METHOD(currentThermalState:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
59
+ resolve(@([NSProcessInfo processInfo].thermalState));
60
+ }
61
+
51
62
  -(void)dealloc {
52
63
  [self clearObserver];
53
64
  }
@@ -81,10 +92,40 @@ RCT_EXPORT_MODULE();
81
92
 
82
93
  -(void)startObserving {
83
94
  hasListeners = YES;
95
+ [[NSNotificationCenter defaultCenter] addObserver:self
96
+ selector:@selector(powerModeDidChange)
97
+ name:NSProcessInfoPowerStateDidChangeNotification
98
+ object:nil];
99
+ [[NSNotificationCenter defaultCenter] addObserver:self
100
+ selector:@selector(thermalStateDidChange)
101
+ name:NSProcessInfoThermalStateDidChangeNotification
102
+ object:nil];
84
103
  }
85
104
 
86
105
  -(void)stopObserving {
87
106
  hasListeners = NO;
107
+ [[NSNotificationCenter defaultCenter] removeObserver:self
108
+ name:NSProcessInfoPowerStateDidChangeNotification
109
+ object:nil];
110
+ [[NSNotificationCenter defaultCenter] removeObserver:self
111
+ name:NSProcessInfoThermalStateDidChangeNotification
112
+ object:nil];
113
+ }
114
+
115
+ - (void)powerModeDidChange {
116
+ if (!hasListeners) {
117
+ return;
118
+ }
119
+ BOOL lowPowerEnabled = [NSProcessInfo processInfo].lowPowerModeEnabled;
120
+ [self sendEventWithName:@"isLowPowerModeEnabled" body:@(lowPowerEnabled)];
121
+ }
122
+
123
+ - (void)thermalStateDidChange {
124
+ if (!hasListeners) {
125
+ return;
126
+ }
127
+ NSInteger thermalState = [NSProcessInfo processInfo].thermalState;
128
+ [self sendEventWithName:@"thermalStateDidChange" body:@(thermalState)];
88
129
  }
89
130
 
90
131
  -(void)screenShareEventReceived:(NSString*)event {
@@ -113,11 +154,11 @@ RCT_EXPORT_METHOD(getIncomingCallUUid:(NSString *)cid
113
154
  } else {
114
155
  reject(@"access_failure", @"requested incoming call found", nil);
115
156
  }
116
-
157
+
117
158
  }
118
159
 
119
160
  -(NSArray<NSString *> *)supportedEvents {
120
- return @[@"StreamVideoReactNative_Ios_Screenshare_Event"];
161
+ return @[@"StreamVideoReactNative_Ios_Screenshare_Event", @"isLowPowerModeEnabled", @"thermalStateDidChange"];
121
162
  }
122
163
 
123
164
  @end
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stream-io/video-react-native-sdk",
3
- "version": "1.4.22",
3
+ "version": "1.5.0",
4
4
  "packageManager": "yarn@3.2.4",
5
5
  "main": "dist/commonjs/index.js",
6
6
  "module": "dist/module/index.js",
@@ -46,8 +46,8 @@
46
46
  "!**/.*"
47
47
  ],
48
48
  "dependencies": {
49
- "@stream-io/video-client": "1.12.4",
50
- "@stream-io/video-react-bindings": "1.2.14",
49
+ "@stream-io/video-client": "1.13.0",
50
+ "@stream-io/video-react-bindings": "1.2.15",
51
51
  "intl-pluralrules": "2.0.1",
52
52
  "lodash.merge": "^4.6.2",
53
53
  "react-native-url-polyfill": "1.3.0",
@@ -1,13 +1,27 @@
1
- import { StreamCallProvider, useCall } from '@stream-io/video-react-bindings';
1
+ import {
2
+ StreamCallProvider,
3
+ useCall,
4
+ useCallStateHooks,
5
+ } from '@stream-io/video-react-bindings';
2
6
  import React, { PropsWithChildren, useEffect, useRef } from 'react';
3
- import { Call } from '@stream-io/video-client';
7
+ import {
8
+ Call,
9
+ CallingState,
10
+ setThermalState,
11
+ setPowerState,
12
+ } from '@stream-io/video-client';
4
13
  import { useIosCallkeepWithCallingStateEffect } from '../hooks/push/useIosCallkeepWithCallingStateEffect';
5
14
  import {
6
15
  canAddPushWSSubscriptionsRef,
7
16
  clearPushWSEventSubscriptions,
8
17
  } from '../utils/push/internal/utils';
9
18
  import { useAndroidKeepCallAliveEffect } from '../hooks/useAndroidKeepCallAliveEffect';
10
- import { AppState, NativeModules, Platform } from 'react-native';
19
+ import {
20
+ AppState,
21
+ NativeModules,
22
+ Platform,
23
+ NativeEventEmitter,
24
+ } from 'react-native';
11
25
  import { shouldDisableIOSLocalVideoOnBackgroundRef } from '../utils/internal/shouldDisableIOSLocalVideoOnBackground';
12
26
 
13
27
  export type StreamCallProps = {
@@ -34,6 +48,7 @@ export const StreamCall = ({
34
48
  <AndroidKeepCallAlive />
35
49
  <IosInformCallkeepCallEnd />
36
50
  <ClearPushWSSubscriptions />
51
+ <DeviceStats />
37
52
  {children}
38
53
  </StreamCallProvider>
39
54
  );
@@ -137,3 +152,54 @@ const ClearPushWSSubscriptions = () => {
137
152
  }, []);
138
153
  return null;
139
154
  };
155
+
156
+ const eventEmitter = NativeModules?.StreamVideoReactNative
157
+ ? new NativeEventEmitter(NativeModules?.StreamVideoReactNative)
158
+ : undefined;
159
+
160
+ /**
161
+ * This is a renderless component to get the device stats like thermal state and power saver mode.
162
+ */
163
+ const DeviceStats = () => {
164
+ const { useCallCallingState } = useCallStateHooks();
165
+ const callingState = useCallCallingState();
166
+
167
+ useEffect(() => {
168
+ if (callingState !== CallingState.JOINED) {
169
+ return;
170
+ }
171
+
172
+ NativeModules?.StreamVideoReactNative.isLowPowerModeEnabled().then(
173
+ (initialPowerMode: boolean) => setPowerState(initialPowerMode)
174
+ );
175
+
176
+ let powerModeSubscription = eventEmitter?.addListener(
177
+ 'isLowPowerModeEnabled',
178
+ (isLowPowerMode: boolean) => setPowerState(isLowPowerMode)
179
+ );
180
+
181
+ NativeModules?.StreamVideoReactNative.currentThermalState().then(
182
+ (initialState: string) => setThermalState(initialState)
183
+ );
184
+
185
+ let thermalStateSubscription = eventEmitter?.addListener(
186
+ 'thermalStateDidChange',
187
+ (thermalState: string) => setThermalState(thermalState)
188
+ );
189
+
190
+ // on android we need to explicitly start and stop the thermal status updates
191
+ if (Platform.OS === 'android') {
192
+ NativeModules?.StreamVideoReactNative.startThermalStatusUpdates();
193
+ }
194
+
195
+ return () => {
196
+ powerModeSubscription?.remove();
197
+ thermalStateSubscription?.remove();
198
+ if (Platform.OS === 'android') {
199
+ NativeModules?.StreamVideoReactNative.stopThermalStatusUpdates();
200
+ }
201
+ };
202
+ }, [callingState]);
203
+
204
+ return null;
205
+ };
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '1.4.22';
1
+ export const version = '1.5.0';