@stream-io/video-react-native-sdk 0.0.1-alpha.195 → 0.0.1-alpha.196

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 (33) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/src/components/ActiveCall.js +0 -3
  3. package/dist/src/components/ActiveCall.js.map +1 -1
  4. package/dist/src/hooks/push/useInitAndroidTokenAndRest.js +1 -1
  5. package/dist/src/hooks/push/useInitAndroidTokenAndRest.js.map +1 -1
  6. package/dist/src/hooks/useAndroidKeepCallAliveEffect.js +8 -5
  7. package/dist/src/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
  8. package/dist/src/hooks/useMutingState.js +21 -4
  9. package/dist/src/hooks/useMutingState.js.map +1 -1
  10. package/dist/src/providers/MediaDevices.js +3 -2
  11. package/dist/src/providers/MediaDevices.js.map +1 -1
  12. package/dist/src/utils/StreamVideoRN/index.d.ts +10 -0
  13. package/dist/src/utils/StreamVideoRN/index.js +11 -0
  14. package/dist/src/utils/StreamVideoRN/index.js.map +1 -1
  15. package/dist/src/utils/StreamVideoRN/permissions.d.ts +5 -0
  16. package/dist/src/utils/StreamVideoRN/permissions.js +21 -0
  17. package/dist/src/utils/StreamVideoRN/permissions.js.map +1 -0
  18. package/dist/src/utils/push/utils.d.ts +1 -1
  19. package/dist/src/utils/push/utils.js +3 -4
  20. package/dist/src/utils/push/utils.js.map +1 -1
  21. package/package.json +1 -1
  22. package/src/components/ActiveCall.tsx +0 -4
  23. package/src/hooks/push/useInitAndroidTokenAndRest.ts +2 -2
  24. package/src/hooks/useAndroidKeepCallAliveEffect.ts +12 -6
  25. package/src/hooks/useMutingState.ts +28 -4
  26. package/src/providers/MediaDevices.tsx +16 -2
  27. package/src/utils/StreamVideoRN/index.ts +21 -0
  28. package/src/utils/StreamVideoRN/permissions.ts +25 -0
  29. package/src/utils/push/utils.ts +1 -2
  30. package/dist/src/utils/verifyAndroidBluetoothPermissions.d.ts +0 -1
  31. package/dist/src/utils/verifyAndroidBluetoothPermissions.js +0 -31
  32. package/dist/src/utils/verifyAndroidBluetoothPermissions.js.map +0 -1
  33. package/src/utils/verifyAndroidBluetoothPermissions.ts +0 -33
