@100mslive/react-native-hms 0.9.9 → 0.9.91

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 (84) hide show
  1. package/README.md +50 -43
  2. package/android/.gradle/6.9/fileHashes/fileHashes.bin +0 -0
  3. package/android/.gradle/6.9/fileHashes/fileHashes.lock +0 -0
  4. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  5. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  6. package/android/.gradle/checksums/checksums.lock +0 -0
  7. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  8. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  9. package/android/.idea/libraries/{Gradle__com_github_100mslive_android_sdk_lib_2_4_2_aar.xml → Gradle__com_github_100mslive_android_sdk_lib_2_4_7_aar.xml} +4 -4
  10. package/android/.idea/libraries/Gradle__com_github_100mslive_webrtc_m97_hms_1_1_aar.xml +11 -0
  11. package/android/.idea/modules/android.androidTest.iml +4 -4
  12. package/android/.idea/modules/android.main.iml +4 -4
  13. package/android/.idea/modules/android.unitTest.iml +4 -4
  14. package/android/build.gradle +2 -2
  15. package/android/src/main/java/com/reactnativehmssdk/HMSAudioshareActivity.kt +84 -0
  16. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +77 -8
  17. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +95 -22
  18. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +86 -0
  19. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +255 -34
  20. package/ios/HMSDecoder.swift +9 -8
  21. package/ios/HMSHelper.swift +5 -8
  22. package/ios/HMSManager.swift +5 -4
  23. package/ios/HMSRNSDK.swift +27 -32
  24. package/lib/commonjs/classes/HMSAudioDevice.js +17 -0
  25. package/lib/commonjs/classes/HMSAudioDevice.js.map +1 -0
  26. package/lib/commonjs/classes/HMSAudioMixingMode.js +15 -0
  27. package/lib/commonjs/classes/HMSAudioMixingMode.js.map +1 -0
  28. package/lib/commonjs/classes/HMSAudioMode.js +17 -0
  29. package/lib/commonjs/classes/HMSAudioMode.js.map +1 -0
  30. package/lib/commonjs/classes/HMSEncoder.js +15 -0
  31. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  32. package/lib/commonjs/classes/HMSException.js +18 -13
  33. package/lib/commonjs/classes/HMSException.js.map +1 -1
  34. package/lib/commonjs/classes/HMSHLSConfig.js.map +1 -1
  35. package/lib/commonjs/classes/HMSPermissions.js +7 -4
  36. package/lib/commonjs/classes/HMSPermissions.js.map +1 -1
  37. package/lib/commonjs/classes/HMSSDK.js +184 -9
  38. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  39. package/lib/commonjs/classes/HMSUpdateListenerActions.js +1 -0
  40. package/lib/commonjs/classes/HMSUpdateListenerActions.js.map +1 -1
  41. package/lib/commonjs/index.js +42 -0
  42. package/lib/commonjs/index.js.map +1 -1
  43. package/lib/module/classes/HMSAudioDevice.js +10 -0
  44. package/lib/module/classes/HMSAudioDevice.js.map +1 -0
  45. package/lib/module/classes/HMSAudioMixingMode.js +8 -0
  46. package/lib/module/classes/HMSAudioMixingMode.js.map +1 -0
  47. package/lib/module/classes/HMSAudioMode.js +10 -0
  48. package/lib/module/classes/HMSAudioMode.js.map +1 -0
  49. package/lib/module/classes/HMSEncoder.js +14 -0
  50. package/lib/module/classes/HMSEncoder.js.map +1 -1
  51. package/lib/module/classes/HMSException.js +18 -13
  52. package/lib/module/classes/HMSException.js.map +1 -1
  53. package/lib/module/classes/HMSHLSConfig.js.map +1 -1
  54. package/lib/module/classes/HMSPermissions.js +7 -4
  55. package/lib/module/classes/HMSPermissions.js.map +1 -1
  56. package/lib/module/classes/HMSSDK.js +184 -9
  57. package/lib/module/classes/HMSSDK.js.map +1 -1
  58. package/lib/module/classes/HMSUpdateListenerActions.js +1 -0
  59. package/lib/module/classes/HMSUpdateListenerActions.js.map +1 -1
  60. package/lib/module/index.js +3 -0
  61. package/lib/module/index.js.map +1 -1
  62. package/lib/typescript/classes/HMSAudioDevice.d.ts +7 -0
  63. package/lib/typescript/classes/HMSAudioMixingMode.d.ts +5 -0
  64. package/lib/typescript/classes/HMSAudioMode.d.ts +7 -0
  65. package/lib/typescript/classes/HMSEncoder.d.ts +2 -0
  66. package/lib/typescript/classes/HMSException.d.ts +8 -14
  67. package/lib/typescript/classes/HMSHLSConfig.d.ts +2 -2
  68. package/lib/typescript/classes/HMSPermissions.d.ts +6 -4
  69. package/lib/typescript/classes/HMSSDK.d.ts +105 -7
  70. package/lib/typescript/classes/HMSUpdateListenerActions.d.ts +2 -1
  71. package/lib/typescript/index.d.ts +3 -0
  72. package/package.json +1 -1
  73. package/react-native-hms.podspec +1 -1
  74. package/src/classes/HMSAudioDevice.ts +7 -0
  75. package/src/classes/HMSAudioMixingMode.ts +5 -0
  76. package/src/classes/HMSAudioMode.ts +7 -0
  77. package/src/classes/HMSEncoder.ts +12 -0
  78. package/src/classes/HMSException.ts +15 -24
  79. package/src/classes/HMSHLSConfig.ts +2 -2
  80. package/src/classes/HMSPermissions.ts +9 -6
  81. package/src/classes/HMSSDK.tsx +250 -16
  82. package/src/classes/HMSUpdateListenerActions.ts +1 -0
  83. package/src/index.ts +3 -0
  84. package/android/.idea/libraries/Gradle__com_github_100mslive_webrtc_m97_aar.xml +0 -11
package/README.md CHANGED
@@ -70,7 +70,7 @@ You will also need to request Camera and Record Audio permissions at runtime bef
70
70
 
71
71
  We suggest using [react-native-permission](https://www.npmjs.com/package/react-native-permissions) to acquire permissions from both platforms.
72
72
 
73
- ## QuickStart
73
+ ## [QuickStart](https://www.100ms.live/docs/react-native/v2/guides/quickstart)
74
74
 
75
75
  The package exports all the classes and a HMSSDK class that manages everything.
76
76
 
@@ -88,7 +88,7 @@ const hmsInstance = await HMSSDK.build();
88
88
  ...
89
89
  ```
90
90
 
91
- ## Add event listeners
91
+ ## [Add event listeners](https://www.100ms.live/docs/react-native/v2/features/event-listeners)
92
92
 
93
93
  add event listeners for all the events such as onPreview, onJoin, onPeerUpdate etc. the actions can be found in HMSUpdateListenerActions class
94
94
 
@@ -107,7 +107,7 @@ hmsInstance.addEventListener(
107
107
 
108
108
  The event handlers are the way of handling any update happening in hms all events can be found in HMSUpdateListenerActions class
109
109
 
110
- ## Error handling
110
+ ## [Error handling](https://www.100ms.live/docs/react-native/v2/features/error-handling)
111
111
 
112
112
  ```js
113
113
  import { HMSUpdateListenerActions } from '@100mslive/react-native-hms';
@@ -116,7 +116,7 @@ import { HMSUpdateListenerActions } from '@100mslive/react-native-hms';
116
116
  hmsInstance.addEventListener(HMSUpdateListenerActions.ON_ERROR, onError);
117
117
  ```
118
118
 
119
- ## Join the room
119
+ ## [Join the room](https://www.100ms.live/docs/react-native/v2/features/join)
120
120
 
121
121
  Joining the room connects you to the remote peer and broadcasts your stream to other peers, we need instance of HMSConfig in order to pass the details of room and user to join function
122
122
 
@@ -178,7 +178,7 @@ remotePeers.map((remotePeer: HMSRemotePeer) => {
178
178
  ...
179
179
  ```
180
180
 
181
- ## Display a video in HmsView
181
+ ## [Display a video in HmsView](https://www.100ms.live/docs/react-native/v2/features/render-video)
182
182
 
183
183
  ```js
184
184
  import { HMSVideoViewMode } from '@100mslive/react-native-hms';
@@ -201,7 +201,7 @@ const styles = StyleSheet.create({
201
201
  ...
202
202
  ```
203
203
 
204
- ## Mute/Unmute others
204
+ ## [Mute/Unmute others](https://www.100ms.live/docs/react-native/v2/features/change-track-state)
205
205
 
206
206
  ```js
207
207
  const mute: boolean = true;
@@ -211,21 +211,21 @@ hmsInstance?.changeTrackState(videoTrack as HMSTrack, mute);
211
211
 
212
212
  const unmute: boolean = false;
213
213
 
214
- hmsInstance?.changeTrackState(audioTrack as HMSTrack, unmute);
215
- hmsInstance?.changeTrackState(videoTrack as HMSTrack, unmute);
214
+ await hmsInstance?.changeTrackState(audioTrack as HMSTrack, unmute);
215
+ await hmsInstance?.changeTrackState(videoTrack as HMSTrack, unmute);
216
216
  ```
217
217
 
218
- ## End Room for all
218
+ ## [End Room for all](https://www.100ms.live/docs/react-native/v2/features/end-room)
219
219
 
220
220
  ```js
221
221
  const reason = 'Host ended the room';
222
222
  const lock = false; // optional parameter
223
223
 
224
224
  // hms instance acquired by build method
225
- hmsInstance.endRoom(reason, lock);
225
+ await hmsInstance.endRoom(reason, lock);
226
226
  ```
227
227
 
228
- ## Remove Peer
228
+ ## [Remove Peer](https://www.100ms.live/docs/react-native/v2/features/remove-peer)
229
229
 
230
230
  ```js
231
231
  import { HMSPeer } from '@100mslive/react-native-hms';
@@ -235,10 +235,10 @@ const reason = 'removed from room';
235
235
  // hms instance acquired by build method
236
236
  const peer: HMSPeer = hmsInstance?.remotePeers[0];
237
237
 
238
- hmsInstance.removePeer(peer, reason);
238
+ await hmsInstance.removePeer(peer, reason);
239
239
  ```
240
240
 
241
- ## Sending messages
241
+ ## [Sending messages](https://www.100ms.live/docs/react-native/v2/features/chat)
242
242
 
243
243
  ```js
244
244
  import { HMSRole, HMSPeer } from '@100mslive/react-native-hms';
@@ -249,12 +249,12 @@ const roles: HMSRole[] = hmsInstance?.knownRoles
249
249
  const peer: HMSPeer = hmsInstance?.remotePeers[0]
250
250
 
251
251
  // send a different type of messages
252
- hmsInstance?.sendBroadcastMessage(message);
253
- hmsInstance?.sendGroupMessage(message, [role[0]);
254
- hmsInstance?.sendDirectMessage(message, peer);
252
+ await hmsInstance?.sendBroadcastMessage(message);
253
+ await hmsInstance?.sendGroupMessage(message, [role[0]);
254
+ await hmsInstance?.sendDirectMessage(message, peer);
255
255
  ```
256
256
 
257
- ## Role Change
257
+ ## [Role Change](https://www.100ms.live/docs/react-native/v2/features/change-role)
258
258
 
259
259
  ```js
260
260
  import { HMSRole, HMSRemotePeer } from '@100mslive/react-native-hms';
@@ -267,18 +267,18 @@ const peer: HMSRemotePeer = hmsInstance?.remotePeers[0];
267
267
 
268
268
  const force = false;
269
269
 
270
- hmsInstance.changeRole(peer, newRole, force); // request role change
271
- hmsInstance.changeRole(peer, newRole, !force); // force role change
270
+ await hmsInstance.changeRole(peer, newRole, force); // request role change
271
+ await hmsInstance.changeRole(peer, newRole, !force); // force role change
272
272
  ```
273
273
 
274
- ## Raise Hand & BRB
274
+ ## [Raise Hand & BRB](https://www.100ms.live/docs/react-native/v2/advanced-features/change-metadata)
275
275
 
276
276
  ```js
277
277
  const parsedMetadata = JSON.parse(hmsInstance?.localPeer?.metadata);
278
278
 
279
279
  // Raise Hand
280
280
  // hms instance acquired by build method
281
- hmsInstance?.changeMetadata(
281
+ await hmsInstance?.changeMetadata(
282
282
  JSON.stringify({
283
283
  ...parsedMetadata,
284
284
  isHandRaised: true,
@@ -287,7 +287,7 @@ hmsInstance?.changeMetadata(
287
287
 
288
288
  // BRB
289
289
  // hms instance acquired by build method
290
- hmsInstance?.changeMetadata(
290
+ await hmsInstance?.changeMetadata(
291
291
  JSON.stringify({
292
292
  ...parsedMetadata,
293
293
  isBRBOn: true,
@@ -295,7 +295,7 @@ hmsInstance?.changeMetadata(
295
295
  );
296
296
  ```
297
297
 
298
- ## HLS Streaming
298
+ ## [HLS Streaming](https://www.100ms.live/docs/react-native/v2/features/hls-streaming)
299
299
 
300
300
  ```js
301
301
  import {
@@ -304,25 +304,32 @@ import {
304
304
  } from '@100mslive/react-native-hms';
305
305
 
306
306
  const startHLSStreaming = () => {
307
+ // Default Settings
308
+ await hmsInstance.startHLSStreaming()
309
+
310
+ // Custom Settings
307
311
  const hmsHLSMeetingURLVariant = new HMSHLSMeetingURLVariant({
308
- meetingUrl:
309
- 'https://yogi.app.100ms.live/preview/nih-bkn-vek?token=beam_recording',
312
+ meetingUrl: 'https://yogi.app.100ms.live/preview/nih-bkn-vek?skip_preview=true',
310
313
  metadata: '',
311
314
  });
312
315
 
316
+ const hmsHLSRecordingConfig = new HMSHLSRecordingConfig({
317
+ singleFilePerLayer: false,
318
+ videoOnDemand: false,
319
+ });
320
+
313
321
  const hmsHLSConfig = new HMSHLSConfig({
322
+ hlsRecordingConfig: hmsHLSRecordingConfig,
314
323
  meetingURLVariants: [hlsStreamingDetails],
315
324
  });
316
325
 
317
- // hms instance acquired by build method
318
- hmsInstance
319
- .startHLSStreaming(hmsHLSConfig)
320
- .then((r) => console.log(r))
321
- .catch((e) => console.log(e));
326
+ await hmsInstance.startHLSStreaming(hmsHLSConfig)
327
+ .then(d => console.log('Start Hls Success: ', d))
328
+ .catch(e => console.log('Start Hls Error: ', e));
322
329
  };
323
330
  ```
324
331
 
325
- ## Start Streaming / Recording
332
+ ## [Start Streaming / Recording](https://www.100ms.live/docs/react-native/v2/features/recording)
326
333
 
327
334
  ```js
328
335
  import { HMSRTMPConfig } from '@100mslive/react-native-hms';
@@ -344,24 +351,24 @@ const recordingDetails = HMSRTMPConfig({
344
351
  });
345
352
 
346
353
  // hms instance acquired by build method
347
- const result = await hmsInstance?.startRTMPOrRecording(recordingDetails);
354
+ await hmsInstance?.startRTMPOrRecording(recordingDetails);
348
355
  ```
349
356
 
350
- ## Get RTC Stats
357
+ ## [Get RTC Stats](https://www.100ms.live/docs/react-native/v2/features/rtc-stats)
351
358
 
352
359
  ```js
353
360
  // hms instance acquired by build method
354
361
  hmsInstance?.enableRTCStats();
355
362
  ```
356
363
 
357
- ## Screenshare
364
+ ## [Screenshare](https://www.100ms.live/docs/react-native/v2/features/screenshare)
358
365
 
359
366
  ```js
360
367
  // hms instance acquired by build method
361
- hmsInstance?.startScreenshare();
368
+ await hmsInstance?.startScreenshare();
362
369
  ```
363
370
 
364
- ## Getting Audio Levels for all speaking peers
371
+ ## [Getting Audio Levels for all speaking peers](https://www.100ms.live/docs/react-native/v2/advanced-features/show-audio-level)
365
372
 
366
373
  ```js
367
374
  import {
@@ -379,7 +386,7 @@ const onSpeaker = (data: HMSSpeaker[]) => {
379
386
  };
380
387
  ```
381
388
 
382
- ## Local mute others
389
+ ## [Local mute others](https://www.100ms.live/docs/react-native/v2/features/playback-allowed)
383
390
 
384
391
  ```js
385
392
  const remotePeer: HMSRemotePeer;
@@ -387,11 +394,11 @@ const isAudioPlaybackAllowed = remotePeer.remoteAudioTrack().setPlaybackAllowed(
387
394
  const isVideoPlaybackAllowed = remotePeer.remoteVideoTrack().setPlaybackAllowed(true);
388
395
 
389
396
  // hms instance acquired by build method
390
- hmsInstance.muteAllPeersAudio(true) // mute
391
- hmsInstance.muteAllPeersAudio(false) // unmute
397
+ hmsInstance.setPlaybackForAllAudio(true) // mute
398
+ hmsInstance.setPlaybackForAllAudio(false) // unmute
392
399
  ```
393
400
 
394
- ## Locally Set Volume
401
+ ## [Locally Set Volume](https://www.100ms.live/docs/react-native/v2/advanced-features/set-volume)
395
402
 
396
403
  ```js
397
404
  const volume: Float = 1.0;
@@ -401,16 +408,16 @@ const track: HMSTrack = remotePeer.audioTrack as HMSTrack;
401
408
  hmsInstance?.setVolume(track, volume);
402
409
  ```
403
410
 
404
- ## Change name
411
+ ## [Change name](https://www.100ms.live/docs/react-native/v2/features/change-name)
405
412
 
406
413
  ```js
407
414
  const newName: string = 'new name';
408
415
 
409
416
  // hms instance acquired by build method
410
- hmsInstance.changeName(newName);
417
+ await hmsInstance.changeName(newName);
411
418
  ```
412
419
 
413
- ## Join with specific Track Settings
420
+ ## [Join with specific Track Settings](https://www.100ms.live/docs/react-native/v2/advanced-features/track-settings)
414
421
 
415
422
  ```js
416
423
  const getTrackSettings = () => {
@@ -1,9 +1,9 @@
1
1
  <component name="libraryTable">
2
- <library name="Gradle: com.github.100mslive.android-sdk:lib:2.4.2@aar">
2
+ <library name="Gradle: com.github.100mslive.android-sdk:lib:2.4.7@aar">
3
3
  <CLASSES>
4
- <root url="jar://$USER_HOME$/.gradle/caches/transforms-3/79cc70cf64fa7ef26579d4ba072e0aeb/transformed/lib-2.4.2/jars/classes.jar!/" />
5
- <root url="file://$USER_HOME$/.gradle/caches/transforms-3/79cc70cf64fa7ef26579d4ba072e0aeb/transformed/lib-2.4.2/res" />
6
- <root url="file://$USER_HOME$/.gradle/caches/transforms-3/79cc70cf64fa7ef26579d4ba072e0aeb/transformed/lib-2.4.2/AndroidManifest.xml" />
4
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-3/5eda8611962fc3f6160e95738ded2f29/transformed/lib-2.4.7/jars/classes.jar!/" />
5
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-3/5eda8611962fc3f6160e95738ded2f29/transformed/lib-2.4.7/res" />
6
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-3/5eda8611962fc3f6160e95738ded2f29/transformed/lib-2.4.7/AndroidManifest.xml" />
7
7
  </CLASSES>
8
8
  <JAVADOC />
9
9
  <SOURCES />
@@ -0,0 +1,11 @@
1
+ <component name="libraryTable">
2
+ <library name="Gradle: com.github.100mslive:webrtc:m97-hms-1.1@aar">
3
+ <CLASSES>
4
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-3/5c14d42daa2863604d702fd4b5f380df/transformed/webrtc-m97-hms-1.1/jars/classes.jar!/" />
5
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-3/5c14d42daa2863604d702fd4b5f380df/transformed/webrtc-m97-hms-1.1/res" />
6
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-3/5c14d42daa2863604d702fd4b5f380df/transformed/webrtc-m97-hms-1.1/AndroidManifest.xml" />
7
+ </CLASSES>
8
+ <JAVADOC />
9
+ <SOURCES />
10
+ </library>
11
+ </component>
@@ -75,8 +75,8 @@
75
75
  <arg>$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar</arg>
76
76
  <arg>$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.6.10/c118700e3a33c8a0d9adc920e9dec0831171925/kotlin-stdlib-common-1.6.10.jar</arg>
77
77
  <arg>$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.facebook.fbjni/fbjni-java-only/0.2.2/de5152e6b7ce18dd242be23994e702309e66e7da/fbjni-java-only-0.2.2.jar</arg>
78
- <arg>$USER_HOME$/.gradle/caches/transforms-3/9a4a6c93885dd8432e9c3fbe24faa2f7/transformed/lib-2.4.2-api.jar</arg>
79
- <arg>$USER_HOME$/.gradle/caches/transforms-3/af1d83b39e706bf5c8171c9f1c8c569d/transformed/webrtc-m97-api.jar</arg>
78
+ <arg>$USER_HOME$/.gradle/caches/transforms-3/4a362e6d697339a1c01b7cf380bcacc1/transformed/lib-2.4.7-api.jar</arg>
79
+ <arg>$USER_HOME$/.gradle/caches/transforms-3/dcda581ceda31a81a19055e711e75c70/transformed/webrtc-m97-hms-1.1-api.jar</arg>
80
80
  <arg>$USER_HOME$/.gradle/caches/transforms-3/43630e9b70fd1a26e124ad5eff187a73/transformed/constraintlayout-2.1.3-api.jar</arg>
81
81
  <arg>$USER_HOME$/Library/Android/sdk/platforms/android-30/android.jar</arg>
82
82
  <arg>$USER_HOME$/Library/Android/sdk/build-tools/28.0.3/core-lambda-stubs.jar</arg>
@@ -193,8 +193,8 @@
193
193
  <orderEntry type="library" scope="TEST" name="Gradle: com.facebook.fresco:nativeimagefilters:2.5.0@aar" level="project" />
194
194
  <orderEntry type="library" scope="TEST" name="Gradle: com.facebook.fresco:nativeimagetranscoder:2.5.0@aar" level="project" />
195
195
  <orderEntry type="library" scope="TEST" name="Gradle: com.facebook.fresco:imagepipeline-okhttp3:2.5.0@aar" level="project" />
196
- <orderEntry type="library" scope="TEST" name="Gradle: com.github.100mslive.android-sdk:lib:2.4.2@aar" level="project" />
197
- <orderEntry type="library" scope="TEST" name="Gradle: com.github.100mslive:webrtc:m97@aar" level="project" />
196
+ <orderEntry type="library" scope="TEST" name="Gradle: com.github.100mslive.android-sdk:lib:2.4.7@aar" level="project" />
197
+ <orderEntry type="library" scope="TEST" name="Gradle: com.github.100mslive:webrtc:m97-hms-1.1@aar" level="project" />
198
198
  <orderEntry type="library" scope="TEST" name="Gradle: androidx.constraintlayout:constraintlayout:2.1.3@aar" level="project" />
199
199
  </component>
200
200
  <component name="TestModuleProperties" production-module="android.main" />
@@ -75,8 +75,8 @@
75
75
  <arg>$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar</arg>
76
76
  <arg>$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.6.10/c118700e3a33c8a0d9adc920e9dec0831171925/kotlin-stdlib-common-1.6.10.jar</arg>
77
77
  <arg>$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.facebook.fbjni/fbjni-java-only/0.2.2/de5152e6b7ce18dd242be23994e702309e66e7da/fbjni-java-only-0.2.2.jar</arg>
78
- <arg>$USER_HOME$/.gradle/caches/transforms-3/9a4a6c93885dd8432e9c3fbe24faa2f7/transformed/lib-2.4.2-api.jar</arg>
79
- <arg>$USER_HOME$/.gradle/caches/transforms-3/af1d83b39e706bf5c8171c9f1c8c569d/transformed/webrtc-m97-api.jar</arg>
78
+ <arg>$USER_HOME$/.gradle/caches/transforms-3/4a362e6d697339a1c01b7cf380bcacc1/transformed/lib-2.4.7-api.jar</arg>
79
+ <arg>$USER_HOME$/.gradle/caches/transforms-3/dcda581ceda31a81a19055e711e75c70/transformed/webrtc-m97-hms-1.1-api.jar</arg>
80
80
  <arg>$USER_HOME$/.gradle/caches/transforms-3/43630e9b70fd1a26e124ad5eff187a73/transformed/constraintlayout-2.1.3-api.jar</arg>
81
81
  <arg>$USER_HOME$/Library/Android/sdk/platforms/android-30/android.jar</arg>
82
82
  <arg>$USER_HOME$/Library/Android/sdk/build-tools/28.0.3/core-lambda-stubs.jar</arg>
@@ -189,8 +189,8 @@
189
189
  <orderEntry type="library" name="Gradle: com.facebook.fresco:nativeimagefilters:2.5.0@aar" level="project" />
190
190
  <orderEntry type="library" name="Gradle: com.facebook.fresco:nativeimagetranscoder:2.5.0@aar" level="project" />
191
191
  <orderEntry type="library" name="Gradle: com.facebook.fresco:imagepipeline-okhttp3:2.5.0@aar" level="project" />
192
- <orderEntry type="library" name="Gradle: com.github.100mslive.android-sdk:lib:2.4.2@aar" level="project" />
193
- <orderEntry type="library" name="Gradle: com.github.100mslive:webrtc:m97@aar" level="project" />
192
+ <orderEntry type="library" name="Gradle: com.github.100mslive.android-sdk:lib:2.4.7@aar" level="project" />
193
+ <orderEntry type="library" name="Gradle: com.github.100mslive:webrtc:m97-hms-1.1@aar" level="project" />
194
194
  <orderEntry type="library" name="Gradle: androidx.constraintlayout:constraintlayout:2.1.3@aar" level="project" />
195
195
  </component>
196
196
  </module>
@@ -75,8 +75,8 @@
75
75
  <arg>$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar</arg>
76
76
  <arg>$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.6.10/c118700e3a33c8a0d9adc920e9dec0831171925/kotlin-stdlib-common-1.6.10.jar</arg>
77
77
  <arg>$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.facebook.fbjni/fbjni-java-only/0.2.2/de5152e6b7ce18dd242be23994e702309e66e7da/fbjni-java-only-0.2.2.jar</arg>
78
- <arg>$USER_HOME$/.gradle/caches/transforms-3/9a4a6c93885dd8432e9c3fbe24faa2f7/transformed/lib-2.4.2-api.jar</arg>
79
- <arg>$USER_HOME$/.gradle/caches/transforms-3/af1d83b39e706bf5c8171c9f1c8c569d/transformed/webrtc-m97-api.jar</arg>
78
+ <arg>$USER_HOME$/.gradle/caches/transforms-3/4a362e6d697339a1c01b7cf380bcacc1/transformed/lib-2.4.7-api.jar</arg>
79
+ <arg>$USER_HOME$/.gradle/caches/transforms-3/dcda581ceda31a81a19055e711e75c70/transformed/webrtc-m97-hms-1.1-api.jar</arg>
80
80
  <arg>$USER_HOME$/.gradle/caches/transforms-3/43630e9b70fd1a26e124ad5eff187a73/transformed/constraintlayout-2.1.3-api.jar</arg>
81
81
  <arg>$USER_HOME$/Library/Android/sdk/platforms/android-30/android.jar</arg>
82
82
  <arg>$USER_HOME$/Library/Android/sdk/build-tools/28.0.3/core-lambda-stubs.jar</arg>
@@ -187,8 +187,8 @@
187
187
  <orderEntry type="library" scope="TEST" name="Gradle: com.facebook.fresco:nativeimagefilters:2.5.0@aar" level="project" />
188
188
  <orderEntry type="library" scope="TEST" name="Gradle: com.facebook.fresco:nativeimagetranscoder:2.5.0@aar" level="project" />
189
189
  <orderEntry type="library" scope="TEST" name="Gradle: com.facebook.fresco:imagepipeline-okhttp3:2.5.0@aar" level="project" />
190
- <orderEntry type="library" scope="TEST" name="Gradle: com.github.100mslive.android-sdk:lib:2.4.2@aar" level="project" />
191
- <orderEntry type="library" scope="TEST" name="Gradle: com.github.100mslive:webrtc:m97@aar" level="project" />
190
+ <orderEntry type="library" scope="TEST" name="Gradle: com.github.100mslive.android-sdk:lib:2.4.7@aar" level="project" />
191
+ <orderEntry type="library" scope="TEST" name="Gradle: com.github.100mslive:webrtc:m97-hms-1.1@aar" level="project" />
192
192
  <orderEntry type="library" scope="TEST" name="Gradle: androidx.constraintlayout:constraintlayout:2.1.3@aar" level="project" />
193
193
  </component>
194
194
  <component name="TestModuleProperties" production-module="android.main" />
@@ -36,7 +36,7 @@ android {
36
36
 
37
37
  buildTypes {
38
38
  release {
39
- minifyEnabled false
39
+ minifyEnabled true
40
40
  }
41
41
  }
42
42
  lintOptions {
@@ -63,7 +63,7 @@ dependencies {
63
63
  //noinspection GradleDynamicVersion
64
64
  implementation "com.facebook.react:react-native:+"
65
65
  implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" // From node_modules
66
- implementation 'com.github.100mslive.android-sdk:lib:2.4.4'
66
+ implementation 'com.github.100mslive.android-sdk:lib:2.4.8'
67
67
  implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0'
68
68
  implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
69
69
  implementation 'androidx.appcompat:appcompat:1.3.1'
@@ -0,0 +1,84 @@
1
+ package com.reactnativehmssdk
2
+
3
+ import android.app.Activity
4
+ import android.content.Context
5
+ import android.content.Intent
6
+ import android.media.projection.MediaProjectionManager
7
+ import android.os.Bundle
8
+ import androidx.activity.ComponentActivity
9
+ import androidx.activity.result.ActivityResultLauncher
10
+ import androidx.activity.result.contract.ActivityResultContracts
11
+ import live.hms.video.error.HMSException
12
+ import live.hms.video.sdk.HMSActionResultListener
13
+
14
+ class HMSAudioshareActivity : ComponentActivity() {
15
+ private var resultLauncher: ActivityResultLauncher<Intent> =
16
+ this.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
17
+ if (result.resultCode == Activity.RESULT_OK) {
18
+ val mediaProjectionPermissionResultData: Intent? = result.data
19
+ val id = intent.getStringExtra("id")
20
+ val audioMixingMode = intent.getStringExtra("audioMixingMode")
21
+ HMSManager.hmsCollection[id]?.hmsSDK?.startAudioshare(
22
+ object : HMSActionResultListener {
23
+ override fun onError(error: HMSException) {
24
+ finish()
25
+ HMSManager.hmsCollection[id]?.audioshareCallback?.reject(error)
26
+ HMSManager.hmsCollection[id]?.emitHMSError(error)
27
+ }
28
+ override fun onSuccess() {
29
+ HMSManager.hmsCollection[id]?.isAudioSharing = true
30
+ HMSManager.hmsCollection[id]?.audioshareCallback?.resolve(
31
+ HMSManager.hmsCollection[id]?.emitHMSSuccess()
32
+ )
33
+ finish()
34
+ }
35
+ },
36
+ mediaProjectionPermissionResultData,
37
+ HMSHelper.getAudioMixingMode(audioMixingMode)
38
+ )
39
+ } else {
40
+ val id = intent.getStringExtra("id")
41
+ val error =
42
+ HMSException(
43
+ 103,
44
+ "RESULT_CANCELED",
45
+ "RESULT_CANCELED",
46
+ "RESULT_CANCELED",
47
+ "RESULT_CANCELED"
48
+ )
49
+ HMSManager.hmsCollection[id]?.audioshareCallback?.reject(error)
50
+ HMSManager.hmsCollection[id]?.emitHMSError(error)
51
+ finish()
52
+ }
53
+ }
54
+
55
+ override fun onCreate(savedInstanceState: Bundle?) {
56
+ super.onCreate(savedInstanceState)
57
+ startAudioshare()
58
+ }
59
+
60
+ private fun startAudioshare() {
61
+ val id = intent.getStringExtra("id")
62
+ val isAudioShared = HMSManager.hmsCollection[id]?.isAudioSharing
63
+ if (isAudioShared !== null && !isAudioShared) {
64
+ try {
65
+ val mediaProjectionManager =
66
+ getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
67
+ resultLauncher.launch(mediaProjectionManager.createScreenCaptureIntent())
68
+ } catch (e: Exception) {
69
+ println(e)
70
+ }
71
+ } else {
72
+ HMSManager.hmsCollection[id]?.emitHMSError(
73
+ HMSException(
74
+ 103,
75
+ "AUDIOSHARE_IS_ALREADY_RUNNING",
76
+ "AUDIOSHARE_IS_ALREADY_RUNNING",
77
+ "AUDIOSHARE_IS_ALREADY_RUNNING",
78
+ "AUDIOSHARE_IS_ALREADY_RUNNING"
79
+ )
80
+ )
81
+ finish()
82
+ }
83
+ }
84
+ }
@@ -1,6 +1,7 @@
1
1
  package com.reactnativehmssdk
2
2
 
3
3
  import com.facebook.react.bridge.*
4
+ import live.hms.video.connection.stats.*
4
5
  import live.hms.video.connection.stats.quality.HMSNetworkQuality
5
6
  import live.hms.video.error.HMSException
6
7
  import live.hms.video.media.settings.HMSAudioTrackSettings
@@ -125,10 +126,10 @@ object HMSDecoder {
125
126
  permissions.putBoolean("endRoom", hmsPermissions.endRoom)
126
127
  permissions.putBoolean("removeOthers", hmsPermissions.removeOthers)
127
128
  permissions.putBoolean("mute", hmsPermissions.mute)
128
- permissions.putBoolean("changeRoleForce", hmsPermissions.changeRoleForce)
129
+ permissions.putBoolean("browserRecording", hmsPermissions.browserRecording)
129
130
  permissions.putBoolean("unmute", hmsPermissions.unmute)
130
- permissions.putBoolean("recording", hmsPermissions.recording)
131
- permissions.putBoolean("streaming", hmsPermissions.streaming)
131
+ permissions.putBoolean("hlsStreaming", hmsPermissions.hlsStreaming)
132
+ permissions.putBoolean("rtmpStreaming", hmsPermissions.rtmpStreaming)
132
133
  permissions.putBoolean("changeRole", hmsPermissions.changeRole)
133
134
  }
134
135
  return permissions
@@ -197,7 +198,7 @@ object HMSDecoder {
197
198
  return peer
198
199
  }
199
200
 
200
- private fun getHmsLocalAudioTrack(track: HMSLocalAudioTrack?): WritableMap {
201
+ fun getHmsLocalAudioTrack(track: HMSLocalAudioTrack?): WritableMap {
201
202
  val hmsTrack: WritableMap = Arguments.createMap()
202
203
  if (track != null) {
203
204
  hmsTrack.putDouble("volume", track.volume)
@@ -211,7 +212,7 @@ object HMSDecoder {
211
212
  return hmsTrack
212
213
  }
213
214
 
214
- private fun getHmsLocalVideoTrack(track: HMSLocalVideoTrack?): WritableMap {
215
+ fun getHmsLocalVideoTrack(track: HMSLocalVideoTrack?): WritableMap {
215
216
  val hmsTrack: WritableMap = Arguments.createMap()
216
217
  if (track != null) {
217
218
  hmsTrack.putBoolean("isDegraded", track.isDegraded)
@@ -292,7 +293,7 @@ object HMSDecoder {
292
293
  return peer
293
294
  }
294
295
 
295
- private fun getHmsRemoteAudioTrack(track: HMSRemoteAudioTrack?): WritableMap {
296
+ fun getHmsRemoteAudioTrack(track: HMSRemoteAudioTrack?): WritableMap {
296
297
  val hmsTrack: WritableMap = Arguments.createMap()
297
298
  if (track != null) {
298
299
  hmsTrack.putBoolean("isPlaybackAllowed", track.isPlaybackAllowed)
@@ -305,7 +306,7 @@ object HMSDecoder {
305
306
  return hmsTrack
306
307
  }
307
308
 
308
- private fun getHmsRemoteVideoTrack(track: HMSRemoteVideoTrack?): WritableMap {
309
+ fun getHmsRemoteVideoTrack(track: HMSRemoteVideoTrack?): WritableMap {
309
310
  val hmsTrack: WritableMap = Arguments.createMap()
310
311
  if (track != null) {
311
312
  hmsTrack.putBoolean("isDegraded", track.isDegraded)
@@ -360,11 +361,11 @@ object HMSDecoder {
360
361
  if (error !== null) {
361
362
  val decodedError: WritableMap = Arguments.createMap()
362
363
  decodedError.putInt("code", error.code)
363
- decodedError.putString("localizedDescription", error.localizedMessage)
364
364
  decodedError.putString("description", error.description)
365
365
  decodedError.putString("message", error.message)
366
366
  decodedError.putString("name", error.name)
367
367
  decodedError.putString("action", error.action)
368
+ decodedError.putBoolean("isTerminal", error.isTerminal)
368
369
  return decodedError
369
370
  }
370
371
  return null
@@ -524,4 +525,72 @@ object HMSDecoder {
524
525
  }
525
526
  return hmsNetworkQuality
526
527
  }
528
+
529
+ fun getHMSRTCStats(hmsRtcStats: HMSRTCStats?): WritableMap {
530
+ val rtcStats: WritableMap = Arguments.createMap()
531
+ if (hmsRtcStats != null) {
532
+ rtcStats.putDouble("bitrateReceived", hmsRtcStats.bitrateReceived)
533
+ rtcStats.putDouble("bitrateSent", hmsRtcStats.bitrateSent)
534
+ rtcStats.putString("bytesSent", hmsRtcStats.bytesSent.toString())
535
+ rtcStats.putString("bytesReceived", hmsRtcStats.bytesReceived.toString())
536
+ rtcStats.putString("packetsLost", hmsRtcStats.packetsLost.toString())
537
+ rtcStats.putString("packetsReceived", hmsRtcStats.packetsReceived.toString())
538
+ rtcStats.putDouble("roundTripTime", hmsRtcStats.roundTripTime)
539
+ }
540
+ return rtcStats
541
+ }
542
+
543
+ fun getLocalAudioStats(hmsLocalAudioStats: HMSLocalAudioStats?): WritableMap {
544
+ val localAudioStats: WritableMap = Arguments.createMap()
545
+ if (hmsLocalAudioStats != null) {
546
+ hmsLocalAudioStats.bitrate?.let { localAudioStats.putDouble("bitrate", it) }
547
+ localAudioStats.putString("bytesSent", hmsLocalAudioStats.bytesSent.toString())
548
+ hmsLocalAudioStats.roundTripTime?.let { localAudioStats.putDouble("roundTripTime", it) }
549
+ }
550
+ return localAudioStats
551
+ }
552
+
553
+ fun getLocalVideoStats(hmsLocalVideoStats: HMSLocalVideoStats?): WritableMap {
554
+ val localVideoStats: WritableMap = Arguments.createMap()
555
+ if (hmsLocalVideoStats != null) {
556
+ localVideoStats.putString("bytesSent", hmsLocalVideoStats.bytesSent.toString())
557
+ localVideoStats.putMap(
558
+ "resolution",
559
+ hmsLocalVideoStats.resolution?.let { this.getHmsVideoTrackResolution(it) }
560
+ )
561
+ hmsLocalVideoStats.bitrate?.let { localVideoStats.putDouble("bitrate", it) }
562
+ hmsLocalVideoStats.roundTripTime?.let { localVideoStats.putDouble("roundTripTime", it) }
563
+ hmsLocalVideoStats.frameRate?.let { localVideoStats.putDouble("frameRate", it) }
564
+ }
565
+ return localVideoStats
566
+ }
567
+
568
+ fun getRemoteAudioStats(hmsRemoteAudioStats: HMSRemoteAudioStats?): WritableMap {
569
+ val remoteAudioStats: WritableMap = Arguments.createMap()
570
+ if (hmsRemoteAudioStats != null) {
571
+ hmsRemoteAudioStats.bitrate?.let { remoteAudioStats.putDouble("bitrate", it) }
572
+ remoteAudioStats.putString("bytesReceived", hmsRemoteAudioStats.bytesReceived.toString())
573
+ hmsRemoteAudioStats.jitter?.let { remoteAudioStats.putDouble("jitter", it) }
574
+ hmsRemoteAudioStats.packetsLost?.let { remoteAudioStats.putInt("packetsLost", it) }
575
+ remoteAudioStats.putString("packetsReceived", hmsRemoteAudioStats.packetsReceived.toString())
576
+ }
577
+ return remoteAudioStats
578
+ }
579
+
580
+ fun getRemoteVideoStats(hmsRemoteVideoStats: HMSRemoteVideoStats?): WritableMap {
581
+ val remoteVideoStats: WritableMap = Arguments.createMap()
582
+ if (hmsRemoteVideoStats != null) {
583
+ remoteVideoStats.putString("bytesReceived", hmsRemoteVideoStats.bytesReceived.toString())
584
+ remoteVideoStats.putString("packetsReceived", hmsRemoteVideoStats.packetsReceived.toString())
585
+ hmsRemoteVideoStats.bitrate?.let { remoteVideoStats.putDouble("bitrate", it) }
586
+ remoteVideoStats.putMap(
587
+ "resolution",
588
+ hmsRemoteVideoStats.resolution?.let { this.getHmsVideoTrackResolution(it) }
589
+ )
590
+ hmsRemoteVideoStats.frameRate?.let { remoteVideoStats.putDouble("frameRate", it) }
591
+ hmsRemoteVideoStats.jitter?.let { remoteVideoStats.putDouble("jitter", it) }
592
+ hmsRemoteVideoStats.packetsLost?.let { remoteVideoStats.putInt("packetsLost", it) }
593
+ }
594
+ return remoteVideoStats
595
+ }
527
596
  }