native-android-csharp/DemoAndroid/Activities/WakeOnLanActivity.cs
2024-06-19 19:24:15 +02:00

128 lines
3.7 KiB
C#

using System.Net;
using System.Net.Sockets;
using Android.Content;
using Android.Hardware.Biometrics;
using Android.OS;
using Java.Lang;
namespace DemoAndroid;
[Activity(Label = "@string/app_name", MainLauncher = true, Theme = "@style/Default")]
public class WakeOnLanActivity : Activity
{
private const int BiometricStrong = 0x0000000f;
private const int BiometricWeak = 0x000000ff;
private const int DeviceCredential = 0x00008000;
private bool _authenticated = false;
protected override void OnCreate(Bundle? savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your application here
SetContentView(Resource.Layout.activity_wakeonlan);
var button = FindViewById<Button>(Resource.Id.btnWakeOnLan);
button.Click += (sender, args) =>
{
OnlyAuthenticated(WakePc);
};
}
private void OnlyAuthenticated(Action action)
{
if (!_authenticated)
{
var callback = new BiometricCallback(this, () =>
{
_authenticated = true;
action();
});
var prompt = new BiometricPrompt.Builder(this)
.SetNegativeButton("Annuleren", MainExecutor, callback)
.SetTitle("Bewijs jezelf met je vingerafdruk")
.SetSubtitle("We willen zeker weten dat je niet Colinde bent")
.SetAllowedAuthenticators(BiometricStrong)
.Build();
var cancellation = new CancellationSignal();
prompt.Authenticate(cancellation, MainExecutor, callback);
return;
}
action();
}
private void WakePc()
{
byte[] macAddress = [0x2c, 0x4d, 0x54, 0x4d, 0x10, 0x0f];
var magicPacket = new byte[102];
// Fill first 6 bytes with 0xFF
for (var i = 0; i < 6; i++)
{
magicPacket[i] = 0xFF;
}
// Repeat MAC address 16 times
for (var i = 1; i <= 16; i++)
{
for (var j = 0; j < 6; j++)
{
magicPacket[i * 6 + j] = macAddress[j];
}
}
using var client = new UdpClient();
client.EnableBroadcast = true;
var endpoint = new IPEndPoint(IPAddress.Broadcast, 9); // 255.255.255.255 port 9
for (var i = 0; i < 5; i++)
{
// Try 5 times
client.Send(magicPacket, magicPacket.Length, endpoint);
}
Toast.MakeText(this, "Computer started!", ToastLength.Long)!.Show();
}
}
/// <summary>
/// Biometric authentication callbacks
/// https://developer.android.com/identity/sign-in/biometric-auth#java
/// </summary>
class BiometricCallback : BiometricPrompt.AuthenticationCallback, IDialogInterfaceOnClickListener
{
private Context _context;
private readonly Action _onSuccess;
public BiometricCallback(Context context, Action onSuccess)
{
_context = context;
_onSuccess = onSuccess;
}
public override void OnAuthenticationError(BiometricErrorCode errorCode, ICharSequence? errString)
{
Toast.MakeText(_context, $"Authenticatie mislukt: {errorCode}, {errString?.ToString()}", ToastLength.Long)!.Show();
}
public override void OnAuthenticationSucceeded(BiometricPrompt.AuthenticationResult? result)
{
Toast.MakeText(_context, "Authentication succeeded!", ToastLength.Short)!.Show();
_onSuccess();
}
public override void OnAuthenticationFailed()
{
Toast.MakeText(_context, "Authenticatie mislukt!", ToastLength.Long)!.Show();
}
public void OnClick(IDialogInterface? dialog, int which)
{
Toast.MakeText(_context, "Geannuleerd!", ToastLength.Long)!.Show();
}
}