package/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [0.0.1-alpha.196](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-0.0.1-alpha.195...@stream-io/video-react-native-sdk-0.0.1-alpha.196) (2023-06-22)
6
+
7
+
8
+ ### Features
9
+
10
+ * permissions arch changes ([#686](https://github.com/GetStream/stream-video-js/issues/686)) ([36d0633](https://github.com/GetStream/stream-video-js/commit/36d0633c72968b1f1b843dcad9d450c0bd8c865d))
11
+
12
+
13
+
5
14
  ## [0.0.1-alpha.195](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-0.0.1-alpha.194...@stream-io/video-react-native-sdk-0.0.1-alpha.195) (2023-06-21)
6
15
 
7
16
 
@@ -35,7 +35,6 @@ const useIncallManager_1 = require("../hooks/useIncallManager");
35
35
  const usePublishMediaStreams_1 = require("../hooks/usePublishMediaStreams");
36
36
  const usePermissionRequest_1 = require("../hooks/usePermissionRequest");
37
37
  const CallParticipantsBadge_1 = require("./CallParticipantsBadge");
38
- const verifyAndroidBluetoothPermissions_1 = require("../utils/verifyAndroidBluetoothPermissions");
39
38
  const video_client_1 = require("@stream-io/video-client");
40
39
  const constants_1 = require("../constants");
41
40
  /**
@@ -50,8 +49,6 @@ const ActiveCall = (props) => {
50
49
  const activeCallRef = (0, react_1.useRef)(activeCall);
51
50
  activeCallRef.current = activeCall;
52
51
  (0, react_1.useEffect)(() => {
53
- // when the component mounts, we ask for necessary permissions.
54
- (0, verifyAndroidBluetoothPermissions_1.verifyAndroidBluetoothPermissions)();
55
52
  return () => {
56
53
  if (activeCallRef.current?.state.callingState !== video_client_1.CallingState.LEFT) {
57
54
  activeCallRef.current?.leave();
@@ -1 +1 @@
1
- {"version":3,"file":"ActiveCall.js","sourceRoot":"","sources":["../../../src/components/ActiveCall.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ActiveCall.js","sourceRoot":"","sources":["../../../src/components/ActiveCall.tsx"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ const useInitAndroidTokenAndRest = () => {
17
17
  if (!client || !connectedUserId || !pushConfig) {
18
18
  return;
19
19
  }
20
- (0, utils_2.initAndroidPushTokenAndAskPermissions)(client, pushConfig);
20
+ (0, utils_2.initAndroidPushToken)(client, pushConfig);
21
21
  }, [client, connectedUserId]);
22
22
  };
23
23
  exports.useInitAndroidTokenAndRest = useInitAndroidTokenAndRest;
@@ -1 +1 @@
1
- {"version":3,"file":"useInitAndroidTokenAndRest.js","sourceRoot":"","sources":["../../../../src/hooks/push/useInitAndroidTokenAndRest.ts"],"names":[],"mappings":";;;AAAA,0EAGyC;AACzC,iCAAkC;AAClC,uCAA4C;AAC5C,kDAA+E;AAE/E;;GAEG;AACI,MAAM,0BAA0B,GAAG,GAAG,EAAE;IAC7C,MAAM,MAAM,GAAG,IAAA,2CAAoB,GAAE,CAAC;IACtC,MAAM,eAAe,GAAG,IAAA,uCAAgB,GAAE,EAAE,EAAE,CAAC;IAC/C,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,qBAAa,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC;QAClD,mFAAmF;QACnF,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE;YAC9C,OAAO;SACR;QACD,IAAA,6CAAqC,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;AAChC,CAAC,CAAC;AAXW,QAAA,0BAA0B,8BAWrC"}
1
+ {"version":3,"file":"useInitAndroidTokenAndRest.js","sourceRoot":"","sources":["../../../../src/hooks/push/useInitAndroidTokenAndRest.ts"],"names":[],"mappings":";;;AAAA,0EAGyC;AACzC,iCAAkC;AAClC,uCAA4C;AAC5C,kDAA8D;AAE9D;;GAEG;AACI,MAAM,0BAA0B,GAAG,GAAG,EAAE;IAC7C,MAAM,MAAM,GAAG,IAAA,2CAAoB,GAAE,CAAC;IACtC,MAAM,eAAe,GAAG,IAAA,uCAAgB,GAAE,EAAE,EAAE,CAAC;IAC/C,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,qBAAa,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC;QAClD,mFAAmF;QACnF,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE;YAC9C,OAAO;SACR;QACD,IAAA,4BAAoB,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;AAChC,CAAC,CAAC;AAXW,QAAA,0BAA0B,8BAWrC"}
@@ -47,6 +47,12 @@ async function startForegroundService() {
47
47
  const foregroundServiceConfig = utils_1.StreamVideoRN.getConfig().foregroundService;
48
48
  const { title, body } = foregroundServiceConfig.android.notificationTexts;
49
49
  const channelId = foregroundServiceConfig.android.channel.id;
50
+ // request for notification permission and then start the foreground service
51
+ const settings = await react_native_1.default.getNotificationSettings();
52
+ if (settings.authorizationStatus !== react_native_1.AuthorizationStatus.AUTHORIZED) {
53
+ console.warn('Notification permission not granted, can not start foreground service to keep the call alive');
54
+ return;
55
+ }
50
56
  await react_native_1.default.createChannel(foregroundServiceConfig.android.channel);
51
57
  await react_native_1.default.displayNotification({
52
58
  title,
@@ -94,11 +100,8 @@ const useAndroidKeepCallAliveEffect = () => {
94
100
  return;
95
101
  }
96
102
  // request for notification permission and then start the foreground service
97
- const settings = await react_native_1.default.requestPermission();
98
- if (settings.authorizationStatus === react_native_1.AuthorizationStatus.AUTHORIZED) {
99
- await startForegroundService();
100
- foregroundServiceStartedRef.current = true;
101
- }
103
+ await startForegroundService();
104
+ foregroundServiceStartedRef.current = true;
102
105
  };
103
106
  run();
104
107
  return () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useAndroidKeepCallAliveEffect.js","sourceRoot":"","sources":["../../../src/hooks/useAndroidKeepCallAliveEffect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAndroidKeepCallAliveEffect.js","sourceRoot":"","sources":["../../../src/hooks/useAndroidKeepCallAliveEffect.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useMutingState = void 0;
4
4
  const StreamVideoContext_1 = require("../contexts/StreamVideoContext");
5
+ const permissions_1 = require("../utils/StreamVideoRN/permissions");
5
6
  /**
6
7
  * A helper hook which exposes audio, video mute and camera facing mode and
7
8
  * their respective functions to toggle state
@@ -9,11 +10,27 @@ const StreamVideoContext_1 = require("../contexts/StreamVideoContext");
9
10
  * @category Device Management
10
11
  */
11
12
  const useMutingState = () => {
12
- const isAudioMuted = (0, StreamVideoContext_1.useStreamVideoStoreValue)((store) => store.isAudioMuted);
13
- const isVideoMuted = (0, StreamVideoContext_1.useStreamVideoStoreValue)((store) => store.isVideoMuted);
13
+ const isAudioMutedState = (0, StreamVideoContext_1.useStreamVideoStoreValue)((store) => store.isAudioMuted);
14
+ const isVideoMutedState = (0, StreamVideoContext_1.useStreamVideoStoreValue)((store) => store.isVideoMuted);
14
15
  const setState = (0, StreamVideoContext_1.useStreamVideoStoreSetState)();
15
- const toggleAudioState = () => setState({ isAudioMuted: !isAudioMuted });
16
- const toggleVideoState = () => setState({ isVideoMuted: !isVideoMuted });
16
+ const isMicPermissionGranted = permissions_1.isMicPermissionGranted$.getValue();
17
+ const isCameraPermissionGranted = permissions_1.isCameraPermissionGranted$.getValue();
18
+ const toggleAudioState = () => {
19
+ if (!isMicPermissionGranted) {
20
+ console.warn('Microphone permission not granted, can not toggle audio');
21
+ return;
22
+ }
23
+ setState({ isAudioMuted: !isAudioMuted });
24
+ };
25
+ const toggleVideoState = () => {
26
+ if (!isCameraPermissionGranted) {
27
+ console.warn('Camera permission not granted, can not toggle video');
28
+ return;
29
+ }
30
+ setState({ isVideoMuted: !isVideoMuted });
31
+ };
32
+ const isAudioMuted = isAudioMutedState || !isMicPermissionGranted;
33
+ const isVideoMuted = isVideoMutedState || !isCameraPermissionGranted;
17
34
  return {
18
35
  isAudioMuted,
19
36
  isVideoMuted,
@@ -1 +1 @@
1
- {"version":3,"file":"useMutingState.js","sourceRoot":"","sources":["../../../src/hooks/useMutingState.ts"],"names":[],"mappings":";;;AAAA,uEAGwC;AACxC;;;;;GAKG;AACI,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,MAAM,YAAY,GAAG,IAAA,6CAAwB,EAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,IAAA,6CAAwB,EAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,IAAA,gDAA2B,GAAE,CAAC;IAC/C,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IACzE,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IAEzE,OAAO;QACL,YAAY;QACZ,YAAY;QACZ,gBAAgB;QAChB,gBAAgB;KACjB,CAAC;AACJ,CAAC,CAAC;AAbW,QAAA,cAAc,kBAazB"}
1
+ {"version":3,"file":"useMutingState.js","sourceRoot":"","sources":["../../../src/hooks/useMutingState.ts"],"names":[],"mappings":";;;AAAA,uEAGwC;AACxC,oEAG4C;AAC5C;;;;;GAKG;AACI,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,MAAM,iBAAiB,GAAG,IAAA,6CAAwB,EAChD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAC9B,CAAC;IACF,MAAM,iBAAiB,GAAG,IAAA,6CAAwB,EAChD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAC9B,CAAC;IACF,MAAM,QAAQ,GAAG,IAAA,gDAA2B,GAAE,CAAC;IAC/C,MAAM,sBAAsB,GAAG,qCAAuB,CAAC,QAAQ,EAAE,CAAC;IAClE,MAAM,yBAAyB,GAAG,wCAA0B,CAAC,QAAQ,EAAE,CAAC;IACxE,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,CAAC,sBAAsB,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACxE,OAAO;SACR;QACD,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC;IACF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,CAAC,yBAAyB,EAAE;YAC9B,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACpE,OAAO;SACR;QACD,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,iBAAiB,IAAI,CAAC,sBAAsB,CAAC;IAClE,MAAM,YAAY,GAAG,iBAAiB,IAAI,CAAC,yBAAyB,CAAC;IAErE,OAAO;QACL,YAAY;QACZ,YAAY;QACZ,gBAAgB;QAChB,gBAAgB;KACjB,CAAC;AACJ,CAAC,CAAC;AAjCW,QAAA,cAAc,kBAiCzB"}
@@ -4,6 +4,7 @@ exports.MediaDevices = void 0;
4
4
  const react_1 = require("react");
5
5
  const video_client_1 = require("@stream-io/video-client");
6
6
  const contexts_1 = require("../contexts");
7
+ const permissions_1 = require("../utils/StreamVideoRN/permissions");
7
8
  /**
8
9
  * A renderless component that provides the audio and video devices to the store
9
10
  * This component must be a child of StreamVideoStoreProvider
@@ -18,7 +19,7 @@ const MediaDevices = () => {
18
19
  const setAudioDevices = (audioDevices) => {
19
20
  setState({ audioDevices, currentAudioDevice: audioDevices[0] });
20
21
  };
21
- const subscription = (0, video_client_1.getAudioDevices)().subscribe(setAudioDevices);
22
+ const subscription = (0, permissions_1.subscribeToDevicesWhenPermissionGranted)(permissions_1.isMicPermissionGranted$, video_client_1.getAudioDevices, setAudioDevices);
22
23
  return () => subscription.unsubscribe();
23
24
  }, [setState]);
24
25
  (0, react_1.useEffect)(() => {
@@ -34,7 +35,7 @@ const MediaDevices = () => {
34
35
  }
35
36
  setState({ videoDevices });
36
37
  };
37
- const subscription = (0, video_client_1.getVideoDevices)().subscribe(setVideoDevices);
38
+ const subscription = (0, permissions_1.subscribeToDevicesWhenPermissionGranted)(permissions_1.isCameraPermissionGranted$, video_client_1.getVideoDevices, setVideoDevices);
38
39
  return () => subscription.unsubscribe();
39
40
  }, [setState]);
40
41
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"MediaDevices.js","sourceRoot":"","sources":["../../../src/providers/MediaDevices.tsx"],"names":[],"mappings":";;;AAAA,iCAAiD;AACjD,0DAA2E;AAC3E,0CAA2E;AAE3E;;;;;;GAMG;AACI,MAAM,YAAY,GAAG,GAA8B,EAAE;IAC1D,MAAM,QAAQ,GAAG,IAAA,sCAA2B,GAAE,CAAC;IAC/C,MAAM,qBAAqB,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IAE5C,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,eAAe,GAAG,CAAC,YAA+B,EAAE,EAAE;YAC1D,QAAQ,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC;QACF,MAAM,YAAY,GAAG,IAAA,8BAAe,GAAE,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAClE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,eAAe,GAAG,CAAC,YAA+B,EAAE,EAAE;YAC1D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;gBAC7D,MAAM,sBAAsB,GAAG,YAAY,CAAC,IAAI,CAC9C,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,CAAC,IAAI,KAAK,YAAY,IAAI,WAAW,CAAC,MAAM,KAAK,OAAO,CACtE,CAAC;gBACF,MAAM,kBAAkB,GAAG,sBAAsB,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;gBACrE,IAAI,kBAAkB,EAAE;oBACtB,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;oBACrC,QAAQ,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBACnE,OAAO;iBACR;aACF;YACD,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,MAAM,YAAY,GAAG,IAAA,8BAAe,GAAE,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAClE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAjCW,QAAA,YAAY,gBAiCvB"}
1
+ {"version":3,"file":"MediaDevices.js","sourceRoot":"","sources":["../../../src/providers/MediaDevices.tsx"],"names":[],"mappings":";;;AAAA,iCAAiD;AACjD,0DAA2E;AAC3E,0CAA2E;AAC3E,oEAI4C;AAE5C;;;;;;GAMG;AACI,MAAM,YAAY,GAAG,GAA8B,EAAE;IAC1D,MAAM,QAAQ,GAAG,IAAA,sCAA2B,GAAE,CAAC;IAC/C,MAAM,qBAAqB,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IAE5C,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,eAAe,GAAG,CAAC,YAA+B,EAAE,EAAE;YAC1D,QAAQ,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,IAAA,qDAAuC,EAC1D,qCAAuB,EACvB,8BAAe,EACf,eAAe,CAChB,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,eAAe,GAAG,CAAC,YAA+B,EAAE,EAAE;YAC1D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;gBAC7D,MAAM,sBAAsB,GAAG,YAAY,CAAC,IAAI,CAC9C,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,CAAC,IAAI,KAAK,YAAY,IAAI,WAAW,CAAC,MAAM,KAAK,OAAO,CACtE,CAAC;gBACF,MAAM,kBAAkB,GAAG,sBAAsB,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;gBACrE,IAAI,kBAAkB,EAAE;oBACtB,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;oBACrC,QAAQ,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBACnE,OAAO;iBACR;aACF;YACD,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,MAAM,YAAY,GAAG,IAAA,qDAAuC,EAC1D,wCAA0B,EAC1B,8BAAe,EACf,eAAe,CAChB,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AA1CW,QAAA,YAAY,gBA0CvB"}
@@ -20,5 +20,15 @@ export declare class StreamVideoRN {
20
20
  * AppRegistry.registerComponent('app', () => App);
21
21
  */
22
22
  static setPushConfig(pushConfig: NonNullable<StreamVideoConfig['push']>): void;
23
+ /**
24
+ * Set native permissions config for StreamVideoRN.
25
+ * Note: This function should be called after the user has declined/granted camera and mic permissions.
26
+ * @example
27
+ * See sample-apps/react-native/dogfood/src/hooks/useSyncPermissions.ts
28
+ */
29
+ static setPermissions({ isCameraPermissionGranted, isMicPermissionGranted, }: {
30
+ isCameraPermissionGranted: boolean;
31
+ isMicPermissionGranted: boolean;
32
+ }): void;
23
33
  static getConfig(): StreamVideoConfig;
24
34
  }
@@ -4,6 +4,7 @@ exports.StreamVideoRN = void 0;
4
4
  const react_native_1 = require("@notifee/react-native");
5
5
  const constants_1 = require("../../constants");
6
6
  const utils_1 = require("../push/utils");
7
+ const permissions_1 = require("./permissions");
7
8
  const DEFAULT_STREAM_VIDEO_CONFIG = {
8
9
  supportedReactions: constants_1.defaultEmojiReactions,
9
10
  foregroundService: {
@@ -57,6 +58,16 @@ class StreamVideoRN {
57
58
  (0, utils_1.setupCallkeep)(pushConfig);
58
59
  (0, utils_1.setupFirebaseHandlerAndroid)(pushConfig);
59
60
  }
61
+ /**
62
+ * Set native permissions config for StreamVideoRN.
63
+ * Note: This function should be called after the user has declined/granted camera and mic permissions.
64
+ * @example
65
+ * See sample-apps/react-native/dogfood/src/hooks/useSyncPermissions.ts
66
+ */
67
+ static setPermissions({ isCameraPermissionGranted, isMicPermissionGranted, }) {
68
+ permissions_1.isCameraPermissionGranted$.next(isCameraPermissionGranted);
69
+ permissions_1.isMicPermissionGranted$.next(isMicPermissionGranted);
70
+ }
60
71
  static getConfig() {
61
72
  return this.config;
62
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/StreamVideoRN/index.ts"],"names":[],"mappings":";;;AAAA,wDAA0D;AAC1D,+CAAwD;AACxD,yCAA2E;AAG3E,MAAM,2BAA2B,GAAsB;IACrD,kBAAkB,EAAE,iCAAqB;IACzC,iBAAiB,EAAE;QACjB,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,EAAE,EAAE,gCAAgC;gBACpC,IAAI,EAAE,yCAAyC;gBAC/C,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE,gCAAiB,CAAC,OAAO;aACtC;YACD,iBAAiB,EAAE;gBACjB,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,2BAA2B;aAClC;SACF;KACF;CACF,CAAC;AAEF,MAAa,aAAa;IAChB,MAAM,CAAC,MAAM,GAAG,2BAA2B,CAAC;IACpD;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,YAAsD;QACxE,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,IAAI,CAAC,MAAM;YACd,GAAG,YAAY;SAChB,CAAC;IACJ,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,aAAa,CAAC,UAAkD;QACrE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YACpB,OAAO,CAAC,GAAG,CACT,oEAAoE,CACrE,CAAC;YACF,OAAO;SACR;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC;QAC9B,yHAAyH;QACzH,IAAA,qBAAa,EAAC,UAAU,CAAC,CAAC;QAC1B,IAAA,mCAA2B,EAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;;AAzCH,sCA0CC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/StreamVideoRN/index.ts"],"names":[],"mappings":";;;AAAA,wDAA0D;AAC1D,+CAAwD;AACxD,yCAA2E;AAE3E,+CAGuB;AAEvB,MAAM,2BAA2B,GAAsB;IACrD,kBAAkB,EAAE,iCAAqB;IACzC,iBAAiB,EAAE;QACjB,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,EAAE,EAAE,gCAAgC;gBACpC,IAAI,EAAE,yCAAyC;gBAC/C,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE,gCAAiB,CAAC,OAAO;aACtC;YACD,iBAAiB,EAAE;gBACjB,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,2BAA2B;aAClC;SACF;KACF;CACF,CAAC;AAEF,MAAa,aAAa;IAChB,MAAM,CAAC,MAAM,GAAG,2BAA2B,CAAC;IACpD;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,YAAsD;QACxE,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,IAAI,CAAC,MAAM;YACd,GAAG,YAAY;SAChB,CAAC;IACJ,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,aAAa,CAAC,UAAkD;QACrE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YACpB,OAAO,CAAC,GAAG,CACT,oEAAoE,CACrE,CAAC;YACF,OAAO;SACR;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC;QAC9B,yHAAyH;QACzH,IAAA,qBAAa,EAAC,UAAU,CAAC,CAAC;QAC1B,IAAA,mCAA2B,EAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,EACpB,yBAAyB,EACzB,sBAAsB,GAIvB;QACC,wCAA0B,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC3D,qCAAuB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;;AA1DH,sCA2DC"}
@@ -0,0 +1,5 @@
1
+ import { BehaviorSubject, Observable } from 'rxjs';
2
+ import { MediaDeviceInfo } from '../../contexts';
3
+ export declare const isCameraPermissionGranted$: BehaviorSubject<boolean>;
4
+ export declare const isMicPermissionGranted$: BehaviorSubject<boolean>;
5
+ export declare const subscribeToDevicesWhenPermissionGranted: (isDevicePermissionGranted$: BehaviorSubject<boolean>, getDevicesFunc: () => Observable<MediaDeviceInfo[]>, subscriptionCallback: (videoDevices: MediaDeviceInfo[]) => void) => import("rxjs").Subscription;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.subscribeToDevicesWhenPermissionGranted = exports.isMicPermissionGranted$ = exports.isCameraPermissionGranted$ = void 0;
4
+ const operators_1 = require("rxjs/operators");
5
+ const rxjs_1 = require("rxjs");
6
+ exports.isCameraPermissionGranted$ = new rxjs_1.BehaviorSubject(false);
7
+ exports.isMicPermissionGranted$ = new rxjs_1.BehaviorSubject(false);
8
+ const subscribeToDevicesWhenPermissionGranted = (isDevicePermissionGranted$, getDevicesFunc, subscriptionCallback) => isDevicePermissionGranted$
9
+ .pipe((0, operators_1.switchMap)((isDevicePermissionGranted) => {
10
+ // if we don't have mic permission, we don't need to get the audio devices
11
+ // because we won't be able to use them anyway and this will trigger a permission request
12
+ // from RN WebRTC lib. This is not ideal because we want to control when the permission.
13
+ if (!isDevicePermissionGranted) {
14
+ // otherwise return EMPTY, which is an Observable that does nothing and just completes immediately
15
+ return rxjs_1.EMPTY;
16
+ }
17
+ return getDevicesFunc();
18
+ }))
19
+ .subscribe(subscriptionCallback);
20
+ exports.subscribeToDevicesWhenPermissionGranted = subscribeToDevicesWhenPermissionGranted;
21
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../../src/utils/StreamVideoRN/permissions.ts"],"names":[],"mappings":";;;AAAA,8CAA2C;AAC3C,+BAA0D;AAE7C,QAAA,0BAA0B,GAAG,IAAI,sBAAe,CAAU,KAAK,CAAC,CAAC;AACjE,QAAA,uBAAuB,GAAG,IAAI,sBAAe,CAAU,KAAK,CAAC,CAAC;AAEpE,MAAM,uCAAuC,GAAG,CACrD,0BAAoD,EACpD,cAAmD,EACnD,oBAA+D,EAC/D,EAAE,CACF,0BAA0B;KACvB,IAAI,CACH,IAAA,qBAAS,EAAC,CAAC,yBAAyB,EAAE,EAAE;IACtC,0EAA0E;IAC1E,yFAAyF;IACzF,wFAAwF;IACxF,IAAI,CAAC,yBAAyB,EAAE;QAC9B,kGAAkG;QAClG,OAAO,YAAK,CAAC;KACd;IACD,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC,CAAC,CACH;KACA,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAlBxB,QAAA,uCAAuC,2CAkBf"}
@@ -5,7 +5,7 @@ export declare function setupCallkeep(pushConfig: PushConfig): void;
5
5
  /** Setup Firebase push message handler **/
6
6
  export declare function setupFirebaseHandlerAndroid(pushConfig: PushConfig): void;
7
7
  /** Send token to stream, create notification channel, */
8
- export declare function initAndroidPushTokenAndAskPermissions(client: StreamVideoClient, pushConfig: PushConfig): Promise<void>;
8
+ export declare function initAndroidPushToken(client: StreamVideoClient, pushConfig: PushConfig): Promise<void>;
9
9
  /**
10
10
  * This function is used process the call from push notifications due to incoming call
11
11
  * It does the following steps:
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.processCallFromPush = exports.initAndroidPushTokenAndAskPermissions = exports.setupFirebaseHandlerAndroid = exports.setupCallkeep = void 0;
26
+ exports.processCallFromPush = exports.initAndroidPushToken = exports.setupFirebaseHandlerAndroid = exports.setupCallkeep = void 0;
27
27
  const react_native_1 = __importStar(require("@notifee/react-native"));
28
28
  const react_native_2 = require("react-native");
29
29
  const libs_1 = require("./libs");
@@ -92,7 +92,7 @@ function setupFirebaseHandlerAndroid(pushConfig) {
92
92
  }
93
93
  exports.setupFirebaseHandlerAndroid = setupFirebaseHandlerAndroid;
94
94
  /** Send token to stream, create notification channel, */
95
- async function initAndroidPushTokenAndAskPermissions(client, pushConfig) {
95
+ async function initAndroidPushToken(client, pushConfig) {
96
96
  if (react_native_2.Platform.OS !== 'android') {
97
97
  return;
98
98
  }
@@ -100,9 +100,8 @@ async function initAndroidPushTokenAndAskPermissions(client, pushConfig) {
100
100
  const token = await messaging().getToken();
101
101
  const push_provider_name = pushConfig.android.pushProviderName;
102
102
  await client.addDevice(token, 'firebase', push_provider_name);
103
- await react_native_1.default.requestPermission();
104
103
  }
105
- exports.initAndroidPushTokenAndAskPermissions = initAndroidPushTokenAndAskPermissions;
104
+ exports.initAndroidPushToken = initAndroidPushToken;
106
105
  const firebaseMessagingOnMessageHandler = async (message, pushConfig) => {
107
106
  if (react_native_2.Platform.OS !== 'android') {
108
107
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/push/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/push/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -83,5 +83,5 @@
83
83
  "typedoc-plugin-markdown": "^3.15.3",
84
84
  "typescript": "^4.9.5"
85
85
  },
86
- "version": "0.0.1-alpha.195"
86
+ "version": "0.0.1-alpha.196"
87
87
  }
@@ -12,7 +12,6 @@ import { useIncallManager } from '../hooks/useIncallManager';
12
12
  import { usePublishMediaStreams } from '../hooks/usePublishMediaStreams';
13
13
  import { usePermissionRequest } from '../hooks/usePermissionRequest';
14
14
  import { CallParticipantsBadge } from './CallParticipantsBadge';
15
- import { verifyAndroidBluetoothPermissions } from '../utils/verifyAndroidBluetoothPermissions';
16
15
  import { CallingState } from '@stream-io/video-client';
17
16
  import { Z_INDEX } from '../constants';
18
17
 
@@ -40,9 +39,6 @@ export const ActiveCall = (props: ActiveCallProps) => {
40
39
  activeCallRef.current = activeCall;
41
40
 
42
41
  useEffect(() => {
43
- // when the component mounts, we ask for necessary permissions.
44
- verifyAndroidBluetoothPermissions();
45
-
46
42
  return () => {
47
43
  if (activeCallRef.current?.state.callingState !== CallingState.LEFT) {
48
44
  activeCallRef.current?.leave();
@@ -4,7 +4,7 @@ import {
4
4
  } from '@stream-io/video-react-bindings';
5
5
  import { useEffect } from 'react';
6
6
  import { StreamVideoRN } from '../../utils';
7
- import { initAndroidPushTokenAndAskPermissions } from '../../utils/push/utils';
7
+ import { initAndroidPushToken } from '../../utils/push/utils';
8
8
 
9
9
  /**
10
10
  * This hook is used to initialize the push token for Android and ask notification permissions.
@@ -18,6 +18,6 @@ export const useInitAndroidTokenAndRest = () => {
18
18
  if (!client || !connectedUserId || !pushConfig) {
19
19
  return;
20
20
  }
21
- initAndroidPushTokenAndAskPermissions(client, pushConfig);
21
+ initAndroidPushToken(client, pushConfig);
22
22
  }, [client, connectedUserId]);
23
23
  };
@@ -1,5 +1,5 @@
1
1
  import { useCallCallingState } from '@stream-io/video-react-bindings';
2
- import { useRef, useEffect } from 'react';
2
+ import { useEffect, useRef } from 'react';
3
3
  import notifee, { AuthorizationStatus } from '@notifee/react-native';
4
4
  import { StreamVideoRN } from '../utils';
5
5
  import { Platform } from 'react-native';
@@ -23,6 +23,15 @@ async function startForegroundService() {
23
23
  const foregroundServiceConfig = StreamVideoRN.getConfig().foregroundService;
24
24
  const { title, body } = foregroundServiceConfig.android.notificationTexts;
25
25
  const channelId = foregroundServiceConfig.android.channel.id;
26
+
27
+ // request for notification permission and then start the foreground service
28
+ const settings = await notifee.getNotificationSettings();
29
+ if (settings.authorizationStatus !== AuthorizationStatus.AUTHORIZED) {
30
+ console.warn(
31
+ 'Notification permission not granted, can not start foreground service to keep the call alive',
32
+ );
33
+ return;
34
+ }
26
35
  await notifee.createChannel(foregroundServiceConfig.android.channel);
27
36
  await notifee.displayNotification({
28
37
  title,
@@ -76,11 +85,8 @@ export const useAndroidKeepCallAliveEffect = () => {
76
85
  return;
77
86
  }
78
87
  // request for notification permission and then start the foreground service
79
- const settings = await notifee.requestPermission();
80
- if (settings.authorizationStatus === AuthorizationStatus.AUTHORIZED) {
81
- await startForegroundService();
82
- foregroundServiceStartedRef.current = true;
83
- }
88
+ await startForegroundService();
89
+ foregroundServiceStartedRef.current = true;
84
90
  };
85
91
  run();
86
92
  return () => {
@@ -2,6 +2,10 @@ import {
2
2
  useStreamVideoStoreSetState,
3
3
  useStreamVideoStoreValue,
4
4
  } from '../contexts/StreamVideoContext';
5
+ import {
6
+ isCameraPermissionGranted$,
7
+ isMicPermissionGranted$,
8
+ } from '../utils/StreamVideoRN/permissions';
5
9
  /**
6
10
  * A helper hook which exposes audio, video mute and camera facing mode and
7
11
  * their respective functions to toggle state
@@ -9,11 +13,31 @@ import {
9
13
  * @category Device Management
10
14
  */
11
15
  export const useMutingState = () => {
12
- const isAudioMuted = useStreamVideoStoreValue((store) => store.isAudioMuted);
13
- const isVideoMuted = useStreamVideoStoreValue((store) => store.isVideoMuted);
16
+ const isAudioMutedState = useStreamVideoStoreValue(
17
+ (store) => store.isAudioMuted,
18
+ );
19
+ const isVideoMutedState = useStreamVideoStoreValue(
20
+ (store) => store.isVideoMuted,
21
+ );
14
22
  const setState = useStreamVideoStoreSetState();
15
- const toggleAudioState = () => setState({ isAudioMuted: !isAudioMuted });
16
- const toggleVideoState = () => setState({ isVideoMuted: !isVideoMuted });
23
+ const isMicPermissionGranted = isMicPermissionGranted$.getValue();
24
+ const isCameraPermissionGranted = isCameraPermissionGranted$.getValue();
25
+ const toggleAudioState = () => {
26
+ if (!isMicPermissionGranted) {
27
+ console.warn('Microphone permission not granted, can not toggle audio');
28
+ return;
29
+ }
30
+ setState({ isAudioMuted: !isAudioMuted });
31
+ };
32
+ const toggleVideoState = () => {
33
+ if (!isCameraPermissionGranted) {
34
+ console.warn('Camera permission not granted, can not toggle video');
35
+ return;
36
+ }
37
+ setState({ isVideoMuted: !isVideoMuted });
38
+ };
39
+ const isAudioMuted = isAudioMutedState || !isMicPermissionGranted;
40
+ const isVideoMuted = isVideoMutedState || !isCameraPermissionGranted;
17
41
 
18
42
  return {
19
43
  isAudioMuted,
@@ -1,6 +1,11 @@
1
1
  import React, { useEffect, useRef } from 'react';
2
2
  import { getAudioDevices, getVideoDevices } from '@stream-io/video-client';
3
3
  import { MediaDeviceInfo, useStreamVideoStoreSetState } from '../contexts';
4
+ import {
5
+ isCameraPermissionGranted$,
6
+ isMicPermissionGranted$,
7
+ subscribeToDevicesWhenPermissionGranted,
8
+ } from '../utils/StreamVideoRN/permissions';
4
9
 
5
10
  /**
6
11
  * A renderless component that provides the audio and video devices to the store
@@ -17,7 +22,12 @@ export const MediaDevices = (): React.ReactElement | null => {
17
22
  const setAudioDevices = (audioDevices: MediaDeviceInfo[]) => {
18
23
  setState({ audioDevices, currentAudioDevice: audioDevices[0] });
19
24
  };
20
- const subscription = getAudioDevices().subscribe(setAudioDevices);
25
+
26
+ const subscription = subscribeToDevicesWhenPermissionGranted(
27
+ isMicPermissionGranted$,
28
+ getAudioDevices,
29
+ setAudioDevices,
30
+ );
21
31
  return () => subscription.unsubscribe();
22
32
  }, [setState]);
23
33
 
@@ -37,7 +47,11 @@ export const MediaDevices = (): React.ReactElement | null => {
37
47
  }
38
48
  setState({ videoDevices });
39
49
  };
40
- const subscription = getVideoDevices().subscribe(setVideoDevices);
50
+ const subscription = subscribeToDevicesWhenPermissionGranted(
51
+ isCameraPermissionGranted$,
52
+ getVideoDevices,
53
+ setVideoDevices,
54
+ );
41
55
  return () => subscription.unsubscribe();
42
56
  }, [setState]);
43
57
 
@@ -2,6 +2,10 @@ import { AndroidImportance } from '@notifee/react-native';
2
2
  import { defaultEmojiReactions } from '../../constants';
3
3
  import { setupCallkeep, setupFirebaseHandlerAndroid } from '../push/utils';
4
4
  import { StreamVideoConfig } from './types';
5
+ import {
6
+ isCameraPermissionGranted$,
7
+ isMicPermissionGranted$,
8
+ } from './permissions';
5
9
 
6
10
  const DEFAULT_STREAM_VIDEO_CONFIG: StreamVideoConfig = {
7
11
  supportedReactions: defaultEmojiReactions,
@@ -61,6 +65,23 @@ export class StreamVideoRN {
61
65
  setupFirebaseHandlerAndroid(pushConfig);
62
66
  }
63
67
 
68
+ /**
69
+ * Set native permissions config for StreamVideoRN.
70
+ * Note: This function should be called after the user has declined/granted camera and mic permissions.
71
+ * @example
72
+ * See sample-apps/react-native/dogfood/src/hooks/useSyncPermissions.ts
73
+ */
74
+ static setPermissions({
75
+ isCameraPermissionGranted,
76
+ isMicPermissionGranted,
77
+ }: {
78
+ isCameraPermissionGranted: boolean;
79
+ isMicPermissionGranted: boolean;
80
+ }) {
81
+ isCameraPermissionGranted$.next(isCameraPermissionGranted);
82
+ isMicPermissionGranted$.next(isMicPermissionGranted);
83
+ }
84
+
64
85
  static getConfig() {
65
86
  return this.config;
66
87
  }
@@ -0,0 +1,25 @@
1
+ import { switchMap } from 'rxjs/operators';
2
+ import { BehaviorSubject, EMPTY, Observable } from 'rxjs';
3
+ import { MediaDeviceInfo } from '../../contexts';
4
+ export const isCameraPermissionGranted$ = new BehaviorSubject<boolean>(false);
5
+ export const isMicPermissionGranted$ = new BehaviorSubject<boolean>(false);
6
+
7
+ export const subscribeToDevicesWhenPermissionGranted = (
8
+ isDevicePermissionGranted$: BehaviorSubject<boolean>,
9
+ getDevicesFunc: () => Observable<MediaDeviceInfo[]>,
10
+ subscriptionCallback: (videoDevices: MediaDeviceInfo[]) => void,
11
+ ) =>
12
+ isDevicePermissionGranted$
13
+ .pipe(
14
+ switchMap((isDevicePermissionGranted) => {
15
+ // if we don't have mic permission, we don't need to get the audio devices
16
+ // because we won't be able to use them anyway and this will trigger a permission request
17
+ // from RN WebRTC lib. This is not ideal because we want to control when the permission.
18
+ if (!isDevicePermissionGranted) {
19
+ // otherwise return EMPTY, which is an Observable that does nothing and just completes immediately
20
+ return EMPTY;
21
+ }
22
+ return getDevicesFunc();
23
+ }),
24
+ )
25
+ .subscribe(subscriptionCallback);
@@ -83,7 +83,7 @@ export function setupFirebaseHandlerAndroid(pushConfig: PushConfig) {
83
83
  }
84
84
 
85
85
  /** Send token to stream, create notification channel, */
86
- export async function initAndroidPushTokenAndAskPermissions(
86
+ export async function initAndroidPushToken(
87
87
  client: StreamVideoClient,
88
88
  pushConfig: PushConfig,
89
89
  ) {
@@ -94,7 +94,6 @@ export async function initAndroidPushTokenAndAskPermissions(
94
94
  const token = await messaging().getToken();
95
95
  const push_provider_name = pushConfig.android.pushProviderName;
96
96
  await client.addDevice(token, 'firebase', push_provider_name);
97
- await notifee.requestPermission();
98
97
  }
99
98
 
100
99
  const firebaseMessagingOnMessageHandler = async (
@@ -1 +0,0 @@
1
- export declare const verifyAndroidBluetoothPermissions: () => Promise<boolean>;
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.verifyAndroidBluetoothPermissions = void 0;
4
- const react_native_1 = require("react-native");
5
- const verifyAndroidBluetoothPermissions = async () => {
6
- const shouldCheckForPermissions = Number(react_native_1.Platform.Version) >= 31;
7
- if (!shouldCheckForPermissions) {
8
- return true;
9
- }
10
- const getCheckPermissionPromise = () => {
11
- return react_native_1.PermissionsAndroid.check(react_native_1.PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT);
12
- };
13
- const hasPermission = await getCheckPermissionPromise();
14
- if (!hasPermission) {
15
- const getRequestPermissionPromise = async () => {
16
- const result = await react_native_1.PermissionsAndroid.request(react_native_1.PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT, {
17
- buttonNegative: 'Deny',
18
- buttonNeutral: 'Ask Me Later',
19
- buttonPositive: 'Allow',
20
- message: 'Permissions are required to route audio to bluetooth devices.',
21
- title: 'Bluetooth connect Access',
22
- }).then((status) => status === react_native_1.PermissionsAndroid.RESULTS.GRANTED);
23
- return result;
24
- };
25
- const granted = await getRequestPermissionPromise();
26
- return granted;
27
- }
28
- return true;
29
- };
30
- exports.verifyAndroidBluetoothPermissions = verifyAndroidBluetoothPermissions;
31
- //# sourceMappingURL=verifyAndroidBluetoothPermissions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verifyAndroidBluetoothPermissions.js","sourceRoot":"","sources":["../../../src/utils/verifyAndroidBluetoothPermissions.ts"],"names":[],"mappings":";;;AAAA,+CAA4D;AAErD,MAAM,iCAAiC,GAAG,KAAK,IAAI,EAAE;IAC1D,MAAM,yBAAyB,GAAG,MAAM,CAAC,uBAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACjE,IAAI,CAAC,yBAAyB,EAAE;QAC9B,OAAO,IAAI,CAAC;KACb;IACD,MAAM,yBAAyB,GAAG,GAAG,EAAE;QACrC,OAAO,iCAAkB,CAAC,KAAK,CAC7B,iCAAkB,CAAC,WAAW,CAAC,iBAAiB,CACjD,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,yBAAyB,EAAE,CAAC;IACxD,IAAI,CAAC,aAAa,EAAE;QAClB,MAAM,2BAA2B,GAAG,KAAK,IAAI,EAAE;YAC7C,MAAM,MAAM,GAAG,MAAM,iCAAkB,CAAC,OAAO,CAC7C,iCAAkB,CAAC,WAAW,CAAC,iBAAiB,EAChD;gBACE,cAAc,EAAE,MAAM;gBACtB,aAAa,EAAE,cAAc;gBAC7B,cAAc,EAAE,OAAO;gBACvB,OAAO,EACL,+DAA+D;gBACjE,KAAK,EAAE,0BAA0B;aAClC,CACF,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,iCAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClE,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,2BAA2B,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC;KAChB;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AA9BW,QAAA,iCAAiC,qCA8B5C"}
@@ -1,33 +0,0 @@
1
- import { Platform, PermissionsAndroid } from 'react-native';
2
-
3
- export const verifyAndroidBluetoothPermissions = async () => {
4
- const shouldCheckForPermissions = Number(Platform.Version) >= 31;
5
- if (!shouldCheckForPermissions) {
6
- return true;
7
- }
8
- const getCheckPermissionPromise = () => {
9
- return PermissionsAndroid.check(
10
- PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT,
11
- );
12
- };
13
- const hasPermission = await getCheckPermissionPromise();
14
- if (!hasPermission) {
15
- const getRequestPermissionPromise = async () => {
16
- const result = await PermissionsAndroid.request(
17
- PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT,
18
- {
19
- buttonNegative: 'Deny',
20
- buttonNeutral: 'Ask Me Later',
21
- buttonPositive: 'Allow',
22
- message:
23
- 'Permissions are required to route audio to bluetooth devices.',
24
- title: 'Bluetooth connect Access',
25
- },
26
- ).then((status) => status === PermissionsAndroid.RESULTS.GRANTED);
27
- return result;
28
- };
29
- const granted = await getRequestPermissionPromise();
30
- return granted;
31
- }
32
- return true;
33
- };