B?7GAHlm4#OZArgL=89I636t$gh Ffgx-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 z rsV#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$*^ z1naM~Mn8HdAvi{lgoNe)?e@32eSXa~*U+uE-bw=o44^;%`OozD 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-3sYtAGCwO h^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{zCbMg lQf4vm=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=77V rPte!*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&v055ixR3 RO_1Ys z(q+@9^VdfdCJAXmAfMhUki|T}Efpl$HtX1x^~6qKf glq4xT;&56!zc4!5z--KiuYe- zP98l R}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$jrF VplB6_jqN)Z{RjWoko!NVGXE Wd6@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>7P r 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>xO 7$`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;1 dHBcfY#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+6a O (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@IqaEs i 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>cw J+ue6~ii!rVAVF}Gi8=YQwW9UbkizO T qmwoAiK2#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(I6n G}LDMNfM=(e|N*}NE#3G{rabP9T6=X6xIs(*VSXlT$Mgd~*+^Sov$Yk+9 zIMdifJw&aQg&$;+;24 ikwI zb;cs2017<&lUphziK@wjK=_+mbS;Ca9f4L_p_5As83l*}Lmyb_XEm9WLx=U V9UeXeY)?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<; l 4E$9_6T{bjyY!J& f2j|@>qRJiXH&M-yUeJ3m1M^{yr=Gf{?P> 4?sgC8um0cHPOe15A)|_Kw};|ae@wg{4sy64+#~G z$*hO6ob^Jl v8LdzOwKJ4PoO8mPUagN&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 ztg 9(S2wXGyk6l%i;0 z_hJI_tVD$WTyt}T@PlNnKdyba@Ehv=!wKCjXdzxYLhpqId`ff}S{nlyIvz3@GotsT zqf1?hC}AQ P(^uX7sg6)>uUwKaii7N2!2a{|Z*{ zScY7{v3}_sHwD@~;Tzak$w_O2oQ
ct$DaBHc+tuno z6^eNZiI8x+$>5o8dF=W`mpy?qLF*rGsrhk}G*;2VpQuMlh_GDHLBUAjmw#LfyvHvr z@dbJn0LO`LRCtqAk)0E)U{5t Srg+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#p5inuqa uj_~(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-pN2Z UG7}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@J E8<=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< zfSzC8 q2QcCm7Q3Q3+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-v rNE|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/138] 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/138] 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 @@ + +- +
++ ++ + - +
++ ++ + + + diff --git a/app/src/main/res/layout-sw600dp-land/onboarding_app_language_selection_fragment.xml b/app/src/main/res/layout-sw600dp-land/onboarding_app_language_selection_fragment.xml new file mode 100644 index 00000000000..df7ccc2de4d --- /dev/null +++ b/app/src/main/res/layout-sw600dp-land/onboarding_app_language_selection_fragment.xml @@ -0,0 +1,171 @@ + ++ + ++ + + + + + + + + + + + + + + + + ++ + + + + + + + + + diff --git a/app/src/main/res/layout-sw600dp-port/onboarding_app_language_selection_fragment.xml b/app/src/main/res/layout-sw600dp-port/onboarding_app_language_selection_fragment.xml new file mode 100644 index 00000000000..a6d31bafe2c --- /dev/null +++ b/app/src/main/res/layout-sw600dp-port/onboarding_app_language_selection_fragment.xml @@ -0,0 +1,173 @@ + ++ + ++ + + + + + + + + + + + + + + + + + + + + ++ + + + + + + + + + diff --git a/app/src/main/res/layout/onboarding_app_language_selection_fragment.xml b/app/src/main/res/layout/onboarding_app_language_selection_fragment.xml new file mode 100644 index 00000000000..3bd95a7617b --- /dev/null +++ b/app/src/main/res/layout/onboarding_app_language_selection_fragment.xml @@ -0,0 +1,150 @@ + ++ + ++ + + + + + + + + + + + + + + + + + + + + ++ + + + + + + + + + diff --git a/app/src/main/res/values-night/color_palette.xml b/app/src/main/res/values-night/color_palette.xml index 36917970d4f..0cb9194b633 100644 --- a/app/src/main/res/values-night/color_palette.xml +++ b/app/src/main/res/values-night/color_palette.xml @@ -228,4 +228,7 @@+ + ++ + + + + + + + + + + + + + + + + + + + + ++ + + + + + + + @color/color_def_black_87 @color/color_def_white @color/color_def_black_25 + +@color/color_def_dark_green +@color/color_def_accessible_grey diff --git a/app/src/main/res/values/color_palette.xml b/app/src/main/res/values/color_palette.xml index f5202bb9365..36cf4fa64ef 100644 --- a/app/src/main/res/values/color_palette.xml +++ b/app/src/main/res/values/color_palette.xml @@ -268,4 +268,7 @@@color/color_def_black_87 @color/color_def_black_87 @color/color_def_black_25 + +@color/color_def_oppia_green +@color/color_def_accessible_grey diff --git a/app/src/main/res/values/component_colors.xml b/app/src/main/res/values/component_colors.xml index 35df91176ed..688327d2d67 100644 --- a/app/src/main/res/values/component_colors.xml +++ b/app/src/main/res/values/component_colors.xml @@ -304,4 +304,8 @@@color/color_palette_button_text_color @color/color_palette_edit_text_unselected_color @color/color_palette_button_shadow_color +@color/color_palette_white_text_color +@color/color_palette_onboarding_primary_color +@color/color_palette_onboarding_primary_text_color + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 65e5ca43e22..606fa577e39 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -773,4 +773,40 @@28dp 20dp 3dp + + +144dp + + +4dp +8dp +4dp +2dp + +4dp +8dp +12dp +16dp +20dp +24dp +28dp +32dp +36dp +48dp +52dp + +12sp +14sp +16sp +18sp +20sp +24sp +28sp +32sp + +4dp +8dp +12dp +16dp +20dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9a46247bf65..504e23c798b 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -635,4 +635,16 @@Lock Icon Download Status html Content + +Welcome to %s! +Learn math for free, anytime! +Made for students aged 7 to 14 +Select a language to start +You can change your language selection anytime in the app settings +Let\'s go! + + +Dropdown arrow icon +Dropdown language icon +Cute otter wearing glasses. diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 815ceccc4b7..d0edabebada 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -636,4 +636,68 @@ + + + + + + + + + + + + From 722c759d37eff0adf38b3eee3915b00de989adb3 Mon Sep 17 00:00:00 2001 From: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com> Date: Wed, 27 Mar 2024 20:52:27 +0300 Subject: [PATCH 004/138] Add tests for the new app language screen --- .../OnboardingFragmentPresenter.kt | 2 +- .../android/app/view/ViewComponentImpl.kt | 2 +- .../app/onboarding/OnboardingFragmentTest.kt | 272 ++++++++++++++++-- 3 files changed, 250 insertions(+), 26 deletions(-) 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 index caa845c047b..55d41f7fd4c 100644 --- a/app/src/main/java/org/oppia/android/app/onboardingv2/OnboardingFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/onboardingv2/OnboardingFragmentPresenter.kt @@ -4,11 +4,11 @@ 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 +import javax.inject.Inject /** The presenter for [OnboardingFragment] V2. */ @FragmentScope 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 c083c84bd4c..dc71fc0e90a 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 @@ -6,9 +6,9 @@ import dagger.Subcomponent import org.oppia.android.app.customview.ChapterNotStartedContainerConstraintLayout import org.oppia.android.app.customview.ContinueButtonView import org.oppia.android.app.customview.LessonThumbnailImageView +import org.oppia.android.app.customview.OppiaCurveBackgroundView import org.oppia.android.app.customview.PromotedStoryCardView import org.oppia.android.app.customview.SegmentedCircularProgressView -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 diff --git a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt index 43dc8c7cef0..342f5a5e703 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt @@ -34,7 +34,6 @@ import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not import org.hamcrest.Matcher import org.junit.After -import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -125,35 +124,18 @@ import javax.inject.Singleton qualifiers = "port-xxhdpi" ) class OnboardingFragmentTest { - @get:Rule - val initializeDefaultLocaleRule = InitializeDefaultLocaleRule() + @get:Rule val initializeDefaultLocaleRule = InitializeDefaultLocaleRule() - @get:Rule - val oppiaTestRule = OppiaTestRule() - - @Inject - lateinit var testCoroutineDispatchers: TestCoroutineDispatchers - - @Inject - lateinit var htmlParserFactory: HtmlParser.Factory - - @Inject - lateinit var context: Context - - @Inject - lateinit var appLanguageLocaleHandler: AppLanguageLocaleHandler + @get:Rule val oppiaTestRule = OppiaTestRule() + @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers + @Inject lateinit var htmlParserFactory: HtmlParser.Factory + @Inject lateinit var context: Context + @Inject lateinit var appLanguageLocaleHandler: AppLanguageLocaleHandler @Inject @field:DefaultResourceBucketName lateinit var resourceBucketName: String - @Before - fun setUp() { - Intents.init() - setUpTestApplicationComponent() - testCoroutineDispatchers.registerIdlingResource() - } - @After fun tearDown() { testCoroutineDispatchers.unregisterIdlingResource() @@ -166,6 +148,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkDefaultSlideTitle_isCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView( allOf( @@ -178,6 +161,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkDefaultSlideDescription_isCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView( allOf( @@ -190,6 +174,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkDefaultSlide_index0DotIsActive_otherDotsAreInactive() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView( allOf( @@ -220,6 +205,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkDefaultSlide_skipButtonIsVisible() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.skip_text_view)).check(matches(isDisplayed())) } @@ -227,6 +213,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkDefaultSlide_getStartedButtonIsNotVisible() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.get_started_button)).check(doesNotExist()) } @@ -234,6 +221,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_swipeRight_doesNotWork() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(swipeRight()) onView( @@ -247,6 +235,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide1Title_isCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 1)) testCoroutineDispatchers.runCurrent() @@ -261,6 +250,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide1Description_isCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 1)) testCoroutineDispatchers.runCurrent() @@ -275,6 +265,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide1_index1DotIsActive_otherDotsAreInactive() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 1)) onView( @@ -306,6 +297,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide1_skipButtonIsVisible() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 1)) testCoroutineDispatchers.runCurrent() @@ -315,6 +307,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide1_clickSkipButton_shiftsToLastSlide() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { testCoroutineDispatchers.runCurrent() onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 1)) @@ -332,6 +325,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide1_getStartedButtonIsNotVisible() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 1)) onView(withId(R.id.get_started_button)).check(doesNotExist()) @@ -340,6 +334,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_swipeLeftThenSwipeRight_isWorking() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 1)) onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 0)) @@ -355,6 +350,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide2Title_isCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 2)) testCoroutineDispatchers.runCurrent() @@ -369,6 +365,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide2Description_isCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 2)) testCoroutineDispatchers.runCurrent() @@ -383,6 +380,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide2_index2DotIsActive_otherDotsAreInactive() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 2)) onView( @@ -414,6 +412,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide2_skipButtonIsVisible() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 2)) testCoroutineDispatchers.runCurrent() @@ -423,6 +422,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide2_clickSkipButton_shiftsToLastSlide() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { testCoroutineDispatchers.runCurrent() onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 2)) @@ -440,6 +440,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide2_getStartedButtonIsNotVisible() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 2)) onView(withId(R.id.get_started_button)).check(doesNotExist()) @@ -448,6 +449,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide3Title_isCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 3)) testCoroutineDispatchers.runCurrent() @@ -462,6 +464,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide3Description_isCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 3)) testCoroutineDispatchers.runCurrent() @@ -476,6 +479,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide3_skipButtonIsNotVisible() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 3)) testCoroutineDispatchers.runCurrent() @@ -485,6 +489,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide3_getStartedButtonIsVisible() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 3)) testCoroutineDispatchers.runCurrent() @@ -494,6 +499,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide3_clickGetStartedButton_opensProfileActivity() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { testCoroutineDispatchers.runCurrent() onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 3)) @@ -506,6 +512,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_swipeLeftOnLastSlide_doesNotWork() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 3)) testCoroutineDispatchers.runCurrent() @@ -521,6 +528,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_slide0Title_changeOrientation_titleIsCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(isRoot()).perform(orientationLandscape()) onView( @@ -534,6 +542,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_moveToSlide1_changeOrientation_titleIsCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 1)) testCoroutineDispatchers.runCurrent() @@ -549,6 +558,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_clickOnSkip_changeOrientation_titleIsCorrect() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { testCoroutineDispatchers.runCurrent() onView(withId(R.id.skip_text_view)).perform(click()) @@ -565,6 +575,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_nextArrowIcon_hasCorrectContentDescription() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_fragment_next_image_view)).check( matches( @@ -578,6 +589,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_configChange_nextArrowIcon_hasCorrectContentDescription() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(isRoot()).perform(orientationLandscape()) onView(withId(R.id.onboarding_fragment_next_image_view)).check( @@ -592,6 +604,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_moveToSlide1_bottomDots_hasCorrectContentDescription() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 1)) testCoroutineDispatchers.runCurrent() @@ -607,6 +620,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_configChange_moveToSlide1_bottomDots_hasCorrectContentDescription() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 1)) testCoroutineDispatchers.runCurrent() @@ -623,6 +637,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_moveToSlide2_bottomDots_hasCorrectContentDescription() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 2)) testCoroutineDispatchers.runCurrent() @@ -638,6 +653,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_configChange_moveToSlide2_bottomDots_hasCorrectContentDescription() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { onView(withId(R.id.onboarding_slide_view_pager)).perform(scrollToPosition(position = 2)) testCoroutineDispatchers.runCurrent() @@ -654,6 +670,7 @@ class OnboardingFragmentTest { @Test fun testOnboardingFragment_checkSlide3_policiesLinkIsVisible() { + setUpTestWithOnboardingV2Disabled() launch(OnboardingActivity::class.java).use { testCoroutineDispatchers.runCurrent() onView(withId(R.id.skip_text_view)).perform(click()) @@ -669,6 +686,213 @@ class OnboardingFragmentTest { } } + @Test + fun testOnboardingFragment_onboardingV2Enabled_screenIsCorrectlyDisplayed() { + setUpTestWithOnboardingV2Enabled() + + launch(OnboardingActivity::class.java).use { + testCoroutineDispatchers.runCurrent() + onView(withId(R.id.onboarding_language_title)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_subtitle)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_text)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_label)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_dropdown_background)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_explanation)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_lets_go_button)).check(matches(isDisplayed())) + } + } + + @Test + fun testOnboardingFragment_onboardingV2Enabled_configChange_screenIsCorrectlyDisplayed() { + setUpTestWithOnboardingV2Enabled() + + launch(OnboardingActivity::class.java).use { + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() + onView(withId(R.id.onboarding_language_title)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_subtitle)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_text)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_label)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_dropdown_background)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_explanation)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_lets_go_button)).check(matches(isDisplayed())) + } + } + + @Config(qualifiers = "sw600dp-port") + @Test + fun testOnboardingFragment_onboardingV2Enabled_tabletPortrait_screenIsCorrectlyDisplayed() { + setUpTestWithOnboardingV2Enabled() + + launch(OnboardingActivity::class.java).use { + testCoroutineDispatchers.runCurrent() + onView(withId(R.id.onboarding_language_title)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_subtitle)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_text)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_label)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_dropdown_background)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_explanation)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_lets_go_button)).check(matches(isDisplayed())) + } + } + + @Config(qualifiers = "sw600dp-land") + @Test + fun testOnboardingFragment_onboardingV2Enabled_tabletLandscape_screenIsCorrectlyDisplayed() { + setUpTestWithOnboardingV2Enabled() + + launch(OnboardingActivity::class.java).use { + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() + onView(withId(R.id.onboarding_language_title)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_subtitle)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_text)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_label)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_dropdown_background)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_explanation)).check(matches(isDisplayed())) + onView(withId(R.id.onboarding_language_lets_go_button)).check(matches(isDisplayed())) + } + } + + @Test + fun testOnboardingFragment_onboardingV2Enabled_allIcons_haveCorrectContentDescriptions() { + setUpTestWithOnboardingV2Enabled() + + launch(OnboardingActivity::class.java).use { + onView(withId(R.id.onboarding_language_dropdown_arrow)).check( + matches( + withContentDescription( + R.string.onboarding_language_dropdown_arrow_icon_description + ) + ) + ) + onView(withId(R.id.onboarding_app_language_image)).check( + matches( + withContentDescription( + R.string.onboarding_otter_content_description + ) + ) + ) + onView(withId(R.id.onboarding_language_dropdown_icon)).check( + matches( + withContentDescription( + R.string.onboarding_language_dropdown_icon_description + ) + ) + ) + } + } + + @Config(qualifiers = "land") + @Test + fun testFragment_onboardingV2Enabled_mobileLandscape_allIcons_haveCorrectContentDescriptions() { + setUpTestWithOnboardingV2Enabled() + + launch(OnboardingActivity::class.java).use { + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() + onView(withId(R.id.onboarding_language_dropdown_arrow)).check( + matches( + withContentDescription( + R.string.onboarding_language_dropdown_arrow_icon_description + ) + ) + ) + onView(withId(R.id.onboarding_app_language_image)).check( + matches( + withContentDescription( + R.string.onboarding_otter_content_description + ) + ) + ) + onView(withId(R.id.onboarding_language_dropdown_icon)).check( + matches( + withContentDescription( + R.string.onboarding_language_dropdown_icon_description + ) + ) + ) + } + } + + @Config(qualifiers = "sw600dp-port") + @Test + fun testFragment_onboardingV2Enabled_mobilePortrait_allIcons_haveCorrectContentDescriptions() { + setUpTestWithOnboardingV2Enabled() + + launch(OnboardingActivity::class.java).use { + onView(withId(R.id.onboarding_language_dropdown_arrow)).check( + matches( + withContentDescription( + R.string.onboarding_language_dropdown_arrow_icon_description + ) + ) + ) + onView(withId(R.id.onboarding_app_language_image)).check( + matches( + withContentDescription( + R.string.onboarding_otter_content_description + ) + ) + ) + onView(withId(R.id.onboarding_language_dropdown_icon)).check( + matches( + withContentDescription( + R.string.onboarding_language_dropdown_icon_description + ) + ) + ) + } + } + + @Config(qualifiers = "sw600dp-land") + @Test + fun testFragment_onboardingV2Enabled_tabletLandscape_allIcons_haveCorrectContentDescriptions() { + setUpTestWithOnboardingV2Enabled() + + launch(OnboardingActivity::class.java).use { + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() + onView(withId(R.id.onboarding_language_dropdown_arrow)).check( + matches( + withContentDescription( + R.string.onboarding_language_dropdown_arrow_icon_description + ) + ) + ) + onView(withId(R.id.onboarding_app_language_image)).check( + matches( + withContentDescription( + R.string.onboarding_otter_content_description + ) + ) + ) + onView(withId(R.id.onboarding_language_dropdown_icon)).check( + matches( + withContentDescription( + R.string.onboarding_language_dropdown_icon_description + ) + ) + ) + } + } + + private fun setUpTestWithOnboardingV2Disabled() { + TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUp() + } + + private fun setUpTestWithOnboardingV2Enabled() { + TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUp() + } + + private fun setUp() { + Intents.init() + setUpTestApplicationComponent() + testCoroutineDispatchers.registerIdlingResource() + } + private fun getResources(): Resources = ApplicationProvider.getApplicationContext().resources From 0a24f11033d5833425220002b4cc54d870a33e51 Mon Sep 17 00:00:00 2001 From: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com> Date: Wed, 27 Mar 2024 22:19:32 +0300 Subject: [PATCH 005/138] Fix UI --- ...boarding_app_language_selection_fragment.xml | 17 +++++++++++------ ...boarding_app_language_selection_fragment.xml | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) 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 index f33dbad10d1..37ff3fc566a 100644 --- 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 @@ -53,8 +53,8 @@ + app:layout_constraintEnd_toEndOf="@id/onboarding_language_explanation" + app:layout_constraintWidth_percent="0.40" + app:layout_constraintStart_toStartOf="@id/onboarding_language_explanation" /> diff --git a/app/src/main/res/layout/onboarding_app_language_selection_fragment.xml b/app/src/main/res/layout/onboarding_app_language_selection_fragment.xml index 3bd95a7617b..a54807afdb1 100644 --- a/app/src/main/res/layout/onboarding_app_language_selection_fragment.xml +++ b/app/src/main/res/layout/onboarding_app_language_selection_fragment.xml @@ -44,7 +44,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" - app:layout_constraintGuide_percent="0.40" /> + app:layout_constraintGuide_percent="0.38" /> Date: Wed, 27 Mar 2024 22:25:35 +0300 Subject: [PATCH 006/138] Fix buildifier issue --- app/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/BUILD.bazel b/app/BUILD.bazel index 2077aadfa2d..73928592036 100644 --- a/app/BUILD.bazel +++ b/app/BUILD.bazel @@ -409,9 +409,9 @@ VIEWS_WITH_RESOURCE_IMPORTS = [ "src/main/java/org/oppia/android/app/customview/ChapterNotStartedContainerConstraintLayout.kt", "src/main/java/org/oppia/android/app/customview/ContinueButtonView.kt", "src/main/java/org/oppia/android/app/customview/LessonThumbnailImageView.kt", + "src/main/java/org/oppia/android/app/customview/OppiaCurveBackgroundView.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/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", From 785716e24a78f8f90c841314a499eea140dced02 Mon Sep 17 00:00:00 2001 From: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com> Date: Wed, 3 Apr 2024 04:45:23 +0300 Subject: [PATCH 007/138] Add OnboardingProfileTypeActivity --- app/src/main/AndroidManifest.xml | 4 ++ .../app/activity/ActivityComponentImpl.kt | 2 + .../OnboardingProfileTypeActivity.kt | 32 ++++++++++++++ .../OnboardingProfileTypeActivityPresenter.kt | 42 +++++++++++++++++++ app/src/main/res/values/strings.xml | 11 +++++ model/src/main/proto/screens.proto | 3 ++ .../util/logging/EventBundleCreator.kt | 1 + 7 files changed, 95 insertions(+) create mode 100644 app/src/main/java/org/oppia/android/app/onboardingv2/OnboardingProfileTypeActivity.kt create mode 100644 app/src/main/java/org/oppia/android/app/onboardingv2/OnboardingProfileTypeActivityPresenter.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 41d1ce55918..271952dac4f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -330,6 +330,10 @@ android:theme="@style/OppiaThemeWithoutActionBar" android:windowSoftInputMode="adjustNothing" /> + You can change your language selection anytime in the app settings Let\'s go! + +Select Profile Type +Tell us more about you! +I\'m a student and I want to learn new things! +I\'m the parent, teacher or guardian of a student. +STEP 2 OF 5 +Dropdown arrow icon Dropdown language icon Cute otter wearing glasses. +Cute otter with books. +Mama and baby otter. +Back +Continue diff --git a/model/src/main/proto/screens.proto b/model/src/main/proto/screens.proto index e0ee3599d6d..90a4c187136 100644 --- a/model/src/main/proto/screens.proto +++ b/model/src/main/proto/screens.proto @@ -158,6 +158,9 @@ enum ScreenName { // Screen name value for the scenario when the survey activity is visible to the user. SURVEY_ACTIVITY = 49; + + // Screen name value for the scenario when the profile type activity is visible to the user. + ONBOARDING_PROFILE_TYPE_ACTIVITY = 50; } // Defines the current visible UI screen of the application. diff --git a/utility/src/main/java/org/oppia/android/util/logging/EventBundleCreator.kt b/utility/src/main/java/org/oppia/android/util/logging/EventBundleCreator.kt index 9a31131f91c..00c64834c47 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/EventBundleCreator.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/EventBundleCreator.kt @@ -735,6 +735,7 @@ class EventBundleCreator @Inject constructor( ScreenName.UNRECOGNIZED -> "unrecognized" ScreenName.FOREGROUND_SCREEN -> "foreground_screen" ScreenName.SURVEY_ACTIVITY -> "survey_activity" + ScreenName.ONBOARDING_PROFILE_TYPE_ACTIVITY -> "onboarding_profile_type_activity" } private fun AppLanguageSelection.toAnalyticsText(): String { From 3067ff2bc21888b0756e84b626650f5f6bdf09ec Mon Sep 17 00:00:00 2001 From: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com> Date: Wed, 3 Apr 2024 04:46:15 +0300 Subject: [PATCH 008/138] Add drawable resources --- app/src/main/res/drawable/learner_otter.png | Bin 0 -> 14957 bytes .../onboarding_back_button_white_background.xml | 5 +++++ .../main/res/drawable/parent_teacher_otter.png | Bin 0 -> 15831 bytes .../layout/onboarding_profile_type_activity.xml | 16 ++++++++++++++++ 4 files changed, 21 insertions(+) create mode 100644 app/src/main/res/drawable/learner_otter.png create mode 100644 app/src/main/res/drawable/onboarding_back_button_white_background.xml create mode 100644 app/src/main/res/drawable/parent_teacher_otter.png create mode 100644 app/src/main/res/layout/onboarding_profile_type_activity.xml diff --git a/app/src/main/res/drawable/learner_otter.png b/app/src/main/res/drawable/learner_otter.png new file mode 100644 index 0000000000000000000000000000000000000000..6616027bee8dd7ebb88ca7772d0f0be9fd9a17dd GIT binary patch literal 14957 zcmV-zI+DeSP)VK~#7F?R{yG zB*%5$S4US@_1$yt%-#nUdtkAka1s;&k^)Ur6b;HDN|fY~6s8?=_?JQs`;Qc1`H#bv z!&ZbHA=wH`qz#dh!n7EaNm?X9f*?Tv1PNewfjzMY_L`lYtEca-uEXEUs-EeY?U_9X z*jdj*G-ju#x+**K%XfV5Wu^wo%fI=Ftzqc@c>o;LfCAR#|7+2peO1%+-+AH-|M#3G z;P6BLjdftG%MvN+n(>exgx-Hz2gkbfkb+nhoeJeytjoIekdQ8ij&)g=<)yF=kaby6 z)&a6EE6O@R)@4Om2gtgtDC+=Omlb6lAnUTCtOI0SR+M#stjmhB4v=+OQPu&nE-T79 zK-OhNSqI3vtSIXMS(g=M9U$wnqO1dCT~-tmcYy?2h_)uRkZe#$)P@>vRzh7vU>Wco z3t__KzjXwrfzU9Z`2oyI6IQtat?lDx#b^8cxJgDRubXe*T9x+&Anaqb^$->6uW}+p zvrCUj*Y~x7ej-K&W5xUEI($0;FKxk3CkYG!LW_~6MGrD-Em*U4Xsxz-Za@GDa6mvU z(w_kbzR`m2`it5*!}d)l762k*`yn!XBgacEfgEm`xXn z5<%oGZb?(xY6WO5X@tl2*NEO(wl2%h6ba_!Jqncf3?Kpq>C{P!8iPF Dv cB6NE+Ac{B~4fFng8LwpPU z`hI}AW`*m-M7eo~n#ftWE(~GRsZr+YXmYf}71TlpDDs^I_$_|XK2Hag&OIZm4v-Ew z#E!RbLI=0CcmQY;WB`>pp+>k7VBDyLh6X>CjDFF?2Wi8isWF;u==3wZ8&n5^2l1o) zgz|FkDUhrxKxB5+^u^#XIN)~D<|_$ZoJ`+Cz1c#u* ED26#4Bc$)(8^%H9p22 zk@%Kw%SAX{f?4;Gi2YPg!!_D2kw_rr*s%DM$_Ab%?Qfvn_8@MsXh}mrLKS!~n447t zh=8LZsy7*dL*w8Y3^|L1Jd*5O`M0``z3kWyrc0$oAPG6MTbT@h+R+=U99imYPt`V1 z_S h~-wp!I@v9}NfwI1~+Ra{dSv7!& zb5}Q_NI-fiVVcNhGjOOq^e!_Yz!6Q7%cNBYi;}Pjm=u2xENfMiMlTV-I=L(~KC@D( zvE9DXAaS&;BxTzKho!WjYC8m28hvG3X%hi^gWo}Xml}K4;Ven4aZ|G@0Fe$AV9YU; zmHv@=l(0lKJBz^4Ee<>1V&|tFTbUq>*K68)H~-{OGWZEI0h3^!t5o2%+YD|(Wh%t? zk-rO=ul+DTYbTKke43heWOjI2gME+)*0v5=6@W;ewDc%U6p`5}HrvpbXZ8gQ#e7~3 zf~LQJs#yS>PB{t))p`x}dV?URi6l@w&qtW-ZS8cnzXL7-NQ>a8^IlnCO`Dn30SF>O ztXsS4vCpxRICc_ui%44(pb3n6qp37WrCR0B0NGTU-{)GeD-t(GgQq5mFtD0RAFNeb zC4jJFx_%ei9QZe%19`tiB9<&2<+c}@4p&T0wWhvLI+cPcd7dsaC=P4TMYah&FF;ub z$WqawD5fI;J^NOx1=o(kLnZ7q-wV*Lx6!V;@R~jX{vJvv`_WGkQS}-fL7l9rku;D< zC17O|>fg8Rqwo>!rU$p&Vmmze%)|70zRR{Z-ImJT=t=T2DYlnkjyT;`GV+x?PJou{ zD)VwL$*KTEBRceOVcJM%S7+*ITxgI$Vsfn!4Tj(H7XieN0TOl%kj4ShmjEO|fLKh> zB@1*6`yE(WI+tmJ##+IQ@pb~hCc)sAUDT)Qd@i*DpWTW960l7{kLQ!v;QQ2o(hdSd zUUN=~kyeV4kBx+5lGYb$pPx@Gd~Y#A`Woj#Rs|q3Oo?zIKolTUPgYTXr-G0Z(I-HH zcA#czN9F;*fi`UuCOcj1ywB@=ndKE1?JMnQmJ@tBiL+!b2`2`KU1aoAu$6X^&uekC z6q1i %0JpCK^pJOP$VC~z9g{0fL$)fS)CRsd`9xi#i!+)@kPY&!y< zXh6O&!|#(b;cQ7o;N=8y`2E* xt{OF>z@Ul?xS=50}uo+EU=3mmqqHmC4aN&G>7bM_olGwbMzyrsFE-Q8x!7 z>R(L5){kvPYQVwGh}iqY#w@aY4elExK+2drJc-G-r<7({Nkmf&J~)V>14B0qif$2( z!zRFj?etSTYQ`2pGP$4?g+oaRpTkUJ-e3DHs>rG)>%{&_W>Y6S>TU0%TK3SGtSj{| zGxtWoAtB~;r9leYQxtb0V >s7O7c bc{wyHlSn4{5 zKuZm#I8ZanFOUIK5sel($P$t0mahDrZg2=7 as-!!P6 zr!TEiGY#cD8);)c)Yb{q+}<4QZ7Ee(qA8oY_RWjP>H>tFr&9J*%VxsF0DX>2Kf0uR zg%v|mO0(_b8?T JBH2uDSYNbd+^|n4N9BHAZfyE3X@6g zBoR&DeSONwET5l4ZKAIJ*3Ev3rg`I?aeU$L-oVA_8usnm2Zy<$zdLdoU*R)<`yV`l zpV>8rT*_L+x0u4qbSl$~=%+QvFq;|#1WJvdOVj_#-y?L$syf+{;F5Y!pJb9!&x|h8 z8`9C=f|cXH6Vw`C{ozq+ktRO-* oJ@*{G z{`Ifp^Pm4bDvcKY>(^exneiF8-n9&{f=h_`dzslN0uyQIQi2#&>E8>odH@maVUa+} zEaX>YptAG>6lvwIOuhf`t#`>@M$_=%!Gq}U@5lD-+p&4`W|j4Q{nR)vOwPe0(3%W8 zh2Ib HVvqNfyvpV2sxn>4WD;XzW7xWND{{FU z9)0vtbssTrFCIFF){ S|Vt z^Vmy@)I1#r@k?L&629`4uc(}k ;+4eJg z;8%T|dj5za%chUdV#`>8zC}{`6LP=t@o_x;^wY`*5%7tq@`H?Xjgu-#M=84ws-Dsy zX4+KLd$)+rks4JgX13S(BCAz1F-m*b)}r@R^g@Qz;S6q*9i2T}TK4k~?HpxDyATG; zOqYzRqS@)s?B6zm-P_0Dj{7K|tMT4Cc7Aw2wmq>2f?u~JO zceNP*_~4Fzja86 a8~5fRE6dwP=jXB zM5PJ34Gcwp_2UoY$pa7K-1F~X;^;+e*uMpjeD1>--nR**xhf_mXE4K`0)TWOjqG3n zZ-3*bXfRx^U9IDZU;Zfiod74^onXWi`8rY24?|Wu)}MX)0X(sH6Kre2M2fko)~brF zEgzXfd#0`OFV2_)&Aj$ISd3=UYn)A86@Z9V^%=3WbE%#_hN$| 8BKlmt4{q5U0{r#gbIfxJa(vvv&nI~}i!Z`lq zi(kX<{N8`Ym%s8nK~ll49h)#bIsl*M;q1%D8O_v?E#~pWrys|l(NtLgA mI`|KSUG{qV_!FUYnW+`kil{D;4bZMh=; z_V=E{$?qOwLNJK~zxWt7KD7aJ(-W%VEziiuPN$W#E7F$b7&Yd7N;As$D9x2|kvz`K zPp08B6P((bM&Z#uI=#Is;fhQ(Y;5Xlnlf7*fC&FlOrtrJ?fG}%E2d9Or zh@l4t@H3zNSseJ}lPGK$m>;BWxq9+44u9=c9QxWTm^v}8Sj)$M>tlHQH$H}!PoKdb z{NbPD&9~mU=5qp)2lwy5pZ>>xiH%ko-}r+s 1D}2jFH>{;!5@AB zKY01jvd@z|&XbQGz+e2y?_)5V!4LlAoA}-zeNFKq>bV5u$evBe4&_y*SwvF(6DKZF z Y*!y8D@fu=XTS^GVN3rP(sF4v=L;>~A|yfNaS3{JW_0L6TGVKmG)qY!;_p zID*&z>W4T*=Cn$7v{%ASfRdtfI(A?yc7NeV^C_T}&6BpKC EL!e`s+_)lx;BR zubex19B=&KB}|Q9o(E936vV_3AZwWmS*4OgL@VX}Fv?eSNg`okboYJOw(kKXQz`Y{ zw#V 5s@yM?|g*hhes?-$nOfezye0fHanO!^UP@^$x z%m_-}6L3i6wQ1)rf-Z&EfA|tEojVJ^y#O$kstMOi4wn@Hh{5pDHx|M~Gm*d;!Lj{8 zs%W*uAp(zSC)6v|mqBrJKOMqQ&G0Y`6u+TzW0ED6M49}IZGOvb2(DVxt9#SywU`pDkls(&ko~fYH?lcwUm+6hYXQ@ee|Or!H>VE;nJDY@Z+Lo zF)NAnwYkfS#w3@)tgY 2eztOH6~RyXVDsQg%<}tT_|7+ zQ|ils<5t9>%FpG}Ot@J${Fw~d*=<`#aVJHX-O(*uv19LE ?K8Y_BZf9? zfG{6Ylbc*GIb2?3EvqhOhR$B1FNxyFXwQYu67Dvdb+l+I#NHQ*#T$KuGD%NAc@P)J zCvj r2wV6w|BuT{|*t-M&?6;o9r~cjtnF+r6ul>DmejD$edzXL? z&_6VQjhi=N)7CB6xP|!|CrT;`<)16`F~^fdVy1 6VZoYUTrbu>Ti6DUZXk zBX8j+FaKEi4gG_I803s|QjUrU@`b$m{bogyXeH)c&b>R1AHI47-}ufe`0fv1SE26% zd$!{@Klced{lSN@b;}0ivuWIloIm?6Nimn%To=uH6VsDZ)GD*gGP~G$|1Ru#U_Y|C zELqogaQ<5_qIK@lJyDgq`bEp+6pT^>=g*wOYd?AwNzU|#Klm611_#v4OELG+YBq7| z*a^J##vy#-*-z1Dv6tOPq~|keKKcqd6!TeZ-#UiPW5dk4Hc+nA@caMbHyF}>fPc&2 zR;5Jqa`ey<^s&wN?b)pW-DosbZm2|%T)BJ&-~ZP0*m2)344Mg8G%hag4Ow-7h`N9G z{CU{J1#G)-CpL_2z!0@W!m?0h;_au@CYLT=RK+@j!-Gnb-0GTa@iPhp!b1< @_dE{|ijTt%YZz`Y`? zRu3ZLlIWUtoA9YMHt)S3dmlcCK8As!`j5Z;Hs1X4>ngV~%#Pl+b30! c|%h7+{1}ppPZj zT{(XN)8{Y3q=Rm1Yu`;>H4P%*DAQiI0w2RLFr0K$fpD|Yz-uqPq8!z&JGNnL>n7y$ zd6l2Ja_KTv^>^{1pL+^9zIUr2k(|q}ZDT4$Zy2{XNLQ~+5X?uhj|AWF=qN@uj$y7e zM{PolL5=eEn@4aT!QV&lY@kn7Nv3d|=B-4(sNYJid629MKzymZBIR83JrtRHahfhl z$4?`@a|;gBmZ#DwY~H?2spn4U`}!+C#?;j*Wo8Wh_G 5p5q9G*z@%Ev^m||2gGB(O+U>{Pc zbk8!x8xo0V=<}TU_P5|qUSV!$Gtz^DxK$CYC)`YnZLd|T pP(j;7T~P|WRXbNX=n>O6?z0n zljbHzU&M6DM)nt>GgQ1p^*l|`h}Iao1^#1^$R=|W6FB+pZ!2)rXJ(Xnk)KUQO9GPA zZGc2TD?CSvPU_^ KpXt~ilm%+`F$eSotFmvJ@g3D*noIVFR z97M`!rEV$oJ0My6^8Or2M#r>$;R=kaGdO4JDDJ-xHXXiHKBu e_^<6sV@j6|N*=sGlXAT2=|IV!A;Q7pWP8~XmiSiWERNaN) zVWhG-Rc&T6JT%ORG*e3*85wxwRb(kbivwGsZy|phWRz0iASYGAEZWJ|qJJZ=r6N&9 zrCh;9MmaBk??pPCv)Hkl^f*7C%S921dbVLI17Y+3rc}j|8Ffk9HzubQI2sJc12--& zl+|`r8}&8`HC;+7!__&J;(e0${ZPY1t%Y`}idnCXSvr~0xiZ)moxvod1Dzm|McfjN zxEv^nAUb7za&4JFk+Q!&hRA8r7F7R>%@u*@%d*Nkt}ugq=Hw|He*H}{p{LYePoFrc z9LgNESB|WxgxFbvYdB$JP&bim5R`LeI=t;`_E{52CNz?Q8s-STB( ZNodLE?3`iI5fd^}2dhZs4=!=_%AJWt12V4KNf ZMze9#^aYEZIIPGfA)gfSN&!r!vTD#Fo12&;>@ob%Fb#bBeAe&;OcsGnhBC@ zyrov79UpUVq69~3i*&o568ER@50wWPG>EKT-=|j)D%Oi!K3F; ICPo@aZek+O?9nb+Usg}RJzYdtzdI~`x4eHX z;;fW4Gp)fa?u3Y=Im>8ccJ8{a?YzhiLtE(7-k<5s &v%bY$H8glIS-B|+v{s2T4WTz}NM+(<0 z&AcUH-#1z=u1=Rwsnu`jBjO_TF_&^6*S9RG^`>jVjT3I&Qf9Xu2{SlU=ijv&o~0Qn zbh%NowOSCL;_WfSsnB0-l~-tstf7fD(%mNSeVYUv3~8GqdHNrBfNzvDU+8yS9KVWj z5?IUaw7gW3)C&6w{jjy(4zfqT;GK2?o-Fh0710QdPyTeX(MDchJo|M9ED1aMjAiS{ zGoZ>9Ryd%U{&efIiMvsUyypN3= 8W1v5C1KeFgsIEjI~oh5SrFzGIu^l5M?*&SCE%?+rj?&oXKb zw?6|fee30a-6GZU$IqU}yO$=^?uR!cl3gB3rdGV>f6oBbM6moqa;l1r)F6d*fZV Sv& znR1*weHSrnBZh}j!-uof|De;Il+&kT^3QgRMVsudHCc6lgzPXcn}l0T;ZBJ78KOBZ zUb%Wp;OIz{JnL;@UTN7d8Q~bD$yMDff#S)*hI6yZ_mB$wp;Ul0u6@2bg{l!SmlUV} z Zd)(X1Z=(z;XMtNWgJ|H2MV7?%r*HLo`5>o?~X20QW>YIu5PVV$F)0(D z{VutcXpbua3G-#nvk?=s#q=27hA?~5Bhj&{z8l?Gj!Bh3Il0nShw>-??krJUHGl|> zE>3B92h{78sTqc| &`tRRZwtlT|6549RzRsU&>o_Elzs$+z>D z2oBEpURzDxs?@zU4$n *+nr2jgF|-sG~7UlUACh<5{D#Do3Gu*lxCw(N (r5;x5RQNM88D3Ph%!EoJ^ijyQVQIbFqt?UF_9S8_H9?2f;_uE%^p7S- zhiJGPW1Tw=5CKI%^U~Sf@OEUXR3;I2MJ3|yglXv(xnINcaI8Foe9=UKk;-vqZ|kzS zD`rr&c#UwVc3z~T*> 6O-yhtW=-YYQNO5rt=>4MI9> za;%5)C+6Mr5IXI#Y%`_FaUHTARZM^$9YuD#zK7IwoV#$Den;bmHp#uEXV5p8<)FV- zn#7ZZVZ7F|dalorS`Uq8Gh~Rne MDT-q7TTQg+7eY7g0SEMiLEgR@0t zMPACr1wG5ihComEwgs~5^H>_lTe6+z{D;-&<##QvYmtPcW@27zs7kZ7tU)S7_$ lmZ+6HFKW9dY_eMUcXJ8FyG6{a$x!Xt;q=&( zL&8c?@v=+La$7RUY?p1C 4S##;74G7d7C%>3bg z9g%&|#X(HjlEJikGUYPE8_lL#oa8vRY<-N|6 4~>3E&dQX*+7THK&UkYhuX z77(@0(708W^K`58hY*R#cg>_7Wmcqc$ac~gZ<(l(Q8g2K=jJMEF=VlmXh?p~9hne) zN$nbDvFx=D+SNI nPC(C_F{iiOrU5Nam?p4zp?h{)PSge>r%zG!k1QmyGxnWrM`vQAeLdD!;Vvn zr+ajosQ)^z6HSw&c}keK$F~Kt1cDtY)PYMcFt=q0x&R_bBU@;_pgBI1xZZd#tp* zrC~X+=y+!~^eJEnK-@|Ldc#FZHtKEpuxUPhhNOpQIKaz 7~m~&P{mKO zf;Rdb*| `jiIr2_ZKb8jF5%L;$$V2@6j9fEwv?e zJEoP5>+dNhC5K{*^#}xVWO-n8-dhZi)UFYv#OZS)P~6UbWzn;Fue6QqmS{6QcdpK4 zTpMP&i9S;4=c+y~l;{x4DdA)~mhvDfyk$bVn8c#&t(aIbuTZQ07k^i!bQY}DZ7YX5 zL2Q%Se?RsdS=1YT*U{&)x7KolBiD$Jpbh}K&H%RQd{yb%`*H+3O+lDg0E15eF3ob= z&aLf=ETES5%TM*6AI_TxDQ=c1#N_jv0!FqaNdSgK>FK!;u2hMUQ5B{%&?8Vv s3oK)b5!^kyonh_o=I-y*X?h0eHP2|MAV3Vr3J zspv@^9VTmS_;0u6sl7x5916e$gZLQ|k%`K;2@2V}L#|D-lg(BWSL(7CNj6Fm@H)R8 zZ4IH5A(bsKh1uDe4Ut#^khWR_e63Lslj60gscI2$Ogp$KHke#A&U+><@Fj&yue6e= z`nobd{YIdGGMY}pb{i<_9`gJ>&-b(ZY3l--04Xh00FrC%+uZGFG1cBR8&+HZ9rF_r zPqMP*lw-NZLL1HOZq$ooXw=5pffMlD84hq&&1!Rr2j`Py@)ZE1%~<3as; tKzcaal$_LI6oLJ;PaDWIOye+F^s~hCrnpWV4WjHO=pR0e)?{ z<#dFdnPSeWpRXdB=Nu Ho!a7@YvYwlh^cA=IR*=9f>Fr3G^vFCViCD?8gCvu zipiN-1wJu-8Qn*YU?>tS1A3t9RdNJKK? Go!G_r~ zgL*iidTd~YAnRzIm7*A#g&D&^Ve8Y1SE!WEVQ%IWYUT5sFZ2l-<9xrRfFO=zjUD5< zKC(F*bF;M=7~#CK63vjJUlE4kyvDl`Z8ZORA-{OPtXsvi=^7sOOL)Z{z+pF!vt9-> z3~#rN4B|7-d;|ygJpj8|f?v79aJivU|5_r6yq$yQ a2QQs>`6 zef&JB)pzMoUy>eGJrN|b@YCB7 O?}Cxp49y-w;$V{BpAj1;)X(x(2N)qvOwVGD zbc595iY6THD`4BkF;qyxjTIey^@Sf{wo+FWawXd85@f;G;_s}$6KfgKF0ziNAiwix zKSOf%qH@BezQrMc()?TJGZ8={Z5 5n%Kg z7=s^RKPKTAQEsQ3Y?Xfo{TbZ1aTvnb2Z)|YMX8>7r4D@T;r%#w{v3XE^c DoxE3(nx{yB3{%sH2^%sz< >|yU|81W84rEA`W&CdHfc&mCaeL6BG&ZA}LPdB*SxyrYK8u zp}-rTgeuEeM#3sSmv{#ckM?8dfgRKoHd=ue6%}jIAa<;wY&lg6;?FPXbSY;|aWHem z3>vwo(3sr{_tNtm=_d3YzfO8Tr>+rxO%lPJW2!BkdrP%q=RWeD=y3Uay&Vm>w70L& zkB=POg-eq&ICr(gko)GV{N-MgzM) 12K4e69Vb09WkvJ+UE<+qgVMV>z`I9m~ z0Z7_$7MT#S`AJ?UE7}AkD%|7sDYfxjLfK0hzyQ&dOSBr8IsGPriAxyXv=3I_7_`Dh zj#d#?vOouL;ojj=By@?27=vi@7K^=V5S)(e+)T|RwJE4mlTkZ3Gy@jfBV!6@b8W$p5rd*zgV;s{)G7g0 z4=n82Jc @D#GwzNsCOgURaP{VY+X6nXk(~dM*Z}=nC#C%fAkrq zfv7 #k1+I**p)0N^E>vwf^OlYzhA|DQ* zy6xvMH+>3kpLrE-eUeUCn!PEfH8oM-pr_cLyw`+XsUXGQEkDu-vNyV{YY~kq&Y9W= zp7*T=(MEEDfeNRc%^sIjycG6y3fIN&3WF{ncJ+_URCi!2g28PJZwVC5R=z>jiojvS z2 jr69JLD5I;awkwNUdhO8ga#5DtP zrB!rhy(|UE^6y1b$yRqn#l~C7JO)P}R DW|0Cn;$5*N@@d!jJ!Ycaf0jn)GMLp}A4Gw) zzQY6_Q;^8>J~GgAZZzQXIq?ak9@&WfgU;Z!!iDWH Ip5+0ocP3RHD=+%R$c;%gUwG>jvQPJF>H>+~VH<#FI2Jr3{a_fUG_PvK9V zQ`hv CDcPj&eiL1a4QXS+-7%b-ccnE =TJLYIbWREpnXY`HA>!fH2lFH7~lqp)puUrj%CSQM9o; z O6?FLbsZhYwZ>MB()}%Oe#YfnwnX7MoQJaDi=`g zg3l0i*Fl(<_Ay&L&U?3@rNo}g4#s@03{ WbwvnJFPN@STtzthm^S(zl zmkGn}h-3*LAm$}bBuc^5uYdXz$PaB^G)m$F`ZVto^edGQBHN26l$+k$sSzNkqJZ1p zrcqXzF}$2R59cR;h0NF hB|aGO%DaJOXdXh@^j3E zXuTU?c0RoNBAs5Ykgk7Vvtlc4J4JKKj!r}xL_koF!Jq(OM1$KM-p=1E4sWm4qX P{7Ctd{MMFR#_NX<;mhB85hu=^#4qhBuO2{JS<>Yj=8(@YqOg{0 z*83+aauBkssdE-HzmZBSLeOzim_m{{3*g;KWIF7)mZ%eLbXwmD2I3UVeB>d~$xtF1 z=t>+W%iqMe6W~lytBk}xjeuvO8MQ^8m0U8eqEY0Y9c3!lb;52HHPP-$?Mp(+A<6cR zI+xh)7A_+dw@n4#i*MT5wSW+J!X`5ABz|)E2%h`q^Qbbi6kz<(V^KxnssSX?U^;!W zz*IF!Dx-=NXGn?;${pIf?z++$G+8+j&|i{{_2cLznF!TjmuupG&=+CSOqgJs;E-HN zM>c1pLFi2A4p-6g7w>)7@lC{x__5D2UW>Jb9RaKsZ?r5 }{jxC~X%D%+ z(PbWtn98^G1!vfZ12-{qle~w^xo>s>WQ;0if4ZvnGr3YV6-bwsWpw^2s|Wt(J1^kP z<0s)XkKwoX&tcyO7aw%6Y5 z+fo>uFe7kO8VhQ@TU7a998yY7$8FFKZ`-M~hh>R_no`_{_#G4VNCU_-Is+(!Wf=?3 zWXD03XSuQeAf~0?iDtcgzGGsfT@u=6cyC6f>a$a9=VT)?E#jXn)gXS?z2)opF%c&w zP}(^YB$Nh`#Hy9fU?gkc1A}Gk*juNj(Qu)X#Knq*nYxCHWee|=Q@Ai^VzMnq&R@ml zqkn^ca$g1e23tM*cXfS`z*kvQbMOIXE&mk)W;R=sZ!m%Nf5?c=Ffs|1W?A;*ac4*t zUquOlrZj*bM+_>5BGHWzDsZ$Uq>N{sig0?RC&Go m}`=QmrQC9`KjdxFvHBV#f)B(osnf!vpY|RpAIob zsY#4kRm9}S9=654%UZ!T{a$0(T5Y};o7ky65Xk7In4}}$q4)1YxcTF7FFcRd#E( zeH&?-o=&(Zvs=tU-PIH*`qH6lY=@{)w?r3T5X3w|{KbOc`kOZ|+(#!1n?sS*a)PSI zAbFAs>EzMHYq>UOzeP^LAkLz?K|}GBUR3uHXGl8EsxX^AuMPRKIFg;nrxAmt(>Bp4 zgLDr@5>W&r5s9jO;ZqFBDaELk5+O-Bip7zqVo5tpQUc;mn~Vy5kKrgyitr(3wg8V> zLeBWrR2f{vHu+jKk&-f*0!{5 a4T%$`8`r~e*7eM()DO-2;1%#xs!E!F0i0be6wuW;f9MDE?F$WqHb)wz<1 zZZ;bTXQ84QQ$j~wQLrli bR1Ykb*|s7OBKj{D`Mc;i@rdsg7!EHx-qi z92`ddYJusCD+v4IKI;5W%xW0 =zKX- zj|W|w*A~7X{p?<;uLvkTj$l-lJ1V3SfJrfsMNTE@)S)x)#AyO?iX5*-GH{0Wy^6Nm zRD ${+y2tEonJP-s?cQ;et8*|0UPhw08`+UZ&`S2Jga33R0>^w5 zCLvj5YU9Dy;y5zO#x520rQ@n0O IT(+6Q<2fwC$?<_{|C$ z^% $XED+D5xxWx}!xAlkyu r&c=;lSD)#U$cj(5prNFuYvKO^S|9<>X%8e|00000NkvXXu0mjf^CIiX literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/onboarding_back_button_white_background.xml b/app/src/main/res/drawable/onboarding_back_button_white_background.xml new file mode 100644 index 00000000000..47b0bf7daa1 --- /dev/null +++ b/app/src/main/res/drawable/onboarding_back_button_white_background.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/parent_teacher_otter.png b/app/src/main/res/drawable/parent_teacher_otter.png new file mode 100644 index 0000000000000000000000000000000000000000..963987635633d3349edccfac5d03a148cde2f959 GIT binary patch literal 15831 zcmV;|Jt)G7P)+ + rJ178w`}CSY=&x$b^5$iM&tELSdUvmSxP%)EK;{omi=>;C&! zfh7IhA9Sfu_!|9sgbpWe$PO3PV`XT5+jQUm98p!kaS}IxaYGh~3YaTFdsMAP@&Dik zIBv)?DHA5xs;J8-e*ib+hO8o_MUJR(LvF|#!dm18KyJvoqQwoVDWwt_Vwz5B(z*OU z6@I#eE={hHMZL|}cLN}6NH$kQI#WO{UqmXMBY;rgr%}UZ(ZgmnLaVv{Fe#UScq&WR zmq#{RfQsyaUax^(tA)X!g^>=8dTZBt10c&JN5F_CGMEY^Fg_hcES?sSRHe~p#VrTg z;BlI0K&~%HVg!y;7p5`kkIrACUay7Kq(h_EislA8JT5a#1Qd0h*LnjW72(;Kpa(wg zkKycqA8DGEtI5nP0mnZFD`^s*p=+K`&RIsjSVn;k{=K})``8KO!K)sunN%Ab%i*yw z0Xe<|z`0xjVLqa1j7-j B=%hiYXM!}q}2=G^5O(l}-8?(uC{ zlk8}KBuNwS%&LNefuW-0gI>pjp%oD1vZO7Fg(W~?o1Y==kf6^^&SXSmFlerY%!adw z#tZN|)M#lWhtsGN4N#zKC@ljbU%y&ICW;TOGPH#}YZ>MGlVnCOk;&ovI?&&sOoSS; zV*$ddd2}K|100+G8-v2-bdo<{nExBk(qK45&R=dGB>Z3lA&zwN1hN9IwJ;zrUX75C zG=+WrKD0ME==zH*w40j1?XcO&ESct`7B-=&bc#S0N0ETSnq+u9f>w%f+!Tq`k{!#W z@ BtTeujEsku_#F*ipUlA3 zg#WJ9Fqfc#&1RE_&1(GZ7K_<}CSN0|FfD@QJ1q`xwQLsYSj}wk-;4$$Ilqd=V67NU zWDzFkyq4@xfE00MBqYD{!(*+%8e%;$)6DdFyvj_x4&bN?Yc#Lh4J&Dj#emk(@9U9a z{5j=56)nOc@M812mh3oyu-Rr>dM>^Y(r!c>@a)y=bsKW*uC?$rxEyxa7J;=;V7?_y z4)xl+2s_}__p|m1&!tdHb{s(R^k8DkZ1=xcv0DhVq!oDJOQjNp*h%6%V#L4XR{uar zVRTv8%w%%4eW;zMLFhlux6J>WR7xhBU6t?nX&2TcZ1RlaSgUC8OGu?sn2W}c$*i0N zeDB55!o4%G$J%r~*^y!Haxn1hi^UTZDcI)!md@r8rbJyZmPC-8xllBTB-!m0{XIoL zOJ#-ku$hdK;dNR}XmDB3?6DGOVIkUFhph@ !)8Zu~U@W5tP98=~(7(As#0IBAG){`9v5Ozj6U0)T(N}5#dE0-=Kkttz} zl5w+h42GNxMv=f%{mIFeDuY^0y)kd8 u^CKra^sFe;f84zmt- z>}keBH+9NuTo%yN=E7}9+p(VPNE5@eysgPbna+&R)l(tGd@L6>8HY#%^tXCsP (;WO|oW`MG@$fX8Z0$Z`P zK-u@UxY12osJ+2KTEGsM)dUMs?dnRdh$9v*C6E+9nZv1I1VfV{3=l&cAalgv;@k^s zAil=g*aGjt*U{j$)_zvlfx +aY?G+5F1TaDP_=e*V6L=x%b+py+8(HBxfO z1Hr%Z-_(mjUY_+FIv(HCMzcCA+Tg-y0I!@M$4n$qiJWRjPeux*?>g9ln|8GdFc=W5 zG5GJxtHY)UgiVz7HIX*pdx#}m*xT;JbTEdWoS(v(;h ?ZVdxCI~veQo|{$0qA|Fx?IlZX%FGQzg87X@+K`!YuM^ zWeu_%9BeAQ^qEVeW&HTe2zGaP#SE}h$WCMxBrH6*jV`Oq{&X&niP X+2k_;`Ul-?awb{$&;{-((YVsahNjuC$;&|=C z1b%#agtQR*5k-nr^y06u=3y z(dAlpdJP2NMtScGr$*4?vtw_EPm+m3xzjHkW>-UPe*e+F26Xyt;;(F`ka vW!=_@feDm3}0!nsx`*!Wd%)~4r zkq|{BdU1Z)M`1J9OqzJS(pig0$zr7_h_&8<4i7A3dZuUNl*_T8qs4)Z$c_aF zN00FoId*X+dg03N-e$J|WO=0)tMHd-AhQ$+%#jutq)6fFbXe?sS9do)^{G$e(4j+k z@x>SM&;R@lJb!Wo4a7hAoV`kM4{Ml;Biu;Z QC%!z}l*+5m 7hf1@t*g*8}EGQJMrLy51^X>GfUy_`C%fwW)+`?nb# !2{( zgPv9|j`lapdpOD%BZ90d?ATTTbNAi%;NE-h6` &hP5ok*Og#DKOHZRfr3&4oyv!Wgu z2st{~iM5kSTFl*K$q(_9scH0BP)l}bE{5wND6y4Z%73uB=BR@Qlevp#x4mX@@5z%V z@ue?)39YTIxOnjbhK7dZ@9YTjF*}!#h=XTzYqJl(@R9eR@5qtLb(CT9w&1p>Ud4}J zIfYB)-|+Wx^s~4a=*cIalytsEqs6PQzKTRbiA>mZEzc{J>3cY18>MiZ4=Xvz?4&Lh zK6fyj6cFiZQ0+SsAY7*zOXTL)vsQ(p0_H8=9GJxAu^@$p7O5m#F1u*fGOHOPd(H{4 zXP$X_#e1Cey3=mPRsS3=j0E6z*>T%V`*7E-2j}0zj%h=K3m<>@9eDM`dCIKj@gjxW zpL}-*4)!$S)eGbDzF=?`U;p~omz 7HK`Tg^fiFhJg zvo3W<`XHsUvQ%L;;elact|3=gz4)esqK6}WP4L)Pf4I$*sJm%jH#9~IUOGR40NMO~ zySng^4?X~^W$9-)Re$fDM+rRp<=;O#F@&7ig%7{;HVKi}l4=r={iCW#Vv)28`zL`Y zftOPG%zrew%qu?6bun}C+9iiO*2HAiSk%-*#23pYVoOIUY-NqITn%$%a_7NLay|<< zLE0un90h}k!_;Pv9d{q;!=7E;xJV}B^xzciHVbaMc^{4++lv6@OU_*y#_Vi_z+%S1 z{XJ-F@!`YoyALN$U&iQ!A5Xq`4xf1UEx7;9i#Ty%RHB`HC9-1Buv2>Pksi@fi-ngs zFi0jTEFK|;S5MdNwHwLItSmiXlgBImYRQfTNH({+c3_&DBaQJu6i>c#Sq7wovapMN z5fw!+yV@J!u-UM`uN8yjV?+~4*vWs{*V%yno(>F9((b7j&mfb{;hx(M ZCc;tx}aOT1goDM5~{{8piGavt1eBj-8 xb~yQketPP7U|@=dCKNSeNjBc~ICvlyO MuRcb= ziQ+dt{XzWEfB7YhjQjE8YiIDeKl=y#)~DV}K=k3>TMs}@=E~=D!9}2w0&C9ZlE%oA z50p-($T=RzTLaVNw~UeI3d<~D|D$=0NQM27bS8&dqWN#Xe8-<)hY6?1$EMfj0hme; zk`0d#cfk%O6H!HIP&8Ozbo=P=!szlsZ6c=BU`Dd6L6AtdGvv2C`lAzg`sH)NVI0`o zjbH!N2XXY!E_~%{kK-S{^}~5^EL=+w7YD{L9SDg7d(Rz5FgiXXrsgNFUqFx?VU@{- zmhMitnwnsAxS=Aj@b|{^Dg+V*a)hJ!(JL45 bRx zPGWFm65% {Ke=06V6>2#-IQ7 zH_7B&kaM#z*pBS)Lraryp3|6|p2gtsB! b`cpkdD59`U!1PJ*bub+)b#nx(Kw%Ot9XeUk4fXAObfw#^KV1QJ3m=bjHWKt4d zRd6Ybsx(Am=_NwxYHz{=_uP#4z3Wc&bhhBR7f<5%KKEsuJbMKjk*|L75An+%c^3gA zjKBZpQ{uBExMGcnw*;A!#ow*bDBo=$--H2nXm2kb_?eqX6CFYWMK6OyunnC*hdCzi zmMw?SkOSM<;>10-bgg?mI}#w=mf_^Z2t^?)9aRf4qPvLBZX(Kjv2f&ZXK6MJS(^KNJR7FSpNpFV> zw;j1ra=1d6J~tb+D*$4$+OY4oTj6b6`OpsR>6T+N!dmC$H_mP9GpEiDin*wQ%xX4C zh|I@kMN3X}KP3@ORx3`w{1W`* `wy%Nj(Ua7 zLO4=;dE;`K@`tcp!m0n3t}g63dJJakLJg{pG?c}nul;%KK;ewI)2?5#jMClQjIIOw zv7KVGn&I r#b`F8nKX&p*C6-Lc_*u-_FA2t2@pV7NSj%y;dHk& z(*s $2TYO{{ZrIVc2hweKrVedwS9n;Tz{O4e|)=tAOml9X4(>0b#Yj-+w zcsyt&=i6k^QJ8M4naO3@u?0h1P33bNrKyUKQuS*|Hj_bM%8${ZtCG3hjBuoI@0~~R zX`<3=34^1J_?6%KwTDrU1ZHM1F*=S+YV8D^iL{8_?Uu5~CSUC}F>+nlp~AHq9;XiD z!2&%r&yv@!T)2c&Z@z_##3Rg1`{8gp;qiI#kxzaC=FSdmMmQSzqu>5T?57CmFNpl& zC}puQkD>tM!}!$4-c7#I#s+S&aC@w`UV9y{{`f`Ag(Gsk`wkt%;hT@4tFISki;~S{ zZE1Jd(L%|=M(@VHXGiiNRVft8n4SZ=?s&I^gba))AAL+->)*QvJ@jzfx;kOC+3N08 zyja-z{Nb~& &7%+BGPj^X%S zchG%UQBDy-7#u_?Hoc+q?P!3AXpJbg-iq%(_I*;(WBAz*eE_@m?OF1ck-;IHe(Mz4 z2`qaK?1R~CM!muydF-hd@v;B-IZ5-s{M27>860CHqqunHJbXl$?b%1yx5$T?7#S1I zGC4Vkd*AT@4(;niA#eqyL|{Yb-jT_=s&Gbgd@_W;`}@bRYyW @%MfQ&JTM#<%|A zpK$KfX*9RAkXG3Zhr=-+D%K;cHMj{cXKnAl>lhw>@4eWnXw(|g8bQ4H{7>-83onYv zX(Y#+dzRUq4(vO85N(t?IQ7N}Ob%T}vs25d#|@o($7&D;$MkFrFP)me&3D~{?n5`h zXj0b0WYTFo`i*Z> k|8iKEt{frj+eUi-O`7`G*8<-Uz#6o7LnM|4SU^hn3hH!RZ8V7eZ*F67@40AKt z0tUx|xZ_win#r42XTnS*2soa3@+rLc!ym%lgZtt3dITIiGoSd*qZqt2AfcjGyS2w= z%w^D*nnN45&X_WY*>`&W=^tTcYFeTq_K~{#`*8RD_fpuK!AsA*fMg;GO)(3*HcLr5 zFN}IECj8Nw=ihNY2p0=+MRzQjL2tWPiB2dx8jU9L+8gKbt`EKsF1L$JiIS^{MWduq z{zYc!(c`zk?NLBeubC;5e=v7>5W|l=h9o(T9i*w$y80D4ua#+OYm=U27fEASD5SMh zn9D$6&C<}UwA`MVm_ValgVNlX5M)-9K^Rq2jaFGZ4j>E&CW_onvm~sl@-N?i3HLvA zKU|H?^MlXe_`##!!=YnGNuwMPHLcZc%?F83kRR~K_YgR90oh0tddk;$mqksR5ovuz zev!Aq3x~^zaf(_B`2w5-a#<5h;X8-v K%zV-iDUu^ z9NXIhYkpcDWK{;q+1tH;FM4+M!9YHTTD`T$l_nBv_?Z_l_4->Vb9bP01_Mw05F E>70nzxv`rnOkJKOH0axn`p2Z+YfQax@q zQK)4z)@(Vzo_Hjlmu)W6>4GdvU~}NKb3+z`)NiP2j89(nYstvxc~c%6C8I2++BFZn zG(hJzLzRspKY0qe)*~1h^TSRvvW=KiR^wZhENP>OmtG@4`~cZlT>e(1$RajAg>&D0 z1kRpLI=ZkG(UZ3D5lFbPUV^?uikZ|I6eFXslu29BJzlpBg?NocFp|PJQInBqT3J@0 zQdZ4(wYssl&%5g95~%`aLK#`e#Fbv$K#r@m*gm#+jRFjQEjX8x{-)J7N@6A)I@w2s zX99y`a5PLuNEQW&mLNyWL#Cvq(S|0kbyeq*-#5Qi7k4mBg^?dWLF!+Fj=hJr1sp6I zgAtzH{b;@YIHq2EQ?!YWA}0s=Ha+ir5Z2} 9md_qOi&<|xv7fd<_lOq0sXSG0xF zX0j?gnB4c1&cp$Ryv{4)ctBkaJ(@ix*sR+5ZM#BqDV)0C7l1DQZr%mbXw;#>ZNaW? zFD2+U#)4*w1R8rA@>&O+%`KwBw<;y_4N{>nGT|@^xx8>Hdg511G@$H@Y>SlXiKU~+ zg+@?{&p=(yV=FrxZApXhpiKwj7#I#A5K2h+xLiuo$+$?NVv!z#hU{aBG)5M|a8}wP z m z;5pP)OE(|7U!u;r+i@ Q4>@9 z7Q2mp+Trqeg`nfe#6f-?cPTPx=$`W#l=ErjD5QbX_U(REH$VbpR@mM%I8-X`UTl)` zdv2^EJ;RBvPNvf`(7fa0R3J&<$;+N@r7ftua^-(~4qomkttHDA0$g64S{A7}CEvj+ zo9k$le(W@WT+hMVh;o-?UNmH@QBlQ8#^cmuHj+i0%t9Q>vP&(uq-4sS`-eaQGdrBT zaJp1jSeB3?N0C>)#X=$YIy&I=`Q};K#ljP4YJ3vsPM^U5Wt1 zPd*df4}ZS1)r(t?bRlnKPDUjf1m$b9C0bnoVO2dk8IdL=3=Up|Y_nJv_E9M-bq)p6 zB;3GNuQ!sHG8?tW+W>|E#dd3Vo{6_q!5{z5q~33fK_R9(9`wg2viBmnJ|Mp zLqK3AG)m@aHR1b<6W|W+X~EGxH`?6>7*%9Kir02~lDYuGTUzmMMQqzmG*kIlvdNAL zLMU<0fmfTGjXY4>Pq`RK)fNhBMLVR60$g!S>AUsXrMD&&G+jrQ((UOC?>85tTtow9 zJlFT^#Z}qj7_fGU24|6_MA~F%PFiU5HXdBYm?FT2!yzHJ))Ve1(AVk1-N$+ zc4gunE!q6>^@pPwG zu{(^KUI%7SNViu;$VbSTkm%Ts8Yr({@> zLeU}(RH;y!-{pw)wVD_lHE|qF+8A9%vdentZRFh6VEAMcV XHqpj!x6}m?1KB^$2y*C{noS`^k&K2M#v=IvSsJ`N4PHK#m%bT1 z5PV|`H>dp67}c=&%rH2JEp0FhNc0v4i%vqv>dw~;f*gU4fsr9+G!v#Hk|F9kivsyT zRq(ME5uor^9`v7z_z^XIN79)f{=x(uFEezgq4Ln7S2ogFZ|NcXG?M}Lv$n^?aGM8? z>e8E76va&NoyU66Pa0&aB?k3MT>$aAOyqzXB }7c#<6Bkc7e;m0jJ9IJ&QGN!I!8mbw7qaaqvW=2Vhn#Pydd z1QidKd$$`cw=~1jL~5Nw#8r?lwwMMzN!& Fe;wR$|MA`_?g; z=MQDDUBZRRQ-L6{&EXAyhPB82xA!k;Qg=P1E`YFk>1}sOZY4dKMADWJwQr*QNYk+< zxcXNwr4zy`udu8JG9@0DhZ0yGF&D!>8o~4%tC!;I?UZ}Dl_=+fKKh(Nv;p_} v^|uQ>FaW@_#Otw3~8#7sU)^bvXpa~ z^v?=F@|$o_S$p)hd2zj^?qHfXrD-Gwu#?E9$WRiqX9Cb#wB&fMWGAI@Ee+;$Brffo zIMeH(S=`y+LL)hl28RJ1_jJqygdJI~=wg$>OA4*zqj>s>R<;|2E#)o1uKFX=-kRG_ z^UhGM9{apc!PbdGT%AED*Q6mzo}F1^vk~@23)-3;tE%k?`8mUrscnf`_?` xDlI(2^pnYB@E+D17E*1iSPdS9Ml#M zT3T8#b>b?zTv~kcokykLsIF4!B%9v!y2y-J5V{y5r!-A|hi=|f4g14*{H046n$5u1 z)PiIp41F<)pFQ4# MKX0jNWh!9EEw4}ZyO;Ok2NPJ0$ z<9da`ks>l~a%L98V^h*{do#j(O>2V_KMhj1Yn&u!kh87KUK;F180k> uo)7NFfrk&G^KMFVkygmY zvZ776zxoee8^CK9$MNt-K8o*t_q+J?XMP1~l^HLb9>sKc(e6s}Ka~=J(4nzu1%zpe ze8#4ulo4K_{kaZha6Bo+N?VmGIIfOQVQ6$>)8JrX?d)@JehKEakh%cE&zv)|iAuL( z<}(a*u(Mi7ue7sVBs?+`k&34 x=ai^d|U}uopBs`>Mc4X zCQ1@!E*Ewr*`b}Ggw fnEeA2@g8jN YDCu|f>8qDOt+AL`9>c*jC2azQvH5QGb zKpG+!F5sCz`5toQQ#|;)A4J5c!lys>`_gWb?e|~)&3EuSzwuFg{O9h)-r*UXdHhvz zg74kmfqQv(NUpT p1ViC@zxOcgQ6`iH ER>rbT`8$ z>Ys?RSPHXO{kZtnTX^mNy&%!aJAUs&*z@phc hvDk*K~EZq^FE0{6ch2Qm^?p&iGLj@Rb7H@uN}61D_cNG z6 6KsZPMc6nYR!NFQvJev+=lz zZ!y*G^tYZ&6A^Z4Xp~G<0^2SB`4@jiQvKIc>H Uw>u*N$-gY=zJo6dkXgGw|p7{~3Uc5MeKCXcCc|B5< zR 0xq@;AOpt!8U{!#L$wmhaxMoiaE& zi|1dzLXlhdb#qwj`c@NVY4v&~Le`O4Y3}KkbtCmIYA$V{BAcT=u256eSs-e2IdSl| zTM-ThDAOB|Qbo-c0Ky^d6jABSnqEtJ^y$-RAhK{*cf*QmvRsb%D02FFoe*c%Wo2Ti zx<$NF^THjaO>(GZ=kCo)T>#-SPqR@&>RC<6uLiiAnzyvDnfFNfzkmD4y6@TD+lB^@ zQ$SLWFnFCF54v~n#av)^%S$RJ`~fnt+e5I`k|&=(kB<^()Y{}E7MVCA;&+&4NT-$b zgG{e-wfwVMXkD2~DuwJ~(3mMF<)Dz?MFEA)vazABiw98(y;UHe5RRsH*%?7qnT<+$ zehmJJDTG5IS^T5Xu75Gz9h4EKe9arDF0J}HcP#$gAACmkd^4HW4@*;tBmy+Exzitu zfq+oeY*JiJPtZR)LX51jZVeKN#ij5#mA tgKvEIX}o!QKpLW0h(r0nd+x?3KKzih zi*#(DhbULIhXOMg9a30UUd-Im-ipIFAC>;07KZ~(WDe7j2 x=5JRa!jCg?%&0=n!z^$A%BB@kHc1ZZMFMktX`^HoFi~s(cc-Q^MVYQm2 zYJDU9ET&0w1!rgB@p)jgJET)GcOV`g9+AK8-m@E5&zwSVVgmID7iqt7<|4v#v2816 zUQ3$1F7iJd(ly9Uz}9X<1HI)^-T9)c)r@BEO0&Bq*EmQ3@MltJ>^*=3M-Iu7#98v} z&z(AjG_jgpy*<)IexqV0jlst!9)1X?&ky2f?mU79-{u; yR5pX+QQYNunl(L1mWTs_h<2pftY_^ wt&!l0}YsjoEJeRscg1LA`3T`-2)<9lyCKkfT(69{9ky~y?@2-AXWXxRw2gons z(!0%wQC-Fz&1RT4=|g4-jJ){y!rAlE*0Pn%Tkr0E0q41sr)3GGnwNqS(;AN_=eHHx zsBrNQZxL23U7Ll{EL;lN <2$-G!1LFPLx z9R}8l0@;~OWq8eXYDp5dE`StBTeuu%SvHW3%_2B91e?t)ts@;yhxi|(1Q=gagLEf0 z7&aGDj=uadaOO>f1}@9KYa11d%_`s5($ G b`2K-*5!L;fE`_)9L#xElr%aN08+*%YPyGNRo zna$fwAQh)PjT;6}2kME&ILX)lz=M=<+eM};3QJ=Xyc7v(>gW%~;AE{aMj)G}bHyoP zS1RPm+|}P}jFW%7NzfL%VXl5|UL3~eqVnKYTl8Kv8C=@P_b00e)_BhOLcUV=sFG|t zb5olUURAhdfGiQpr)ZFaAxjCYkpvP&i)_?m CVG+4fn#}US268vbdjD z3z-l-d*Zx}=l%C1O#@n>2Vt< bM?v)t_}>!4hG!2i_MA2WS)1tSnYEA zr)W5Wke@UfnY$cCGRatMLmUd%&h~YzO~$n~^bytFwxXnRJA^e;AWST9P@(Tv(;jTz z*g >7EGC4#C^CH_z$i?JA2|JPQ7^olVcOYb#S|BGieAN zIcnVc%10*6#g1n(Db8tvK&C0PzhvF;W op~*vP#BklT!ZSVX{tfG6NChRooszCp$n1 zZBBU=-j9v9xR@HBkY;f#+|!Ez$E~Is2pr`mA94f+cFbaQE?!M y0+`?yO+>kK zeuu#jB!DC-j$i)3WCb2+jE>eu%JRAi42pBdUOgYOQzhBqY%VMLn2kIfqyFvhzfl#n zG#y^>kNAGMpNMvimHm8wrH$}0mC{Onzitzo22_2ZYtV`tvR;P!Yt->+L?{D1I^nMw zPTGlg>1uDL{DEi5jWfr=ZKjws;|I)qfmWjvGqj#?W0{R?G<>au%^+_u!2VRVg=iv` zgwwvzu2ZYl%zGUS4$cczoz<1+Q&(D&QpUG3Q8oh*qoLB<727P?EY~a4?t{9P#E9Xn zH8Xgoc__>2u$WiOFxD2FmtZX-EjVf5 {oU^RkEIu2yH%~Y2BnCk}+)`;8^+~;2C znU*B~j6q(#Zt>$5fq@A#<@J^4t7=jf23&^1 #YOAY5M%isq!4rC5ij zA5W&G_; 028o(f@*0PRaXK$QP+qdh{t0U+eqgBz z)7aKvS?Jk*9i^vZp)Ca$ce56$-XCih)&kX9TfP_N{#Q;$&VR||Q7Mx^T7_|%phhJ> ze^-vQjkl8i-?k^h{5?0^pO{I}L*G2x$j#j@50BMMggGen@332>%_Y~2aCpcY=NK#5 zOjSj-G7X&-%}}gpiHvNM!BJ0D>+owTin 1=V}!W9!~VI@l&Pb4bZ z#VEixQ&`V^MhYdRVQ+$>Hl7p~%9<}WHKIw0UZ|Q{zE@^dRnmIPB+p XS zIw*s@jR0ZI5eR27J)5oz91MyP@;j#dv+KT(6Is0RuxXJ$!I2K%JU<9srOs4l4298U zqKZ|#jR-{t+;6r-Gq6x)QnLjZ=x;p@4jkCkBprQz8icRoz^+ETc4}NgU+!8hQ5pFW zoRnh_RGn}Z{yT$&Ls}EPuB+^Z#beJ@JZsWoQR#TipGgqlm|^7{j&2bX%g->E&w`2E zJv}Y+J<+!OR9It$h;^F|q-8<(W+h2Z R5OlB*|n-n$WNYl &x|EzsIh$su>;8J$YX_8yx}Vx`hqT%DN0 z6#~cn4f85Fz2byPvwZG9Mt{>;i7_=B;P5&~DUkEY=786U)H#af^1^Nsa@}-rhXO4< zv}Stfw|T9w>+4? XYVsa)Xns)`c3ITyV8FNq0meA>Lp$*55p~j3p+E7k4X_-%1xGR@1y~880U1eydjE zKxV>mjMIC%2^@Cs_3!Y*%<942jp*<4AeN+Xoy;Nw#6Z{Qq`|b9l{#JSo6iF;{qqR~ zstW1G1K-wY7Z51t)61qxyEbtR^)23}=gww@HwEHe8=DbsQF(QIn(_{lD_=`wVD$7t zXCtaz$J>Uap(^H;wH<2!g$G?4=< Cc{ zi-0J|od pIsGV~d9ZkSNr-AXGZuF