├── .gitattributes ├── .gitignore ├── LICENSE.txt ├── README.md ├── XRFID.Sample.Client.Mobile ├── App.xaml ├── App.xaml.cs ├── AppShell.xaml ├── AppShell.xaml.cs ├── Base │ └── BaseRfidViewModel.cs ├── Behavior │ ├── BorderlessEntry.cs │ └── CustomBehavior.cs ├── Data │ ├── Dto │ │ ├── ItemExtDto.cs │ │ └── OrderExtDto.cs │ ├── Enums │ │ ├── InputTypes.cs │ │ ├── InventoryStates.cs │ │ ├── MovementTypes.cs │ │ ├── RfidScannerType.cs │ │ ├── Sessions.cs │ │ └── TagViewStatus.cs │ ├── Interfaces │ │ └── IRFIDConfig.cs │ ├── RfidConfig.cs │ ├── Services │ │ ├── AlertService.cs │ │ ├── AppSettings.cs │ │ ├── GeneralSettings.cs │ │ ├── Interfaces │ │ │ ├── IAlertService.cs │ │ │ ├── IAppSettings.cs │ │ │ ├── IGeneralSettings.cs │ │ │ ├── IServiceHelper.cs │ │ │ └── ISetting.cs │ │ └── ServiceHelper.cs │ └── ViewData │ │ ├── FindProductViewData.cs │ │ ├── InventoryProductViewData.cs │ │ ├── InventoryStatsViewData.cs │ │ ├── OrderViewData.cs │ │ └── TagViewData.cs ├── Helpers │ └── RestApiHelper.cs ├── MainPage.xaml ├── MainPage.xaml.cs ├── MainViewModel.cs ├── MauiProgram.cs ├── Messages │ ├── BarcodeMessage.cs │ └── ReaderTag.cs ├── Platforms │ └── Android │ │ ├── AndroidManifest.xml │ │ ├── CustomShellRenderer.cs │ │ ├── Interfaces │ │ ├── IBarcodeService.cs │ │ ├── IEMDKService.cs │ │ └── IRFIDService.cs │ │ ├── MainActivity.cs │ │ ├── MainApplication.cs │ │ ├── Resources │ │ └── values │ │ │ └── colors.xml │ │ └── Services │ │ ├── BarcodeService.cs │ │ ├── EmdkService.cs │ │ └── RFIDService.cs ├── Properties │ └── launchSettings.json ├── Resources │ ├── AppIcon │ │ ├── appicon.svg │ │ └── appiconfg.svg │ ├── Fonts │ │ ├── OpenSans-Regular.ttf │ │ └── OpenSans-Semibold.ttf │ ├── Images │ │ ├── back_button.svg │ │ ├── check_item.svg │ │ ├── find_item.svg │ │ ├── home_icon.svg │ │ ├── info_about.svg │ │ ├── info_icon.svg │ │ ├── inventory.svg │ │ ├── menu_icon.svg │ │ ├── rapid_read.svg │ │ ├── settings_gear_blue.svg │ │ └── settings_gear_orange.svg │ ├── Raw │ │ └── AboutAssets.txt │ ├── Splash │ │ ├── dotnet_splash.svg │ │ └── splash.svg │ └── Styles │ │ ├── Colors.xaml │ │ └── Styles.xaml ├── ViewModels │ ├── CheckItem │ │ ├── CheckItemRfidViewModel.cs │ │ └── CheckItemViewModel.cs │ ├── FindItem │ │ ├── FindItemRfidViewModel.cs │ │ └── FindItemViewModel.cs │ ├── InventoryViewModel.cs │ ├── RapidReadViewModel.cs │ └── SettingsViewModel.cs ├── Views │ ├── AboutView.xaml │ ├── AboutView.xaml.cs │ ├── CheckItem │ │ ├── CheckItemRfidView.xaml │ │ ├── CheckItemRfidView.xaml.cs │ │ ├── CheckItemView.xaml │ │ └── CheckItemView.xaml.cs │ ├── FindItem │ │ ├── FindItemRfidView.xaml │ │ ├── FindItemRfidView.xaml.cs │ │ ├── FindItemView.xaml │ │ └── FindItemView.xaml.cs │ ├── Inventory │ │ ├── InventoryView.xaml │ │ └── InventoryView.xaml.cs │ ├── PageSettings │ │ ├── FindSettings.xaml │ │ ├── FindSettings.xaml.cs │ │ ├── InventoryRapidReadSettings.xaml │ │ └── InventoryRapidReadSettings.xaml.cs │ ├── RapidReadView.xaml │ ├── RapidReadView.xaml.cs │ ├── SettingsPage.xaml │ └── SettingsPage.xaml.cs └── XRFID.Sample.Client.Mobile.csproj ├── XRFID.Sample.Common ├── Dto │ ├── Create │ │ └── MinimalReaderCreateDto.cs │ ├── LoadingUnitDto.cs │ ├── LoadingUnitItemDto.cs │ ├── MovementDto.cs │ ├── MovementItemDto.cs │ ├── ProductDto.cs │ └── ReaderDto.cs └── XRFID.Sample.Common.csproj ├── XRFID.Sample.Webservice ├── Controllers │ ├── AuthorizationController.cs │ ├── LoadingUnitController.cs │ ├── LoadingUnitItemController.cs │ ├── MovementController.cs │ ├── PingController.cs │ ├── ProductController.cs │ └── ReaderController.cs ├── Database │ ├── UnitOfWork.cs │ └── XRFIDSampleContext.cs ├── Entities │ ├── AuditEntity.cs │ ├── LoadingUnit.cs │ ├── LoadingUnitItem.cs │ ├── Movement.cs │ ├── MovementItem.cs │ ├── Product.cs │ └── Reader.cs ├── Mapper │ └── XRFIDSampleProfile.cs ├── Migrations │ ├── 20230830145542_Initial.Designer.cs │ ├── 20230830145542_Initial.cs │ └── XRFIDSampleContextModelSnapshot.cs ├── Persist │ └── persist.db ├── Program.cs ├── Properties │ └── launchSettings.json ├── Repositories │ ├── BaseRespository.cs │ ├── LoadingUnitItemRepository.cs │ ├── LoadingUnitRepository.cs │ ├── MovementItemRepository.cs │ ├── MovementRepository.cs │ ├── ProductRepository.cs │ └── ReaderRepository.cs ├── Services │ ├── LoadingUnitItemService.cs │ ├── LoadingUnitService.cs │ ├── MovementService.cs │ ├── ProductService.cs │ └── ReaderService.cs ├── XRFID.Sample.Webservice.csproj ├── appsettings.Development.json └── appsettings.json ├── XRFID.Sample.sln ├── dll └── XamarinZebraRFID.dll └── img └── logo.svg /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Pernix Srl, Axter Srl, Xerum Srl, Xholding Group 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/App.xaml: -------------------------------------------------------------------------------- 1 |  2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using TinyMvvm; 2 | using XRFID.Sample.Client.Mobile.Behavior; 3 | 4 | namespace XRFID.Sample.Client.Mobile; 5 | 6 | public partial class App : TinyApplication 7 | { 8 | public App() 9 | { 10 | Syncfusion.Licensing.SyncfusionLicenseProvider 11 | .RegisterLicense("your_syncfusion_license"); //You need to edit the content with your syncfusion license 12 | 13 | InitializeComponent(); 14 | 15 | MainPage = new AppShell(); 16 | 17 | Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping(nameof(BorderlessEntry), (handler, view) => 18 | { 19 | #if __ANDROID__ 20 | handler.PlatformView.SetBackgroundColor(Android.Graphics.Color.Transparent); 21 | #elif __IOS__ 22 | #endif 23 | }); 24 | } 25 | 26 | protected override async Task Initialize() 27 | { 28 | await base.Initialize(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/AppShell.xaml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | 25 | 26 | 29 | 30 | 31 | 32 | 34 | 35 | 36 | 37 | 39 | 40 | 41 | 42 | 44 | 45 | 46 | 47 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/AppShell.xaml.cs: -------------------------------------------------------------------------------- 1 | using XRFID.Sample.Client.Mobile.Views.CheckItem; 2 | using XRFID.Sample.Client.Mobile.Views.FindItem; 3 | using XRFID.Sample.Client.Mobile.Views.PageSettings; 4 | 5 | namespace XRFID.Sample.Client.Mobile; 6 | 7 | public partial class AppShell : Shell 8 | { 9 | public AppShell() 10 | { 11 | InitializeComponent(); 12 | 13 | Routing.RegisterRoute("checkitem/rfid", typeof(CheckItemRfidView)); 14 | Routing.RegisterRoute("finditemrfid", typeof(FindItemRfidView)); 15 | Routing.RegisterRoute("inventoryrapidreadsettings", typeof(InventoryRapidReadSettings)); 16 | Routing.RegisterRoute("findsettings", typeof(FindSettings)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Behavior/BorderlessEntry.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Behavior; 2 | public class BorderlessEntry : Entry 3 | { 4 | } 5 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Behavior/CustomBehavior.cs: -------------------------------------------------------------------------------- 1 | using Syncfusion.Maui.DataGrid; 2 | using System.Globalization; 3 | using System.Windows.Input; 4 | 5 | namespace XRFID.Sample.Client.Mobile.Behavior; 6 | 7 | // Behavior 8 | public class CustomBehavior : Behavior 9 | { 10 | public static readonly BindableProperty CommandProperty = BindableProperty.Create("Command", typeof(ICommand), typeof(CustomBehavior), null); 11 | public static readonly BindableProperty InputConverterProperty = BindableProperty.Create("Converter", typeof(IValueConverter), typeof(CustomBehavior), null); 12 | 13 | public ICommand Command 14 | { 15 | get { return (ICommand)GetValue(CommandProperty); } 16 | set { SetValue(CommandProperty, value); } 17 | } 18 | 19 | public IValueConverter Converter 20 | { 21 | get { return (IValueConverter)GetValue(InputConverterProperty); } 22 | set { SetValue(InputConverterProperty, value); } 23 | } 24 | 25 | public SfDataGrid AssociatedObject { get; private set; } 26 | 27 | protected override void OnAttachedTo(SfDataGrid bindable) 28 | { 29 | base.OnAttachedTo(bindable); 30 | AssociatedObject = bindable; 31 | bindable.BindingContextChanged += OnBindingContextChanged; 32 | bindable.SelectionChanged += Bindable_SelectionChanged; 33 | } 34 | 35 | private void Bindable_SelectionChanged(object sender, DataGridSelectionChangedEventArgs e) 36 | { 37 | if (Command == null) 38 | { 39 | return; 40 | } 41 | 42 | object gridSelectionChangedEventArgs = Converter.Convert(e, typeof(object), null, null); 43 | if (Command.CanExecute(gridSelectionChangedEventArgs)) 44 | { 45 | Command.Execute(gridSelectionChangedEventArgs); 46 | } 47 | } 48 | 49 | protected override void OnDetachingFrom(SfDataGrid bindable) 50 | { 51 | base.OnDetachingFrom(bindable); 52 | bindable.BindingContextChanged -= OnBindingContextChanged; 53 | bindable.SelectionChanged -= Bindable_SelectionChanged; 54 | AssociatedObject = null; 55 | } 56 | 57 | private void OnBindingContextChanged(object sender, EventArgs e) 58 | { 59 | OnBindingContextChanged(); 60 | } 61 | 62 | protected override void OnBindingContextChanged() 63 | { 64 | base.OnBindingContextChanged(); 65 | BindingContext = AssociatedObject.BindingContext; 66 | } 67 | } 68 | 69 | public class CustomConverter : IValueConverter 70 | { 71 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 72 | { 73 | return value; 74 | } 75 | 76 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 77 | { 78 | throw new NotImplementedException(); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Dto/ItemExtDto.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Runtime.CompilerServices; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Data.Dto; 5 | public class ItemExtDto : INotifyPropertyChanged 6 | { 7 | public Guid Id { get; set; } 8 | 9 | public string Epc { get; set; } 10 | 11 | public string SerialNumber { get; set; } 12 | 13 | public string SkuCode { get; set; } 14 | 15 | public string Description { get; set; } 16 | 17 | public Guid? OrderLineId { get; set; } 18 | 19 | public string OrderLineDescription { get; set; } 20 | 21 | public bool Checked { get; set; } 22 | 23 | public bool CHECKED { get { return Checked; } set { Checked = value; OnPropertyChanged(); } } 24 | 25 | public bool UnexpectedTag { get; set; } 26 | 27 | public event PropertyChangedEventHandler PropertyChanged; 28 | 29 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 30 | } 31 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Dto/OrderExtDto.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Runtime.CompilerServices; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Data.Dto; 5 | public class OrderExtDto : INotifyPropertyChanged 6 | { 7 | //customer 8 | public string CustomerReference { get; set; } 9 | 10 | public string CustomerName { get; set; } 11 | 12 | public string DestinationReference { get; set; } 13 | 14 | public string DestinationName { get; set; } 15 | 16 | //order 17 | public string OrderReference { get; set; } 18 | 19 | public Guid CustomerId { get; set; } 20 | 21 | public Guid Id { get; set; } 22 | 23 | public string Epc { get; set; } 24 | 25 | public string SerialNumber { get; set; } 26 | 27 | public string SkuCode { get; set; } 28 | 29 | public string Description { get; set; } 30 | 31 | public const string OrderLinesPropertyName = "OrderLines"; 32 | 33 | public bool Checked { get; set; } 34 | public bool CHECKED { get { return Checked; } set { Checked = value; OnPropertyChanged(); } } 35 | 36 | public event PropertyChangedEventHandler PropertyChanged; 37 | 38 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 39 | } 40 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Enums/InputTypes.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Data.Enums; 2 | 3 | public enum InputTypes 4 | { 5 | Rfid = 0, 6 | Barcode = 1 7 | } 8 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Enums/InventoryStates.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Data.Enums; 2 | 3 | public enum InventoryStates 4 | { 5 | StateA = 0, 6 | StateB = 1, 7 | FlipAB = 2 8 | } 9 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Enums/MovementTypes.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Data.Enums; 2 | 3 | public enum MovementTypes 4 | { 5 | Empty = 0, 6 | Inventory = 1, 7 | EmptyList = 2 8 | } 9 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Enums/RfidScannerType.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Data.Enums; 2 | 3 | public enum RfidScannerType 4 | { 5 | Serial = 0, 6 | Usb = 1, 7 | Bluetooth = 2, 8 | All = 10, 9 | } 10 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Enums/Sessions.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Data.Enums; 2 | 3 | public enum Sessions 4 | { 5 | S0 = 0, 6 | S1 = 1, 7 | S2 = 2, 8 | S3 = 3 9 | } 10 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Enums/TagViewStatus.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Data.Enums; 2 | 3 | public enum TagViewStatus 4 | { 5 | Default = 0, 6 | Found = 1, 7 | Error = 2, 8 | } 9 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Interfaces/IRFIDConfig.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Data.Interfaces; 2 | 3 | public interface IRFIDConfig 4 | { 5 | Guid Id { get; set; } 6 | string Name { get; set; } 7 | bool IsActive { get; set; } 8 | int Power { get; set; } 9 | bool DynamicPower { get; set; } 10 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/RfidConfig.cs: -------------------------------------------------------------------------------- 1 | using XRFID.Sample.Client.Mobile.Data.Enums; 2 | using XRFID.Sample.Client.Mobile.Data.Interfaces; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Data; 5 | public class RfidConfig : IRFIDConfig 6 | { 7 | public Guid Id { get; set; } 8 | public string Name { get; set; } 9 | public bool IsActive { get; set; } 10 | public int Power { get; set; } 11 | public Sessions Session { get; set; } 12 | public InventoryStates InventoryState { get; set; } 13 | public bool DynamicPower { get; set; } 14 | } 15 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Services/AlertService.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Maui.Alerts; 2 | using CommunityToolkit.Maui.Core; 3 | using XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 4 | 5 | namespace XRFID.Sample.Client.Mobile.Data.Services; 6 | public class AlertService : IAlertService 7 | { 8 | public AlertService() 9 | { 10 | } 11 | 12 | public void LongToast(string message) 13 | { 14 | Toast.Make(message, ToastDuration.Long).Show(); 15 | } 16 | 17 | public void ShortToast(string message) 18 | { 19 | Toast.Make(message, ToastDuration.Short).Show(); 20 | } 21 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Services/GeneralSettings.cs: -------------------------------------------------------------------------------- 1 | using XRFID.Sample.Client.Mobile.Data.Dto; 2 | using XRFID.Sample.Client.Mobile.Data.Enums; 3 | using XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 4 | 5 | namespace XRFID.Sample.Client.Mobile.Data.Services; 6 | public class GeneralSettings : IGeneralSettings 7 | { 8 | private AppSettings _appSettings = new AppSettings(); 9 | private IServiceHelper _serviceHelper; 10 | 11 | public string ApiServer { get => _appSettings.ApiServer; set => _appSettings.ApiServer = value; } 12 | public InputTypes InputType { get => _appSettings.InputType; set => _appSettings.InputType = value; } 13 | public MovementTypes MovementType { get => _appSettings.MovementType; set => _appSettings.MovementType = value; } 14 | public string MovementListName { get => _appSettings.MovementListName; set => _appSettings.MovementListName = value; } 15 | public Guid ReaderId { get => _appSettings.ReaderId; set => _appSettings.ReaderId = value; } 16 | public string DeviceId { get => _appSettings.DeviceId; set => _appSettings.DeviceId = value; } 17 | public string DeviceIp { get => _appSettings.DeviceIp; set => _appSettings.DeviceIp = value; } 18 | public string DeviceModel { get => _appSettings.DeviceModel; set => _appSettings.DeviceModel = value; } 19 | public string DeviceName { get => _appSettings.DeviceName; set => _appSettings.DeviceName = value; } 20 | public string DeviceVersion { get => _appSettings.DeviceVersion; set => _appSettings.DeviceVersion = value; } 21 | public string DevicePlatform { get => _appSettings.DevicePlatform; set => _appSettings.DevicePlatform = value; } 22 | public string DeviceManufacturer { get => _appSettings.DeviceManufacturer; set => _appSettings.DeviceManufacturer = value; } 23 | public int ReaderIndex { get => _appSettings.ReaderIndex; set => _appSettings.ReaderIndex = value; } 24 | public List Orders { get; set; } 25 | 26 | public List RfidConfigs 27 | { 28 | get 29 | { 30 | return _appSettings.RfidConfigs; 31 | } 32 | set 33 | { 34 | _appSettings.RfidConfigs = value; 35 | } 36 | } 37 | 38 | public GeneralSettings() 39 | { 40 | } 41 | 42 | public void Load(IServiceHelper serviceHelper) 43 | { 44 | this._serviceHelper = serviceHelper; 45 | _appSettings.Load(_serviceHelper); 46 | } 47 | 48 | public void SaveRfidConfig(RfidConfig rfidConfig) 49 | { 50 | _appSettings.Save(rfidConfig); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Services/Interfaces/IAlertService.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 2 | public interface IAlertService 3 | { 4 | void ShortToast(string message); 5 | 6 | void LongToast(string message); 7 | 8 | } 9 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Services/Interfaces/IAppSettings.cs: -------------------------------------------------------------------------------- 1 | using XRFID.Sample.Client.Mobile.Data.Enums; 2 | 3 | namespace XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 4 | 5 | public interface IAppSettings : ISetting 6 | { 7 | string ApiServer { get; set; } 8 | InputTypes InputType { get; set; } 9 | MovementTypes MovementType { get; set; } 10 | string MovementListName { get; set; } 11 | Guid ReaderId { get; set; } 12 | string DeviceId { get; set; } 13 | string DeviceIp { get; set; } 14 | string DeviceModel { get; set; } 15 | string DeviceName { get; set; } 16 | string DeviceVersion { get; set; } 17 | string DevicePlatform { get; set; } 18 | string DeviceManufacturer { get; set; } 19 | int ReaderIndex { get; set; } 20 | 21 | List RfidConfigs { get; set; } 22 | 23 | void Load(IServiceHelper serviceHelper); 24 | 25 | void Save(RfidConfig rfidConfig); 26 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Services/Interfaces/IGeneralSettings.cs: -------------------------------------------------------------------------------- 1 | using XRFID.Sample.Client.Mobile.Data.Dto; 2 | using XRFID.Sample.Client.Mobile.Data.Enums; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 5 | 6 | public interface IGeneralSettings 7 | { 8 | string ApiServer { get; set; } 9 | InputTypes InputType { get; set; } 10 | MovementTypes MovementType { get; set; } 11 | string MovementListName { get; set; } 12 | Guid ReaderId { get; set; } 13 | string DeviceId { get; set; } 14 | string DeviceIp { get; set; } 15 | string DeviceModel { get; set; } 16 | string DeviceName { get; set; } 17 | string DeviceVersion { get; set; } 18 | string DevicePlatform { get; set; } 19 | string DeviceManufacturer { get; set; } 20 | int ReaderIndex { get; set; } 21 | List RfidConfigs { get; set; } 22 | List Orders { get; set; } 23 | 24 | void Load(IServiceHelper serviceHelper); 25 | 26 | void SaveRfidConfig(RfidConfig rfidConfig); 27 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Services/Interfaces/IServiceHelper.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 2 | 3 | public interface IServiceHelper 4 | { 5 | string GetDeviceIp(); 6 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Services/Interfaces/ISetting.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 2 | public interface ISetting 3 | { 4 | } 5 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/Services/ServiceHelper.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Net.Wifi; 3 | using Android.Text.Format; 4 | using XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 5 | 6 | namespace XRFID.Sample.Client.Mobile.Data.Services; 7 | public class ServiceHelper : IServiceHelper 8 | { 9 | public ServiceHelper() 10 | { 11 | } 12 | 13 | public string GetDeviceIp() 14 | { 15 | WifiManager wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(Service.WifiService); 16 | return Formatter.FormatIpAddress(wifiManager.ConnectionInfo.IpAddress); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/ViewData/FindProductViewData.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | using System.ComponentModel; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Data.ViewData; 5 | public class FindProductViewData : ObservableObject, INotifyPropertyChanged 6 | { 7 | private string name = ""; 8 | public string Name { get => name; set => SetProperty(ref name, value); } 9 | 10 | private string code = ""; 11 | public string Code { get => code; set => SetProperty(ref code, value); } 12 | 13 | private string epc = ""; 14 | public string Epc { get => epc; set => SetProperty(ref epc, value); } 15 | } 16 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/ViewData/InventoryProductViewData.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | using System.ComponentModel; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Data.ViewData; 5 | public class InventoryProductViewData : ObservableObject, INotifyPropertyChanged 6 | { 7 | private string productName = "N/A"; 8 | public string ProductName 9 | { 10 | get => productName; 11 | set => SetProperty(ref productName, value); 12 | } 13 | private string epc = string.Empty; 14 | public string Epc 15 | { 16 | get => epc; 17 | set => SetProperty(ref epc, value); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/ViewData/InventoryStatsViewData.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | using System.ComponentModel; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Data.ViewData; 5 | public class InventoryStatsViewData : ObservableObject, INotifyPropertyChanged 6 | { 7 | private int tagRead = 0; 8 | public int TagRead { get => tagRead; set => SetProperty(ref tagRead, value); } 9 | 10 | private int productFound = 0; 11 | public int ProductFound { get => productFound; set => SetProperty(ref productFound, value); } 12 | 13 | private int unexpectedTag = 0; 14 | public int UnexpectedTag { get => unexpectedTag; set => SetProperty(ref unexpectedTag, value); } 15 | } 16 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/ViewData/OrderViewData.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | using System.ComponentModel; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Data.ViewData; 5 | public class OrderViewData : ObservableObject, INotifyPropertyChanged 6 | { 7 | public Guid Id { get; set; } 8 | public string Name { get; set; } = string.Empty; 9 | } 10 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Data/ViewData/TagViewData.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | using System.ComponentModel; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Data.ViewData; 5 | public class TagViewData : ObservableObject, INotifyPropertyChanged 6 | { 7 | public string Epc { get; set; } = string.Empty; 8 | private string status = string.Empty; 9 | public string Status { get => status; set => SetProperty(ref status, value); } 10 | } 11 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/MainPage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/MainPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile; 2 | 3 | public partial class MainPage 4 | { 5 | public MainPage() 6 | { 7 | InitializeComponent(); 8 | 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/MainViewModel.cs: -------------------------------------------------------------------------------- 1 | using TinyMvvm; 2 | 3 | namespace XRFID.Sample.Client.Mobile; 4 | public class MainViewModel : TinyViewModel 5 | { 6 | public MainViewModel() 7 | { 8 | } 9 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/MauiProgram.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Maui; 2 | using Syncfusion.Maui.Core.Hosting; 3 | using TinyMvvm; 4 | using XRFID.Sample.Client.Mobile.Base; 5 | using XRFID.Sample.Client.Mobile.Data.Services; 6 | using XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 7 | using XRFID.Sample.Client.Mobile.Helpers; 8 | using XRFID.Sample.Client.Mobile.Platforms.Android.Interfaces; 9 | using XRFID.Sample.Client.Mobile.Platforms.Android.Services; 10 | using XRFID.Sample.Client.Mobile.ViewModels; 11 | using XRFID.Sample.Client.Mobile.Views; 12 | using XRFID.Sample.Client.Mobile.Views.CheckItem; 13 | using XRFID.Sample.Client.Mobile.Views.FindItem; 14 | using XRFID.Sample.Client.Mobile.Views.Inventory; 15 | using XRFID.Sample.Client.Mobile.Views.PageSettings; 16 | 17 | namespace XRFID.Sample.Client.Mobile; 18 | public static class MauiProgram 19 | { 20 | private static EmdkService emdkControl = new EmdkService(); 21 | public static MauiApp CreateMauiApp() 22 | { 23 | MauiAppBuilder builder = MauiApp.CreateBuilder(); 24 | builder 25 | .UseMauiApp() 26 | .UseMauiCommunityToolkit() 27 | .ConfigureSyncfusionCore() 28 | .ConfigureFonts(fonts => 29 | { 30 | fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); 31 | fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); 32 | }) 33 | .UseTinyMvvm(); 34 | 35 | builder.Services.ConfigureMauiHandlers(handlers => 36 | { 37 | #if ANDROID 38 | handlers.AddHandler(typeof(Shell), typeof(Platforms.Android.CustomShellRenderer)); 39 | #endif 40 | }); 41 | ; 42 | builder.Services.AddSingleton(); 43 | builder.Services.AddSingleton(); 44 | 45 | //Instance api helper for api call 46 | builder.Services.AddSingleton(); 47 | 48 | //for RFID viewmodel 49 | builder.Services.AddSingleton(); 50 | builder.Services.AddSingleton(); 51 | builder.Services.AddSingleton(); 52 | 53 | builder.Services.AddTransient(); 54 | 55 | builder.Services.AddTransient(); 56 | builder.Services.AddTransient(); 57 | 58 | builder.Services.AddTransient(); 59 | builder.Services.AddTransient(); 60 | 61 | builder.Services.AddTransient(); 62 | builder.Services.AddTransient(); 63 | 64 | builder.Services.AddTransient(); 65 | builder.Services.AddTransient(); 66 | 67 | builder.Services.AddTransient(); 68 | builder.Services.AddTransient(); 69 | 70 | builder.Services.AddTransient(); 71 | builder.Services.AddTransient(); 72 | 73 | builder.Services.AddTransient(); 74 | builder.Services.AddTransient(); 75 | 76 | builder.Services.AddTransient(); 77 | builder.Services.AddTransient(); 78 | 79 | builder.Services.AddTransient(); 80 | 81 | MauiApp host = builder.Build(); 82 | 83 | ServiceHelper serviceHelper = new ServiceHelper(); 84 | host.Services.GetService().Load(serviceHelper); 85 | 86 | return host; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Messages/BarcodeMessage.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.Messaging.Messages; 2 | using Symbol.XamarinEMDK.Barcode; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Messages; 5 | public class BarcodeMessage : ValueChangedMessage> 6 | { 7 | 8 | public BarcodeMessage(IList value) : base(value) 9 | { 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Messages/ReaderTag.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Runtime.CompilerServices; 3 | 4 | namespace XRFID.Sample.Client.Mobile.Messages; 5 | public class ReaderTag : INotifyPropertyChanged 6 | { 7 | public int Id { get; set; } 8 | public string Epc { get; set; } 9 | public short? Rssi { get; set; } 10 | public string Tid { get; set; } 11 | public string PC { get; set; } 12 | public int ReadsCount { get; set; } 13 | public bool Checked { get; set; } 14 | public DateTime FirstRead { get; set; } 15 | public Guid? MovementListId { get; set; } 16 | public Guid ReaderId { get; set; } 17 | public Guid? ItemId { get; set; } 18 | public int Status { get; set; } 19 | 20 | public int RDistance { get; set; } 21 | 22 | public int TagCount { get { return ReadsCount; } set { ReadsCount = value; OnPropertyChanged(); } } 23 | 24 | public short? RSSI { get { return Rssi; } set { Rssi = value; OnPropertyChanged(); } } 25 | 26 | public bool CHECKED { get { return Checked; } set { Checked = value; OnPropertyChanged(); } } 27 | 28 | public int RelativeDistance { get { return RDistance; } set { RDistance = value; OnPropertyChanged(); } } 29 | 30 | public event PropertyChangedEventHandler PropertyChanged; 31 | 32 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 33 | } 34 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Platforms/Android/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Platforms/Android/Interfaces/IBarcodeService.cs: -------------------------------------------------------------------------------- 1 | namespace XRFID.Sample.Client.Mobile.Platforms.Android.Interfaces; 2 | 3 | public interface IBarcodeService 4 | { 5 | bool IsEnabled { get; } 6 | void InitBarcodeReader(); 7 | void DeinitBarcodeReader(); 8 | void EnableBarcodeReader(); 9 | void DisableBarcodeReader(); 10 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Platforms/Android/Interfaces/IEMDKService.cs: -------------------------------------------------------------------------------- 1 | using Symbol.XamarinEMDK.Barcode; 2 | 3 | namespace XRFID.Sample.Client.Mobile.Platforms.Android.Interfaces; 4 | 5 | public interface IEMDKService 6 | { 7 | BarcodeManager GetBarcodeManager(); 8 | void SetBarcodeManager(BarcodeManager barcodeManager); 9 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Platforms/Android/Interfaces/IRFIDService.cs: -------------------------------------------------------------------------------- 1 | using Com.Zebra.Rfid.Api3; 2 | using XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 3 | using XRFID.Sample.Client.Mobile.Messages; 4 | 5 | namespace XRFID.Sample.Client.Mobile.Platforms.Android.Interfaces; 6 | 7 | public delegate void TagReadHandler(IList tags); 8 | public delegate void TriggerHandler(bool pressed); 9 | public delegate void StatusHandler(Events.StatusEventData statusEvent); 10 | public delegate void ConnectionHandler(bool connected); 11 | public delegate void ReaderAppearanceHandler(bool appeared); 12 | public interface IRFIDService 13 | { 14 | event TagReadHandler TagRead; 15 | event TriggerHandler TriggerEvent; 16 | event StatusHandler StatusEvent; 17 | event ConnectionHandler ReaderConnectionEvent; 18 | event ReaderAppearanceHandler ReaderAppearanceEvent; 19 | 20 | bool IsConnected { get; } 21 | 22 | void InitRfidReader(IGeneralSettings generalSettings); 23 | 24 | void ConfigureReader(); 25 | 26 | void Disconnect(); 27 | 28 | void Connect(); 29 | 30 | void DeInit(); 31 | 32 | bool PerformInventory(); 33 | 34 | void StopInventory(); 35 | 36 | void Locate(bool start, string tagPattern, string tagMask); 37 | 38 | void SetTriggerMode(); 39 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Platforms/Android/MainActivity.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Content.PM; 3 | using Android.OS; 4 | using Symbol.XamarinEMDK; 5 | using Symbol.XamarinEMDK.Barcode; 6 | using XRFID.Sample.Client.Mobile.Platforms.Android.Interfaces; 7 | 8 | namespace XRFID.Sample.Client.Mobile; 9 | [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] 10 | public class MainActivity : MauiAppCompatActivity, EMDKManager.IEMDKListener, EMDKManager.IStatusListener 11 | { 12 | public EMDKManager emdkManager; 13 | private Symbol.XamarinEMDK.Notification.NotificationManager notificationManager; 14 | 15 | private IEMDKService emdkService; 16 | private BarcodeManager barcodeManager; 17 | 18 | void EMDKManager.IEMDKListener.OnClosed() 19 | { 20 | if (emdkManager != null) 21 | { 22 | emdkManager.Release(); 23 | } 24 | } 25 | 26 | protected override void OnDestroy() 27 | { 28 | base.OnDestroy(); 29 | 30 | // Clean up the objects created by EMDK manager 31 | if (emdkManager != null) 32 | { 33 | emdkManager.Release(); 34 | emdkManager = null; 35 | } 36 | } 37 | 38 | protected override void OnCreate(Bundle savedInstanceState) 39 | { 40 | base.OnCreate(savedInstanceState); 41 | 42 | } 43 | 44 | protected override void OnPostCreate(Bundle savedInstanceState) 45 | { 46 | base.OnPostCreate(savedInstanceState); 47 | EMDKResults results = EMDKManager.GetEMDKManager(this, this); 48 | //WeakReferenceMessenger.Default.Send(results.StatusCode); 49 | 50 | } 51 | 52 | void EMDKManager.IEMDKListener.OnOpened(EMDKManager emdkManagerInstance) 53 | { 54 | //WeakReferenceMessenger.Default.Send("sopra"); 55 | this.emdkManager = emdkManagerInstance; 56 | emdkService = MauiApplication.Current.Services.GetService(); 57 | 58 | barcodeManager = (BarcodeManager)emdkManager.GetInstance(EMDKManager.FEATURE_TYPE.Barcode); 59 | emdkService.SetBarcodeManager(barcodeManager); 60 | 61 | try 62 | { 63 | emdkManager.GetInstanceAsync(EMDKManager.FEATURE_TYPE.Profile, this); 64 | emdkManager.GetInstanceAsync(EMDKManager.FEATURE_TYPE.Version, this); 65 | emdkManager.GetInstanceAsync(EMDKManager.FEATURE_TYPE.Notification, this); 66 | emdkManager.GetInstanceAsync(EMDKManager.FEATURE_TYPE.Barcode, this); 67 | 68 | } 69 | catch (Exception e) 70 | { 71 | //RunOnUiThread(() => statusTextView.Text = e.Message); 72 | Console.WriteLine("Exception: " + e.StackTrace); 73 | } 74 | //WeakReferenceMessenger.Default.Send("sotto"); 75 | 76 | } 77 | 78 | void EMDKManager.IStatusListener.OnStatus(EMDKManager.StatusData statusData, EMDKBase emdkBase) 79 | { 80 | if (statusData.Result == EMDKResults.STATUS_CODE.Success) 81 | { 82 | 83 | 84 | } 85 | } 86 | 87 | 88 | 89 | 90 | 91 | 92 | } 93 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Platforms/Android/MainApplication.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Runtime; 3 | 4 | namespace XRFID.Sample.Client.Mobile; 5 | [Application] 6 | public class MainApplication : MauiApplication 7 | { 8 | public MainApplication(IntPtr handle, JniHandleOwnership ownership) 9 | : base(handle, ownership) 10 | { 11 | } 12 | 13 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 14 | } 15 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Platforms/Android/Resources/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #e55934 4 | #e55934 5 | #e55934 6 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Platforms/Android/Services/EmdkService.cs: -------------------------------------------------------------------------------- 1 | using AndroidX.Fragment.App; 2 | using Symbol.XamarinEMDK.Barcode; 3 | using XRFID.Sample.Client.Mobile.Platforms.Android.Interfaces; 4 | 5 | namespace XRFID.Sample.Client.Mobile.Platforms.Android.Services; 6 | public class EmdkService : Fragment, IEMDKService 7 | { 8 | private BarcodeManager barcodeManager; 9 | public EmdkService() 10 | { 11 | 12 | } 13 | 14 | public BarcodeManager GetBarcodeManager() 15 | { 16 | return barcodeManager; 17 | } 18 | 19 | public void SetBarcodeManager(BarcodeManager barcodeManager) 20 | { 21 | this.barcodeManager = barcodeManager; 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "Windows Machine": { 4 | "commandName": "MsixPackage", 5 | "nativeDebugging": false 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/AppIcon/appicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/AppIcon/appiconfg.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Fonts/OpenSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XerumSrl/XRFID-Android-Samples/dcfbd1f42a9ea957b4e74eb7557638aea149cab5/XRFID.Sample.Client.Mobile/Resources/Fonts/OpenSans-Regular.ttf -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Fonts/OpenSans-Semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XerumSrl/XRFID-Android-Samples/dcfbd1f42a9ea957b4e74eb7557638aea149cab5/XRFID.Sample.Client.Mobile/Resources/Fonts/OpenSans-Semibold.ttf -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/back_button.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/check_item.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/find_item.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/home_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/info_about.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/info_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/inventory.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/menu_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/rapid_read.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/settings_gear_blue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Images/settings_gear_orange.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Raw/AboutAssets.txt: -------------------------------------------------------------------------------- 1 | Any raw assets you want to be deployed with your application can be placed in 2 | this directory (and child directories). Deployment of the asset to your application 3 | is automatically handled by the following `MauiAsset` Build Action within your `.csproj`. 4 | 5 | 6 | 7 | These files will be deployed with you package and will be accessible using Essentials: 8 | 9 | async Task LoadMauiAsset() 10 | { 11 | using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt"); 12 | using var reader = new StreamReader(stream); 13 | 14 | var contents = reader.ReadToEnd(); 15 | } 16 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Splash/dotnet_splash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Splash/splash.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Resources/Styles/Colors.xaml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 6 | 7 | #e55934 8 | #DFD8F7 9 | #e55934 10 | White 11 | Black 12 | #E1E1E1 13 | #C8C8C8 14 | #ACACAC 15 | #919191 16 | #6E6E6E 17 | #404040 18 | #212121 19 | #141414 20 | #33658A 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | #F7B548 37 | #FFD590 38 | #FFE5B9 39 | #28C2D1 40 | #7BDDEF 41 | #C3F2F4 42 | #3E8EED 43 | #72ACF1 44 | #A7CBF6 45 | 46 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/ViewModels/CheckItem/CheckItemRfidViewModel.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.Input; 2 | using System.Collections.ObjectModel; 3 | using XRFID.Sample.Client.Mobile.Base; 4 | using XRFID.Sample.Client.Mobile.Data.Enums; 5 | using XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 6 | using XRFID.Sample.Client.Mobile.Data.ViewData; 7 | using XRFID.Sample.Client.Mobile.Messages; 8 | using XRFID.Sample.Client.Mobile.Platforms.Android.Interfaces; 9 | 10 | namespace XRFID.Sample.Client.Mobile.ViewModels; 11 | 12 | [QueryProperty(nameof(TagsView), nameof(TagsView))] 13 | public partial class CheckItemRfidViewModel : BaseRfidViewModel 14 | { 15 | private readonly IAlertService alertService; 16 | 17 | #region collections 18 | private Dictionary tagDict = new Dictionary(); 19 | 20 | private ObservableCollection tagsView = new ObservableCollection(); 21 | public ObservableCollection TagsView 22 | { 23 | get => tagsView; 24 | set => SetProperty(ref tagsView, value); 25 | } 26 | private ObservableCollection InitalView { get => tagsView; } 27 | #endregion 28 | 29 | #region commands 30 | [RelayCommand] 31 | public async Task ResetCommand() 32 | { 33 | StatsReset(); 34 | } 35 | 36 | [RelayCommand] 37 | public async Task ConfirmCommand() 38 | { 39 | alertService.LongToast("Confirmation command is ok"); 40 | } 41 | #endregion 42 | 43 | public CheckItemRfidViewModel(IRFIDService rfidService, 44 | IGeneralSettings generalSettings, 45 | IAlertService alertService) : base(rfidService, generalSettings) 46 | { 47 | this.alertService = alertService; 48 | } 49 | 50 | #region view methods 51 | public override Task OnAppearing() 52 | { 53 | UpdateIn(); 54 | return base.OnAppearing(); 55 | } 56 | public override Task OnDisappearing() 57 | { 58 | Dispose(); //This dispose method is in base, but due to inherithance implementation details it calls the overridden UpdateOut() 59 | return base.OnDisappearing(); 60 | } 61 | #endregion 62 | 63 | #region workflow methods 64 | public void StatsReset() 65 | { 66 | tagDict.Clear(); 67 | foreach (TagViewData tag in TagsView) 68 | { 69 | tag.Status = TagViewStatus.Default.ToString(); 70 | } 71 | } 72 | #endregion 73 | 74 | #region RFID method 75 | public override void UpdateIn() 76 | { 77 | rfidService.TagRead += TestTagReadEvent; 78 | rfidService.TriggerEvent += HHTriggerEvent; 79 | rfidService.ReaderConnectionEvent += ReaderConnectionEvent; 80 | 81 | disposedValue = false; 82 | } 83 | public override void UpdateOut() 84 | { 85 | rfidService.TagRead -= TestTagReadEvent; 86 | rfidService.TriggerEvent -= HHTriggerEvent; 87 | rfidService.ReaderConnectionEvent -= ReaderConnectionEvent; 88 | } 89 | 90 | private void TestTagReadEvent(IList aryTags) 91 | { 92 | lock (tagreadlock) 93 | { 94 | foreach (ReaderTag tag in aryTags) 95 | { 96 | TestUpdateUi(tag.Epc, tag.TagCount, tag.Rssi); 97 | } 98 | } 99 | } 100 | 101 | private void TestUpdateUi(string id, int count, short? rssi) 102 | { 103 | if (tagDict.ContainsKey(id)) 104 | { 105 | tagDict[id] = tagDict[id] + count; 106 | UpdateCount(id, tagDict[id], rssi); 107 | } 108 | else 109 | { 110 | tagDict.Add(id, count); 111 | UpdateList(id, count, rssi); 112 | } 113 | totalTagCount += count; 114 | UpdateCounts(); 115 | } 116 | #endregion 117 | 118 | #region custom tag methods 119 | protected override void UpdateList(String tag, int count, short? rssi) 120 | { 121 | TagViewData find = TagsView.FirstOrDefault(q => q.Epc == tag); 122 | if (find is not null) 123 | { 124 | find.Status = "FOUND!"; 125 | } 126 | } 127 | 128 | protected override void UpdateCount(String tag, int count, short? rssi) 129 | { 130 | 131 | } 132 | #endregion 133 | } 134 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/ViewModels/FindItem/FindItemRfidViewModel.cs: -------------------------------------------------------------------------------- 1 | using XRFID.Sample.Client.Mobile.Base; 2 | using XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 3 | using XRFID.Sample.Client.Mobile.Data.ViewData; 4 | using XRFID.Sample.Client.Mobile.Platforms.Android.Interfaces; 5 | 6 | namespace XRFID.Sample.Client.Mobile.ViewModels; 7 | 8 | [QueryProperty(nameof(Product), nameof(Product))] 9 | public partial class FindItemRfidViewModel : BaseRfidViewModel 10 | { 11 | #region properties 12 | private const int TIMER_DELAY = 5000; 13 | 14 | private short rssiLow = -80; 15 | private short rssiHigh = -30; 16 | private short rssiMagicNumber;//Calculate constant to sum to make rssi always positive 17 | private float rssiScaleFactor;//calculte scale factor from normalized rssi values to Percentage values, this is basically the *100/maxvalue part of the proportion 18 | 19 | private const short PERC_LOW = 33; 20 | private const short PERC_HIGH = 66; 21 | 22 | private readonly SolidColorBrush PercLow = new SolidColorBrush(new Color(231, 29, 54)); //red //cannot be const due to c# limitations 23 | private readonly SolidColorBrush PercMid = new SolidColorBrush(new Color(253, 197, 0)); //yellow 24 | private readonly SolidColorBrush PercHigh = new SolidColorBrush(new Color(70, 200, 53)); //green? 25 | 26 | private Timer resetTimer; 27 | 28 | private FindProductViewData product = new FindProductViewData(); 29 | public FindProductViewData Product 30 | { 31 | get => product; 32 | set => SetProperty(ref product, value); 33 | } 34 | 35 | private Brush color; 36 | public Brush Color 37 | { 38 | get => color; 39 | set => SetProperty(ref color, value); 40 | } 41 | 42 | private double percent; 43 | public double Percent 44 | { 45 | get => percent; 46 | set => SetProperty(ref percent, value); 47 | } 48 | 49 | private bool isReading = false; 50 | #endregion 51 | 52 | public FindItemRfidViewModel(IRFIDService rfidService, IGeneralSettings generalSettings) : base(rfidService, generalSettings) 53 | { 54 | resetTimer = new Timer(ResetPercentage, new AutoResetEvent(false), Timeout.Infinite, Timeout.Infinite); 55 | Color = PercLow; 56 | 57 | rssiMagicNumber = (short)(rssiLow * -1); 58 | rssiScaleFactor = 100f / (float)(rssiHigh + rssiMagicNumber); 59 | } 60 | 61 | #region view methods 62 | public override Task OnAppearing() 63 | { 64 | Percent = 0; 65 | isReading = false; 66 | rssiHigh = (short)Preferences.Default.Get("findsensitivity", -30); 67 | rssiMagicNumber = (short)(rssiLow * -1); 68 | rssiScaleFactor = 100f / (float)(rssiHigh + rssiMagicNumber); 69 | UpdateIn(); 70 | return base.OnAppearing(); 71 | } 72 | public override Task OnDisappearing() 73 | { 74 | Dispose(); //This dispose method is in base, but due to inherithance implementation details it calls the overridden UpdateOut() 75 | return base.OnDisappearing(); 76 | } 77 | #endregion 78 | 79 | #region WorkFlow Methods 80 | public void ContinousRead(bool pressed) 81 | { 82 | if (pressed) 83 | { 84 | PerformInventory(); 85 | } 86 | else 87 | { 88 | StopInventory(); 89 | } 90 | } 91 | 92 | private void ResetPercentage(object e) 93 | { 94 | Percent = 0; 95 | } 96 | 97 | private void PercentageCalculation(short rssi) 98 | { 99 | if (rssi > rssiHigh) 100 | { 101 | rssi = rssiHigh; 102 | } 103 | else if (rssi < rssiLow) 104 | { 105 | rssi = rssiLow; 106 | } 107 | 108 | // rssi to positive 109 | rssi += rssiMagicNumber; 110 | 111 | //Calculate scaled percentage with " oneHundredPerc:100 = rssi:X " 112 | Percent = Math.Round(rssi * rssiScaleFactor); 113 | 114 | switch (Percent) 115 | { 116 | case <= PERC_LOW: 117 | Color = PercLow; 118 | break; 119 | case > PERC_HIGH: 120 | Color = PercHigh; 121 | break; 122 | default: 123 | Color = PercMid; 124 | break; 125 | } 126 | 127 | } 128 | #endregion 129 | 130 | #region RFID method 131 | public override void UpdateIn() 132 | { 133 | rfidService.TagRead += TagReadEvent; 134 | rfidService.TriggerEvent += HHTriggerEvent; 135 | rfidService.ReaderConnectionEvent += ReaderConnectionEvent; 136 | 137 | disposedValue = false; 138 | } 139 | public override void UpdateOut() 140 | { 141 | rfidService.TagRead -= TagReadEvent; 142 | rfidService.TriggerEvent -= HHTriggerEvent; 143 | rfidService.ReaderConnectionEvent -= ReaderConnectionEvent; 144 | } 145 | 146 | protected override void HHTriggerEvent(bool pressed) 147 | { 148 | if (pressed) 149 | { 150 | isReading = true; 151 | Task.Run(ContinousInventory); 152 | } 153 | else 154 | { 155 | isReading = false; 156 | StopInventory(); 157 | } 158 | } 159 | 160 | protected override void UpdateUi(string id, int count, short? rssi) 161 | { 162 | if (Product.Epc.Equals(id)) 163 | { 164 | PercentageCalculation(rssi ?? rssiLow); 165 | resetTimer.Change(TIMER_DELAY, Timeout.Infinite); 166 | } 167 | } 168 | 169 | private void ContinousInventory() 170 | { 171 | do 172 | { 173 | PerformInventory(); 174 | Thread.Sleep(100); 175 | StopInventory(); 176 | 177 | } while (isReading); 178 | } 179 | #endregion 180 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/ViewModels/FindItem/FindItemViewModel.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.Input; 2 | using System.Collections.ObjectModel; 3 | using TinyMvvm; 4 | using XRFID.Sample.Client.Mobile.Data.Services.Interfaces; 5 | using XRFID.Sample.Client.Mobile.Data.ViewData; 6 | using XRFID.Sample.Client.Mobile.Helpers; 7 | using XRFID.Sample.Common.Dto; 8 | 9 | namespace XRFID.Sample.Client.Mobile.ViewModels; 10 | 11 | public partial class FindItemViewModel : TinyViewModel 12 | { 13 | private readonly RestApiHelper apiHelper; 14 | private readonly IAlertService alertService; 15 | 16 | #region collections 17 | private ObservableCollection productList = new ObservableCollection(); 18 | public ObservableCollection ProductList 19 | { 20 | get => productList; 21 | set => SetProperty(ref productList, value); 22 | } 23 | 24 | private FindProductViewData itemTapped; 25 | public FindProductViewData ItemTapped 26 | { 27 | get => itemTapped; 28 | set 29 | { 30 | if (itemTapped != value) 31 | { 32 | itemTapped = value; 33 | OnTapped(value); 34 | } 35 | } 36 | } 37 | #endregion 38 | 39 | #region properties 40 | private string searchEntry; 41 | public string SearchEntry 42 | { 43 | get => searchEntry; 44 | set => SetProperty(ref searchEntry, value); 45 | } 46 | 47 | private bool searchEntryEnabled = true; 48 | public bool SearchEntryEnabled 49 | { 50 | get => searchEntryEnabled; 51 | set => SetProperty(ref searchEntryEnabled, value); 52 | } 53 | #endregion 54 | 55 | #region commands 56 | public IAsyncRelayCommand SearchCommandAsync { get; } 57 | #endregion 58 | 59 | public FindItemViewModel(RestApiHelper apiHelper, IAlertService alertService) 60 | { 61 | this.apiHelper = apiHelper; 62 | this.alertService = alertService; 63 | SearchCommandAsync = new AsyncRelayCommand(SearchItemByNameAsync); 64 | } 65 | 66 | #region view methods 67 | public override Task OnDisappearing() 68 | { 69 | return base.OnDisappearing(); 70 | } 71 | #endregion 72 | 73 | #region WorkFlow Methods 74 | public async Task SearchItemByNameAsync() 75 | { 76 | try 77 | { 78 | if (IsBusy || string.IsNullOrWhiteSpace(SearchEntry)) 79 | { 80 | return; 81 | } 82 | IsBusy = true; 83 | SearchEntryEnabled = false; 84 | 85 | List products = await apiHelper.GetProductsSearchAsync(SearchEntry); 86 | if (products is null || !products.Any()) 87 | { 88 | SearchEntryEnabled = true; 89 | IsBusy = false; 90 | return; 91 | } 92 | 93 | ProductList.Clear(); 94 | 95 | foreach (ProductDto prod in products) 96 | { 97 | ProductList.Add(new FindProductViewData 98 | { 99 | Name = prod.Name, 100 | Epc = prod.Epc, 101 | Code = prod.Code, 102 | }); 103 | } 104 | 105 | SearchEntryEnabled = true; 106 | IsBusy = false; 107 | } 108 | catch (Exception) 109 | { 110 | SearchEntryEnabled = true; 111 | IsBusy = false; 112 | return; 113 | } 114 | } 115 | 116 | private void OnTapped(FindProductViewData value) 117 | { 118 | FindProductViewData item = value; 119 | if (item is null) 120 | { 121 | return; 122 | } 123 | Task result = Shell.Current.GoToAsync("/../finditemrfid", new Dictionary { ["Product"] = item, }); 124 | } 125 | #endregion 126 | } -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/ViewModels/SettingsViewModel.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Maui.Alerts; 2 | using CommunityToolkit.Maui.Core; 3 | using CommunityToolkit.Mvvm.Input; 4 | using System.Text.RegularExpressions; 5 | using TinyMvvm; 6 | 7 | namespace XRFID.Sample.Client.Mobile.ViewModels; 8 | 9 | public class SettingsViewModel : TinyViewModel 10 | { 11 | #region Constants 12 | private readonly Regex guidRegex = new Regex(@"^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$", RegexOptions.Compiled); 13 | public string GuidRegex => guidRegex.ToString(); 14 | 15 | private readonly Regex uriRegex = new Regex(@"^https?://[0-9a-zA-Z._\-/:]*/$", RegexOptions.Compiled); 16 | public string UriRegex => uriRegex.ToString(); 17 | 18 | private readonly Regex hostnameRegex = new Regex(@"^[a-zA-Z0-9\-_]{1,63}$", RegexOptions.Compiled); 19 | public string HostnameRegex => hostnameRegex.ToString(); 20 | 21 | private readonly Regex apiClientRegex = new Regex(@"^[a-zA-Z0-9\-_.]*$", RegexOptions.Compiled); 22 | public string ApiClientRegex => apiClientRegex.ToString(); 23 | 24 | private readonly Regex apiScopeRegex = new Regex(@"^[a-zA-Z0-9\x20]*$", RegexOptions.Compiled); 25 | public string ApiScopeRegex => apiScopeRegex.ToString(); 26 | #endregion 27 | 28 | #region BoundProps 29 | private string apiEndpoint; 30 | public string ApiEndpoint 31 | { 32 | get => apiEndpoint; 33 | set => SetProperty(ref apiEndpoint, value); 34 | } 35 | 36 | private string deviceId; 37 | public string DeviceId 38 | { 39 | get => deviceId; 40 | set => SetProperty(ref deviceId, value); 41 | } 42 | 43 | private string deviceName; 44 | public string DeviceName 45 | { 46 | get => deviceName; 47 | set => SetProperty(ref deviceName, value); 48 | } 49 | #endregion 50 | 51 | public IRelayCommand SaveCommand { get; } 52 | 53 | public SettingsViewModel() 54 | { 55 | SaveCommand = new RelayCommand(SaveSettings); 56 | } 57 | 58 | private async void SaveSettings() 59 | { 60 | CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); 61 | 62 | try 63 | { 64 | if (!uriRegex.IsMatch(apiEndpoint)) 65 | { 66 | throw new ArgumentException("API Endpoint is not a valid URL"); 67 | } 68 | 69 | if (!hostnameRegex.IsMatch(deviceName)) 70 | { 71 | throw new ArgumentException("Device Name does not conform to the hostname ruleset"); 72 | } 73 | } 74 | catch (ArgumentException ex) 75 | { 76 | SnackbarOptions snackbarOptions = new SnackbarOptions 77 | { 78 | BackgroundColor = Colors.WhiteSmoke, 79 | TextColor = Colors.Red, 80 | ActionButtonTextColor = Colors.Black, 81 | CornerRadius = new CornerRadius(10) 82 | }; 83 | 84 | string btntext = "OK"; 85 | TimeSpan duration = TimeSpan.FromSeconds(5); 86 | 87 | await Snackbar.Make(ex.Message, null, btntext, duration, snackbarOptions).Show(cancellationTokenSource.Token); 88 | return; 89 | } 90 | 91 | Preferences.Default.Set("device_name", DeviceName); 92 | Preferences.Default.Set("api_endpoint", ApiEndpoint); 93 | 94 | await Toast.Make("success, reboot application for changes to take effect", ToastDuration.Short).Show(cancellationTokenSource.Token); 95 | } 96 | 97 | public override Task OnAppearing() 98 | { 99 | DeviceName = Preferences.Default.Get("device_name", string.Empty); 100 | if (string.IsNullOrEmpty(DeviceName)) 101 | { 102 | DeviceName = DeviceInfo.Current.Name; 103 | Preferences.Default.Set("device_name", DeviceName); 104 | } 105 | 106 | DeviceId = Preferences.Default.Get("device_id", string.Empty); 107 | if (string.IsNullOrEmpty(DeviceId)) 108 | { 109 | DeviceId = Guid.NewGuid().ToString(); 110 | Preferences.Default.Set("device_id", DeviceId); 111 | } 112 | 113 | ApiEndpoint = Preferences.Default.Get("api_endpoint", string.Empty); 114 | if (string.IsNullOrEmpty(ApiEndpoint)) 115 | { 116 | ApiEndpoint = "https://localhost:5001/api/"; 117 | Preferences.Default.Set("api_endpoint", ApiEndpoint); 118 | } 119 | 120 | return base.OnAppearing(); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Views/AboutView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 15 | -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Views/AboutView.xaml.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XerumSrl/XRFID-Android-Samples/dcfbd1f42a9ea957b4e74eb7557638aea149cab5/XRFID.Sample.Client.Mobile/Views/AboutView.xaml.cs -------------------------------------------------------------------------------- /XRFID.Sample.Client.Mobile/Views/CheckItem/CheckItemRfidView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |