Files
SteUP_Dotnet/SteUp.Maui/Platforms/Android/MainActivity.cs
T
MarcoE d076a4b77a Salvataggio come bozza: il lavoro in corso non si perde piu'
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>
2026-09-16 13:24:35 +02:00

62 lines
2.6 KiB
C#

using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Views;
using AndroidX.Core.View;
using Microsoft.Extensions.DependencyInjection;
using SteUp.Shared.Core.Messages.System;
namespace SteUp.Maui
{
[Activity(
Theme = "@style/Maui.SplashTheme",
MainLauncher = true,
WindowSoftInputMode = SoftInput.AdjustResize | SoftInput.StateHidden,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode |
ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
protected override void OnCreate(Bundle? savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Da Android 15 (API 35) il edge-to-edge e' forzato e adjustResize non ridimensiona
// piu' la finestra: la tastiera si limita a coprire la WebView. Riduciamo noi il
// content view dell'altezza dell'IME cosi' il layout Blazor (100vh) si ricalcola.
if (FindViewById(Android.Resource.Id.Content) is { } content)
ViewCompat.SetOnApplyWindowInsetsListener(content, new ImeInsetsListener());
}
public override void OnBackPressed()
{
// Se la UI Blazor ha un form aperto se ne occupa lei (propone il salvataggio
// come bozza); altrimenti comportamento standard.
var backButton = IPlatformApplication.Current?.Services.GetService<BackButtonService>();
if (backButton?.TryHandleBackPressed() == true) return;
base.OnBackPressed();
}
private sealed class ImeInsetsListener : Java.Lang.Object, IOnApplyWindowInsetsListener
{
public WindowInsetsCompat OnApplyWindowInsets(Android.Views.View? v, WindowInsetsCompat? insets)
{
if (v is null || insets is null)
return insets!;
var ime = insets.GetInsets(WindowInsetsCompat.Type.Ime()).Bottom;
var systemBars = insets.GetInsets(WindowInsetsCompat.Type.SystemBars()).Bottom;
// La barra di navigazione e' gia' gestita da SafeAreaEdges in MainPage:
// teniamo solo la parte di tastiera che la eccede, per non sommare due volte.
var bottom = System.Math.Max(0, ime - systemBars);
if (v.PaddingBottom != bottom)
v.SetPadding(v.PaddingLeft, v.PaddingTop, v.PaddingRight, bottom);
return insets;
}
}
}
}