From ffd1d6e204fc7032a13216fe0c6dbe78205b2a98 Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Sun, 18 Aug 2019 16:03:58 +0800 Subject: [PATCH] View messages in ViewMessageActivity. Use LinkResolverActivity to handle link clicking in CustomMarkwonView. Fixed cannot load user profile image after the post is deleted. --- .idea/assetWizardSettings.xml | 4 +- .idea/caches/build_file_checksums.ser | Bin 533 -> 533 bytes .idea/caches/gradle_models.ser | Bin 267941 -> 267941 bytes app/src/main/AndroidManifest.xml | 8 +- .../java/CustomView/CustomMarkwonView.java | 33 +-- .../infinityforreddit/AppComponent.java | 1 + .../CommentAndPostRecyclerViewAdapter.java | 22 +- .../infinityforreddit/CommentDataSource.java | 12 +- .../CommentsListingRecyclerViewAdapter.java | 8 +- .../infinityforreddit/FetchMessages.java | 25 +- .../LinkResolverActivity.java | 9 +- .../infinityforreddit/MainActivity.java | 13 + .../infinityforreddit/Message.java | 2 +- .../infinityforreddit/MessageDataSource.java | 123 ++++++++++ .../MessageDataSourceFactory.java | 47 ++++ .../MessageRecyclerViewAdapter.java | 195 +++++++++++++++ .../infinityforreddit/MessageViewModel.java | 100 ++++++++ .../infinityforreddit/ParseSubredditData.java | 33 +-- .../PostRecyclerViewAdapter.java | 3 +- .../PullNotificationWorker.java | 4 +- .../infinityforreddit/RedditAPI.java | 2 +- .../ViewMessageActivity.java | 230 ++++++++++++++++++ .../ViewPostDetailActivity.java | 8 +- .../res/drawable/ic_outline_inbox_24px.xml | 9 + app/src/main/res/layout/activity_main.xml | 26 ++ .../main/res/layout/activity_view_message.xml | 81 ++++++ app/src/main/res/layout/item_message.xml | 34 +++ .../main/res/menu/view_message_activity.xml | 9 + app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/strings.xml | 7 +- 30 files changed, 939 insertions(+), 111 deletions(-) create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/MessageDataSource.java create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/MessageDataSourceFactory.java create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/MessageRecyclerViewAdapter.java create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/MessageViewModel.java create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/ViewMessageActivity.java create mode 100644 app/src/main/res/drawable/ic_outline_inbox_24px.xml create mode 100644 app/src/main/res/layout/activity_view_message.xml create mode 100644 app/src/main/res/layout/item_message.xml create mode 100644 app/src/main/res/menu/view_message_activity.xml diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index 144d0da4..dd08719b 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -35,9 +35,9 @@ - + - + diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 38cb74bbe8ae603beb5bc4683574af38e4704889..4b09346aaf002918beef32a7ea78c0dc728410de 100644 GIT binary patch delta 15 XcmbQrGL>b*43b*43-($>*_bosbmBIFwO>6 diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser index 055c0fc8147e3acd9ea2a586168aa195c04a2081..e2b6be3f85659ef1304f97b0fe93fbc11b0bafe1 100644 GIT binary patch literal 267941 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 TYo;PZ%NEK}D{0+R4;}wMUC?dk literal 267941 zcmc${37jNFng3nWb1)pkeTWExAfnQh_tkhX%nUFv1MCck;(?J@cg<9Fl~vU<-L49# zD0tr@iiiiY2;u>P_u{&%>n*PL>Y}3KuE*aC+;w;L{Y74tS(QD{WLDO@`k|-0Dl?vp zCnCQ2M8xwvar>`pt9#wrW~be%vw64MZn*V+yWQ;78?MLdvt8yky?UqH-r+g@dT(jo zsn5^W9p=n6@b3ov>$w+&-)?QYUb9yV|2H*No7z%4qP29^LZj(k#Jc^4)9A4Iey?9U zbjuF5iwO(;MpM|*==IOoQaiG>6yAOo|97G3UBFsizjjFK%B`$(#$pH0dIZ0_&hM_T z?{?V|FJkfP`;UL?=h=-bYb!R_R`nXs^A}4rsQSdp2|W?e6B<{{6YG*PClM-NnvR&*UZ44%)pIKM%!!Q~laX*5MCw z?l?*dtC`W+sz7H@#W{i2V})G2)bXBMdm-27L4leQ^&B3mr^)7Lh3)+=T7+weU%O`X zv3GTAPuaHzZt;e!uMc}e>N&X{@V`|nYX@CkdqivLk{%>($A3-lQr2ytakry?Y^fdE zT8eItdPcuyY=LMY>RWU_u~L*z9`Q8__ckkGc@oLhr04-Y+6$9N${n zwAk;mbG&)4%le+Xy}i(NytC14UKiag-Fdcqyq9Iv$4fb2OYM=Zr3-g?-7cP~x0TH| ze6QEPh&emiEc)LODFvT}QQ@(96mxWI2^Dh}oc`HOwyWLEKGtEuw|uy4U+VR})@HX~ zJ0qxmW4`Y-n~fbpyW`EXPDAh(`(AgRHNy)dB}6)lZ-%^et)*@4c7J1|dlBo;^=k)* zPt|A(XE&N2E;y>SwB2h$qUS~p5vvImJh-)#`Y`AnhXidDeVTsysQ0Wx=eBrXiJ!P0 zJ#jtz#PzVJ3_Wq!OKK~E-n^={wAqbRjVIaWF_+ol@D4s*?DT7E&e^tp-&Ci$c_Yw)Yp@Mmu`2 zp0Ih|Z_GFPO9BS&?x~uX96F^{_|A$P24B(jzywI?bqptEXy@+RXdZ`cC6g z^teWQ{_@&^=&r2iZSOQ2{mr!lT1y-@8!(_QukGIgs_ZW7E^X#b8a*8E*Fh7nXPy3q zojyuI-+f$Wyx5$fUN`C>sSDBehd>}Y$A%{B^}_CPbl5!tyl!YWdA~rRVLu9J9F7pK zzQYHIzL-Nlsz#vMV7LU=2Sbm4c0wR-L%Y>MgIvtI7$VW7c#4gl&lZ~f4Q=RpwqKL? zQUg?dFnVx9pEWRq@q`#V8<*x;tKppOvHk)e9Ek-5!m+lo(emcGs^f2f%k%I)h#o3Y zV0|y*N3Rc+vjyEfDPV6ckh&0eqFV!!UNft_HLZkI7=(EK3s}Fg%j0Tx=1||%^W*K< z^W1b9{hE|{ess?mm|d^a?lth5S`xz15{bowK*&YSh1te@L_}yQi?GcA&}^V+AUe|s z@zdb*ZC)?n=tW)6Z!AXbi_f<=X6M2Buzlm}(fc{`H}`rANn7zZ!#tX<-Q4B58$Gbj z_2!*M@_i1F(6KO7Vju-=zSymujuDv{C3_j6f#wF(sRgh8l`B4S)!#lR_!NU(-p8U+ zW9x;V`tjM9`3v=BDA7QMChU8`oSiq|Q zP8|fDwY%Q>UeD_XpP?%pi2m*MI?O>q{hE?#=Vb@_DIDn0O=#%@=G(l(L&;%71kH3x zE%+m_cp|%}^TKXTN>@D+5P>^Y+q8g4m9@iRIdy9X2NdQuMt#%#LM#0x*u8e+=I!gx z+OlaQH;8mDYPQ{mK@ii_2?12!+-fcKIr+J@cFJ}S=0X!zntOJ;n-n=!Tk(wATD-_G z#JQb##4}Q_-wSR2N`-y101Ghuq8>a{^u=qx`m~!4?LEFZg@@**-wGHVqwfV_ySr29 zG+Ez=++J*uOv_gMYkda>BX7N9(Ke&^@8!KB1iB60E_jp4W?if+K}q!mUY>+!nkw+x zNywYvM4;r`x2%j=?%W*1o3<VJXsBf|dUW1158YDBzO10Tyt2{D@NT%2H6zrA^SkKv z!}*kY(6E)i_|4lN5za>jW1xm+*Y<%En4m3-iK%DQR_*kbf=Ua|sIA$RJd*%E#G|b? z_zj?1?eea|zdI98a6$mJU=BGjk$R_WYIXWckoV`9}budA=BC>0* z=wmi>MXd3CFm|(#81+%i<<|{88G6$ChTFuH1W;~w2QPQb_`|o|=vS!ChS5(^n+=`L z=;x5Y?X=M^xWPByfF<1<{f?Vr(HxGC3a%KKxY^!)Y<6gm7J?^2KOg-Zh{Wds26Mi} zV{M;fe6S7Q8IFZh^v9hz)OW(Zgcr>@#a=YMt`onmE=KzX+!7d?Bb?gsS`WrsB4l$F zLIOi(uVT)wK+KN$#{apDD%ylYX0H`FuNr0X!7z}64s~e-ySPe|Uqy!TaWe6xdv_A%;JBK1;weko)F1YwWYu9qk@TB6+ z5ZK|gxl*EmqmpSnoKg0vDKt#1;L>^~kx-(uhkAxCMsRR`S;a1g0{)&ld%4axQ&t)= z{!6zaHTKt+e&Br?_obV1WXxMHy6MzA1GPW-fm>hrV23xunf%8F%%u10Vu=px7|Dm{ zc4`mY`tp;OnIVT0kn@lJ&3jMfcRW8R_JUvBe(SPODQO*S3m=O{%f{l(z!993PXnez zL#HKBn3-_#W9pwoPRUnbtp7al{LOexx*UFBHK*ETIS!Sy+2Z;TG#az9DJGSe=cZJ$ zj~2<8Ek44h3!eYCzg%|eQo?fR?khSK1$fX!y5OK z_i-~Rv+uLDw-Gn<8upn=AA1 z`$X9>TRctLkS0%h_cdQn&EO7Z*DbrDRbmFsjY=9LC0=`B!8AWgtR@6SQ{b3Xxn*@s zqN0R77b{|f5hXS>g0hx}!z%v$a#XO2+joID0taQAkm5iIh=q^4PXH*}j+v3)t*K?q zs)6Ug!9$({u$MC4Eu1LaD-OOqv1@1a5w6_I7U8g!a;!W#@IZwh&*0;J?bN+kOatFs zSX+TtPq=~}I^it9Z#?Bo3W*sn$GzKfnM+YR+%H3)*uk@*CM(_$_}E^IUYl3%<8Twc z+6<@PE}VMc3d zYS!Jh1J?`&NBCI=*Ae)bhrZeH$m@FCl`@E}*jIrJ|In{Z$x>Lkz?W&oTk*~DwMVR8$-l8WSP^|(^mbmX z^Wj=!OC_mHgHjRCL&1h=-2E!4Mm{n{+>N%z?u{9CI##U;09) z)9&`cY3_&4>wjoi+i%{wUW)yM2oFxgQY`D4m3H9drKkO|)?n#)adC0Z?KJweRju%! zX7JCN-4 z35zA1XG+*Oak=}j)m_5I2})1fIGj_#TZ%h|?rT)gc_T3=11t|OAmRP8Y2InOaQNr4 zVD0dLt)O-r;Kh$OzTH5$P=Mp`%g~M({W4_r$zOlxhv3k9$;D?+n+Qgf>L%|nKf=@R zYnVeSfF=X>GuIDzNgd(2%=dfz*K6p$I!<1sLK0U?8!n0h8AX2<_K z_Z$EAnbUqcRfCW9+7=>Ob~U`+JQ8a=;_ndP+2`-Y^-283c5gNaJ>ZXy=#6!)t!ziT z8-3cZotd#S;pj`nUk(@#DtfpMjD5Hwy@x z@Eeg!H$K|GwTf z+UnND2m>65gB`RYh;&%-3v?!g$F7h$yMn(~;V-m2|MSPehqvRB75vW!haJOL;Cc6T zu8}dlqaF+|N5kv%W9q%h6qG+sCz#~lS12Y=F zoQI9@sS84XF}aC(g&?0yND6;e=pM6&jg20HZ_=d`FaaHKUV3gw z?Q9equlp%iUHPf=f-wm<%&>)qT8_8N%rbBbA3loM+MGm4$JI`?58}rU8)~1m=*|dK z@!TMqbG_XFwBz_RObVd=0sSyXL6nQPzOysdKL5J2^XzWBb=JZ>@&H`SdOMSuUoaET zo6^QX|KSw-?1tBLg90%^LJ)Q`aoH9vZbWh1T!H8ai1mp&8h^~8u(=e9hnsqE z6IvN!1`}}&qnbk^ zF)a9lB!Q>uzV_nOU1uN!$=JvK!(ZR|o#&8D=Lwce2E8K)Fiy1zdJmw;V?A0}W*Djy zC>mVv^)j)>Fnc&7F#S)5h4yROzE(MX8`=}C6_qz6AHz9)Df-Y90EFjFKIJ(UI&)YZ z*;@c+lSh2X!thOyjFqIM!-fr;QVn_s+8aX^Gv$R&{Aj@#fYzV{PP4e1XEg-g1&bDP zA`@M(UwhI%DJXhe2u|OPr^O;u5cd_rEqq>}EC})A;|rH$UyK;|5yo;Z4&QliSpD3` zfLg~4OgI>oJ3W`jyQALUZGPwSH~sJlCvej(p2i1;UiAIPH(v9mH{W}Yx{`-$?mh@_ zs6(Ta6}82F?GbqU2K_2{mqxhe{XI}3UZ>ZjUZ>I5WN4yNkb)vkS|{jmJyjb)z5A__K4^o7p? zjt5hYNJ-GzIo|mE|`Q$ednV792RIrYP`@o?JFf~Ly z@oA>+#?4Q7J*2OAFdqKzN)7)gVTZtT5@A@k!m%+e3qFsFotEoT94r@#5VDUTWF!fa zV;YhoGu;wpN0J@QFcsgIm|_}+<1))qRn^f%Z>SWANwpOZB2PT@rylYBx7>dyYWl=X zO~b}UPe&G~at9hYFnH|ndOn|;I*I>y4F7TRACK|4Z|y)oZy#Gf zp`an<_?oBKhQdTgX13#@NA;I)j@a`oHy`wU!w2A83rBXSA~)C9XbDCD2c+w!`Mre0f8Qvv)>js0QF5Y(Cfk$O@^ZJsy3Ck8T z!qJl;LXZ`MDa==xY1*=6yQ(3%GE-gXMYmj2b{#`;RK?HU%m*>jDP%|0o)3TFY*cAF zsS@itb9i-hJ#?L}mr>7j*Ab=R4)lT-yyRyXSE-9p+~K3eMM^p#c!;2+FTdtlT1HcE zE2*jEkNbze02N>p-xsIB1s zA(cJ9anyTIM=hx%){;DD$!U5s$!`O_4S=Q$tIoDRhukHH4&Ri~U-D(7zjbLuDsNnU zT(+~lzoZHiF+%cNRD}$@6hZZT(PDW-OQX#L#>SAymHMc3fQ{gWF5HSr(PL+(%h zC)2&IDyEyHNFkCFamiCGhA}6*nxtAD-e^oweA!VAUo>?CJxpYZ>)Td*TP~C?yW_QU zc`mnBd@&sxalF&uCvpyqnHG|`6 zvZ?cKu*1c ziaoyFovqKYmIDu={!IMKG@qcx#=lfgs2kVz<)6R(cqk?Ba+G;cy39xo*c(#TJ<)tZ zMhkB(riFB|LY{22y&`a{2JdbtMKUc3rn0HIBC`$Awq?bXU?ggu>iTYO3FrgET-E;J zmOr9Wk4;M-D5@FyFMzQlO8VjpSA83=rsP4ROM~9g3e>`X%s=t5?RR9f^13Rt5(x`5 zq8g^g6i3EvLbOa#Hf7)P6~z@@N!C?9!B9m_G5vu?qPugn(YdMf7ii-#`P$&`{ybHz zTl3o=!3a!L!LJ+E!xb-m%N-d#yrK#{a7m#OWF~8_qsWq_%9byB=oPSob;&m*=Gdxb z`=TT=aiE02kQwa{-}>SUHbMi(&3ni~>(_T88^sL&A!F{O3?>KhPndPZu1lr-hFe7_gF{8@{h{T)uG*6CH%eOOjW7acTWEJr}&TZZN`7@P($Cu@ccqtlfo zCM%L{=#C|6rXjnEnYj<-%g*t>YCd=(s{Qy>!{Yr!_}JY!5j~M$aQ2P99GL2 zZ|wao3?zO5?mjZ_?twyZ|F2g5D7$1*u$SZs5V&-x0>ulCYBNp2>p-@cW7#rubxF2t z$yF?mFT268Ru#|pgL|L|o>(!fi2uCBdK#*7Ml!8+cn;kzT4U|3(y~%8+0U&`V1&aI zQ39@`IzeE-~K169wcm>#XiV_ zUAGsIEziT6%WM-X<}+@ix3k$@2$o@I)Vek3d9h-D{^u1(gGlKMxi*6il2>G`&7iPX zU-ZzgGTOYMm^PP{BBY;32xJM4Z9`SMqIt0Db6)eAU&Z=fFj<71BSvM*(HbA461 zNePWrgJmb(c1&CK6-N{$-*zz-mMy*<1;%TP+q+o9OHJ{5xtcleY2SY(H1k;G_wIVg zaERo{SfF3zFBN$v{5M<|j{z2UqyKs6Jy?8N6JCN6j?60|P)=aw0iEC5c;j<2`YCAV z7axG5A~>M450Bo4hZjuP)uwDaj)5t+?upoUF<@?K&?M&)mW3Tf z(U?1006HED7*gT<$mR)A zYZ>LdrV{1E5}^|a5wL5AO(NN7F@4f-`3zn=B=^0~3O0C<(qiEOre;o zj(Tk5Ci@)AY>mKA~>v|w@eEhd*$o@ zDV(_sS1-JczXeyW3Y5%$TYceIf^f2dgT~#HQ*ihMv1WZsg9$204wQ;zIP_)FbWPF3 zQk)}UITFUY;n=d8r`fQie3jnyA1l8Nm4>cbdspc)I-EWCmX8Gf8*vvIR@!r}KKVD9 zUip^Fl@@Esf?_m`ZHw8mp-8^T3|Ya_rL6ldY%AZheM!XPU0O@IJ?)!cy5?6<%SoIt zvt7@d@3!rBe+GV}^L=}v$8Cqv@%+%6Kk@~bQ1L~$|KRNXK}W)5Cb(Pp{MkRtsO4qF z)RHY)h^2CifiFxst|j@dD5<_?!;1w7#M-2xnvN_o85TND`GK+NCiiiZ0sqfVWxjjK z`<{ntq}T0mRKYF=Hv>4z2j?&N3;cW^yevm7sdxNtzsCp81=&kc-k}^c(K>5TUZ5DR zj61iRfB0rbD{m^MmEn@%1&|fbCoh5n2LWcPSh9oR?wB{0X=e9GQ8cM|T9q_(QRhrXE(G{o%J~ zl=Qx0O3HiGAzL6Mer!<4SmRb16X94P8?J$EKt+;$SHi4?`JU?=mLX$!8M%cF+ZBT+ zANZ(V1Xsx5G>K@jY;W$O>qAGwE#cnbz)f}aklQ=l7kPZ#c`OLP$N2%=!M2UrBR&Zn z5aHhq|6I6^2FGt~i(PSXB^=T(TCj0+N8;U$hprtCpVobiY>FN-jFO0+5pf*{4Lu`V zX}RltKkGe?Xpiv5Kxz3GA|MpheK?n zz~L|9$_xM5I9>eU2_hHU$e)~l4o}-KdLr`>kO{4A=YAtjBqAt;yN^yCd-bpXv>u~n z;4sVGaO*e{2|MV$_DuW>IzFJH@YR(w860N$y^*iLw_n!55p(M@SE9tDlV#RSi9AM; zJEDTQDC?Rlp0_(_dbplHZTT^SHRt(WaI#Rw{S;#W&VVp&EbM?_ZOn48A+G9p3tJAR zADY0O$@{4s^pH}}#?P;Wkf|&PkE#e*Fo0<*siJF|SRb}6&6FhU(!c{xg@X$wgqSR; zux>Lq1M|4K4xJ>9t^9~2yLx5pz$l9y>@%+wE-#&PYG{Y5r1Jkys)KI1;=$lY+^f9m z6&ax<9+63ctuXKs%Dkj{nHY_MLOahr|3N>l+ZENz2|5X;-uWy0ab!jzfWE+)#OfP2yMYTK&| zKc}=1RtZ)H2O4~eZFrP8s%B&9SQCBIbY0VNJ=0JO4HiA-j_~Vb(Oobrsv#L!>xxN6 z$;2e%a~~l&JiMCnKiJ-C?R6PW4>xh2qsCZBivt%%c#I=GqK6ESB>PtA#Q=< zRvRU6Y}S>jPBp9}Bu|8Ogv^9>;?H-V7B^ZM))8_hz&b)=rL3c5<*{z+kl(!xtP9fF zMgAWfy+&`&Yr;uuTN`N=Jol`2zu#_cpYyyvUk}3qVKjA(cSUZ#k zLeG+<g$g!=6f7E>qObVabap`;_%1t|?%3RiEsupIcE5*p zBaBv-ufSo2(s2+q=8CeeJBG?sm2u~Cks0tFg9nE0X&RQfvHzP>La+)aRe(cMDHY?8 zk~by}sp2PR`jL_+fJ0Jdg2P|j{(d7KImK~E%BdWOq{IqwNXyE@;hXNd|2jY`eNcF0 z1=d@LtmmhK&m_O_eT6vw-5O@%m7hEf$)(oD7o*VQQfv6bg+@SJmnrg}Pdxt0xOt0% z(ZlYUZ(v1RgX^1y2r=0;T(}2{mIXgcgXMwoJ;jW~y;MkuD-J5Av?M4NLQLQ|i|91$ z-n*VAsxsfXQm}!;B<$VmK7+OBCHI4gsrxHnBdM2)*+|J7lZ{mIlVc+(c>-)CWhQKV z;&DITKOQ{A*+|N%oQ?RcVrC|}=EnQ8B(MEFCbN~{2wq^c?gCM9o7U{b|T4w$6m2>_FnnE>;8 z?fZIpV3Kkw2PP@8LSWLe@__j~@gs)-WP`jqtkVJ1kWhDK@LOo!1o=OPX4QwjVCCzO zfFZdQMWwQT#6?AHJYZ1H4?bq!5jSLUFp5k<;0PRXMeGQ3-);P+8zKV23{68ehCDD9 zbbN}8-^F@THDU1EpdNxQTbhQsvVxdYRfB_=ip56JWx9v>edHMt5kfDivOKsuG8VZu zD*zvLKJti6GcDKE|hk)q#U%pb7IKafKh^IdH7cW5Wndlnaf9UZ2>19LljsAtZ;$|y> zIn##kE*!sn$3pxCys2#)=9Mcs8uQ>_n1{K7j*P=kFGMv9)(PROXV{3k*O7h#f#+Dj z6q(EOw;>ysteOamv=MSGd8!}Z7Ay`{;o%}uRj(RrguHRFMif6mtWlCDfi+5Ig0(My z<0-essm7$HSeZ^>_;FfQq2Q0MZ>j7>se7D!N4G-BW;QN9Y z9gt2ke4Y^#>2u%@gD^!zq~r;pkCd69 z@119yc2qoaildK|Q#txbi4~%cmX(LTpZrk&CD3ITyI+KdU(5!6 z;V|M(e8e;UEpDjdh|_IEzuQPQAu?uKJVFxb5=?k3i;imAijjx7f@WM&--J!P8WGkU z)k0zr!3j8ea+lk8OzApSIja>-k2<-ik}?INXZjm z87VVi*$=+<+imd>Db6xdPUS2kC058XT2>y*?p(Ng0W3>pdyWv5Z?!%7)UWKoid%He zFu@K!>vzwMo2NLzWMt4mxG9o-Ay)(TS>Yj!l-Ag41xtLx$D;jc%th%u(oqc}c&REf z8YvcXW*`x+ia=?YWuAi|eT|!9p6>ey`+yf-0FoWC`4IDg}A3XN{ zxi2x!uJ9Vpu9aKj3FgYJ&p7w^kH<|^oL$K6p=zp#yj8A*1T&70MA4dW2JUm7=i|HKF^y1AerjbHF*fW6_w$eWI40qs^o1y95C_Y@h@m$1`7JNL z?7!o7D-JcouryIeN^_iG!(1G9pd&?;k1$j?-g5ujJgB|8n8#ZJHU8W}x>jM(nBc0q zp=+XL=t%ox8Mf>Nt9BM5H?VkzTsAh+z?n#bm%cX)7OMbnqy{R+8zpZ{yivtZ4sWF7 z3E+*Cnc(f2pPl+)JWPt?jg(V4-bjfR;*FM-hqrg!__z(=QeHr825)gd=P>53JLTyg zjss$&8-mGZDj@d04;_4L+-N1(hI6No0Lx%FElI=KT{;f5(6CO0q?!z~Jw1 zRSDS^*IhvFARImC`p6fqGQ@&;l52Ppj$W~SN3tyoCmA8hkZXqlu~8Y72gE|i-ZfG+ z>j-({vW_Tzf~=z?Pl9!n%!GA+ZtVV5JZws^j*?S7>nMp;vW}FM$GWS{7LK~EJt47W zde3d*Jd>I5pJ~6#S{}Df@>kTZJVCo2j%&jgqrgLk3QWwpn?H1;_N}-LOQ4TA9$YO{ z(-4stRA)G}$8~L_t9Fs|9Ijq@=)1n8Sr=AI7_MEk?1u1vJOfV#0C!i7#?Hd@BE~1^atfma<4h2uw_AiXlSKM*0II5{O$=DSPk zqhk0`^2UT8Rs7`OM@pUm{79Jz{2HH?{v{qX#oPX2GKpiPFLER(PzUQ^^h$)UbQcmTlBPCXdI$Bm9>egIv z(hq<-amcV4MqO}5^Fkw^clUg$_FJS?AL3nf%P{ob)4%=IaT6AY9^Zd3knP9-UrhME z@vQ-*FUN^{3XT9{xjt|OQ!ou_Vi;OcwIcH2*g72T?PCu@R1w;b;8)Y+5vL-O5+mx> zgO#V?NOXCbQYzygsh5iRN68zLe^l|4;~yz`0{kOoCj9%v;Xhs%51!)uBjr@iKT=|a z{G(;%@=rIv0{$sOqduR1{YJBwkHB?14?hscL**in-!)9ZlislHJ8?r6ryw(B#W8e* zqB0!DibzmL_bdkot}u;n4CGF9Z!5V&k#G8i6y!CFK*&#(FmP@&;!<%6xXBZZNER|J z@iYK98WoM>BAK#3GT$8(R2d6N?NrP{O5T_(q>7&$3rWcnU?C|pVd0~0dDe;X5Gu|> zQcmS8BqdhJLRwZH3xD4`kEf%v1}tpgRK6vr>ERTw=r?|Bp*P=a;2`nP0Wb2>P=-BJ z?)&q1K95|*c{g$xPMsUigQqtCY-+b0w`6e`BDEaywabpBBT=zyD-zDLQL)6PDvGW6 zB95gVbuIo#Ss2D@z;R!r3dy*wC<4|WJyXKTI~rCYaAugobQ8~sIWkU`RBSCcPh3`{ z+_Ez6D@p~fdZd~vrXnS8Oe#{vPmYSD~cdohag*e+Wduf0_Gr^yAz3_&E;wCGO zKhp_}F5N^pg$&l{*kZ5&8v|$X;h??T8SxuS;xDX+kgX1=hnfqrEV{BLnMfRf6Ej4d z%PqPRatFx#Bjz$2U^)1o%eEO!(HH z>-}>)Sc>zFlv6q1NQo8ljh2S=XQbo_@Qjq1@a&c!-gr$sNQ(1}lv6p+NQo8ljFy$hvlo8! z=mvOp3Lo7#>bg7MhOcpCyiNCT*epMSS{*%d=U?7>KavB-kz(PMDCeMbIRV^)Q+80m zngez}K5n|=d}9)h7Q?|_I9^9%n(o4F1sU8-W+J%3K!|GIwDmQ``4($H$Y=nIcBp{h z;{;e=b|oZ4;R!Q+#Ca&HXqcAGd`p4FCc$+D8!p+Ku~3JbD?l8nf{GDG$r}@KRPmET z94UDMh$Ceti2L2wcRec}C&dv*%BdW2q{IplN6X4X+@62@^gTdRJS-RMLAoS1>viRs z)UQG6%xT-}Gch?)F-{G9;8#BRB%BB_xEkdh5iufNUPQcu(q%0?`3dij8?-q1WDU`> z8ge1w^e)#_FiQ>A#AF+(m>5DV^1xR%vTRU2A@yszE`la2iecg)2)GO~oFt~2ny&bU zgIyIL5pRer3(m7QQU!!N6_H{q;2^1yiaAKh8ZQ#l7oi4}5?mX*iB>o5JnR&Z+&MT=On*_JoopGkfR5_!atq{GW|pE%++KyYn* zF^U?b5sp8M0Jttw(1vSIcxl{}B?#!K2A0KanV%sB;|u1O2VY@Kcs&zaxqco2ZzyK^ zB_xllAtb+KDk5kO(%~7RXDi5MfcQ4u*KE&bnk|bG4p{VTQ&kvT3zPc+KLlsQ8m)qU zls2lSA0cmC`VqxXkbacpNzjjynb7a;cc1#nc*vBXA0?-H`cV?Aq#r3OkAB~L|Ld_# zmkKfCXJO$;i0Gfd${8l!_Cx+2yRvJ-OK|fbhBo{tUcFnn=i$G3@r7}F6-S(pDI~KP z&WlwnPu96(3g4r3T}ww@z1&@ivhil&lMB&5LA3=Fc?%%iL%KSKTg)pOK<-zQh)t~q)cw{7oOX6UW@;zxbc6l!Av%PzsZ2O6~iHDvg9vbm&!+s|} z`Sm--@HwnTi<^6uR+7X#Fjbz#;!(xX(st4eTehO>YlOo zuRp-VHoh1|4JNknhl7bNOs04~_rCvdu8v=9#jQRBy{b4d!c=r*oO6(~1W~V=3XeC} zS9MX!Jp!!k#5S&mko=O-h=3Ro)pN1Vs7Z)P!|B|37QoO$z5|4*$udrYRb|`8WIIwV zY`~NvDzF7fZB$J^Li^*=k0^eE^rIwCf_{|Dgnrk4tNzS*$P~8)_pOsO8}t1-x=YZ6 z7`U}FV~NjR-lFJt*?iA$cU!$_S@0W85C3A*kCa#?{U|MV^5}P4|4UB?vNr717Ub*s zt+wkmr+W-mVZ5=6QxKQ)NIv&#FaF1V?Sz5dlUGE_M#N@tFqw?YTmAeGC1)g+U?YyN z!J?XGn*frERGmKNpN3}ZIGtL@mP6j6-{+TaTvUA_Xwg*5j_NCAjLvr+PDzl2|23Nm+Ry{o+see>_0?q){;BOsc1ODAwL* z)*CN=@A>`OF@xbB&q0HGQ|QDiYHIVzzyD*h-&LHK8k1}lV8p403jSq?v~_uanPte1 zs(QJ+{8)v&%v5b?j;+X=ZQ&3Ak0SM2Gw^F9oKk{?`vnp=3 z5+GE3oL-?AmSdPW!dhi8(GXaMgEWwfRMm2WeQzuY!ld>>y7pm&M^Jk~HasjSBL6bH z1zlG&;mKpmNRNu_(5h;ReAQ7$+IcNgKp5l^6i|UVs8I^38g_)dabZUkKS9`0k|zN> zN@fB(_ig9@A|5p*U`NTR9(I((Dq%;;%7fi?Fa5+r8Q3`s-Cnzk6T}eh(VfZu6-<4H zVfQ!R`VYWvUFJ%Zcyxl#%r`LsSMK?A_qX4S+p;(Tv3w_~mW@m*NU@?~679RPX=8gC zsgNB<%H2#Zo9QZ30U`TWpb`OFJa`%&@qv@K5o_monxeuKR6PS*-bh4`$Pmpn8wzYFfWF-c)woPMO7%IQZ+tdM@RtUUTnePiVz zV3n4zigh}O?dY)nO!C__^xt0SIv!8+vYf?t;hjf(j5|xmw-0XOhTqCBC)oSSh4-GZ z-x%1lT-o;EgJ)qgSHfZuxpguHPYiw_vYgSmbJ^{(-CnoJmf8#bnam%# zM&SS4wRS(uc+(f6xT6xTroTv7xaaz7UwA~^j>SztI1M_QjI{9ztUd{e_K;DEA#%+W zRSD^ybAv|ST#|+9=NB@6ga)ANin0SAMkF^-u%9d&vaKj4mi-)E@-zeIvEe{V1-S^* z_f}^Ak(#I&dz8E}u}2j@IqZ>=CxAUtW`ez=PQL$wc(@eD9x11C?2!^H#2zgx4|^|v z+#NTAQ%_Df<+R&fw=vIfAa2CI(N99lCkUY%S@~Oh?xRFF){NW)A&*>MNI*p3GhOn* zkGxZf8@o6g;qeFGYKENmG7bZBkbl&c9T;P(sEaOK0rPg2%O=1YsVvs{hO`)2i=oa0 z!}72jBDoHabw(x_AK-+mq+}Sffv`IVONKV)(|o;fsGP`J49ls&UL@62F*qrCV}g?^ zesbU>B~JjHq|5}I_wG9E`|(&R4o*@|<=`YGRtQd7RvtLN{7C6lVA>!7R^V9F=pzT< zOzKx|9E~vY4<{b`1%w$7E<-_sFyq0;iJf?*_@^&_IBvh_~V9Qnc_r5>e$z zV=N0^i9Dl0erVlmOWKKprx#Mc25JzHEyl8K#L?-dtJ}Kes)h>dRnr|lrI*kU267Z? zX6nwsLabt9OzNOw&{6Wn1RYiUT~~$YPP6$&3)y7cy(|^}>4R&x!eM5a8zJkMWn?8h z{K{!Be&CMsJT$N^ft>Wnk?+cg`|x0mG26yMBBDWnC6;F!-dmD~*;)$OKND@G7ZW)J zac~KeEx;+8;T&HJuHp!)fpa9t?Ww+_yZlj?E34WCMN(H4bCZ%cCO4_#C&x`v@&vd^ z%1pR<%Yo1Rc|4$sbCZ-)IX6j(6>^i7mB-CJPkj7az_P*4N_OZEadR)YJZI@`XCPf_ z_IAFhvgW4)Ab$CS|1bs+v1Vv7#Q;=nS&@-*3&&DoE7|kFN!?X)C(E}?0*Gl2+BnRY zpExYzNGBwQb{tI-k$6G2a88_$ys8ZTKdRjtnCvMK-(`AJz8o&aJ3rC8ZCR0oV?BF;h zq)sr9eO1ge56d2>lzx68^G8}M0uBbo{)vOrim|QYs=hDDj)$d9B$oD>B6@sUkB{6; z5mm1hl6t9_g_OK8Sx6N>ITn(VC%{5dX2L>!>r-p-;3;kjl5#3%At|v!7SgivSUA1- zz%N0q6Ow6d%X1rSCj6PZo4o7Q8$N}Ms=*bw^Wf~AG3ZwA`O+Wuye@95;-FI%5X9AB zVJRxyR(uzeVBhg|I1xHD@vBA!k|z=(vb z3~*<3Jdf`jn@)IBun<^9N_?`?6;q6oHzviX;wMKjQt|{SM#@Ym_MyhF#CT*Brx+=x za*B}>E2J1LE01Ekw|;RGSad2+{k((i^mfm&ZXdfH_CgOe95Zo}kc|^{k&;hC_Ec=AGQ^*0NYjTM4;-+T zXRsCA-x#X2kgAIiR$B0US@A?2=M1~P2=_#W6oJTH4X{c+90YL?9FBX#(q8)B>G0kP zCaR35-Y?SEh`UewPSC1 zEU<>~wq>yvhp;V!xAq@26&tuIB*ZriV{WSP_3Pr+D~>swVU8FI9Y;yx$Vj9g@O{Vg z8P@Goz6_@49{%ypV&>YA5;CZYqW)ssDW-~@T+BVOEny)X*~A&^I0yubbU0@TOLWLH zgVTsLKd+4Hut(~oV(d}!#>5^~{N%7lN}d4rNSO)tPQBrEo8o~}9DAgk%CSdEtPp#& ztUT;}{`9B)8@J|?nI&JB!x?4>c^mweJ2$=Ww9EguU)w*q3Z)!AT1sr&t=#jk_K^?A zZC4z6NE@KQ!P(apX34rQnaD=3Gc3&EfV!~1K#v~k7{NxBnN}d4WNSO)Y zUUQT9)p(Q?CmboKa>9`kDb;f%@-oA)Bu=Fv}biFeNp zd$1aJ*vQo=ec;nP^6h|tPyg=zZ;IQtI00c~xrU6)%}D)X;S3~r^5HxVq{mV;+cA~g z{DJQ+Nx+dx2&12bL{tnU#J8|b4C~J}usf?VhJ%_kPcmf}`Mi+z)ncyBMhmEnjHF^J zCL<+pOfpi%PmYYF(a*z4ngQXF)ooXSB* zN~{ocw5&YP9en?P@St8Z8R5O%jgHs#eCT{GwgE>!$^~Edw=?HpraM{!1RS>)0Rs@4 zcYOCNar+hrq3t5cfe9}Z9NmGiG0V4b6q_qb5_Uc$mY-Sw*0N^ch)#sjdPiVHFo~?g z;1ii_i$0D?5_LSJY&)tgVgCbZ50ESsp(i;dR0c>=Hx&btk~bzGsp2OGNK*0y07=SB z0D0ygfA!jU02K!$DW`Hkk`gNfBrPiskgHzx{GWke@kzjob=F&&cS15Y=KUrjIl41> zpXDO*sTbVvLv9U@mH`=$N*I~*{Q#2Et=B#jw{dYuVuJ*U_K<;fO&y5~Enn8~pd!5aT;CS4fumZY!Z&e7 zil~f}q5>nQ-#FpWc^vQxxYUDW`Hyk`gQABrPkClbxq5 zac}065{4zoPzQkX$ zj{0IeK#Eh1lv6p?NQo6vjh2;1HRJx%?gN>gnow<**X<#Jf#-IR^B9{XVSMlCXUXs# zNp0|x`|kf8Ou(FiGA3Zo_lXJkl{@})=Th9z#Z5pYTy`z&LKrx(TyY!^CziXSh98Ei z`G8cOGvM7NNtja&M5B%9YrsiKFp-BwF(gU1ec#k|oJI#+BfQNpv8yeq4pujrg{=O0 z<-iV%cw0qA1X58IW0R6MCN`EWzSPqS6mff=if7F78`A*6yTCLtwnOcGMXPmYA7()LQ+8$laP`(CJCwHCr3h3@&rgo%1lW3y)$p? z$D^pYO-RbAoP?yr3Q0)I$|K<~mxaj)bJ-36PMKnUL_HuWd|@ zuPshOQcmS0BqdfzLRwZH34i>$?cC>PkVqe=G<)4n8+*y^?o8&7+)d=En|Hhn8DG*D zqPRiEm-H9$40+|AcOLYtBxyx)8k&}dV|@)KItC68Kt>gYU^W#$eMbWxbC1<5n@B(X z{6glBKpg_|vr0abv12VOI8W0=;IQP`x`Gr9ctp`~3>O&^TqARDWjn;ACMw1rC2vgZ zQN>RVd!*zEV2_lUVDAj=Q)8STLdvNed!)n)u}90w!`{sweX|Bm1!2UqjsDz%UAGqi zLJucr&LZ%{o0)C+nCIbe_U?>Yw??xh+_nCi*I-9@a9LpS-5WD*>SJd-^_L$iZ}GXv zu;Oa6Bbkn-Sr&F?k$|4bDiY(1d{aDc?pu&?JbE~{?!ur_LQr?XRb^yraAZriJlR2X zohErW%}#U_6UnTQh(_^6Me+UAozuac73>$2ny8p@l)Nz+M-@Lg#*vaIz&KK7!nkKX z=3jQj!=<=sN6M+3aiqiw8Ar>?W88m#<$>K`9I_U>-FCxWtoPV1&+YZ$B{-A%HLzoH zj|KimRr452d1|J8^3%p|xd>fQ>;<~LbjT^JLeTOVlNFr*hHclYdRS5@F z@-vDMNX#?m!G$`HeK(Zc0U6XnNc}p{iGWl!zU5iSlAu|(XSyOBbR3*u$8-CE$C&qu zo`Ph5soO*IuBxMgNo`cjKT6)1{G*DW9REnk6W|{yGvVJyp8SeO#zUq!|42EN^N*BR zA^&JudHj3ci_O&_)*zfD+3iei{PHNe7OcGH-nV}LEI*0+N+%^uC-)66^sRf;Gsc+O z`ZCUj!!hudryymFgqS%K`4fEPF=dWxxVesjA1aByq%x`Xxujadn;yui3I z@tdmQ5D<;2nDZKN6+~Ja+fco{qAFkPBb8J!5h;0N5|Ju?azrF0Pk@M|%!G*D4_&ji zJP}Dbl@pPaSRoNQ-H#Yk{R&LPyg+ub8!O}w*p<}_%^be>aK_QG?iiJS8;8y z2Jv&Q;pOJfdRH+NCVCK-s}e8>JqRA=ygYxs!&K4runCO_VqaBpc&3VtU=K&S>zZyU z^0MWCfjrkDW8E=fL29L9_EGZwPpX41w&KCyN8G)<?X@Z8_H`x?twO zL<_mZLX9Hu;k+e4PQtmx3er9!gM*Lk)4u70f2xaPJxtN#SzL|fim8lyq)sa49wl!~ z?oq{0&gLT}Pk?)*%!GT7e&k_4jR#I~?vZjT=N>7sLhjMB^0@b|i>}CS@Vaehq2&Dxk#F#(F9b#h8@%Z+V$*Nso`#$zG#pZ+LsrjGgg77ETJ?>cmU+x`{G&n9K z_lf};fBT91KM=QdaWrbOEg`w7YvCkv?1gx?CBrb3Y@S_)8FKF4Na+Q_Je3K#)r-<5 z$e1JhFc(clmOSj+csMs$M0~R=sqo-N8f=94@f;8Ng;YjOQb`q4lae@l z1gJ^MOsM(N|M5m}~jiipkfld6_I z`Y3pCA^aJdfINqxXsJ5faa7Z@JsAgt3$|o%h-^@h{U2w}}MP)A+Q#fCLIN3Xg7xkF=aRo;S+W37cN>;xn=5vD{63H+|}z%P)OnV|yW3?@q0I z=PN~6u6{zG6v2eurfZs`DFzM_fl=qVA~HwYF3dV4ymqlAqcKy`mn~;HD5ruA5K=`I zQ<0K4CKajTCr3q6@&u?z%1o$u%GclYym%ZHry?n*aw?J%E2JVVE02o*^T2h#1{Ku= z08V?phs`kwR6D0=XivJ9O_};@_^re37(BX@NEszh!Ae{P;^~~E2iW{&v z2xS+s9ImR1zz!@txMAy-qv8}! z%T;t_LO>w0u3Mg?db-Fk<3-#X8@U|@A=Fp_`beczj6O=$Z)MGmZkC!WjJjc z=HNzb1LMXD5J;+`Vgyq1#zY`h{NxZwN}d1$Ntp=(dsiLz$9TLHM<6Muas-kRD?}hI zD-VHtUh$^}kfrTypbro@9VAT6<>0q3{pPV)=S!FnT*{5V{huEjfBV1S*!!eo;`S?U z{28){W0NdQfVs;tc!INuRNcnuMK%(Xs=3?01&zPGsUd}}Aa`mAJsYR3tH|M9OMxYbc)KsMwMjy1O#+kxHqUe3ZN~$ww7GIr5Q`CqO<@Wld?s()B zCm$)Na`KT9D8b~N$h&Z59_mKPGLrh4 zHctEyai9}FOjwsC90`K6GA-LgXo{M`9&WCTdZbD!rXD44OzKg^PmX$|X8yFq#i9Rk9r^Y*`rYcfd)a$j{?fx7#LOj;OZg4&UANuj8 z&-H7^4hT4O*DwultG#hY+^WTC=)$*;Imq^Bi8vlaQu&!}j)YSy739-1?cDkAJrkkf zP&Fem>Y9Y)eg;lx(nYvHBl)TC7zW-^n$DPyL@~0&lN8!1G7c3~86`iTt;w&^oOG5Oo1;fkpa9W(M`nmxwDw-nMNP?QT z_i^JySh&Dr;-CT~!xG^E2vZdYmLUGaggvM@E@G3ByTS9At})LP;k=W=-$J7@;*koe zn0S=DF^NYNKRM!&k|#hsQf5NDtNvL|@&y+s9x11C;*k<7Bpxj*k9bF1|NXasc&BmV zv8K1Ui}f1Ko$XySv+xdF=z2j)7d`{l>LX{vxv%~zPX1Vzxe{f;2_{?CVAB_ce0%K| zwv-1SC?lB~HhVShWM}cn3T86j@l6GOF-|V{-cTHTX-x>3`hj++gkVUr%3ND_k$nM1 zDQ4q}$?&JmPjt5=Te5K!Cg#W4n}IvrT)~DfsfLPiN68x#cU19{!yPGk0=Oe(Cb+xf zJs&sGz48<^0YEn*&yP%M-{c_voaT6A|^Hc{r3Yvm|Ut2dM zA2AlTgX4E?%QY2G7ISkRyrwwrhBXl$bIvs(1eFjJY;!n@ge(U*$wN{_6HAd;JQ5f;atOReMf$Z z{RXH@uHq|sQ~wluvP@Y!A9cyk;?^ooHJpy-dn){ceGw59ifiD+T@5FtX)=yYQ@mWy zy@FKBtF(|*2Syw!E#NpgY_4EIQD#i@b<2eRvL=fNt#)yA8xAajyEPK}$%7kV!13U> z@e@{&DyW!hl)N#iMioCfs*#c>Ks8ckLbWfP^}#R1W`fk=^w&(dXL2CNxB%>MYM-blv6qXNQo8lkCv6kzt8?~>U#iHxI+<6JbP@u z&zcJ}tk?0J{&bh~59vyg$%W@Fp5X?|NZiJn&%NcIe(mV|TTuStsfle=e$2z5yx;s_ zYJ1$U#d&BO7LKh%!ekH;TLz*dA$cBr=rk4Pm(Ft2wY;ww4@aLLkj>LikfTKxbj|f- z4VEBIsl-MKj`2lA8+>fw(rhBjs)R#*nPH3aGNlCR4XOy`AXQT_7%6#Uf{`kIa$qDS zPXLUh%mj>wzxI`z;_*`)jHH~(!AMH15R9~}JTP8%(ys3STxzFT4-WR|wdeWy9z7i9 z`YZe{Zg zpC<`fY&C<*cH(}0$?`AbWEz%DEKSNx(D>0$JZ>qLQyh(?oXXKiN~{o#w5&Wdp8mMI z46q9^Y01%MXM0_rHFwTz=V|S|?H=nobC+^!k>_I{NpA4WtNuyDzV7hFLv~_RW^5-0 zCB5+Q+xL$fvp5WGW-!E2xQ?eGtBPkKn3j14&bH&RwThg(+xxcVyJlYEmr`smfS$4yooa~=~-$-r^p zo+U}Ph#d!8)_u>>bOXDte(o;s%Zp5OzXj!Ip4*h+*(;We4kkE<);D)sYMv z=UBRiC}W!L*}jJyE*Y(1Go%V%7P9sgQ;m{0Ce^6oCr33>@&u?x%1o&Cir@Y5;CP4> zry41za;lLME2J7NE01dTz3MCX07$2%OqeD%dHrr1$w}>Q!=3eJcJbNQ$S#O*Hn zwkEs=MWo$Wk|N?+ZCJ$IyN~)&+V>GfALLk#!eGxaDnt zyrMYaB0rX-3PM;zA*_Oclmr&GIG88vif`B|PEk^HO|>KuA$G{)$1EHt;`?rN+jMwa z1v6K&`V}LNk~b#esNyGwI8yQi5J$>P5cj7a>}2s6DULW&PUVOrC02+yT2>Zupik}0 z;0Kb(gK!<3%dye37iOatz8LEg+k*t9T;o$m^}02KgOG(w7j+y~&W|x~wdd=zUFIUU zRdAkVeY1;VI^MkN%{xoybXjMvR}25QVyd=!bM1iE(zyuJ-+;p}x73bmEp3QJNB7`( zIQ~>Cf-f&(&Q5HzBn1w>JfgL9QMbJdPvLH9*j?5ge06whY5UGbr!)M`A}{xp+QF~6 z55GhQdGU`zEd;eZc=thg)VZZ!w4tO~LIrOcPhOXIyl&6wBJ0o?s@Rq) zCQ->E?+z<&Uf_L3LI+vVuRS_$r6fe!15)-M8xo>Z)2nP**! zsec4US|n`>)YOBXM7fTe>_KMaOY*}S-MFV-EO98eke4#o!8e1`^*wA`tT6de|-2${M~_Z zc4=z-M6VmcVel#M3Ck>p!x%PX6$^>T9)l%LlbM$1!aP=Sm^xB?!37cxj5A4D_&Qsx z`&~B6&!?J6ehDo5Y1Zt_F)>)Zz@x4HWWQG2I;S5d=qmkMnzj|ya|aq+aKcel#~=L~ zn}9M0owokGAQW@;-~azqo8mhqWNYleo4i)szNE|LO@Z9+eclei;9A9Dv^)5@*sm2o zO_UTFp)Vfie50vfdv^65pc7%E-e2tZYtNj3fW&(3*DkKU_-?OXn?O$j-1@c4s(;*V zT+hK~;eq>Yxc{a%l%*sY#2r#{?4%YT=l&0rAt(KSrO8PaT?IKwA#8-4`#)HQoTQ-9 z+7$2aw2*S-q|2?GoTSK#$Vti>mz=bKvB*glUyht~vE|4~mYXJLV{YN%vgEXU9Kq?s zMaOV$NpW>}4lx{+qN^Gck*Eth=Yf6s#KgXAdb7+~nhF1z?k#jW?QVa1mm0W_1`Ei5 zq#=^O6)Y3dvP}E(1wY&}eOnLy{I!4w7`al|zygSrH^jIpac- z7BChh$>PgFk}kF!B*}8qkUa33@9ilINg1JkOffVcJMQo%vLp}5v>9B}RnO901^E>N zNNNcrcVRKL-Ax=whyLUTnuya~?4@&G0^oAZU&`Q;eyY;AB#RyeOmSS2LPl}9-&7e~ zl7dESQyiDHkaD=B%dH%jq{xbJNy-@)m$ZPfa7h+l4wrPX<#0)so5tno_kMa;SzIE~ zjc@zdG{?>ml8-S}Me-XP;X6Dft>Ix4KU}lyF4VC`j8*!X7VGZZ-JYMG>$jTI9du}~ zi@>B#6G7+jiHs<@_M2rWNk2?!N|Hs7a-}#WNg<<@T>G6elq3a>)}}ZmX(8n(NtatW zB}tJLQIeE1E+uIJV^NYUz8od#V#`sIEH_Qb#h?8C>18QtBT!H_WgO3kWAAW4GJMt% z;|)gICOB!wMx~h;l|eqCF5I@f-duF#V9rN8>N1{&?}x0r#dmq=2P;iXvglF96elJr zWR#fueW467NkOBvDNamUNI7ECOLdO%tITz9iOG)ZS~_;gJ%kkocIAl)F`I2Tq<3ecf6`=J{jD-& zq#vL(8OfqYSyG&gq>xcEuKr#bGLnKuYg3$zw2*RSq|2?GjHJkl$Vkc=myEQ4vB*dk zUyh7)vE|4}mYXKy7q-9p{bk9hDke@<*06b_sJ3JKE>7D+u3H?kf}FFCp+;mpAt7Vn zjyDtjOmlHRu?!b!@uj&)7ClOm;#?$!jB;^5wG0TqMg)b8+3v-us!dT!dN3lSTTjf+J8RoI&OK2E#h2DXJ23 zI3k}~xDuIgk#E^}-Dq~5`6ErqH8+%@B>ga@DM=PR%9Y}jB!!Gpa?Lx+P?8ihTASjO zq=l5DBwcRhlq5w~L`hQ4xRj&?j73SZ_;Qq_i!Db9uF#Uyxj>>&+-}v^~6kR_gqR#(!94qFU$&8}ZFvIm4wrxlF78DGgC4yzmVpfg$|U zr}7`0_>XhS#6OV2gK(6U>&pZykY%Sk(xY$w*Uy&iNJvX%i;BTS$3Ry?Y6AvuTNOWj zNApxadEF+Hk|2Px({3{Ol+9%RNKZ=EKDW&4mVTJhuUoR{(HB(l*DWbz^mV&-q0H-+ z6f|0!;;&m;NV(T7U2f&CTT*02uUk^ixUXAUz*w(aviNeZTe{eCuUoR*G$mj1$fGxx zr6iLq4{i~tHDlgvxfxAqW;%k#FXiSyX% zYs=7)eu&a^B#R#9NpU)oLPqJh`jutqND3OQO>sKXLdwyRF1KBA*X`)d#b9ds;7Ixlc|}{=l9Pqe^j=gu6mxQYO23g zUETeZn=g&i5;fwcW$z^_v_uWLYtuL_aU*K9#PznEmZ-@V(Gs=OEG=;ZP0?n=F1zPbRa&B96Rj7=$Xv4UIbmN38ShsiBkq7Q8Bx`4mNZUA)JPpNKBPiM z)R4P2jgt{KqDDqsZ_CMunrsmnQ9I3&5jW5j8Bz6WWW?2~krCBvC*zXue(+OOGQy_8 z$!Jc`CUV(iHUc45qb3ADg)KzLrf*@`mYk81-&ju!YVgPpqA+cS_9uZ8rtGZD*0bE#Mg9{Z&uuphCOi04cbV&6x?>1;fq zyB-9RJyRgYEIjrj$v~M!iDVlp*MtFBslrLz9c50Us@-I1oRg>#Hzzw+t8fxE774@VA@G^2mWsmWo%H3~{WTuCv_Jy8X3Ox=mabK*quLmR%qCxN)sx!i zmpwZwaT9er>XTVPEnRqy=?@WnL>l$SLa&7LAXE$In=yro5M_ z@Dg`RnU|<)H(?s*C2GXYOYapbyhIJTYtuL{aU*KH#PznEm#E1W@e;MuEH7~bP4N;{ zuf|JUtr{;;y>?zE&-&9pRCyVLx65y{9e&)QFf?f?ys#XJ740!-X5WniMJ-H2%%n5YpqFgxB= z0VZn5U7N;%i5pP^Ca$;Tz(h^92$-myW`T(tXbPC9dNp9;YSn;=>a_#&xcw(TrwYup zsmF{=DiJY_G;9N^MIl@OL|BPtAfA+#HF(?r8Bc|L>op7yc3`VKcJXYQ}^4hBZ=MPNTR8H+l3lu-*&B4`L+wyZSOb- z^j!XoYR8G`5m={*rDMso9@A6dL^=vj2zBU3xp*=hF|0cixm_1*!GvXdzJAF#SD`v=D8-?K&HKI7YqIz3DykaI>HN0YW znjT(J1I-Pun0m$G6;-P^ykdIol>G3HwS%gZj2j6E+^EIk>1bGs>FG=+8`X6!9fv1{ zM#A8sZ}$`TBYF{bQ^=2z4`8j>JZ=f&X4b62#x;CjgDvO;oiTG>u~uHBtwg zx2s?iHRP^MC})K0V5#0@lsO;o)aHgUCT*hKZ(v01IodtVis zMk0}o#WS#-LPXPG(L0_oGBGn5Nrv@gEE(mKOS-*zp|XC{m)40@ZW01FKQ=;scoL2x ztCfetgNecPz@Y~&J#hZ21Npl5Z7RUT{Za-ds@jd1#({|%aRbx)OBGlajknTdoGnTP@F+_2ak z&gEjMh#AYqvSuP4$?0J}&rFJWrdaK^t$V|7uLCmcE_-+HrNT?xEoEM!s@;TXoR_E( zH!r*QRpBLS$X%Ppd5IfQ<0Y=Q<-9~qwuqOgoo0E78)%A`sCqSC;%e1+iR!iU^3GY0 z1XXzno4)1}MlzBxGC5ejjO22=6DrO;_fJO5>@RcOXHkGjkr14WvFlxHRP^M-qmGDu+CfL((nE!A8dcpgK3L9}3l-Y=?cGIMBHljw{Z1ldR z!ba4PyEcup5jUd7MqF>p*@&8K5gSoE&9V_U&=ea{^=fRy)vB=()oW+tx$~~wNp%jX z$8(WXA`?%gvk_RJgxO>!nv9rHO*hQ27R^~tz{7Rk%{3>AC3w68oRoh>2Q!07Yjv{c z6ctk94k?ooRqbX=#L+;u%PDs0%l>4mHW2&SCKBkjt(=g*%2n8L{ap^^__ZbE!l;Wn|1$CTFB`nvsen6WIuS z{+ftIw-C=>6?eye*=~AQmI(3(w!Ct#`Ew(uG|v4Bd9`3+#zLBqN?3& zX`Ga(5jQD2rl^n-HRP^MG)K0Uc#0@k>N>sfXDRH%Gq(t@F zNtqhG^%7N5YT1|x-z4Z7tU{*axwM(eCKGxxna;pYHQ@-4MU~jPyX^r(tE__u-L_lq zn^ka$d!>v^RJ9v0jpGtE;>KkUylR>qT2~x}mkJ8z#L(bKSu+aekgnJi*SkBX%?5bfu?YYs#n7$u2v0~ zs9rlRpZn~bV^nb&g$L%YNZmOv!qpr z#a{#P0%dW$4DSTN#1f{KH4*&2s)9@0D`i}ws@;HT9G9pOH!eHRP{Ac?$X%PpafusI z!zHe_<+wymwg{J~on~=~8)yobsCqSA;%e1!iR!iE^2*^E=c?i|70yJW*?2~WJz-4< z6rGIclBrBM6-&e-StH9=C}UeWyM$Zunz`l2DzL-Is#k+0u2v0}s9rlPA2?@~a!{&dHkV6h z;dAe>rlld&DFo2hj5Ndy2EN^l*59V zc%i&wjS3-gN0bSPs&+G_aYCX-+=T2nN`;W9A$M&WCnRn}jgYwBmJ<>+*&;%scA6z5 zZlEbbqUzNMiK|s3B&yd=$VnTgFHj|Nt@BWjey^|qXn zsL2*l61CGTC2<2yQ4&?JMoC<)8YNM^c1k`!_~KtxDH)Ha;iVu5@SKe0V!Ccd;PoK# z5ss0HCvvcvsP$_37c{=12y6>qfvEVVQGzX)%z~DMfTs0iuID)2eJbF@{Zj@fs@jd3 z#=(giaf7panhH2kL+;u%4o=*N8aQ#iEe9uRvPIxT?KBHc+(1*{MAfT-6IZJSPE@ZQ zocnxvr|VV0nbLGKYDVK}vKX34YVmNwFvyESMl@r>mq8Xd_YvT%dDDC#SJp<&O~vwt z+C|D6R2Yf7qRdECwVNu9GZHo8W@P(MRTzmHa@VGDM&d@)7>Vm`IU`Y%En*~Ur&&hg z2AX0ds$PwexLP$vqI&I&oU46DIdX3*l}Ut?@US}-(={Wj#gkDDzVC*2E8)|{Y%Fat za<*V31tLjo3zRbObNfk3bVQv{rz57?%@YMWVn*uF5kBf{{KZN1*K*fJfsR;hARKnp zb6mr3eQureh5T3*qO8!U*PeD5`aPRyI#KnQtvA^!I$}-MG#ya`&CwB4uSiE!ts)&U zy>>cAk2`)J)fr^k3}@q7G?B`r%v{)vXz(Twe7>k9GG->8*Op5YNIWx*N({#mVA7mDkdRZsgcda zG}t;j1MAyySnDQ1@?qgS1$$>l`SvsY>q~>1w2GEB&D`)vA#a!i;yWXaYzJEzj@v$c z?LAfnlDIF*kVI9xvC=psQ6p|h_GVQei5ha(rg2E(M${mQ>uotCQIjo#BxPjn$)sd*wo>@+ejvn)gl?#af!c3 z78f_zI?NJb(g>Rw|VW!DbW&jN}ZONYBygLXo(qd)3Rs15-l-9?%F8O z5;dYoOH^;`X^EL^6)iD4P16!J&>Sr>^@_Aa)hf~w(`%>YMUh8~s#D069yc?&G{lxN zqRC9o%$TsdYZhVxdhOi&V%M9$ROMzOZRX6l36WC6X&rXTPG#b-%dw#+qG>Y`GkJ{X zz4FDuvPm~KHYWzl6YI5&T6DNPVc`_+!{rBEy$e+ci94c9NL00(DUA~nHR2{@??Ebr zL=CxX(>Nh>z-cUgV1Dj{_< z6U!N~Tr#FX`1@QWoq&hjnwbt8S^}az^ZW2U>pX9@*_wRX#@Hg`-qfGa$TkST_=|e^NB3g=2aSUNB3-AFlVw zjG{h1YK~P&?9Abs13M*q+EpltJEKfVRJEHcjZ+de;-+Lzw+bauL+;u%PD$K|8YOYP zEvF=EvPG0c?KDeC+(1*5MAfTN5?8B6NmQ?$lHJ;@LsTi5NX8-w_&zHdOJ|bNSTd4I zMWeZ-nM_CZjHdHhqzs&*k5{V2Q5sLm_NSeYT|ZGFB<_eZAyL(CrZi4S)QFpqT{o!^ z5;f$mP2+^bji?b4*V}SJq9$8JNYqZVgv1RrMMzY=8XvFDj~IW zG^VGLkuYqZ1p9ABGJ4X?=<#SuON5P>xX+G>`|SFGQ}kll92l?W3nZqqZL^R)RA7nw zqzp?`wHq&u!xA;(hGoY-DzHQixogunEO8@hu*CJY9G0lb7Qqs=(=04;15LpaRj&q1 zT&)@`QN4Cp9`fN$UsHu;EM@AsgqAWi2$_=Aqp?IfnoY+d;dnX|&PMs;?ta%BlLPCj zqlEzoq5^vu4`?M4##sg{?S4}QlDIF*kVI9xvC=psQ6p|hcE7CxNz{kEb6|g=97bZvjP9*))88qowq) z9?7M1(UhKuC!*n`#y?SHG4J!$b>rE=iZ)i&3gg3Cr3CK>4V1~ZHv{l0(1=Oz#L0}3 zZ(-aEUvD@57zg)B8J4JOH(nZtC2GVC%U+0|(D;i$s3CW48iyrrL=Bd>-j>4>HQ6Fq zqIQ~vC2pW8Sfc9HV2P_$gC(lh4$GC#&U{N1mXSy}o6BYsMkX{Cvp2-D#M%R!z{JmY4;>mxQLrq<|3-vO_IjBh#GNov1eF?i>M)YZ5rny zZbXfXxZaj?5jEK&E~0jt4S3ESi@+X{d81JE$Y4^sRyNpU8~%r#j_qC*I^s?!(-Bqe=1JppM2)!V z*xsc=N7RtJHjUE}H=;&ITyM+ih?;B>9Z@^Y(h)b%6dh6ZYIMZas?ibEYp3Js-~QtB zs&v$~WIPcMhvEI7NH&twb6Pe9TZ5#GNZK$>gWqEBEM|=)gw*h85iXEo86MEsqU`Aq zPpLgi68JK)am3)BxZ+2(lW0}#@OfY32tci|_)+bpdhw&$N!+UTGD)gc&+5is1;rYj z#*bio5_y~u`y zWEl>a`>COK-RDu8K%Q%V%>NjGhk>v|!T?B%EIt(x&kuqB3+ulzqlBkTt7Xn6GqqT%|Jj z;{GTPzNl*VaMk$WiyCncz8%-748Eu#cWoLUd~qXcgDuKYJ)GT*AB`9ww?WbRZzy@`Cm2~PGr-GNF*N3q;e56l}coj$xJK>A0S%G zI12Z`L7xg!qd-4;+PsoWg)>dl{`zS_hFRtoS>fyQshu_fZ+1sA@NE8iyxp z#0}5R*(&fv4Y_O6I6QG9YVgGMwj7?Q$riyAwbLv-aRW`k6IHJUPh71UJW;)Ncp9^3 zDsQEp)lymnUeMOfMAXPa5Zp{gGgIkIB9e(mV^I#z0oxk*BD0*+3LA!3%Esh#Ql=H>+S0HRP^MC_)K0UQ#0@lsNmRWWCULcDm_+s3F*!N5=pfZOW_r{XdAUrRK)A`*{fQmIHHkqW0W=~yz8fJotbJPBK@TX*KO1T`rbX+k!e36q^&`J!dlM=EH< zJy1p?s@e^c#?goxaig*86BRU~hTOGj9F4dUH8kRSTaHH5WQ)*<+G!SzxPhk7h^kjZ zBd%5rji_Eb8spzsd5|av5RC&J6R`xmTp>P~P6{+uU|Uys zHdxZeOlyNKx5WObVAq8zyu{s7<|V4yO_;`ci5jWH%S%*vi5ha(rg2{4M$~wT>uotN zQIjp=C2FTxUg8Ft;w7qHjhDDuHD026?Yw+x<}Y?ow;kAl-x8B|JRCtNIrOZoIwVN=F^Aa`U=4Cf* z(9?K89@LP#HjVQVH=@Q%TyM*HiJEK?FHt+q@)9@D6faTrYP`hNs__!lYv<*^9_xHs zm6yq=VMa8F4xTik5NskA(X)|wDv^oDV%bAuOjNZSGL0h>HR48Q#{nwHL=CxX(>OA5BWlRR^|lyzAKk(o`4K9-#NATnC92v@n8taD8gcWo z`)CzjqK4eHX`Gk15j9@odRxv*)MSfziP~wFm$-qZc!{c4<0Y-{#4}kVmQ9-BIJ~f)GotA%gdm8gUA)Z!(dQ%(%(r7CR@cx%udssL=7~@ zNld*WCsDPEoW%6nIeG1U&wr}Q$y^kW2(Kt*%vem1L|}izH0+p7f{SaqkuvzoW!k#; zo*1mRa!J00q@VNDUAXMNQ-zqgW6H!tRl6C}I5ANpZen)dqe4v7kh?aG6B9S0Moe69 z%ZZ7aY!NY0JIxXkH_#L@QT1xX#MP=16V+=c<_Cj!ouo=ki0P;45!ib{hq!)W2%(!a zb3jhb2FbYxs_*OMN530}-cS@O-sA@M~8mA>{#7)bdhgE2a z8gkdBaa!U=)M$z8Z8Q`5-`(@?)vECk)obVD^66*atjfoj5lhEnVR(X*i{)TnSa^R(OJ>4)BB^JSdYC^3kJ$LQ z(9BoXnT6um@S(-=F~c+tC|0Y*(N*hAvq}RHMXcZ%-cwajiF>4sN>sHQE{&rSHR494 z_e>R3qK4eHX&jZf5j9ledRvZ4)MSfLiP~uvmAHYXP>HHnLnW?O4V9=~J1WoF80%L> zWmt>oF)eIl!f_)FPj#~JS27h&M3SjQA{XUh|N1o^_D?I70GlPPIxPPZUpfj%KB@vq z+!tj?qN?3kX&jQMkvfokQU#KzA$M&Wha_%94U)LtmO~OX*&;}ycAAAGZlEbhqUzNk ziK|tEB&ydA$={v*)&f;Xrc<$WHVym0#-k8oD6Qw z>$Gwerjpt5Dm?ezFb2Weh9e}jP}rJ8b{(X`N8Al%KBB7KL}{Fls1Y|GyOyf(5jEtl zP2+sTji~Vv*V}SFq9$9!N7PQUe8dej#Ya@V8Xs}BYJ5cX+WC0y89#hjm5(tkmWU_J zTsUK<;jUYYrC|eF)#3ZuJf>*+)j1Y6J=73ElX{=v9ne5tD1(vu^ z%CJOLyYbREEKwtMU^!C-mZ%|jZ5oFqZbS{1xZak-5;fT(SfX~Cg(YsFDOjTF)nJLM zRf8p}*AC0k+&9NmVM)TTMZ)mLWG~<)qr+uL z2I{?P&VviJU!+1w+!v+9b9afOSFyJ(tNh8l{bR|@~^GU)4tf#JG%KGt+H+b#5rH= z=^Wj>dUMHK>X|&cd49Q?hkYih^9_USNJ32aF7*WEiADK>Nu*OINIE+g-uMa8TJ_8# zo>fj5*UIL2X?Q&t-c-($_tm3t#~zsn7d8}VJC~>oy|m_v56DYSP>gOn%8Lz_&1$)r z%U7c?on?PP@dVuPTgCsviih6%)Nd<3!oI;I+wTqL@?%DJe55kGzEXy*GN3rD81Uj( zvEt88T{?vo-%AV+l5oSeKj}Q0mp-1A{>to;>n-EO^2p#iZB&P*st)r%2J&N76Ml~> zd@c{qykfj~krm%(WBsV%x)v^V% zLLw_eds-^Jex~v_@7!`PQ#o_YtPWOkgBvDB3&SLdLIaS^wygF$jTIRF#x7T~0twLo z^dO;bChV_!m84M{KYGLg~_Vrkxb8xo-3nF&mj5D z%O+eR@G1y+U}~ck=&bB`fD6c18KRbtG9B;Uc>mQ*$L{s}O@Upg_C7PtiavD1f5NP2 z%~dv7+>kF0(*!!I?J{|r6+88gAKhhx22V z!41VKZ0zINWhOu+!&lC@3P_7PKY%ep=Pm#LsvkTqf$+Q#F=E({lb7U(%Tt+6zRtwhfyA zQQMgF87ueulTQ7Rm7616hszL%2^R%)$IZp@D)i-A!9b;0fD4s2py*aVV+y}?^l_&! zg|kSn7%7|PSh<)jR)=BwGgi%xS76sPXnBsN?OCyZ9RJz3STXuypMXPg!@6p<6a$=+ z|4C68^mq%tMkYJ+Xi_5SveHw}AK5#pL{xg(L7it4O(&|JonXW+lNnTLLuFC1ywHT% z$b5Fyu7&{vW;~;XL8GX{JW4AR@*`TcSccyo<}LZ^=3KE{HVq?R9VGk05#{iRV|o@| zr74(BP1LrW9k$Wq?W&$NL+gs8@TzygoEWkUud0q4`QplQk@T?2&|=Hl5IlPx%8us? z#?Xj4X2O)kG=^Xa5_S?*%!G}>78&~dVwK>kf~PjW+}n^%pOO2u+@RaL8wSB~;*BP8&el9>1|C39nF zprT`<8|gWv44T_Kya`5Cnt)6V%cG`|ho-KuribZbuIO$9+sQ$g$I;fWdbWcLWDI^o z({T0%=qr<6ade4EaKkW{T!xXa{ zq5b-=GyensNFD+T_%XJ=151;##k*_jtXxNMrEh;*J;bkKlWnYdmPZ9w1NL1k_d!U0~AAi21L#cLSE~_XkRve@p5Wk5^<7n zYSQ)APt&)sZk}tu-?of!z3%{0qk~AY2oj$MenUEi+={MC99mH#6T^!95xqxwroojm zmLH|JgO!E(3Yj+>j^7sGbl`-kkCV~|j*Y|D$q{$QG|NNu_I}7_X|^afhy5y^CEuR( z_Q_=ropy7tDdNqtwK`C@xaG13?&YYW{;H?_pcSiDJDUp{B({}AA!`pDC$dG_990Jj zFDvRBNUN+YXjK>hN0-p00=B}?)^ov*U%!cX(H7i9?)m$^FpnvNp>`X%bEXKQFgy$f zP*OMQGW5c)sPw{GK$D4?&W1m(oiuC-#_k%Eq^gI*e%IuGeMl#F^kzj2m~GQu-v5l3 z9W6;`BW*K2*fgt?^t`qKn(j#c9K3&tzAgMQ=@oKB?&^F_w z{J#6pECkG9~l2URcNGh-?kZt-*C-aG~;Ti z@v!Tb{Bn)RNbkGbW^^oBa3;-iw9I(Sw{|>ziO5J7W!h$Ze9emIX_gyg#v5O~c0-5A zNN0_0GxBEF$u!H)WyagiKg3T~r&xp2d2ZW`k3xIDPP6=%%y_pxbon77BfU*+o3Z4G zcc;)S_sNXEerDkhnh#&%n970vRj%=p};uZ$fgGSUSz=oEkVF^wBH{!(2P6Ej61E$^d2cP&Vs+%vLx9=Wsb}KU~=s3KlsGiPf3FMOgVSu9U{9w#&voxlft+VULl1^E_8bDAEsxd_x}Bvp!&6G z3uO5;FK_eSKZgosrn%zS+dtg9cAU2TP15_D@9Wm~li5$?I=#0^;YmVB3E?3P>OYwa zUEZHc&)B>_lL=nDGGG&)!pqyeKaC2d<@(gtzPmzEvE1`!ApR4?6mK|1G`$Y~dkGZxA|ztGLc~uN1Bp!Y(OX!-Y=ogGbRb zvh9P%GQkNueUsvYIu<;Fm$!KzTuX)0$kF21+yBj3ufI+FZl5l^Z{POoyY_At*?sJy zCwXQ{A-nR4aAzrGAOWG%d*4;eS(%k}veI9#S-V0Cuc+g_k9Ay`iS=1>?Csz8p!K^` z?+2y#L;2Ibv7N{sn8|gv$E0uvAxuf(PF(2pKCml2BilZ(2NUc*XSefY`CWKo-v=c{nOI>XYTp!)&DJZ&fzW6{=5{<6+(H{1@`AcSKA*z z&)C|25fj`pUcG(|%{ak1JheC&M zUm^UL6b^Es(|cc(o{`@B*uYlOD*yA4EFb3OZQlFXU@0@PagrQ+`&Zm?7@d@K$jMGe z@8AFO7doe8h;qCfBfCIhe)e;>Z0vCjjrcs2SoOeAZBM?3I#DcN2PF!#0)u!89J7Ef9bxD zg=G19#0;$!-qI!t9W9Q%{Y&R2=~&yzX1ZkR+WF=0>^5dCbikqi6Plfz_^L4E|5OOi zkiyTn(AoBZHhM<3eV~&Ge(t^II#E90;pJ^@AMjG4%+xN9z5SkPdtXc2{vz4-7r*%4 zPnU`8zH_y$_V>8R>msBNJRR zkla?5FY)p=?*kPol$omH*xTRr`%_*ces|=B_Z{os37)`K0m#fTcp}%?F(z~bPZGki z6rRk5PVa-K(lgTg;F(PD&OwjfBg>z{%iFvUo<@Z-)9K>a+dt>|FVh)vM@D)-JUIH} zg2*1)jqB{#UkYan;Q>;(2NycM5A8$GNbf@ouBCa4o}D4f@5Rg8ybm#8%S?>b?@8}3yZgFh{#RrV-okZuTqT9K3gI~yTq}#|HWT@@-^D_KbPL$cHVo3(4`WF7a!Nz zahK5H^9!LZXOIh>-utG|GtztCbS8Lpmm_Thcpoos^WHa=3Z>;~;@I2&#Dy==g_KUY zh}3!G;b*)g#~{C8PUo#chhH$K^L8oRB6Ivs=J+k|@HAN*4GKYx=t#Z}w+h!l#ew(~J5+~QU1cV4xA>#BY2dE;zZzTQ>qcU-l8 z`&GOCivRg1_5KCXb2?u<;q9sNzBVAP+Rj&np@6t*JLTOHLkYx{pqpZTHm-ZzK$#!mV`oLvlaxv;BESoiJEg|2?@ zoFV%b(X6FIzUlu!majKM_AQ_}Wu}GV*xP^W$sKft+;NC#`;J3j{OBxw- zMhe;QM}$X7A?pqxbb23%GG}GhBoqAC6W7X{OzH7>y+mDeGvXJOGU2;$liJsFXZ+1gl>^UK4&k0#Q=PS3Dheee_^?FXo(Q`uf zp0n|lY4pCfi!HH}Ic8V?HpgxMJE7AjW(r+lDHJn>uDBF#ai-vN&J=uSvbO)%Q#-Gh zxdU2=|df25}HN zdrokB=B&)R6BFbnUm$y4a0V4Zd0Wp3&J^BK?}IytV{iYxxBvSq#P6;J!uzg;bGKXm zj4%|sh3o7(ND6Ni!lhDp8y7mg4>`x$kTup`by1(Ke7&(Y5m*oy#)86znThV zrXPr7Z-3vn&)bfAUyaD`>V(v zl-|oFs-X1#CYf`K-UprD2QBYI`HShBf$V~;=Y7!OebDaxj?;g0E%CeK55oJ7N562_ zZF2VE+rV3-<0;{&uONi-`u2@+p|kCM&RLqznx!3FdFVE&wB9Vu=a{AW?6b6A%)gMf zeJ6d6#AXVU-aYJ+JB3dFTJBS4mlPf?ggz-emJ6NU`?K_n>^c4%6FfdolReLWJTGtS zIewiAr4d6Md;5>re@EK(U3ZJN@4DyI?flYFpYXox*FuL+c;EG)6mHRbpVNDv<^4Iw z?`&I3tLMGX;l0o9{j!g5-kJE_^*_@4r%#-E*O2t-J>DW+f0n}ch44iw{E!QsZSVUR zJtN!R_ZbshwETTr&-<8{x3#_R6DpKOJ{8B_{yTnjJ)7seBfWq3t%u*)Mr034?>~}4 z>HQ~CxJB=SPVa-3_m7;qxLua7=Y7!OebDaxSNB`{3GutTS9ss;`zZU;EkbADVBR9# zeNwno2<5#|U^y2$+dgn8JtNybu!adf`og8hNTn-zd0X2DR#BnMv|1c{`^2 zQK8IqkvR7DKYiN+SJJkhBfXz{`q@#rA`+U)b#~7aIzrQgki9lVA0bcYLZ|m3=PWI> z6U|!M^(TM6Q7WxBOAF1UIc26D#Id(OetG+A)caM^`_;>OtJlly3%F0+M@Zp9Av{_N z7jdD>`z7>@Z2J)FWTiF3o8$wT&_TSst?fgs<4Pl}&yr(r|306dNr~CLL3&^K>!u6j zJ%jHSuCrS{l=s~#gyTZ7?=~)Udhc`2F@1N_tfkYhc;`A_ z`fZW6{pr&CGfw}>PH&3rLD}!+034M4{_8U57W;kB+3$l^zyIO+T{p|}_4<9#(eH!y ze*b#+QC}v0w|_%;-+qB_hxx07&d?LQMcXfu!Y76BQYri+7dqQM^e1}8)^na`f(1|h zMBeg*p62E4J?B{}lt!Kt$KL*juD;@I>OJj0bf(aL-6!37`9veImg{W4LFfn^ErdUn z!ehD6>3zUC)&{Jx_QE@NdtH{VH`WFmV{O1b)?O6bhhDYq_sX{a)zf!ADEou|cigA; z-v~qghlTLBQuuo=bb9Z9oSu72rdtiAtHUf$OBe)iK#BkWfv$KL+8OK;P) z?+*3~7`ZF&`0Kt$JXVm|1#>$7E`@?Q9q&rv7MbIBGRJQ*=jboJZhMqhk2!t^bNqJZ zy!V&SzC~KSb9>SDoimre_KM_K@IKxmopRYL_-i4YExZrj&xOvm4?aZC$hHr%pQ&`# z*?*DUG58=aZ)^J?`{|_-_N$X)Z~wIAbLrE<&Y1K*K6>n)wsq;3xz5hC)bWZC&XvMf zxzOeP8}y9L`?r{2)rxQ09>~1T%iFzwlM1DgzlmdS|JXJ!(N(n0gQfRNjqs3sOyc)) zot-O%4u884u9m`1E_8bD@1Og+}Qb*U1j-hUf$-t-$#WqlV2Qr`wz@a{VDOg z`!eBu_xJM?r`#*D2TtQUyRVkQ(}nO_DLj)4o!$q|p=YG`f%BQ*)9db*wGW)d%iFvU zoJ)n$$a&%z-i>-|!xyOcw@L4RvF2;%%ds}3bDiDthAU(Up?qo<%5kC7`_OuNMtUC_ zV}iSOxZU>LYaK6d^FFkJ3WfKff;jf}e{|K2w8wYFwWP){P9Jr$_zZWlWYx`h770OKeies4P z+<76JrLh-u3GciA^Mxxect>OpyvKF+$lIX6`$E_)bAHH$PVWQGd#k`_G;8VfA8wGd zyg|T&@@|Gigp~WCwBV?e~7?``;#h_k^YQk*lAM-X*dJ7jU0? zl2W)(2<7!1T*QS=?}JO|8C%a`mq_WarGI=Vl^(>)+j|bX>|`c(#gSug|DuEcYftLE zCcV#|`oN!U&rWXPI(u?LN8nZ=lDEA#(|YPVfEy&7754?`ML$ z-dr&#h4)e+l()6L|32X@T`u(hS{!@(!yoNKpY-?8*$$l{_gtj!YaAkUhGJZ2k8LU+ z7sAVA&LkH)y$=o3GqUG|_Gf~DmvV+IpXTLl-iPK;q0BT_9DDl*p6aIa`<|c3w!i+t zYo|;W+5K;Fojo^8;opStRw;ao3!UEk|3S}4@BIuz5n(2?aQ7N*+Uhsv*$r6tP0`7Qn--|o!*DOM9)a?LnkxA;y*ni zpL2vJczK)mp%bZ48aYWE!~2*kSNw*0|E%=>x%W0a@B@+EH*f>d!z5Oen{N2~7_wPyX-+y}OroV~o z0Uy`d^RX2Ag;36=13@lydLNiV&q(hB)0yC*xGC3O0)4!^&HKPqDwLL|iDPg7G3|lJ zh~K?F;eD@v=gKE%itND+TxYL*c`;ZJ!s#;S7#BLd50>c}>3xuOveHMP|CJyMmUwxa z_d(Wir4iO=$+5Tp!q|g!MWmNLwWZAI-DA5oXIvz+e~;_z-B$`P6T+|*Ue1Ls@2{d~ zY~EkP1i3%{Z7*5=3SQps{nb<`GyOmud;3>+Ue3Iy^JM1zyj#C^wtTZY@C4V{yHMx| zJSl_+N#P&4(CK~PPxOrRKJYvfOupfjHd+2@Uf$+?;8`k^nVu8J!26#)`y%Z*hs&OG z#4qxLUz6Ft#dY=`D}@&cVO9z+;X;@9-=$}4-m{;n^y+~NPnG2_<>l?(v!7mOV!t{$ z_V)V^N=~KTpCG+2rxzvUibycVb@omO9l^K|o+O1yE_8YybdFZR{b|b>%bXYVx+eEBa6gik@~y@Xp(dVjObxkc}TPVa-3 z_h(J|`C3`Np7%kA_d&b&a}PY3u4DGzBisJorL%5*Rp|7+%=<&{{Zjaf5Za!ay~>5o zp5uFio{|0D$0ik}r;gcEUiH4$d3jsE_pynJw9MuxyaN>3!&YCYZnI^6yDYXYukj??dNOq0DriBa{53 zyq#sLdaky8TxbXQV6NRnA<8f2hwMep#iUFnqLS3-|kURXHRy!XZ=pH_{=U(Jgyr}(Po_VsUSTM{o`569ClSwL0$B0dz_o)|O-;Y|CSJ=Vi zL^nxhkYq2Cq)9@eGWbYS`qq(Tf+S~==wBgsmV98Z!GNlqcj1thtGBsY`fUXncO_!+h*!v7@+`A$3Z zcapqIk`GAo5lQ|@l7Ewg1U>1a(Kfu~uP&1GkR(8o5J@JJWGYEWWP?8PB)M-UNyt)L z-_9fD(aJ_FWNscDTF(f&bB*&42 z^qW47B;F&L6ZL_$?r(=BuV~E5)uMp^4lc&7?LUE5}DFVlBpyiU3d!V@KXj!k|N1Gk}M|4 zp(G(c%@oq)Q%F-z*+`PFkc2Q{$~Q^!U6Nc)5)ukz%Fju1H%T5K$)hBBh9obM+y;$?WAz8_v^@;@R!?fSb~;hp34GqGhL8L`H7wai zaPt3W5->v`Ec<^qlORJ(D`ye}ooo`(viU>R(|Oz|M20)AG`iO}{=05e$EkIqI)WpU zE`@}|X!O})G&=gBwc=IvENKpbR$#{3p6>xV9MS^4A{b+>`o4r_wCzO#Zi#!97F^a8 zb}a58HCHdzA(<=G31~=u{JBGad;c}!5@~xfV6uFD^QI>c{->0|UsDYZBc(emdq_Iw zs0c$RLeGJfx=G@dJbO~e9h25ppt|1AT(M-CIBtIevnQTqEkt8>fgv=PM=7!mA2kR)4CQWQCdsrlMYl2)Y77G;; zu2bVt>0$E#5_r^#Kleo%s(u+=C4tl|uy}4BZ=0uUsRu&g9Y7+Ik~oDcwJKqkX9|r~ z$jWgU#9@T2maH%iA#mwWJ;^4v;uaDOEG{LpX^T|}5g`vP7OU)jm1_oTK8T2KMYUvF zC+Lqd)mmMudWID)Ijc431Vk&Qp8ayer8sva7dSKexD)T~D1A^gZ3-wNozlGeKF z*@L#%DmuC^Afe}ASJ8E}Vd)98%roxG!sOD80;oO`a(1x98gGzhUJMeReV@Y>52A&NZN-k_k3 zK?w2@b1(}TgpH-JF`&L#FPQdXR!m@8%6zWM4*+9COvPt1Scd&DJpVY9#GH`*SjhC9#z3q8qdCP0)p#UD% zZviXX*a2ijT0lag^J~G1{ZFe?d#zdivuy&n7d2NS>znpFX>wy(_3Xl$$rfMK)|Xh8 zy+1EY&H7K(v)AY4wcp`YJ-dBg)>Z2?a`%YkV(Z-yQrV@;;TMC6z52DzFpk;J3lHj? z;%4`7ndN=bVcy-!Jfn60$}e-vgQYMC@k`SZS-)zXU(Gt>Fv+_F4IFD_sjV|(P_24V z>$)d-y=#7DOE<5O!wrV2S|dEGsC!7XV{r_K2|qjco~%v4ZXb2Jymi^p)eFdBc~N^= zSeG3SUvBH!u&QL)v_hLNVAS9pX$t|*Auc{IRv8~P+1kncYPAeQDLX-*b5M5|(5=?< z5MvmoNw7@-zv7{GmJ;VPk*cTPro^hz=ct)Xa~n0+Ia4iU5LLdCAA!vUtdW|Zs1mij zv3Z$|dEKmOBQ|guCOKg>5W5=c+?et)t@e~v2?!!jeYH-)rT{RdD%1J4xW;Rib!=|T zhZzIu60Fm0DHo$9?F}$HrN*|D6-E`d3BXol zx#s*LcxDD&dzo3)3=K9A@a*ZXmz8HVdBBh-+XKNB0FA{4(;98IYS%x@>&kwrnzEvT z3}iLu_|?pRC&u-;C>07(bB)+mbMC8 zgiwO<`LbPRyD&LZ*2B#R%w7pmc#LvBZr3?gqkwg%I=Q%~oGP_htZMU#aNUzq1FIzL zegqT@(n^xQts44;U{M}c7#Q)$d0~UioQP;m9-2nTneSu?4|ZKy3fohyB)db9U8;08 zUU8g%PL`U+V84I;+`=jwphjV*da$~vTpVThB#W#~U-*QsUIwAV^4u(sFh^}(@T-fF zX0%?GC1ZJ53}DL_0^W6V+PWj7Tisk@%E21imd7F|yJ?ehhXahc^0dt=8`$J2VT#S> z=?SYe$af--iv1Dp~>h2%qU#=S3%Al&_U?jf}0e=W2DboBI;EC5F2ceuDzX^s=%! zZk=a$gZ#WDWKGG1{DQSkvO6I-X?bjkS!a-9M=3U|gVQD05^^bAv+$~k%{!YEu9%f% z`_IZc4l7tOgqLS3&KfLXuaxi`>Mi8rv%9K?5qb;RTz$o!Pgt^k8=F5;J#RGWt4$}n zvh6x~`v~1N<#`w9Rb&H{Ro*%&P4l*=rmeF!odRXuF#4~1Y|k8EGY z@8#eZgyk^$qx1bd*e}BgS1*I*6Q3)xENrk_Wmf4NiM)hi>z-B50386fBC9oEuv%^@ zzmu#y?9bTTZBVu0}N*aOsxT zv>-gpp$pfrW7lFa>5`|}qei)0z+9*2Ew3C37*FjPYE?{3(5FRJPdDGakv=%;p=qbJ zDVBdzH#`yQBhSX+sq7rx_9O~>DoZ9Mmc`mnWqt>PHXmLnv zGdfga&nt)6qd03zG{6+>1F6-Ph3)&OKDKblHee$Tz%ydl&>Z}N`@<@E{!7~sb_|>` zx*6uE*5g%Jyb({(NGX1vH&dPS@IZR0^@MUM*@B%E+rpD)*d=k*<}rP7r2;!(QuXW+ z^Ry#8WYf8A*Tc^-2>Zbm24UvB!8FKj?aQ=M{NCk9_Z9B_q|Gx4T3yr0BzZ*{mgi~j z;N8F@x`AiHL$$;6#i6Z!zQ|t3piddu6KeYgr{LVK(zyjhz|W4gFOz5b{MVfduM3!CYzpc)1smVPDLOf;Ed$$Ja+W!Y zz?PGw>sV6q3&MK?(B10lhwfHK`E(|&Yk)S(_OhYpm&@Ab%53@{S>Sl)2XpU!on`zIM`-z m>pO-0^##yjeSbs$;$5u4N7xQ6@(@ - + { - if(link.startsWith("/u/") || link.startsWith("u/")) { - Intent intent = new Intent(context, ViewUserDetailActivity.class); - intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, link.substring(3)); - context.startActivity(intent); - } else if(link.startsWith("/r/") || link.startsWith("r/")) { - Intent intent = new Intent(context, ViewSubredditDetailActivity.class); - intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, link.substring(3)); - context.startActivity(intent); + Intent intent = new Intent(context, LinkResolverActivity.class); + Uri uri = Uri.parse(link); + if(uri.getScheme() == null && uri.getHost() == null) { + intent.setData(LinkResolverActivity.getRedditUriByPath(link)); } else { - CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); - // add share action to menu list - builder.addDefaultShareMenuItem(); - builder.setToolbarColor(context.getResources().getColor(R.color.colorPrimary)); - CustomTabsIntent customTabsIntent = builder.build(); - Uri uri = Uri.parse(link); - if(uri.getHost() != null && uri.getHost().contains("reddit.com")) { - customTabsIntent.intent.setPackage(context.getPackageName()); - } - String uriString = uri.toString(); - if(!uriString.startsWith("http://") && (!uriString.startsWith("https://"))) { - uriString = "http://" + uriString; - } - customTabsIntent.launchUrl(context, Uri.parse(uriString)); + intent.setData(uri); } + context.startActivity(intent); }).build(); super.setMarkdown(configuration, markdown); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java index 95e8f658..5a28dc40 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java @@ -35,4 +35,5 @@ interface AppComponent { void inject(EditCommentActivity editCommentActivity); void inject(AccountPostsActivity accountPostsActivity); void inject(PullNotificationWorker pullNotificationWorker); + void inject(ViewMessageActivity viewMessageActivity); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentAndPostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentAndPostRecyclerViewAdapter.java index 89b2817b..347634aa 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentAndPostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentAndPostRecyclerViewAdapter.java @@ -72,7 +72,6 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter { + String authorName = mPost.getAuthor().equals("[deleted]") ? mPost.getSubredditNamePrefixed().substring(2) : mPost.getAuthor(); + new LoadUserDataAsyncTask(mRedditDataRoomDatabase.userDao(), authorName, mOauthRetrofit, iconImageUrl -> { if(mActivity != null && getItemCount() > 0) { if(iconImageUrl == null || iconImageUrl.equals("")) { mGlide.load(R.drawable.subreddit_default_icon) @@ -229,10 +226,7 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter { if(iconImageUrl == null || iconImageUrl.equals("")) { @@ -248,9 +242,7 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter hasPostLiveData.postValue(true); } - callback.onResult(comments, null, after); + if(after == null || after.equals("") || after.equals("null")) { + callback.onResult(comments, null, null); + } else { + callback.onResult(comments, null, after); + } initialLoadStateLiveData.postValue(NetworkState.LOADED); } @@ -147,13 +151,15 @@ public class CommentDataSource extends PageKeyedDataSource } }).execute(); } else { - paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data")); + Log.i("Comments fetch error", "Error fetching data"); + paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error fetching data")); } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data")); + Log.i("Comments fetch error", "Error fetchin data"); + paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error fetching data")); } }); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java index c20920a9..06c4f232 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java @@ -57,13 +57,13 @@ class CommentsListingRecyclerViewAdapter extends PagedListAdapter DIFF_CALLBACK = new DiffUtil.ItemCallback() { @Override - public boolean areItemsTheSame(@NonNull CommentData CommentData, @NonNull CommentData t1) { - return CommentData.getId().equals(t1.getId()); + public boolean areItemsTheSame(@NonNull CommentData commentData, @NonNull CommentData t1) { + return commentData.getId().equals(t1.getId()); } @Override - public boolean areContentsTheSame(@NonNull CommentData CommentData, @NonNull CommentData t1) { - return CommentData.getCommentContent().equals(t1.getCommentContent()); + public boolean areContentsTheSame(@NonNull CommentData commentData, @NonNull CommentData t1) { + return commentData.getCommentContent().equals(t1.getCommentContent()); } }; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMessages.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMessages.java index 04d6f8de..424c1c83 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMessages.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMessages.java @@ -22,8 +22,8 @@ import retrofit2.Retrofit; class FetchMessages { interface FetchMessagesListener { - void fetchSuccess(@Nullable ArrayList messages); - void fetchFailed(boolean shouldRetry); + void fetchSuccess(ArrayList messages, @Nullable String after); + void fetchFailed(); } static final String WHERE_INBOX = "inbox"; @@ -32,22 +32,21 @@ class FetchMessages { static final String WHERE_COMMENTS = "comments"; static void fetchMessagesAsync(Retrofit oauthRetrofit, Locale locale, String accessToken, String where, - FetchMessagesListener fetchMessagesListener) { - oauthRetrofit.create(RedditAPI.class).getMessages(RedditUtils.getOAuthHeader(accessToken), where) + String after, FetchMessagesListener fetchMessagesListener) { + oauthRetrofit.create(RedditAPI.class).getMessages(RedditUtils.getOAuthHeader(accessToken), where, after) .enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { if(response.isSuccessful()) { - new ParseMessageAsnycTask(response.body(), locale, - fetchMessagesListener::fetchSuccess).execute(); + new ParseMessageAsnycTask(response.body(), locale, fetchMessagesListener::fetchSuccess).execute(); } else { - fetchMessagesListener.fetchFailed(true); + fetchMessagesListener.fetchFailed(); } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - fetchMessagesListener.fetchFailed(true); + fetchMessagesListener.fetchFailed(); } }); } @@ -104,12 +103,13 @@ class FetchMessages { private static class ParseMessageAsnycTask extends AsyncTask { interface ParseMessageAsyncTaskListener { - void parseSuccess(ArrayList messages); + void parseSuccess(ArrayList messages, @Nullable String after); } private String response; private Locale locale; private ArrayList messages; + private String after; private ParseMessageAsyncTaskListener parseMessageAsyncTaskListener; ParseMessageAsnycTask(String response, Locale locale, ParseMessageAsyncTaskListener parseMessageAsnycTaskListener) { @@ -122,13 +122,18 @@ class FetchMessages { @Override protected Void doInBackground(Void... voids) { messages = parseMessage(response, locale); + try { + after = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.AFTER_KEY); + } catch (JSONException e) { + e.printStackTrace(); + } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); - parseMessageAsyncTaskListener.parseSuccess(messages); + parseMessageAsyncTaskListener.parseSuccess(messages, after); } } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/LinkResolverActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/LinkResolverActivity.java index d95a210e..1c6ee055 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/LinkResolverActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/LinkResolverActivity.java @@ -85,11 +85,10 @@ public class LinkResolverActivity extends AppCompatActivity { builder.setToolbarColor(getResources().getColor(R.color.colorPrimary)); CustomTabsIntent customTabsIntent = builder.build(); customTabsIntent.intent.setPackage(resolveInfos.get(0).activityInfo.packageName); - String uriString = uri.toString(); - if(!uriString.startsWith("http://") || (!uriString.startsWith("https://"))) { - uriString = "http://" + uriString; + if(uri.getScheme() == null) { + uri = Uri.parse("http://" + uri.toString()); } - customTabsIntent.launchUrl(this, Uri.parse(uriString)); + customTabsIntent.launchUrl(this, uri); } else { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(uri); @@ -133,7 +132,7 @@ public class LinkResolverActivity extends AppCompatActivity { return packagesSupportingCustomTabs; } - static Uri getRedditUriByPath(String path) { + public static Uri getRedditUriByPath(String path) { return Uri.parse("https://www.reddit.com" + path); } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java index b9d79b94..f2c58214 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java @@ -83,6 +83,7 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe @BindView(R.id.all_drawer_items_linear_layout_main_activity) LinearLayout allDrawerItemsLinearLayout; @BindView(R.id.profile_linear_layout_main_activity) LinearLayout profileLinearLayout; @BindView(R.id.subscriptions_linear_layout_main_activity) LinearLayout subscriptionLinearLayout; + @BindView(R.id.inbox_linear_layout_main_activity) LinearLayout inboxLinearLayout; @BindView(R.id.upvoted_linear_layout_main_activity) LinearLayout upvotedLinearLayout; @BindView(R.id.downvoted_linear_layout_main_activity) LinearLayout downvotedLinearLayout; @BindView(R.id.hidden_linear_layout_main_activity) LinearLayout hiddenLinearLayout; @@ -385,6 +386,12 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe mAccountNameTextView.setText(R.string.anonymous_account); profileLinearLayout.setVisibility(View.GONE); subscriptionLinearLayout.setVisibility(View.GONE); + inboxLinearLayout.setVisibility(View.GONE); + upvotedLinearLayout.setVisibility(View.GONE); + downvotedLinearLayout.setVisibility(View.GONE); + hiddenLinearLayout.setVisibility(View.GONE); + savedLinearLayout.setVisibility(View.GONE); + gildedLinearLayout.setVisibility(View.GONE); divider.setVisibility(View.GONE); } @@ -417,6 +424,12 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe drawer.closeDrawers(); }); + inboxLinearLayout.setOnClickListener(view -> { + Intent intent = new Intent(this, ViewMessageActivity.class); + startActivity(intent); + drawer.closeDrawers(); + }); + upvotedLinearLayout.setOnClickListener(view -> { Intent intent = new Intent(MainActivity.this, AccountPostsActivity.class); intent.putExtra(AccountPostsActivity.EXTRA_USER_WHERE, PostDataSource.USER_WHERE_UPVOTED); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Message.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Message.java index 1846a8ef..1df3b233 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Message.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Message.java @@ -104,7 +104,7 @@ class Message { return formattedTime; } - public boolean isWasComment() { + public boolean wasComment() { return wasComment; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MessageDataSource.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MessageDataSource.java new file mode 100644 index 00000000..3b2af4fb --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MessageDataSource.java @@ -0,0 +1,123 @@ +package ml.docilealligator.infinityforreddit; + +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.MutableLiveData; +import androidx.paging.PageKeyedDataSource; + +import java.util.ArrayList; +import java.util.Locale; + +import retrofit2.Retrofit; + +class MessageDataSource extends PageKeyedDataSource { + private Retrofit oauthRetrofit; + private Locale locale; + private String accessToken; + private String where; + + private MutableLiveData paginationNetworkStateLiveData; + private MutableLiveData initialLoadStateLiveData; + private MutableLiveData hasPostLiveData; + + private LoadInitialParams initialParams; + private LoadInitialCallback initialCallback; + private LoadParams params; + private LoadCallback callback; + + MessageDataSource(Retrofit oauthRetrofit, Locale locale, String accessToken, String where) { + this.oauthRetrofit = oauthRetrofit; + this.locale = locale; + this.accessToken = accessToken; + this.where = where; + paginationNetworkStateLiveData = new MutableLiveData<>(); + initialLoadStateLiveData = new MutableLiveData<>(); + hasPostLiveData = new MutableLiveData<>(); + } + + MutableLiveData getPaginationNetworkStateLiveData() { + return paginationNetworkStateLiveData; + } + + MutableLiveData getInitialLoadStateLiveData() { + return initialLoadStateLiveData; + } + + MutableLiveData hasPostLiveData() { + return hasPostLiveData; + } + + void retry() { + loadInitial(initialParams, initialCallback); + } + + void retryLoadingMore() { + loadAfter(params, callback); + } + + @Override + public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback callback) { + initialParams = params; + initialCallback = callback; + + initialLoadStateLiveData.postValue(NetworkState.LOADING); + + FetchMessages.fetchMessagesAsync(oauthRetrofit, locale, accessToken, where, null, new FetchMessages.FetchMessagesListener() { + @Override + public void fetchSuccess(ArrayList messages, @Nullable String after) { + if(messages.size() == 0) { + hasPostLiveData.postValue(false); + } else { + hasPostLiveData.postValue(true); + } + + if(after == null || after.equals("") || after.equals("null")) { + callback.onResult(messages, null, null); + } else { + callback.onResult(messages, null, after); + } + initialLoadStateLiveData.postValue(NetworkState.LOADED); + } + + @Override + public void fetchFailed() { + Log.i("Messages fetch error", "Error fetch messages"); + initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error fetch messages")); + } + }); + } + + @Override + public void loadBefore(@NonNull LoadParams params, @NonNull LoadCallback callback) { + + } + + @Override + public void loadAfter(@NonNull LoadParams params, @NonNull LoadCallback callback) { + this.params = params; + this.callback = callback; + + paginationNetworkStateLiveData.postValue(NetworkState.LOADING); + + FetchMessages.fetchMessagesAsync(oauthRetrofit, locale, accessToken, where, params.key, new FetchMessages.FetchMessagesListener() { + @Override + public void fetchSuccess(ArrayList messages, @Nullable String after) { + if(after == null || after.equals("") || after.equals("null")) { + callback.onResult(messages, null); + } else { + callback.onResult(messages, after); + } + + paginationNetworkStateLiveData.postValue(NetworkState.LOADED); + } + + @Override + public void fetchFailed() { + Log.i("Comments fetch error", "Error parsing data"); + paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error fetching data")); + } + }); + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MessageDataSourceFactory.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MessageDataSourceFactory.java new file mode 100644 index 00000000..b1470bf7 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MessageDataSourceFactory.java @@ -0,0 +1,47 @@ +package ml.docilealligator.infinityforreddit; + +import androidx.annotation.NonNull; +import androidx.lifecycle.MutableLiveData; +import androidx.paging.DataSource; + +import java.util.Locale; + +import retrofit2.Retrofit; + +class MessageDataSourceFactory extends DataSource.Factory { + private Retrofit oauthRetrofit; + private Locale locale; + private String accessToken; + private String where; + + private MessageDataSource messageDataSource; + private MutableLiveData messageDataSourceLiveData; + + MessageDataSourceFactory(Retrofit oauthRetrofit, Locale locale, String accessToken, String where) { + this.oauthRetrofit = oauthRetrofit; + this.locale = locale; + this.accessToken = accessToken; + this.where = where; + messageDataSourceLiveData = new MutableLiveData<>(); + } + + @NonNull + @Override + public DataSource create() { + messageDataSource = new MessageDataSource(oauthRetrofit, locale, accessToken, where); + messageDataSourceLiveData.postValue(messageDataSource); + return messageDataSource; + } + + public MutableLiveData getMessageDataSourceLiveData() { + return messageDataSourceLiveData; + } + + MessageDataSource getMessageDataSource() { + return messageDataSource; + } + + void changeWhere(String where) { + this.where = where; + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MessageRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MessageRecyclerViewAdapter.java new file mode 100644 index 00000000..3865123b --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MessageRecyclerViewAdapter.java @@ -0,0 +1,195 @@ +package ml.docilealligator.infinityforreddit; + +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.net.Uri; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.paging.PagedListAdapter; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.RecyclerView; + +import CustomView.CustomMarkwonView; +import butterknife.BindView; +import butterknife.ButterKnife; + +class MessageRecyclerViewAdapter extends PagedListAdapter { + private static final int VIEW_TYPE_DATA = 0; + private static final int VIEW_TYPE_ERROR = 1; + private static final int VIEW_TYPE_LOADING = 2; + + private Context mContext; + private Resources resources; + + private NetworkState networkState; + private CommentsListingRecyclerViewAdapter.RetryLoadingMoreCallback mRetryLoadingMoreCallback; + + interface RetryLoadingMoreCallback { + void retryLoadingMore(); + } + + MessageRecyclerViewAdapter(Context context) { + super(DIFF_CALLBACK); + mContext = context; + resources = context.getResources(); + } + + private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() { + @Override + public boolean areItemsTheSame(@NonNull Message message, @NonNull Message t1) { + return message.getId().equals(t1.getId()); + } + + @Override + public boolean areContentsTheSame(@NonNull Message message, @NonNull Message t1) { + return message.getBody().equals(t1.getBody()); + } + }; + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if(viewType == VIEW_TYPE_DATA) { + return new DataViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_message, parent, false)); + } else if(viewType == VIEW_TYPE_ERROR) { + return new ErrorViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer_error, parent, false)); + } else { + return new LoadingViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer_loading, parent, false)); + } + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if(holder instanceof DataViewHolder) { + Message message = getItem(holder.getAdapterPosition()); + if(message != null) { + if(message.isNew()) { + ((DataViewHolder) holder).itemView.setBackgroundColor( + resources.getColor(R.color.unreadMessageBackgroundColor)); + } + + if(message.wasComment()) { + ((DataViewHolder) holder).authorTextView.setTextColor(resources.getColor(R.color.colorPrimaryDarkDayNightTheme)); + ((DataViewHolder) holder).titleTextView.setText(message.getTitle()); + } else { + ((DataViewHolder) holder).titleTextView.setVisibility(View.GONE); + } + + ((DataViewHolder) holder).authorTextView.setText(message.getAuthor()); + String subject = message.getSubject().substring(0, 1).toUpperCase() + message.getSubject().substring(1); + ((DataViewHolder) holder).subjectTextView.setText(subject); + ((DataViewHolder) holder).contentCustomMarkwonView.setMarkdown(message.getBody(), mContext); + + ((DataViewHolder) holder).itemView.setOnClickListener(view -> { + if(message.getContext() != null && !message.getContext().equals("")) { + Uri uri = LinkResolverActivity.getRedditUriByPath(message.getContext()); + Intent intent = new Intent(mContext, LinkResolverActivity.class); + intent.setData(uri); + mContext.startActivity(intent); + } + }); + + ((DataViewHolder) holder).authorTextView.setOnClickListener(view -> { + if(message.wasComment()) { + Intent intent = new Intent(mContext, ViewUserDetailActivity.class); + intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, message.getAuthor()); + mContext.startActivity(intent); + } + }); + + ((DataViewHolder) holder).contentCustomMarkwonView.setOnClickListener(view -> ((DataViewHolder) holder).itemView.performClick()); + } + } + } + + @Override + public int getItemViewType(int position) { + // Reached at the end + if (hasExtraRow() && position == getItemCount() - 1) { + if (networkState.getStatus() == NetworkState.Status.LOADING) { + return VIEW_TYPE_LOADING; + } else { + return VIEW_TYPE_ERROR; + } + } else { + return VIEW_TYPE_DATA; + } + } + + @Override + public int getItemCount() { + if(hasExtraRow()) { + return super.getItemCount() + 1; + } + return super.getItemCount(); + } + + @Override + public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) { + super.onViewRecycled(holder); + if(holder instanceof DataViewHolder) { + ((DataViewHolder) holder).itemView.setBackgroundColor(resources.getColor(android.R.color.white)); + ((DataViewHolder) holder).titleTextView.setVisibility(View.VISIBLE); + ((DataViewHolder) holder).authorTextView.setTextColor(resources.getColor(R.color.primaryTextColor)); + } + } + + private boolean hasExtraRow() { + return networkState != null && networkState.getStatus() != NetworkState.Status.SUCCESS; + } + + void setNetworkState(NetworkState newNetworkState) { + NetworkState previousState = this.networkState; + boolean previousExtraRow = hasExtraRow(); + this.networkState = newNetworkState; + boolean newExtraRow = hasExtraRow(); + if (previousExtraRow != newExtraRow) { + if (previousExtraRow) { + notifyItemRemoved(super.getItemCount()); + } else { + notifyItemInserted(super.getItemCount()); + } + } else if (newExtraRow && !previousState.equals(newNetworkState)) { + notifyItemChanged(getItemCount() - 1); + } + } + + class DataViewHolder extends RecyclerView.ViewHolder { + View itemView; + @BindView(R.id.author_text_view_item_message) TextView authorTextView; + @BindView(R.id.subject_text_view_item_message) TextView subjectTextView; + @BindView(R.id.title_text_view_item_message) TextView titleTextView; + @BindView(R.id.content_custom_markwon_view_item_message) CustomMarkwonView contentCustomMarkwonView; + + DataViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); + this.itemView = itemView; + } + } + + class ErrorViewHolder extends RecyclerView.ViewHolder { + @BindView(R.id.error_text_view_item_footer_error) TextView errorTextView; + @BindView(R.id.retry_button_item_footer_error) Button retryButton; + + ErrorViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); + errorTextView.setText(R.string.load_comments_failed); + retryButton.setOnClickListener(view -> mRetryLoadingMoreCallback.retryLoadingMore()); + } + } + + class LoadingViewHolder extends RecyclerView.ViewHolder { + LoadingViewHolder(@NonNull View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); + } + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MessageViewModel.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MessageViewModel.java new file mode 100644 index 00000000..4ad155d6 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MessageViewModel.java @@ -0,0 +1,100 @@ +package ml.docilealligator.infinityforreddit; + +import androidx.annotation.NonNull; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Transformations; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; +import androidx.paging.LivePagedListBuilder; +import androidx.paging.PagedList; + +import java.util.Locale; + +import retrofit2.Retrofit; + +public class MessageViewModel extends ViewModel { + private MessageDataSourceFactory messageDataSourceFactory; + private LiveData paginationNetworkState; + private LiveData initialLoadingState; + private LiveData hasMessageLiveData; + private LiveData> messages; + private MutableLiveData whereLiveData; + + public MessageViewModel(Retrofit retrofit, Locale locale, String accessToken, String where) { + messageDataSourceFactory = new MessageDataSourceFactory(retrofit, locale, accessToken, where); + + initialLoadingState = Transformations.switchMap(messageDataSourceFactory.getMessageDataSourceLiveData(), + MessageDataSource::getInitialLoadStateLiveData); + paginationNetworkState = Transformations.switchMap(messageDataSourceFactory.getMessageDataSourceLiveData(), + MessageDataSource::getPaginationNetworkStateLiveData); + hasMessageLiveData = Transformations.switchMap(messageDataSourceFactory.getMessageDataSourceLiveData(), + MessageDataSource::hasPostLiveData); + + whereLiveData = new MutableLiveData<>(); + whereLiveData.postValue(where); + + PagedList.Config pagedListConfig = + (new PagedList.Config.Builder()) + .setEnablePlaceholders(false) + .setPageSize(25) + .build(); + + messages = Transformations.switchMap(whereLiveData, newWhere -> { + messageDataSourceFactory.changeWhere(whereLiveData.getValue()); + return (new LivePagedListBuilder(messageDataSourceFactory, pagedListConfig)).build(); + }); + } + + LiveData> getMessages() { + return messages; + } + + LiveData getPaginationNetworkState() { + return paginationNetworkState; + } + + LiveData getInitialLoadingState() { + return initialLoadingState; + } + + LiveData hasMessage() { + return hasMessageLiveData; + } + + void refresh() { + messageDataSourceFactory.getMessageDataSource().invalidate(); + } + + void retry() { + messageDataSourceFactory.getMessageDataSource().retry(); + } + + void retryLoadingMore() { + messageDataSourceFactory.getMessageDataSource().retryLoadingMore(); + } + + void changeWhere(String where) { + whereLiveData.postValue(where); + } + + public static class Factory extends ViewModelProvider.NewInstanceFactory { + private Retrofit retrofit; + private Locale locale; + private String accessToken; + private String where; + + public Factory(Retrofit retrofit, Locale locale, String accessToken, String where) { + this.retrofit = retrofit; + this.locale = locale; + this.accessToken = accessToken; + this.where = where; + } + + @NonNull + @Override + public T create(@NonNull Class modelClass) { + return (T) new MessageViewModel(retrofit, locale, accessToken, where); + } + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java index 22e3787c..56d35248 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java @@ -43,7 +43,7 @@ class ParseSubredditData { jsonResponse = new JSONObject(response); parseFailed = false; } catch (JSONException e) { - Log.i("subreddit json error", e.getMessage()); + Log.i("subreddit json error", "message: " + e.getMessage()); parseSubredditDataListener.onParseSubredditDataFail(); } } @@ -54,38 +54,9 @@ class ParseSubredditData { JSONObject data = jsonResponse.getJSONObject(JSONUtils.DATA_KEY); mNCurrentOnlineSubscribers = data.getInt(JSONUtils.ACTIVE_USER_COUNT_KEY); subredditData = parseSubredditData(data); - /*String id = data.getString(JSONUtils.EXTRA_NAME); - String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME); - String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim(); - - String bannerImageUrl; - if(data.isNull(JSONUtils.BANNER_BACKGROUND_IMAGE_KEY)) { - bannerImageUrl = ""; - } else { - bannerImageUrl = data.getString(JSONUtils.BANNER_BACKGROUND_IMAGE_KEY); - } - if(bannerImageUrl.equals("") && !data.isNull(JSONUtils.BANNER_IMG_KEY)) { - bannerImageUrl= data.getString(JSONUtils.BANNER_IMG_KEY); - } - - String iconUrl; - if(data.isNull(JSONUtils.COMMUNITY_ICON_KEY)) { - iconUrl = ""; - } else { - iconUrl = data.getString(JSONUtils.COMMUNITY_ICON_KEY); - } - if(iconUrl.equals("") && !data.isNull(JSONUtils.ICON_IMG_KEY)) { - iconUrl = data.getString(JSONUtils.ICON_IMG_KEY); - } - - int nSubscribers = data.getInt(JSONUtils.SUBSCRIBERS_KEY); - int nCurrentOnlineSubscribers = data.getInt(JSONUtils.ACTIVE_USER_COUNT_KEY); - subredditData = new SubredditData(id, subredditFullName, iconUrl, bannerImageUrl, description, nSubscribers); - mNCurrentOnlineSubscribers = nCurrentOnlineSubscribers;*/ } catch (JSONException e) { parseFailed = true; Log.i("parse", "SubredditData error"); - parseSubredditDataListener.onParseSubredditDataFail(); } return null; } @@ -114,7 +85,7 @@ class ParseSubredditData { parseFailed = false; subredditListingData = new ArrayList<>(); } catch (JSONException e) { - Log.i("subreddit json error", e.getMessage()); + Log.i("subreddit json error", "message: " + e.getMessage()); parseFailed = true; } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java index 239bf8c0..8d00a010 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java @@ -248,7 +248,8 @@ class PostRecyclerViewAdapter extends PagedListAdapter { + String authorName = post.getAuthor().equals("[deleted]") ? post.getSubredditNamePrefixed().substring(2) : post.getAuthor(); + new LoadUserDataAsyncTask(mUserDao, authorName, mRetrofit, iconImageUrl -> { if(mContext != null && getItemCount() > 0) { if(iconImageUrl == null || iconImageUrl.equals("")) { mGlide.load(R.drawable.subreddit_default_icon) diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PullNotificationWorker.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PullNotificationWorker.java index 512096c7..57c13212 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PullNotificationWorker.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PullNotificationWorker.java @@ -49,13 +49,13 @@ public class PullNotificationWorker extends Worker { Account currentAccount = redditDataRoomDatabase.accountDao().getCurrentAccount(); Response response = mOauthRetrofit.create(RedditAPI.class).getMessages( RedditUtils.getOAuthHeader(currentAccount.getAccessToken()), - FetchMessages.WHERE_COMMENTS).execute(); + FetchMessages.WHERE_UNREAD, null).execute(); Log.i("workmanager", "has response"); if(response.isSuccessful()) { String responseBody = response.body(); ArrayList messages = FetchMessages.parseMessage(responseBody, context.getResources().getConfiguration().locale); - if(messages != null) { + if(messages != null && !messages.isEmpty()) { NotificationManagerCompat notificationManager = NotificationUtils.getNotificationManager(context); NotificationCompat.Builder summaryBuilder = NotificationUtils.buildSummaryNotification(context, diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java index ddd53c47..a187b521 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java @@ -158,5 +158,5 @@ public interface RedditAPI { Call selectFlair(@Path("subredditNamePrefixed") String subredditName, @HeaderMap Map headers, @FieldMap Map params); @GET("/message/{where}.json?raw_json=1") - Call getMessages(@HeaderMap Map headers, @Path("where") String where); + Call getMessages(@HeaderMap Map headers, @Path("where") String where, @Query("after") String after); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewMessageActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewMessageActivity.java new file mode 100644 index 00000000..b61438f4 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewMessageActivity.java @@ -0,0 +1,230 @@ +package ml.docilealligator.infinityforreddit; + +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Build; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestManager; +import com.google.android.material.appbar.AppBarLayout; +import com.google.android.material.appbar.CollapsingToolbarLayout; +import com.lsjwzh.widget.materialloadingprogressbar.CircleProgressBar; + +import javax.inject.Inject; +import javax.inject.Named; + +import Account.Account; +import butterknife.BindView; +import butterknife.ButterKnife; +import retrofit2.Retrofit; + +public class ViewMessageActivity extends AppCompatActivity { + + private static final String NULL_ACCESS_TOKEN_STATE = "NATS"; + private static final String ACCESS_TOKEN_STATE = "ATS"; + + @BindView(R.id.collapsing_toolbar_layout_view_message_activity) CollapsingToolbarLayout collapsingToolbarLayout; + @BindView(R.id.appbar_layout_view_message_activity) AppBarLayout appBarLayout; + @BindView(R.id.toolbar_view_message_activity) Toolbar toolbar; + @BindView(R.id.progress_bar_view_message_activity) CircleProgressBar mProgressBar; + @BindView(R.id.recycler_view_view_message_activity) RecyclerView recyclerView; + @BindView(R.id.fetch_messages_info_linear_layout_view_message_activity) LinearLayout mFetchMessageInfoLinearLayout; + @BindView(R.id.fetch_messages_info_image_view_view_message_activity) ImageView mFetchMessageInfoImageView; + @BindView(R.id.fetch_messages_info_text_view_view_message_activity) TextView mFetchMessageInfoTextView; + + private boolean mNullAccessToken = false; + private String mAccessToken; + + private MessageRecyclerViewAdapter mAdapter; + + private RequestManager mGlide; + + MessageViewModel mMessageViewModel; + + @Inject + @Named("oauth") + Retrofit mOauthRetrofit; + + @Inject + RedditDataRoomDatabase mRedditDataRoomDatabase; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_view_message); + + ButterKnife.bind(this); + + ((Infinity) getApplication()).getAppComponent().inject(this); + + mGlide = Glide.with(this); + + Resources resources = getResources(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1 + && (resources.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT + || resources.getBoolean(R.bool.isTablet))) { + Window window = getWindow(); + window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); + + boolean lightNavBar = false; + if((resources.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) != Configuration.UI_MODE_NIGHT_YES) { + lightNavBar = true; + } + boolean finalLightNavBar = lightNavBar; + + View decorView = window.getDecorView(); + if(finalLightNavBar) { + decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } + appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() { + @Override + void onStateChanged(AppBarLayout appBarLayout, State state) { + if (state == State.COLLAPSED) { + if(finalLightNavBar) { + decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } + } else if (state == State.EXPANDED) { + if(finalLightNavBar) { + decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } + } + } + }); + + int statusBarResourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (statusBarResourceId > 0) { + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams(); + params.topMargin = getResources().getDimensionPixelSize(statusBarResourceId); + toolbar.setLayoutParams(params); + } + + int navBarResourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + if (navBarResourceId > 0) { + recyclerView.setPadding(0, 0, 0, resources.getDimensionPixelSize(navBarResourceId)); + } + } + + toolbar.setTitle(R.string.inbox); + setSupportActionBar(toolbar); + + if(savedInstanceState != null) { + mNullAccessToken = savedInstanceState.getBoolean(NULL_ACCESS_TOKEN_STATE); + mAccessToken = savedInstanceState.getString(ACCESS_TOKEN_STATE); + + if(!mNullAccessToken && mAccessToken == null) { + getCurrentAccountAndFetchMessage(); + } else { + bindView(); + } + } else { + getCurrentAccountAndFetchMessage(); + } + } + + private void getCurrentAccountAndFetchMessage() { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), new GetCurrentAccountAsyncTask.GetCurrentAccountAsyncTaskListener() { + @Override + public void success(Account account) { + if(account == null) { + mNullAccessToken = true; + } else { + mAccessToken = account.getAccessToken(); + + bindView(); + } + } + }).execute(); + } + + private void bindView() { + mAdapter = new MessageRecyclerViewAdapter(this); + LinearLayoutManager layoutManager = new LinearLayoutManager(this); + recyclerView.setLayoutManager(layoutManager); + recyclerView.setAdapter(mAdapter); + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, layoutManager.getOrientation()); + recyclerView.addItemDecoration(dividerItemDecoration); + + MessageViewModel.Factory factory = new MessageViewModel.Factory(mOauthRetrofit, + getResources().getConfiguration().locale, mAccessToken, FetchMessages.WHERE_INBOX); + mMessageViewModel = new ViewModelProvider(this, factory).get(MessageViewModel.class); + mMessageViewModel.getMessages().observe(this, messages -> mAdapter.submitList(messages)); + + mMessageViewModel.getInitialLoadingState().observe(this, networkState -> { + if(networkState.getStatus().equals(NetworkState.Status.SUCCESS)) { + mProgressBar.setVisibility(View.GONE); + } else if(networkState.getStatus().equals(NetworkState.Status.FAILED)) { + mFetchMessageInfoLinearLayout.setOnClickListener(view -> mMessageViewModel.retry()); + showErrorView(R.string.load_messages_failed); + } else { + mFetchMessageInfoLinearLayout.setVisibility(View.GONE); + mProgressBar.setVisibility(View.VISIBLE); + } + }); + + mMessageViewModel.hasMessage().observe(this, hasMessage -> { + if(hasMessage) { + mFetchMessageInfoLinearLayout.setVisibility(View.GONE); + } else { + mFetchMessageInfoLinearLayout.setOnClickListener(view -> { + //Do nothing + }); + showErrorView(R.string.no_messages); + } + }); + + mMessageViewModel.getPaginationNetworkState().observe(this, networkState -> { + mAdapter.setNetworkState(networkState); + }); + } + + private void showErrorView(int stringResId) { + mProgressBar.setVisibility(View.GONE); + mFetchMessageInfoLinearLayout.setVisibility(View.VISIBLE); + mFetchMessageInfoTextView.setText(stringResId); + mGlide.load(R.drawable.load_post_error_indicator).into(mFetchMessageInfoImageView); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.view_message_activity, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if(item.getItemId() == R.id.action_refresh_view_message_activity) { + mMessageViewModel.refresh(); + return true; + } else if(item.getItemId() == android.R.id.home) { + finish(); + return true; + } + return false; + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(NULL_ACCESS_TOKEN_STATE, mNullAccessToken); + outState.putString(ACCESS_TOKEN_STATE, mAccessToken); + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java index 1039fc96..9e7bdb9b 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java @@ -101,7 +101,6 @@ public class ViewPostDetailActivity extends AppCompatActivity implements FlairBo private LinearLayoutManager mLinearLayoutManager; private CommentAndPostRecyclerViewAdapter mAdapter; - private LoadSubredditIconAsyncTask mLoadSubredditIconAsyncTask; @BindView(R.id.coordinator_layout_view_post_detail) CoordinatorLayout mCoordinatorLayout; @BindView(R.id.appbar_layout_view_post_detail_activity) AppBarLayout appBarLayout; @@ -255,7 +254,7 @@ public class ViewPostDetailActivity extends AppCompatActivity implements FlairBo } mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit, mOauthRetrofit, mRedditDataRoomDatabase, mGlide, mAccessToken, mAccountName, mPost, - mLocale, mSingleCommentId, isSingleCommentThreadMode, mLoadSubredditIconAsyncTask, + mLocale, mSingleCommentId, isSingleCommentThreadMode, new CommentAndPostRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() { @Override public void updatePost(Post post) { @@ -331,7 +330,7 @@ public class ViewPostDetailActivity extends AppCompatActivity implements FlairBo mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit, mOauthRetrofit, mRedditDataRoomDatabase, mGlide, mAccessToken, mAccountName, mPost, - mLocale, mSingleCommentId, isSingleCommentThreadMode, mLoadSubredditIconAsyncTask, + mLocale, mSingleCommentId, isSingleCommentThreadMode, new CommentAndPostRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() { @Override public void updatePost(Post post) { @@ -817,9 +816,6 @@ public class ViewPostDetailActivity extends AppCompatActivity implements FlairBo EventBus.getDefault().unregister(this); super.onDestroy(); Bridge.clear(this); - if(mLoadSubredditIconAsyncTask != null) { - mLoadSubredditIconAsyncTask.cancel(true); - } } @Override diff --git a/app/src/main/res/drawable/ic_outline_inbox_24px.xml b/app/src/main/res/drawable/ic_outline_inbox_24px.xml new file mode 100644 index 00000000..97d34185 --- /dev/null +++ b/app/src/main/res/drawable/ic_outline_inbox_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 407c2a1d..849253a1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -90,6 +90,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_message.xml b/app/src/main/res/layout/item_message.xml new file mode 100644 index 00000000..12fd25c4 --- /dev/null +++ b/app/src/main/res/layout/item_message.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/view_message_activity.xml b/app/src/main/res/menu/view_message_activity.xml new file mode 100644 index 00000000..ae1bdfdc --- /dev/null +++ b/app/src/main/res/menu/view_message_activity.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ee3bdeed..ef901a9e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -47,4 +47,6 @@ #FFFFFF #B3E5F9 + + #B3E5F9 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 359315a2..1943b769 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,6 +13,7 @@ Subreddits Edit Post Edit Comment + Inbox Open navigation drawer Close navigation drawer @@ -50,19 +51,23 @@ No users found No storage permission to save this file - Error loading comments. + Error loading comments Retry Comments No comments yet. Write a comment? Vote failed Error refreshing the post + Error loading messages + Empty + NSFW Karma: %1$d Profile Following Subscriptions + Inbox Upvoted Downvoted Hidden