From b69f9af6f3a40d244aacbf3271290edde9f096bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Szab=C3=B3?= Date: Fri, 28 Mar 2025 15:37:14 +0100 Subject: [PATCH] =?UTF-8?q?NFC=20csak=20Androidra=20jav=C3=ADt=C3=A1s=20..?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CheckPoints/CheckPointsPage.xaml.cs | 90 ++------- .../Pages/CheckList/CheckListPage.xaml.cs | 17 +- .../Pages/NFC/NFCWaiter.xaml | 16 +- .../Pages/NFC/NFCWaiter.xaml.cs | 178 +++++++----------- .../Platforms/Android/AndroidManifest.xml | 2 +- .../Platforms/Android/MainActivity.cs | 52 +++-- 6 files changed, 142 insertions(+), 213 deletions(-) diff --git a/src/WorkFlowCheck.MAUI/Pages/BaseStock/CheckPoints/CheckPointsPage.xaml.cs b/src/WorkFlowCheck.MAUI/Pages/BaseStock/CheckPoints/CheckPointsPage.xaml.cs index d0aaa32..5845245 100644 --- a/src/WorkFlowCheck.MAUI/Pages/BaseStock/CheckPoints/CheckPointsPage.xaml.cs +++ b/src/WorkFlowCheck.MAUI/Pages/BaseStock/CheckPoints/CheckPointsPage.xaml.cs @@ -4,6 +4,7 @@ using WorkFlowCheck.Common.DTO; using WorkFlowCheck.MAUI.Pages.BaseStock.CheckPoints; using WorkFlowCheck.MAUI.Services.Interfaces; using Plugin.NFC; +using WorkFlowCheck.MAUI.Pages.NFC; namespace WorkFlowCheck.MAUI.Pages.BaseStock; @@ -11,7 +12,7 @@ public partial class CheckPointsPage : ContentPage { private readonly IBaseStockService _baseStockService; private readonly ISyncService _syncService; - private bool _onReceiveing = false; + public CheckPointsPage() { @@ -51,8 +52,20 @@ public partial class CheckPointsPage : ContentPage } private async void OnPairItem(CheckPointDTO checkPointDTO) { - _checkPointDTO = checkPointDTO; - await BeginListening(); + var checkPointCode = await NFCWaiter.ShowModalAsync(); + if (!string.IsNullOrEmpty(checkPointCode)) + { + if (Navigation.ModalStack.Count > 0) + { + await Navigation.PopModalAsync(); + } + if (checkPointDTO != null) + { + checkPointDTO.Code = checkPointCode; + await _baseStockService.UpdateCheckPoint(checkPointDTO); + await LoadCheckPoints(); + } + } } protected override bool OnBackButtonPressed() { @@ -63,75 +76,4 @@ public partial class CheckPointsPage : ContentPage { _syncService.SyncCheckPointsUp(); } - #region NFC - bool _eventsAlreadySubscribed = false; - CheckPointDTO _checkPointDTO = null; - async Task BeginListening() - { - try - { - MainThread.BeginInvokeOnMainThread(() => - { - SubscribeEvents(); - CrossNFC.Current.StartListening(); - }); - } - catch (Exception ex) - { - - } - } - async Task EndListening() - { - try - { - MainThread.BeginInvokeOnMainThread(() => - { - UnsubscribeEvents(); - CrossNFC.Current.StopPublishing(); - CrossNFC.Current.StopListening(); - - }); - } - catch (Exception ex) - { - - } - } - void SubscribeEvents() - { - if (_eventsAlreadySubscribed) - UnsubscribeEvents(); - - _eventsAlreadySubscribed = true; - CrossNFC.Current.OnMessageReceived += Current_OnMessageReceived_NFCData; - } - void UnsubscribeEvents() - { - CrossNFC.Current.OnMessageReceived -= Current_OnMessageReceived_NFCData; - _eventsAlreadySubscribed = false; - } - async void Current_OnMessageReceived_NFCData(ITagInfo tagInfo) - { - if (_onReceiveing) return; - _onReceiveing = true; - if (tagInfo == null) - { - return; - } - var identifier = tagInfo.Identifier; - var serialNumber = NFCUtils.ByteArrayToHexString(identifier, ":"); - - if (_checkPointDTO != null) - { - _checkPointDTO.Code = serialNumber; - await _baseStockService.UpdateCheckPoint(_checkPointDTO); - await Task.Delay(500); - await EndListening(); - await LoadCheckPoints(); - } - _onReceiveing = false; - } - - #endregion } \ No newline at end of file diff --git a/src/WorkFlowCheck.MAUI/Pages/CheckList/CheckListPage.xaml.cs b/src/WorkFlowCheck.MAUI/Pages/CheckList/CheckListPage.xaml.cs index 32a5d3e..888110d 100644 --- a/src/WorkFlowCheck.MAUI/Pages/CheckList/CheckListPage.xaml.cs +++ b/src/WorkFlowCheck.MAUI/Pages/CheckList/CheckListPage.xaml.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Threading.Tasks; using System.Windows.Input; using WorkFlowCheck.Common.DTO; using WorkFlowCheck.MAUI.Pages.NFC; @@ -55,16 +56,16 @@ public partial class CheckListPage : ContentPage } private async void OnContinueItem(CheckListHeaderDTO checkListHeaderDTO) { - var taskCompletionSource = new TaskCompletionSource(); - await Navigation.PushModalAsync(new NFCWaiter(taskCompletionSource)); - var checkPintCode = await taskCompletionSource.Task; - if (!string.IsNullOrEmpty(checkPintCode)) + var checkPointCode = await NFCWaiter.ShowModalAsync(); + if (!string.IsNullOrEmpty(checkPointCode)) { - await Navigation.PopModalAsync(); - await Navigation.PushAsync(new CheckListWorkPage(checkListHeaderDTO.Id, checkPintCode)); + if (Navigation.ModalStack.Count > 0) + { + await Navigation.PopModalAsync(); + } + + await Navigation.PushAsync(new CheckListWorkPage(checkListHeaderDTO.Id, checkPointCode)); } - - } private async Task LoadCheckListTemplate() { diff --git a/src/WorkFlowCheck.MAUI/Pages/NFC/NFCWaiter.xaml b/src/WorkFlowCheck.MAUI/Pages/NFC/NFCWaiter.xaml index 50cb37d..c1077cc 100644 --- a/src/WorkFlowCheck.MAUI/Pages/NFC/NFCWaiter.xaml +++ b/src/WorkFlowCheck.MAUI/Pages/NFC/NFCWaiter.xaml @@ -2,11 +2,13 @@ - - + Title="Várakozás NFC olvasásra" + BackgroundColor="Black"> + + \ No newline at end of file diff --git a/src/WorkFlowCheck.MAUI/Pages/NFC/NFCWaiter.xaml.cs b/src/WorkFlowCheck.MAUI/Pages/NFC/NFCWaiter.xaml.cs index b3a1bb7..256b64f 100644 --- a/src/WorkFlowCheck.MAUI/Pages/NFC/NFCWaiter.xaml.cs +++ b/src/WorkFlowCheck.MAUI/Pages/NFC/NFCWaiter.xaml.cs @@ -1,132 +1,88 @@ -using Plugin.NFC; -using System.Collections.ObjectModel; +using System.Threading.Tasks; namespace WorkFlowCheck.MAUI.Pages.NFC; public partial class NFCWaiter : ContentPage { + private bool _nfcIsActive = false; + private TaskCompletionSource _taskCompletionSource = new(); - private bool _eventsAlreadySubscribed = false; - private bool _onReceiveing = false; - private TaskCompletionSource _taskCompletionSource; + public static async Task ShowModalAsync() + { + var page = new NFCWaiter(); + await Shell.Current.Navigation.PushModalAsync(page); + return await page._taskCompletionSource.Task; + } - public NFCWaiter(TaskCompletionSource taskCompletionSource) + public NFCWaiter() { InitializeComponent(); - _taskCompletionSource = taskCompletionSource; } + protected override async void OnAppearing() { base.OnAppearing(); - - CrossNFC.Legacy = false; - if (CrossNFC.IsSupported) +#if ANDROID + if (Platform.CurrentActivity is Android.App.Activity activity && activity is MainActivity mainActivity) { - 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"); + mainActivity.StartNfc(OnTagRead); + _nfcIsActive = true; } +#endif - } - protected override void OnDisappearing() - { - base.OnDisappearing(); - } - - 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); - } - } - async Task StopListening() - { - try - { - MainThread.BeginInvokeOnMainThread(() => - { - CrossNFC.Current.StopListening(); - UnsubscribeEvents(); - }); - } - catch (Exception ex) - { - //await ShowAlert(ex.Message); - } - } - - void SubscribeEvents() - { - if (_eventsAlreadySubscribed) - UnsubscribeEvents(); - - _eventsAlreadySubscribed = true; - - CrossNFC.Current.OnMessageReceived += OnMessageReceived_NFCData; - - - } - void UnsubscribeEvents() - { - CrossNFC.Current.OnMessageReceived -= OnMessageReceived_NFCData; - _eventsAlreadySubscribed = false; - } - async void OnMessageReceived_NFCData(ITagInfo tagInfo) - { - _onReceiveing = true; - - - - if (tagInfo == null) - { - await ShowAlert("No tag found"); - _onReceiveing = false; - return; - } - - // Customized serial number - var identifier = tagInfo.Identifier; - var serialNumber = NFCUtils.ByteArrayToHexString(identifier, ":"); - _taskCompletionSource.TrySetResult(serialNumber); - _onReceiveing = false; - - await Task.Delay(500); - await StopListening(); - await MainThread.InvokeOnMainThreadAsync(async () => { - await Navigation.PopModalAsync(); - //await Navigation.PopModalAsync(); + await Task.Delay(TimeSpan.FromSeconds(30)); + Finish(null); }); + + } - Task ShowAlert(string message, string title = null) => DisplayAlert(string.IsNullOrWhiteSpace(title) ? "NFC olvasás" : title, message, "OK"); + + protected override void OnDisappearing() + { + +#if ANDROID + if (Platform.CurrentActivity is Android.App.Activity activity && activity is MainActivity mainActivity) + { + mainActivity.StopNfc(); + } +#endif + base.OnDisappearing(); + } + + private void OnTagRead(string tagId) + { + Finish(tagId); + } + + private async void Finish(string tagId) + { +#if ANDROID + if (Platform.CurrentActivity is Android.App.Activity activity && activity is MainActivity mainActivity) + { + if (_nfcIsActive) + { + mainActivity.StopNfc(); + _nfcIsActive = false; + } + } +#endif + + if (!_taskCompletionSource.Task.IsCompleted) + _taskCompletionSource.SetResult(tagId); + + if (Navigation.ModalStack.Count > 0) + { + await Shell.Current.Navigation.PopModalAsync(); + } + + + } + + + + + + } \ No newline at end of file diff --git a/src/WorkFlowCheck.MAUI/Platforms/Android/AndroidManifest.xml b/src/WorkFlowCheck.MAUI/Platforms/Android/AndroidManifest.xml index bd17978..9a24680 100644 --- a/src/WorkFlowCheck.MAUI/Platforms/Android/AndroidManifest.xml +++ b/src/WorkFlowCheck.MAUI/Platforms/Android/AndroidManifest.xml @@ -10,5 +10,5 @@ - + \ 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 66b2507..a95e3af 100644 --- a/src/WorkFlowCheck.MAUI/Platforms/Android/MainActivity.cs +++ b/src/WorkFlowCheck.MAUI/Platforms/Android/MainActivity.cs @@ -1,40 +1,68 @@ using Android.App; using Android.Content; using Android.Content.PM; +using Android.Nfc; using Android.OS; -using Plugin.NFC; + namespace WorkFlowCheck.MAUI { [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] public class MainActivity : MauiAppCompatActivity { + NfcAdapter nfcAdapter; + PendingIntent pendingIntent; + static Action _onTagRead; + protected async override void OnDestroy() { SecureStorage.Default.Remove("WFCUser"); SecureStorage.Default.Remove("AuthToken"); 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(); + nfcAdapter = NfcAdapter.GetDefaultAdapter(this); + pendingIntent = PendingIntent.GetActivity(this, 0, + new Intent(this, typeof(MainActivity)).AddFlags(ActivityFlags.SingleTop), + Build.VERSION.SdkInt >= BuildVersionCodes.S ? PendingIntentFlags.Mutable : PendingIntentFlags.UpdateCurrent); - // 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); + if (intent.Action == NfcAdapter.ActionTagDiscovered) + { + var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag; + var id = tag?.GetId(); + if (id != null) + { + var hex = BitConverter.ToString(id).Replace("-", ""); + _onTagRead?.Invoke(hex); + } + } + } + + public void StartNfc(Action onTagRead) + { + _onTagRead = onTagRead; + if (nfcAdapter.IsEnabled) + { + nfcAdapter?.EnableForegroundDispatch(this, pendingIntent, null, null); + } + } + + public void StopNfc() + { + _onTagRead = null; + //if (!IsFinishing && !IsDestroyed) + //{ + // nfcAdapter?.DisableForegroundDispatch(this); + //} } } }