From d89ad33b98464e935dd7af383efc83471d6c46e1 Mon Sep 17 00:00:00 2001 From: open-trade Date: Sun, 29 Nov 2020 00:13:55 +0800 Subject: [PATCH] has crash when popup msgbox when there is keyboard or some other condition --- flutter_hbb/assets/insecure.png | Bin 0 -> 4126 bytes flutter_hbb/assets/insecure_relay.png | Bin 0 -> 4616 bytes flutter_hbb/assets/linux.png | Bin 4119 -> 4247 bytes flutter_hbb/assets/mac.png | Bin 3931 -> 2885 bytes flutter_hbb/assets/secure.png | Bin 0 -> 2509 bytes flutter_hbb/assets/secure_relay.png | Bin 0 -> 5147 bytes flutter_hbb/assets/win.png | Bin 1797 -> 1379 bytes flutter_hbb/lib/common.dart | 7 ++-- flutter_hbb/lib/home_page.dart | 2 +- flutter_hbb/lib/model.dart | 37 ++++++++++++++++++- flutter_hbb/lib/remote_page.dart | 51 +++++++++++++++----------- 11 files changed, 70 insertions(+), 27 deletions(-) create mode 100644 flutter_hbb/assets/insecure.png create mode 100644 flutter_hbb/assets/insecure_relay.png create mode 100644 flutter_hbb/assets/secure.png create mode 100644 flutter_hbb/assets/secure_relay.png diff --git a/flutter_hbb/assets/insecure.png b/flutter_hbb/assets/insecure.png new file mode 100644 index 0000000000000000000000000000000000000000..0c954468d939085cdf323e29cac1271e5be66e5f GIT binary patch literal 4126 zcmdUy_dgYm|HZF;uZ-*3x^eAnLauA%a^=dpR`v=R*`sV-d*-@DLdhP9w-T9k?G;Iv zB-!Jd*<3e1egBN_<8jV;{&F6#$LrUViZRw>X5?c8007MTXq4GM4*Z{iH2*R`$+7ky z8Zm|zy8n3j|4qehBZz;0tA&^un*(SlWcuU1r7iZEpzQiJMirJ@!h9c|`xqiJ!mf`F z&llg7caSD!XksVLz7(K#zXPGd&iC zK=9fhCFK2VUoUxLbG83oUQVsL6w7mI%lix#{3f?rMXjg%Tzi6zyh82vVBe~Xjw(XC zmfa){SD*GwP;-A!3|SSDAQ*G8X@NJqr#+kl#h0Daiiuc&@9+*bh&S8;eE?BQGY=v~ zNbW+->eN07Xb|LV?mo3XxKJ`sUjInOMFfZmNJP^1xB{DT*Gpla;|Wl0dHoGRRgn}- zH92QDgn}V5ItyXI&WouWa&NNk?de>IaronD|8=XxDO>|Xw>&ou? zuZRG#2PPCpb<-%g!J^VcMoH2@?Kvmk`9&9dCi!58z*9R~DD)6GG+`h5r=YjMAosi* zCONTobuNgv!Z`!#|K!h5x@na3WPio8wZWYv!2C1*$l1T`F)~bDpNF??Yigd{@f`5m zZCHky)Yfa{tB-pAXP>eC_nCK0OfJb0D=(|(byzFhwm)zj)*$VpN>JFNH(Z@*QlM;Y zw{9#P^t88fzfBReRhE-e=Ubw^9rp5Q?Z1X-#rnoLiE?YN=$wu2IJxOVv*YKPT(Awfzd&ldpZ=X`53bA=-lgDxVNT9cG$3GTh5Eh3mV_uU+jP zjd9rYsG75y&``c&GL&@3?rz_C^{dSbi$;1L;J!5aqoUmc>*~oWyWa8lFF|Qf!>2y^ znA9F5v%VU8oIzX!Wq*&c_Me>^#s82tj`lv7$97%ukD3&6iN`f$5=$-~8WxY4)%y2& z<%=4!?M2C;(_UG&&KCIY!P}M7CHErSF|*>M7Q@R-uV5rCxkd#lVeN54xo;`?xU2E|E6 z=J?SIn$++;-)9oj<2j&kTAT$BnvlZSrH|DU;f|H7y$x+LbX}sN7Hjko3YT^Ku4Vw` zUok|$$bkvwYqHt3vVvax@ayhrQ1GWN;q$G09*2jiW$Zf!D$5Ou(4r$Vj=yEu1~Dol z1wpe$P_Fu{0sWWSR^68x?&Rah6Qa%-yQ2SPm4UYzdK zG6>-fF=hC!;l-qu=^ylTUBp$$Wh{b&F2$9)DwJ<7bcY;6OQ>bk=>@Xb6t+V21pfH# z>g_j&9VIR1786A&UgDX+^pOH2R^nsqQ zvSZgad5g~nbfY08`yXRMQPn}#o}IUEICK)h8ztK+U&XWIvn!QdaDtWXR5Ic3&xpaE zUq^hXj`Z^x@Pg{s;9U9Leu^%;3=$1x`MO1Jf(b%rA*rR+Y8$XG5)q!Ng+eFw5=BAU zWYbOLlwjxA2~rVNc=6drE6f7PhRtuUARq^+GOZCbH(s-2i#35$7-@4Ome@gAdJipI zi^k1x@`PksR?<$7h!Q`5`+Xq0~sxN$BElnWe_w(LH;!Q`IBxx;)$*hgK zP#IrXir933+<%Dya)t9y)>zJqPy2N48v#fD3Y&70ljNRxCC@{TTfiYEw;2geEXg?CEk z9<^z4nSq{8-w;EHM~-b;u20b5e%$}?ti7nm-@?`M-v0GI)SA@zbuFcz+{1XTPXb;c zeWX(P9hWv-LC%^YsuYXq(PTMlDlk%se|-%lPUHk@^s{9~ZER!T=!yj;TjTq!i00gB~Furv_lrLah|{I zDi?ErvWIrW!Ig)AcSewxOyi!}_btpk99Z{b#km0R5=A4WCstfz-rBbf)O77V8fWqA zhaJS*$)1#0WIf6(J=KV=arTDcEyznv9i>GVUJ^o}OXw1I8U-^6A>Tv^kKL6Z%x|S8 zdW95h}XZJhXUjU5O>(3I6FueYQpg7C5$?$9BR>xj@JPcx_QYaO zCB-Pz-IFgg)woA0DG@3qsbIqg?Ze+k!A(N;QNo`#LM>@YeiI?WDaPOg`olu>PkPP% z(iR()0p=eehwP;qNietd7A*#S4;}s`M>UDm9t|n4685H1+$*~WJWj12eKBCVT;umU z+;C}9OXQbpEcTrKj|bsf+S@0;7$EMtH_-_hKaSdjgKM^nbwN`jo<%=xI~+7Ia50B% zUyU1oCB-@p`yCPQD=u7ZzC8Ewbu$l%L%mdtPA^ia z8+?FL%U!+QE%m7~GHqnkl`!`WwTQnzHOQ-UB%`k<(XP-~L5-xpRR%R7pq@E)4j@nr{{m2rFkL(q(hcw@QSlU@!X zAnw^O1cnV;xYMDSX0no31#T{cxNyj>0Ne~zlL1FONwz{f{i;q#4B`9ue@O;kf!o2< zUTx|oTcTC#()O6Mv@qhNd3+~#25l|a3qg5g(8jRV;*8Xyk{cdW))Eb9hzqHw`I7OG z7OP*32G`K1==}O^FD{Z}!zt(1@S0TDdN(R1u?jfZ7oA;P`R%$eL{CE-a`(P#9>k0nCB7bHU`zryP-pB6dH&$8>P#LMO(+TObS0Sb@O3ku*j{g@Y*!!LkD87CrFhEA_dGgTU{%uH{9oGkPK_k!fUQZ8CJN9m4-M$AWA$XTBG6^K(} z(`U9s-o?lDL1@@uYoZdOOe_G3IExyLVG?0FB4N^5piAoaRG%e7I1X*c0=^~F3JXB< z*kNq%UJ#8FQ9s2LD1xleFt_0zD@*5N5cHC$cbOR&ug%8C7)|PW-%RMatwEb z5A;Hx%=p1r*K0}et!-<1CE4H+gp|lF5QuD`1|pj+CDOJmezs*XdrLXrnLQzoRVOQs z@iG*)=5v4^oeu5&SNX`&=ypg1U4%K~YFQXRdNM8ObFk0ompO~Nx>%o~W%vrQ!DxrWhRfLd0xcZZbsa z%uag=ZO(NZSnY(x`%_I$U9DO`&^}XQiq&8Os@kLu6Q={)k!Kp}zL#<;Z>cKi9(V^R zKam4utZm--oU;3{>8V+nK=5C?tk+-N4*fP1?%6llMLK$soyo7bWBf1Zbop(g58a}@ zjNHf&LHC0;Cp-!8Y^Un>3CO*=$%Famq_5T?Gd4#H;Tt+kC!F-o->4zz>oH~FVAjYe znhcZ&4iUvdyHEd2$*EY0CL&w+!*JqKTb9OrZI}7UD~U+4rV|W-NlTu$Bzi69YTr1` znVEsHLBx%UnO=s+NV~q6i`rxV5d#WRdTkc6eHDRepV?lum@b&H+od7E>;4;^{X$1R zbyAPsiNYx#WqI+A{0vnVJUaIIvmmy_F&qVNj~%?$E6^_%hm&-XX8Jdn0s6Yes5))u Gxc>o{396m| literal 0 HcmV?d00001 diff --git a/flutter_hbb/assets/insecure_relay.png b/flutter_hbb/assets/insecure_relay.png new file mode 100644 index 0000000000000000000000000000000000000000..878d574674ef9fd005eab6579dc10261051b1f04 GIT binary patch literal 4616 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 W8iXC&Q2XDd1JHhCfT+~44f{XEhJaZB literal 0 HcmV?d00001 diff --git a/flutter_hbb/assets/linux.png b/flutter_hbb/assets/linux.png index 19813114233fd8af32501caa0f224637353158d9..456e58675ae4cfc9db01574174e1b7afe6a60c1f 100644 GIT binary patch delta 4118 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 UuLe`dPyhe`07*qoM6N<$f|3^OhyVZp delta 3987 zcmV;E4{Y$4A(tR5iBL{Q4GJ0x0000DNk~Le00031000312m=5B0BfvRQ~&?~u~1A@ zMF0Q*kuj!`KnQ=gm~xx|00264QchC<1N!_m3I_M@64z_ZUGtfPBaK+Y(tgO38RfmW zaNC}BLn$8Ut5IZ37UGC5u%bUZ4z#9v?B7O7F#9_Dg8%>y+et)0RCwC#oY{KXFc5{u z3kI_oFqp7~onrPt(g5@R57vvemV|6%n|#4T`(LL`Y)gM<=FE%)|9KqKb7@_DpI6(h z(rF6+7}LdehCGFS>rI1y1iSQtVf-A9|Alv8?(!JP>SGDdjoHWBrR35Bvfqpy0!k(ZYn(o+>12RZPq_2Tz0cjuJ+>`g%6&_4?+# zaQi<|ruly~(Lmeb75cGZi$8K1m7n(wxF}Lshl>1WXrM^%Id;JU1$5Vj2qs$;*})TF z>c~@`zzu%PP~Zc|V}Byg+EV=Z5d}^_9YFx|6}4iv1SRO&K%0~B{IR}gLr0D|kj5HF z&#%VMBgYviGeVBoCePQAQM7XX{sBm$byF+=#vU0o zYosQZ(QA+#;r&sBO9EhOKpW`6<+9Ve*U%B@F=vHv4N_639R~WW5d!JZm>tLiJy;qr zgOrp>C&O$M?DPIzgeH)qeE$Znk#+-Y1q>i16$}^wIhv|WSj`*hM4-n;Kp`bd4A=rW zSQvC5Ed|O&AtvF*7YOML$T7r#!xzLsdWL`4ia_ow3R*+T6#<70hoq0C zlq=%{-Vfg&O6Z-VY4SzE`wejosIkQWE2eCi3wQ1n-#1}~_#LQGO(I}Rzcn8i_#1y? z@f3!*h5;M6fqnYeu27^R7uE_u4bI7oA%eqrUB(ccx*P||jZHTcHC@|xJp&`?!*51} zE8}|%c$IC=;;5sHv}k<7mGMbb2-Eg%5modgKiC3d*x@ri)6plYU?m_ePxkfHrb; zDc!oYk@`A@dUP;nTpJ==kj^rpF6mM_^y0+mbq=KL;gUy=Bb`%pnsJ@i&SLaBw=4|s zgYzVtWV35G^ckbqSqmwFw2|gfQt!H=>BX>ijgYwltBD*2nM;QHyq<}v@E}edg~hzi z3MmG|9ka6W3&m!r`_U5^TCj(T*=jOwRoeR9FDBIPta^#e2_h4SDbhdzd^ zV>-8zispZw(FmhAQPrE1K+E5Fh_p-|BIM3jHa!ZWd5B(pTQ znwUg|PAITFiRNHmLbP2|W2+jXqCCrm5eZU$;cG=cs4L{g&U#Vic4+J>Tj4DH ziK}Vk?NW~T25kQM_0E5-IrL1A4O|?d?=b;^+zJ_bE63!avWod>hk^`b&Kiq%Nao*U zo#UCc{b^3KCqLX3^61l;7j5B7#W{P6QN>6-g~=#pC>Dx~bEpiHjAU7U&dX-2KzkA7$x?p|QASZdsNb}c$xR># zK(_;tlyr>dcmOq(EN+4~gV!+=Zm^$W1cegBVwXK%Xn!WSM0R=%m;bdL*Kij3f0hYX z^qwq9KNs;Dr`<_;Yk40YkDt`0Y5rChM01f#ra0O11okY2QD6RWo5h(v^Lp+N8xmr9 z$XGpG2X~?Xdc9|VHW1eOUTf_cO|}I25uo=79Loj845?O9>eZ2#!PzVb7xiisE8-~HSl0YCK+)%DUDU^S3lw-6UtKR>?w*A)4rqHI2 z71{qM0D)ymmOh1sy+9KMPXX`~qhJT@_#-qebI>xXKRY&m51mo424?n0$phxV43R;h zg&JC*`&gFZusX1^tVmUm01V-;m@^SU!;Y!8q4XS`2S%m^Y1%gr#@JU3-9%Me%90Oe z;^C=lJPv=qkrXnfqg@L!v3Eu$`i7PT<1x^!g$_j@n0QVI!a3=A`~svw#fo~|I|KfG z#Rs%W<) z-i}yj%IY54ruSK86`ZL_l~7BTLpP<1(1DC``u2Y{>-IP|)y7g0${Nk%kTEyEw^8r4 z%2ybhdNw>t8{AKKuyPYz9ofY9+VTXbJrw25E?M$+F#~K51EyF|E{4y*A{tCZ5vOli z8lbk=gj6#4Xh{_Kmo-y#*06PQGtX2KI9XE+|HuvJCgiDcHG%|0svlF zid27*rFXz@Y8(M-Ao75M@hOE*YvU`(jM(Cp*kx(aXJ%9_mUD_33?P>stQc04d1Ocj zr*iq-HgXIGh;6I|{bRylfM<(c0OT0{o%eEArfobj7~m+P0L$Xwi}QJcjHsi{+po&m zM}lWt2K8<-&i>aaScn-5qQzV&`C78lrFG{tC z*`O8uX0WN&N{fjv1pG6tRtp=u4wzt4nuRW2d0ge%NbAh1K!bBLNG)c1}09FpD#4LbJKtU@9j08ngW3_`UK$(B2 zvOpqoKmxfIO7wlu=f?_@xz9spEY#fE z(4`$9YP$Fx2H9EQS#dtCjFhtjCGXnlbr-pLhtC2X)k%OZO6zNh9I#;Y9s$QAMC4cp z>AR`}dix^TNL%CT>z5sP#~)W%lF*4H9I1Y24x}Myf9`|Cw3QHfQNKu^)mwkrw)$^P zf^7hoI1R+i)kMW9^aAxa%oe2Q?4nHnXX46>!W+=@D$ZYuSL~BU@>@iiRu67bc2VLK z06A^pW>d5>9jU5tRUd8>yC^YmfEw{TbW?;51)?I%IB{6#+EJ7DKo3*+4Hr_f^H8Gn z?YqML0kqW9#I+6WBjAT9QBr@17Djs@WtS$XdDV7;LzJi~Z5P`DDa|x(Ng^w56DXy= zD#-oQOE?U#*Kj5i>c#<8#ijR?3JUrGKqk4M58q_(X}*;ATq(GjsQgjsA7{HMZnQ_; zTd9W1cTWQ|QhDAAhn^;fZR$$Ibet42*O3EcY{b#h=;vgRhzm> znhmip>1roWd!VADexuDbC2sbGR3cGMCzH}ZsNR!sujvC9Df=KMlHn>#AY!C^r7vCS z2h_X+hUP_PPr?A|%@jvRujA5Nf(rSQyfxC40pvUEmF3h4;tW!Pm1+a*90h013dFO9 z!j!i*WPlLmm$Wpv>92qDy5t8pW(*MPiyap<;>ZTM)Olac08Xf{@FASYotE16)`S7( z1a2tONv3Pm7r{#D(=3k!QtMkCIhOsAcpvIYDXe{^2t|fknf;i!o%E!V3p9};7+p)% zkRGU#KT44}sR2T@#lLqXG9g_(vB5lLE-*^8eS|c6_p&2<)6#$3o>Lm2ueA1YN2Hh; z`8pNVh%y~6CMH2-$=F7#?O`I>FGpwqFEIijTlkPeiJ^|>Y?aUe_~n->dz5P*XDIM~ zf+8`c+I{=_VI=vH`T&~9Nevbj8dc?(!T`x(*|~rcGvWqyw`@>xuYKj%6WcV}dFoyI zUMY2BS0PW=DBOQc__@>;KPLxOG7oCsqeZ20>pb=o-Lca}8TU-sohArHM5LCK4s^bK z^_V;kxZj|RCoE1osa8-K4e5E>A=$q9Ain(fR{u+Qq7r%0jQGS-3?s4 zqWz6gh6B*y%8EShzLB0E_zc@u^~PfoLYvgydI$jQXm5# z;cJeVt$@)`uk&mglb6xMn4LFsuoQy$!3s3mE<+o?wXz;@q|X(&D#5o^ zXt#ZMO{tbf)Dobh=hEKXUszyaDcS(_MZy+*4t3uv{G2*#Xr?&SHi!F`3w{|w=%QW` zDnMu62Az}KxZ2=gwg{6X@%{e~svENa*G1N$vS!JPd(^uuvY->$81vXNeKHALbQ|$u z0&QESR~{U^J^y2thZx;bW`?Q=P2|V)>WNt*dE!h~)_kcS%)j5_NY_!NEgsb=oLM_G tdiZYV&hsU?#gLG?CZvkp-}UN0+drvNL*&pe(m?o?RiBL{Q4GJ0x0000DNk~Le0002U0003C2m=5B0IQ8T0+AuXe**#p zA`r%3(p5tJtnkmOF|+Z)3}#L^RTLnDiD!!*PUBXI5aNc%e;nsW?`cl+kr6V zkGi)2016RFL_t(|+U%QYQ{q4nhTl0jOn`7B2*`~W3b<5e0>$S+#bjw|G8S zie-3v)Cr+F=e{tg9VYG&HjMfI?*#uFnUN<9%#aQ=oSRMyYSyJZ^ zigrmf2a7z#JVvDVauq&_uqWaxO z3rAC!hy}{+cMY+LXkb`7q(SOMQjb_5%sY*JdM!aB8p8sSqC;dykb(x*f4u|^MN=_( zSl}Wl4pLNu5G-y9Lmv5CWR)ZwxaH2+JhD~)1F>AI zJFdKM5WwJ)eP6irKMw$-GkygTfJTG!=tBY)&&-{yjux;IvhNHPf89qS8U!e2((|w~ zJPdC0X&#qGh6gmtDH=3}5D!>PNF{pIA*9a%jX~mRVWufY12A|bbvTaNF9G|K9cl+e zl%jkcvOExw+Sj0dRZe>(ygPIn?Xt8u0J9+V(Sq753nMI!T@e*qs7^T&vv_>!k-Srg z$(J5(aahA>`-=X1e_?4i8e)vK8tL3`^2nBED`#Q!XN5y0G*kEc4mg0Z28nbhVOU=^ zZgOyFbFf~NyKT%@lWR8e6`RXi=1oDpvaP!q z&#OP|68{=6_0HL5$XzyFJZOxVF+W?h)|Z+0aY8RtXx6OJO;TUG%O6ULI1iaOS*BJ>w(Niwf!y=Rrh@##Q7HLFne;Fe4bPp|Kx5z(WqR|&1qG%d{f3i*j zU05cNx`;q#&|nAzh*0(%hM8H_Jb90zB`i|W5^iNFx*LJPNVsOPfjDv*|3xVK3x=Cn zP5(Xkwa|$y{TDgr=~sh$??n_Xz%%myZkD2uZFP+s-!&XJF#JP;0s?7A;Lrk2+T1nE ze}bhZKx7ULmZ|q5L_-)jWZ!mBG#!D%2)Jk|>hOVRG`yc#ie`MTTdW0$OrY@}?6iKj zckW$j13?s@+1-#tp%s)@3&mQGh0@xW)&2gTtj!X^z{Xh$t+_e5e|S_h_%r*Qy)$8Z zCWB~z^G~*e01$}twvf>mVSAViGmsiYe^92Q5D$Fn zR`Oq}53)K~s6$|j?Ja5im}$@{qM_())^V>^pTa=e+^yWDQ`Im_sQToW()UZP8vB^tXN80`Q2w0No?(9 zNfx-l8Gs*W#@I(<06eoh`6L4(pd~~0wubTz zDbFRVkorOg!FXhvQ2PO=ybxiwG=plNj|;cJz<;59N{E?(@*%1%D)WnA0h23yvOf3 zcCG*Dq?M*ol(we)fB3?l9Ix&i$I(dQlW-DdhcKSq|Cl_Ct~%!RRov^&uiv&?`?0XK z?>dg-h$Q;PS`MY)S0B!XnsyXV?oW~ei)?{cbW|y#3$`3Wk-WL?=@q_Fk2G2-v-*5^ zah|itR#^88^CL@ZdU$0mOBn6bo&z_UJW|H7oPH5e*xGY9e+?dAhRi+ZC?yoXzJ78) zsi|DrWFNY3qcw{kBPu+;@z~94`Odw)cZ_Py`W-KYpXKV~`85As&;KO3jD==(kPOk} zO<_*p{L|$2`$(YJZDYgJ_S0)@F5LRi6K=<$QkrOS^LcAdh|Vv1*^6rLYti!hHnq7P zVcOSs?$v)Qca^n@`DHsw++-1r->(bQco9nZcmg*$sJ<^TA2 z*&PfP%e(wrfA_{4{`mc(JLo=)h$M{Tv*c0|h0L;bIr_iSDnrl}yniBL{Q4GJ0x0000DNk~Le0004i000622m=5B0K7p<$dMtzfA|9K z7zyFV@}n`#6ZN!k<-sc<+;(0K1lQ4$fmP|4OS-E&CI&@^r;UASP@J!1KsOu@TY7EH z-&4K-01hWfL_t(|+U(tFa^f%$1>m+Zm@Q@xJ26Yb7RW$C^6r1Ksnqae7MQ`3EICu} zI{`>#sny+N9bEPyl(zn4=HZ&UP`cjgA^zfCC{3+6 z!e6}$rKeT)@DE#|GZ(`TjD^zCUIX9+xN^7hamGEszJ5KxuNa2fv>4(df1ZS`xQlTe zb3v)=21w!{WK#YG$+UzFIt555FJw$_jimgXkSUc866*+=QumSEOvsEv87g8SBich; z#d1LU4iC5)nOvi=9)z^zM)-k2kQ4ni)UAXx<;u`771Gn6LxcAwq^17? z9aSMcduSO6X;}f_7LZgHf8zfiqJofyod-QHLK-R&E@DT79r+NNJSKuP6o$~%6jE0P zxB?}Vr2q&(#AC3!qYrImAyxSXe!^mybv5V<*%74d1HWK7-m+E%ebJqeny2##fQe8? zwlKhZ6jJl(;}i36j^v6k;V7i$1AG8n$_FsO<2_kAMPOzj+^KjBe}SAT;x~LLz^WZg zD6tZzC^v)&&q8XtFrmscsG@!c26#M!xqSfkLW%}3;DKpq^C1v#N3o*G1<0u*3{AETAB|h^HP8)(A*aPY`2pX^eY)aolay4EC ztF$*Wux5aZ@Y~ZS(x*m6r zU;5GNw}W5_-GQ0IK}vc=-h;p>^N%e--}QdnG3+t8AM-G?nJvENoxb z2iqDw~j@qjROz>YO1=FJ+ z!92e<$xzbc=`@2m(Rx=f^}}}S64KJxW@J0aj~`%IsXToWZHrNWRQc-++&0nL`$$6& zFGR=Vf4Bn+ic@jwSVMZkaZA+PeH39!btleLYDihNo>$m*Yd&lm-ZlkaaQHuYvu;lk zIP3#h*Q|(jcOws$__b~!Qw#qE^R`%3crQVLR#=p!h5t{H)ehiY2KY62`Sde=T;Evz?f6m^$E+-KLQ2;)$unCtH0Rt@25F(ID z5G5fo{r*p8S?UihOEcX~dbG~>2v9K7*V(Q%zouUsl8KXR9Nn9dM0+)QyI-xVqCH-2 z2Mfu{?FPp+?Fjuze~lx0xDon`&LfWIdMNaFmo<)KlFeb4xlx59n7tQzrn52Jt>;3| zf7V&T*^;-PB#kLt?fLf~x|;f(P~dXFlE-i8H&9*)1%3mw_~g$&>oe>gPK5$b;;JuX zu!qgVxsXL;35$~d|5lwI^fm(_tCKdg3f})c^h+pR3VG;4XCma|2^vf0-@G*Mk#5ZV zv!AmEq-viC`ME)&ngM{XeeyaU@-#Rgf5}qF(eMIk4lN-+moucPnSpjRU$Fulsaqmd zFNa?H|HNX4WE++M+*}=y?pDZ0^EDJ!OaVC=uAor!56DUXz#Md>ZV8P8bD%C76X>uA z>7sRqAD9CQFzi96;1Gs~vo(}H2-)@9P%1eD>ELPxt*wyR=?q#Gs{oFlKa)Vuf05Pa zUoi$VJFhs17inHWZ^jeAsHt8&X$+HA8#dQM7E>5?g$zb8Dwzhdc(sPnqmaP_R@?|- zF|T1%u^rc92dll1-Uw!&g!JxVe^tH`av6bVKj_PAtYP+1DDnqTupcq>1VB&7=L*EV zSTAo0FbobfFJM-)AyMxMcK1SB%?jVJAuh%zIN;j=dOO$^JOb1f8`zD7wBEwOR7mR% z4&DkWb!s@^b~v^7a8R%opf&~1;7E-&&)`sf{1!J9zm!`5tj7nsfCsLpe^EQYLCv`g ztsy+Dg(9N>?1Ypi0PDe#uE9)Ds5iWYhH4h@z^7`p&f$VhaiQg4)SS$SeJ%ctkkTF= zRzgZUc(@Q!S^)ru!_wpz1~3p-o3R`ds)?WQ$?}(W0v9(zI&%P=%}A7CCW2jAT79r0 z9O@J<&V+PEaKTM+T35_Qe{1BkCGk7%>y9l4fUDwyzX0~8$94sQ1+m~?fKco$h@GKY zr#u7FWta=%El6v@I3QM|U@9V3#bjKpG1JjX8SN_L(^Uqq*&MBs*QOMVgp>v>%4_7- z7Qv@u)EYC6i0Ne2ox2s%dV+%|A+0U|@b#obx#dIobc5v-=7^F)e`d)DE-VXP*i;Fr zowFtxtj&UeN>)3|n2j^|$YfBgMa?luos4!ieGt;SWGEb~wc#Uf$ubLu8Hq(_MEQb@ zMW!0vb7Wsk10))8o!8g`7eGRs?LCZP;u$r)Tqy3F%m^lHG|~d9+F23YiQ` zZmvv|*-wD!IIG2sf6w?N%jqJ-Y>?F#_U=U~Z6FE*@E<}#5EG$^0v1H>a6Q&?6I@f1!= zzH61WK{~9N5|9;4IkrjGb(i}LWj!ISrXtbJROHa996V6ALEhGlsXVwx*5 zq1r|~UDjtAe=_ztI7L=%h&VQiOu5qN+1iXo*_lG*6LHAx>*6GReakGX|xNe`>Q(T0o*{>ppYC2K88{E31L? zBK9j8;~|c*B177o;3R6`;uk)~WUK&IDGEru^vY&--iT+!^`^*x2I8`r88cwSwGOg2 zh_A~Hd)nRFoT)BqjU;BA;iTEXMIzr7X?2HWTqb6;s_r>TQB)t`Pe4%MbGeMDB|h*i zAfmFve<7?;$;%@?VNf(@))b#HFOaWi{D-Nr991HKs~rUO0C2sGoM6Xo!=j#W7;A*` zQTLHS#Ma@gR>4{Cr+oE;6#YbUuqVGMgw$?b^mKyo$=$;sdXu zBF6Z@tEh;|6k2pR+ulqflGV~?4fgnqQPF&@f1%Bk=WufOUFg$Sl++v=&DgS`X)+eG zlR2sH5EnOWd?@M({ENdSGg^Z{tQ9rNYCt=iRYLJCVL-^oKwPa3V&T?dLmps+&BfdC z+`y122kXXBkB|vxOK0?gzwl2ecOw`Sai-!q)g4Y@nb08@a0B}7M$swXZ~$XMxfwV( ze})O-JPdIJ1JkF-x8o(zVF&jywLS9CU{vlfYl5TrAkM)%j^ka_ypfH(_&f%Z-#~c` zm}Sjz9zzlb6r~yLe_Z)iq!7fvT=tIr?S7BE?btQ&M-U=^uRMq~#-KUVEQ=Kk;Kr-i z#t_owi})wcg_I7jLQ2&f$Z-TT@+3pn#-#%1C@(bh@x^lWmLuMf33F; zj`Fwb$7@TORmnP3(1`t#X* zp!6C%4rfRqy7QE7wF!#P87X~Q%ZZKDc1=&|wAkY!G%HGrU_9(1qiMgUG^xMfQoMdu znN@BcTM>kKf}$Po>s+n&JS#zas0|$EC5` z={|8~F}GoYJzrE*I->?I(X3fjNnJO6n6qz>RC4$7r6+0m%X*?ux|+hYuz#x(@iv9Z zeEn$0-c}F`rPiG2g7y(CJcm5v@9MNSmkiAho5t36$$}&%JM@v5-maj7X!d z^5c719i9F(SsHofop-KAQu{BOywIf(v6QhN1-i(We=**sbv8@(J6}BGstyDB_y7O^ q000000000000000004k~7CitzU8)Cgga@<$0000%yt$Z zBs!I!L58`p74Z!9BCi?6T-S}dc9!Tx;{T3B-RNt&Kg<8IC_}wS;{SEdrvKi$hB-?j z{$BY{=ZyJZ1>Lhz#7`;Rd-^{W&NzS5aB+sXcq2@#0VY}>pJ1dqb$IpcAh}=*Q%k@x zTlza_pASE{=U{Z`Vr+3Bv(7|es~mo%jl8zlT$t<@u9bI=hLcPYGOh;zz^@GnSgWw{ z)rpCqIpuR4E`9F-+>CfUV%B)##lpg|n1A1SN9XECkSpc|Tg>fWHU;`jZ7M)0Yd#mg<%0i0TQ#eV{B80BJwnARudmkk`IzLbisqcS6THai6L?zn`61t}< zw$dyv$Yl1aKI2Ud`qE!V4zav-FHsS1D!$y{^r~oB!aK7$;x!d*tNLcfOUw8;lKP|j z!vHth=*5Y;rh z6DV%UZ*i|g7lkI-=%!#bp<+wg;JE|eCrdZb-yW`qaNTe9^_sT7lhs7fz?*i`gtA?4 zp0eUHBKCKUklC9Eles@s?TZ2$yu10Nmt3^{3%M8G1dnHLeyv`9&6h1lDhX)(DvWnn z^4QcBHXDDma${)8EBiRC54rd>9Zn2v2HQ)vIt7c)fXe*EE8b8wO0-MbY$LQ{MR~{Y zvY9Fj>ObvSdq;ap^*84!rz54Nz74cgsy_X+i$F_Fe@txw`fSIC@d>Y=CJ@oDjM#_|%aQ46JW9}h^T$qk zvY7_%(wF{|=TSbd1lTtrycG|&+fLPT-`rF zict$rMJuNg>V9li#rZmOO0A1MzU4_>fv-;`qKP`?@#Zy7K8>qHs@}+Cn$0){$}w~7t`x*0 zhbxlhsRP&My*i!W`9wEWBFd~vetyT+aWJs@&bNjO1eI4$hU;t0MjCE6&jDP0Bm?by zK%jBK+qkEidg@(wWhfrGsFB&nja>S)C(B1O{a(@(t9wLHbfksb=O<(_c663hkAs!4 zWHsHAma*JC7v7|j5B}huY#gL26KMj%-^KMRVho>>#YBsgFX9%Dy!l$1x0mB27H-ex z?Tk?xq-bT83Q^_DBCh3%2KrCGAwK11NuTDiEg5XX*%^A5vg#^qQ=%dRKEm+36k(p7 zUydW7Gkb2mL2%5W#!vvX>#khvhT47Gl#^x}6FuIOMi#pXiv&G!*eK<4=KRxWdnGP98;OKn z)=4ReOCAi994fqf8OT|sP&`vnr7X?E?1vFS?Ym!~Ya(!2o38UZ$@6lT<3zVG!Z1fr z!chm*?&0mp+loW>WX1*SEe;3DoK*7xB4;we?!Qb>I_gAa!6~9w+*pX!Oft2Bs zt1Ny&HaOKQ-*c$!GmRV8auS8Go~Y-LnSxqRBPgTTiLd6BS?T2Ln0umCu6C*AdVs)c zneJ4U(aX3*?U6yMv4tV$WVhYGQQoLTw zHO!^=B`s~2q2=tB9_vtne@+{Fa-!0F5F>T3=tDHQ^qXK0WWV9JG#Hfm=W1~4cRv-~ zP)p_m_NZYpcEh^Ph80|eMrpP+nd{c##Sh0C_&8VV2fF6^=auUaSgJq&&fuJdXaWy| zt_f5n-SH?vsw=?FHMmF?l7zH+OlZTywPqeNX7L4 zvV^?UVuLS%vNbwPgZgzPh*+$#G%k-VxbzjBi~!MP{hhR_cABZ?$%2P<6}xBaN~+Z7 z3j8hJj;YaAmy~dqls0!a;ed@b-9Lz|H3BB;wja1y)YNfb)#hE^C^nkk`4lnA8z=QW zE3Sqv+Ak8kfw3#&hx97_A`%ktM4OiMp!*};=Tj%G)Q3|xWNN7`9AsI^kHU2Fth!A? z;<9V{m7vUu%gvR)FPIagft`FwD7d!hH#n38uPB{&tZ}f-yaJy_!VDN%o+x>?0hjoo z;5^7Yk(NJY;uNk;d2>|aU*jQKMLfmi9tya0OXgee1Zwk7v$`cBcb8P0B$36c)%;ME z)xCVfo7RyAsV{#lD#cU@-I4AKJ~9ysyS|?@+s^cqyD}|XOL6GvQ@LbQ`>b{o{l!OB zQ77OTMm8xeQby1}=is*+di-2~n_~sxUV{E`-$pq5-edlb7Ui!Q*=tsXq<0^`4}S(g zDIqJ)W+k`N_xM6zDh2%&siD|Feq?WXYWQ}R;k~V1r6bhN(!>n`$=^u5aP|fP42hM*BvFg==Cb2ljyyh!C-U=A-W(4M(<=s^fnkJdhgMr6GTZ6UG(Uk(V|An zn|r_ay+6M5>~qfEYp=Eb?B_W@PL!^;Dlq{)0RR9XhN>w)`*RQcz45UAoEhQfl>h+7 zM_o;Q$e&Uk4pInG`ELaNFY#CX7nJ{}D+h=Cizo!D$OrvX!c{;)fAasTz`p-q^?xmJ z;6LR5najifq5W<0xA0&2KmLC+fB*h{|L~v~0tLNQRfcOQhN`O~v_J?o@LM$%gr-uM zy3$)HI9Lq?S5*tvR)Rx!kN0E)lmIS|&#y1Iy+kDZ6aX-M6}TqAg=P!Ay}G+Lx-bTC zAqT*)$UNAoJU9Wa3;;K}+xxrIi__`Vnck^>fD_=y*3!h%R9;H~vN92t=6-OBF6*o) zYA-R4wUG7)i~7nkdGOA!FAUBMb&Y=xE)3O|gYGGfQqqF18#+>kyD8HN_^)Nkw0BHdq zDMlaOUw1ba2{u6m!S>0{;%`Bsf$|t0Ol-b_o>_iLwW(2Mu>c2vkdM@0Pq@{eu?cxT z(|!)Xez?26lN=^pzdHW9O+UB4G$B&WL-W}Tgm>oL5zk-vj3Ua@ke#TZ^!;n*EQFtW z;F=X106?}4RR-((E}&B#K1_iq!|g^j+kS8^eHX7XaWtuHSLH-bl|VnKLritStu`P=}r{tKOF|iS~Yi)oD>I3P?zJbdJ8$G6zXpv`Es4hrIOmAPiqq6+X<#moxVNl#smB)s2Yo_i$*p% z6yhDEnMUuz;$3*84NDqXSr70mcmfxZz7@Jb=)pE*@N=s?M`xDP=lDN8Cl%egc`&M# z7fR}$<%3g8ctSC*aS<%aZFGe%JdtfxVt^A8E1>MuG96(GP_fu-oSw)IkVYDYmEu-) z(09FD?hM%z>ZZf!P3m_pzj&U1?noCau!0L8Ztd0dP%3eAdHXd-8N?&ZYG7^{%F4UikrA(n>?V z_c*Ni(pgl))USt_fmX1a13*NJYq9eEd4~<`$LyO$T*tq}w?x3=^rQ~W?YjI_>hn%B zLtElCuG_woUd7@7OBLNdcdKDbK$&tvj|Z*AeAc&@(m9V`@}rSP1XC9&JLP~CpU%c% z;xDddR=jE$k-OKOHKNjm#~Gp8l=Dv{t%(!`RX~xC2m5F65-TjzNYlzxBGZ0DQXf-n z!xN3jI22Kw!s(tU-nu8uossV_>eV%w@b}L$8-<99*Jw8h1D<_2MN2n8iOe9 zLn9?<62ZS~MT});;g>fz*&>Ggx$<6bye=lT7T=G`23=f!x!rKg#pSxyE|c|lJJs#( zjW67r#qLlHDj1-7b<|htz>UO`d`BOjR#q0ZPDQ~&Z~b!-eOA?24_o@IJx6T)XT`>0 z{N?^F$nPN6sm`T?=Vko#xQivF(Q44;f#XU5AJLB+5>jd_orX(?c60Z>%2c>@Hgk5) zKw#uB26bfE*)-owk`a9(i!Nc%cN&sT|bNpbZh%c=yTbCdbK|4;Vr^l*t+;(Kk}M&vs%yA!!hte7#Ay=@smibJEI)5jAMnC0^;Wa=WyR60A;$O5X}Z}#HGtX{|%iQZBe zx=mfdC$iTVTOE0*_TKA~pPR1^1A0Df{-y;2#yV^H?%cI}?Ju^=$Dn7v)*8&Cec_ z3;7i$*M~HDl9+cbQvWQf!HVpTCN?D802(dFqpgs(3y(Ptmmor2N0P-xIsx!JMVTo2 zA|3pm-EiQ}EXQPW(pMuM3O-hCT^`mRrqiHN@PQh4on{KI*52!zoQ4R~DdIKpC)Rw( zz9u6^#XJ^XoR!SB4=GN(x@d-mG}RNWn`B3-RKD1`zdbmNKz>mE2~%HlE>#j5cGniaohVo=CP*Ra#mjIjNOEIcbEMs@E?&rxPzK^Rhmq{fV6A1R=(RqY zRH|KXQc?vkt^0qQaBNd~>Ml=;1JNi&7E5vAGKMdnI-?xs(xnFdK-yvOm=<)Wd7@-dP96bB|UEF@T>PeN3%NPlLC z>+F6r|Mb}M+Dy3Cp-NfSXk~#%MK#N41kCj!+%EDiLho5Zm|6IvPiui-x=CIQalMrs zIw)0kI5cR*~UY}m@keg4h=VQy&At!@x7-?kP*?D z$vTrJROC3ChuY926Xp}p33~6vo$)2T(+m*uqy<|NaSs$X1;SUiGp9U_~6pDmXbxhA8=^Z+vx5%=U&e8Q>E&WBx}{Cwm7e~RL9#y zVs4f{30?V?Aoqb%%yz6Gp_CxueFZ7{n^_(Ixpf+r$dvW-n^_5;=@-l`1Hw`z_J;3 zm>{~^BAi__+%)j2;NTtRrjM81!?Y-A-)S4Ps0>f>(Pk7u8D3;(0pVC|an!)E=12o6sq_2-X0VMgr{y zpDW|@8#NxAeF1`Gq1femQ9v-a_htkHWI|l0b1urRj&ho%kAIp_g`@z#8H_1Gb=t-o z$42{hSngjX>O-LHOBQI^o~GB>D&Um(GK88YySmfx5SkES`kYIup7m!fRcy5}otsmlRV<(|`3v~v0%}u$ZRXkCzUW6QLV-7l6?}g<4?>Pr zX>U!e42w<{pic(yQ`m5!Lq~~`LNVR|ef7$z=9PC7FN-H?#B}VmLGWqg`}^zg3B2K`8Jp0uv*boT zDIu84zOXPpB4YHGq3oS0AmYU{>VZZB@vuUKQYZs^G6%~^`B&DL%y>#TlS(%m3AH8EMU(qM*Crb!}_%Ei%X5%}V_buzV3&br~T zBDKjK^GuuVvxW$EhNX{L0tDcL>vV|l1NS;(6r$E{0z6cerIsLkyPAZSlv2sY`DBZ~erom9=uLhrV=)?Abaxtv zRw#V}U=LN=%v1^;77!_K4k3eZ-s-Epl_zb=>>d&QPM6G}g2xn)eE{?<@|F{KJ05E~ zucN8KX)A(3Ru~J+64^q&>CABbw*O|KGlV3Aa%QTW+}VC zh}yc$V|T_<1DmDVLM+glo&Iw^B-UvbubKBoi6#@KA(OV+x5~X{gz#mv)29d-CU~YX zk_%-v1v2betDUUs-F^0|_4hG8_@0;eC$ zL8m{z?3Xs*W0izAQI~X(i?0sZ*!1G=04^o*5jkM_D5dl zqp`7>^yz!q4MF(UcWovtDvpL6R{*T>eyCCcS0yP%J~JKri?oy>gv>R4D<_|cIBrXAQ79DYNgk?6`j z^+jn^a(j##oB8pkFlQbA#rHxVX_*a+REj~HSGHveP4#%~RO#dWI&(-EhbuaW@tt-d zcRuV_v*LF1AvVq|1EGvz-RB!9W?jqMc-m_eSvV%?>LTN%^5i?;0bNY#7^%w=fCf3! zqrg^Fmk}k94POeMG*C`8bJptJ>|c11)#Ldx ziEZCO_$@$ZS)sF-{2li%4A#W(<15VkII12Zo0t0w*)HS_)$WSTQ72^$)E=9uMNO++ z?6;8{%~}K<(G*NnmX9UWWTSn}Ke%$p3l0V&I9qb)FiIaiZs`j?gNk7CCjk%{pL}J` zQ7o;-goG%!!JUFyttV2w{h&4C{7Kt@)j<~)_rr26CMqURMywi`q5TnMFTj3!i^A61EiAXHTzF$CZ)rr*llzn-lt4&Q-Ep`p zfrep5<4Ef(sft^4Fj9cV~PmqD#O}4ejTm;TmG|JW^rZp9H^o@*!exV zz76GU_OcG8L-Ngx2t-Y^H;iIIS^xXEao4fnB(Lh&BXwmxQv#G2q&t}x0?;-#cqODx5X!-6x#crvA literal 0 HcmV?d00001 diff --git a/flutter_hbb/assets/win.png b/flutter_hbb/assets/win.png index 155f4e75d81098bf8925bfa3fa073e3dcf8e343f..5ce86a25755115dcee601fb7bb683b9e06712945 100644 GIT binary patch literal 1379 zcmeAS@N?(olHy`uVBq!ia0vp^CxG}V2Q!dV+~VN^q~-+pgt!9f|AQ4wR=AJ?bf0la zkY6yvpNGuc_k_en-m(5*;&}D-+EZQi%2*}SMJDcYpQdiTnyrOL90gx9(F zr#rOsH~qSr$H2hi?CIhdQgQ3;-E9Bc1|n<;(&kGo`YtaM_qv^H!1gqZ?aBZD+izw* z_RgQRWtDa3z3^EkzgXpN+8uw+JVTMANdbsXJoK2E8nlVc-8Ak%%aouEzE=Lp2P|00aXjtaYmT^*>HS;{Io?T z7MvoAr`jqTZQ06%TeoUF^>g4|)FO~*Kl$#%AJ1-mHFp2NlqI0*>vDs)>-*E>8|Syx zS1l5lu3tSty?Z8~Un6@!OUTkGJ5R)I+{9j4Z?3>u`1g$K#&asK*a{UFu?re;?{fT} zX?phB{LQD6?=}dya7vamUr*Y)Gl-|k)Ma`*tBQgb%hnaqH*O}pGr!o{yraMG$sd7G zRhtv#Wo9#8+Pq6obrMBHW}6-D?M?1ZXg(sIt@iq+ z!mjDpm?jCR8aoR-R9ltS9ChGuotx02ZMz$9x?Ic=;LLDZa;7QI;E%!V6Fnzh-h0_* zlA>&I_rb5+E8p*1-*e+_xRJbJ2JfT12l=jN8$U1~_I<2iec88IF_eLkMZf_PNiQxzomNv2)Bi zh{!_gx{QT?b|BO3}+f?^G&d_D0& z_}a{#Nvn4(uHp~%*kP0Cs1X)=^qRFf%cBX*KdW}l*8`>}J=>1Y&m69Vxxcj$e?0s6 z_MOiHnHTXFKK1Qb!Ccy&T-{n69_0RLi=thj|Jk;0T+g|h=D)P4^tjP9<$KKz90}cCvFvnJ>)gg?Rq4x=`8t31`=@85E!eTR=-L_$ z#gqpt(-yc)z8`h`T)>US9QRb-zNqjw*Ic%pX$EC}4k!J3hNbgt3_o?ec?c|x7(8A5 KT-G@yGywp&Jg<8I literal 1797 zcmeAS@N?(olHy`uVBq!ia0y~yU_8LUz{J483=~oN?UMnd&IkB}xB}__!w9VCnCA}k zl1oXDUoZm;D;qlpm!OoioRX%tuCa}si*G<^SWH}eVrp7`ad~w^Q%lFhnTwV#U$tiQ z?jt8oojHH??z7i#-+%b{>GPMb-+ur3`)|stV~2s}F(!GtySV(^GUFfv1M3t|7srr_ zTW{|i^pkNHX}idj_9{%&_JOO}L?wM?*UJCyC%G$xRVV6JHYPXArXFN@XfR2&=i{AM zpLK6mtVn*wUiy8ClIJ894792A5yvF4wS66I26y}KbX?5pd8cj=nXc=$x^UxHv00za z8tM7vCiv|Xuj@P+CjCAAT>iq7>3j*FW-`yHdB&hN-?9P7eGs@M_w7Vuc7va17=7%D z877~XIgmbY=iQse|7J7v*FR&ZbKbdci&SmR{&0p5KY;3k&&A}PE(WSnpR@CHvb90O zarh!0-ijJU~`ows9)`83O>YrWX+_ARs-t!qdr!t;1FJ8^q zBVXn6J~cE~?N{6_eeFNpFSeZUe_$LQE&Kj|%5?q@_l#}UGo&%ysaHCzx;~}hxBcPs z(koILW&=HZKbJ$5x#rK}RSf+O>v~x|jU0@pixvnQMrC);Jk6HzY!j2)>czbV#Wxwg z8*guU?8mmFQ)2Jg`oL1V15;x|=5iQB#a3-8W}nS-;Y=#)og-H7WM}b%n0xlRUOTgt zdCotvo0*K)i@M*`G^FWiKiJ~mbcWC3FmwNFmN_pPk6&f{cO&~qYqJOUkJZK=b5B2F zU=3hk~!~s+ZF#)6!LlDDQn%i|Z z|FhNe*Zb@~Z1rDX>4lO6zlhHLGv{;Z{=bhOUO(oq&2neYnV-AjWf|`5i&0!)y&2>* zLY_c)7sF>%4=~E?vf5|1|EpBtLxoFB|KhwfZ{M2MabvFKgp!7(Q-bpH*2PT^Iv3Rw zmK;9U+vq^;{B`T@O$qYavhT`^!yi?c|E%Yizjx2-nxNox^*&9>2Xm8m%AT-z&t|0f zVBhT7tId~Axtym^%=GT}^E`#umln^p-ks9${a(a>qY0gi_VOoukGweR@QnG+_m7YN zHpU$4RAV-oP|P58!jpmbiA)1q5#ND!X3JY0M^~yd|G6*yx=ukq#`_%Gj{=40?9*&c zMhBXiEAK_9FxwbRxY*WshAl%uoe{|1`kp7n%z@dG{lUV`4!Eh7K` diff --git a/flutter_hbb/lib/common.dart b/flutter_hbb/lib/common.dart index 3751a8d68..c84260b1e 100644 --- a/flutter_hbb/lib/common.dart +++ b/flutter_hbb/lib/common.dart @@ -64,12 +64,13 @@ Future showAlertDialog(BuildContext context, BuildAlertDailog build, return res; } -void msgbox(String type, String title, String text, BuildContext context, - [bool hasCancel]) { +Future msgbox( + String type, String title, String text, BuildContext context, + [bool hasCancel]) async { if (hasCancel == null) { hasCancel = type != 'error'; } - showAlertDialog( + return await showAlertDialog( context, (_) => Tuple3(Text(title), Text(text), [ hasCancel diff --git a/flutter_hbb/lib/home_page.dart b/flutter_hbb/lib/home_page.dart index 1de6ee6af..bba97dc5c 100644 --- a/flutter_hbb/lib/home_page.dart +++ b/flutter_hbb/lib/home_page.dart @@ -168,7 +168,7 @@ class _HomePageState extends State { if (platform == 'mac os') platform = 'mac'; else if (platform != 'linux') platform = 'win'; - return Image.asset('assets/$platform.png', width: 36, height: 36); + return Image.asset('assets/$platform.png', width: 24, height: 24); } Widget getPeers() { diff --git a/flutter_hbb/lib/model.dart b/flutter_hbb/lib/model.dart index 3bea25c8c..65ecd32b2 100644 --- a/flutter_hbb/lib/model.dart +++ b/flutter_hbb/lib/model.dart @@ -33,9 +33,13 @@ class FfiModel with ChangeNotifier { bool _waitForImage; bool _initialized = false; final _permissions = Map(); + bool _secure; + bool _direct; get permissions => _permissions; get initialized => _initialized; + get secure => _secure; + get direct => _direct; get pi => _pi; FfiModel() { @@ -61,9 +65,32 @@ class FfiModel with ChangeNotifier { _pi = PeerInfo(); _display = Display(); _waitForImage = false; + _secure = null; + _direct = null; clearPermissions(); } + void setConnectionType(bool secure, bool direct) { + _secure = secure; + _direct = direct; + } + + Image getConnectionImage() { + String icon; + if (secure == true && direct == true) { + icon = 'secure'; + } else if (secure == false && direct == true) { + icon = 'insecure'; + } else if (secure == false && direct == false) { + icon = 'insecure_relay'; + } else if (secure == true && direct == false) { + icon = 'secure_relay'; + } + return icon == null + ? null + : Image.asset('assets/$icon.png', width: 48, height: 48); + } + void clearPermissions() { _permissions.clear(); } @@ -71,7 +98,10 @@ class FfiModel with ChangeNotifier { void update( String id, BuildContext context, - void Function(Map evt, String id, BuildContext context) + void Function( + Map evt, + String id, + ) handleMsgbox) { var pos; for (;;) { @@ -79,9 +109,12 @@ class FfiModel with ChangeNotifier { if (evt == null) break; var name = evt['name']; if (name == 'msgbox') { - handleMsgbox(evt, id, context); + handleMsgbox(evt, id); } else if (name == 'peer_info') { handlePeerInfo(evt, context); + } else if (name == 'connection_ready') { + FFI.ffiModel.setConnectionType( + evt['secure'] == 'true', evt['direct'] == 'true'); } else if (name == 'switch_display') { handleSwitchDisplay(evt); } else if (name == 'cursor_data') { diff --git a/flutter_hbb/lib/remote_page.dart b/flutter_hbb/lib/remote_page.dart index e91ac3bfe..163db41ba 100644 --- a/flutter_hbb/lib/remote_page.dart +++ b/flutter_hbb/lib/remote_page.dart @@ -86,7 +86,7 @@ class _RemotePageState extends State { FFI.ffiModel.update(widget.id, context, handleMsgbox); } - void handleMsgbox(Map evt, String id, BuildContext context) { + void handleMsgbox(Map evt, String id) { var type = evt['type']; var title = evt['title']; var text = evt['text']; @@ -95,25 +95,29 @@ class _RemotePageState extends State { } else if (type == 'input-password') { enterPasswordDialog(id, context); } else { - msgbox(type, title, text, context); - final hasRetry = type == "error" && - title == "Connection Error" && - text.toLowerCase().indexOf("offline") < 0 && - text.toLowerCase().indexOf("exist") < 0 && - text.toLowerCase().indexOf("handshake") < 0 && - text.toLowerCase().indexOf("failed") < 0 && - text.toLowerCase().indexOf("resolve") < 0 && - text.toLowerCase().indexOf("manually") < 0; - if (hasRetry) { - _timer?.cancel(); - _timer = Timer(Duration(seconds: _reconnects), () { - FFI.reconnect(); - showLoading('Connecting...', context); - }); - _reconnects *= 2; - } else { - _reconnects = 1; - } + showMsgBox(type, title, text); + } + } + + Future showMsgBox(String type, String title, String text) async { + await msgbox(type, title, text, context); + final hasRetry = type == "error" && + title == "Connection Error" && + text.toLowerCase().indexOf("offline") < 0 && + text.toLowerCase().indexOf("exist") < 0 && + text.toLowerCase().indexOf("handshake") < 0 && + text.toLowerCase().indexOf("failed") < 0 && + text.toLowerCase().indexOf("resolve") < 0 && + text.toLowerCase().indexOf("manually") < 0; + if (hasRetry) { + _timer?.cancel(); + _timer = Timer(Duration(seconds: _reconnects), () { + FFI.reconnect(); + showLoading('Connecting...', context); + }); + _reconnects *= 2; + } else { + _reconnects = 1; } } @@ -330,7 +334,7 @@ class _RemotePageState extends State { minWidth: 0, //wraps child's width height: 0, child: FlatButton( - splashColor: Colors.black, + splashColor: MyTheme.accent, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0), ), @@ -620,6 +624,9 @@ void showOptions(BuildContext context) { if (quality == '') quality = 'balanced'; var displays = []; final pi = FFI.ffiModel.pi; + final image = FFI.ffiModel.getConnectionImage(); + if (image != null) + displays.add(Padding(padding: const EdgeInsets.only(top: 8), child: image)); if (pi.displays.length > 1) { final cur = pi.currentDisplay; final children = []; @@ -647,6 +654,8 @@ void showOptions(BuildContext context) { spacing: 8, children: children, ))); + } + if (displays.isNotEmpty) { displays.add(Divider(color: MyTheme.border)); } showAlertDialog(context, (setState) {