launchMediaSettings function

Future<void> launchMediaSettings(
  1. LaunchMediaSettingsOptions options
)

Launches the media settings modal and updates the available audio and video input devices.

This function checks if the media settings modal is not currently visible, and if so, it attempts to get the media stream to force the permission prompt, then retrieves the available media devices and updates the audio and video inputs lists.

Example:

final options = LaunchMediaSettingsOptions(
  updateIsMediaSettingsModalVisible: (isVisible) => print("Modal visibility: $isVisible"),
  isMediaSettingsModalVisible: false,
  audioInputs: [],
  videoInputs: [],
  updateAudioInputs: (inputs) => print("Audio Inputs: $inputs"),
  updateVideoInputs: (inputs) => print("Video Inputs: $inputs"),
  videoAlreadyOn: false,
  audioAlreadyOn: false,
  onWeb: true,
  updateIsLoadingModalVisible: (isVisible) => print("Loading modal: $isVisible"),
);

await launchMediaSettings(options);

Implementation

Future<void> launchMediaSettings(LaunchMediaSettingsOptions options) async {
  if (!options.isMediaSettingsModalVisible) {
    try {
      // Force permission prompt by attempting to get media stream
      options.updateIsLoadingModalVisible(true);

      if (options.onWeb && !options.videoAlreadyOn && !options.audioAlreadyOn) {
        MediaStream stream = await navigator.mediaDevices.getUserMedia({
          'audio': true,
          'video': true,
        });

        // Close the stream as it's not needed
        for (var track in stream.getTracks()) {
          track.stop();
        }
      }

      // Get the list of all available media devices
      List<MediaDeviceInfo> devices =
          await navigator.mediaDevices.enumerateDevices();

      // Filter devices to get only audio and video input devices
      options.updateVideoInputs(
          devices.where((device) => device.kind == 'videoinput').toList());
      options.updateAudioInputs(
          devices.where((device) => device.kind == 'audioinput').toList());

      options.updateIsLoadingModalVisible(false);
    } catch (error) {
      options.updateIsLoadingModalVisible(false);
      if (kDebugMode) {
        print('Error getting media devices: $error');
      }
    }
  }

  // Toggle the media settings modal visibility
  options
      .updateIsMediaSettingsModalVisible(!options.isMediaSettingsModalVisible);
}