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"); }); }