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>
La fotocamera di sistema non ruota lo scatto: salva i pixel come li legge
il sensore e annota la rotazione in EXIF. SkiaSharp (SKBitmap.Decode)
ignora quel tag, quindi le foto scattate ruotate finivano storte nelle
miniature e venivano inviate cosi' al server.
- ImageOrientation: applica l'orientamento ai pixel e ricodifica senza tag
residui, mantenendo il formato di partenza. Immagine gia' dritta: nessuna
ricodifica, per non perdere qualita' inutilmente. In caso di errore
restituisce i byte originali, meglio una foto storta che nessuna foto.
- UtilityFile.ConvertToDto: normalizza li', unico punto di passaggio di
fotocamera e galleria, cosi' miniature, salvataggio locale e upload
lavorano su pixel gia' dritti. Corretto anche DimensionBytes.
- ImageThumb: applica l'orientamento anche in fase di miniatura, per
raddrizzare le foto gia' presenti sul dispositivo.
Nessun ritratto forzato: costringere una foto orizzontale in verticale
vorrebbe dire ruotare il contenuto o ritagliarlo, e queste foto sono prove
di ispezione.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>