diff --git a/SteUp.Maui/Core/Services/AttachedService.cs b/SteUp.Maui/Core/Services/AttachedService.cs index fde9132..9b39f25 100644 --- a/SteUp.Maui/Core/Services/AttachedService.cs +++ b/SteUp.Maui/Core/Services/AttachedService.cs @@ -10,12 +10,19 @@ public class AttachedService(ILogger logger) : IAttachedService { public bool IsCameraAvailable => MediaPicker.Default.IsCaptureSupported; - public async Task SelectImageFromCamera() + public async Task RequestCameraPermissions() { var cameraPerm = await Permissions.RequestAsync(); var storagePerm = await Permissions.RequestAsync(); - if (cameraPerm != PermissionStatus.Granted || storagePerm != PermissionStatus.Granted) + return cameraPerm == PermissionStatus.Granted && storagePerm == PermissionStatus.Granted; + } + + public void OpenAppSettings() => AppInfo.Current.ShowSettingsUI(); + + public async Task SelectImageFromCamera() + { + if (!await RequestCameraPermissions()) return null; FileResult? result; diff --git a/SteUp.Shared/Components/SingleElements/Modal/ModalAddAttached.razor b/SteUp.Shared/Components/SingleElements/Modal/ModalAddAttached.razor index 224703d..00dfa18 100644 --- a/SteUp.Shared/Components/SingleElements/Modal/ModalAddAttached.razor +++ b/SteUp.Shared/Components/SingleElements/Modal/ModalAddAttached.razor @@ -40,6 +40,21 @@ private async Task OnCamera() { + if (!await AttachedService.RequestCameraPermissions()) + { + Snackbar.Clear(); + Snackbar.Add("Per scattare le foto serve il permesso della fotocamera", Severity.Warning, config => + { + config.Action = "Impostazioni"; + config.OnClick = _ => + { + AttachedService.OpenAppSettings(); + return Task.CompletedTask; + }; + }); + return; + } + AttachedDto? selectImageFromCamera; try { diff --git a/SteUp.Shared/Components/SingleElements/Modal/ModalFormScheda.razor b/SteUp.Shared/Components/SingleElements/Modal/ModalFormScheda.razor index 7a60f47..5e3de39 100644 --- a/SteUp.Shared/Components/SingleElements/Modal/ModalFormScheda.razor +++ b/SteUp.Shared/Components/SingleElements/Modal/ModalFormScheda.razor @@ -754,12 +754,34 @@ #region File + // Dopo un rifiuto definitivo Android non ripropone la richiesta: il + // permesso si riattiva solo dalle impostazioni, quindi le apriamo noi. + private void ShowCameraPermissionDenied() + { + Snackbar.Clear(); + Snackbar.Add("Per scattare le foto serve il permesso della fotocamera", Severity.Warning, config => + { + config.Action = "Impostazioni"; + config.OnClick = _ => + { + AttachedService.OpenAppSettings(); + return Task.CompletedTask; + }; + }); + } + private async Task OpenAddAttached() { List? attachedList; if (AttachedService.IsCameraAvailable) { + if (!await AttachedService.RequestCameraPermissions()) + { + ShowCameraPermissionDenied(); + return; + } + AttachedDto? selectImageFromCamera; try { diff --git a/SteUp.Shared/Core/Interface/System/IAttachedService.cs b/SteUp.Shared/Core/Interface/System/IAttachedService.cs index f39fcce..588d61a 100644 --- a/SteUp.Shared/Core/Interface/System/IAttachedService.cs +++ b/SteUp.Shared/Core/Interface/System/IAttachedService.cs @@ -6,6 +6,11 @@ public interface IAttachedService { bool IsCameraAvailable { get; } + /// Chiede i permessi per scattare; false se negati. + Task RequestCameraPermissions(); + + void OpenAppSettings(); + /// Null se l'utente annulla; lancia se lo scatto fallisce. Task SelectImageFromCamera(); Task?> SelectImageFromGallery();