From 0633d01abee95e6e9ffcdfe667d11d4e80205648 Mon Sep 17 00:00:00 2001 From: MaximeE Date: Fri, 22 Apr 2022 18:04:19 +0200 Subject: [PATCH] 6029: Refacto how to handle all state of the live location cell --- .../Contents.json | 23 ++ .../Group 1.png | Bin 0 -> 5239 bytes .../Group 1@2x.png | Bin 0 -> 12341 bytes .../Group 1@3x.png | Bin 0 -> 22767 bytes .../Contents.json | 26 +++ .../Subtract.png | Bin 0 -> 1111 bytes .../Subtract@2x.png | Bin 0 -> 2229 bytes .../Subtract@3x.png | Bin 0 -> 3268 bytes .../Contents.json | 23 ++ .../Group 1.png | Bin 0 -> 4862 bytes .../Group 1@2x.png | Bin 0 -> 12255 bytes .../Group 1@3x.png | Bin 0 -> 22868 bytes Riot/Assets/en.lproj/Vector.strings | 2 + Riot/Generated/Images.swift | 3 + Riot/Generated/Strings.swift | 8 + Riot/Managers/Theme/Theme.swift | 10 + Riot/Managers/Theme/Themes/DarkTheme.swift | 8 + Riot/Managers/Theme/Themes/DefaultTheme.swift | 8 + .../Location/RoomTimelineLocationView.swift | 218 +++++++++++++++--- .../Location/RoomTimelineLocationView.xib | 18 +- Riot/Modules/Room/MXKRoomViewController.m | 16 ++ .../Common/MXKRoomBubbleTableViewCell.h | 14 ++ .../Common/MXKRoomBubbleTableViewCell.m | 3 + .../Cells/Location/LocationPlainCell.swift | 61 +++-- 24 files changed, 368 insertions(+), 73 deletions(-) create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Contents.json create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Group 1.png create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Group 1@2x.png create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Group 1@3x.png create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Contents.json create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Subtract.png create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Subtract@2x.png create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Subtract@3x.png create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_loading_image.imageset/Contents.json create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_loading_image.imageset/Group 1.png create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_loading_image.imageset/Group 1@2x.png create mode 100644 Riot/Assets/Images.xcassets/Room/Location/location_live_cell_loading_image.imageset/Group 1@3x.png diff --git a/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Contents.json new file mode 100644 index 000000000..ad6d3af55 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Group 1.png b/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Group 1.png new file mode 100644 index 0000000000000000000000000000000000000000..d1087e6b3c5a36573d065ccc1c5fd6b504988b64 GIT binary patch literal 5239 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 literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Group 1@2x.png b/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_ended_image.imageset/Group 1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ffad58d654877f99813d23db93228a8bfa58dee2 GIT binary patch literal 12341 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 T$H{;n1A>e%Sr}AaaE<#P*f#cX literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Contents.json new file mode 100644 index 000000000..188a203cc --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "Subtract.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Subtract@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Subtract@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Subtract.png b/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Subtract.png new file mode 100644 index 0000000000000000000000000000000000000000..16be3b51b7ff4ba41342ea8348c53cd12ce462b0 GIT binary patch literal 1111 zcmV-d1gQIoP)lv%n2Yg?Ipt)5Hn;R zG10((go`w7jaSi&D*z|-AU_s>-vi((iWz$OXF3%k*{$EfV&JCRgqIBd7`{OesGEO+ z(?uS^1>gy7`o8>3U_FxgPn6bqgXY2CZm$_!#SH3SzTLk00%yV3Zuw1_^8`lVO##2U zL-3eHtBQ$m1R8Mn0IrghSSIFy()ItsJ&Jf?OOL`lAbEZgy~{k(mIwdGts12GFz~tl z>7HA`RG;VPGmBbV6x%8sNs*}p=_K80WesfnxKN?zSN;du>g=|k>EHhDlLA01Vx3GT zNxIkWdEm2Zi3C%zv48pQNFH97>zOKxjwF*!LxL$mM(A~Ro;Hqn6haB}QUC~|( zJopZp#M7fz(j;fl2@Bv~8N2F8)Em3)BS9Sm0zjuR;PB0rS)$MBZ$A&JZ$0}n-K*XL z4erg!k$N`Ph0<4qAUqBx@kiy<6%^#VP*jn~Ih+@b?J~ShcUKlaw zy7tWOpdglC1Ogtn#Q~TE0+Ytbs+BYy&-~uj%3zrj#?Y8BHewnFO}7F2CE-krND79S zg>Pkz;tprUAt+|^h9meX-VogVw0*AbwM-xvVnP&#a+`Dhs3e;~Rb!CjKy5anhoa{< zge`kHelp~eEqO-I+~ zz_phU26CDOMz{=6B-gWNEP}Bx4m0uy?}K$nmhU|AmTD5^uZNfKx)NnGZB*B*Sg7P? zFHv2#wTpS_yXo-rlF`uY9^OU$)9fhB!?O_Ie0ED+E#EQ3RO$0V{6 z1Lg=A2|Ef)nGEg%Ty$5iucZEB@F dX=}CX`4=bB_gt#VeJ20_002ovPDHLkV1g5G2^IhV literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Subtract@2x.png b/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_icon.imageset/Subtract@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4e20a1517fd39448ff15e283ac19d8f70dcbba65 GIT binary patch literal 2229 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 literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_loading_image.imageset/Group 1@2x.png b/Riot/Assets/Images.xcassets/Room/Location/location_live_cell_loading_image.imageset/Group 1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f8054f3d447b248b4b6445cf8aa315c7f4fc9ca4 GIT binary patch literal 12255 zcmXw92{@GN+aF7ovUkch7<<`Lk}aH}tf6cZ#!|K-ORs&ODC&g9Hpo^9A!AF7y>v8# zMiN8z%#dBy?B6rze|@f8U1py5d7pdx-M{<3pC{MN4LOes9f!eSoW@31EMYK4e;ABG zos9*2GO|k61^==88`%ZGV5g<&zYNBfQmf!Yh5$=LJs6%0p96m|dm_z{Fj)1o6Z^N0 z!C>bCjjtfBLm8IFPUOH1QZh@nF5bzl zzssN-CJ@alpp?w}|DP?IU>9nZQxhiBN2JD<$_9a>6|?!X&J<0F zUy^Q6RZ3sP{kVb!Cs5PFXz|UVlPuGpe%Mindyp1fkva`t)6FxP+>_~UL(n6*`N2)g z!3OSZ{*vdJHHIZ;_p~7m6;mKD`YJ{^dp&~sdRW{DD=%)Yg%Y8g!uMU^Gqf1hO{2~% z>S{8A71qAUJ859v>!3(^Rf<$9(lkttXNAFLp2F04^|Afs%=KSGDh6M+gB^R=7<_NX z|CS^h@;65B8_5tEV9K)04eaHd+{_x_k$9MA`@aaap44vopNSIfg3zVdPg<3Z<(nq- zPp&<&EV?Vis!xqpdUdXC4ewJ+PBqoEAfJzAhQXL#_3)>;=2BlyV5vP%W@FLw&*oC= zZ0PpsKV?CwNb`)u;ybVF^nWi>ACf>S;Slv$9!hU&cMmX@OKKoD`YbuUJV>0Bo!jah zUG5q1@id{W8zPl*`ONPY*$9ckU|Fdr%s6U>9c2zoAIY%9=DI@`nXRG&12UCJr9Q%O zSi97{CA|#KKf7q`iK5%n2mXARIPvgnsC#HBx~PH^ng-NJY??s=kKV-U-`Lt22-|(} zG7P3{PkGKH%e`t_vS0sWlE?K$z`z@EB1u6*gkw~OE`Ve}A+mK1Mq&C+sW_2?m}P@l zNK1*(v&=rl*HbT<393jg80JR9rZI;n(%iuMlNmOxn6)NX@yF`**#Euzcx7ZdE*OtP z$Yz^0+7`_r6G$3m&>#oWw{HMZBCbQXI7WYD*zV05hjX1>(GT()dhSqgN+-fcWE|5R&nU*+mv(|Do0cR$p~xTOjK&;3}iOWM9Z1_+@CUi zAxX58LMk;tAf8hxyi(9dCc6Ilg?%t5YYg!jcaO@~s>O+Rs<|(PUs*fmgg5^0d!ZnV zFq#Vz|E_|%8(LK~(-43(UnY>#7B(V4U|FZJ`Nx@I`ee1o8pkyFqL$uRr1D|d?cun2twstR}#xRhg9+ee&mubBQnXtM|HDP4T-|0O&#&g2q15pR}eEI#);Z1ap=!% ze6aTBtp5%o-?mkxnbuW=1mPS&j?Go5803}G{3{D+JBz`J!57i%x8!n-hCGMF@9V`g zo}@0O?45mD?xcw_wNom&j=aDl@X^1OODVrWZ)1 z%?K)8#Z{e=7-6DHb28$tqfy-y(j#eZCiG+O+1a>Jz2&Aryq66fXsT{qV(|3`$oHdK z$P|3y`K)rG+*kYoUZIjj6U6{C=mB<$N6gk-{;n09dkfMH!l4PDe-w?P=pczHeeQ$N zvJj)r#^(C%dxV_|CXOZ6>{O#4&?Qo49M#aro=Cbpv}Xq~YouL#Q@{;rn$n@H{UXog zdv)E|*ZW0CbFQ1)%o+igK$KyP>TBTr8T6g+OSVUy2zy-F9nd^{@iK9ai&^98yMVgU z!LLRk7l0O&eVH4)1wc4uc2&AFvqw326VHppP0Xn>DOO`RT&M^LJpkHge2Gma)pRdl`Mk44{s z?@<#=WrY;I@k?Ot;rKWmo8Uk=|sbuqyzy)S2F65VHu|v24*Tz>Teo#|) zy%c~Rsv?*hm{L6dgqvd1PHK{%_rI=B8i7Q$$jz|auEeULUEE!;R2nP7ABUcWLM{PR z$DoiHtyFQMDy__n>%+f?fvf%Aj%U)~?c1u1^5wKN-c#QQ z^Mc3krH=L&JyTjZ?-+EZYBYi#Xu^!6%tZajJnDyWufh%<>P@FQ!?L%gKB0HI4wf@- zvID0vW%EC2sfFr|9UW%li_KLHA1`CpK;e2vt^tjp|HkCJ5GQJ|LpAS&*dSZd82U=g zSz;f6fdE5Hj(S*D{WpN^4glrK;}NLSc8=IS$+H7I7FZ^X9mt#Fc~9>uBFP#5pcPEt z($}b<_^TgoUm~0WYVb&ad0un0^Dzx7w!TL`ra?y68E%slyR<<KhbxLgm%!W2(TsP9ZygJ(sg1HDXkQ=6Y1~!#Vm6$8K*nvTE5V8#BjTza%Pd#`i zJ>2eu8vU0UI2CD-)3Z5~s97&MBT`}WSNXnW7*s@cM5iMRqgCW_MeA?!%Iz{yv~-}_ z4e+dq=yc@=(Z#Xg{l$(&$Qf9;mp?f5OzqRg0cNISY)0*)i~GUGgekn+j;st zA2l&G3VUC0Oo9>xm8ajdKZaqKXuqW|I$i$Wn)>4ulB}*_ic%Vur@RN*AWMi5ju(g> zEn_AWB_iy2sBg>u%M$d@TL$4b zXXgIq`BC#aKaC6UYB(1ImzGLm!B-X3e~_7ZNh|$XUTf?X{HdyT=u6W|lnQhzH@L!p>z*noBnbjAQm_dBXcZ+K5{4&WZ_r!n9p9)OC z?jb1dE!!L{ESNFL_9?_gqBLsTG{gBJ&%4^b{zfmd3^B-TVi8*>VF)~POuT*S#k)SF ze1K2sw~Ndg9n}1AJ9|Z>?~Uc1Ml)cXAzns!vR?jFUBD(9D{mt_Y;_e^d$l8M$Ge&h zM18G3;27=Yi1w*BO3Z{}rIvsBX4n8kA$^C_5&XIF>K-J9_9dQ4<>UHTZ>S`p)O*&8 zLuj52de1Qx+4r4hb2rolz{MyB16SdzLQIp+Cz1dNJv&I(b;kjtb5}7P zcO2QFaqkX&{Zy5!%O3q9_~0UmS!tp)i0(*XM!10=8&uOQl$KcfM*jgjv_;f*Oph3O zq(h`FLb|3rF#mX10tt)%Hz+Jw&GFmIc73cX^AqhHx<#cwZ{DKk6#;Ni4L+(pC*%|M zrXUCp&6H_}&v;G0E0w0jgHvcT!ezYs3HCZOmKi4wL^b5VTSSt=i+$}ZEu`P7fndl| z14}IAp;Fxdn?^z5mFHi-61=|pH|pbD8%=^w94Kh82lO0c0UTRBtC}4ul9~-D{hpo> zRnZj|n|oe}+NHg;YX^nhw3j9_WU({Cd*(LW68I)_FMnUSHP5V(6K@Bl&baBi37Ll= zhz!cfFxGzHuKaOuNh5`|0|f%e#Q;2xx$rS?)%u?&Zt6eSW7WAw;GqH)m@jJ~xiI3) z>OEbT-(da2@TRY=mcaqS$?% z#y4h4TZe? zlk#b1^~rduc&k^fcbD{l`Z-CXNXLI9iNmju<~ZBEfZ!r;n=K5`@G8~|@gHe}MN)-^Y!J>T7JX()QMx`A0a78zYK?;BLKA$A0|8)XLYZ-?ov^h?D zJu}rVdkUhVG8V=P&t6V*pvZ9|$x4KR8)Qev!NNuWnoh?UxCEYv6N@a1Q+Q-=aa}U* z04a4ooBn!#6(F(OYq|az+e}+`W|Bm>kVv9XZ0=|P`!cjF7eR%gS;5n#w*dPO@)d0M zeJo2HevQPVpIQc)`EWu{5Ui69Jd+sqn?-2+f2ks1;GCD$Q)}v=B9f~;80@YWkElNb zjL3FTQ=o{GySk4T04;2U{*aIXmRK`VV@++ACE5k*5J}?=K{<}59ZZ;yTCgjPn+hIuM~mZG2rs&4EmItny;!n9!gA@^ zLDb82mzUeHL&IhtdB!3097?f%LW6iS=TUv6qU(wKdTaKM0Hc9@m-7|6KEL_Eg^6NT zZ$HBc)%@13U$!eH=HY+v8FV_NrfK`N?Hq_rXo!uo@cq<@+4!Sc@9BIwJn|?qRG3JS zavr(4^~tdqX--BfW;AGZ|1v+_r^p6j?t<;qhq+5c63=ELD88|yLt7+Lz8bq%rtV4< zQFmwcpzUCFtX`~1d+$(~yKQIK;^?4K=b^l+>CTVC2|wNN&q+g7%|fPF2OJ_~1-R_Z zs~9E^H#VqbVX&fWz^kL{RkDjbVvAcW5M>X&4 zwNTu`)adQc&nA9s?QD-nEu>g?jHVb3th9uThre6e*4h1&)`yx>(mDZMh?Ux)^Andc zHh-8Gwx2vu^R6+KHqgOL`0T7h*rP7^Eju3Wlc4Iu)wmEbg5=(6!irA#>W_nxOx<(N zwUJA{v4PKWIgTXH5XkF9f=Wu0n@ZxjQVTzlQMuX+SvdHD%)0M3O zI|1CzF{_p5Z6;VOAC0`{Uw(S-aHm~Ra%3w0W%~tFUyVS#Cd?IB&R;S!Zglswq>KEr%32v~+1p>6ZHwN$cR@eOdB6_)H2kAJ2XHd@ zli_c=n2uDU%-&BlL8_e;AL=ZpdLdx3ro=(7_h1jz(KmEC)c+_OUJ`T|P*PIhD%M^g3%xwtRt*2X%T8THKAb0nMCcDZcg((^e9U)#Y6LKjCu3(s|P=IlnVAFp8b#}ptAYZ8+ zvYh*NjQH=>X1>YyLH%SKPKcJ@eT{&>PjI#eOwVN&=#1-jmUO0UbMt9^0iU#gvp7Jj zk@_689|0yW{^j@v#$}K{cOmvR;W26}RXZkHbJt|>edTXAf!+LLZPVDjflB6F6n z2xiK5%XcR`Ywu8gSzOGT-)}rGBnLSHN|zMUDu0TQUib7=d-s3qYgUX69zUimk7>8; z@Ac+u>)KV0^tH-Vj0^%N&yg2juiHZ%+4)C->|UaEM^(u(g$e%zXn#d0?`Y;yT%>c% z!LiwYqE*KOt{(mV^*iK!)Zx^^w02vNi4rTpeX-Xe2=-pQonc7J$BE5z?`UP5P&+>O zWOr_&HFPZLdtpp;kaW8->wI2XT3-R;ymStNQcy34RN|vz>Q}I zHtrwEo2K^`6eRol`Pz*;?yq;tq8LXz5+)8ZJI1ewAo)zMgTgSAcM`Uk$BmMGczJ)> z+aXi*Xn$^&dyKe0mu3O*aEBYfSarv^@gIs8+BqfdAe~vG2QasGC*y%D_-@hG!^z<| z%Ca;2{g}OdG49XSkJ9Ex_@A{#`tPh)M$I0o;4HYiw@(qYWTUQ{%QtalNdus2>7!X4 z{oHBRja*@U22@agv|ds_X0$&~i3#Ypq_Y3NLLXQI`F!0sY<1Tujk=0$t0b^zu@bSwZ+j zi1&W=D{tl0+27u715&l^Z?3E9?Cn2gT{dbB-S~6ptaA|Q{dj-aB4#7I|*#%fQ@`Gdbvu@PxOj>0@egjjQ?s~}4`mET!y%sv+^F~Z` zntmLSAwIh4N#dot@Bmej2l~VhyMAH$cjgkrBJZz^4@j0m=7*@Z!;U>m&Hz>k8{Hih zT5s!q#D(pp4xn(Va<~xnv}%u{G!e9)U4dnT$qVDJGtU*|Z?7NiZ}&`+x9;2d)+aMFb>gI@0){`EneYAZM>5Q{Mht*uaGP^vT5<)bPeqhsS{*+Bhz zzIIIOnT&>Qr_(=KE?6v&w=|W=%610}>d6fdg6w40ml`?C(?8D5$?1fxeHkn1%^xF> zkHD&sf}@|FV$mj_=OT?T@)^z*L|QT;;WyymLuUnt{Y$JTo{Nxuu${5|UtCA{1-&Km zs<~>@O)(DMSCvlwR5qa>Kr+Rw_~%4%*p&Ngq3sdf$o(zK(e4a>q>!>a5wkTd)^@bb zubAD{(X8+R7jv`n=xq;wtyvtpjFVf$m`f65v?`UoH?59af4XHujy6c16C*)Dg|DG*>Kd})#=wphlHN#n1rFsv^vcmc4&ZV$z9W`Pg2Ngu_Zd1f`59hTg zW0E0uJN6@LZAYCbkmG*zFXVd5JzLt;Y_f?6GKC|3MK#CxDTIONh=ggnoa}=9_8VpI>Nlj#*!%=J@50rF1^}{{B{-ud12J^|WW(MIWZfr1`qF-%}l|7Jff+ z{RzA8lP>xx@P7!iNUcpoB)EcVW9Z4hTm}h=jw2r1kx?x@vfZSoJR6vxAysBV(9Zaa zDTV|o2J)7?5~ig;z@la8g#@=p*x$~X)^nD=j(3Fl^|Wo@-ijK46G|XOewt{=c-`5i zAPM4>GKd3TGuG`(WboJYd5G{kI+HTC%yeX(GUZdy&CQqr)GuBlSrDn^91S#v1p-*0ASn%;ubm0tRr;r+3MqBdixgpGnjs0Y?hpyKvhdXZ%QE;???w&96Va zrCk}%UjB9XZt4NTGj-Ie)W!5V1%Ya%K$L0=E{Xx2R%vQ}Qqz1pD97$+f66q0)88|u z)tc(YVJvq_2(>NLr6Xq^s_c1^+Gx}Oe{jr(gi6k)X%m1AzhY%6&A^8L}@<7?^m2fo#EaP2R%@i zUK#?meT$Fke+rnOj)^ZH+1qLt2e!FyQPhr_twr=6!WnY zo7M+s_o>_Ui27~)oWIj?X^5GyHn6*P-C}r~&au5WK5>;c>^54MFV|kA7!{t7z1#z8 z@b)?*WdTts+qu#crNIx(A8-lbq$eyhNX#1Rfq@q39tmqVwu!vdnM7bM`(`c))#!V; z@>_TQ0S#?OdsWefSrZ(JKNEDFlTIRiZGm$-nXqnm@g+|MSoD_p^^dz=1m)a*z^7uC zhT_rsJAa6^1Whq8b^WkiOQlM54}%`Zs^vK4%i3Tjt?@}h{d!<=)?!+>{;XGUKEm^x z9dhjSP9OSub`7cv#A^RfaNZ+&}20 zEl_$e$mx;tVQ2ny3hQoLiw16qL44HL0jfl%v8FF!B1V7`z3On zzsm-hu|t-Q8RFH6i0V=n0@PbnTIBui$J@_=yi^&$JSQIoE?X-{`r;N06MA0nzBkL0 zM(N*ME;%?!y_dQtxRC!Cs>})RZTkKUaX(7{I0=8M#_bQQR_HQr%cMJD;iW!EawaWc zWKV4N?whyWY^kp$jiiVg9wak1pcPxb(br)gwrZPLPN6|9;+CIFVIcolMX1o=3VpPJ zn_yNPA=-#uX>kn;S_H>_|IM{FQSF>m9{z*X{8dXw=ipM(CY&sD2Rj|e8WE4k)S5HF zt>S_Z7yq53=YWP+cjv3^aGB)SVMtH6^Y&9kQqx@*0-(A8)jwaKAxbCYt6bInY`A*8 zRU1xHJO2Ul9zR=kanLZ~SBll;4By)$Y^efZ+VDoeeMklA`xYDlkDYmRCo=G{ZTd}} zmWN?{*M!%Z!hz(8x!Hd;+IRW*fjtCAMhMLj9Qw4IvYt_hVUTbrhFRpD*7z zNtJ5e9O33eF5jUqTTR;R6JLjqHu=>B)F~c0b;n5?fG@e$^9?e^T{?(FCmpcY0y$cI1+Tljp~3W&WMQcc`9qZHnnEu zGCFjuv>KG>(07eO5CyG4Tj=wJzi#5bn+n=K7ZEt#EC!In#KK8g$FnV&Yl`~FwJ%|} zQGUW(1W8sFIj%sdxpetg^HuYZAq_@2Oj?+%XfdQKEb`Oe4HTgY!-h-2{<)wj`gQdy zOYA5fy!*TULd)+yagjp(&SIt70lbUGd&P7_Nt~Q|S$FPJB)-4kD&dHkFai?PnNvI? zvkvp)^*xj0)u5?lZA3%1J$|`z6CmkxFlFkosf?ihu*@iw2+;zKq8YEvFIwGh!|%Ri zCww9re|0J`7ZyGJ!5dr71`Xaxc1Vvv<2RopLWJpSBgd{Tzx`I!|NXqC+wFMr0O+j6 zvpziy?k#i?Y`e5rnA$*>I;(m(k&9%kdpkTHwA=i?Eh^`(8DMJ-<8t8x(t8r!z4r#I zb**Vmfb#ZaUH+>gAMNQ17CdTnX@+cnw`U{a**MeN_Z#U~UZgeN>~~pu`lSQ{0Hs1R84VuhXcoPy{>g%s`7Vs#nE_uz!8nF&T%6@V|GVSgf9 zydfX;-@-yxGuDx@lAu7gJ-3-<1)?fwW%vw8gqiiz258N(aG+eluq?Zk!NM?x**Uh< zep}%X(4i=C9e8m9OtdFDE^CzUQ9cud7vFIbX8N7t??p z&^rxiFoMVTO%JDjh-YPlD@$Iu`(ankl5)O*f5N;~_qALmD({5&ugRMW5qh&G+oWSC z{LnK*_4+QT89c6t+TseV?4zbft^v89Dhz=_$B+P`Rz0`GP}SB;;} z`D@Hg;qT(zcqTyrH9FzL5yn^*)6+_UcWshgyT1U@m;dbfu=`_fg|oO-wd{nyY2}^p zzw?9e<6PyV0D7QBP=hZWDiBG{q%9&6xURtIB<|%?Yspz8KlMxO_w})+W@Bu<+2vri zWR6E5%~v7@pCydPnPQj{%OWQ3h4i>rw7MH4xLn+Luq;KSt+m(*KW0RdbHS}09izLU z*niN25#u6@a1YR8P4`n+i7XG)JwC@NnZD~f2D;)B#B7<$I-N_jBsWgz@bCXl@VZd{ zm70#`m1N!9foz>i5OzI@nE=KuEO}x`=rICVj3agCk;{HXG{x*l*{kO>5A}KRK#Nrn z^OJMB<>Mc4z-^li9$9Y_ml~%)^&}w0bf$uP*|9#mPdp30gUjd_dA|1dwq^D@L7|P8 zs_+eg!sE|wQ-Xvh({d@zh4eQhmRkMvK}}e8C31auP1^R=p1LJ~)Wg=Ac#=plx1)T< zZRoMp$vo!Zs?|=zGpn->VFPtN*`c+*|0fKUJ&-fa4K8MKY-<2#3v3|17V8(a_1#}d zd~d?#Nu*l69nRK4ME56+!8tm44qZ2U?{3}bEHvE|+4K+Hair$Q)kaK}H5)QlSqjOl z8iE$$`nSQ5-HH=3kIQ|Vdq>sWJmf2RAoFM&?9RLP!^to~y%w;MPm@krA<@s!X$#n! zvAJd)VddYlBhx^LsJF9)-KqzwRXgGvS5{f;bdNeqH2yap+-_*TgUf~UhiY_##K7dW zshA}ul6oO7;=D7s%D0eHcMFHUb5AT=%`h`A_oA<(Zz!UjfraRlt--OJ(SmFr%`1>D z$tyQIbLvkmxKsx2&)M1gq&}=ie?9|-TI~;c?wu?8{-K4WA=Abn{A2Y+#Bs7FsI)JU z4$wxQj}(Ac`fw^->AIs8{!IW?Pxr5^D98%%X&EoB0X2gJ*q*qq&BCpM z+@2JUq}E~{YH=J83)|e>ss8Lk%iDa$y`nwpkMLzVq^~BxRA$AW90mzSn@Jli@SgVw z*_G46pLGc5K~gyB7VTeo*+_G%mEp7hX=+V=-F#8RK>w=pC2-)|x2t0OgG5C1BAJqn z&F4%m#C&oGqnYK!Brs&-0Q){9KK0lL5FA~AC4OqOo*o1j571Xo&X3rj&!9;ubH({G zU>#DtZPe$ECZ(8bi7 z_pLelashnX|7wpqSm8amwrjmjIv+~~i*PgG@3p@%If&VGrWhRPKLwMP@beZ=^j-;O8x$B zktHsHsj7em$wz$X=!TD=2xFGyo;{_sNjX-Ej~WbyWr?})i#`X(EN~8%GA#@^M**ZI z4zfK8_K|@uV=m@$60@WJ#b{#7nSY2AFW}|m=#>%vXk$N2+AWSeR-vTV+4(3Om z&kMs)hFBw2oyuKaDfhbrRw)r+qNJ?1mU^n?+=`wLYeV{lyb{Lw!NOs18Cli2fU z9C}RB5ZCk=90J?Cz|q-}b4TUN2^hW+PTf$gerxoV5FSteZt;k%GtT zhDg#N(T<&Y73GuLxrn`s%}le!h-S%_xJ@!zuCFo#y48s%wS` zAV@Gd3*fGtBOA1yBMlJFfckdVWAD)$#R0X`77WeDvn6N2m)z8H}NK%WXD*-zsvjVSZi}*e-OjCnt$()lf z)kSF#Kg%@nEU^G4s>~NH^VvfhM8=Q`Cls|k&qH;KsV*8j3!F^~@WemAu<4r!ZyQ73lr+$K7@;Mcp?X`?&y!xiIUwwuOloC4XpvC7T!u z7^~vFP2c1M(-GManES*2FYG9IRGAAEH@abf1@0xeuJWeUIO6Czc*I~vffz(CiDo8U z0T|@p&TBki#+bX)Cr*2m(kBk<^a_|MySI)#fLd4386W0-bHQnNji(d^#6%>_O0s8; z!A>gY5*l&ZO|*aI!8KA&k46h}(g_AGb-uAZTcw5mk40hPH=>!8&x1P*VFzoDj>uJ- zNd3j!B=@EZ^i^THvOqRatP}lU#dp-l#AgS=Sbo%~utVMa3#dB`CC)L5_q^D}0W?$g z$wAD5?%+Xpjjqze>0>~l{>*h@;#r!5G|+1Slno;S`1e&aEmZA^VKGG_Fo`56mjrx5 z^5+kEpYy{6Yz(nfaGTO2;d*&MLTG?FhKcL#+~@e4qNDOtigUksy8K}GgkwRnIPch~ ztMsRJ>Q+o80NcrSH%boo`y770*?dO85S!!*4WC1gQs-Y!iN|Z+cM+pI7(A<43(Tyy zO$HRVRnlQDz88segkB%#loOg4v>IP7};pn%d7jFSO1(q>SXT>Y3wx68TRF_M_AxvqI7d# z6AXqbIyA$J_80X&9C?NS3S+$;75Er%XTC`zKiH~|TixxkIb@&GID`WsqKE;qi@7A952c&CTyxvz8bfX) zA4!G6hKcDaTeFI7+1mCyZ{Ob^Jv{P0=e%F%oagKLy1xDE;&fI~euq2^22(s|d&&(4 zlc|Qmq{i2+1-~(|ll1 z7_9N0!k++H7|e6w+^G}r>r(6)6i#a(`s<3R7W0%_Wps(scrSC8@MqA-m|D~!hUBV& z;JL-8?XS_VAD(_txj)ABbfePb_Dx$jX%1V7p0Xtg?|X*dONvvZ(=K%A>tHz7`QDA$ z^fhpPc3fGK5R#pi^)zmJ9A=Fe(biL}>vpu-lLQ>dddy2n(& zfSx^jOD@ChN<}-q&(C#EQ0zKuK>p+bEtPweHFc!!EsANWHL zniFat6g<+Fl|^vYs#V&dg*(!x$vt)_R$t`vSIMqJL+;Eh z>fBleDjwxTertzZoiq(5Ik@AyIQl*0ScU2*ig04aE$Hm$S~j@^#CmcUKbIri5hn_t zGwa~Db)>+PHkDqfh;b6hhE&I#CC2lV!0%wZRC(R*FTt#cr%VE~>Qi;1U4Q(D0Rnm? zw6^X~IZ)HWu^HW1@$K5N=r^Jw^u-)q@F+oclgkyYCniXVzjgmSF)m@$ zRJAoIcQg2XLKF}SVNnxnvSBvmeP7t{RG5t;qsq=75+OrHN(CD@TjgDo#`MwOQ47~E zC-QT0p_AUJDXqH*Und5KClr~s-1kmLxJB)$lm?FmZY888``1#ONNBpDk++u7oo8}X zJC-4M6uDttwdwv7W0^-?2IIHXh5D-SuvPH1 z{F{)5uzlBh5`C>ScUXnz&fm zaxW-X3?XFa?vCXAX)hmY#m{TaQ`HtVEkQShMbZH(EE)=5sDAr8joC3~fq=ly^8@4O ztRE|$V}>lp_)oNs?kib4^FgmMg*t1nupsJB8^Xd>Y`Ibn)%`_FkA+drPSAZW(poEj z(-UXnb?PF1RL7Vg_;9Mh`kKO%%=-fLj;R|n&TJLxd0Pl&JwDGOha8kiwe1)FCAS~S z@x77OEDkhxYhE9~TdK2QkyEG-1}V_M+K$m(!J}x@OMq z8er!=QJRi>=Z)_&-@dt)GI^^cguYgytzJ}aNQQB?Rjz@SzW5+PU{>&FT50jiwGcTR zS*-Lg%`d#K(>Z#ZcW9yZ{x6Sbs#X1;>w>Y7mvHN=1KAXLBK--IT=rth0zsDM-?tMQ z(j507Iuh*{9@Rdw%nTce&O52=3h~`_6P!ZzkwWTOvQ73oX#ySZerJq+ZnG}Unf?7k z4Y$>T!yd~$JmWl+vZ{dRsk1W78&L={EnEfBF_Dv`P{;6+rG@X3&vpyXf;+a-j`$vE zyGVyfCc%CNZJl+alMoY(*BVnhr} zihI0p4Erq9zVdmpGCT_v`g(}iotm%>Zj7G<*R zbcR#?ZL-|fDNQDAr5@Sn6FPPD^LKP9R}E~?l;bZ=d?S+;%ZezZ|2^X2p7$r6`_!B` z%#9;zwQaT+UM3|M3f8ZZoN0`lic3frcS2j&i&d}0+Y_2YY_&PQM+K7;ZWzf?+Gc;H zqGCLd4_8>V6=zwy!C`K{0h61Sd!+rt_81S=0~&`BQK-Tr9^;_guPKe zq_}^^8E#GFvrOyy1Un-Yls_xGa+cxN`Px?x?R`2Ly-GY8{k?MIOJCz2KGUFMSH@2> z_*F$4M2xioDwq&GbgXx@4O?aW%A3m}2*m1*w_HLD~bX6FbB{6R}0&bw&Zy_-$~lUf|mCfIs=vI3)bvM_~{%Xp$@X6Gwz6v zzZ+uY34J9c^y2wLB-yraWx7;2Sha>`tXDn%27^w^%0`>NR8u$G;_dI4*pL=oU@q-8 zUjI&!J>j#6L7&lR3YC`SjMEe1-p1PEqtjm_>!=gT|O72V2KL4%3B2B3%$A#7{oN*?li zZw~_`xWN1AQ!^MfpV7i_whNUx_i#N40+{Vt4VV5Hf^JDm8hQhjn(czQEQgD$H=Mx1 zFc(JZMF-=kD<()d*$Q?FGV(jqo+wv0HPQUc$!gP2h&;xlJ&q@+Ql!c-nz7n}zgauq za>ox}{C`8Kv_^`n|CPtM+TN7hMaQR}Vi~ra(Cq%5eeTmnpWOfHzQ*%g(7Nw8Ni$`K z>Gs012Ww8^DDpst$Uxt&2_WuWgEO13}OrPX-A$I zGG;o$b6JgHrl{_N!wukUxxIA_7u?m8N z6=t1Q?(L1xqAmvCn_@Rx<*pu@fwgs4P(PQ)7@G<0fE(S^cB*~Y!<=%dK=bRJ zJDcK&6|&TmtNzYxLPG4oHQNz(Ls8VFkQL@AJT8!K*wVA>18?^}Oo+$+yGTd!AZ3*n z=8V>i%aqAE6PwiD$ zCRTlYZ;M#G8s&;sv2G=COKt~rbE)YGvE@u)C6S{S=231#$2@HdHz6A@(sbT-6FIe% z_JSQptsU@9W~;7%(ncxn%dT({TaE9=>q5B6WNnsGVa< zQanr+jtbI^md0XtpsKu+$j?Z)-OgQqAX(!4!FOc_aVK~OAaHVZmo!S zCLdgZ#?!#~;3eydZ`560HTm-4DV9O5LJ;K=sjX{-2X7YvvzjmsUT*Gggz&2^XTJDe z8%s5;xo@U3+0Zhn~ zmc;&G;QI|yD!B4N3VS-&C(j#ivy8m^S4|*$D^kVH=zzmWRIWEZg$HeqwWlO7;+nOG zLOEI7vKKe{+fOYzi&L{%wk9un{bP(sgB#$mz<)}p2Bx~xTw3>XN(M8?yzQRWG>0m{ z$YgyydPv2yaYZI4vnQ@%}7|Xof%#Y6545 zttd1BOE5gw?L@980r>VzgXnnQ_mayLxB{v7Bs$UtY*SRjoiM0mVoN>Tqu%*ylOO@+ zhCt*Q)lLfG^R8WwNWCtL065TUw0NC=!NPQC17-xL&zm{qupW$5Sp(mBYc<4pS1Jl- z)fezwMn&o5r)ROT2~X%#_K}vVaoV5$=VtnYi#U;&sxwqeL1#Ti;j?@o8!|h5xz(NR zJ95YJ^XW=IRGs1)qK)M1ZXs%XHqds>1>O-I^QgiNB3-p=q+tm` zr@)d0DEt7=ron}-#IbBij*F1dt_~dfO7j!WT3**7b6mKp@Ip}$r0E&!L8$pQRg4q{ z90)3YNGCccvkU(&4-_T&bkGbJYGT``gE68ZI8gSU2fIrGv#upfh`OGV;wCQq16-gZ zU*m{XN7PJqI+F#nqjlkQ z%hW6V+{@Bsx*!JLAr0bDqFr!vF;ze+J#xqeGJMraeXnVZD{qXyw5uR%Ww!ys(_2?P z`MA5zrY}=aXsMZWThcPO1K9JZv(|R+o}&%W5r$m_2~fE0F9VHSlF4eWtfUs6f9pK| ziU5Qi68K=^!V=s-B)bEz;>n$R1ntUulS^ZmSrzB04>J1GB&X^&@|*@lGZUQZc1!8D zxD7|LKiU}p)2Cvz1~^O&hr#_SA`pl$d2~v++zk%O#|ZET`yaL!5`}vka@b3X?0|(s zKAyh@NFeCOc+_jq?9Dp|ez0kNF~q>3?cW)wtiIC_MLk)LFphJI$nZGe)N@ z2YD5Ck2IJl?zs+l%6$+v9>r);d%f{gqmmPLc>#6+U?l(!%hx=dqqQ|=shbHjze0A< zhBb)rlj8;muBcrcp2K_WfpT9pQ>F)iv|UT?c&eB*SUq@K$E)w}Ju0NCkT&f4>q6_w z&|jQfst7Z39H6XpcZqbptMCbA(-+*`rb{g=LlOIdGiLAx3wIv%B5^L~=(l-Kn}e|$ zf0an9jechEY7qtUAOhVM2YYg#D4g)cCC4?Mn}B?TgpQNevIYm8MdTB9?8zc;Q-s~! zRj1j0_X;6@$BgO40)hEM7jOf>tCaRA|I|*8=W5Xer21`DLSj$s%EFeM09ylcWNf|Y zcm{L#ex&PAGw|CJP}bJ6bp(1t9`Xj7N_~46v(7N}9SmdKDrUMOg%P-yh03D(V95EI z+$*gc>1b9RLaJ0%FWCw>&g^dx7;>mI#)V6Z-p)ZC$pnxEO0d{dBCPl$Ap%HzKB8;-hEj$5Ylk51M7qmuLi}pUhIIc zickQ~0Jj{=s@GURt?1l7s0hE>L!A1X#oMWTXlkhrLwu5gFq!cKer+2-N<+vz3ZGp0 zB)hxv%%z8D8JdPwk}i#i74zgwLs5~TBhQL3DhO`1Ub7isS`ye^>#5Xh9mV+=(!nfC zEd;e{>!sftK!B?DolY)dU0`?9jvoZ~QLrkD9*_llihVBzA2HEwKEp}}>54Sn7V8s; zdslV_lB$s=TM_WrQ&Gw=*bnVB@Hr)J656U}Uk=LUQtAzcoZiqL>LX;M+tO!7IW4AM z%C1*sTD^wdOLc^zE>jz8S*8Cbg?nn5nSr4vj3yV){nBZ%)@}UdznZK!U zOpRMGDGpp;4|fL6NLz993E@jSDL#@@t87B8ec2gs=gd>7ZFs zOO!7@l}0O*;J}47Rayi04+e49s1m2K@MCmteSNd=u;+SKMTmz2`YVe@{?@0K0vB1F z1mHxSwU$K^mED0Bp|i9RC4t``;khOdI?6NY-M4v%?yxtsgjhfUXwU6UE{Te76MZ0+ z#}txWhNbmRsGv$le8R07(rG->$VDi5?T-UHTl?*1(It6erTC&kMehhEEOez`K(Og? z-b02*NKvN@5F($=(A!T~%Nk!)A_~4V7tUrmKJv!9hp#I8h~>?&kt=5BT8dsgW!ANd zSM}XfA7Ji^SsiP!i0IfaXFf^ddaNUPTEu-TQ{``@V?`~KOTMcjWC0O2xge-(b;v;- zM1mdR!L>BShN?D;*E%;yAbsff-jpoP_!~HFNT5bLH)%{@*`K>vYW(*b5w0N2x7png zI0M|`zWe9VAC`TEUI7RdszxmZ1ozTXDyD%%Qxzkdum0`{eMdzT?mke)fVRY@(sreF zO?h>g>!AU{LIE27xjUAxR7GQatQw@e)AHTkASDK7eY#*K7sQjEwpzfbN9LN|mOe<= z$wQdx2bsUbshf>GCED-#pWc@T6B{Kp=2I2KnL;S$*tuC+7dB=xw(Q!G`_e(jrEZ}o^o>j$ol zvb5o%<%4oK+9ehDVTdLp2i8@?49d|&;Kv7`<*p-KgP3D@p|zG=jdwHIJ|A7^3zC#$ zOyImmqM)JFk#AkHqb=|5oKD$Cs$p_;nt_{#Trxo90e;!f3lBMKD+`-5-sB>6J}+Z| zSnZuf7;nN64xLuh*aQ5vR&gb7y+bi?8cWbEzZe4)q5-=G4x1<|VMhB#P%?d@pG3u- zzB}WtRTC)MiezUqH|kd_p`#4@pEGSe0mux25OtTBe+nzbOj)hgk{#2%-O9-Ps>;pC zMkGyZu9Mt?sgAC#eM%Rf#Uj&piOodEfM1vnNX7FGBI{KsqH1e$dTHG0QJt0(g;ITU zLV?x<3QuKrKLLv069|@9otPNk+R@kg`k5>>RHeGR?sgAI;qavZYu$G{J|Q5T2;6{> zhRq4USYBBXM#MERXC#H`e8`INbLJQ#!@Du;5wdtKTd8H2^s3HlfGy$x94z6LZJEN2 z6&sUQb)H{KV}Lq>!BqRYb>NaA*RiMeDMDjM*?9NFDB7_bfe6AKLMN(tg3Jr!8^S8O zR2wx2$K)Z$HzK8AZNS&xep!XmM({C_T8ZwxyD#x5U-|Q`rg?huK%7aH(eOa5a40wPL#7diS5RnGN-zbt&A$al~sw7k$q5gUpROr5}Kr8=f!wcIr5(Fw)g_~^hm#Vf`U6>-n0LJ zU6pV_C_x9`Zt(wB300bQH)X)BSze^e0*c4d8CE$;El0nk=Z}U!EPGEU{n&UTq4Y#6X#|V)y zoIkUk083y4GN0VwXf=e;?|EX6Jf~>zAMd1Ek_;^zGAVREdMy6+QF8~KtOohjx=g}Q zuAJ__LkBWkXKeXB!m*?Mq>9)^8>%#nN!Jdqr`EV8IrO9r(ly9mqHz~bn zkTSVeQErS@u}2#<04HkuK)mk>>Q)I)-YPEug->$|a{VwEHhE`}fL7K5>7L+wi_0+9 zjhJIl$<9*?8aZl?$J8Ho#AyZHts5!Y1HAZ?xPNRo5^~7-zP_6}WBytXbzyT25EN>U zE5lzs(|9lJ>Ykg&5kW9ftSqV{BFC%Kc0@7MYZ}Zp1Axmx*Za*YnBb)G(6ZxQe>e8< zn>|?|pPG-ti12Wh;+InB4#=?Q?u6Q+Sjnt&}wXqYwRsCp(NN|KgbdyN3$`?iRQWpv8~9r@}C z>=sX!VSoy(!4H7-`dL7%qPJ)#gWF8+Q_=nJ1nHMd8G-_oORcIC&PD$g*vBq#o^xxj zIdRw&>X-9uf6Y&w_E2JW-U|meTEPO{-l|>+pUFJ}tXM)9wCR&@1mZL~gRJp6oh-in zEgYffrGlEXQLeH4TY*HjnBNPH1ch5E{}VAD&P^^+5hBEvh8YJ7y(%}a{@AG}<_JW( zqY#)&94msMwE@=SxDgCi9&QycUM1h(@g#=8PbjJJOxnEfR-Kke$!WY!iP=C z=NFWriKPg{xhhYJ<qb2Y|CG-yU{I^Y8CLYj@Z<(~G;hv|t_dsyU~YH-N%--?J#`y1hY`qj)x&FNmtSZ#^# zS1kVbh%%n9SsafSi|$zp#9LbblCP31k5I(F7n(x&6!GAgA%3N)_~wG~i=uhntqxD0 zw86!yY~r~Iko(ho1?%|eJNxHCbO>i>EGa=Uy za76Ia!D?T;etT$+@j61&MBhTV{vIwj(ro&wZD9&;qa3PoN4TQ9L08mnknV?)rqVrW zVfRNv&9#~oRlZTj56*ltpKTDdM4Fi|-(UT4`@Y%OZmnPhMpQ^7(6`rw`1Jx6(+7x| zgn^`$G~qrvmCt*$Skt}JH0pQ&_bHeV{-R)F&P6#uxm2i$Bv3T^m4!FX*Q9iIMtQXJ=zTy*TRg$59Hs@^ioMdVZXleu6c3*D6N?z)UskD^Y3BX{%Fj=l_-hLqV>|}tcaCIb zTC;s``F`U49Z9VQiF3({o@rwuOqnjMMj6~^#w}u1)s1V0F;AxNPTlljl-I_o#^h|C=XGGCYPL_OT`g3u~Y@Cf6JMEi>I{B5W>KmJp0E5gnF8h>MivsqrMLoKOU$qR(keG@)FKx1_{F|EoH&IW%*k)svjp{&KU12TmN$R=DZ_uw zMa41xbMDLB3b*-(CMG4Jcb7}|oPcolVC*f!M}aVc(&F|Ly04Pz>Yj)^+;NoOzevgk zf{?9Fl4&b3n=_NP(EZ)&&kW{QXYjqUg6*d!@ zuT>mY6Uef#$F2yYiH|RS1`9c%IE3;TqLL^6{z)_b#y?}RjI2tbcm}^R6_O*0q6j}X z>D5jhJ2Sg>KVfEK`ZFT{Edfp+Oi2!G^ha6~j{%wpY9D&j`NaF)^E^N7Mk)d!Z&*MV zCUfF`&uhjli}Y$SUdbFhzb`^8sJHz6`m|&NVmy878Uv&bWf9X`b{+>D8Mzxc3kfD} zYY{FM8tJ&0{8~|Kt9aKL3$AX~bH6{|2T1B^*YYI4Of>OVyhw(KangEY2c0(IzQOKs zK>-NJ63kCq%fikNd*f05L!x*P7G`|vbf(UjIW8h9ew5+Q=modDr3=l-0`c!B9E_UAmV(l3rKpd5KgK@V$B@IqOU7q z5fY8pwFq}q%8%#f*^HIBt}0Yb(eP0!|EVsss#vsOlZwgXRHK>o-gwO!&G#0v6V{%x z32^`gu*(iva7DyZ0tI(j)b%Q|Tz}RgZU%7aVoG0evszZbIg|M+c{Kbr=e?MO^w%Z9 z8q|Qc_1v8TwRF()Vj!UV>2QA*Q@VdFE(kdmu`OSi3l3OUtLu_?W9j0&0cQj8h`h(x zG+xDp>}=G&Emmj<^S?1D1#8%yGM?=+lU~?_cK;#rr;I0x2Pg2)8gzg6Y5w6}

