Skip to content

Commit

Permalink
Merge branch 'development' of https://github.com/stijnvdb88/Snap.Net
Browse files Browse the repository at this point in the history
  • Loading branch information
stijnvdb88 committed Jan 3, 2022
2 parents defcfba + 2115026 commit 6f1534f
Show file tree
Hide file tree
Showing 26 changed files with 752 additions and 59 deletions.
139 changes: 130 additions & 9 deletions Mobile/Mobile.Android/MainActivity.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
using System;

using Android;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Media;
using Android.Media.Projection;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Support.V4.App;
using Android.Support.V4.Content;
using SnapDotNet.Mobile.Common;
using SnapDotNet.Mobile.Droid.Player;
using SnapDotNet.Mobile.Player;
using Xamarin.Forms;
using Exception = Java.Lang.Exception;
using Xamarin.Essentials;

namespace SnapDotNet.Mobile.Droid
{
Expand All @@ -24,10 +29,21 @@ public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompa
internal static MainActivity Instance { get; private set; }

private SnapclientServiceConnection m_SnapclientServiceConnection = null;
private BroadcastServiceConnection m_BroadcastServiceConnection = null;
private Action m_OnPlayStateChangedCallback = null;
private Action m_OnBroadcastStateChangedCallback = null;

private SnapcastBroadcastReceiver m_AudioPlugChangedReceiver = new SnapcastBroadcastReceiver();

private MediaProjectionManager m_MediaProjectionmanager = null;

private const int RECORD_AUDIO_PERMISSION_REQUEST_CODE = 42;
private const int MEDIA_PROJECTION_REQUEST_CODE = 13;

private string m_BroadcastHost;
private int m_BroadcastPort;
private EBroadcastMode m_BroadcastMode = EBroadcastMode.Media;

protected override void OnCreate(Bundle savedInstanceState)
{
Instance = this;
Expand All @@ -53,9 +69,18 @@ protected override void OnStart()
{
base.OnStart();
m_SnapclientServiceConnection = new SnapclientServiceConnection(this);
Intent intent = new Intent(this, typeof(SnapclientService));
BindService(intent, m_SnapclientServiceConnection, Bind.AutoCreate);


Intent playerIntent = new Intent(this, typeof(SnapclientService));
BindService(playerIntent, m_SnapclientServiceConnection, Bind.AutoCreate);

m_BroadcastServiceConnection = new BroadcastServiceConnection(this);
Intent broadcastServiceIntent = new Intent(this, typeof(BroadcastService));
BindService(broadcastServiceIntent, m_BroadcastServiceConnection, Bind.AutoCreate);
}

private bool _HasRecordAudioPermission()
{
return ContextCompat.CheckSelfPermission(this, Manifest.Permission.RecordAudio) == Permission.Granted;
}

protected override void OnStop()
Expand All @@ -67,20 +92,72 @@ protected override void OnStop()
m_SnapclientServiceConnection.IsConnected = false;
}

if (m_BroadcastServiceConnection != null && m_BroadcastServiceConnection.IsConnected)
{
UnbindService(m_BroadcastServiceConnection);
m_BroadcastServiceConnection.IsConnected = false;
}


//UnregisterReceiver(m_AudioPlugChangedReceiver);
}

public void Play(string host, int port)
{
Intent i = new Intent(this, typeof(Player.SnapclientService));
i.SetFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);
i.PutExtra(SnapclientService.EXTRA_HOST, host);
i.PutExtra(SnapclientService.EXTRA_PORT, port);
i.SetAction(SnapclientService.ACTION_START);
i.PutExtra(ServiceBase.EXTRA_HOST, host);
i.PutExtra(ServiceBase.EXTRA_PORT, port);
i.SetAction(ServiceBase.ACTION_START);

StartService(i);
}

