| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 | 
							- 
 
- using Android.Gms.Tasks;
 
- using Android.Runtime;
 
- using AndroidX.Camera.Core;
 
- using AndroidX.Camera.View.Transform;
 
- using Avalonia.Threading;
 
- using InABox.Avalonia.Platform.Barcodes;
 
- using Microsoft.Maui.Graphics.Platform;
 
- using System.Diagnostics;
 
- using Xamarin.Google.MLKit.Vision.Barcode.Common;
 
- using Xamarin.Google.MLKit.Vision.BarCode;
 
- using Xamarin.Google.MLKit.Vision.Common;
 
- using Scanner = Xamarin.Google.MLKit.Vision.BarCode.BarcodeScanning;
 
- using Size = Android.Util.Size;
 
- using Point = Microsoft.Maui.Graphics.Point;
 
- using Rect = Microsoft.Maui.Graphics.Rect;
 
- using Android.Graphics;
 
- namespace InABox.Avalonia.Platform.Android.Barcodes;
 
- internal class BarcodeAnalyzer : Java.Lang.Object, ImageAnalysis.IAnalyzer
 
- {
 
-     public Size DefaultTargetResolution => Methods.TargetResolution(null);
 
-     public int TargetCoordinateSystem => ImageAnalysis.CoordinateSystemViewReferenced;
 
-     private readonly HashSet<BarcodeResult> _barcodeResults;
 
-     private readonly CameraManager _cameraManager;
 
-     private readonly object _resultsLock;
 
-     private IBarcodeScanner? _barcodeScanner;
 
-     private CoordinateTransform? _coordinateTransform;
 
-     private bool _updateCoordinateTransform = false;
 
-     private Point _previewViewCenter = new();
 
-     private Rect _previewViewRect = new();
 
-     internal BarcodeAnalyzer(CameraManager cameraManager)
 
-     {
 
-         _barcodeResults = [];
 
-         _cameraManager = cameraManager;
 
-         _resultsLock = new();
 
-         _previewViewRect.X = 0;
 
-         _previewViewRect.Y = 0;
 
-     }
 
-     internal void UpdateSymbologies()
 
-     {
 
-         _barcodeScanner?.Dispose();
 
-         _barcodeScanner = Scanner.GetClient(new BarcodeScannerOptions.Builder()
 
-             .SetBarcodeFormats(Methods.ConvertBarcodeFormats(_cameraManager?.CameraView?.BarcodeSymbologies ?? BarcodeFormats.All))
 
-             .Build());
 
-     }
 
-     public void Analyze(IImageProxy proxy)
 
-     {
 
-         try
 
-         {
 
-             ArgumentNullException.ThrowIfNull(proxy?.Image);
 
-             ArgumentNullException.ThrowIfNull(_cameraManager?.CameraView);
 
-             ArgumentNullException.ThrowIfNull(_barcodeScanner);
 
-             if (_cameraManager._pauseScanning)
 
-                 return;
 
-             if (_updateCoordinateTransform)
 
-             {
 
-                 _coordinateTransform?.Dispose();
 
-                 _coordinateTransform = _cameraManager.GetCoordinateTransform(proxy);
 
-                 _previewViewCenter.X = _cameraManager.PreviewView.Width * 0.5;
 
-                 _previewViewCenter.Y = _cameraManager.PreviewView.Height * 0.5;
 
-                 _previewViewRect.Width = _cameraManager.PreviewView.Width;
 
-                 _previewViewRect.Height = _cameraManager.PreviewView.Height;
 
-                 _updateCoordinateTransform = false;
 
-             }
 
-             using var inputImage = InputImage.FromMediaImage(proxy.Image, 0);
 
-             using var task  = _barcodeScanner.Process(inputImage);
 
-             var result = TasksClass.Await(task);
 
-             Java.Lang.Object? invertedResult = null;
 
-             if (_cameraManager._forceInverted)
 
-             {
 
-                 Methods.InvertLuminance(proxy.Image);
 
-                 using var invertedImage = InputImage.FromMediaImage(proxy.Image, 0);
 
-                 using var invertedTask = _barcodeScanner.Process(invertedImage);
 
-                 invertedResult = TasksClass.Await(invertedTask);
 
-             }
 
-             lock (_resultsLock)
 
-             {
 
-                 _barcodeResults.Clear();
 
-                 AddResultToSet(result);
 
-                 AddResultToSet(invertedResult);
 
-                 _cameraManager.CameraView.DetectionFinished(_barcodeResults);
 
-             }
 
-             if (_cameraManager._forceFrameCapture || (_cameraManager._captureNextFrame && _barcodeResults.Count > 0))
 
-             {
 
-                 // using var stream = new MemoryStream();
 
-                 // var bitmap = proxy.ToBitmap();
 
-                 // bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
 
-                 // var image = new PlatformImage(stream.ToArray());
 
-                 // _cameraManager.CameraView.TriggerOnImageCaptured(image);
 
-             }
 
-             result?.Dispose();
 
-             invertedResult?.Dispose();
 
-         }
 
-         catch (Exception ex)
 
-         {
 
-             Debug.WriteLine(ex);
 
-         }
 
-         finally
 
-         {
 
-             try
 
-             {
 
-                 proxy?.Close();
 
-             }
 
-             catch (Exception ex)
 
-             {
 
-                 Debug.WriteLine(ex);
 
-                 Dispatcher.UIThread.InvokeAsync(() => _cameraManager?.Start());
 
-             }
 
-         }
 
-     }
 
-     private void AddResultToSet(Java.Lang.Object? result)
 
-     {
 
-         if (result is not JavaList javaList)
 
-             return;
 
-         foreach (Barcode barcode in javaList)
 
-         {
 
-             if (barcode is null)
 
-                 continue;
 
-             if (string.IsNullOrEmpty(barcode.DisplayValue) && string.IsNullOrEmpty(barcode.RawValue))
 
-                 continue;
 
-             var barcodeResult = barcode.AsBarcodeResult(_coordinateTransform);
 
-             if ((_cameraManager?._aimMode ?? false) && !barcodeResult.PreviewBoundingBox.Contains(_previewViewCenter))
 
-                 continue;
 
-             if ((_cameraManager?._viewFinderMode ?? false) && !_previewViewRect.Contains(barcodeResult.PreviewBoundingBox))
 
-                 continue;
 
-             _barcodeResults.Add(barcodeResult);
 
-         }
 
-     }
 
-     public void UpdateTransform(Matrix? matrix)
 
-     {
 
-         _updateCoordinateTransform = true;
 
-     }
 
-     protected override void Dispose(bool disposing)
 
-     {
 
-         _coordinateTransform?.Dispose();
 
-         _barcodeScanner?.Dispose();
 
-         
 
-         base.Dispose(disposing);
 
-     }
 
- }
 
 
  |