diff --git a/src/WorkFlowCheck.MAUI/AppShell.xaml b/src/WorkFlowCheck.MAUI/AppShell.xaml
index a6ab65e..4a53744 100644
--- a/src/WorkFlowCheck.MAUI/AppShell.xaml
+++ b/src/WorkFlowCheck.MAUI/AppShell.xaml
@@ -5,10 +5,12 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:WorkFlowCheck.MAUI"
xmlns:security="clr-namespace:WorkFlowCheck.MAUI.Pages.Security"
+ xmlns:nfc="clr-namespace:WorkFlowCheck.MAUI.Pages.NFC"
Shell.FlyoutBehavior="Disabled"
Title="WorkFlowCheck.MAUI">
+
diff --git a/src/WorkFlowCheck.MAUI/MainPage.xaml b/src/WorkFlowCheck.MAUI/MainPage.xaml
index aac399c..2377a26 100644
--- a/src/WorkFlowCheck.MAUI/MainPage.xaml
+++ b/src/WorkFlowCheck.MAUI/MainPage.xaml
@@ -37,6 +37,12 @@
SemanticProperties.Hint="Counts the number of times you click"
Clicked="OnCounterClicked"
HorizontalOptions="Fill" />
+
diff --git a/src/WorkFlowCheck.MAUI/MainPage.xaml.cs b/src/WorkFlowCheck.MAUI/MainPage.xaml.cs
index 7aeb956..44ece58 100644
--- a/src/WorkFlowCheck.MAUI/MainPage.xaml.cs
+++ b/src/WorkFlowCheck.MAUI/MainPage.xaml.cs
@@ -44,6 +44,10 @@ namespace WorkFlowCheck.MAUI
}
}
+ private async void OnButtonNFCTest(object sender, EventArgs e)
+ {
+ await Shell.Current.GoToAsync("//NFCTestPage");
+ }
}
}
diff --git a/src/WorkFlowCheck.MAUI/Pages/NFC/NFCTestPage.xaml b/src/WorkFlowCheck.MAUI/Pages/NFC/NFCTestPage.xaml
new file mode 100644
index 0000000..f715f96
--- /dev/null
+++ b/src/WorkFlowCheck.MAUI/Pages/NFC/NFCTestPage.xaml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/WorkFlowCheck.MAUI/Pages/NFC/NFCTestPage.xaml.cs b/src/WorkFlowCheck.MAUI/Pages/NFC/NFCTestPage.xaml.cs
new file mode 100644
index 0000000..370acc0
--- /dev/null
+++ b/src/WorkFlowCheck.MAUI/Pages/NFC/NFCTestPage.xaml.cs
@@ -0,0 +1,130 @@
+using Plugin.NFC;
+using System.Text;
+
+namespace WorkFlowCheck.MAUI.Pages.NFC;
+
+public partial class NFCTestPage : ContentPage
+{
+ public NFCTestPage()
+ {
+ InitializeComponent();
+ }
+ public const string ALERT_TITLE = "NFC";
+ bool _eventsAlreadySubscribed = false;
+ protected override async void OnAppearing()
+ {
+ base.OnAppearing();
+ CrossNFC.Legacy = false;
+ if (CrossNFC.IsSupported)
+ {
+ if (!CrossNFC.Current.IsAvailable)
+ await ShowAlert("NFC is not available");
+
+ if (!CrossNFC.Current.IsEnabled)
+ await ShowAlert("NFC is disabled");
+
+ await AutoStartAsync().ConfigureAwait(false);
+ }
+ else
+ {
+ await ShowAlert("NFC is not available");
+ }
+ }
+ Task ShowAlert(string message, string title = null) => DisplayAlert(string.IsNullOrWhiteSpace(title) ? ALERT_TITLE : title, message, "OK");
+ async Task AutoStartAsync()
+ {
+ // Some delay to prevent Java.Lang.IllegalStateException "Foreground dispatch can only be enabled when your activity is resumed" on Android
+ await Task.Delay(500);
+ await StartListeningIfNotiOS();
+ }
+ async Task StartListeningIfNotiOS()
+ {
+
+ await BeginListening();
+ }
+ async Task BeginListening()
+ {
+ try
+ {
+ MainThread.BeginInvokeOnMainThread(() =>
+ {
+ SubscribeEvents();
+ CrossNFC.Current.StartListening();
+ });
+ }
+ catch (Exception ex)
+ {
+ await ShowAlert(ex.Message);
+ }
+ }
+ void SubscribeEvents()
+ {
+ if (_eventsAlreadySubscribed)
+ UnsubscribeEvents();
+
+ _eventsAlreadySubscribed = true;
+
+ CrossNFC.Current.OnMessageReceived += Current_OnMessageReceived;
+ //CrossNFC.Current.OnMessagePublished += Current_OnMessagePublished;
+ //CrossNFC.Current.OnTagDiscovered += Current_OnTagDiscovered;
+ //CrossNFC.Current.OnNfcStatusChanged += Current_OnNfcStatusChanged;
+ //CrossNFC.Current.OnTagListeningStatusChanged += Current_OnTagListeningStatusChanged;
+
+
+ }
+ void UnsubscribeEvents()
+ {
+ CrossNFC.Current.OnMessageReceived -= Current_OnMessageReceived;
+ //CrossNFC.Current.OnMessagePublished -= Current_OnMessagePublished;
+ //CrossNFC.Current.OnTagDiscovered -= Current_OnTagDiscovered;
+ //CrossNFC.Current.OnNfcStatusChanged -= Current_OnNfcStatusChanged;
+ //CrossNFC.Current.OnTagListeningStatusChanged -= Current_OnTagListeningStatusChanged;
+
+
+
+ _eventsAlreadySubscribed = false;
+ }
+ async void Current_OnMessageReceived(ITagInfo tagInfo)
+ {
+ if (tagInfo == null)
+ {
+ await ShowAlert("No tag found");
+ return;
+ }
+
+ // Customized serial number
+ var identifier = tagInfo.Identifier;
+ var serialNumber = NFCUtils.ByteArrayToHexString(identifier, ":");
+ var title = !string.IsNullOrWhiteSpace(serialNumber) ? $"Tag [{serialNumber}]" : "Tag Info";
+
+ if (!tagInfo.IsSupported)
+ {
+ await ShowAlert("Unsupported tag (app)", title);
+ }
+ else if (tagInfo.IsEmpty)
+ {
+ await ShowAlert("Empty tag", title);
+ }
+ else
+ {
+ var first = tagInfo.Records[0];
+ await ShowAlert(GetMessage(first), title);
+ }
+ }
+ string GetMessage(NFCNdefRecord record)
+ {
+ var message = $"Message: {record.Message}";
+ message += Environment.NewLine;
+ message += $"RawMessage: {Encoding.UTF8.GetString(record.Payload)}";
+ message += Environment.NewLine;
+ message += $"Type: {record.TypeFormat}";
+
+ if (!string.IsNullOrWhiteSpace(record.MimeType))
+ {
+ message += Environment.NewLine;
+ message += $"MimeType: {record.MimeType}";
+ }
+
+ return message;
+ }
+}
\ No newline at end of file
diff --git a/src/WorkFlowCheck.MAUI/Pages/Security/LoginPage.xaml.cs b/src/WorkFlowCheck.MAUI/Pages/Security/LoginPage.xaml.cs
index 92ec965..0de37b0 100644
--- a/src/WorkFlowCheck.MAUI/Pages/Security/LoginPage.xaml.cs
+++ b/src/WorkFlowCheck.MAUI/Pages/Security/LoginPage.xaml.cs
@@ -21,7 +21,7 @@ public partial class LoginPage : ContentPage
await DisplayAlert("Success", "You are now logged in.", "OK");
// Visszatérés a MainPage-re
- await Navigation.PopAsync();
+ await Shell.Current.GoToAsync("//MainPage");
}
else
{
diff --git a/src/WorkFlowCheck.MAUI/Platforms/Android/AndroidManifest.xml b/src/WorkFlowCheck.MAUI/Platforms/Android/AndroidManifest.xml
index e9937ad..db3fcde 100644
--- a/src/WorkFlowCheck.MAUI/Platforms/Android/AndroidManifest.xml
+++ b/src/WorkFlowCheck.MAUI/Platforms/Android/AndroidManifest.xml
@@ -3,4 +3,6 @@
+
+
\ No newline at end of file
diff --git a/src/WorkFlowCheck.MAUI/Platforms/Android/MainActivity.cs b/src/WorkFlowCheck.MAUI/Platforms/Android/MainActivity.cs
index 8bf9c71..a4d463b 100644
--- a/src/WorkFlowCheck.MAUI/Platforms/Android/MainActivity.cs
+++ b/src/WorkFlowCheck.MAUI/Platforms/Android/MainActivity.cs
@@ -1,6 +1,8 @@
using Android.App;
+using Android.Content;
using Android.Content.PM;
using Android.OS;
+using Plugin.NFC;
namespace WorkFlowCheck.MAUI
{
@@ -12,5 +14,26 @@ namespace WorkFlowCheck.MAUI
SecureStorage.Default.Remove("WFCUser");
base.OnDestroy();
}
+ protected override void OnCreate(Bundle savedInstanceState)
+ {
+ // Plugin NFC: Initialization before base.OnCreate(...) (Important on .NET MAUI)
+ CrossNFC.Init(this);
+
+ base.OnCreate(savedInstanceState);
+ }
+ protected override void OnResume()
+ {
+ base.OnResume();
+
+ // Plugin NFC: Restart NFC listening on resume (needed for Android 10+)
+ CrossNFC.OnResume();
+ }
+ protected override void OnNewIntent(Intent intent)
+ {
+ base.OnNewIntent(intent);
+
+ // Plugin NFC: Tag Discovery Interception
+ CrossNFC.OnNewIntent(intent);
+ }
}
}
diff --git a/src/WorkFlowCheck.MAUI/WorkFlowCheck.MAUI.csproj b/src/WorkFlowCheck.MAUI/WorkFlowCheck.MAUI.csproj
index 5a3df93..faa7492 100644
--- a/src/WorkFlowCheck.MAUI/WorkFlowCheck.MAUI.csproj
+++ b/src/WorkFlowCheck.MAUI/WorkFlowCheck.MAUI.csproj
@@ -73,6 +73,9 @@
+
+ MSBuild:Compile
+
MSBuild:Compile