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>
Uscendo da una scheda a meta' (tasto indietro del dispositivo o "Annulla")
il lavoro veniva scartato. Il tasto indietro non era nemmeno gestito: non
arriva alla WebView e non c'e' stack di navigazione, quindi mandava l'app
in background con i dati solo in memoria.
Nuovo stato Bozza ("Da completare"): salvata in locale, mai inviabile
finche' non viene conclusa.
- Scheda.Bozza + migration additiva (default false: le schede esistenti
non cambiano stato).
- SchedaSyncHelper: terzo SyncState, CountBozze(). CountDaInviare()
esclude le bozze, quindi il badge "da inviare" resta corretto.
- ModalFormScheda: SaveDraft() salva solo in locale senza validazione;
Save() azzera il flag; Submit() avvisa quando il form e' invalido
(prima il tocco su "Salva" sembrava non fare nulla se i campi mancanti
erano fuori schermo); Update() prende preserveActivityId cosi' una
bozza di scheda gia' inviata mantiene il link al server e al
completamento lo aggiorna invece di duplicarlo.
- ConfirmUpdateActivity: il pulsante bozza sta su NoText, non CancelText
(CancelText ritorna null, NoText ritorna false).
- BackButtonService + MainActivity.OnBackPressed: il tasto indietro passa
dallo stesso percorso di "Annulla". Ignorato mentre e' aperto un dialog
figlio, per non mostrare il prompt sotto un altro dialog.
- IspezionePage: "Concludi ispezione" si blocca se ci sono bozze,
"Esporta reparto" le salta, chip "N da completare" per reparto.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>