From 5d86f13776bdcb8ddcda54f6771f6ac4247b1329 Mon Sep 17 00:00:00 2001 From: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:36:00 +0300 Subject: [PATCH 001/121] Add drawable resources --- .../drawable/ic_language_icon_black_24dp.xml | 10 ++++++++++ app/src/main/res/drawable/otter.png | Bin 0 -> 13893 bytes 2 files changed, 10 insertions(+) create mode 100644 app/src/main/res/drawable/ic_language_icon_black_24dp.xml create mode 100644 app/src/main/res/drawable/otter.png diff --git a/app/src/main/res/drawable/ic_language_icon_black_24dp.xml b/app/src/main/res/drawable/ic_language_icon_black_24dp.xml new file mode 100644 index 00000000000..e89dd7a2a58 --- /dev/null +++ b/app/src/main/res/drawable/ic_language_icon_black_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/otter.png b/app/src/main/res/drawable/otter.png new file mode 100644 index 0000000000000000000000000000000000000000..9f42e7f8dcc60fe62ad7f7c9b2aa2f81e82e75fb GIT binary patch literal 13893 zcmV-LHoD1)P)ApjRaV#dsfUSf zH*y4gcdqgJ$V6lmKmlAhTfnwJBEiEfX&L)SNznYvveruWtd)1JdEQ4Uf(yMMLEx*j z2>f{jpCAbfuU}r{r5@z5r4_FBz}Y3t8!aWZb|ax)BIzZ&Xs_)JLlRC#0m68A@vI7V z;g&F=_h{ZpAYYEX|Kx>hY7Mino2#o_&RlVcBned!p^Qc(iPpBa*{ap7z8pGP10Xd*_2YYN!`*P==7;3({(K zq1}`y61iIgXJPHCDM?=VSyfq3l$J<>SRrwNlqgZyekM1QwYIr~&68_}W^9$xPtOc-TZ#p~r)S4u!;7f+ty{ zHGfFd`m6kKz2wNMOl4RZ@oSW(Y*;)Cp-weXB5}1k64}b{T(`}e$UfXUJDKMp7T+6! zh48cH!~7XtAlEqHbXbJa`9Kx~o-%jea) z{d4!vXD(k{DoMsDUFGsxq*mSo(x8ks@j5QJUMLIDu=P%niX&;M-xl7J-E5t%RK zNgOWtqagS_-NBYBC9r%5^zdR{U#_MUW3$<)XyEWdxpHEBg{OCk?q7(8Rn_VYC@06q z;EqR2C&8hPnfSt=laoW)+1Zqxl|>Gg*@>b^t?lj9+|oipmJMow?-TIzN>He-FV;zx zu=+&jnwzQNl;0b3BZ2idXe%vj|2>(|xZKy#ZjPtX=@T+LoBBm=Ol2hfuALhxPv z`}1ctTG$0Sb>@sFMJOITq}-X~WECNCGf63oiF=ShAV`Og9_f51cv%PArs&?<$Ci3r zZ2{Y9Eyv5v&80yD2a-)t7d%AmdFJL(Z*m&2qWop$3 zSRp;aFO$c@p=codg9>$zgX?pk{f3s7#tjL>fgtBPoumgSUjO`jwXa>BBXM)6)**efQ0M z*2y4SJzV%<%nBB$TPDi`B|t)}#iI&IDgYEHUp>ThtzSIbLwb)*76KDnNTniyDorxh zA7KBI;$lsejC4UuLBScP(x!!2#}JYjgJdZMkYe;iCM)~^mI%pkhDhQm0s2xRr_P9C%za#Z2^Jk#Mgh+5~Di~_{#j_+u1*JXJ!Bo2DTV^w|-5*=qfyoo45ylsOvM|vxO78)BHDMRXs z(|N^#62KF*s|<69rs>={N(E^(C%CbxiT4F0QxR%C+eU%b0JWZJr9fNAEeBeIU9W+2 zKqv%oG)BXUnLgmtRLs;*&l zXj@wwr2@++0PAS?$7`bS23J!8T1zO~=oX|Iius++^7Q2DU7w2m`aZLOA+mu?I5@`Ju3Zv{+FIVEO%L z&cr>wT@2`&AY-Z8;D*IBF(y4`EGTw}6l@pyxSo!q9n{>=Z0Lp716K&946YF__87ol z_Y|_gH|%fVui@Q#0~m+FV+QfIfO6yxb5ekUnk~QN5J%}*c-LYfkWe3MTHc9QPEg~A zO=LEpcz87IKgr)i2%rcM2-gJz3=N&&;TqmQ$t^s7ueSs~8l1<`y^+JsbBmc_7+pXG zqvH-a@#|f6+ENO@sytg*e~CxwI|#lRg=4R=<*Il{Ss0L2)zH0pIdo6 zddth{q2*XBe>8pANTst&V{9qJUAI&XODRBZmRQpkuqn<32%Iy<(#c6JVt0qr&aE{- zY%e1xjG<(iB?7GAHlm4#OZArgL=89I636t$ghFfgx-k%jbk8e0|PHCr0fer0t}0O>h+UM8QL`;E2yG0m=;M%V960; zn6Qnhdf}g)*wsLdAH?qn!$m9mkBL26i2<@Q`2K#VN8@yOHTR4Wh6#NvFuymvs&o1+ z=9Twq^U9^ymQwDJZnMg27p>b-NlB3W7-18#^|b@_b3Z)_<3By}XU!isQ@aL>GxoZR zXyE9cpXFt9*m$@#{PJP^`Rw7wh|V>manBe@y&U3u{C=vDB#ByE&nq{oJnjB= z>Np#}H@M)!0?O(arl43L%OPIBWtT50Yhg(R089zI;Y!fT+-_S#?3yyH;YG7XQ*Vn%#ORg9Gja3_mv|$6~Q>x67 zP#T0~%irInUGIHFA0CdZbc`NaNb^23o@PzCP}8wclV>#)N*1jOE}#4MH$I?arz3|U zrsV#qhkACzUFF$uBi;r{1cdxSZ&(F=K(WL_^5d^`;hoy&u0g8?L zyO*d3O&!ETpD>()B)b0c+JP-(5S9;tWa}RedUjLAZ@2HE<&V6;geQK<_1NhqzAY@R zUU;V+Q(X6zBUy+un34hK{>awdn$LapGymZGBmx%OjmEAp!~w$|6bHdcQk9W6$*^B zmz2cV!y$5u)mNS4D}Nhwe*jB+043`$lZu3Q4HM*OzW@F2(+e-W$c5;}8|Tp@k37mh z)3UFOTF)?gaHI1UbZp7P540W!alVr9&zm=oUVL#I&7VJ?zkc-5U-3sYtAGCwOh^5hiWfcIoBc&L3XfZkr3MGt@v8~JHqI>V{F6{Ws6}4J2_C;Qx zgqq-@<4y^+P)N;_{Eme&N&>8O?obAJg>bO%w%0!-y>v8n_r#bz7K>yT#g(zH2N0wM zvA&KjhbBAz<`o6uois^(!Lo@HyMMP$B^SVm%4kAEqLss$!D9xh97lP0GD0^c)Xsn8 zNO!l-cD;9qj3nC?TLF??6j#QQ3b1)~l`G!O>6AP`GC9HC54#J|o;~Ub;=zLlH6253 znxbs|a|;TnV9+2Mh{bx@b5>4H*Ia>UFcU1A509Mg=DFgX|G|Sk(sJ%<1f$~r=rLM3 z8hY(1$whHxESUs5TZ0u+oTU)u$t2;zg$W(`I(uD}LI}U#Pxsw-U$>YapD78E;xP^> zj|D2ft&%3p`jp~#fp!+^`1_Oh;jNLMV_ZHvUU-fWD|Y|UkM5)2|NfbX&$evYLNC4a zlH&I0EYs3A5S;)=4^?;MYg>O+5JY%+FC~E`6@c{^&La)CEQA$pc)y|RJ*=(KLj@p2 zu=exk-^vw2sR|T}k9U94?X%I-#;FQFaAfC@=j)%NUB9biO5Ggs9r_d0lH_P0>|grQ z7wMK;ZsqUadh0Ewyg#I5z)km}X+IsAn`CSA0Jy|h6*{SEkTuJog5=S1%T9zr5ek4Q zd=rL{9?+Sk7D_zv#N+%CkABX`3y+bYO1a79l~++ba{K4erL(8f>wo-P#OIiJgX)po zAvPqA#fB2#p#?40UulWM=!r3!6`(T=x^vw&FX_Z`Il$H*SCwhKOJlUPPo}q3t%je_ zF-Auo!?&}0o=`Y^FipMbO47pRmEE^P7`091dP zKZ@+*$h#onB7|$>U7pMhGGqja5^9X-ib(VtJc%&6w2*H9+~o=F1BF@k#Ti_HCR}+H zIkN|lcjI5WZKucj%lx08ey!VQ@B(!k{zCbMglQf4vm=GUc0zLOp z_YOXViSKa<+HDyH06YOs5T%l!@9zgmF9>6P_3g^IL!1G&S;Z{>tSO_(ed%T7Dk^5e zzm@!lyC>sH*57}oiB|snF&aJf%VZmJ4S)X6Z>}QWp~aM)nF_U`Wczw+cZ?g^j- zW2RnCtG;$!LY@G^fAg$~nzwImY3X_m>wh+CE-(hbsV#mL3qcZeD}bfu1KfIT**Ml3 zRf+6_)eu7E#`DP;UL!f~KUCjMwJ}Z}f&>A_nEG=q?bOj(|AxgMH=>Apif_!DMui2r z#4j8JayMvE=#8nKNCzz{g)XL2V}^6XF5m2at2Hj!8)Z?bAC)z*6f1@!`*c@K~bz zVJ)8Mk|So1Vf6%~I>zK4SEU>QasR%*zRRtDGzfj}cw#xX;xfzbeUR2}e1_uj*aORH z!B^&Vy+8ckA$s`MRo#@pS&&ByAN?;XVu}1e{;B4Efi!aO~B4({-R z8|4A4(1(@!qPd{rf}>ki-}Xjq7ijOGxBt4E`WF{c z@tC3HKOP#_lkKo`FNPZb#Uo2;)Tm)J)IBod|KZVp&>+gm%i|9mOX)wJX4b#0xs8tP zJWh@O?mqhqlV1u(7mzLlYGoc^E$P5gJ;9PFxb)l&71kaLMMX~}L8sBat?%=s7~jjI zFSD|9*o7~lfh9};N=mo@XeH3zPA8cqJazO4y|ZIC?ccFqHR=BRJzu4vEOY@7{+X3a zc!-k-D}P?YpI3Z4G-6;z)pgXu65tmf+#InTlH$!jsG+io>EtXCnX>e!AtOi7pw9mY zMb=77VrPte!*seUVHpCdUx9!s@p;MuUv3l*ZXDPe=uR; zmx)$_*`4`Bv=V^&+Fg{-gn#s>$I;aCOCmxqtw340=gS{JAF=k_^V^-&ctU;gE3EvW zFZAgmqX0&LRpIzh0hNVn@%hG^f5ELX1OyKV$UqjSBaV*6=}#KyZ6@##`VU{*r@Ec9 ze;$4Lr(dT_W>4w*43(ZuPiYH#)PNGWFDUKG31TTh6BE|Aw!X$6_>VZ33)!>mjnse_ zL7wr!tNZwWjP*Zd28#F(HECgCXN#fgiDB)5l1UHu{LA1q$;3MRS zPCS)BhZSn};m4?Dar{jS?ja*^4alcAw*QLUBTBkHd*{VB=+CR3q|+a3>i~ojK-n?a z4$lz!7WUupKk?8C+UwHKPo~p!n2cc2x*fV?*-{Gd?ESYcWnICmDM^snT`>9*+F7%` z+i1#E0AWC#K0M?BsOKZ@_kDDfjKVXcjCO2}%oicJFFsh?BmWi1WnCzGBZi1?s^QPc zpjQDbRRy|b)+E*sAm|<)h`4p?>}zSvlqpm&xR5SouK#j&v055ixR3RO_1Ys z(q+@9^VdfdCJAXmAfMhUki|T}Efpl$HtX1x^~6qKfglq4xT;&56!zc4!5z--KiuYe- zP98lR}fyFw)s@#$w9-ssnKW#d>Crn6a9|#GALymtD=SPE_z}Y{S zJ@?}sS_7HOclOWIbo_5+2Kh@~1_b0-ZXL}~$)q|`A z1ukvnQ9+V?q!SA+i=yqGv12ArNjU83DfaY$0w5WNr!gzC5+F&AhbY)|-zV653LuCt z#oGkco{OeTA+sWn?zGD9=mkn}#b@IW?Q%NuGYTLhi1xURG3|yM$jrFVplB6_jqN)Z{RjWoko!NVGXEWd6@yU)K7$amMe?McP|z_Jr!+MTvFIc;Ls z+yG~O;)2xN+)SsAH_%5157Ehn25LFiOwBFLwBU}fQBQy>4Tdh?RCQ0crA~AmZ$#*L zJz4#E{NYC_H#d*+`sLAZOtBn1n1;JY=sFg{pg|=ie9#;vxh%SjWfcI`pl5%&fLREs zA}c#v^Ss^n-`z+1-`hv;s$v7G|VgyaPd}6;Jm?ALL0LP??F-|AN8R%;@b;ZJbqdYA{yP3T7JPh=Ks9%+@%qRBEHxZj3FZar z+?QVJ8Lv=AlLdbVy9mwaLc^Kmi*W%HbXcZ%7o<19IG%6a`yih#sRqKGKi2%%l=XgD zA-K2Qw=crzOuza{n)`){nC-s*{e6?i&bVFo@P}|LuK>7Pr zKIb|bJAPb3?zp$XM0d;@i>5bX{bYbLAne@whg$v`#83pkP;_+?Yp6tGc?AH{iI?lx zlLxP1b&!~$q0zW-yJ+mZJZ+OVus>WmVplVO+`#+yNMrcMj$fI=@}qD7>yD5S;iDFI zy}Ywa5paEAm~f4{VAUUC@YSQpAkt-7lr7Bad(f~unB|AX|I)2DM>cE>AoP1)f0JJQ z+fME=aAC}%0RMB}-85z9ZC&qC<2Os#^ZO@$M{n&8t$hUV3PUsf>KQTj32k#_mm)m# z#BX`X6fZ2&OIj$v8?XJ-|J>$3^M-`r&R_I3O%@-5zx9t>xO7$`1Z{Q9 z>bueKTC6@?_v0IW)g}02nDr`S7h@W`Xj((1o@C)Se@dI4dXC5bs1}(GImUnG<-d2e zDXh5`MF4x47l9{$_r2k!8`sWW@ROxv5SCT|S@>CFyBB@yo7{TGW9uKba4Q8M_;bH7 zkGpR(BPYWMe}4VI_sGmZ8Q@hB;($=HJ1=gIfc@6|=%;x03uG^U=*9hpRDmqDE>JkK z@I%F0S_6}BUU-X}eXJ_Uu=;C$bU(em>s2oJ^B3JlpG#5PX*4K{Vv_p;rU28YUP5LD z`4>VP2!2a*3s;1dHBcfY#lU))6`F1mbd@s{2HZb)u5EwboXprsXVmk_jV zX0q>h=82OxJipJ!6hZX{3UJM<{(A+l?%c8LZd!KlcjH=pY`cHozsL;8N$(_+B)_K` zPVz@AU|8ngaU0#Y=I8wV!>b?U-Z#!Z-t{kjP%eqIMF_Un;W|^2STYH2Yqs$*Kso)y z@-?--kd?3pYbjvwRy3DG9$1%K*#*%O<3sR&v+>uwKjDY}b3f(wa$X?U`^_?ya_vuk z#-FdRypg6~6+6aO(5PY=HZyxzIZCtx9t~UTki0}B;-BkD27t}pLFzA(EZg}xP6`t?>?C7Kt zVoT)!i2DUBj%&}po`*eARDb6`vBqB&UZauG*k8GAKFypHzcO@+58l3-+J_uLmx4#|8s8Dmi+g3=nJ=)!}0?N{rlTPi(DPq zyN^BIBeQS=^8^SH(Qd2mt>%gl4}?UxF1uK#1X&g>R&jZoAsC3 z{cpd2>WE_hZlAu2kYyC0?#%=H$|t*D^49xey29bkmd&5>T;*dfI_^j@IqaEsi zzyDL&%X<%Pq7-1+Il<9XS9vN52NhLp`0EFus(~X|$?9sVR%PRwbu^8+Zp5)>TM}*i@dMmLm<_b&4VCj)`##94YH?UL^Olw6$RY0ej~Rvye+VaS6hM+_0dvKb z@_Swu4TzPbu(I&8o43%IapO!Y{BQoQHX`m<0-j;(@>Ql(g7VMK=97-l&Z!SKA9(VOq#!Q0@Cv7}{8bWEg zj~pU;6TPjiZ7e>0l5SseH<^|9x9v=5dw2jddI2z};`6k7*FVXB>U8J>cwJ+ue6~ii!rVAVF}Gi8=YQwW9UbkizOTqmwoAiK2#PxxmL&SK^fibuM+u;Esc$I>gZ8AdE_u1KX`}RO9OX6z;7`5fpA+#~pFeW0AlZ&8b&4y18rXl_^ebrinAF|R;A7uGdgvEx zy9vJ%Sl4H8Q4t@+Hn?bT#5B=C?DLj$=O`$N{*mrcwM?S+aKUd1)SJoDtC3NFI4F66 zo&xtYz%8AO_6FOZeS!Y>@!ybvY|0DLQVdU~K1RAMjHMev5;sYL;GtgNll}YY)RCk7 zmaay4gZJNkkDh+~NyP<#btBQrjXQkR)JMs9fH<%)$j!o_1JujF3+PdV=H_$sigzc~ z?|y?TfPwgJ0#$C<=JQe?CZhlvc=o6BB{B(FEa|rOA3#o5VP`yEM7jNPdF6&LLC)fF z+|c6?d%)5gEc6^EG(I6nG}LDMNfM=(e|N*}NE#3G{rabP9T6=X6xIs(*VSXlT$Mgd~*+^Sov$Yk+9 zIMdifJw&aQg&$;+;24ikwI zb;cs2017<&lUphziK@wjK=_+mbS;Ca9f4L_p_5As83l*}Lmyb_XEm9WLx=UV9UeXeY)?m(w9kF570T&t1jJz9|#iFQks&M3eXqIojoP|z}Y{26(B9g0_EgN zEa^3;@SkZsN3ZUAr^ke!g+Jc#+sURIX{P|F_(&$L_(1q~zP_hthdUG2@kw9ODg=7r zXH{ipt@!kk@RKC)`Oaxe+9&{$-he1>CKJ+I!q1U13XmQMk|~EbBjH8N-z&n;unCm5 z@jpll1>l`sBvp~g=;>-thVEEi0TB9#BAIS@Z$}_t3gH(`+7HrGSY83*t?t}gyz$Qa zrm*~yEu#RI1)&d_Fz(;?!9hA=k~=pFChZUDDJ-i1JoGVP$rHnx_l4cmuD4+dFp|<3 z>v{lz_x75~y(8&0lkfwHC@lxU$yibWc!!tCsy=ek+gs(%7`PUB+-^!!EU5ry?C?U| zZ`N|BXrn4hQ!J+dW?an;6WI~_n-&|*qcp{G3ShR?+{_sFcSEAGMYG)=N<%EA0Jy6o znaui|IrIrflE{?HK&Bc?DS#wMOUOhZ^hxzPK1RW+L7sH<0+vw#zM>mRrYY&6>SOxQ zCyI3R0+vw#Q4mcv$>oECpY*vwZtw!P&vaYvE-C-P@ z2?a1)@{7c`591O8WXg#{slXC*f?4=eVU`7sdSU_Fl*7uRx6gL3-nh-Tj0^y)a5!_6 zho!W(k-xIKrq?Fr^qAa)HG-QZTP{K9)*wFlInhShdjI@41$NQM1Yo#B!)c35vXW@o z#vR(0O7FbBWs)seCP=nPB2gI=E_RJ2x0d~xB>E*u@ClfsjA@#p@RGwpzU#hIQ%@-* zB?=I#$dHGXB`2|G2&P+eL&$_T2#GHVqP_n5nd6GHGx zlDNr6b}v&1-?R7MQbCf<6fvu%tp9oZ4jYv}^rDXo9=G(l;u0qGRjIwss`!`;)C!WY z7T2GWBq;^x5_&Ybs-g17S`xT%-1qV<;l4E$9_6T{bjyY!J&f2j|@>qRJiXH&M-yUeJ3m1M^{yr=Gf{?P>4?sgC8um0cHPOe15A)|_Kw};|ae@wg{4sy64+#~G z$*hO6ob^Jlv8LdzOwKJ4PoO8mPUagN&f9 zt&Ja74^V=fT=q;`q2Ux(sQpj4Xar?vMGgrYT3VWLwFkxt*D4SQ zt$JZZu83ovJavjIfWQ=V7&|Y$C0MrKnmOOy)NO22#L-agLBbpUSt5-A3xGywZ*S-C zjS_xXq+ul`lq|6RbC*9}t@gb~CphO!Z-16&bNE!Tj zxKX)5^;jfD1oF4F*hVEX&<0{qJsQ}+n4+)xT;Nv@GXBU1asVzVVh-GwyKww47|zE;3!%a0J; zAmIn@++2R2h^|nm%L7DPe^h)>_S6DS`tXq>UGI~z0#KyzgvT)JFT=dR4c~n{ITIBF ztg9(S2wXGyk6l%i;0 z_hJI_tVD$WTyt}T@PlNnKdyba@Ehv=!wKCjXdzxYLhpqId`ff}S{nlyIvz3@GotsT zqf1?hC}AQP(^uX7sg6)>uUwKaii7N2!2a{|Z*{ zScY7{v3}_sHwD@~;Tzak$w_O2oQct$DaBHc+tuno z6^eNZiI8x+$>5o8dF=W`mpy?qLF*rGsrhk}G*;2VpQuMlh_GDHLBUAjmw#LfyvHvr z@dbJn0LO`LRCtqAk)0E)U{5tSrg+o=FLN^-N^@zob~Z#?>_qmBrq#e>X+tp7vZfLxZvpfuMt+{MrM7DfUm&bX z*F70;t#rIpg}>(sMFGszv)Xo4{I4~ZQxaOc&Nwi-+uY$u?Sd6Hq3_=sNQ+|d`~tZJ zQw&spTm{N;wbu4l64qorwUS4%ry}`{0#Sg2Wx(zz`PWQGXOFKD1f$0Jgx8i+0sG67 z$fBs_7o#p5inuqauj_~(T-4NBZZr!p)*Pg9l8gnbtgLhN5g164_yf9 zb$3MM7tZXgq*qi>8sL^p^{2z20dsml6rea7RLiJK2&klBrGqI{3PWL)fLOz1t%&Fd zCZzy@Kv40TCqsKLDgdGYMFj|I5Ij*-w$1?q6+p=~8j0F!W$B0(V-pN2ZUG7}OHz))a@o zGB!z476e#?c!I1}JJ#a`)O!9fr7{&>fOP<-odN)X1fSC9TITS^s`lue1FU99&nc8! zQ-F_^aBZrB5N|$jj)6j}R`-Q<(K{bh4V>T6hGUy34UtHCN$GR7dVDx`yLxAt-h53> z0koV?@(4cLo$I!FNyRNf3u7fXv4l3!&;`nrrE)wRtH~gXfd6y)jNiBL|2^-eG(-~A zJ)b|0p>a6uip2^5Vb$ZQbF$UP{P+zve9=gfw1@v2cG_#zHi{nWA5Om*!&PCm6U_x; zjsNhUIg@nFSe|V}JvbEFY&h*AdWRJaUi8p*C1Ul^>dDvQDOD=H0Q+4p|7E8`T%)!T zPCzXbg8Pa!3b5hi$%L!|roIU=Tq1;5?=malQ|%Z~p{eD$V>>p#kCWH;^!)OHx<%%(@2ugr+InBI5BDH58 z^B+4Fs#FM6bLSebkJ1>41XTkNZw;PU3ZOS%i{<%o&5X_galGTl8){GnKW}awQZ>b> z6Jx~(B_+sZCm(D60QNbNfG2<#h&Q$zt`^ojmLlNy@Y`5a3rfQ~aagBcI$M7kp7$wq zfXYBX)N-y^xf;-uuW31^QA&Vw!?8MqHZBKUb*-(teE!dWYE&C*m^n&2vV?)p1Om}k z0G(K|N}teTR0*IgYFU3cPN$Qa@LMsI1_F)RHLN>IaCo%hnf=b$&IZGu4Ii5%k*)I1 z2X>@o`7@fi(?*>U_}zSzL3?6Ia<;-y=Xe#GHg;Wb4HFsCY>Oj9^6w=xQ3kRCW5}a` z2kLml6LE%r`R9RMpZoM^55>6S3Qh!yfD@JE8<=TF<(BXPF!pf@{D6~B~vS8V@ zDgllOBN=OK5M)n_{6vFj;1m=5vz>@dW3x$B~O^Pu=8^R`6hwvw} zJ14?x=@Lh26%Xv^?A#aQ$#Igr7nun?8s5M`QhrwYTefK3jvC4k0dfH$&Ru@sNn!8? zg)NQ@;Y02hD=fjaM3{<|BDAjSGtlMYA!{rkJ5U51H{L{i$P~gSo}72e6I0oh;W?n< zfSzC8q2QcCm7Q3Q3+5!cpyHOEbRPPFL?bO>$XR%534$r$1F;~tkfo_ zBe)cms`X1fZVCw1d_uFjBJeUFtXpR%UxqkrSUjsP(fhr@b3@P)@zhWRlswgn9J0ke zlZp;U%XZfiuK=k$eT%W z6Xda_9#?z7UKhS3ekwr-g{n`uN9gDbe^UW0zvu{7Dn$Ys?-9n_q(BQ2Py~c5o6zkp ziR5DccS)k5OHd3h%LsGN0VQY)*f*Q%&Y!T_5^YLQ_M#86cG0@+OVxiuBWR%3psj*g zW!wzgL(!p8sIKf~Nyba)Ztom=+r`6+XH|$KR;Y$A*k7V8tW;T>30-=RL~?>u5^c5R zJCtfy1Z_rC_jG=)5S>bpXp)J2o7>54vpHPk2>38jBU)iH^d4Qg7GcRu&G?x#)iR5H zknML(a-Kw3o8t&pE6GIXJuE8taz3FIP28Qo%?l+gCE1gkCDv$_r&O*ym7$LVMUXmd z6|CYjFHG1%aF30-1=1dPZKoqpA1-vrNE|F= TL>^$D00000NkvXXu0mjfYSp?Y literal 0 HcmV?d00001 From a17713d44a11971948b890efec347e67dd886f6b Mon Sep 17 00:00:00 2001 From: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:52:50 +0300 Subject: [PATCH 002/121] Make SurveyOnboardingBackgroundView generic for reuse. --- app/BUILD.bazel | 2 +- ...undView.kt => OppiaCurveBackgroundView.kt} | 44 ++++++++++--------- .../android/app/view/ViewComponentImpl.kt | 4 +- .../survey_welcome_dialog_fragment.xml | 3 +- .../survey_welcome_dialog_fragment.xml | 3 +- .../layout/survey_outro_dialog_fragment.xml | 3 +- .../layout/survey_welcome_dialog_fragment.xml | 3 +- app/src/main/res/values/attrs.xml | 4 ++ .../assets/kdoc_validity_exemptions.textproto | 2 +- scripts/assets/test_file_exemptions.textproto | 2 +- 10 files changed, 40 insertions(+), 30 deletions(-) rename app/src/main/java/org/oppia/android/app/customview/{SurveyOnboardingBackgroundView.kt => OppiaCurveBackgroundView.kt} (69%) diff --git a/app/BUILD.bazel b/app/BUILD.bazel index b2b9ae0ecae..2077aadfa2d 100644 --- a/app/BUILD.bazel +++ b/app/BUILD.bazel @@ -411,7 +411,7 @@ VIEWS_WITH_RESOURCE_IMPORTS = [ "src/main/java/org/oppia/android/app/customview/LessonThumbnailImageView.kt", "src/main/java/org/oppia/android/app/customview/PromotedStoryCardView.kt", "src/main/java/org/oppia/android/app/customview/SegmentedCircularProgressView.kt", - "src/main/java/org/oppia/android/app/customview/SurveyOnboardingBackgroundView.kt", + "src/main/java/org/oppia/android/app/customview/OppiaCurveBackgroundView.kt", "src/main/java/org/oppia/android/app/customview/VerticalDashedLineView.kt", "src/main/java/org/oppia/android/app/survey/SurveyMultipleChoiceOptionView.kt", "src/main/java/org/oppia/android/app/survey/SurveyNpsItemOptionView.kt", diff --git a/app/src/main/java/org/oppia/android/app/customview/SurveyOnboardingBackgroundView.kt b/app/src/main/java/org/oppia/android/app/customview/OppiaCurveBackgroundView.kt similarity index 69% rename from app/src/main/java/org/oppia/android/app/customview/SurveyOnboardingBackgroundView.kt rename to app/src/main/java/org/oppia/android/app/customview/OppiaCurveBackgroundView.kt index 4ef674dc6ab..9f60f2c4cca 100644 --- a/app/src/main/java/org/oppia/android/app/customview/SurveyOnboardingBackgroundView.kt +++ b/app/src/main/java/org/oppia/android/app/customview/OppiaCurveBackgroundView.kt @@ -1,13 +1,13 @@ package org.oppia.android.app.customview import android.content.Context +import android.content.res.TypedArray import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.util.AttributeSet import android.view.View -import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager @@ -18,33 +18,38 @@ import org.oppia.android.app.view.ViewComponentImpl import javax.inject.Inject /** - * CustomView to add a background to [SurveyWelcomeDialogFragment] and [SurveyOutroDialogFragment]. - * Without chaptersFinished and totalChapters values this custom-view cannot be created. + * CustomView to add a background to views that require a bezier curve background. * * Reference: // https://proandroiddev.com/how-i-drew-custom-shapes-in-bottom-bar-c4539d86afd7 and * // https://ciechanow.ski/drawing-bezier-curves/ */ -class SurveyOnboardingBackgroundView : View { - @Inject - lateinit var resourceHandler: AppLanguageResourceHandler +class OppiaCurveBackgroundView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : View(context, attrs, defStyleAttr) { + /** + * Used to retrieve the layout direction that should be used to mirror the direction of the + * curve based on locale. + */ + @Inject lateinit var resourceHandler: AppLanguageResourceHandler private val isRtl by lazy { resourceHandler.getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL } + private var customBackgroundColor = Color.WHITE // Default color + private lateinit var paint: Paint private lateinit var path: Path private var strokeWidth = 2f - constructor(context: Context) : super(context) - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) - init { + val typedArray: TypedArray = + context.obtainStyledAttributes(attrs, R.styleable.OppiaCurveBackgroundView) + customBackgroundColor = + typedArray.getColor(R.styleable.OppiaCurveBackgroundView_customBackgroundColor, Color.WHITE) + typedArray.recycle() setupCurvePaint() } @@ -61,10 +66,10 @@ class SurveyOnboardingBackgroundView : View { val width = this.width.toFloat() val height = this.height.toFloat() - val controlPoint1X = width * 0.5f + val controlPoint1X = width * 0.55f val controlPoint1Y = 0f - val controlPoint2X = width * 0.5f + val controlPoint2X = width * 0.52f val controlPoint2Y = height * 0.2f val controlPoint3X = width * 1f @@ -91,11 +96,8 @@ class SurveyOnboardingBackgroundView : View { paint = Paint(Paint.ANTI_ALIAS_FLAG) paint.apply { style = Paint.Style.FILL_AND_STROKE - strokeWidth = this@SurveyOnboardingBackgroundView.strokeWidth - color = ContextCompat.getColor( - context, - R.color.component_color_survey_popup_background_color - ) + strokeWidth = this@OppiaCurveBackgroundView.strokeWidth + color = customBackgroundColor } setBackgroundColor(Color.TRANSPARENT) } diff --git a/app/src/main/java/org/oppia/android/app/view/ViewComponentImpl.kt b/app/src/main/java/org/oppia/android/app/view/ViewComponentImpl.kt index 08726cc7f49..c083c84bd4c 100644 --- a/app/src/main/java/org/oppia/android/app/view/ViewComponentImpl.kt +++ b/app/src/main/java/org/oppia/android/app/view/ViewComponentImpl.kt @@ -8,7 +8,7 @@ import org.oppia.android.app.customview.ContinueButtonView import org.oppia.android.app.customview.LessonThumbnailImageView import org.oppia.android.app.customview.PromotedStoryCardView import org.oppia.android.app.customview.SegmentedCircularProgressView -import org.oppia.android.app.customview.SurveyOnboardingBackgroundView +import org.oppia.android.app.customview.OppiaCurveBackgroundView import org.oppia.android.app.home.promotedlist.ComingSoonTopicsListView import org.oppia.android.app.home.promotedlist.PromotedStoryListView import org.oppia.android.app.player.state.DragDropSortInteractionView @@ -42,7 +42,7 @@ interface ViewComponentImpl : ViewComponent { fun inject(promotedStoryCardView: PromotedStoryCardView) fun inject(promotedStoryListView: PromotedStoryListView) fun inject(segmentedCircularProgressView: SegmentedCircularProgressView) - fun inject(surveyOnboardingBackgroundView: SurveyOnboardingBackgroundView) + fun inject(oppiaCurveBackgroundView: OppiaCurveBackgroundView) fun inject(surveyMultipleChoiceOptionView: SurveyMultipleChoiceOptionView) fun inject(surveyNpsItemOptionView: SurveyNpsItemOptionView) } diff --git a/app/src/main/res/layout-land/survey_welcome_dialog_fragment.xml b/app/src/main/res/layout-land/survey_welcome_dialog_fragment.xml index 9a41b4cf558..0e5ef2b6dc3 100644 --- a/app/src/main/res/layout-land/survey_welcome_dialog_fragment.xml +++ b/app/src/main/res/layout-land/survey_welcome_dialog_fragment.xml @@ -22,10 +22,11 @@ android:orientation="horizontal" app:layout_constraintGuide_percent="0.10" /> - - - - + + + + diff --git a/scripts/assets/kdoc_validity_exemptions.textproto b/scripts/assets/kdoc_validity_exemptions.textproto index 94f9f14c159..fb49c21573b 100644 --- a/scripts/assets/kdoc_validity_exemptions.textproto +++ b/scripts/assets/kdoc_validity_exemptions.textproto @@ -3,7 +3,7 @@ exempted_file_path: "app/src/main/java/org/oppia/android/app/application/Applica exempted_file_path: "app/src/main/java/org/oppia/android/app/application/ApplicationInjectorProvider.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/application/ApplicationStartupListenerModule.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/administratorcontrols/RouteToProfileListListener.kt" -exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/SurveyOnboardingBackgroundView.kt" +exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/OppiaCurveBackgroundView.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/notice/AutomaticAppDeprecationNoticeDialogFragmentPresenter.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityPresenter.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsFragment.kt" diff --git a/scripts/assets/test_file_exemptions.textproto b/scripts/assets/test_file_exemptions.textproto index e2bc3b9b559..a210716305b 100644 --- a/scripts/assets/test_file_exemptions.textproto +++ b/scripts/assets/test_file_exemptions.textproto @@ -70,9 +70,9 @@ exempted_file_path: "app/src/main/java/org/oppia/android/app/completedstorylist/ exempted_file_path: "app/src/main/java/org/oppia/android/app/completedstorylist/CompletedStoryListViewModel.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/ChapterNotStartedContainerConstraintLayout.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/ContinueButtonView.kt" +exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/OppiaCurveBackgroundView.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/PromotedStoryCardView.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/SegmentedCircularProgressView.kt" -exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/SurveyOnboardingBackgroundView.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/VerticalDashedLineView.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/interaction/FractionInputInteractionView.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/customview/interaction/NumericInputInteractionView.kt" From 7c11bcdba0df1ff532a4d2bb283ee66577c290dc Mon Sep 17 00:00:00 2001 From: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com> Date: Wed, 27 Mar 2024 18:56:27 +0300 Subject: [PATCH 003/121] Create app language selection UI --- .../app/onboarding/OnboardingFragment.kt | 16 +- .../OnboardingFragmentPresenter.kt | 40 ++++ .../main/res/drawable/dropdown_background.xml | 23 +++ ...arding_app_language_selection_fragment.xml | 139 ++++++++++++++ ...arding_app_language_selection_fragment.xml | 171 +++++++++++++++++ ...arding_app_language_selection_fragment.xml | 173 ++++++++++++++++++ ...arding_app_language_selection_fragment.xml | 150 +++++++++++++++ .../main/res/values-night/color_palette.xml | 3 + app/src/main/res/values/color_palette.xml | 3 + app/src/main/res/values/component_colors.xml | 4 + app/src/main/res/values/dimens.xml | 36 ++++ app/src/main/res/values/strings.xml | 12 ++ app/src/main/res/values/styles.xml | 64 +++++++ 13 files changed, 833 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/oppia/android/app/onboardingv2/OnboardingFragmentPresenter.kt create mode 100644 app/src/main/res/drawable/dropdown_background.xml create mode 100644 app/src/main/res/layout-land/onboarding_app_language_selection_fragment.xml create mode 100644 app/src/main/res/layout-sw600dp-land/onboarding_app_language_selection_fragment.xml create mode 100644 app/src/main/res/layout-sw600dp-port/onboarding_app_language_selection_fragment.xml create mode 100644 app/src/main/res/layout/onboarding_app_language_selection_fragment.xml diff --git a/app/src/main/java/org/oppia/android/app/onboarding/OnboardingFragment.kt b/app/src/main/java/org/oppia/android/app/onboarding/OnboardingFragment.kt index 081abae41ee..26949323a18 100644 --- a/app/src/main/java/org/oppia/android/app/onboarding/OnboardingFragment.kt +++ b/app/src/main/java/org/oppia/android/app/onboarding/OnboardingFragment.kt @@ -7,13 +7,23 @@ import android.view.View import android.view.ViewGroup import org.oppia.android.app.fragment.FragmentComponentImpl import org.oppia.android.app.fragment.InjectableFragment +import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 +import org.oppia.android.util.platformparameter.PlatformParameterValue import javax.inject.Inject +import org.oppia.android.app.onboardingv2.OnboardingFragmentPresenter as OnboardingFragmentPresenterV2 /** Fragment that contains an onboarding flow of the app. */ class OnboardingFragment : InjectableFragment() { @Inject lateinit var onboardingFragmentPresenter: OnboardingFragmentPresenter + @Inject + lateinit var onboardingFragmentPresenterV2: OnboardingFragmentPresenterV2 + + @Inject + @field:EnableOnboardingFlowV2 + lateinit var enableOnboardingFlowV2: PlatformParameterValue + override fun onAttach(context: Context) { super.onAttach(context) (fragmentComponent as FragmentComponentImpl).inject(this) @@ -24,6 +34,10 @@ class OnboardingFragment : InjectableFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return onboardingFragmentPresenter.handleCreateView(inflater, container) + return if (enableOnboardingFlowV2.value) { + onboardingFragmentPresenterV2.handleCreateView(inflater, container) + } else { + onboardingFragmentPresenter.handleCreateView(inflater, container) + } } } diff --git a/app/src/main/java/org/oppia/android/app/onboardingv2/OnboardingFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/onboardingv2/OnboardingFragmentPresenter.kt new file mode 100644 index 00000000000..caa845c047b --- /dev/null +++ b/app/src/main/java/org/oppia/android/app/onboardingv2/OnboardingFragmentPresenter.kt @@ -0,0 +1,40 @@ +package org.oppia.android.app.onboardingv2 + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import javax.inject.Inject +import org.oppia.android.R +import org.oppia.android.app.fragment.FragmentScope +import org.oppia.android.app.translation.AppLanguageResourceHandler +import org.oppia.android.databinding.OnboardingAppLanguageSelectionFragmentBinding + +/** The presenter for [OnboardingFragment] V2. */ +@FragmentScope +class OnboardingFragmentPresenter @Inject constructor( + private val fragment: Fragment, + private val appLanguageResourceHandler: AppLanguageResourceHandler +) { + private lateinit var binding: OnboardingAppLanguageSelectionFragmentBinding + + /** Handle creation and binding of the [OnboardingFragment] V2 layout. */ + fun handleCreateView(inflater: LayoutInflater, container: ViewGroup?): View { + binding = OnboardingAppLanguageSelectionFragmentBinding.inflate( + inflater, + container, + /* attachToRoot= */ false + ) + + binding.let { + it.lifecycleOwner = fragment + } + + binding.onboardingLanguageTitle.text = appLanguageResourceHandler.getStringInLocaleWithWrapping( + R.string.onboarding_language_activity_title, + appLanguageResourceHandler.getStringInLocale(R.string.app_name) + ) + + return binding.root + } +} diff --git a/app/src/main/res/drawable/dropdown_background.xml b/app/src/main/res/drawable/dropdown_background.xml new file mode 100644 index 00000000000..3eca06cfe8c --- /dev/null +++ b/app/src/main/res/drawable/dropdown_background.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout-land/onboarding_app_language_selection_fragment.xml b/app/src/main/res/layout-land/onboarding_app_language_selection_fragment.xml new file mode 100644 index 00000000000..f33dbad10d1 --- /dev/null +++ b/app/src/main/res/layout-land/onboarding_app_language_selection_fragment.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +