Finora la foto si poteva togliere solo prima di salvare la scheda.
- La X compare su tutte le foto (non in sola lettura, non mentre la foto e'
ancora in elaborazione). L'eliminazione avviene al salvataggio: uscendo
senza salvare le foto restano.
- Una foto gia' inviata si toglie prima dal server (nuovo endpoint
steup/removeAttachment), poi dal dispositivo e da Scheda.ImageNames. Senza
rete la X avvisa e non la toglie; se il server non conferma al salvataggio
la foto resta ovunque e compare un avviso.
- Una foto salvata ma non ancora inviata si elimina dal dispositivo (con la
rete si prova anche a toglierla dal server, senza bloccare).
- Togliere una foto salvata non la cancellava mai: il flag ToRemove finiva
su un elemento appena rimosso dall'elenco. Ora le foto tolte stanno in una
lista a parte fino al salvataggio; ToRemove e' stato eliminato.
- FileManager.GetInspectionFiles: le foto in /toUpload si filtravano per
nome, ma ImageNames contiene il percorso completo, quindi quelle salvate
senza rete non ricomparivano mai riaprendo la scheda. Ora si accetta sia il
percorso sia il nome, e il DTO porta anche i byte del file per l'invio.
Richiede i Servizi con steup/removeAttachment.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Con il permesso negato "Aggiungi una foto" non faceva nulla: il servizio
restituiva null come per un annullamento. Dopo un rifiuto definitivo
Android non ripropone la richiesta, quindi il rilevatore restava bloccato
senza capire perche'.
- AttachedService: la richiesta dei permessi diventa RequestCameraPermissions,
usata anche da SelectImageFromCamera; OpenAppSettings apre le impostazioni
dell'app.
- ModalFormScheda e ModalAddAttached: chiedono i permessi prima di scattare
e, se negati, mostrano un avviso con l'azione "Impostazioni".
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Se lo scatto falliva, AttachedService restituiva null come per un
annullamento: il rilevatore toccava "Aggiungi una foto" e non succedeva
nulla.
- AttachedService: espone IsCameraAvailable (IsCaptureSupported) e, dopo
aver registrato l'errore e averlo inviato a Sentry, lo rilancia invece di
restituire null.
- ModalFormScheda: dalla scheda il pulsante apre solo la fotocamera, quindi
senza fotocamera non c'era alternativa. Ora avvisa e apre la galleria;
se lo scatto fallisce mostra un errore.
- ModalAddAttached: stessa gestione dell'errore di scatto.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Le foto venivano zippate tutte in un unico allegato: oltre i 100 MB i servizi
rifiutavano l'invio (MaxUploadSizeExceededException) e, costruendo tutto in RAM
sul thread della UI, il dispositivo si bloccava.
- Invio diviso in più email da massimo ~40 MB ciascuna
- Zip scritti su disco una parte alla volta e caricati in streaming
- Preparazione in background, avanzamento "parte X di N"
- Richiesta se includere le foto, con il loro peso (default: solo i log)
- Database inviato insieme al file -wal
- Avviso subito se si è offline
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>