!; 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 QRPB(BrNg=BXFYHKAFv(i^#A|> literal 0 HcmV?d00001 diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 83f855569..9c0a6f89a 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -2145,6 +2145,8 @@ Tap the + to start adding people."; "location_sharing_live_map_callout_title" = "Share location"; "location_sharing_live_timer_outgoing" = "%@ left"; "location_sharing_live_timer_incoming" = "Live until %@"; +"location_sharing_live_loading" = "Loading Live location..."; +"location_sharing_live_error" = "Live location error"; // MARK: - MatrixKit diff --git a/Riot/Generated/Images.swift b/Riot/Generated/Images.swift index d9c9dadb8..6e39159cc 100644 --- a/Riot/Generated/Images.swift +++ b/Riot/Generated/Images.swift @@ -174,6 +174,9 @@ internal class Asset: NSObject { internal static let voiceCallHangupIcon = ImageAsset(name: "voice_call_hangup_icon") internal static let liveLocationIcon = ImageAsset(name: "live_location_icon") internal static let locationCenterMapIcon = ImageAsset(name: "location_center_map_icon") + internal static let locationLiveCellEndedImage = ImageAsset(name: "location_live_cell_ended_image") + internal static let locationLiveCellIcon = ImageAsset(name: "location_live_cell_icon") + internal static let locationLiveCellLoadingImage = ImageAsset(name: "location_live_cell_loading_image") internal static let locationLiveIcon = ImageAsset(name: "location_live_icon") internal static let locationMarkerIcon = ImageAsset(name: "location_marker_icon") internal static let locationPinIcon = ImageAsset(name: "location_pin_icon") diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 13aecc0c7..2c5e2c007 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -2763,6 +2763,14 @@ public class VectorL10n: NSObject { public static var locationSharingInvalidAuthorizationSettings: String { return VectorL10n.tr("Vector", "location_sharing_invalid_authorization_settings") } + /// Live location error + public static var locationSharingLiveError: String { + return VectorL10n.tr("Vector", "location_sharing_live_error") + } + /// Loading Live location... + public static var locationSharingLiveLoading: String { + return VectorL10n.tr("Vector", "location_sharing_live_loading") + } /// Share location public static var locationSharingLiveMapCalloutTitle: String { return VectorL10n.tr("Vector", "location_sharing_live_map_callout_title") diff --git a/Riot/Managers/Theme/Theme.swift b/Riot/Managers/Theme/Theme.swift index 93d9cb2a9..039175371 100644 --- a/Riot/Managers/Theme/Theme.swift +++ b/Riot/Managers/Theme/Theme.swift @@ -104,6 +104,16 @@ import DesignKit var roomCellOutgoingBubbleBackgroundColor: UIColor { get } + // Localisation Cells + + var roomCellLocalisationTextColor: UIColor { get } + + var roomCellLocalisationStartedColor: UIColor { get } + + var roomCellLocalisationEndedColor: UIColor { get } + + var roomCellLocalisationErrorColor: UIColor { get } + // MARK: - Customisation methods diff --git a/Riot/Managers/Theme/Themes/DarkTheme.swift b/Riot/Managers/Theme/Themes/DarkTheme.swift index d61ed3954..6d076e037 100644 --- a/Riot/Managers/Theme/Themes/DarkTheme.swift +++ b/Riot/Managers/Theme/Themes/DarkTheme.swift @@ -98,6 +98,14 @@ class DarkTheme: NSObject, Theme { } var roomCellOutgoingBubbleBackgroundColor: UIColor = UIColor(rgb: 0x133A34) + + var roomCellLocalisationTextColor: UIColor = UIColor(rgb: 0x17191C) + + var roomCellLocalisationStartedColor: UIColor = UIColor(rgb: 0x5C56F5) + + var roomCellLocalisationEndedColor: UIColor = UIColor(rgb: 0xC1C6CD) + + var roomCellLocalisationErrorColor: UIColor = UIColor(rgb: 0xFF5B55) func applyStyle(onTabBar tabBar: UITabBar) { tabBar.unselectedItemTintColor = self.tabBarUnselectedItemTintColor diff --git a/Riot/Managers/Theme/Themes/DefaultTheme.swift b/Riot/Managers/Theme/Themes/DefaultTheme.swift index e2afd9339..5eaee1185 100644 --- a/Riot/Managers/Theme/Themes/DefaultTheme.swift +++ b/Riot/Managers/Theme/Themes/DefaultTheme.swift @@ -105,6 +105,14 @@ class DefaultTheme: NSObject, Theme { var roomCellOutgoingBubbleBackgroundColor: UIColor = UIColor(rgb: 0xE7F8F3) + var roomCellLocalisationTextColor: UIColor = UIColor(rgb: 0x17191C) + + var roomCellLocalisationStartedColor: UIColor = UIColor(rgb: 0x5C56F5) + + var roomCellLocalisationEndedColor: UIColor = UIColor(rgb: 0xC1C6CD) + + var roomCellLocalisationErrorColor: UIColor = UIColor(rgb: 0xFF5B55) + func applyStyle(onTabBar tabBar: UITabBar) { tabBar.unselectedItemTintColor = self.tabBarUnselectedItemTintColor tabBar.tintColor = self.tintColor diff --git a/Riot/Modules/Room/Location/RoomTimelineLocationView.swift b/Riot/Modules/Room/Location/RoomTimelineLocationView.swift index 4eb372b2d..c500bf87d 100644 --- a/Riot/Modules/Room/Location/RoomTimelineLocationView.swift +++ b/Riot/Modules/Room/Location/RoomTimelineLocationView.swift @@ -19,26 +19,60 @@ import Reusable import Mapbox import SwiftUI -struct LiveLocationParameter { - let bannerImage: UIImage - let bannerTitle: String - let timer: String? - let shouldShowStopButton: Bool - let isLive: Bool +protocol RoomTimelineLocationViewDelegate: AnyObject { + func didTapStopButton() + func didTapRetryButton() } -enum LiveLocationState { - case incomingLive(String?) - case outgoingLive(String?) +struct RoomTimelineLocationViewData { + let location: CLLocationCoordinate2D + let userAvatarData: AvatarViewData? + let mapStyleURL: URL +} + +struct LiveLocationBannerViewData { + let placeholderImage: UIImage? + let iconTint: UIColor + let title: String + let titleColor: UIColor + let timeLeftString: String? + let rightButtonTitle: String? + let rightButtonTag: RightButtonTag - func values() -> LiveLocationParameter { - switch self { - case .incomingLive(let timerString): - return LiveLocationParameter(bannerImage: Asset.Images.locationLiveIcon.image, bannerTitle: VectorL10n.liveLocationSharingBannerTitle, timer: timerString, shouldShowStopButton: false, isLive: true) - case .outgoingLive(let timerString): - return LiveLocationParameter(bannerImage: Asset.Images.locationLiveIcon.image, bannerTitle: VectorL10n.liveLocationSharingBannerTitle, timer: timerString, shouldShowStopButton: true, isLive: true) - } + var showTimer: Bool { + return timeLeftString != nil } + + var showRightButton: Bool { + return rightButtonTitle != nil + } + + var showPlaceholderImage: Bool { + return placeholderImage != nil + } +} + +enum TimelineLiveLocationViewState { + case incoming(_ status: IncomingLiveLocationSharingStatus) // live location started by other users + case outgoing(_ status: OutgoingLiveLocationSharingStatus) // live location started from current user +} + + +enum OutgoingLiveLocationSharingStatus { + case starting + case started(_ timeleft: TimeInterval) + case failure + case stopped +} + +enum IncomingLiveLocationSharingStatus { + case started(_ timeleft: TimeInterval) + case stopped +} + +enum RightButtonTag: Int { + case stopSharing = 0 + case retrySharing } class RoomTimelineLocationView: UIView, NibLoadable, Themable, MGLMapViewDelegate { @@ -61,11 +95,12 @@ class RoomTimelineLocationView: UIView, NibLoadable, Themable, MGLMapViewDelegat @IBOutlet private var attributionLabel: UILabel! // MARK: - Live Location + @IBOutlet private var placeholderImage: UIImageView! @IBOutlet private var liveLocationContainerView: UIView! @IBOutlet private var liveLocationImageView: UIImageView! @IBOutlet private var liveLocationStatusLabel: UILabel! @IBOutlet private var liveLocationTimerLabel: UILabel! - @IBOutlet private var stopSharingButton: UIButton! + @IBOutlet private var rightButton: UIButton! @@ -73,6 +108,22 @@ class RoomTimelineLocationView: UIView, NibLoadable, Themable, MGLMapViewDelegat private var annotationView: LocationMarkerView? private static var usernameColorGenerator = UserNameColorGenerator() + private lazy var incomingTimerFormatter: DateFormatter = { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "HH:mm" + return dateFormatter + }() + + private lazy var outgoingTimerFormatter: DateComponentsFormatter = { + let formatter = DateComponentsFormatter() + formatter.zeroFormattingBehavior = .dropAll + formatter.allowedUnits = [.hour, .minute, .second] + formatter.unitsStyle = .brief + return formatter + }() + + weak var delegate: RoomTimelineLocationViewDelegate? + // MARK: Public var locationDescription: String? { @@ -84,7 +135,7 @@ class RoomTimelineLocationView: UIView, NibLoadable, Themable, MGLMapViewDelegat descriptionContainerView.isHidden = (newValue?.count ?? 0 == 0) } } - + override func awakeFromNib() { super.awakeFromNib() @@ -104,12 +155,12 @@ class RoomTimelineLocationView: UIView, NibLoadable, Themable, MGLMapViewDelegat layer.cornerRadius = Constants.cellCornerRadius } - // MARK: - Public + // MARK: - Private - public func displayLocation(_ location: CLLocationCoordinate2D, - userAvatarData: AvatarViewData? = nil, - mapStyleURL: URL, - liveLocationState: LiveLocationState? = nil) { + private func displayLocation(_ location: CLLocationCoordinate2D, + userAvatarData: AvatarViewData? = nil, + mapStyleURL: URL, + bannerViewData: LiveLocationBannerViewData? = nil) { mapView.styleURL = mapStyleURL @@ -131,23 +182,116 @@ class RoomTimelineLocationView: UIView, NibLoadable, Themable, MGLMapViewDelegat mapView.addAnnotation(pointAnnotation) // Configure live location banner - guard let liveLocationParameters = liveLocationState?.values() else { + guard let bannerViewData = bannerViewData else { liveLocationContainerView.isHidden = true return } liveLocationContainerView.isHidden = false - liveLocationImageView.image = liveLocationParameters.bannerImage - liveLocationStatusLabel.text = liveLocationParameters.bannerTitle - if let timerString = liveLocationParameters.timer { - liveLocationTimerLabel.isHidden = false - liveLocationTimerLabel.text = timerString - } else { - liveLocationTimerLabel.isHidden = true - } - stopSharingButton.isHidden = !liveLocationParameters.shouldShowStopButton + + liveLocationImageView.image = Asset.Images.locationLiveCellIcon.image + liveLocationImageView.tintColor = bannerViewData.iconTint + + liveLocationStatusLabel.text = bannerViewData.title + liveLocationStatusLabel.textColor = bannerViewData.titleColor + + liveLocationTimerLabel.text = bannerViewData.timeLeftString + liveLocationTimerLabel.isHidden = !bannerViewData.showTimer + + rightButton.setTitle(bannerViewData.rightButtonTitle, for: .normal) + rightButton.isHidden = !bannerViewData.showRightButton + rightButton.tag = bannerViewData.rightButtonTag.rawValue + + placeholderImage.image = bannerViewData.placeholderImage + placeholderImage.isHidden = !bannerViewData.showPlaceholderImage + mapView.isHidden = bannerViewData.showPlaceholderImage } + private func liveLocationBannerViewData(from viewState: TimelineLiveLocationViewState) -> LiveLocationBannerViewData { + let theme = ThemeService.shared().theme + + let iconTint: UIColor + let title: String + var titleColor: UIColor = theme.roomCellLocalisationTextColor + var placeholderImage: UIImage? + var timeLeftString: String? + var rightButtonTitle: String? + var rightButtonTag: RightButtonTag = .stopSharing + + switch viewState { + case .incoming(let liveLocationSharingStatus): + switch liveLocationSharingStatus { + case .started(let timeLeft): + iconTint = theme.roomCellLocalisationStartedColor + title = VectorL10n.liveLocationSharingBannerTitle + timeLeftString = generateTimerString(for: timeLeft, isIncomingLocation: true) + case .stopped: + iconTint = theme.roomCellLocalisationEndedColor + title = VectorL10n.liveLocationSharingEnded + titleColor = theme.roomCellLocalisationEndedColor + placeholderImage = Asset.Images.locationLiveCellEndedImage.image + } + case .outgoing(let liveLocationSharingStatus): + switch liveLocationSharingStatus { + case .starting: + iconTint = theme.roomCellLocalisationEndedColor + title = VectorL10n.locationSharingLiveLoading + titleColor = theme.roomCellLocalisationEndedColor + placeholderImage = Asset.Images.locationLiveCellLoadingImage.image + case .started(let timeLeft): + iconTint = theme.roomCellLocalisationStartedColor + title = VectorL10n.liveLocationSharingBannerTitle + timeLeftString = generateTimerString(for: timeLeft, isIncomingLocation: false) + rightButtonTitle = VectorL10n.stop + case .failure: + iconTint = theme.roomCellLocalisationErrorColor + title = VectorL10n.locationSharingLiveError + titleColor = theme.roomCellLocalisationEndedColor + rightButtonTitle = VectorL10n.retry + rightButtonTag = .retrySharing + case .stopped: + iconTint = theme.roomCellLocalisationEndedColor + title = VectorL10n.liveLocationSharingEnded + titleColor = theme.roomCellLocalisationEndedColor + placeholderImage = Asset.Images.locationLiveCellEndedImage.image + } + } + + return LiveLocationBannerViewData(placeholderImage: placeholderImage, iconTint: iconTint, title: title, titleColor: titleColor, timeLeftString: timeLeftString, rightButtonTitle: rightButtonTitle, rightButtonTag: rightButtonTag) + } + + private func generateTimerString(for timestamp: Double, + isIncomingLocation: Bool) -> String? { + let timerString: String? + if isIncomingLocation { + timerString = VectorL10n.locationSharingLiveTimerIncoming(incomingTimerFormatter.string(from: Date(timeIntervalSince1970: timestamp))) + } else if let outgoingTimer = outgoingTimerFormatter.string(from: Date(timeIntervalSince1970: timestamp).timeIntervalSinceNow) { + timerString = VectorL10n.locationSharingLiveTimerOutgoing(outgoingTimer) + } else { + timerString = nil + } + return timerString + } + + // MARK: - Public + + public func displayStaticLocation(with viewData: RoomTimelineLocationViewData) { + displayLocation(viewData.location, + userAvatarData: viewData.userAvatarData, + mapStyleURL: viewData.mapStyleURL, + bannerViewData: nil) + } + + public func displayLiveLocation(with viewData: RoomTimelineLocationViewData, liveLocationViewState: TimelineLiveLocationViewState) { + let bannerViewData = liveLocationBannerViewData(from: liveLocationViewState) + displayLocation(viewData.location, + userAvatarData: viewData.userAvatarData, + mapStyleURL: viewData.mapStyleURL, + bannerViewData: bannerViewData) + + } + + // MARK: - Themable func update(theme: Theme) { @@ -167,7 +311,11 @@ class RoomTimelineLocationView: UIView, NibLoadable, Themable, MGLMapViewDelegat // MARK: - Action - @IBAction private func stopSharingAction(_ sender: Any) { - // TODO: - Stop sharing action + @IBAction private func didTapTightButton(_ sender: Any) { + if rightButton.tag == RightButtonTag.stopSharing.rawValue { + delegate?.didTapStopButton() + } else if rightButton.tag == RightButtonTag.retrySharing.rawValue { + delegate?.didTapRetryButton() + } } } diff --git a/Riot/Modules/Room/Location/RoomTimelineLocationView.xib b/Riot/Modules/Room/Location/RoomTimelineLocationView.xib index c6cdf2ed3..a149fcead 100644 --- a/Riot/Modules/Room/Location/RoomTimelineLocationView.xib +++ b/Riot/Modules/Room/Location/RoomTimelineLocationView.xib @@ -4,7 +4,6 @@ - @@ -15,6 +14,9 @@ + @@ -41,7 +43,7 @@ - + @@ -77,7 +79,7 @@ - + @@ -129,11 +131,14 @@ - + + + + @@ -148,13 +153,14 @@ - + + - + diff --git a/Riot/Modules/Room/MXKRoomViewController.m b/Riot/Modules/Room/MXKRoomViewController.m index a8d79f084..ba1dd3e21 100644 --- a/Riot/Modules/Room/MXKRoomViewController.m +++ b/Riot/Modules/Room/MXKRoomViewController.m @@ -3045,6 +3045,22 @@ [self promptUserToResendEvent:selectedEvent.eventId]; } } + else if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellStopShareButtonPressed]) + { + MXEvent *selectedEvent = userInfo[kMXKRoomBubbleCellEventKey]; + if (selectedEvent) + { + // TODO: - Implement stop live location action + } + } + else if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellRetryShareButtonPressed]) + { + MXEvent *selectedEvent = userInfo[kMXKRoomBubbleCellEventKey]; + if (selectedEvent) + { + // TODO: - Implement retry live location action + } + } } #pragma mark - Clipboard diff --git a/Riot/Modules/Room/TimelineCells/Common/MXKRoomBubbleTableViewCell.h b/Riot/Modules/Room/TimelineCells/Common/MXKRoomBubbleTableViewCell.h index 8e247835f..15e18f89b 100644 --- a/Riot/Modules/Room/TimelineCells/Common/MXKRoomBubbleTableViewCell.h +++ b/Riot/Modules/Room/TimelineCells/Common/MXKRoomBubbleTableViewCell.h @@ -83,6 +83,20 @@ extern NSString *const kMXKRoomBubbleCellTapOnContentView; */ extern NSString *const kMXKRoomBubbleCellUnsentButtonPressed; +/** + Action identifier used when the user pressed stop share button displayed in live location cell. + + The `userInfo` dictionary contains an `MXEvent` object under the `kMXKRoomBubbleCellEventKey` key, representing the live location event to stop. + */ +extern NSString *const kMXKRoomBubbleCellStopShareButtonPressed; + +/** + Action identifier used when the user pressed retry share button displayed in live location cell. + + The `userInfo` dictionary contains an `MXEvent` object under the `kMXKRoomBubbleCellEventKey` key, representing the live location event to retry. + */ +extern NSString *const kMXKRoomBubbleCellRetryShareButtonPressed; + /** Action identifier used when the user long pressed on a displayed event. diff --git a/Riot/Modules/Room/TimelineCells/Common/MXKRoomBubbleTableViewCell.m b/Riot/Modules/Room/TimelineCells/Common/MXKRoomBubbleTableViewCell.m index c4367d598..f5fcdc4ff 100644 --- a/Riot/Modules/Room/TimelineCells/Common/MXKRoomBubbleTableViewCell.m +++ b/Riot/Modules/Room/TimelineCells/Common/MXKRoomBubbleTableViewCell.m @@ -41,7 +41,10 @@ NSString *const kMXKRoomBubbleCellTapOnAttachmentView = @"kMXKRoomBubbleCellTapO NSString *const kMXKRoomBubbleCellTapOnOverlayContainer = @"kMXKRoomBubbleCellTapOnOverlayContainer"; NSString *const kMXKRoomBubbleCellTapOnContentView = @"kMXKRoomBubbleCellTapOnContentView"; + NSString *const kMXKRoomBubbleCellUnsentButtonPressed = @"kMXKRoomBubbleCellUnsentButtonPressed"; +NSString *const kMXKRoomBubbleCellStopShareButtonPressed = @"kMXKRoomBubbleCellStopShareButtonPressed"; +NSString *const kMXKRoomBubbleCellRetryShareButtonPressed = @"kMXKRoomBubbleCellRetryShareButtonPressed"; NSString *const kMXKRoomBubbleCellLongPressOnEvent = @"kMXKRoomBubbleCellLongPressOnEvent"; NSString *const kMXKRoomBubbleCellLongPressOnProgressView = @"kMXKRoomBubbleCellLongPressOnProgressView"; diff --git a/Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/Location/LocationPlainCell.swift b/Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/Location/LocationPlainCell.swift index 4d47dd775..a8f752f59 100644 --- a/Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/Location/LocationPlainCell.swift +++ b/Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/Location/LocationPlainCell.swift @@ -20,6 +20,7 @@ import MatrixSDK class LocationPlainCell: SizableBaseRoomCell, RoomCellReactionsDisplayable, RoomCellReadMarkerDisplayable { private var locationView: RoomTimelineLocationView! + private var event: MXEvent? override func render(_ cellData: MXKCellData!) { super.render(cellData) @@ -31,6 +32,7 @@ class LocationPlainCell: SizableBaseRoomCell, RoomCellReactionsDisplayable, Room return } + self.event = event locationView.update(theme: ThemeService.shared().theme) // Comment this line and uncomment next one to test UI of live location tile @@ -49,17 +51,19 @@ class LocationPlainCell: SizableBaseRoomCell, RoomCellReactionsDisplayable, Room let mapStyleURL = bubbleData.mxSession.vc_homeserverConfiguration().tileServer.mapStyleURL + let avatarViewData: AvatarViewData? + if locationContent.assetType == .user { - let avatarViewData = AvatarViewData(matrixItemId: bubbleData.senderId, + avatarViewData = AvatarViewData(matrixItemId: bubbleData.senderId, displayName: bubbleData.senderDisplayName, avatarUrl: bubbleData.senderAvatarUrl, mediaManager: bubbleData.mxSession.mediaManager, fallbackImage: .matrixItem(bubbleData.senderId, bubbleData.senderDisplayName)) - - locationView.displayLocation(location, userAvatarData: avatarViewData, mapStyleURL: mapStyleURL) } else { - locationView.displayLocation(location, mapStyleURL: mapStyleURL) + avatarViewData = nil } + + locationView.displayStaticLocation(with: RoomTimelineLocationViewData(location: location, userAvatarData: avatarViewData, mapStyleURL: mapStyleURL)) } private func renderLiveLocation(_ event: MXEvent) { @@ -84,36 +88,11 @@ class LocationPlainCell: SizableBaseRoomCell, RoomCellReactionsDisplayable, Room mediaManager: bubbleData.mxSession.mediaManager, fallbackImage: .matrixItem(bubbleData.senderId, bubbleData.senderDisplayName)) let futurDateTimeInterval = Date(timeIntervalSinceNow: 3734).timeIntervalSince1970 - locationView.displayLocation(location, userAvatarData: avatarViewData, mapStyleURL: mapStyleURL, liveLocationState: .outgoingLive(generateTimerString(for: futurDateTimeInterval, isIncomingLocation: false))) + + locationView.displayLiveLocation(with: RoomTimelineLocationViewData(location: location, userAvatarData: avatarViewData, mapStyleURL: mapStyleURL), + liveLocationViewState: .outgoing(.failure)) } - private func generateTimerString(for timestamp: Double, - isIncomingLocation: Bool) -> String? { - let timerString: String? - if isIncomingLocation { - timerString = VectorL10n.locationSharingLiveTimerIncoming(incomingTimerFormatter.string(from: Date(timeIntervalSince1970: timestamp))) - } else if let outgoingTimer = outgoingTimerFormatter.string(from: Date(timeIntervalSince1970: timestamp).timeIntervalSinceNow) { - timerString = VectorL10n.locationSharingLiveTimerOutgoing(outgoingTimer) - } else { - timerString = nil - } - return timerString - } - - private lazy var incomingTimerFormatter: DateFormatter = { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "HH:mm" - return dateFormatter - }() - - private lazy var outgoingTimerFormatter: DateComponentsFormatter = { - let formatter = DateComponentsFormatter() - formatter.zeroFormattingBehavior = .dropAll - formatter.allowedUnits = [.hour, .minute, .second] - formatter.unitsStyle = .brief - return formatter - }() - override func setupViews() { super.setupViews() @@ -131,3 +110,21 @@ class LocationPlainCell: SizableBaseRoomCell, RoomCellReactionsDisplayable, Room contentView.vc_addSubViewMatchingParent(locationView) } } + +extension LocationPlainCell: RoomTimelineLocationViewDelegate { + func didTapStopButton() { + guard let event = self.event else { + return + } + + delegate.cell(self, didRecognizeAction: kMXKRoomBubbleCellStopShareButtonPressed, userInfo: [kMXKRoomBubbleCellEventKey: event]) + } + + func didTapRetryButton() { + guard let event = self.event else { + return + } + + delegate.cell(self, didRecognizeAction: kMXKRoomBubbleCellRetryShareButtonPressed, userInfo: [kMXKRoomBubbleCellEventKey: event]) + } +}