Beispiel #1
0
        void Connect()
        {
            _connectionDisposer = _connection.ConnectionRequest(_userContext).Subscribe(
                // 'async' here is fire-and-forget!!! It is OK for exceptions and error messages only.
                onNext: async peerResponse =>
            {
                switch (peerResponse.Type)
                {
                case PeerResponseType.PeerJoined:
                    if (peerResponse.MediaStream != null)
                    {
                        _runOnUiThread.Invoke((Action)(() =>
                        {
                            _mediaStreamManager.Add((MediaStreamParameters) new MediaStreamParameters
                            {
                                Stream = peerResponse.MediaStream,
                                Label = peerResponse.Name,
                                Hangup = false,
                                VideoMuted = false,
                                AudioMuted = false,
                                CameraType = CameraType.Default,
                                ShowControls = false
                            });
                        }));

                        _reRender?.Invoke();
                    }
                    break;

                case PeerResponseType.PeerLeft:
                    _runOnUiThread.Invoke(() =>
                    {
                        _mediaStreamManager.Remove(peerResponse.Name);
                    });
                    _reRender?.Invoke();
                    _logger.LogInformation($"************* APP PeerLeft");
                    break;

                case PeerResponseType.PeerError:
                    _runOnUiThread.Invoke(() =>
                    {
                        _mediaStreamManager.Remove(peerResponse.Name);
                    });
                    _reRender?.Invoke();

                    _logger.LogInformation($"************* APP PeerError");
                    _ = await _modalPopup.GenericPopupAsync(new GenericPopupIn
                    {
                        Title = "Error",
                        Text  = $"Peer {peerResponse.Name} indicated an error:" +
                                Environment.NewLine +
                                peerResponse.ErrorMessage,
                        Ok = "Ok",
                    });
                    break;

                case PeerResponseType.PeerMedia:
                    _logger.LogInformation($"TODO: ************* APP PeerMedia");
                    break;
                }
            },
                onError: async exception =>
            {
                _logger.LogInformation($"************* APP OnError:{exception.Message}");
                if (exception.Message.Contains("has already joined"))
                {
                    var popupOut = await _modalPopup.GenericPopupAsync(new GenericPopupIn
                    {
                        Title = "Error",
                        Text  = $"User name {_userContext.Name} " +
                                $"is in use. Please enter another name or 'Cancel' to cancel the call.",
                        EntryPlaceholder = "New user name",
                        Ok     = "OK",
                        Cancel = "Cancel"
                    });
                    await OnPageDisappearingAsync();
                    if (popupOut.Ok)
                    {
                        _userContext.Name          = popupOut.Entry;
                        _connectionParameters.Name = popupOut.Entry;
                        await OnPageAppearingAsync(_connectionParameters, _reRender);
                    }
                    else
                    {
                        await _navigation.NavigateToPageAsync("///", "ConnectionParametersPage");
                    }
                }
                else
                {
                    var popupOut = await _modalPopup.GenericPopupAsync(new GenericPopupIn
                    {
                        Title = "Error",
                        Text  = $"An error occured during the connection. Here is the reported error message:" +
                                Environment.NewLine +
                                $"{exception.Message}",
                        Ok     = "Try again",
                        Cancel = "Cancel"
                    });
                    Disconnect();
                    if (popupOut.Ok)
                    {
                        Connect();
                    }
                    else
                    {
                        await _navigation.NavigateToPageAsync("///", "ConnectionParametersPage");
                    }
                }
            },
                onCompleted: () =>
            {
                _logger.LogInformation($"************* APP OnCompleted");
            });
        }