public void Broadcast(string host, int port, EBroadcastMode broadcastMode)
{
m_BroadcastHost = host;
m_BroadcastPort = port;
m_BroadcastMode = broadcastMode;

if (_HasRecordAudioPermission() == false)
{
ActivityCompat.RequestPermissions(this, new [] { Manifest.Permission.RecordAudio}, RECORD_AUDIO_PERMISSION_REQUEST_CODE);
}
else
{
_StartMediaProjectionRequest();
}

}

private void _StartMediaProjectionRequest()
{
m_MediaProjectionmanager = Android.App.Application.Context.GetSystemService(Context.MediaProjectionService) as MediaProjectionManager;
StartActivityForResult(m_MediaProjectionmanager.CreateScreenCaptureIntent(), MEDIA_PROJECTION_REQUEST_CODE);
}

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
if (requestCode != MEDIA_PROJECTION_REQUEST_CODE)
{
return;
}

if (resultCode == Result.Ok)
{
Toast.MakeText(this, "MediaProjection permission granted. Audio capture starting...", ToastLength.Short)?.Show();
}

Intent i = new Intent(this, typeof(BroadcastService));
i.SetFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);
i.PutExtra(ServiceBase.EXTRA_HOST, m_BroadcastHost);
i.PutExtra(ServiceBase.EXTRA_PORT, m_BroadcastPort);
i.PutExtra(BroadcastService.EXTRA_BROADCAST_MODE, (int)m_BroadcastMode);
i.PutExtra(BroadcastService.EXTRA_RESULT_DATA, data);
i.SetAction(ServiceBase.ACTION_START);
StartForegroundService(i);
}

public void Restart()
{
if (m_SnapclientServiceConnection != null && m_SnapclientServiceConnection.IsConnected)
Expand All @@ -97,12 +174,30 @@ public void Stop()
}
}


public void StopBroadcast()
{
if (m_BroadcastServiceConnection != null && m_BroadcastServiceConnection.IsConnected)
{
m_BroadcastServiceConnection.BroadcastService.Stop();
}
}

public bool IsPlaying()
{
if (m_SnapclientServiceConnection != null && m_SnapclientServiceConnection.IsConnected)
{
return m_SnapclientServiceConnection.Player.IsPlaying();
}
return false;
}

public bool IsBroadcasting()
{
if (m_BroadcastServiceConnection != null && m_BroadcastServiceConnection.IsConnected)
{
return m_BroadcastServiceConnection.BroadcastService.IsBroadcasting();
}

return false;
}
Expand All @@ -112,18 +207,39 @@ public void OnPlayStateChangedCallback(Action callback)
m_OnPlayStateChangedCallback = callback;
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
public void OnBroadcastStateChangedCallback(Action callback)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
m_OnBroadcastStateChangedCallback = callback;
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);

if (requestCode == RECORD_AUDIO_PERMISSION_REQUEST_CODE)
{
if (grantResults[0] == Permission.Granted)
{
Toast.MakeText(this, "Permission to capture audio granted. Please tap the Broadcast button again to start broadcasting.", ToastLength.Long)?.Show();
}
else
{
Toast.MakeText(this, "Permission to capture audio denied", ToastLength.Short)?.Show();
}
}
}

public void OnPlayStateChanged(SnapclientService service)
{
m_OnPlayStateChangedCallback?.Invoke();
}

public void OnBroadcastStateChanged(BroadcastService service)
{
m_OnBroadcastStateChangedCallback?.Invoke();
}

public void OnLog(SnapclientService snapclientService, string timestamp, string logClass, string tag,
string msg)
{
Expand All @@ -141,5 +257,10 @@ public void OnError(SnapclientService snapclientService, string msg, Exception e
{
m_OnPlayStateChangedCallback?.Invoke();
}

public void OnError(BroadcastService broadcastService, string msg, Exception exception)
{
m_OnBroadcastStateChangedCallback?.Invoke();
}
}
}
Loading

0 comments on commit 6f1534f

Please sign in to comment.