diff --git a/lib/screens/paywall_screen.dart b/lib/screens/paywall_screen.dart index fab6ad5..c0bab5b 100644 --- a/lib/screens/paywall_screen.dart +++ b/lib/screens/paywall_screen.dart @@ -152,17 +152,19 @@ class _PaywallScreenState extends State with SingleTickerProvider SafeArea( child: FadeTransition( opacity: _fadeAnimation, - child: Column( - children: [ - Align( - alignment: Alignment.topRight, - child: IconButton( - icon: const Icon(Icons.close, color: Colors.white70), - onPressed: () => Navigator.of(context).pop(), + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + children: [ + Align( + alignment: Alignment.topRight, + child: IconButton( + icon: const Icon(Icons.close, color: Colors.white70), + onPressed: () => Navigator.of(context).pop(), + ), ), - ), - const Spacer(), - const Icon(Icons.qr_code_scanner_rounded, size: 80, color: Colors.white), + const SizedBox(height: 10), + const Icon(Icons.qr_code_scanner_rounded, size: 80, color: Colors.white), const SizedBox(height: 20), const Text( 'Sblocca la Sincronizzazione', @@ -235,8 +237,9 @@ class _PaywallScreenState extends State with SingleTickerProvider child: CircularProgressIndicator(color: Colors.white, strokeWidth: 2), ) : Text( - 'Passa a PRO - \${_yearlyPackage!.storeProduct.priceString} / anno', + 'Passa a PRO - ${_yearlyPackage!.storeProduct.priceString} / anno', style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + textAlign: TextAlign.center, ), ), ) @@ -253,7 +256,7 @@ class _PaywallScreenState extends State with SingleTickerProvider style: TextStyle(color: Colors.white70, decoration: TextDecoration.underline), ), ), - const Spacer(), + const SizedBox(height: 30), // Footer Legale (Obbligatorio per Apple) Padding( @@ -277,6 +280,7 @@ class _PaywallScreenState extends State with SingleTickerProvider ), ), ), + ), ], ), ); diff --git a/lib/services/subscription_service.dart b/lib/services/subscription_service.dart index eaf4c30..3875767 100644 --- a/lib/services/subscription_service.dart +++ b/lib/services/subscription_service.dart @@ -4,8 +4,9 @@ import 'package:purchases_flutter/purchases_flutter.dart'; import 'package:cid_app/global_data.dart'; class SubscriptionService { - // Chiave unificata di test fornita da RevenueCat - static const _apiKey = 'test_xlLcZsCHGnotDSfUoDBmDCrjfaZ'; + // Chiavi distinte fornite da RevenueCat per piattaforma + static const _googleApiKey = 'test_xlLcZsCHGnotDSfUoDBmDCrjfaZ'; + static const _appleApiKey = 'INSERISCI_QUI_LA_CHIAVE_IOS_REVENUECAT'; // TODO: Sostituire con la chiave per iOS static const entitlementID = 'pro'; // Il nome dell'entitlement su RevenueCat static Future init() async { @@ -14,9 +15,9 @@ class SubscriptionService { PurchasesConfiguration? configuration; if (Platform.isAndroid) { - configuration = PurchasesConfiguration(_apiKey); + configuration = PurchasesConfiguration(_googleApiKey); } else if (Platform.isIOS) { - configuration = PurchasesConfiguration(_apiKey); + configuration = PurchasesConfiguration(_appleApiKey); } if (configuration != null) { diff --git a/memory-bank/change-log.md b/memory-bank/change-log.md index 43e847b..53351e3 100644 --- a/memory-bank/change-log.md +++ b/memory-bank/change-log.md @@ -1,6 +1,6 @@ # Change Log -- **2026-04-28**: Modificato il campo "Telefono / Email" in due campi separati in `comp_6-7.dart` (Contraente) e `comp_9.dart` (Conducente) con implementazione Regex per formati internazionali ed email. Aggiornata logica `pdf_engine.dart` per stampare la stringa concatenata nel PDF e aggiornato il salvataggio locale `profilo_service.dart`. +- **2026-04-28**: Modificato il campo "Telefono / Email" in due campi separati in `comp_6-7.dart` (Contraente) e `comp_9.dart` (Conducente) con implementazione Regex per formati internazionali ed email. Aggiornata logica `pdf_engine.dart` per stampare la stringa concatenata nel PDF e aggiornato il salvataggio locale `profilo_service.dart`. **Eseguito e validato test end-to-end** (`full_flow_test.dart`) verificando l'autocompilazione delle email, il bypass OTP e la generazione integra del file PDF. - **2026-04-28**: Aggiornata la versione di Kotlin a 2.1.0 in `android/build.gradle` per conformità alle nuove specifiche di Flutter, superando la dipendenza obsoleta rimossa da `pdf_render`. - **2026-04-28**: Implementata Autocompilazione (Ricorda i miei dati). Creato `ProfiloService` con persistenza locale via `shared_preferences`. Aggiunto popup "Vuoi usare i dati salvati?" su `comp_6-7.dart` e workflow "silenzioso" su `comp_9.dart`. - **2026-04-24**: Implementazione In-App Purchases (RevenueCat) con aggiunta del plugin `purchases_flutter`. Creato `SubscriptionService`, aggiunto campo `isPro` in `GlobalData`, e costruito il Paywall Custom (Glassmorphism) per bloccare la funzionalità "Scambio Dati" agli utenti non paganti. diff --git a/test/full_flow_test.dart b/test/full_flow_test.dart index e37df1a..e1a8e21 100644 --- a/test/full_flow_test.dart +++ b/test/full_flow_test.dart @@ -25,6 +25,7 @@ void main() { GlobalData.Cognome_contraente_A = "ROSSI"; GlobalData.Codice_Fiscale_contraente_A = "RSSMRA80A01H501U"; GlobalData.N_telefono_mail_contraente_A = "+393331234567"; + GlobalData.Email_contraente_A = "mario.rossi@email.it"; GlobalData.Marca_e_Tipo_A = "FIAT PANDA"; GlobalData.Targa_A = "AA123BB"; @@ -36,6 +37,7 @@ void main() { GlobalData.Nome_cond_A = "MARIO"; GlobalData.Cognome_cond_A = "ROSSI"; GlobalData.N_tel_mail_cond_A = "+393331234567"; + GlobalData.Email_cond_A = "mario.rossi@email.it"; // 2. Salva il profilo await ProfiloService.salvaProfilo('A'); @@ -48,17 +50,20 @@ void main() { GlobalData.Nome_contraente_A = ""; GlobalData.Cognome_contraente_A = ""; GlobalData.Targa_A = ""; + GlobalData.Email_contraente_A = ""; // 5. Ricarica il profilo (Autocompilazione) await ProfiloService.caricaProfilo('A'); expect(GlobalData.Nome_contraente_A, "MARIO"); expect(GlobalData.Targa_A, "AA123BB"); + expect(GlobalData.Email_contraente_A, "mario.rossi@email.it"); // 6. Simula i dati del Conducente B (dall'altra parte dello scambio) GlobalData.Nome_contraente_B = "LUIGI"; GlobalData.Cognome_contraente_B = "VERDI"; GlobalData.Targa_B = "CC987DD"; GlobalData.N_tel_mail_cond_B = "+393339876543"; + GlobalData.Email_cond_B = "luigi.verdi@email.it"; // 7. Simula l'esito della FEA (senza inviare veri SMS) // Conducente A approva diff --git a/test/output_test_flow.pdf b/test/output_test_flow.pdf index afc35eb..9f4c24b 100644 Binary files a/test/output_test_flow.pdf and b/test/output_test_flow.pdf differ