From 2aec8d63c940c8b703af3e6076adc6e58b22154e Mon Sep 17 00:00:00 2001 From: Paolo Date: Tue, 28 Apr 2026 21:00:02 +0200 Subject: [PATCH] Auto-sync: 20260428_210000 --- lib/screens/paywall_screen.dart | 28 ++++++++++++++----------- lib/services/subscription_service.dart | 9 ++++---- memory-bank/change-log.md | 2 +- test/full_flow_test.dart | 5 +++++ test/output_test_flow.pdf | Bin 137712 -> 137745 bytes 5 files changed, 27 insertions(+), 17 deletions(-) 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 afc35ebfb04c52eb80b07ac90207f5d176bef6a0..9f4c24b50fd8d05bb3a41ef55de25ce2e571701d 100644 GIT binary patch delta 6069 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 delta 6048 zcmV;R7hmX+vt6k1c=yxXP4CV759Q}~!>76X_}`D8=3lx`@4J7_KYse^)BAsa^|v>!v;0?H zDN#55a(lyX_tEt^*WXy|iND0qhtQdnp|_}ZU)eI1SaL9>SZ{Ei!4Ra$I6F);CJX_5 zcmMwO<}YsJo$F|cza`YFFyRlzX)y`W1a?6 zrp!@K<7`Gt*-T?jDVE}`)u&k7J^d)}eEOiTlfM4Sj>~WUcij2KKjJ-)-4pMu?*nfX zTb0|J7k~T1?{9Cuep;dlKua_(b`JXFR?$?us6R4}_k~ZvAuoT9tL>4np9L1Z_i^OF zVs>C~z+?tHMl(3XSVEYCj~#t^T#E-O_9<&zFW$Uy3Z6{`{`Lm@fHqkgjhk&TXzgq=&en{>gwB8G5hpucv%$>)uu&q@4gS-^ z-Bb6&-S_u*ZEI6+{c3A{4IMa8J{QJ^`wW;Fxx-w%H+DcW2$@WtBbvg@JlGuaJY4Iy zIsmQ@SpB}ca~@v4ynqK6bbrNbt_PGWTW+3;F3z|RxE|~>>_iu2<6-n>NW~hATrEbA zqnXi9gam&OCipGUF-xRMn=c-o?!J9Eo=A3k!BwXhC^6l})8Hxr86Z76XQ`+386ui& znth1|983mro(xSko8rchGFPX3U37~F`FM7Gau{NwynlL_D$6rcF-sB3pz%@IaXWb! z6C=w|7`T}E5KJBiXHo#L$ua0sxUQHr4_xYLDQ16Zx0vz%W>@`nS~MN1zuujmhm@}v zkA{4FRyhD^FPD-lLk4dG*K32EM`jF?P{gMh0x|`cs{%W?aEuIkPkWI`)gu9yO_KNg zChOE=w}M(@Twr$N;GK0Uel`*=WK}}Qj7`unYvygb6i0<=#E{<*aW{i~kNhY^=%c?x zz*K)V7)m{67aJXJxmfcAt8=cEjIBrOkGS@6@V+CvTTHxyoDH))I%!GSbWszP&zaH2 zfNiy9Yeh$z6oHQ-bJS7lykQ{tw1cF=QiA^^Geb@+F*r|XDrEeG=yM+DGP&!Jw7B3G z7=;y#R5b}4R`kWiRL(Lm{=F6L2cgmzoCbdxE6oMSl3or{O_vMwHJ3~&I%{HKDT`Cg zhSjVyk+9J0hB1wF4Sg*hAgfRMBJJ1IJg2KV{5cVo=gCGQXNH-$Rx-_UYR@zK&;Knm zq{IYxjl;|1bC2nZgdamrz#drU$|n0=p_3|x12Y1Hk_E`F(9w>^gq%hHyN2ltEfRkp znDBh76~dcg_2~MnSo6X8P}S{)eYI04T)5Ei=|@g^;3mK$t0<&l81n$=;+1twJzx#e zSo6gnAp>iYTFov1qCzM_&{_t&yFnZ`?|c-jWyxsOSz6mqcTF-qa)IK_Wh&b{1gPiA ze9V*p5S6Jm4O?r<49^S>`<*I6qoaSAq(}XdUMx?g4CF`S=aI!yreekvCNmOnkuFmL zW``?|;ot&;P=uHMUE`8VmP`tO&vZ6_vuU^p_s?^Fm`9puD8{;p6Fi|e*#ozw z;~0m5X>}r{`pR$$w?1GIpYE~P6zndj; zlET@dcUbB0D^|m>2WiSNO)zj%X$R^2xp^M#m`t`MV*wWinJZnP)ee6yu$PvaT;uR| zhjWaKcvNU8sVE-PSxKn-6PQ)KxYVXd+r>i)p9-Tb4nBfeGUp&iHcI^|>{*XoLNc_0 zMYLAS>b@Eg)|13hHNqmjB4z`is0En$Dd2O7el%O3=72U0)^pB}$jZBLo0>gWLU1(A z9!Kl0>Z$AVnVlE}&y;_NDBpl^&qMd>kRH^e`?ii1%? zx-V9mTh|(OFJbzXBwKMb)co2oWY2_eVoky2rb9RK^vR$X42e@a zMjgBOO&B=tNQ8gx#W27jlqfvBGL!@6z~w+%fr`&YfrrN`s+wJM@7zuTma$Oc3XW=s zw26d86GUcdXAk+I3!mcI+G+*%;NQ6wwxX4)Xl#h_yghlnoYu{?VOTGxDdctj16uRg z(w?p5lrqFnD(u0#HLQZ*)7R4#LT-G_TeLPrtmGmv$j^WFd7W^9e@3}w9O}4G2J+{4 zkv3l3Pu%J-^(^tKfLX0bis^*QghF#EJR3kBS9ElY8tWV|oprFv*(vH&QQ(+%BzkDO z$VX_K<#x4dDlbK<>SMP6$`S%XmQlLmwwkHvFl3eZ-M;Ku>gi&+H0@g+Qa#!_9TO-Cmok>ABpotu zdquMK(NTT0)NS2YijR5|6)GutnHLDlozW|=sE=l3NF>`T=Mb`t1Dki}j0tU`<`eey z)>hT6GVIw_CvC$>j=|wFaUt4?H`gr1I$v~WB)5M!2yHfV!ACvagCT0-@QTjwtk?!2 zx+yXU!5tslHAszOJLA`DeF%6t!>FFxB2DY=BYfh1}g|d!X)fJ+;70 zRD6F@!3UMa@P0)%ATSc1VakQsvWERT=^@qg_&Un8a$ z4Ga-ve?f?(LAs)J$eD~?%~ z_g3U`_>9)JR;=lWb)2$f+184c3ADq80~748CM=Qq*J`S&_clvye1<#Yk9o+epVIR9i;Wq}dTTSVtAS zoEDwk9@P7)&QeBg2HDU{h4XS9b!r)%T9TZ%Q%jOhc(}7x3b}D~(wi|YS-Q}3$>d4( z8Vg3!T1DG+0Hf8WL%J#Hy?47Qp>=;r>BQ+~D|Lc0BCPL3Sj+Mf9)3UBCA;6mD};>3^cmo&V3V4*YMNIDqq{ z-#Z(bdz+fsJA@>NMt6>Qcq?w@`RMs(}YGIp&5^KN{JB~Xy6k9 z$*r?Ys&-A=^#caro;(~T>QU+Q2oelMFkcDqa7Whfy@-=!JWt|e3Zn^JOlH?HjIYK? zGMm1f3}c9I;(wRF#7PWqUtEmix2LBk{oXj)gx@vr2#QlMhe|1;;5V{gQlz5lOAE59- zF^p^&kKUew={CL^UISxrVHS%@Tep>Re;f9%zaf0)Vt@JIxcc2KKjDJhFe(ETuuw=6 zDZ=5o_hy&Qi5Ez~blQHw%e>#4cO4+jb;^a1uFDH!#WXIYN8*H8H%D|1O?5$08Qx4#J9&yeo z<3a}E*XJ?ZvoX?*KATp02R{I&&WJc;gatt5fPa$#Ay3g7?Hx@<-D#vBY*`qXCa(ri zHY;ygrtiHrlSh*Ma`qVCvv*;urG|Ljly{ZB)q{VO*Ju6zyjvS>F+4<>2(cx=Q=~nM zx9U3PMk>X)WRajW3`9sbmD}dRg3i+s4V|NgF0Ib<@@vaz3;L9nuHH;8CvY>KjgD$* zXMg^*puVwwb`d;NM3D*uDfl;H@n0#4J)xwXx97?!2vtPBhMcy@|CgqA_(z5H?Ou`` zfwpf+cfEg2{)bs2RNG;KQsImJXfw%SRhile46-s^FY&5`zo52vHpl6$gtW3v$2a!P zvfXG4Se99dzdCPBr583g?f7sAsTA_sLVrfwCu)cIdad)?Y8+tDN85~`SF5sWut!1X zaEs0`lod{+C+WinwqM;YAU_7?oM5osoh9oT~XNk z5);FRU~?#t)~bZeLSt~mMmL`XD@f$aXj32QNBe0n-5npsc}lzU3?+vg)EFH`S+8?+ zT|1^4gmoM)%dU=YMATi1yYcRIzxOxaW8z7da0~($mz5C$Pk%Tu4GKO!4GME~a%Ev{ z4GMT(?O0ojT)7c`AL##}x3vkCmP(~tSQd8dU1Gvw$77NZ@3QE|(qY`~?db_letkaa z^qKSoKZJlE0y7Vzl2oTk`l?iy7OV8;Dyg`+GFExNxe`$(7_+%DdJt}N<#kdfdJ76X zCWSaCQLO!>oPT2DCgl~gOe!e0c2ZHX@T8JrX9mSuvDcF_pwgsRafp+$isRJ5(2=GN zcFO9hgT1n5>foR(PaPbUwNnQtWo7EHT3I)BSOaS6u&k_~I;>STOdVE~jZ=q(jx=@H zphQm{!b)ryHwRE6lMeui8%TL^O1uYDUw{40H=C<5Zhx+}FAn$nlVVVR*tI+L9++wM zRt*#}{)F{+|M=L|_D%k!-)*igzWjE-Kb-KzPgBbN)c0fNVTd6Bn9d@;G2q#Igh*^;KlLq@%r#dy&qq@p%3i%b(kLlaDxznmRFk+wTtd$J+1I z`Np@0E)`qlZf@%**|@-{U^Z?mP1{wwHr1Q#b*;e^22F_F@7sW<1DGqw0sGqswSq?S%a$3(TH5PWN_bx?k> zE7;+?>6hw*22cA|rhg-q9tMC(pTx~7t=7*0j1uF9Jg z258Q`F_X>`No)Mv2zCiYQ`MSWVTT zbAR(>jjbfoE5)i4HB($j>|+}253Uf{mH?d;T?Xzj9i@^D1!t`e2FD3bd0x#FgK0Tg zCI^F&;M`Q)xIi>IIw!!bDZji4us7g~zd+rl0NkM>))tAY2&Ytft44WVt=e0P0dJ3d zgXyLEM6kXgAEm`^atS3W&#P5auLy_HP=D?bK;nitNALI=Wb24Fl9YdNb6s5n6haW` zNt}hxu)tsvb1o?(ios`iwQ8!Z<;aD&7vP>^qY_-D5-nhAH6SLc5fK-5i(u2Z<8Ib; zm?=7nz?Q6w?5&qoWHuFMr=Lfo_we_!++{J z4;O>G6kP%(-I6qGT-LDa!xN4f9+@?hrxm9OfAi(AT zWR8@bVLUF0E`rphs}ai2R>fnAL3;{f@jMLvCEo%y-E#=pHlG2cU9CFYj+@hDYy>h^ zgmQ6_bj`)GD;lp`jij*pyM}iFZGSuuT(u@k$>k0-0eP!pOBw8sL*1L>q2Bb9dcS@1 z@_V&?*FT-q_SFZ3`|I=g;yk_@vGp&n%inrE2gg?*w2~DH-D>kKIcg2?Nylr8HdHbi zp%!Lx&JOMVQv3M~Zx5$@>La&bWSez&B$y>oAA3IS4*Qpb_u0$eu|{5I9e-I1-uz#m zgXM=qd$fyOZk!Iz{YLXwMt}8uxp2F${ivRO$o2J&`cpsNL25@x{Vl5>pIzVYZX2TQ z3+I1)uKswRkEeesU^8>vr_=LCNpMM@=F!2CCeO)qEcW&LpyyHL3( z8W{?coBMK_^RYUPah>n_%zs|n-}l?U_tUOstbVtzhql}QqPBnD?Z4gM?bd}S$xo7> zBtJ=hlKdq3N%H@_2S^vRzo3FF1uS3*D_Fw@O4vdLJE&nVy|3|aBTpKW zr(GaB!zYFo4se8%ytsr~zU&V}_a5O53T1AW