From 617a09c05dd036bbea2daa4ba879fdf4ba25d3e1 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Sun, 16 Feb 2020 09:56:17 +0100 Subject: [PATCH] Nicer Settings UX --- assets/kofi.png | Bin 0 -> 18866 bytes lib/components/dialogs/simple_dialogs.dart | 48 +++++++++++ lib/i18n/i18n.dart | 4 + lib/views/settings.dart | 94 +++++++++++---------- 4 files changed, 101 insertions(+), 45 deletions(-) create mode 100644 assets/kofi.png diff --git a/assets/kofi.png b/assets/kofi.png new file mode 100644 index 0000000000000000000000000000000000000000..5faaa295e6075db279efadd36483c50782ac8e23 GIT binary patch literal 18866 zcmb5WV_;>$(y$xbb|%ThoY=N)+qN|m+qNf|Boo{A#M&_?w(riI^WOLS?!WshYp>Pa z)m`1ISJhM1iBOc6K!n4C0|5a+l#&!x1_1%n2VQ5uK!JdOMyNut0e?VP2+0Y7fc%Ps ze>H*x0TBd|5*1SQ1U=J(4n!Bj_8$e6aG0yQEtEuugb)5wcuS)m2~+MWx^EfQXH*md zSrHrMa~2slj?qY<93Ge4qQ0IiN4r;1`N-GT95MK(n5p_;tbXZ)buc(P_;$JGa#jD1f$jR-&Tr zm8%xQgd2?1W#sij(=I-#ahvpnhC3|5ryWFuaK#whvsS6--N9{}cV1_sl|I0W!__L) z6ki{tb!}?cfzqE>gYFvmD&N7s7br9bP8*z7hr(x&#=aIJ?A0i@wPfmFMt10*u4~h4 zB)0Znw<8dAK%UXTo*{^7EPy`eg=!#!dJb< zcS_H@tJ2G%SIkUD&|(V3!vbH?@nWh@gSz%TrT4?yyP#-XW6^BDd?lDTY&ps`zJr^A zoag;4^g^>;vN)1UyPjb6+0n6!Gt-QMI57pz^)5WO*L&fPo#rmP=G%=ss@d~TgKD&& zYfU0COD|%fP)u;iSzU%`3IV-n#{(+8e-V07z{k~UARz5Co5i*Pxa`)Whb z&H|~K-=*Na@R4cfghy2hqLY0rMv2cU-}+%5yJ$_)U^6aW`~E9tLHC+ z9o!GTK#VQ<6*D2zzFNWO7M~-e3j~tXmKHTbRt|=sl(~tjji>i9CAoqC}50L(B9_*r>g>R*Aq4x`T2o zhYP&Ew8!gTFT||b)#sK$0~+785B@>``E(_H09Al9?&?By$#p~rRp5G|yp}PGP}~7B zO#lYvE3N;!xPD594vv^q77?C@G&7fqT4IoibY5(xVy6MR)lNZ2)A_Rw`dY1>$zZ@* zwHO5v+mV1^pKySkLx zW-L#_;Cu?|%A5?DytvkQYr@z)6l zl;c#1Gny)D{!0%$CLZVVE-TpPix@Rm_;*uEmJa7L?#7tBy<*8!OaM$eJ5#^&!zuU- z&O;NC|DL&PpJX5$Cdg`IJ8tR@T06l?gXs@Q5d#qJU13CxP#MUTn*+wyhQXB(KXo^QeX+aL3S+y7$m@t8wnl{8_~q^7rd`A86RylXlS!f zWC}Zu6*^dr{BNk3KqKisv3fCTON9+yJ?~Uza8eQKkbwZof z7M)iuIZ$06xgPE~gsAL&5$ZbGq19KN(g#OhXECR2e;+WZc8Fa(5r!o?wrWOEMvGC| z5>zN5s3tF+@ISWWI-#^lfx6u9u-UpLnXQ52cMh4ce|J8|b~#vTkn$RRLbLOops4H^ zhmO|&1N)@wLmX_PuPr9S$Qx;mE+z@6mgkAVfP$^$IFj?x14o|<<48}iBx+yaI<33J z404Gyhwv<5%iOYuSU{vKs{x=YA~6UjljfJ7*0GBvcWtQFU|Fe9Uf4*4OK9>*}^( zArv)GJwnoPf>20$VrWHs>NOj5OmJ|;dq5#t4xK?nv5cZYI2cTHITt`7qA@#^>huG6 z(mNIlv?jhqbs>mDl*xs_gq9pu#+CVG+y1mdIds+9t7BydqT^r+5`E0wQAH-K#Qb`W zhIseF^hOsMTt1C_sks#J0eTxCg&3@G0B+ms;_Bd&*OZ{JJ(42Xa~ix`%GgCMa+o=D zLrtYp9LT`BLOafCx-EzZ#(eHoZ=r(phhMh}?$-J){s*Hfkxz^ayT8IY$0n4g+x8^0 zQu-)B%NXtOV8k!1_sweUVlv?iCMT)KUxQ5`ltXzWyv<3BSwW-|6EvF2|+i+un5dkKDQ1vj)`8l>Sm?!CP9whRcAlw}!5ryYEGf zrXB@fa$B&lVH^ar9vm1nD{yJYo)QpREiSkHC0H6~4aJy05-*yB$9-&QN-syhcA<{G zVhGqClzp*JNUi-{(xOr754K|t%a!A(vhqFa@w?7~)FXAQWGLl}{WW|yzkcYr!r_pv zmOW8-8Vk&VT-w(eV!dKI4!T4O_sCZJKXB6ST{|&js`ZBaoc;$L&ONC+7ZUiG5RW{| zhKDup`ckCbAb?WrE*wU${FgPc^aNkj2f*0f*d*3MUHFkPEE(GC!qKQa#H>xu8kIt1 z5&X}%JT7QckRL~r_Hh;cuupq!Xja$L5e=i*-4Pu}p?Br2;~4g+;zR)UC=S%x&f&4> zQT0c~8+4mO$FIXRa^KGC>6gqll-%>4IicvxTeo;>f6@!(nELe7cn(^)K6Ny%0B$Tj`fe_@MH zX;luP4zcQ!cgZ{Wm+K<1>RJSZ>rn`+_1LA|q~iG)(tXA?s#@e6i{?nIg4OACYhMCU>fi2H z(R(mIqj;rtG%wHm-{qgVGeq)1iymedgvh>sp3_KXQIJ38Bn#_o98fi)O#`Iv=zh z^^EHpIhkI2CdyzzBd@go^n#{T=*}&_E#r^Ewn+U*eZHPGmupA;deO8@@dNOqb*rFq z%3+Rs44MA4ADMXtfiKTt%3kh-j}+U@0g+^$8SqyCq5W!5+0WcBqIsLkkXMeu1Cw=4 zwbIdF^Zt#|xvrvJ>a6l|gSZ{A-km1vwHF>a2v2KHJ^1^(vo4^cH3iDvmAqiWVoB~A zZ?QwpWK~)Ilve+M+#}Oo_jzo@-&)obDQPiJ+_i6-Lzxq=L-)t+IXj^XJFIndtCrM)FD>P=hdvHR*i}$>h=((e#g9;{d&vXpHn0UvsS0?*cYxT z_#8E^cWwPTS{|~pvV)iAqpc;-5F_fLg_@J<_H+Hfl7zp1c=Ts+9AXW^#QQN+=5im* zWf4U0w7L8d4i~I9>*cqhg5PhTIvmWC#6@&}2?^{9xwh67#?f)XlDwQp0R3BX-`;aq zX=gKK9;{4E!wS&h!rWuY2E zkRk?Y|9Ugo+0~2WgZO>3Gpk4*qS8lAFHRsMzrv;SN+~f+3(B z)G)!tlR=i2Wct&pC1f$(;}*ea5MUk6FWc(&^38_ZRN{f3jiZ8cR0^--MnLW|e**)S zF#I0q?cN_5v5Nx=ED+8L(Q*^n$kDfN1c3vp1LJsT22Wvb4D79>NRNZg9a($hAU>J2 zs5T$#{u9xp8|8#f4Xnv$-$b#&{Np-EJ9i70T&B06y2a`ZFj)3Z7%`^z7DN13U=eN|rKV|V14!Yh}YYhG_1n1;cl zB{Lh|AnQH`&I#giV2?IoPFKFVIpPtq0KLxO*j#>S{Ey`l&jw>kvMnV_&(ydR;stV{ zBp(5K(I?-gfvno2xEj_|o_&+N*NGk&h~U6=r{6Jorrr^hqZIm1vo9I&AAKy;9){3~ z4qr>0YHslGpdBysy*5g_kOc#}%GVk|rn_Mj+hZB!YaeAaYK3YeTnrP1EYNq|s~&WG z$ZuJC{>rd*n8fWX=A+gjhBgc%h7;r!K z5a_Sz|FLMmT5qjJRdSWJ!B3YiIxP0iaZroWn>yXWRWDRF^dRz^nS4910XuLtRA5N~ zDr>XekvhTOz}4KFvHVZYUw3KJ8`E*9%X4Vw@FBZJFBJ5RL9U9l2g!=T_$yEk{ds79 zc*vVQ<#EH*k1+5yL8FeOX(K3a#hZ?iJRx)QaL)cJ4Wqxys;71$(H_RcgxV$i9WjUaV#COD;2N(B!>-%I)+0ZU4Km3S|3;( zZ3=v)mmAY^A=@H!-<_02KV8ys!b~b&R?=AyeP;Js**A!$4?j^r$_FZMBSf9$n*x*1 zA91eLIr=%Y`C1?3zU||v&PM^CNvmC%MX}^T6HP8Rpd0NBWGJaHF^~Scj7MG zciAGJ0>937HTJd*zeAGxuzYeQ|F-0;cZe>5i+3Hj`4JmVeFs{}OBeyZeI}BmK7)5d z&{wZ*DlWF$Takx8le?sGk2i5rAR-b%S0GY)*nzyJ$tlW~s5|atZb04EJ!GRJGJFmL z*@9}-wqASn+WoVd%yxXYZ}=P}5Fx5^VxoRY>KVGu0psJ_4R5-nEK&Kq6oOfBo`!LL zJcHjSAaAxSYaF8!Jf7hGZ(F)`b3CL7Bwj8%-Z_YEwbGEfH`nilV>HA*aoJ2Ms%6ev z{cJ2;omM-lkvK7t{r#6V^drZyetX#^@j%W;+U3*mT=yDgAgZ2e5wy-lc-$iCS4vnj z{v^W!<^G+)L4ie99dF52Y*-AzI|aI56bZU!tqFXH?$w}2IYiEZV|T_?pY-9u2~UdE zg}dk3ZPfniV!HrjpB5(1K%or3(;$Paf%j*#bd|wH0i_Mf*V1h1wpCFx+p z=!Xm-IgumjB;X6R`mmDwV(|jp-mI&cf$ar;tGquG0&Z`$@;itty?lCX^a^Io3Lc?Ey#}kI z@;(#3TgO%{I>vaOhLqubjU_iLks9WNB{TyK^1$G}U%N3r!zh^sBz z%1QepK!SAGE_S*RfO{K6}5cguOY-74w%0JzSM=~ zwn^L$6E^m8zbucVCI97HPxp`!L(T5W;11YB8T+&if667lhi+^)C>D+s%p>1*WN}~F zQa#21ThcK8LeRAsJoP-Wve#J2t8(o(=+SxY_T5;%V*Ah4*LZY*=fV z12KA0<`kzA8fvZVpK|G879!7x(TOjVk$kPW8I^>x#i5+^zQ^||{4?#cg+SzNkwxKK zFGl7Nco=(o$i4+Z2;hQ>e_=xjcWaIEO`Vxu+oQu8s=rBuU-KP#go}uXIQ7VAYhLb-~KiI zY~~9qOpETRI>l|kjBJb1;U8A}36_>zwlzA`FqY3oP_Q6$9Zk&oKt$HA^wr5T5s4nq zJamn`=(Ayg3V#&t0mq%Vm1iTXEp8!8>^1`!D_GHP6k0{jQfigSv=rdK{isLjaajWL`U;PF>Ku*n7N*4;8Us$vD9pf+Io;H}m^~t}vG@a&7XLeO?DLMf zb(>u<;P?d-;WM2M2hToD{5euE^41&asM?tE37BFJ2;SV+b+3{K@t!*ih&d`S;Pou_ z@Sr)w9M9+V1J?hK`?#-=`4SD#1y(uM?-cM{AKhuSJ!^TspgJCJgx4LM;J|e#>G#jv zHy##aGM`Sw6?e5pq(yrcIsdDrLafCA`l)XW&~BdE_|zd1fXl9Tk6&||ha_GU(BBA> z6#YWO!wB~LhcZ+6$vAR9T5=#~d;mCnA=2%KOpW-b?`%)Y*tsAbS3EzxoXw*JTTsds zJD8%q-ks#!s{%HWcCiCWV9|47`SOC9#o%BVJ!jyoZb)`7E1*iKB{EMte#jaid}Md# z2WHdyV3lk9PTYs;+uKwSnT~J?_NLygL#MMa!Fbq8sk;2DGrw)%3v`hRL=8^@rxf>6 zdG)nee>!Dp9HxLTg&ZRL^+ql2I}2Sb#u)aMRdwvl2?yTfEG^Q5oW~?v|_XQg<_U$D!#eyT|PWmha#Y$ZQ7s zW6);T_Ibxq)cl^U@;}kA{?g*@l~sO6Y~RKc9!cq{-K%X9Ls$~geBf8U@>Yg(%;6)m zmE40s*Q$Jf2G&vJJ;vI2K6SWt>U1A;HCARQs0%754>bKL!DE>GW|qqK3@;EGf25#k zV`FGSRh9e}R(r!>{@0YvQM3Xejc=J+Mzyeqp6Pv%l0;=F%aLF4ccF=wwAQaA)IeUY z`U)yp{d#RTe6I7>>TC*5ZEl9jg-L^~(nwIx_orcQC1o_hS4A75$Q(YF?Wu8DPipAW zSo3=7*X@Y;8Sh6?xnVDl5@!7zjrVn~d{+Qioz<|uiqmb0Z=JW9=FLr>K5uX716nzJ zK9UE}@7kXGV`DA5#f~g8dEMN14D{~22|5{`&MnyFIain3;ZHV|gl2!QH64EGXm>@_ zWl8UX@xPjg66lkUxd^l7+$h@z=`*`(&JuH-nTBGc5qYytaawBq@|VXQ&D_5g^phZs zbk<6HdHxau56|lqMTGy_-{fW^bO&_Wa?XHZr=HCsO2d=LJN{FH!=`%8Ch1T5?YOs~ z_2{=nV%B)>fXg6rF-B!ak$DFps9M`jllp`7={kSs!QTvb@9*G;tqdG{XHN8MS71o8 zVCT`29f--+6&w<$;l1vB@u%ahcf)L~&0bI3veEX7nHj3#lxk_ka*uqBBAJ5_&1}Uz%XHX(gAmUgUrs$<;vPb$dvK77Txb*$!aYyfTmGg*@%7k6Z4@pArfWNE_#ji|}*dy?A zHX0$A0z2iK$ljRaU*OM_huXT!r21S40J1Y`~hkwv4z<15grBvn4q|dm#X)AK{CCU{r*Je_Tc#0#httDHY3_-Y&>0^A`M%6sDR@ie3!a-R*;engx%bjcrx*vNN< zyH|?>_vCk~YL^sxZNXUO(h$=8-K@=1ZVV1{zz0Osb+H^oyJ*(e;DepajCH37#}f$4 zAYK%27>O^;$2<(E9#5-oa>HU#H_W4iX$0?o4z>V$tx?wTT`cNk1nx61T8hTTiKV+} zfZOagus^xV<%ITgFu*M-e)nQNBLRE=`Ctu%Fz=cpfIdK6m%}?hmtFRd)>nohJVHu8 zemaGo)_PeZRHC@HAeJyYoB6~n>&fI7k&ONYc%x?~)^XTbJ7SdI-7}DFqXNCTMDfPc zODA0ysrO%VZE?7AXIm?D(&+LRX{Dy`b6`-3G3YkRy>C7Sd$6lP}Pkev=*jkG88`uIlk@s)Z`! z>i0$w)4mZTH5#n}B>ecu2t8)JgcT{BE>Dsaxm>i$Ad1*AWx}Sv&ugKyT$y0C_aOQ_%I=oCMs|@GYM*G8uS8Di(&kH+m>y`Ms`fXixyS`g;JA-2!B^tnL=OjwOZ+1eT~%eO6TYBAE^xGEb^KlxLQCdA#@xK&sZ`e zeZwP<4lKK0{+*lq9=WuW1%04U$oJ`IDYBZ00~@l%h)xr!veO8qiwd2gO#%RX0`?E& zJnmhV-AM8Y4nAKi<)lj*YMontmPimNFK9Z9K@xIh7C6-~+xJyswS?juQEn~w@Tpd~ zv2>ClnLok-%!_lWXoF{c!w>u^H=`+-0{da&B*E%R>lg0Ac13Wq2%4Oq(*!v~pz}g^wm7 zo(EkxTGTOBhR-~;NmAkkHP(7GYs*%Gzs;_2W!A(W7gQ!{6+M;1$XJMhlw64Te*s!Vso zp40IBhqi)DTsbEFe$YDxwcl_aT3O-ZTmXey-Kwq`3eU)F7%8e8>m&?f*@+xp693~K zhhw}d-+P|CSX$7U==q1w$*UOSIObQ|_e^3|W+|KOWQv^g7Bo3`1T%DjdL0G~yWcuW z;|05&g*K^-C9d4g!(y`Yir^ath2-EFM`4m-L;JB&7^dJQcjZl2!|(l>d&T_1SuDk- zG~5iv@oHk_EOU8Fbm^4Xjcv81OD~k<>L-8y#;^FGSosaY^DA$cAXmsjUKXvQjZ3)A z=h4hK#6x81Pc7B(+~%ZFjbhlU_V0jt-(!&|J$*&=(T-k>OBOZD+HG7Mqk~24<>`#T z$AP;2=B{s}IKL5o1ifN=saZs&V^q(dt+ldc&?TR8mk{ww?1^*Q0>7#Jwa*Fs4?PUA z_TKM8{-nb`>@5G^#^0ig$iWjGn#3gu<9@Cv6j203G#+i~wXHJauEfnV`X*g761Fud zQ<6+fBx{QO5I)U)ecsgwmf-DvJ1dRNX7pK=6T!!Hxub0h5ZbX;t;H6`HW}8EoA%C=SQ8*X)1pch`GG57VTeDaQo(i zKX~|vG)@yTdAzMjd^s)0WcEvM3LDvP&m4ICitC8w!fvZ}&kgqz#f+wB0|LdN<;O~fY>n`-FgdI<_vM=Ad zJ4(9bXlOqQt%CAn@HWm!&wnknDc9MX_Ew@A>u1IdQUv;u!F<$Z`;DCUsAGNFa?QdS z4#gv-wJ*@r!`7+3&6w(T@8G;+jZhm+7BY`Y#dvhx<-f`O~qKtVyW zTFY`z?Hcfn$)&mjyD{Scs0C{7ND6(+wCRy^KkXXIv>enr;XocnT360kpc_w$6%<$+ zgQ|nifCF@zi}8VhIcbjCOxm%}P}{nf*wV}1Dihc-6ey4aOjaF4G6V4uh==~{9Y2s3 z3APCZ^3=NCRJImI3u2ILJLl|8(ME1kYJ5kPlz<`Fo}wk}w5y@{WJ)c3b=f?%mR?!9 z$l_lJN#eh;_akt$tP>X(al5E}(jz#Oe{{!V(OS$PI=Iad^OMHBeaT-J-_>8}@*`cX zZD8lk^%n$WG6O+GC>aVmx=LJR`A;u15RXY1Mn>$oPo@D183fGBqG{?&nX-`*?zXe! zeIzyM2m1EWf?t7EvMS1{^4iusEo?v5N#p-ZObEajmfFm&Iu~rp7N%(VH&gb2nKn31 zkOyG@LYLdY__XNH0#x7$zP}x$M`{oa&TAig$UXq{{V}E#?*Fh*d?w6K0zScc4JEC_ zi_y81N~`sBi%aqKl{UkBV0VGsNFO2@bty1fJOj^Ne_)y0UKdc6`_;|gDmlF$IM6^; z7+kQHp^`kBF|Q1F{a{!JxXifu5v0E9|3Ek47?3lXv8WsIr>DOiqJ^a)L(x|tx7hyv z{~F(B0vnbBRXcKeO0)w4HAuE7{52w;dMuD!?nk=lGOfl2>_ND6+^fw1QZ`CF%j>0qphEaq}u2_D;%XrRJ^i;)89Q>Fi~-{)+Ap*Xhc zw)1UkM{yU+uxQY>MaC+G6>7#Jc4!a9RJju-?kF1KFVri#8HgxZrjC9}{3KtW$}dO# z($3bx{ca`hNI4^AO?eIPxs6GD;pEW8-_%SCtKToY?^wu0_m4~cS74B&7znf+HlIC? zI<3h^gljo>yz?{Pr8OQ$0jQ__M1QY(kRbCO>;H)OlvL~n;Rxaeri+`anJ{A!BjEN6 zSf1T;T}DbOw^@<;k2_ufTwllkRf7*gm#BH|?)qBkZS$9kdtOMn={RSN7VmaFIOTu1 z;eQ73EZVd0)XJNq{uSYIr1HHKoUwk-Z8E7brWvDpdzbTnbo5Ea>`4Q`tI&ZFW(_@z zk3#46zmw^vX@FyqMz{I6iL&c_8D#7i;EMk&`cJt`5`jbVX*K#>i>8<9UE;d>wEDK^ zD=-wF;rsu$SdRe24Eu60Fo&EtO~ndIAD96^Cn_^_W(xJ675J~0pE`gD4}{06mc^OT zFIKG6!RPzK$l{ip>;i{kPD6 z{{&)#*{8kC?!&&lmr*VG^sw|sg@FHWzdlDnAS4+5TUQP`E?^=lxuplSf-dxb#`bTB zJt&~f<9F%!yi${hCS39V_p@&hGYg{d>(;jmPO_x%|5)z-YDTnYH)z$Kzz>r>dSCE= zHTK!+A&R3{%>TC<$gu7Y4Jce@moNYKxD{b8duXX1Iluj%x9?H6gVOwd zrYHR$9Sh1w*$&cBymT`DKc)U9>j7tc(fsy*X;X+Ko}_%i|7(qlj+UjfhZ>bm;}_HE zK4@y#wo?u?01%sO-wp-sS0?c+w=dx+5W@VI+Dx~Q`T*x6vpil8RQ
*Njt>qPg@=FJ%z-Xb5{Uk9$uDOlg6JoGUM?a4olE3AV7xqZ ze5s}%=t^(DoV5ckM;kyjB28giZ|UNBC|^DHX$VAC@B`K$ho^IqHQ6Z<2!i4r*lHw? zh&_)vOXwkXEc}pk+|QZ^@uex6*Zw6Fki)Hm;TjviPMxgA;5&jL;}8hA5XI*3Lj#kl zu5_R%|E;PoiKruaw9u|YQZB&o^fJT2ClQ$Du)iBMfPmJ}Bk}{W)}Yx<(qNK(w8ix8 z+(!oNTi~E2Q@7V0v{o!)=3TiY8VM7S4WQ~$q5Y&(nlIyd?_XV# zn`z&dbv8BTl`@2v2W8TXHZzHh_Dk)2S5*T4g+nA=U~cVhm{@;$=}3;rg)JX3Wp(de za{$w@V+2i+JKPJA=7XO=UhcIuSi#kcp!{#~1;7-CiU9y?INwe4!Hj;n1^>tnezFM&6``CGjQyEW zVA;j{nf)x5mqxJ=KrCRU73JaW8W>3)iF5sz-zfMwx9)-(0|kM2Uk+ODwCPL{NoMr!(d5Hu#pakH zRUqy--{uLqy9auFN$Oak-{Ix;5lfnS<(L30f#Xs;F2?lWw#P=&;PHtV{O=0lOcP;G zz6Quc8CcrG5>gXJi|oFXOK0oHWo7?>5Dbu?(c)EOc3==3o|2cmkr}F->|P`C-0#y;>(X5TEIc*(jXAAt zhLq3Wf%DGh$C9Y0$lx(nj87CZO3()4TH)hG$oqG_&!R26+=fmZ%;#{ah~vywumKHL zr4*05={2L*om$oI1hU^Z95hKAOgv_c20u}5ZU3N1V>1|1-va^k}c9Gf^s9o79 zwT&%>rQb)+%I&zF&7Cbu&UTgChRimb;6mZ`v9}?*VN^t&bDN&4;gn4LwV}u z+58)b42M`LPxd>a|CV3!?{^07tt!=Upv$_?jKEauojeXLsD5Mo=C|G8iNKv^^et@a zaiJEI5ly(t_g09V^dy>JD@zIq>i2 zCKk_Zz4_I-oUbsm!%R4<9WKNjo!jvFpk|yE^858n`EO)`=s|)J2uv2!Xz*GHP%T>@ zzwprx=#f<$t6hs5SobOpBF_`6A+ThNV`p7aOMC>V3huzT;;6aa&Pj<&F-b6>nKm zXRk3#PRw-mQ2Gy>VVy6wfditHr$^C0U(SxTxRSK$lUGy51%X*@Xl>iX#TL9)(C) zsLVACQ|LV55&HYd#c3-{Vd^!i#FI(I}t zs)uH!w2P1*fo^gb@Pr=XhU0#WdZMtD!j_9=}oM9g(c5yG%)fc^G(UbgJ)V+ zJ|ECrw0Vp_{hLEho>mHe$szdZ)W4Ax(*(dhb91+~N9|FpLt|E(_l-&!@pVc(^d!5OvLkRHKWN5{*btzFG|! zbm~g2aVbNyn~hqpy;?;i$cqtic|q}zI1m;zs>U_yt3S^O2>4^!-)+?WgtLRp8;BEE zSU>niHplafc86Vk1X4rfiqC>>-nITmk+DqJ$)&`&KI%cd`Tj=;19#o^3e+h*84Y%I zbl2M`c1y`CIWR^HOQj-OH7))evTNXp#@)sB#}&m|O`xiUpxpTKWLFMR>!@hmZUTYR z#AM$c@SNvpc$37e=vgDhC*oBAS4=;NYH2bPy{TP?*7dvMwG;55Cm5hET4iXG8?f#= zbBEL=!?W~L>E+#V-+TY!=>Rbw_N4GQVuEh~&{VM!iGMYoB#IZBF)Lunm%G}gS7@); z#OY9CA+>mMHYWe?{dK?&0Oq!6EI5*C(BgV5K^?`E!H|8A#DvCq!&>2nv5F|4ooynu zJES9AS*jJn#_Uo2GEG)Yx+Cz(uCLf^S#&A-YzoM_f(W zz_a6ziu?nI`hDK;5>{8~7t2v1eEn^E9tmJ~-&t{F!?i_>D)5x$G^9;T-A;7cVOZf= z*H}z;`tz(s6O`Vw>jk||(elz<>pU1y~j2a=TtFCEMXO3x!NqG+zUb)Hju)u7sSVRGlt&?R4YQSc=G3i zecpKWY|A>Dx3nkXW1fc$<@@|Qo_#F8H#_4Tt8c`Hu@&yOO5nOI z95e4jdbv{?RX^RriIK>t355Xz|78l9r@kTFF=iIuU?6lWR47ybriArC3m%qkWiv2E z&9p5Xz!jnLm zvL%c9j{Ir|A#%Icc6jgH8(x=^dZGxzXvt1W6EZLQge$i|MXYUvm^xD5F>BbOTJYK% z85@54-)VS5BlXxOkEe<$%PW-!UykI)RiXH82QdGwG^T5ldWI* z&`eNpP?qtQW+`!~rRvB|Iv2DXl!gin4n@1VN;a1$>R({0Xj`qkKLGMUNnN0Znc^Ip z-u54{1XA*9VyX4N)M{|q6i5ZpTaMG96nYh}q_72zG)SAMg|%PJ^Z-vfYmq)UV8ZX1S!KpLn7dH;^o4GU37%erIBxkdm>M|EAplJP9ARQ+)n8=hgcr*jo*7dy6^5nHUDoIsn&+Vs=(k=5>av-9Lb&ADbRq{QDe z@tm6sUm8n>rnbtOHR27j61O8RhhzgFhn@Z6&843nf#K4G7; zBm4eR0Zga%Bt=DQh3jQs6U#LAb+ z2g6tZsvQunN;vWZ4;Pc2lpEK^EOvlO?rT`dzwICSuw9CWR^MCIz7x}M2cwZG>=_e% z2y`YV(j6v1cIHVd@a4R@{|p8>XM&luEjIMFVT2!^PpaE$yymTLw?~Qbg-QIF(MA{y z1O!&^^M3)%OQ$=#{RsMP>-RKzAeW$XozEafQm)=q%&)y$b}GU@Wb-{bJhghXIB2#f z!h9_+=BRqY-@@;A?`1Mkjw^hybH;3%l!aYDKd*Tmr8^T>W^AG!=dzYN zWz`E8Es@l_xT)q}1j#}n_y&N=_Fm)bm9U?kvvAJJE^*&EEG?tT zTm>!emOLELUi4V*Kl>BR%n(=a#SN=Tw&AQEX;Uj(JA^cA&KPRxf{O2dW0pYWutSyg zyrQNGV&A?M#rk_3XA3qp+!gYy-KRx?XZr`3z8Vnln_eSp>HWHF&VH}aY9nX0J7Zx= zAp3&x45Hib&@M&-1#9dyH#J(X_<1DQTiSi!tJ=s-k5AE-P0FVLoYvjoh0bAYfYWCW8&XW(BXJ@e}%)OeDQA zk-9cBocGmhj{Sc4|5^6FaGuG(ChG;#Z$K%%KBMqlqQCCoLs{lxoJQ1_77i6 zemse+ov^rW(+2;lpp?~}U#>K%8g+j>)y~ZuzQ*&L)t(!({=F!-7humgIP1cK+l=>S z?0333m1D`9u-toE=ltTrUcNM!;DF{#7UTL$F4t6V{+nXM`;o2KvrKB0+67T{f0Gr= zz@eR_j6WB{V>8S=mtV{{{Z-=M#A@K$sNC9^+LOzE0C$8qOW!%RxLV<4+zio)yjnqX zmg+j*n#D0qO;RihcXRckh!w`64#JcLs z>{A zGf-`}|E;Q=n(MM&)kfAejyo=hCdL2zVx4oOS~YdiRRyVrz+3zK=Lg-o7{BAGl;5d_ za`}7h*Yz%*+Pprv{mQ$(c~>r~c&^E}dmDJvBY3Zh6V{7jM?Tk+%7!I{#5H zIAPvCctXz~ID!XU7H_)sdD8X?nKS#tvZ8orKlm|KDN|BdZ?`Rr$If|n8{AAd(tqz? z?8hSv83=W_hYB!*Eghkw=uh)k7oQI$M@LOJ#n>cdWtx3`PAkcsb5dJFR#t0HWWBK)2`K+8S0fA z0vtR0rU&}IXz|mvk*hWTCwg|i_@|WfZKrPJDPQa0Q)a#P`G0KKlmjoN`sKI1FZ}as zLI+y|_jBRKXzr)Y`*P*X_7)xSVTko~E^C|iaMepQnG?p)aatF4rjf#kIkT33Lx zWp7s&{6B1YF;aaJ*U3~AMQfECZg(e#_q?-jeYG&hw2RBMQ+l(2%>}<7KanSofEKba z=|yY-o@-LA=$PyFndhx%j2a5<&=uz}^#>#vWg_OD5SqR7)uJEb z{nCXqfK^@bhf==)gBgyDQ|607}mR|GRvEvJ9rcTH6#rCtEo2<+}ToPY)_fV^0_%_+h zmcs|d^gh^}D0h4%m}HNXIJuZgrY~ZT$-a2*+NCpByVgYkr)`roPJOFiG&{52!uI1A Q;2}&5p00i_>zopr01s~l)Bpeg literal 0 HcmV?d00001 diff --git a/lib/components/dialogs/simple_dialogs.dart b/lib/components/dialogs/simple_dialogs.dart index cad187f..01f2b35 100644 --- a/lib/components/dialogs/simple_dialogs.dart +++ b/lib/components/dialogs/simple_dialogs.dart @@ -6,6 +6,54 @@ class SimpleDialogs { const SimpleDialogs(this.context); + Future enterText({ + String titleText, + String confirmText, + String cancelText, + String hintText, + String labelText, + bool multiLine = false, + }) async { + final TextEditingController controller = TextEditingController(); + String input; + await showDialog( + context: context, + builder: (c) => AlertDialog( + title: Text(I18n.of(context).enterAUsername ?? titleText), + content: TextField( + controller: controller, + autofocus: true, + onSubmitted: (s) { + input = s; + Navigator.of(context).pop(); + }, + decoration: InputDecoration( + hintText: hintText, + labelText: labelText, + border: OutlineInputBorder(), + ), + ), + actions: [ + FlatButton( + child: Text(cancelText ?? I18n.of(context).close.toUpperCase(), + style: TextStyle(color: Colors.blueGrey)), + onPressed: () => Navigator.of(context).pop(), + ), + FlatButton( + child: Text( + confirmText ?? I18n.of(context).confirm.toUpperCase(), + ), + onPressed: () { + input = controller.text; + Navigator.of(context).pop(); + }, + ), + ], + ), + ); + return input; + } + Future askConfirmation({ String titleText, String confirmText, diff --git a/lib/i18n/i18n.dart b/lib/i18n/i18n.dart index bb80859..95c9aae 100644 --- a/lib/i18n/i18n.dart +++ b/lib/i18n/i18n.dart @@ -51,6 +51,10 @@ class I18n { args: [username], ); + String get account => Intl.message("Account"); + + String get accountInformations => Intl.message("Account informations"); + String activatedEndToEndEncryption(String username) => Intl.message( "$username activated end to end encryption", name: "activatedEndToEndEncryption", diff --git a/lib/views/settings.dart b/lib/views/settings.dart index 170b37f..728e4e7 100644 --- a/lib/views/settings.dart +++ b/lib/views/settings.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:famedlysdk/famedlysdk.dart'; import 'package:fluffychat/components/adaptive_page_layout.dart'; import 'package:fluffychat/components/content_banner.dart'; +import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/i18n/i18n.dart'; import 'package:fluffychat/utils/app_route.dart'; @@ -35,6 +36,9 @@ class _SettingsState extends State { Future profileFuture; dynamic profile; void logoutAction(BuildContext context) async { + if (await SimpleDialogs(context).askConfirmation() == false) { + return; + } MatrixState matrix = Matrix.of(context); await matrix.tryRequestWithLoadingDialog(matrix.client.logout()); matrix.clean(); @@ -42,18 +46,19 @@ class _SettingsState extends State { AppRoute.defaultRoute(context, SignUp()), (r) => false); } - void setDisplaynameAction(BuildContext context, String displayname) async { + void setDisplaynameAction(BuildContext context) async { + final String displayname = await SimpleDialogs(context).enterText( + titleText: I18n.of(context).editDisplayname, + hintText: + profile?.displayname ?? Matrix.of(context).client.userID.localpart, + labelText: I18n.of(context).enterAUsername, + ); + if (displayname == null) return; final MatrixState matrix = Matrix.of(context); - final Map success = - await matrix.tryRequestWithLoadingDialog( + final success = await matrix.tryRequestWithLoadingDialog( matrix.client.setDisplayname(displayname), ); - if (success != null && success.isEmpty) { - Toast.show( - I18n.of(context).displaynameHasBeenChanged, - context, - duration: Toast.LENGTH_LONG, - ); + if (success != false) { setState(() { profileFuture = null; profile = null; @@ -110,20 +115,26 @@ class _SettingsState extends State { onEdit: kIsWeb ? null : () => setAvatarAction(context), ), ListTile( - leading: Icon(Icons.edit), - title: TextField( - readOnly: profile == null, - textInputAction: TextInputAction.done, - onSubmitted: (s) => setDisplaynameAction(context, s), - decoration: InputDecoration( - border: InputBorder.none, - labelText: I18n.of(context).editDisplayname, - labelStyle: TextStyle(color: Colors.black), - hintText: (profile?.displayname ?? ""), + title: Text( + I18n.of(context).account, + style: TextStyle( + color: Theme.of(context).primaryColor, + fontWeight: FontWeight.bold, ), ), ), - Divider(thickness: 8), + ListTile( + trailing: Icon(Icons.edit), + title: Text(I18n.of(context).editDisplayname), + subtitle: Text(profile?.displayname ?? client.userID.localpart), + onTap: () => setDisplaynameAction(context), + ), + ListTile( + trailing: Icon(Icons.exit_to_app), + title: Text(I18n.of(context).logout), + onTap: () => logoutAction(context), + ), + Divider(thickness: 1), ListTile( title: Text( I18n.of(context).about, @@ -134,19 +145,17 @@ class _SettingsState extends State { ), ), ListTile( - leading: Icon(Icons.info), - title: Text(I18n.of(context).fluffychat), - onTap: () => Navigator.of(context).push( - AppRoute.defaultRoute( - context, - AppInfoView(), - ), + title: Container( + alignment: Alignment.centerLeft, + child: Image.asset("assets/kofi.png", width: 200), ), + onTap: () => launch("https://ko-fi.com/V7V315112"), ), ListTile( - leading: Icon(Icons.sentiment_very_satisfied), - title: Text(I18n.of(context).donate), - onTap: () => launch("https://ko-fi.com/krille"), + leading: Icon(Icons.donut_large), + title: Text("Liberapay " + I18n.of(context).donate), + onTap: () => + launch("https://liberapay.com/KrilleChritzelius/donate"), ), ListTile( leading: Icon(Icons.help), @@ -154,6 +163,16 @@ class _SettingsState extends State { onTap: () => launch( "https://gitlab.com/ChristianPauly/fluffychat-flutter/issues"), ), + ListTile( + leading: Icon(Icons.account_circle), + title: Text(I18n.of(context).accountInformations), + onTap: () => Navigator.of(context).push( + AppRoute.defaultRoute( + context, + AppInfoView(), + ), + ), + ), ListTile( leading: Icon(Icons.list), title: Text(I18n.of(context).changelog), @@ -172,21 +191,6 @@ class _SettingsState extends State { onTap: () => launch("https://gitlab.com/ChristianPauly/fluffychat-flutter"), ), - Divider(thickness: 8), - ListTile( - title: Text( - I18n.of(context).logout, - style: TextStyle( - color: Theme.of(context).primaryColor, - fontWeight: FontWeight.bold, - ), - ), - ), - ListTile( - leading: Icon(Icons.exit_to_app), - title: Text(I18n.of(context).logout), - onTap: () => logoutAction(context), - ), ], ), );