| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | using System;using System.IO;using System.Threading.Tasks;using JetBrains.Annotations;using Xamarin.Essentials;using XF.Material.Forms.UI.Dialogs;namespace InABox.Mobile{        public abstract class MobileDocumentSource    {        public abstract Task<MobileDocument> From();    }        public abstract class MobileDocumentSource<TOptions> : MobileDocumentSource         where TOptions : class, IMobileDocumentOptions, new()    {        public TOptions Options { get; set; }        protected MobileDocumentSource(TOptions options)        {            Options = options;        }                protected abstract Task<bool> IsEnabled();                protected async Task<bool> IsEnabled<TPermission>()            where TPermission : Permissions.BasePermission, new()        {            var status = await Permissions.CheckStatusAsync<TPermission>();            if (status != PermissionStatus.Granted && status != PermissionStatus.Restricted)                status = await Permissions.RequestAsync<TPermission>();            return status == PermissionStatus.Granted;        }                protected abstract Task<FileResult> Capture();                public override async Task<MobileDocument> From()        {            var result = new MobileDocument();            if (await IsEnabled())            {                try                {                    var file = await Capture();                    if (file != null)                    {                        result.FileName = Path.GetFileName(file.FileName); //file.OriginalFilename ?? file.Path);                        await using (var stream = await file.OpenReadAsync())                        {                            BinaryReader br = new BinaryReader(stream);                            result.Data = br.ReadBytes((int)stream.Length);                        }                    }                    ApplyOptions(result);                }                catch (FeatureNotSupportedException fnsEx)                {                    await MaterialDialog.Instance.AlertAsync("This operation is not Supported on this Device!");                    MobileLogging.Log(fnsEx, "Capture(FNS)");                }                catch (PermissionException pEx)                {                    await MaterialDialog.Instance.AlertAsync("This operation is not Permitted on this Device!");                    MobileLogging.Log(pEx, "Capture(PERM)");                }                catch (Exception ex)                {                    await MaterialDialog.Instance.AlertAsync("Oops! Something went wrong!  Please try again..");                    MobileLogging.Log(ex, "Capture(ERR)");                }            }            return result;        }        protected abstract void ApplyOptions(MobileDocument document);    }}
 |