From d7e75797ef293e32de30d5174109b3dd22987d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B0=D0=BB=D0=B8=D0=BC=D0=BE=D0=B2=20=D0=A0=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=BC?= Date: Tue, 14 Apr 2026 12:29:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D0=B2=D0=B5=D1=82=D1=8B,=20=D0=B0?= =?UTF-8?q?=D1=83=D0=B4=D0=B8=D0=BE,=20=D0=B3=D0=BE=D0=BB=D0=BE=D1=81?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../8.5/executionHistory/executionHistory.bin | Bin 6479814 -> 6479814 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .../.gradle/8.5/fileHashes/fileHashes.bin | Bin 366055 -> 389964 bytes .../.gradle/8.5/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.5/fileHashes/resourceHashesCache.bin | Bin 129613 -> 189389 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../buildOutputCleanup/outputFiles.bin | Bin 1164851 -> 1165715 bytes .../chats/data/remote/dto/ChatDtos.kt | 36 +-- .../data/repository/ChatRepositoryImpl.kt | 32 +-- client-mobile/chats/domain/model/Message.kt | 12 +- .../chat_detail/ChatDetailScreen.kt | 32 ++- .../presentation/components/MessageBubble.kt | 174 +++++-------- .../presentation/components/AppAudioPlayer.kt | 235 +++++++++++------- .../components/AppMediaLightbox.kt | 98 +++++--- .../presentation/components/AppVideoPlayer.kt | 186 ++++++++++++-- client-mobile/core/utils/PlaybackManager.kt | 30 +++ 16 files changed, 553 insertions(+), 282 deletions(-) create mode 100644 client-mobile/core/utils/PlaybackManager.kt diff --git a/client-mobile/.gradle/8.5/executionHistory/executionHistory.bin b/client-mobile/.gradle/8.5/executionHistory/executionHistory.bin index 936ef50eceafaa6c7609aeec580b160dd2531389..e28a4136f95e2180e4ad048212661f87aaf5a004 100644 GIT binary patch delta 62740 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 o3>fbL#~e63;g}1D7aZPj_`u-{haVjNa0I{+CX= literal 17 VcmZSf*f#f{_2K!&@qlNAcy9Ipp~1dx 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 Gr~d)~@|z_9 diff --git a/client-mobile/.gradle/8.5/fileHashes/fileHashes.lock b/client-mobile/.gradle/8.5/fileHashes/fileHashes.lock index ad3f864c4f7e4f1f4d8f80f415798c9dcecc58b3..4f8ef11fabe2bccfd3da1ba73125ac07149625d3 100644 GIT binary patch literal 17 VcmZSH&R@;(a=)o00~p-<0{|?81swnY literal 17 VcmZSH&R@;(a=)o00~l<33;-+|1l#}s diff --git a/client-mobile/.gradle/8.5/fileHashes/resourceHashesCache.bin b/client-mobile/.gradle/8.5/fileHashes/resourceHashesCache.bin index 58d92ea74b1bd5d49729d8b149f9eb1262cefb7b..edb116bcc2d98b2b80ff29ffdccace6bb0ed450a 100644 GIT binary patch delta 11470 zcmdsd2{=`2+rMX(s5ogd)8rJACYipqJ!|)Vf6jYd?|c2f@A}U7?dx*6_HY00`+3&A?(tcx?z3oJ zmH1UXc_51G%U@QHDcGmC|NDMN0p5qwl{-d$Vz?n^->H>$B3#-BZFpUaA;B zj)5PId@k$Imf1p?cBBs35WGj8g_#Fmx__eC9m#j<)o;urw zy1h7sKp7e?JYyy`?$e=PYA+vtg+R%pxXO$UtZ5G$ez(y;Scf3z%M59Ni9W0S^l0rW z1hz-uBQs;D2`MhU`=j~*0$aQA-E=y(NP6AD&Bvc2Ov)Kgq!(b_kCsJs?0JWUIk`8H45scZP{_O(ic3)|znXZv6st11TXRMHV< zsfRbtF2G#hn6%z)M3&j`6IZ+X);n?9afAyU!d2#7rJfFK z-7e*yla9c=Ie6tfBW(S;lLwScH;-dr#0dW~uYe(*+aNht#D^57^Oa^Q!$GaA3J$`> zlkklBG1ScFqXEuU*GN|i8Q{q26amc3*6T)l3c0+f9bU=oz}#K$?GOrfLDG~sPKItA zz?cE?75V$7A#jQcM@6q5U^MFmzRdSh;~*IR1AndGfxU6~_I6T-$yIVB6JfSOZj zqa_xb>xjg2_i`!?OaUYM<&VI!5)u^U^0%M&Tx{o&ZaLBy!#8k73<-a7IQl?@E%cDo zV8}@|eg~FutQWKI7%dqG1t@|cd=;Fuk>tGJ)5zEseen~&!E}`A-?IblZe%*Xd+~AV z^%UiItmGjPqrUS5VlpF)wA_oqdQ)Gv`z;i3RH1?qUO7 z)xti6=AP!Wx&0q4{g+Cj2n54laB~wDR{hQrTYH$i5CK8F#DtE$wb@|(i`oh#Z!sHh zG_hkShJFweT4;qZ!3BJsMawVy#8W~Jl3WU|vaA3TEfEMe9*`ut>3HQbJB)RAy5o$h z1cb@9a3oEW0mo#e){1D+QgrrXj}>a4Sc$`4;U| zS($w`?sntf!SGS^U%O%~=WTke!?*VF?*i@}ovwikv6$y{LfxeR_e;*6Cs)0s=Y` z0s=q;XBC%YJCc>I>1SCYiO~U$Q3;WU{}dV?2@OX{0SrasrnikS>2DVjUY{u)CsG7& zae{6W31!ykQ)hJpvaCo{;N_((Y@p0!1-pyD=ro z*MC(=RV~7?Rk*^PYV2a~rmWY2IVATH=fxd23U;RL&BLxI7ZEu1EzYd0#!N&$sh=)H z@k41F!22uhFz|btnYznwh$kwE8{IR)d{f@v@ovo}7a72P2&{@*!WrqFi7=^1JpG;z zW079NVCk|zgt2A$o5ZaDm=~X`c?RJEYMjA)gpEQ=6fP?ySRk-%6%OtjF%+;lX030@ zNa*n4E0CEde_uOiU*k9z3|ryM`z$Osv-R`ZBo8Dnnu=%Nx24L|cg+oskO)9v`$oL~ zehigXJNQR@Ry^OkAL2gMc9?@oyy)xmRfs6)h!<2FVNH?&DT=GepcTgOj%pt)V@}hP zTsdX5^3WpOv}O=1%#(=Gj{ksUWf$Pg2X>gI-}fm)=~oc%M*t`6K@x>wrn~zao%<0H z!%y-rN6D;U+oP}I=A_csICyAFRjLcWzboS{c_&5O@l_9vFbfgsat8-Bq<~h3hdms` zw#}&xR?E*o*wiH)pGSa#&F#(exG6MDf?2p*{Z$G6azrgSi?bU>Fr#2x$xV7ANn&x% z{&9?=&N$^2`@``~K0>i8d@05syHr2D^nQkL;SpTpsSlQ-I^&#aLH{@gM(gporz|X- z(Yf=oI@ttGb;ZFmL#oD=%td~R^X-wac{|R0X2h_ZsZsp#9_f}+UHpYKZSEFVTgvZ5 zT&d|Cw`W9PT))j)bl~@91PVOD3!WQc5;$nZ0akI14ye|G(JP#d%|uj8BwCqL5MiwjCZ#YebqIYxz96^ zqf)359ME1yp&ItfDNMDSN%m@>4KM1n!xqUO9N1K=h@{6laL{Fk)s#DJzL`umsZ!CxV3-&Jbtv2dAReU;PkKYgOkTe=Q!hI`F4YL7((R%uABCJHp$Blb0jS0r&JGV|&g7C{4}4`n*b3iiC;XUAW;u(GFu{<}dG(h%gOkiph$&#n zEj9#18yIdncbQSccZ5n?!o|kKMvD!bXUQ_j!9{#7bT9_C>W`ITDBF_WNsLp$=qkPe z9`AZzeoe#|C0~m8H+agJSk2(hyd?L|Kak!oFIa0#c*~0wkCdI8RS+m{&6QmQh}eq? zjF{=)LTr*Z(KV(>z3{@QfVCAyO=P`^B3=y1nHuz zK@kst%{=BY*=9rgj)#aDn!%mD1Q1DG=+2%srcJL98ukb(n-DuS(}zobZN7m(F&wTj z0p8RX-#QAHy|*busJIx+Ga-yE@47`PWcvdIwh43nmjNQPUJa~Shht(06*<O^N;Y zQOerSPwPe?r4BwZC3bcE)CnP-J7hI(V?gEQ!23T{6$J(8Z3cE=oUAz~C=bX&j@5H( z&48F7ws=v^3cm}LNTWp_x7Gp#0W3j3E+p_X3SlsGmaDfClvA+4Nd3~6s!fP147ndx z^9;RD=4qeSag%Wr3@LCwTLEbyOfom>yraxX#1-e@EoOA6Vhc*C13fvK`@WweTjQxp zxY`OksAdPYVy`OvU%hp+L5jvA;9fg0llpnoW}3-qTQZc)Z*x=Zc#Gb#*qVxH#^mWSD+RliN{5G!wH#d)gdiH>cSwGL*rjSCqsbC9t zvppb2h=y0e9van%P7w>@es%!z6!oEp^R6Z;N03>8+QHX8)FfD?$WbG&RHh9-Xi3Lp zMtc<(7?Qb$7Kdk8vS7vrAdmf)o+(oLcr7xEj6TfUK%~*BFU!n2r=r9Nek8%!PQZ{l z`sz`mrpuP+h$?akIyiyxEY5x70-}U~6!hE%!Z3&O@X-vZ^cjrl{?MMdtGj$>fd4;JnK>!fI|)Bg-114Xz9j_e>3 zMo*aF=dgRE$=M5`+)l!dslyJ{*YX)iqks=g+zHaLNUa!M*JLs^c5Z+w0mN;1m-XxN zIrZxivt16h@IZ@a#e3^+Ttr~UBbX6LSm0#aa=K9(nwTk4MzAiBaF|^)JvR5IsUxNw z9qtYy7E)jyyx{A*6@jwpQ21AHLQ3S?nM=Er5GJt*rv3`j8G&Esopuo-D-)pc&9^aV z#;jurB6LKimO`~)LaSJz!~j=|te4abSQt$B2IB!MskPxNsWuvp1cUoj=fQ)zc}8($ zXKoP>OLh?s8<#m%Bt)D{!sg*nWj7&zvufWerIlnKMcoKJcM~QRdfT^WM)7K-vq=ZV$1k6TKH|w2Q}?0u#(fbAdH^=tBTc!z z^(s;+I0j3?iFM4A2BMgM%pC{8s4%xN9OzJ}UT;9k*@eHyBd(YYcVsUJqhRsUnRlGc z`w=P=26sdQABJdn(EHRGbT91D~eyqOeq5w z9|p6qJ1!%=&o#=(9TY&v!$gE;=iNQJ-(CT!oYD>D5rJ*keB(F&1x8n&d8yrSynteOsq0t$q!aH z>@K>7CiK&W^gL28^M<$y3|WzwwpZ!if11suD{_@pgEHJW?uoHyf4 z2O87dGrP#PWmVOkY|q;?tH+b2ww>Io^d`qqTk%=A-nXvJ92ofwtf$(w8uyx&P`2(& z{>4wJZ0j1F=}D7fXH|baGpp(G`B=)iSNX8s70}@H=U|q@ww}GpGuO~q%C*k}J!YNQ zKY5k7qO|YAbJj@;P?}E5SeY zR=T9NzbhGbYy~t<-@#@;^_s7cePrOFk*q1*oLL&H0Rx_Z6WoAC-~hPuJ9(X&syfa6 z(r0O*8EzSL*;XZvTYN2`o)C{^C0VY?mj6uCNX{to%VHh^)a@z@J|DR-bIR~)WfgnD zxym^6(0T~l!7N=NZTJ_!eRw)#+V@H?sjOg?t@?G4}}G466Z?Jp3I=spApV8zGarEQSY%K zT$7hfC+M)hcJ{#HgPD3(aYqilzgz$LAB<>zh!siLW9HRsGVWQ{IKGTCNc{(e&(Nt_ zeJ&s;Ov}e-^>uf;{p-mL$B2<#>1}g*zc9-@GhMrRb$-G|GE(A_*aaJ=4jpt6PG1q0 zEMPW?@`+=n%<8P5+BTPc$?+EBwEz>8#2*kr@D`)SBsVnXFDBF=-qxqbSkb2b0WKPY@dUe@*xkG*=2rWO1y zMg7O7zi<`XHNk!EYM}!GhjM0o>WkVuSx1qJ>Ac5K5$xF*U?N@D>np%r4!{gSs*XWn z)8M&v{%7XrJC-qN284sQB45Y*4)#*@J6wx|5{E{_Hh&9Ec-$|}H3gs-M8A5hov-fJ zvn79ZU=zise$M3erlki=vp8m}Y2UqL_ZG7T!^w<*_gJ#{cb~%M0?{}}A=TQ+jN?n> z9gdepeYkw!bMNgTOGs98L%;g=vj45%Be~12$OitRS5;zlz+J$BC6_x zj4!dZ!;6su%k|tZ5rBA(G_gs7M3cnAA{3hpo$x`Ddjjr`Bns^{!L{zy=awKaZzVS| z5_E&VLp#No&`$9?oPfqR@Zu=rcFS&(S6SeSL3`l^v&UL_{(a5xRGe`kc9 z|GG0ROP1&K1ZF9NgKi^u(q*!~(#Rg;YI43mX@7(AyCNz5d zYlv!;j9mL@SQS~Jt)ABa(lOegbdm32Z3O1|;@|@vu1x^x6a{7hy?q*d?gFInfXG-# zl<%BL)tD&UvS1Z4hK@f}lW3QYNo4kHY8}@m(BHyex_yC}OS6Tx9a@Eb>L>0&FISCN z%qt8$M+k)}%Za91eE#&>94$)(hKIq=%ZYyfFAl1RnC^Vz6cQC6Ob$L_hq+Hy@DAVp zKhCcpaen24-ED4kknSR<7RzF|#)|0cC!A?P;!Mj3%Xz@{iY(xu&32h{XRqOn7S)G3 zxps792MYT({9p}OjCqz$?Kkn4h#F?eH$vYdr%~#kgXDCQy9qB@ZUi&d66Zobe_nd* zdutmKXuHDATgw|N|H&cRG0Y^$F5fcJ2hrK>@VqTCmHmxR)*x}RW`yN;*%XY*kb_ZJ zKR3aicmDI=a@=Nz8C!jGE;S=VAn!5$+LAE!zjXwsKANR7t4kpa&3u&3HvVn=%cHsf zCyM$G)>3^w>{oo|Yz z)+VZa%J)m3%*?VJaJ%(1%)&2JW9_+bd1u>jq4Ve@)gzSZ*h$|H(4&Z#`0EY!iLPo@H)=G_?Ob%ToV8^{A0( zC|+l;6k{(TBeb&w4{M?Sw?BTwLHi&^eWvAmw~(x69sQjC_Q&AA{*feO!Xrt(OD}57 zD^j{|?TPMhhvmQVsL~GeoTj3wCFYA{!`pE1CjDQ1e94&b_>#XLlen)pq>}FmA)R^o z|Ln0QMV@%!!)f}@+C^1SDTHlougf7H*W2m~dp3_p-9Mcy9k^SQt`BUvD6e&;DdW;- z-M?tgkA?Qc9RI#y%ew8FyRDlAcn72tdg4~Yg0k`)`%{~Imm9ci z8+L%3PIL6!jh0+IEb;NnI5Q=B|FpjnnQFA80B^C#;Q~4EP$5!n| z%+^R;Zn5{@Bg;_$Ofm~0GC@HPmw=c zKo3N*OPnTAfrIyT*AwBNqOzSltnMh^d!S3)iV3l{dTdFKTEvCwJrSv@7qks2lNld9 z`=)~X>s&*uW24g2v~KezR4PUH^UN2}vbQSi!z0nu2fMiLlLfc;7Dq=O3sc+!gd~*R fH_jz0ZVr&$COxvr@n}k%Q$?TaqwbcYJh}e>ICoIO delta 1821 zcmX|Bdr*{B6z5#cSDEDu?uR7;0*lDH->QIbDHT2}kxUR4krfq{6g7kWz)<`{1Rn^V zkwZ=4OewC+=)imqpZOqASrElXqlKo1rQrKDg=nL8*41|AyZ4@RfA`#Tf9L$RrSa{S zzk61VlHfRoN)GJn<%RKHDzBy0~*u_(}nJ&X=?8YQjMSO!=zRL1*5Wi2L{L)8o` z!ITg)R)nxKM8!2Go7QO>4O*nx2XKv?B7GP2sNa*#!_IoV`ehw?`T9pQ_KA7av`;7) zXxWW7EEZC#gadnwv}@Z(Rs$7lqE*k^FY-W_YD5!Im(Grx2SiVxo(DxemX24c;E<5D zj0uZDk3GUj%!o)q&yR{JyiU~XLG@xS(1W8QoAQnciK>nXg@TR?2i-g_6kTZ${Qlag zbv=StdVv2SIx|c7Qu0iYsVt7+O>x3Zqdo@*b;JuVQf9OHV77>+*aQ(p#zgidBnn%p zRTwDBDpVSr#IC6cV4%h%QA{0k*bK08I5n9e*R5co(Q`TQV%JbMmxFYl16~w52UJpQ z!k~pJVN>F|9WMX9X8YX%nwznC_3l{;d0E-<&8b;W+T8a1Yp-T79gA2Haqo*=Yu=hC&&OG-}v;NWrn0|h@8FmQAb99E?8J0NR(Cx#ndxU$W*hD>wGnkOWe=M;Bq7P zR%8&H_8>NY4H6a#+`^E~p}dML0yFI@f@tcol~)V5a%AULj@RiLD1^he7cY+);zfpir)vTd1$hM`p>ehdeFp z%d~LkhK}I&%N+rdzIO!p0NohL&RwJUf(xU-M$<#t3qMZ{sk$V$B(Wg&@UO>wx@y_>?IEm+z z_;h9j?_7w0F24U`4r!VUDYSDk)a$uZAeNm|8SWYB$~h8J-fMe5Z;R!g^{Ts%A6+4% zB9@RtVfB|qv-w{vUwHw`xXQew{t9B1n zB?yE5M}p`LZxp+SdL=QM70ZDd5}}{?Uy#M6Hlb3njU~T78T>@>Pu0E&Z&A`!@vh#U z3~RbW11(I2Z0bzq+$YXw`cKbijw%*_Lr+`C0jWKWpFVdH(^av^Wd|S@28J^s^x~GWNr2%4xAZIS0?#uzPt*{=bW9cA$|j2UbBH;Sy8~N4gSonA%LlO7P^{}TzVS5iJ4$2 zDO9nEQ!@u~MV*`Zars-A!p5P(2Xqz>!^2&2S>zgC38yiH6{?%qtSy0R5nNd9TkyJ4 KYq!DaMgIXDn84Qn diff --git a/client-mobile/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/client-mobile/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 05f79fa219de3834ca7f81a98922c8291867cc8e..ec5f104ef675bee5049a2c5ba33e23332689c96f 100644 GIT binary patch literal 17 VcmZSf+M}~b{lVOB1~7;|2LLjM1uy^r literal 17 VcmZSf+M}~b{lVOB1~7=q1^_Z51k3;c diff --git a/client-mobile/.gradle/buildOutputCleanup/outputFiles.bin b/client-mobile/.gradle/buildOutputCleanup/outputFiles.bin index db8dd4b1e93d8265c91b7ce2b62c2eef49f31454..c5aa8964d53a01316ac77a1f7df47085c921c02e 100644 GIT binary patch delta 2713 zcmYjS3s@6Z7Ve#7Cdp(ncM=|z6_8M@#YY9yRVk>BMrE0r(9eqvD2fwxO!1%Gx$bZ)6pqj837z-0-B30?;=`~wN{d*o- zShI9@xri6XEGraE5%`_o9WV`qvwDD%94sK@ZYenjQ&jNiRCyq#4x;P_B^L`R6 zdHVhV)O*re{p*jA14>_qPhV$v|zK$V-#X7PjB@y2dz82PGUX0IPf4lUbU8l8R zro!CIoE71ou!QJ+-P<)-FZ}Tew}_=Buy=A<(I^t$6%2L>hdA?`Hy1T%cUQuPp$4-V zB|-flLu4cx03DMIy}@|z=0^u7uX{>WE3{@Ax^$>_cbv`V;9zrl$Q`HKHHy(Wm+KjJy4shm;jDmx!Yt zyGT}$$>mOLqYvAeL-Mai*#HuAPznO+iC#qXcdmR^(|%3t!`X(2<2htR8SpVNFW|Aa zD!+Y0#c?g1gTQ;tYiu|)%(gDE^c(fG@g~^-RG<3}naAkR0i^!%}Fu%~osSC&QUngl!y-zB);m)vjsE9|BX8g`EQ4 z!`9sjeqz(y^+4wofvP3LYd>NoSw&(pJh)8v*-s8^tJxjVrFh)4L zT(}jBCIVClv_~#)GwnNeWvB)@j+B1NIw8M7Xk$>F*Z!JkvPAlY{#$qUtI%6gxrmg%@nB%{%An3gJLisJI#2j^=OHF_#x ze}-t~@#TbJ4cpt!Xu;{=(>Wp?3k6>LjsT!?$Yf9)94i*f&G`16;uFJeu&QO_2-2H^ z;$h1s@w|jidF_q>MLndw2%S;W4~MIti8iBHwrJky&OG&+e?1wq$IuK_ARb}y^~&mN zZ%)=GP19U>U9;hCO z0|YwAzlg=LI(+f#&0SX?IW>lh;Pyz|if~AIPE`0?zo@58NyN}%a02@>e#qmmD$93- z`vmR648Uy$#K8Sze9Fl5Px9JZ0-+@v&uT`Y5Hmz_8gRqdoVSmj57V$VL4KUnY{P|% zKMwlvn`s)%0y28MvT;njw>;IFyc`MMSHBagMKI#SK?X{zjP@Vi=RjRm)s zWplG*e^y=jv*GCH5*4@HDZy%|_`>+dvNF_lB`>aArK|t1_oWwkg|o3rJ0lD1?2?>% ze6n-upr6ANvx&~=Ilr`uf m^yzzfXn15byX1DGO-GHivFJ->mCRsHw6$e7WQ`KCbpHkMWd6AT delta 1869 zcmYLJeQ*@z9p?Am?%wY0-rn9pLINpd@iTFZ93KG$oM4g?2P+pOsfo^*)KWggPSPrr zq@;(I0mc}Qp71u6Vn7*DXY3sbJ~}}L5hd2@9Am53pcq9!A`ZvLFoZHr-`$PlKRfTv z`@X;Td7j_%{F2Fqy`2kFGYV)%@63V=q29Z09WhwZ1^$nE{juJznP2~gR`j;+*k$&X zzV@csd+n`ONwJTOQ3Ln$PreH*c`A7j$%9lGplWm7;^16x0*Odvf+&xD6?;^hW7QLI#xmB;h z50 zYT#E+8aMIj-xyO-c2c>&gls%%_-zaQMSiA>GUxssti%6q@t?A3627{}Ka!7&P5!Ta z^cA1DEcDo>(q(>>E>rt&ARVVStAB|g@w~c0p+amsXVv*OE#9MI@gD8+Hd=$Kxq;{; zJkt;m{Oq)yGZ1?;u<8`ujsBQ!6E4^4dzIvs@)}%!KrhXw1!+4I=Hkp`UL057M`B`V z1@#VnnQ}gx84`V3laI$cS(YavS|e|X$Q?W;tE+h`Ck=1k5lSF6OG^>N?`gu+cFiO- zJ;$8;%XJ@*-9Re+60dT7WdOJB*8dRU&w>i@NuPeF4~b;pYDgSB?YwrH_)wR&8pSEO zik$N2QSq@}H-na9J2Nh5c)>76^6;M@0z8bkZA~K#HETCZJhn$F=c#Y}SqIo|QSL?Z z-d%tX=NVfSJYH!e3>3u-rX%l~aV5+%pBd%i;AQ6EZX@KLR1Xu1NeeJ8__Xrebf)5? zCycXE`Z@5jA)Hb3t}(@jyQ0Cqu&a%@|KR9D6}WiZ*fO4%omUF*+9hL^Lg8I@#L@K~ zSpN))7lbBN4$I9fIkbG6ix0aa!Ee_K(?6XE&I$1PKPpX__k1uimeOgv$-O-phx%FP zkGi&WFrl%hPi&Qz#n1s!lzYo|GKFfhv@Gw*NMh?%R!>gjc4O+GG)-uGfMt`17Omz2 zNgt0H{wU2y{8+HI2xq?!{*G|p>%sbnqs)zOWVI!XAClDTyvLSZSyv+$mCG0e1lJlx zOmK19BpwvU4>G4Ta_P`biN!u&Nat)v`fZ-u zNwk#9f}vwe^vGHiw zPjlvg#n;YOv*==>K}M}%jtm7+KGabm+AR58Aqa_s1L!Jp#kDn#$SV(vqDz` zC>Zo#CCsl1y`!=TBWb%pOrYk_!ynKDOufyj_2b?XYMf9w!>S1L&hzRWyrR5 zBF{~w)5o2J%swgLdeuu>8zq~*Pq>M6BPci(yA+*+(>$_Hza8!=&meC9z5mgaidG7T z{1j+sB|P0m+b4!;Qu*bY0Rz=@EUYvNi0E?kI$!b9#@^d_C_BzG1% Y;o?H@VJF;e = emptyList(), - @SerializedName("reactions") val reactions: List? = emptyList() + @SerializedName("reactions") val reactions: List? = emptyList(), + @SerializedName("replyTo") val replyTo: MessageDto? = null ) data class ReactionDto( @@ -31,20 +32,23 @@ data class ReactionDto( data class MediaItemDto( @SerializedName("id") val id: String, @SerializedName("type") val type: String, - @SerializedName("url") val url: String + @SerializedName("url") val url: String, + @SerializedName("filename") val filename: String? = null, + @SerializedName("size") val size: Long? = null, + @SerializedName("duration") val duration: Double? = null ) data class ChatDto( @SerializedName("id") val id: String, @SerializedName("type") val type: String, - @SerializedName("name") val name: String?, - @SerializedName("avatar") val avatar: String?, - @SerializedName("unreadCount") val unreadCount: Int, + @SerializedName("name") val name: String? = null, + @SerializedName("avatar") val avatar: String? = null, + @SerializedName("unreadCount") val unreadCount: Int = 0, @SerializedName("messages") val messages: List = emptyList(), @SerializedName("members") val members: List = emptyList() ) data class ChatMemberDto( @SerializedName("userId") val userId: String, - @SerializedName("user") val user: UserBasicDto? + @SerializedName("user") val user: UserBasicDto? = null ) diff --git a/client-mobile/chats/data/repository/ChatRepositoryImpl.kt b/client-mobile/chats/data/repository/ChatRepositoryImpl.kt index 8c6c95e..e2ded3c 100644 --- a/client-mobile/chats/data/repository/ChatRepositoryImpl.kt +++ b/client-mobile/chats/data/repository/ChatRepositoryImpl.kt @@ -57,12 +57,8 @@ class ChatRepositoryImpl @Inject constructor( } } - - - // Mappers fun ChatDto.toDomain(currentUserId: String, baseUrl: String): Chat { - // Если это личный чат и имя пустое, ищем имя собеседника в списке участников val chatName = name ?: if (type == "personal") { members.firstOrNull { it.userId != currentUserId }?.user?.displayName ?: "Unknown Chat" } else "Group Chat" @@ -98,17 +94,26 @@ fun MessageDto.toDomain(baseUrl: String): Message { return Message( id = id, - chatId = chatId, - senderId = senderId, - senderName = sender.displayName, - senderAvatar = sender.avatarUrl?.ensureAbsoluteUrl(baseUrl), + chatId = chatId ?: "", + senderId = senderId ?: "", + senderName = sender?.displayName ?: "Unknown", + senderAvatar = sender?.avatarUrl?.ensureAbsoluteUrl(baseUrl), content = content, - sequenceId = sequenceId, - createdAt = createdAt, - media = media.map { it.url.ensureAbsoluteUrl(baseUrl) }, - mediaUrl = media.firstOrNull()?.url?.ensureAbsoluteUrl(baseUrl), + sequenceId = sequenceId ?: 0, + createdAt = createdAt ?: "", + media = media.map { + chats.domain.model.Media( + id = it.id, + type = it.type, + url = it.url.ensureAbsoluteUrl(baseUrl), + filename = it.filename, + size = it.size, + duration = it.duration + ) + }, mediaType = domainMediaType, - reactions = reactions?.associate { it.emoji to it.count } ?: emptyMap() + reactions = reactions?.associate { it.emoji to it.count } ?: emptyMap(), + replyTo = replyTo?.toDomain(baseUrl) ) } @@ -121,4 +126,3 @@ fun String.ensureAbsoluteUrl(baseUrl: String): String { "$base$path" } } - diff --git a/client-mobile/chats/domain/model/Message.kt b/client-mobile/chats/domain/model/Message.kt index f3cbec6..12ce75a 100644 --- a/client-mobile/chats/domain/model/Message.kt +++ b/client-mobile/chats/domain/model/Message.kt @@ -9,14 +9,22 @@ data class Message( val content: String?, val sequenceId: Int, val createdAt: String, - val media: List = emptyList(), - val mediaUrl: String? = null, + val media: List = emptyList(), val mediaType: MediaType = MediaType.TEXT, val reactions: Map = emptyMap(), val isRead: Boolean = false, val replyTo: Message? = null ) +data class Media( + val id: String, + val type: String, + val url: String, + val filename: String? = null, + val size: Long? = null, + val duration: Double? = null +) + enum class MediaType { TEXT, IMAGE, VIDEO, AUDIO, FILE, STORY_REPLY } diff --git a/client-mobile/chats/presentation/chat_detail/ChatDetailScreen.kt b/client-mobile/chats/presentation/chat_detail/ChatDetailScreen.kt index 4e77737..26ffbf4 100644 --- a/client-mobile/chats/presentation/chat_detail/ChatDetailScreen.kt +++ b/client-mobile/chats/presentation/chat_detail/ChatDetailScreen.kt @@ -25,6 +25,7 @@ import core.utils.VoiceRecorder import core.utils.copyUriToFile import java.io.File import ru.knot.messager.R +import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -37,10 +38,37 @@ fun ChatDetailScreen( val state by viewModel.state.collectAsState() val context = LocalContext.current val listState = rememberLazyListState() + val scope = rememberCoroutineScope() val voiceRecorder = remember { VoiceRecorder(context) } var textInput by remember { mutableStateOf("") } var isEmojiPickerVisible by remember { mutableStateOf(false) } var isRecording by remember { mutableStateOf(false) } + + var autoPlayingMessageId by remember { mutableStateOf(null) } + var currentPlaybackSpeed by remember { mutableFloatStateOf(1.0f) } + + val playNextVoiceMessage = { currentId: String, speed: Float -> + val currentIndex = state.messages.indexOfFirst { it.id == currentId } + if (currentIndex != -1 && currentIndex < state.messages.size - 1) { + val nextVoiceIndexInSublist = state.messages.subList(currentIndex + 1, state.messages.size) + .indexOfFirst { it.mediaType == chats.domain.model.MediaType.AUDIO && it.content.isNullOrEmpty() } + + if (nextVoiceIndexInSublist != -1) { + val actualNextIndex = currentIndex + 1 + nextVoiceIndexInSublist + autoPlayingMessageId = state.messages[actualNextIndex].id + currentPlaybackSpeed = speed + + // Прокручиваем к следующему сообщению, иначе оно не распарсится LazyColumn + scope.launch { + listState.animateScrollToItem(actualNextIndex) + } + } else { + autoPlayingMessageId = null + } + } else { + autoPlayingMessageId = null + } + } // Пикер галереи val galleryLauncher = rememberLauncherForActivityResult( @@ -126,7 +154,9 @@ fun ChatDetailScreen( MessageBubble( message = message, isCurrentUser = message.senderId == viewModel.getCurrentUserId(), - senderAvatar = if (message.senderId == viewModel.getCurrentUserId()) null else message.senderAvatar, + autoPlay = message.id == autoPlayingMessageId, + initialPlaybackSpeed = if (message.id == autoPlayingMessageId) currentPlaybackSpeed else 1.0f, + onVoiceFinished = { speed -> playNextVoiceMessage(message.id, speed) }, onReactionClick = { emoji -> viewModel.addReaction(message.id, emoji) } ) } diff --git a/client-mobile/chats/presentation/components/MessageBubble.kt b/client-mobile/chats/presentation/components/MessageBubble.kt index 2c5c1a5..92d9667 100644 --- a/client-mobile/chats/presentation/components/MessageBubble.kt +++ b/client-mobile/chats/presentation/components/MessageBubble.kt @@ -19,15 +19,13 @@ import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Popup import chats.domain.model.Message import chats.domain.model.MediaType +import chats.domain.model.Media import coil.compose.AsyncImage import core.presentation.components.AppVideoPlayer import core.presentation.components.AppAudioPlayer import core.presentation.components.AppAvatar import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Description -import androidx.compose.material.icons.filled.Download -import androidx.compose.material.icons.filled.Done -import androidx.compose.material.icons.filled.DoneAll +import androidx.compose.material.icons.filled.* import chats.presentation.components.LinkPreview import android.content.Intent import android.net.Uri @@ -35,31 +33,33 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.material3.Icon import androidx.compose.ui.text.style.TextOverflow import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.icons.filled.PlayArrow -import androidx.compose.material.icons.filled.VolumeOff import core.presentation.components.AppMediaLightbox +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter @OptIn(androidx.compose.foundation.ExperimentalFoundationApi::class) @Composable fun MessageBubble( message: Message, isCurrentUser: Boolean, - senderAvatar: String? = null, - onReactionClick: (String) -> Unit = {} + onReactionClick: (String) -> Unit = {}, + autoPlay: Boolean = false, + initialPlaybackSpeed: Float = 1.0f, + onVoiceFinished: (Float) -> Unit = {} ) { val context = LocalContext.current var showReactionPicker by remember { mutableStateOf(false) } - var lightboxMedia by remember { mutableStateOf?>(null) } + var lightboxMediaIndex by remember { mutableStateOf(null) } val backgroundColor = if (isCurrentUser) { - Color(0xFF3096E5) // Updated Blue + Color(0xFF3096E5) } else { - Color(0xFF212121) // Updated Dark Grey + Color(0xFF212121) } val contentColor = Color.White - val alignment = if (isCurrentUser) Alignment.CenterEnd else Alignment.CenterStart val shape = if (isCurrentUser) { RoundedCornerShape(16.dp, 16.dp, 4.dp, 16.dp) } else { @@ -76,15 +76,8 @@ fun MessageBubble( horizontalArrangement = if (isCurrentUser) Arrangement.End else Arrangement.Start, verticalAlignment = Alignment.Bottom ) { - if (!isCurrentUser) { - AppAvatar( - url = senderAvatar, - name = message.senderName, - size = 32.dp, - modifier = Modifier.padding(end = 8.dp, bottom = 4.dp) - ) - } - + // No avatars here as per user request (web parity) + Column( modifier = Modifier .widthIn(max = 300.dp) @@ -118,6 +111,7 @@ fun MessageBubble( .clip(RoundedCornerShape(4.dp)) .background(contentColor.copy(alpha = 0.1f)) .height(IntrinsicSize.Min) + .clickable { /* Scroll to reply */ } ) { Box( modifier = Modifier @@ -135,10 +129,11 @@ fun MessageBubble( fontWeight = androidx.compose.ui.text.font.FontWeight.Bold ) Text( - text = reply.content ?: "[Media]", + text = reply.content ?: if (reply.media.isNotEmpty()) "\uD83D\uDCCE Media" else "", style = MaterialTheme.typography.bodySmall, color = contentColor.copy(alpha = 0.8f), - maxLines = 1 + maxLines = 1, + overflow = TextOverflow.Ellipsis ) } } @@ -148,78 +143,69 @@ fun MessageBubble( if (message.media.isNotEmpty()) { val mediaCount = message.media.size if (mediaCount == 1) { - val mediaUrl = message.media[0] - when (message.mediaType) { - MediaType.IMAGE -> { + val mediaItem = message.media[0] + when { + mediaItem.type.startsWith("image") || message.mediaType == MediaType.IMAGE -> { AsyncImage( - model = mediaUrl, + model = mediaItem.url, contentDescription = null, modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(12.dp)) - .clickable { - lightboxMedia = mediaUrl to "image" - }, + .clickable { lightboxMediaIndex = 0 }, contentScale = ContentScale.FillWidth ) } - MediaType.VIDEO -> { + mediaItem.type.startsWith("video") || message.mediaType == MediaType.VIDEO -> { Box( modifier = Modifier .fillMaxWidth() .height(200.dp) .clip(RoundedCornerShape(12.dp)) .background(Color.Black) - .clickable { - lightboxMedia = mediaUrl to "video" - }, + .clickable { lightboxMediaIndex = 0 }, contentAlignment = Alignment.Center ) { AppVideoPlayer( - url = mediaUrl, + url = mediaItem.url, modifier = Modifier.fillMaxSize(), useController = false, autoPlay = true, isMuted = true ) - // Volume Off icon in top right Icon( imageVector = Icons.Default.VolumeOff, contentDescription = null, tint = Color.White.copy(alpha = 0.7f), - modifier = Modifier - .align(Alignment.TopEnd) - .padding(8.dp) - .size(20.dp) + modifier = Modifier.align(Alignment.TopEnd).padding(8.dp).size(20.dp) ) } } - MediaType.AUDIO -> { + mediaItem.type.startsWith("audio") || mediaItem.filename?.endsWith(".mp3", true) == true || message.mediaType == MediaType.AUDIO -> { AppAudioPlayer( - url = mediaUrl, + url = mediaItem.url, + name = mediaItem.filename, + size = mediaItem.size, isVoiceMessage = isVoiceMessage, + initialPlaybackSpeed = initialPlaybackSpeed, + autoPlay = autoPlay, + onFinished = onVoiceFinished, contentColor = contentColor ) } - MediaType.FILE -> { - FileItem(mediaUrl = mediaUrl, isCurrentUser = isCurrentUser, contentColor = contentColor) + else -> { + FileItem(media = mediaItem, isCurrentUser = isCurrentUser, contentColor = contentColor) } - else -> {} } - } else if (mediaCount > 1) { - // Photo Grid for multiple images + } else { + // Multi-media grid PhotoGrid( - urls = message.media, - onMediaClick = { lightboxMedia = it to "image" }, - modifier = Modifier - .fillMaxWidth() - .height(300.dp) - .clip(RoundedCornerShape(12.dp)) + message.media, + onMediaClick = { index -> lightboxMediaIndex = index }, + modifier = Modifier.fillMaxWidth().height(300.dp).clip(RoundedCornerShape(12.dp)) ) } - if (mediaCount > 0) { - Spacer(modifier = Modifier.height(4.dp)) - } + Spacer(modifier = Modifier.height(4.dp)) } // Text Content @@ -245,11 +231,11 @@ fun MessageBubble( } val formattedTime = remember(message.createdAt) { try { - // Handle ISO 8601 strings like 2024-05-14T10:49:02.12Z - val timePart = message.createdAt.substringAfter('T').take(5) - if (timePart.contains(':')) timePart else "00:00" + val instant = Instant.parse(message.createdAt) + val zonedDateTime = instant.atZone(ZoneId.systemDefault()) + zonedDateTime.format(DateTimeFormatter.ofPattern("HH:mm")) } catch (e: Exception) { - "00:00" + message.createdAt.substringAfter('T').take(5) } } Text( @@ -271,11 +257,11 @@ fun MessageBubble( } } - lightboxMedia?.let { (url, type) -> + lightboxMediaIndex?.let { index -> AppMediaLightbox( - url = url, - type = type, - onClose = { lightboxMedia = null } + mediaList = message.media, + initialIndex = index, + onClose = { lightboxMediaIndex = null } ) } } @@ -302,11 +288,7 @@ fun MessageReactions( Text(text = emoji, fontSize = 12.sp) if (count > 1) { Spacer(modifier = Modifier.width(2.dp)) - Text( - text = count.toString(), - fontSize = 10.sp, - color = Color.White - ) + Text(text = count.toString(), fontSize = 10.sp, color = Color.White) } } } @@ -315,7 +297,7 @@ fun MessageReactions( } @Composable -fun FileItem(mediaUrl: String, isCurrentUser: Boolean, contentColor: Color) { +fun FileItem(media: Media, isCurrentUser: Boolean, contentColor: Color) { Row( modifier = Modifier .fillMaxWidth() @@ -331,25 +313,12 @@ fun FileItem(mediaUrl: String, isCurrentUser: Boolean, contentColor: Color) { .background(if (isCurrentUser) Color.White.copy(alpha = 0.2f) else Color(0xFF3390EC).copy(alpha = 0.2f)), contentAlignment = Alignment.Center ) { - Icon( - Icons.Default.Description, - contentDescription = null, - tint = contentColor - ) + Icon(Icons.Default.Description, contentDescription = null, tint = contentColor) } Column( - modifier = Modifier - .weight(1f) - .padding(horizontal = 8.dp) + modifier = Modifier.weight(1f).padding(horizontal = 8.dp) ) { - val fileName = remember(mediaUrl) { - val decoded = Uri.decode(mediaUrl.substringAfterLast("/")) - if (decoded.length > 30) { - decoded.take(15) + "..." + decoded.takeLast(10) - } else { - decoded - } - } + val fileName = media.filename ?: "File" Text( text = fileName, style = MaterialTheme.typography.bodySmall, @@ -357,48 +326,38 @@ fun FileItem(mediaUrl: String, isCurrentUser: Boolean, contentColor: Color) { maxLines = 1, overflow = TextOverflow.Ellipsis ) + val sizeStr = media.size?.let { + if (it > 1024 * 1024) "${it / (1024 * 1024)} MB" else "${it / 1024} KB" + } ?: "File" Text( - text = if (mediaUrl.endsWith(".mp3", ignoreCase = true) || mediaUrl.contains("audio")) "Audio" else "File", + text = sizeStr, style = MaterialTheme.typography.labelSmall, color = contentColor.copy(alpha = 0.6f) ) } - Icon( - Icons.Default.Download, - contentDescription = null, - tint = contentColor, - modifier = Modifier.size(20.dp) - ) + Icon(Icons.Default.Download, contentDescription = null, tint = contentColor, modifier = Modifier.size(20.dp)) } } @Composable -fun PhotoGrid(urls: List, onMediaClick: (String) -> Unit, modifier: Modifier = Modifier) { - val items = urls.take(4) +fun PhotoGrid(media: List, onMediaClick: (Int) -> Unit, modifier: Modifier = Modifier) { + val items = media.take(4) Column(modifier = modifier) { val rows = (items.size + 1) / 2 for (i in 0 until rows) { Row(modifier = Modifier.weight(1f)) { val firstIndex = i * 2 AsyncImage( - model = items[firstIndex], + model = items[firstIndex].url, contentDescription = null, - modifier = Modifier - .weight(1f) - .fillMaxHeight() - .padding(1.dp) - .clickable { onMediaClick(items[firstIndex]) }, + modifier = Modifier.weight(1f).fillMaxHeight().padding(1.dp).clickable { onMediaClick(firstIndex) }, contentScale = ContentScale.Crop ) if (firstIndex + 1 < items.size) { AsyncImage( - model = items[firstIndex + 1], + model = items[firstIndex + 1].url, contentDescription = null, - modifier = Modifier - .weight(1f) - .fillMaxHeight() - .padding(1.dp) - .clickable { onMediaClick(items[firstIndex + 1]) }, + modifier = Modifier.weight(1f).fillMaxHeight().padding(1.dp).clickable { onMediaClick(firstIndex + 1) }, contentScale = ContentScale.Crop ) } else if (rows > 1) { @@ -408,4 +367,3 @@ fun PhotoGrid(urls: List, onMediaClick: (String) -> Unit, modifier: Modi } } } - diff --git a/client-mobile/core/presentation/components/AppAudioPlayer.kt b/client-mobile/core/presentation/components/AppAudioPlayer.kt index 6c2f619..3c653b6 100644 --- a/client-mobile/core/presentation/components/AppAudioPlayer.kt +++ b/client-mobile/core/presentation/components/AppAudioPlayer.kt @@ -8,6 +8,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Pause import androidx.compose.material.icons.filled.PlayArrow +import androidx.compose.material.icons.filled.Download +import androidx.compose.material.icons.filled.VolumeUp import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -17,66 +19,110 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.unit.IntSize import androidx.media3.common.MediaItem import androidx.media3.common.PlaybackParameters import androidx.media3.common.Player import androidx.media3.exoplayer.ExoPlayer import kotlinx.coroutines.delay -import androidx.compose.material.icons.filled.Download -import androidx.compose.material.icons.filled.GraphicEq -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.foundation.gestures.detectTapGestures -import androidx.compose.ui.layout.onSizeChanged -import androidx.compose.ui.unit.IntSize - @Composable fun AppAudioPlayer( url: String, + name: String? = null, + size: Long? = null, isVoiceMessage: Boolean = false, + initialPlaybackSpeed: Float = core.utils.PlaybackManager.globalPlaybackSpeed.value, + autoPlay: Boolean = false, + onFinished: (Float) -> Unit = {}, modifier: Modifier = Modifier, contentColor: Color = Color.White ) { val context = LocalContext.current + var playbackSpeed by remember { mutableFloatStateOf(initialPlaybackSpeed) } + + // Update global speed when changed locally + LaunchedEffect(playbackSpeed) { + core.utils.PlaybackManager.globalPlaybackSpeed.value = playbackSpeed + } + val exoPlayer = remember { ExoPlayer.Builder(context).build().apply { val mediaItem = MediaItem.fromUri(url) setMediaItem(mediaItem) + playbackParameters = PlaybackParameters(playbackSpeed) + val savedPos = core.utils.PlaybackManager.getPosition(url) + seekTo(savedPos) prepare() } } + // Обработка сигнала авто-запуска + LaunchedEffect(autoPlay) { + if (autoPlay) { + exoPlayer.play() + core.utils.PlaybackManager.currentPlayingUrl.value = url + } + } + var isPlaying by remember { mutableStateOf(false) } - var currentPosition by remember { mutableLongStateOf(0L) } + var currentPosition by remember { mutableLongStateOf(core.utils.PlaybackManager.getPosition(url)) } var duration by remember { mutableLongStateOf(0L) } - var playbackSpeed by remember { mutableFloatStateOf(1.0f) } var layoutSize by remember { mutableStateOf(IntSize.Zero) } - val fileName = remember(url) { url.substringAfterLast("/") } + // Глобальная синхронизация: если играет кто-то другой, ставим паузу + val globalPlayingUrl by core.utils.PlaybackManager.currentPlayingUrl + LaunchedEffect(globalPlayingUrl) { + if (globalPlayingUrl != url && isPlaying) { + exoPlayer.pause() + } + } + + val fileName = remember(url, name) { + name ?: url.substringAfterLast("/") + } DisposableEffect(Unit) { val listener = object : Player.Listener { override fun onIsPlayingChanged(playing: Boolean) { isPlaying = playing + if (playing) { + core.utils.PlaybackManager.currentPlayingUrl.value = url + } } override fun onPlaybackStateChanged(state: Int) { if (state == Player.STATE_READY) { duration = exoPlayer.duration + } else if (state == Player.STATE_ENDED) { + exoPlayer.pause() // Явно останавливаем, чтобы не было авто-реплея при seekTo + if (isVoiceMessage) { + exoPlayer.seekTo(0) + currentPosition = 0 + core.utils.PlaybackManager.resetPosition(url) + } + onFinished(playbackSpeed) } } } exoPlayer.addListener(listener) onDispose { + core.utils.PlaybackManager.savePosition(url, exoPlayer.currentPosition) exoPlayer.removeListener(listener) exoPlayer.release() } } LaunchedEffect(isPlaying) { - while (isPlaying) { - currentPosition = exoPlayer.currentPosition - delay(100) + if (isPlaying) { + while (isPlaying) { + currentPosition = exoPlayer.currentPosition + core.utils.PlaybackManager.savePosition(url, currentPosition) + delay(200) + } } } @@ -84,38 +130,39 @@ fun AppAudioPlayer( modifier = modifier .fillMaxWidth() .clip(RoundedCornerShape(12.dp)) - .background(Color.Black.copy(alpha = 0.2f)) + .background(Color.White.copy(alpha = 0.12f)) .padding(8.dp) ) { - if (!isVoiceMessage) { - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(bottom = 4.dp) - ) { - Icon( - Icons.Default.GraphicEq, - contentDescription = null, - tint = contentColor.copy(alpha = 0.7f), - modifier = Modifier.size(16.dp) - ) - Spacer(modifier = Modifier.width(4.dp)) - Text( - text = fileName, - fontSize = 12.sp, - fontWeight = FontWeight.Bold, - color = contentColor, - maxLines = 1, - modifier = Modifier.weight(1f) - ) - } + // Header: Icon and Name + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(bottom = 8.dp) + ) { + Icon( + imageVector = Icons.Default.VolumeUp, + contentDescription = null, + tint = contentColor.copy(alpha = 0.6f), + modifier = Modifier.size(14.dp) + ) + Spacer(modifier = Modifier.width(6.dp)) + Text( + text = if (isVoiceMessage) "Голосовое сообщение" else fileName, + fontSize = 13.sp, + fontWeight = FontWeight.Bold, + color = contentColor, + maxLines = 1, + modifier = Modifier.weight(1f) + ) } Row( - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() ) { + // Play/Pause Button Box( modifier = Modifier - .size(40.dp) + .size(44.dp) .clip(CircleShape) .background(Color.White) .clickable { if (isPlaying) exoPlayer.pause() else exoPlayer.play() }, @@ -124,21 +171,19 @@ fun AppAudioPlayer( Icon( imageVector = if (isPlaying) Icons.Default.Pause else Icons.Default.PlayArrow, contentDescription = null, - tint = Color(0xFF3096E5), + tint = Color(0xFF3390EC), modifier = Modifier.size(28.dp) ) } - Column( - modifier = Modifier - .weight(1f) - .padding(horizontal = 12.dp) - ) { - // Waveform / Progress + Spacer(modifier = Modifier.width(12.dp)) + + Column(modifier = Modifier.weight(1f)) { + // Waveform Box( modifier = Modifier .fillMaxWidth() - .height(32.dp) + .height(30.dp) .onSizeChanged { layoutSize = it } .pointerInput(duration) { detectTapGestures { offset -> @@ -153,28 +198,27 @@ fun AppAudioPlayer( contentAlignment = Alignment.CenterStart ) { androidx.compose.foundation.Canvas(modifier = Modifier.fillMaxSize()) { - val barCount = 35 + val barCount = 40 val barSpacing = 2.dp.toPx() - val barWidth = (size.width - (barCount - 1) * barSpacing) / barCount + val barWidth = (this.size.width - (barCount - 1) * barSpacing) / barCount val progress = if (duration > 0) currentPosition.toFloat() / duration.toFloat() else 0f - // Fake consistent waveform items val barHeights = listOf( - 0.4f, 0.6f, 0.3f, 0.8f, 0.5f, 0.9f, 0.4f, 0.7f, 0.5f, 0.8f, - 0.3f, 0.7f, 0.6f, 0.9f, 0.4f, 0.8f, 0.5f, 0.7f, 0.3f, 0.9f, - 0.5f, 0.6f, 0.4f, 0.8f, 0.6f, 0.7f, 0.5f, 0.4f, 0.5f, 0.7f, - 0.4f, 0.3f, 0.5f, 0.6f, 0.4f + 0.3f, 0.5f, 0.2f, 0.7f, 0.4f, 0.8f, 0.3f, 0.6f, 0.4f, 0.7f, + 0.2f, 0.6f, 0.5f, 0.8f, 0.3f, 0.7f, 0.4f, 0.6f, 0.2f, 0.8f, + 0.4f, 0.5f, 0.3f, 0.7f, 0.5f, 0.6f, 0.4f, 0.3f, 0.4f, 0.6f, + 0.3f, 0.2f, 0.4f, 0.5f, 0.3f, 0.6f, 0.4f, 0.7f, 0.3f, 0.5f ) for (i in 0 until barCount) { val x = i * (barWidth + barSpacing) val heightPct = barHeights[i % barHeights.size] - val barHeight = size.height * heightPct + val barHeight = this.size.height * heightPct val isActive = (i.toFloat() / barCount) <= progress drawRoundRect( color = if (isActive) Color.White else Color.White.copy(alpha = 0.25f), - topLeft = androidx.compose.ui.geometry.Offset(x, (size.height - barHeight) / 2), + topLeft = androidx.compose.ui.geometry.Offset(x, (this.size.height - barHeight) / 2), size = androidx.compose.ui.geometry.Size(barWidth, barHeight), cornerRadius = androidx.compose.ui.geometry.CornerRadius(2.dp.toPx()) ) @@ -182,56 +226,79 @@ fun AppAudioPlayer( } } + Spacer(modifier = Modifier.height(2.dp)) + + // Footer: Time, Size, Download Row( modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { - Text( - text = "${formatDuration(currentPosition)} / ${formatDuration(duration)}", - fontSize = 11.sp, - color = contentColor.copy(alpha = 0.7f) - ) + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = formatDuration(if (isPlaying || currentPosition > 0) currentPosition else duration), + fontSize = 11.sp, + color = contentColor.copy(alpha = 0.7f) + ) + if (!isVoiceMessage) { + size?.let { + Spacer(modifier = Modifier.width(12.dp)) + val sizeStr = if (it > 1024 * 1024) String.format("%.1f MB", it / (1024.0 * 1024.0)) else "${it / 1024} KB" + Text( + text = sizeStr, + fontSize = 11.sp, + fontWeight = FontWeight.Bold, + color = contentColor.copy(alpha = 0.7f) + ) + } + } + } + if (!isVoiceMessage) { Icon( - Icons.Default.Download, + imageVector = Icons.Default.Download, contentDescription = null, - tint = contentColor.copy(alpha = 0.7f), - modifier = Modifier.size(14.dp) + tint = contentColor.copy(alpha = 0.6f), + modifier = Modifier.size(14.dp).clickable { /* Handle download */ } ) } } } - Surface( - onClick = { - playbackSpeed = when (playbackSpeed) { - 1.0f -> 1.5f - 1.5f -> 2.0f - else -> 1.0f + // Speed toggle (only for voice messages or if user wants) + if (isVoiceMessage || playbackSpeed > 1.0f) { + Spacer(modifier = Modifier.width(8.dp)) + Surface( + onClick = { + playbackSpeed = when (playbackSpeed) { + 1.0f -> 1.5f + 1.5f -> 2.0f + else -> 1.0f + } + exoPlayer.playbackParameters = PlaybackParameters(playbackSpeed) + }, + color = Color.White.copy(alpha = 0.1f), + shape = CircleShape, + modifier = Modifier.size(32.dp) + ) { + Box(contentAlignment = Alignment.Center) { + Text( + text = "${if (playbackSpeed % 1.0f == 0.0f) playbackSpeed.toInt() else playbackSpeed}x", + fontSize = 10.sp, + fontWeight = FontWeight.Bold, + color = Color.White + ) } - exoPlayer.playbackParameters = PlaybackParameters(playbackSpeed) - }, - color = Color.White.copy(alpha = 0.15f), - shape = CircleShape, - modifier = Modifier.size(36.dp) - ) { - Box(contentAlignment = Alignment.Center) { - Text( - text = "${if (playbackSpeed % 1.0f == 0.0f) playbackSpeed.toInt() else playbackSpeed}x", - fontSize = 11.sp, - fontWeight = FontWeight.Black, - color = Color.White - ) } } } } } - private fun formatDuration(durationMs: Long): String { + if (durationMs <= 0) return "0:00" val totalSeconds = durationMs / 1000 val minutes = totalSeconds / 60 val seconds = totalSeconds % 60 - return String.format("%02d:%02d", minutes, seconds) + return String.format("%d:%02d", minutes, seconds) } diff --git a/client-mobile/core/presentation/components/AppMediaLightbox.kt b/client-mobile/core/presentation/components/AppMediaLightbox.kt index d794fa1..d52da33 100644 --- a/client-mobile/core/presentation/components/AppMediaLightbox.kt +++ b/client-mobile/core/presentation/components/AppMediaLightbox.kt @@ -22,13 +22,19 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import coil.compose.AsyncImage +import chats.domain.model.Media +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +@OptIn(androidx.compose.foundation.ExperimentalFoundationApi::class) @Composable fun AppMediaLightbox( - url: String, - type: String = "image", + mediaList: List, + initialIndex: Int = 0, onClose: () -> Unit ) { + val pagerState = rememberPagerState(initialPage = initialIndex, pageCount = { mediaList.size }) + Dialog( onDismissRequest = onClose, properties = DialogProperties( @@ -36,41 +42,61 @@ fun AppMediaLightbox( decorFitsSystemWindows = false ) ) { - var scale by remember { mutableFloatStateOf(1f) } - var offset by remember { mutableStateOf(androidx.compose.ui.geometry.Offset.Zero) } - Box( modifier = Modifier .fillMaxSize() .background(Color.Black) - .pointerInput(Unit) { - detectTransformGestures { _, pan, zoom, _ -> - scale = (scale * zoom).coerceIn(1f, 5f) - offset += pan + ) { + HorizontalPager( + state = pagerState, + modifier = Modifier.fillMaxSize(), + pageSpacing = 16.dp, + beyondBoundsPageCount = 1 + ) { page -> + val media = mediaList[page] + + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + if (media.type.startsWith("video")) { + AppVideoPlayer( + url = media.url, + modifier = Modifier.fillMaxSize(), + useController = true, + autoPlay = true + ) + } else { + var scale by remember { mutableFloatStateOf(1f) } + var offset by remember { mutableStateOf(androidx.compose.ui.geometry.Offset.Zero) } + + AsyncImage( + model = media.url, + contentDescription = null, + modifier = Modifier + .fillMaxSize() + .pointerInput(Unit) { + detectTransformGestures( + onGesture = { _, pan, zoom, _ -> + scale = (scale * zoom).coerceIn(1f, 5f) + if (scale > 1f) { + offset += pan + } else { + offset = androidx.compose.ui.geometry.Offset.Zero + } + } + ) + } + .graphicsLayer( + scaleX = scale, + scaleY = scale, + translationX = offset.x, + translationY = offset.y + ), + contentScale = ContentScale.Fit + ) } } - ) { - if (type == "video") { - AppVideoPlayer( - url = url, - modifier = Modifier.fillMaxSize(), - useController = true, - autoPlay = true - ) - } else { - AsyncImage( - model = url, - contentDescription = null, - modifier = Modifier - .fillMaxSize() - .graphicsLayer( - scaleX = scale, - scaleY = scale, - translationX = offset.x, - translationY = offset.y - ), - contentScale = ContentScale.Fit - ) } // Top Bar @@ -91,8 +117,16 @@ fun AppMediaLightbox( Icon(Icons.Default.Close, contentDescription = null, tint = Color.White) } + if (mediaList.isNotEmpty()) { + Text( + text = "${pagerState.currentPage + 1} / ${mediaList.size}", + color = Color.White, + style = MaterialTheme.typography.titleMedium + ) + } + IconButton( - onClick = { /* Handle download */ }, + onClick = { /* Handle download of mediaList[pagerState.currentPage] */ }, modifier = Modifier .clip(CircleShape) .background(Color.Black.copy(alpha = 0.5f)) diff --git a/client-mobile/core/presentation/components/AppVideoPlayer.kt b/client-mobile/core/presentation/components/AppVideoPlayer.kt index 1948a69..cf252d6 100644 --- a/client-mobile/core/presentation/components/AppVideoPlayer.kt +++ b/client-mobile/core/presentation/components/AppVideoPlayer.kt @@ -1,17 +1,32 @@ package core.presentation.components -import androidx.annotation.OptIn -import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.animation.* +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.* +import androidx.compose.material.icons.rounded.* +import androidx.compose.material3.* import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.compose.ui.viewinterop.AndroidView import androidx.media3.common.MediaItem import androidx.media3.common.Player -import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.ExoPlayer import androidx.media3.ui.PlayerView import androidx.media3.ui.AspectRatioFrameLayout +import kotlinx.coroutines.delay +import androidx.annotation.OptIn +import androidx.media3.common.util.UnstableApi +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.ui.draw.clip @OptIn(UnstableApi::class) @Composable @@ -24,7 +39,6 @@ fun AppVideoPlayer( onVideoFinished: () -> Unit = {} ) { val context = LocalContext.current - val exoPlayer = remember { ExoPlayer.Builder(context).build().apply { val mediaItem = MediaItem.fromUri(url) @@ -32,36 +46,158 @@ fun AppVideoPlayer( volume = if (isMuted) 0f else 1f prepare() playWhenReady = autoPlay - addListener(object : Player.Listener { - override fun onPlaybackStateChanged(state: Int) { - if (state == Player.STATE_ENDED) { - onVideoFinished() - } - } - }) } } - LaunchedEffect(isMuted) { - exoPlayer.volume = if (isMuted) 0f else 1f - } + var isPlaying by remember { mutableStateOf(autoPlay) } + var currentPosition by remember { mutableLongStateOf(0L) } + var duration by remember { mutableLongStateOf(0L) } + var isControlsVisible by remember { mutableStateOf(true) } + var isDragging by remember { mutableStateOf(false) } - // Очистка ресурсов при выходе DisposableEffect(Unit) { + val listener = object : Player.Listener { + override fun onIsPlayingChanged(playing: Boolean) { + isPlaying = playing + } + override fun onPlaybackStateChanged(state: Int) { + if (state == Player.STATE_READY) { + duration = exoPlayer.duration + } else if (state == Player.STATE_ENDED) { + onVideoFinished() + } + } + } + exoPlayer.addListener(listener) onDispose { + exoPlayer.removeListener(listener) exoPlayer.release() } } - AndroidView( - factory = { - PlayerView(it).apply { - player = exoPlayer - this.useController = useController - // Для сторис используем заполнение экрана - resizeMode = AspectRatioFrameLayout.RESIZE_MODE_ZOOM + LaunchedEffect(isPlaying, isDragging) { + if (isPlaying && !isDragging) { + while (isPlaying) { + currentPosition = exoPlayer.currentPosition + delay(500) } - }, - modifier = modifier - ) + } + } + + Box(modifier = modifier.background(Color.Black)) { + AndroidView( + factory = { + PlayerView(it).apply { + player = exoPlayer + this.useController = false // Use our custom UI + this.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT + setBackgroundColor(android.graphics.Color.BLACK) + } + }, + modifier = Modifier.fillMaxSize().clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null + ) { + isControlsVisible = !isControlsVisible + } + ) + + AnimatedVisibility( + visible = isControlsVisible, + enter = fadeIn(), + exit = fadeOut() + ) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Black.copy(alpha = 0.3f)) + ) { + // Center Controls + Row( + modifier = Modifier.align(Alignment.Center), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(24.dp) + ) { + IconButton( + onClick = { exoPlayer.seekTo((exoPlayer.currentPosition - 10000).coerceAtLeast(0)) }, + modifier = Modifier.size(48.dp) + ) { + Icon(Icons.Rounded.Replay10, contentDescription = null, tint = Color.White, modifier = Modifier.size(36.dp)) + } + + Box( + modifier = Modifier + .size(64.dp) + .clip(CircleShape) + .background(Color.White.copy(alpha = 0.2f)) + .clickable { if (isPlaying) exoPlayer.pause() else exoPlayer.play() }, + contentAlignment = Alignment.Center + ) { + Icon( + imageVector = if (isPlaying) Icons.Rounded.Pause else Icons.Rounded.PlayArrow, + contentDescription = null, + tint = Color.White, + modifier = Modifier.size(44.dp) + ) + } + + IconButton( + onClick = { exoPlayer.seekTo((exoPlayer.currentPosition + 10000).coerceAtMost(duration)) }, + modifier = Modifier.size(48.dp) + ) { + Icon(Icons.Rounded.Forward10, contentDescription = null, tint = Color.White, modifier = Modifier.size(36.dp)) + } + } + + // Bottom Controls + Column( + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(bottom = 16.dp, start = 16.dp, end = 16.dp) + ) { + Slider( + value = currentPosition.toFloat(), + onValueChange = { + isDragging = true + currentPosition = it.toLong() + }, + onValueChangeFinished = { + exoPlayer.seekTo(currentPosition) + isDragging = false + }, + valueRange = 0f..(duration.toFloat().coerceAtLeast(1f)), + colors = SliderDefaults.colors( + thumbColor = Color.White, + activeTrackColor = Color.White, + inactiveTrackColor = Color.White.copy(alpha = 0.3f) + ), + modifier = Modifier.height(24.dp) + ) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "${formatTime(currentPosition)} · ${formatTime(duration)}", + color = Color.White, + fontSize = 12.sp + ) + + IconButton(onClick = { /* Settings */ }) { + Icon(Icons.Rounded.Settings, contentDescription = null, tint = Color.White, modifier = Modifier.size(20.dp)) + } + } + } + } + } + } +} + +private fun formatTime(ms: Long): String { + val totalSeconds = ms / 1000 + val minutes = totalSeconds / 60 + val seconds = totalSeconds % 60 + return String.format("%02d:%02d", minutes, seconds) } diff --git a/client-mobile/core/utils/PlaybackManager.kt b/client-mobile/core/utils/PlaybackManager.kt new file mode 100644 index 0000000..562c458 --- /dev/null +++ b/client-mobile/core/utils/PlaybackManager.kt @@ -0,0 +1,30 @@ +package core.utils + +import androidx.compose.runtime.mutableStateMapOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.* + +object PlaybackManager { + // Храним позиции воспроизведения: URL -> Position (Long) + private val savedPositions = mutableMapOf() + + // ID сообщения, которое воспроизводится сейчас (чтобы останавливать другие) + var currentPlayingUrl = mutableStateOf(null) + + // Глобальная скорость проигрывания (сохраняем между треками) + var globalPlaybackSpeed = mutableStateOf(1.0f) + + fun savePosition(url: String, position: Long) { + if (url.isNotBlank()) { + savedPositions[url] = position + } + } + + fun getPosition(url: String): Long { + return savedPositions[url] ?: 0L + } + + fun resetPosition(url: String) { + savedPositions[url] = 0L + } +}