aca479888a
In order to write an equivalent tutorial for Xamarin, I am first following the UWP tutorial. Fixed many little spelling mistakes and rephrased some sentences. Fixed a crash when video is requested but the device has no camera. Fixed a crash when opening an audio recording. (Linphone.Content.FilePath returns a path with mixed '/' and '\'. I don't know why and I'm not sure I understand why the file was auto-downloaded either)
202 lines
5.2 KiB
C#
202 lines
5.2 KiB
C#
/*
|
|
* Copyright (c) 2010-2020 Belledonne Communications SARL.
|
|
*
|
|
* This file is part of Linphone TutorialCS.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
using _06_GroupChat.Service;
|
|
using Linphone;
|
|
using Windows.UI.Xaml;
|
|
using Windows.UI.Xaml.Controls;
|
|
using Windows.UI.Xaml.Navigation;
|
|
|
|
namespace _06_GroupChat.Views
|
|
{
|
|
public sealed partial class CallsPage : Page
|
|
{
|
|
private CoreService CoreService { get; } = CoreService.Instance;
|
|
|
|
private VideoService VideoService { get; } = VideoService.Instance;
|
|
|
|
private Call IncomingCall;
|
|
|
|
public CallsPage()
|
|
{
|
|
this.InitializeComponent();
|
|
}
|
|
|
|
protected override void OnNavigatedFrom(NavigationEventArgs e)
|
|
{
|
|
VideoService.StopVideoStream();
|
|
CoreService.RemoveOnCallStateChangedDelegate(OnCallStateChanged);
|
|
base.OnNavigatedFrom(e);
|
|
}
|
|
|
|
protected override void OnNavigatedTo(NavigationEventArgs e)
|
|
{
|
|
base.OnNavigatedTo(e);
|
|
|
|
HelloText.Text += CoreService.Core.DefaultProxyConfig.FindAuthInfo().Username;
|
|
CoreService.AddOnCallStateChangedDelegate(OnCallStateChanged);
|
|
|
|
if (CoreService.Core.CurrentCall != null)
|
|
{
|
|
OnCallStateChanged(CoreService.Core, CoreService.Core.CurrentCall, CoreService.Core.CurrentCall.State, null);
|
|
}
|
|
}
|
|
|
|
private void CallClick(object sender, RoutedEventArgs e)
|
|
{
|
|
CoreService.Call(UriToCall.Text);
|
|
}
|
|
|
|
private void OnHangUpClicked(object sender, RoutedEventArgs e)
|
|
{
|
|
CoreService.Core.TerminateAllCalls();
|
|
}
|
|
|
|
private void SoundClick(object sender, RoutedEventArgs e)
|
|
{
|
|
if (CoreService.ToggleSpeaker())
|
|
{
|
|
Sound.Content = "Switch on Sound";
|
|
}
|
|
else
|
|
{
|
|
Sound.Content = "Switch off Sound";
|
|
}
|
|
}
|
|
|
|
private async void CameraClick(object sender, RoutedEventArgs e)
|
|
{
|
|
await CoreService.ToggleCameraAsync();
|
|
Camera.Content = "Waiting for accept ...";
|
|
Camera.IsEnabled = false;
|
|
}
|
|
|
|
private void MicClick(object sender, RoutedEventArgs e)
|
|
{
|
|
if (CoreService.ToggleMic())
|
|
{
|
|
Mic.Content = "Mute";
|
|
}
|
|
else
|
|
{
|
|
Mic.Content = "Unmute";
|
|
}
|
|
}
|
|
|
|
private async void AnswerClick(object sender, RoutedEventArgs e)
|
|
{
|
|
await CoreService.OpenMicrophonePopup();
|
|
IncomingCall.Accept();
|
|
IncomingCall = null;
|
|
}
|
|
|
|
private void DeclineClick(object sender, RoutedEventArgs e)
|
|
{
|
|
if (IncomingCall != null)
|
|
{
|
|
IncomingCall.Decline(Reason.Declined);
|
|
IncomingCall = null;
|
|
}
|
|
}
|
|
|
|
private void OnCallStateChanged(Core core, Call call, CallState state, string message)
|
|
{
|
|
CallText.Text = "Your call state is : " + state.ToString();
|
|
switch (state)
|
|
{
|
|
case CallState.IncomingReceived:
|
|
|
|
IncomingCall = call;
|
|
IncomingCallStackPanel.Visibility = Visibility.Visible;
|
|
IncommingCallText.Text = " " + call.RemoteAddress.AsString();
|
|
break;
|
|
|
|
case CallState.OutgoingInit:
|
|
case CallState.OutgoingProgress:
|
|
case CallState.OutgoingRinging:
|
|
|
|
HangUp.IsEnabled = true;
|
|
break;
|
|
|
|
case CallState.StreamsRunning:
|
|
case CallState.UpdatedByRemote:
|
|
|
|
CallInProgressGuiUpdates();
|
|
if (call.CurrentParams.VideoEnabled)
|
|
{
|
|
StartVideoAndUpdateGui();
|
|
}
|
|
else
|
|
{
|
|
StopVideoAndUpdateGui();
|
|
}
|
|
break;
|
|
|
|
case CallState.Error:
|
|
case CallState.End:
|
|
case CallState.Released:
|
|
|
|
IncomingCall = null;
|
|
EndingCallGuiUpdates();
|
|
VideoService.StopVideoStream();
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void StopVideoAndUpdateGui()
|
|
{
|
|
Camera.Content = "Switch on Camera";
|
|
Camera.IsEnabled = true;
|
|
VideoGrid.Visibility = Visibility.Collapsed;
|
|
VideoService.StopVideoStream();
|
|
}
|
|
|
|
private void StartVideoAndUpdateGui()
|
|
{
|
|
VideoGrid.Visibility = Visibility.Visible;
|
|
Camera.Content = "Switch off Camera";
|
|
VideoService.StartVideoStream(VideoSwapChainPanel, PreviewSwapChainPanel);
|
|
Camera.IsEnabled = true;
|
|
}
|
|
|
|
private void EndingCallGuiUpdates()
|
|
{
|
|
IncomingCallStackPanel.Visibility = Visibility.Collapsed;
|
|
CallButton.IsEnabled = true;
|
|
HangUp.IsEnabled = false;
|
|
Sound.IsEnabled = false;
|
|
Camera.IsEnabled = false;
|
|
Mic.IsEnabled = false;
|
|
VideoGrid.Visibility = Visibility.Collapsed;
|
|
Camera.Content = "Switch on Camera";
|
|
Mic.Content = "Mute";
|
|
Sound.Content = "Switch off Sound";
|
|
}
|
|
|
|
private void CallInProgressGuiUpdates()
|
|
{
|
|
IncomingCallStackPanel.Visibility = Visibility.Collapsed;
|
|
CallButton.IsEnabled = false;
|
|
HangUp.IsEnabled = true;
|
|
Sound.IsEnabled = true;
|
|
Camera.IsEnabled = true;
|
|
Mic.IsEnabled = true;
|
|
}
|
|
}
|
|
} |