setScreensharingEnabled method

  1. @override
Future<void> setScreensharingEnabled(
  1. GroupCallSession groupCall,
  2. bool enabled,
  3. String desktopCapturerSourceId
)
override

Implementation

@override
Future<void> setScreensharingEnabled(
  GroupCallSession groupCall,
  bool enabled,
  String desktopCapturerSourceId,
) async {
  if (enabled == (localScreenshareStream != null)) {
    return;
  }

  if (enabled) {
    try {
      Logs().v('Asking for screensharing permissions...');
      final stream = await _getDisplayMedia(groupCall);
      for (final track in stream.getTracks()) {
        // screen sharing should only have 1 video track anyway, so this only
        // fires once
        track.onEnded = () async {
          await setScreensharingEnabled(groupCall, false, '');
        };
      }
      Logs().v(
          'Screensharing permissions granted. Setting screensharing enabled on all calls');
      _localScreenshareStream = WrappedMediaStream(
        stream: stream,
        participant: groupCall.localParticipant!,
        room: groupCall.room,
        client: groupCall.client,
        purpose: SDPStreamMetadataPurpose.Screenshare,
        audioMuted: stream.getAudioTracks().isEmpty,
        videoMuted: stream.getVideoTracks().isEmpty,
        isGroupCall: true,
        voip: groupCall.voip,
      );

      _addScreenshareStream(groupCall, localScreenshareStream!);

      groupCall.onGroupCallEvent
          .add(GroupCallStateChange.localScreenshareStateChanged);
      for (final call in _callSessions) {
        await call.addLocalStream(
            await localScreenshareStream!.stream!.clone(),
            localScreenshareStream!.purpose);
      }

      await groupCall.sendMemberStateEvent();

      return;
    } catch (e, s) {
      Logs().e('[VOIP] Enabling screensharing error', e, s);
      groupCall.onGroupCallEvent.add(GroupCallStateChange.error);
      return;
    }
  } else {
    for (final call in _callSessions) {
      await call.removeLocalStream(call.localScreenSharingStream!);
    }
    await stopMediaStream(localScreenshareStream?.stream);
    await _removeScreenshareStream(groupCall, localScreenshareStream!);
    _localScreenshareStream = null;

    await groupCall.sendMemberStateEvent();

    groupCall.onGroupCallEvent
        .add(GroupCallStateChange.localMuteStateChanged);
    return;
  }
}