From 86ee12c1c89cd9f1f65ff7aafcfe3c61ad6b0ca7 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 18 Jan 2023 16:11:11 +0400 Subject: [PATCH] Various fixes --- .../Telegram-iOS/Base.lproj/LaunchScreen.xib | 14 +- .../Resources/intro/telegram_sphere@2x.png | Bin 9153 -> 7872 bytes ...ationSequenceCodeEntryControllerNode.swift | 2 +- ...tionSequencePhoneEntryControllerNode.swift | 7 +- .../Sources/ChatListController.swift | 12 +- submodules/Display/Source/TextFieldNode.swift | 6 +- .../Sources/DrawingStickerEntity.swift | 2 +- .../Sources/StickerPickerScreen.swift | 19 +- .../Sources/LegacyPaintStickersContext.swift | 7 +- .../Sources/PhoneInputNode.swift | 2 - .../platform/ios/RMIntroViewController.m | 2 +- submodules/TelegramApi/Sources/Api0.swift | 7 + submodules/TelegramApi/Sources/Api26.swift | 156 +++++++---------- submodules/TelegramApi/Sources/Api27.swift | 162 +++++++++++------- submodules/TelegramApi/Sources/Api28.swift | 64 +++++++ submodules/TelegramApi/Sources/Api30.swift | 50 +++++- submodules/TelegramApi/Sources/Api5.swift | 94 +++++----- submodules/TelegramApi/Sources/Api6.swift | 44 +++++ .../Peers/PeerPhotoUpdater.swift | 4 +- .../Sources/AvatarEditorScreen.swift | 21 ++- .../Sources/AvatarPreviewComponent.swift | 5 + .../LaunchLogo.imageset/Contents.json | 22 +++ .../LaunchLogo.imageset/LaunchLogo@2x.png | Bin 0 -> 7927 bytes .../LaunchLogo.imageset/LaunchLogo@3x.png | Bin 0 -> 12725 bytes .../TelegramUI/Sources/AppDelegate.swift | 4 +- .../Sources/PeerInfo/PeerInfoScreen.swift | 2 +- 26 files changed, 468 insertions(+), 240 deletions(-) create mode 100644 submodules/TelegramUI/Images.xcassets/Components/LaunchLogo.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Components/LaunchLogo.imageset/LaunchLogo@2x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Components/LaunchLogo.imageset/LaunchLogo@3x.png diff --git a/Telegram/Telegram-iOS/Base.lproj/LaunchScreen.xib b/Telegram/Telegram-iOS/Base.lproj/LaunchScreen.xib index 2e8de3f955..c8bc1ddd72 100644 --- a/Telegram/Telegram-iOS/Base.lproj/LaunchScreen.xib +++ b/Telegram/Telegram-iOS/Base.lproj/LaunchScreen.xib @@ -1,6 +1,6 @@ - + @@ -10,14 +10,14 @@ - + - - + + - - + + @@ -30,7 +30,7 @@ - + diff --git a/Telegram/Telegram-iOS/Resources/intro/telegram_sphere@2x.png b/Telegram/Telegram-iOS/Resources/intro/telegram_sphere@2x.png index 5048850c0ba9310ad063f19387c19df0ba71ca2b..826d68b263e7fed924f965fec089733cc2d96594 100644 GIT binary patch literal 7872 zcmbVx2{@Ep*#A5;7`tR&6IrtiGqypE7?hJ6E)42sEC86-=M zlvfOZ)W zXzXEvVNwhkL_;9fyOYSlAyEXX+F?Ri1j$ByrR%o3T12Rgy0@t-!j)`C2#;_|i6
    0*$mpqfl!9{M5na z;zNmO4||7y76adG)WfM%GTO)}F)`6F5os73A7*51X=!PMFflSQF#r(;lw=Y$ILUxS z(fF5wJ%JJuA3>%@#FErDDFz>oO`zJSgRK57Lk#&hSrX-+eFAsPC@Gk1WNe7ol<5~R zG~_pqoDd)VYw^$!BSJJGhCrfHK&>8vK6+hlZeuvGFm%pvVz1!C?d=GAT@5 z?e|8a?P8;28W2s*5uwNsW6R)R^MB{t$A%h|CHq5q%r_s2(o&J`T}Kc=(ka+^kh zc8Z{Y>Pr5{Ck_ze{%J)=sQt17ba2R~ecPyqY$}!zs{T)R#Q%5){wA9kP5_DiAJqLf zj1o(vCI-h7Y{S6a`hPGeBanTgO<(+55~KfB$X{ds$#4IKgTY|4`8y1OFTVpBfdodc zcrZ-O(SSk-L;=*At!Gl%yXn+3{)F=Wwb;b|9p{9E_U7%7bn?)3Vw@Drl83#}a)O-D z&Dn#O^dXEVxH~@?@99`>?g~88whucg((ue5#XslJY>N_nkuE9fb*6NmEreqHD!mZV zlVLsWGJ2`5&gf0qM%km$x<$`B#}+@~vXy=>8W!%$x6^9jkEPhS+2tF31ES zRO)j}3-U5EJM%hQJ_yByo#JySx_v`L{$P5~WacF82YXkL(KV6BLecPcz%O%{trZmV z#aE&cW(J~A*SHUXL)WdBgac^z>Jhw+Y4)jgQ(j`oDzxNa&{iq|u?#KjC-TuSR{>aT2q9W1#j zGZ$sKc+@LvFtb=nocUIdE9YdxzRr%*DI&uDWNgRJxELO)^FA7*w5lvzKgUM0S>ZlH z!uq)f1uPjYm$&Y-VXv{DW=dsB(KKKaGE+Xh^0|h?GON<7J68EtQ6SLkxCP^3(^jWG zZrKCtAaR78#f6^~mxEaRhCVYaY2_a!1Rs^V?GhjBNiY)jDMc?4Y9LUtqtH<@Nvbo7y8YU< z@2NxWlHnDr`n;Fy!_uCkKt_Mx?EyY8c2G)2)SgS68f0>oC*vUtdx7jETpzg~^k*__C-%zIq6BI97Jh z;)8+@twiV9sfmN{*iwrI6ii#~!w|I0XGEvQq*SZAbN&OSd4gf*`$P@jre#$x5oO%) zmBvr$@C&IOw6qHOpm$4vA#|poMBBgcHB+x)tO*cj_KP_xQLpmN!08s=_wOi)qzNX; zt%~q`TjP>52C7@`0H&>mykVWvU3uc^$f$`>-nsA-cSdozA3`bx(b;5-SaV)`r9R)T ztb??RZBbgQM&a`tA+05mJ1Z*d?*m?b=4jHVb2^O9?1Lf6C^;2$lI*GtFL8cAu3?t8 zc-5rrn><+;y<qG>QAm}^(O^C;2x0RYM`hV#7x&qscEj+#=SiTh(!1m*o{~tQtuFWxAauHz3lTVQ-*MO)*6K^^O@>AR9VBt#iD(YZKsu0U;gpu_8G*7^BV>{ zmPMKV?f$CK&o{VX=|0@Z!)I>L6ih&uNtMKep?AU5(iprDVm~0$|4Od8Z`H zEnaca{isSuc3I=DQD;m6+|X`kUtNyDJ^j)r> zKOL$+X25|%e1SrKZc!~Maw~$Z$?NOvgwo5?bIc}X$&S+{p~j3_=yQicd2?1(z^N(D z7&iyCGYT+ODKB6l$SOoUYfD?XOF66ZGVQ|YPpSrj0eN@_15At#a(i(x?ZU~D_m$f^ z#9572+uAO>h;FoO!8tOvF;m@$4}54-o{QQek5qB7wux%80?mE;v9i_eA4}K?W5us& z7ogv*WRMINMeAkmJogn^j zD-O#GZG~A$Eg?Da;d+tT+UNd=cEU=|OO77mn^ElC!V=#&I3`;t8X$N{gP}JhoKB~oF3yerZD${!u*fnMq{MApIFOv3ww+TG)>6n&QcJ69i4-ro>j_f)y;;5;DqtFVa$Pb4(z9zzL)0TU0Mf?Gn@_+WTUI{JnLb@xt zMIZI_089mJO48Eztb`HQN(-mr)i0hrC&*MMn~@`+D+Jt-s6m;&3Oxt`Gx{X=ecF;){*fn|UfWaO^1FlT-7@K}F{A3-$?*JJAsj2BF}lqoz~x`;=YotR2VR5nue#`K7F?5LeIV^MGNwS5`5CyA5d ziq9(;cem3okBW}H*4S;Ow@A~2tlTTqHD5xB;GPyz?^rL=E{LW{ue2eTP&I$|4AK_O7-IecB0Ji&HHwJ=k)sEnnaVuKv2#p{TqR3}|$ zLLVp5~cty+ISM0>ehgf>HXK0@M6>j4^lZo*PW!*?0mCWV6o8SX#F zInj)EWOX?WEtZt1^gNdMWrH+jajj*XrdUw%WO?QseVnpo@Z^K0G|EoE3lpVmy%9<* zuz(XB9#Pzz_{PXQ^`JD7=TXG+FzdlnwHx!MN;rO=eE0Hw&IO9<;OW{F_hA7~ATu-fWC9}Tfp*CB>KF7Hx#uM$B!bFO*q&Rue`RrWbbN6H+faqb(Xd$ z@cIV+3?1M01%)7>JTWq~kO!Aa=xywtmJ4nUPdqmMM0#S1aSy-TbwTDov?wx2@Gg;% z!PR84YU&3#je}1_<3yc%K!wD@-SS%0k*pReT)!xq(;$b_)C z(;DYlN5{k5YDNy^E%A@7B_)B@js^&>t{>x0LS?IRMb2wkij+wlHw1Hd4>65@BSfQsJ=@fQ+wlCndr!dbL={%?$=`uMk z%*>|Uyna4}I1y%Os>G+)|#~yz&LFDaY zpV;daN<27cFTk-A6J>%YFdf^UkGdGI4trfCATV~Fed_L@F>(nMiK|o(tA{A(N`fp_>?<@fvIEUo|1*j) zWhV0#y0}WqDW!{1Ep!+TJk=uluXussIctiNGeU;53?xZJggDyR_)9~>F~%V z&h*KAc2re^;Qijv65p#bnLogGFW64`);Xp7!c5H~dVK2AASd^FdsJLO0Kds26zk(PYZ_r46)&Rcd^Jpe4YKkPN z_ykb#E%$8}e438`1jda;%!c*HCy;84Bf!qA;!VHcAG~A^8Xs(s^Dvly?&93NdZT91 z1Nn6P?$}UwO~$?sIA}xHves?#7FEaM)4pG&=d{WEGT;f=C}_ZV+2j+p(G_)(Sla~5 zM~`BEA`#Gc#PfZSU_wDd5s9+&dK%CGtLL-MPQ6N$?FSS*l~;FL=ilfl#mhIi3-kmB zVctP1TpE>GqU&2U%=TA{ru4CCdYd93Dni+DQLxR)w&VJslR{J6KYdtYh>Pmb>elMx zk(g6X{6kz_E1i}i7^`N+`edEg zvg08Q`uKEz0g>3$sY2LmcR`4`mArG+A3TBxbnO9+_sWB3j%QpN=96ZldFNfz3+W0v zRuiW0#lYhY=*STW;|+5L18twUC(eDwY#wX0QS0pJcfdASy&8ltn zLBxW`r%XaJSkE8t!xVEh4lhT%NF8o`|18_2X5pJy6QA^a-myyem$s?IDtnc4sVw6>8+(5JWDYsG0X>9*>i0c6xFK+4#=}N3j9g!H! zE6FH&2l8vi6G)q_rGLD^Pv~nu5_k#B8vqGjf;(~Ic>tI-EatT<;TQ!OlR%V4k^#$e zb+y?b%3TZ9t($~!=aUXE=$p+89OAUZ7!Mw6$I9TkXxo6DV7kHzdX^eFBwWOwz006O z!JS{4{hnPdcxaT<5+*sA7rFXFNvob~C0?vW*k`dt_L$7h%;!MKjt}WX*+NaG!Jp{X z1}8lRX1ez;=s~T|6-3$cVy2k3S-`naOy)@57ht9#ti%+Qx!_euUptud}+tqb8rTDMYxl?Z&_TG-mqd}8|KBFrNO`N-mnN7E(XNT?hJ%xOZ zAHl?u-nR*Rou^~NkdZY*f>d=^&_fCc8OJNi!Kg)nMb`9^B6CD_xL=H)Lr7x&x%7{T zJ0mZity~*B#Rd3%53KD^x?O?yeO5RXy8136LQse1#Xg_;JQuu~^!-q6yXRFUlKFwp z(`a?eY9;#ucsos~H)V?LvWI?qt9Z5q^cs<8K-xw2%RrWRt592y70%Bk2gNTP4x1HY zXPm3v_6L6C9X4iJVCxj$GiEEl^oORN4m0X@qROmqHU6CZO_YE%yOMSln1q8Dsg-8O zn0Na#mzcUu0RPb;36c%q7H7rB z)a?a>9+=GZYn68>9>ihaQ&VolJ3=jTI7ahA-P-kDVuA0mDHpBd3F9sDpds}%tf6&T zRsMxj`xdqDMlA>jV3Y!ZpTJ|lU+9#m-)VgPTkOuew}l%;{GEru>nda0_w$(sZ0$^; z;2~q@99Q-R_fv5}W>kdp1WfpY+-gkF&I^2HvMur~cA)+KpFNq<%S}-SRiWV6T1XIV zH96?W<9JS%&*=(wJY3hRnBj#l-*J^-1(r@&pFamJS#Q*g{xllcYhil}DvUDz?8gg9 zI(I$cv>!L@=Z#lymD{>S*Xn!3zXJwuG88(X@^UR|tkP(p8FuRgNuEFXNI=;-DAsLe z8{2#SsXE1zdy-TA5zbTm@T~Kh>e=!e+h;HrX_X9GrxDqJ=zde;Xl=%x(|tng+i;A! zYD27DPbDPvPD#i_i_JVTjsL3)JasnKV;y~0Y2LI|V&OfT#nxUuGukpI!QRNMgkBYB z)-*2XX4ikxTh)-pCBmEUHM%F(jJ_?LXOOc-7Hqwq7EGLK#Oxg1E$SlfdlnzFL{oY& zxGFX;p5VA}mj?ZT^N+ZpWyL6E$BRogQBR_`gEB!3(O`k7nqIsPEZ?`pe-lk37&Flb*w15y)yP^ozxm z8Ce%$15VWqgpi==d8&*j4|-}N#hE_??I;Hh!P0X^N__>X@W%V=Q4;8#-&5HutBO4^ z3r6Hqm^IW|;=AH!L4*RD`AA>>=xvR;)@6~ z`&u)WeXYxs{(wb>7Y9H0esKGUH*}>hs;<#;iHmogtgiU-^V(c!HmpAG+k+E1haf*C zI+Qyg@=DjVoNvdl-_0-R6#`uYFRtsv#bHeA_}2v44o?j*a6`u zdBBI8Yt{$ODdUG%wCE z%6tx~gMsD5*#p*A!?GVFCe*1Pnp0gQ$zUn*VNEBj37QTUu797Y3oNyKZsK3I@BJV@ zb!s{2WFAb#J!&ZO!TT~+1TQ&qKB z@7IH=sU%$l-1Dn6cgr;;3vm^!wS+;y>QsGrw5>C=q{?e%lp&>`5~s6SP@dMaX$YQQ z?M`MZqaLJFzl=tQYqr{M1oPabU5vPi@R6z_k3ixXQgQ#I{EGZ`;SO;z{zCZ7>Ep+= zA&vs|#!UySs-B(;fBx!G(tL@fI5YYRs#%38w;J?i2`s9IJ6Uw4so1?KYrQ6BP~snW ztHO3^^hohv&#H>t!P0v@iE71NojbdpA;*0bL4>geCpqiIA1RF!Rd&x0R);AyW2#y! zZdK;?>1ZqCzIaSyCae3?_J4`uN3HFuNpp1+!PY@@VUCd89r$RKt574rs0RB-6j*j& zTyM+$x&0MpP#5lbODy_s*SwN|*G@>E2){Virg1O(?z$-;Unu*>Y5snO%$iNO&|Se+ zQiF)=>ujycLtydzQrQboAe|`r-&#@mz0ETl!SDM2sj!Pkp@u^NkLIM zB?JTn0SQUb|2zG@?|)tF;(Ftpb3gaf#0fvS@jeqE;qfkXmzHE^bZ;Emj1H-WB}p4||>UKqk7yLK38uzP{l0s)+t$f(Lm$a0l_G1S>5wK zClGR!L)^Q26l(En>|xLPjX|df!j6{22rr~6^Y>UXvBK=K?K3KPvxICiC{NfX`rB4I zn~$Z=PY*P|;JJIA{V~kS?a@1MaxnOeEL+p!eCJSa{6oHlb|EU#IISQ@cUjG*UIJM66?>$ro3qt2gwG zQLTCyQvXQk%Uo*%68+<)*ze`246@7@Beo-TJk7oHBSz=vW5e%O!QtqB$@==+OPLya z8ms^PQeJC)KK|i?VYWKembepdS1VR$k3VVT%|`F#<~jl#%_Ld*@?`Iv0_&XComk-! zyvsnF=v+4T`7@!QrhyyK@RQ?dizj;+m_9u-=_x@|QQ+dPw-Rf@06USkyx8}4)CX*X z6^!tH%`dy}M@|Lv0i&Ds&+D1wrX@HSmacBEfSPW)U6jzBu9H6EPhYEOayDl?t_|g4 zwNd=vvlW_vkpmaUM?DE7Y({?gH1h-5yw_}hqD`08N32~i>Y4A_g&-qO&s7#}yNxQn zy|(Z1{N)-!S;s#cAoHzFe*XG*y!E|(v_3;%Rvz!RwQ|S>b?lJ!dEATV-l%`vs;`_h6=UN&`c8no)v=RdVhaAs&sNl3)oIXawnF z>$|m!FE|Ik`QXTL$PcwGH@vIk3uYrKZCOF5?2ay^o!f0`ATZLL=~N_P=C&j|KuQbId*}v`$JaXY2Tog3vW=3s{OqKJHPnNLQAp1)qoM3>vQEw(?I0=jugNbBBNY zntxnxsu^e-ovJQrdyk{}5_@^>CcjeFjMvMca3@`r@YgJ?DwdU(T%VwmMYmQ!@&HTm7Hbe;(i^5gR}a7)NdG6%EWVd zh^6DWAWIBOh=i*hhSf={4rc%PH;t9w1v@Uz4&HV)Lbbf*Is*rhd?DZYzKeL+xqZj` z6`wv1M=XlS4g@tP?&05h0*_xp-}SzF>bmwu_vA{~irwI!hwIR|h9#yaF-hMG{|K}e zT(Yx-L4x4q)8c!z7cJi;G_WVGT{pUC-h?Ml{q|pZ>{XlOOLK019Bir zS=PUE>fDS6$HbyLWJr%ls)zy;a+-SVt2`N^R3 zB?`n7<&*T|JOVYV-Z-9%Q&ft~w^-Us%<8~IT$&WANPK)POtlr9Jql2l)t4j%<+ zF(V1=;GmiVu;yn%`FMpzQG5V!K=-7Zo(LIe&M3q{A&w$#7yDZKF4{EcnaDql!CsAh z{Apl4KilMcn-Gjhtc1R^z&v?Q40YUEP}<;eSBZMr2yxWRM1mkFxLjm)D6snj=ycin z>nk9mV+wX$37RL)lY8~lHgPcE9S#)M!CQ!*Ugbc`MeDtz&SZ1o>n%M+&S2IB)5@os z7m@a|;Qg!nUwk%&%#=w}b4vSayj~}DE$@_e$fHNM-{&Dxh9$&I=y zDwv&MwBAz-9ubK)bOX!&+eD$QHP;ux!{6l3&W0C+CUK$k(n|Z)b8;&6i&!9z$hOuG z7yDZ`eEky{Mve}&&O85E^fTasev1IX(vv_ZiYE=js^_MU%mq)h5v*SK%PA8tjMpTlpeh8evz1 zN%s^H44MOBsGjq^QnH8^62xYI?e>#^_H)zJeN&6NG5rSI@rpPQbWapp`$464YuY{c zIb_sdFDmlUgnMI(4ht09Mh$&;fMKc{G_|3Y^!M3g%|25-t96nLY*peFSk+c7&4hEM zd&H9a)kUcS$zv92nugk-WKLL9JczC@s)})LWZLM?N9OnLt~mX^RhgJH0kd#LY+DP| zlFE|dyCeyNDO;{gvC$Vgb~cE-foS+HDK`WL!@V*={c?tc_oXl26#m{SUcPySK~kvG zAjYKJjC6>cXM$8vSJ3&Vmn?CbUitJbGw{N8CYj4?>NlmF6=!;?JZeM59fkj&>`|lXDX*#)}>mj^#^x*7{+w+p{9tdfK3Ua;BeCU8;m0nFir;Ea7?-=@vOin0{r zJa8zsHQKJ5F=v6vehVi9fe@F?LV-2meXLw1*Cbm&?{5yErevI_40`2(v5d zel0exmCNzKJ0nXOhbl;eqXNyde|@>>&-CaIYL7Q8a1d0+5uu^eiwTMaL2Fpirs_MK zW!-8b?sYfpTpK=k|IdAUrt6qqPO+cXvk+8Kpq!F$BESlkjD}D<>Doms>EHhp^7+ES zVDQZksRfLeMF9-(ER@%zW%X(_N&nf!9JTr%Ms^tVZip|R=KZsn5AfT-czThlo7N^i z-F;WcMa~7m4-qH`5d>Shg1n~RJK5#BcJ#(Dt9l|fL_rHc4TitFk43_NX@s4urA@Xk zyWz?$rBg9rTPiRhk^?L&_AHBl1qVyqQNCA0Z|eH#9cC{& z+J+0yw*rWYC9^|{FiaKyO%A=2By2Zf*CqJWD087>u`&t0l7zZVncIj8(RDZvusc?u zHLiMEB$riQ*8=Bn>!AiLU9^DpCWBlVUG+<(<>}K+V`Xp0Meb78wC5tZS*ID1oi=7} zy<)_kqufhQ!E!#g@+w%)RlD*2MQ8uPk-$0+qKld$R~3nvF7K^B(DeJK&c@N+5~myP zs(zU)HfPA_iwdy+5Kv23%R8L-U>r$4}kn7cq?Y!a>0Fi%`y? zydy|)r&bRJNAnk~7E#Ro<8aIg2NtUP=tn3G5*dX#w`ZWv~MK zhz(-Kuips)*iOU7arV=v6IK@{>3Ez;AQ-zQ7C)N&z=_Uu{r%!k-|)PJFH{hKhYS?f zbthBbHMI&V$(isGZSJVAzDeN+sbQQ}(j17Ng`p{zWG0fcehm~)U$4d2VGjc+-J%m! za(+sU>a?CifI$G}T$p8cI(wPYIV&0)0BeY$Jrg2}4IRaqzU4^^ls#A?u z|8d@V_?=_`o#L!9`Zo=&Os<~D1ul5HO*?YAz_`Z)qq$j#DECJ<9)Y7?s1V1 zkz^EjNUV-rSHZ(g4MAd|6*7W46xhT}XcINZ=#V_+_Iv=uNFA;8Er1?<33wC@)pHn|4R)p+cQpXCtqDzM08o1(*r}U3u{fVo7aC4L z+f~X&T!!~R?0+=}MDpMyT<-8EIZI$12(rMh)@6bK{U4zP55>6Q=ouFp3Z(;?OWmsK z^ieW`9y96dK>`p-@P<~Dx~QlVR+f59kCERCVA;8(CLc?n5A16Woz8(Jv( zXDyrp{xGXe?xC6l!3lSCXn-BWVbvj-VpfpiNdB<_Y!)B_aHi<$XA4FcZyl#o#WDR= zk!rDSCN`@5i;#eOq&^_zZ_(rt(V%RVpU&TTTgmB`nZFW%2p=#vC|IJa>usXaxX)}a z&S&b#g4w*Cdx?%hOgYrJ-bsrbX$mhh#h(SXav39u9h1$0zRqac&AUYZ@10wecf#8v zvBmQ3{{i8bCalP1@B!8gVV1Huup zUtwhk6Kh4sw-2!Tr|H^~x4C_QrGVsvS5cc>loQNaMWK?M107OwO2ks@!Aw=9sO|zo zKcJE;aS95(X>WNC7@riU?5wA~*#@KsLB1lf4tu}n6P2V)cC&}WYh-k`tzAI;K2^LH;jR8emq6qW>V|FbWi(!5@mzIs+Y7@xJ>!a6RG=O*afLPUu)ncO{Z>p!6fgli&eHV6f zF#7>SiMw2&NcZu?Jx4+P96--i@&AskJ$ZU|Z89D0iM(d#U5WvqGyWZYq~ukJQBWsv z!huM7P#4@HK=4WazzY2pCcmySqTWmu8m}I z@0B2EA!EGD7Ji6u0EBJ)?Hat2}rvGj*nCZK*Ml+d)*|A?0oFA%ZJ zkP1|Vglf3e!(BGCR1w?i@>g~C>%gEI1R8r~d86zR=4*H5m&SCq=acR8KwbcX-2}=C zi#@dG$3AC%3pzgfWkX;$(OsO}gZ|*7thR$9ltr_P63oV-VY*U#VmnGSUx3?K`%Gd^ z)==`K!plT@wzAphN*2yr^S6Caaq9rx$YcXzeT0(eX-LByH66Qn(allWNcOZzwk{xy>1Dg(USJSaAqjtN@{f1{P^`c`ao>5ls^8d{-Sit+CW1#bx1~YPy z%DXH%NYbP;atH_oyy(C?p;xHf6vxd;4zFmYU0IAS?IkBD3rhg(_0tj7zadXrXKqc& z5ZuU&vD!`tufzR6*1oc*BuwNB(1~$J!i6;rk3`rA_GZ6C_SN4_2pSQ6%2-(P3!95u zM5{y?`}E6;mM03lgO`?x{W@&Gd5eI2U;Msq@JPKw^JA#>zvAA1#ij!I&{Hd3+dZ`6GI>9L}MYG$3vJJR;C*M{TRSooK(#_wC0lD)>v=x+@gk&)dKE}{O(c&Zhof-E z0J|R%_SbGb@xNFq@4KBE)l^!z-=lbK;YIJaVL&Vcu??|=2NvdiRT=UUd4==VbV zUSg`a-V@<7DzgIy^U+mp)c~pXbe7v#QJ)yWP1CdJmMQ(>mkQ1=!hiv1LMH+y@4t7p zwW5w=P_8Phd`vTGhrTV8!Uc%z44t?=8F1xF@s9~dF0}G?HnP5;$ji;g;tMyN3b0BM z@Q&I0+X^&Zn-D)Ksa@yK3O*uVL-gqUt~yF%D*@~;VFTntTJ~EV^NGg+ccT0jf;6oO zw(w_d;2X3Xp@asoia1DEAO1rIyraJ}h>u0wd7g#!ULKn@GXDOLxjkWQZCAj#>K+rJ z;tESHS!YpE$b%g@uh$ zbdbA%&5P2#Yn&99!Wg*ecTvYBtR_gm;kIUsHG=={w5>3E1jl_38CQU3HJ1w3eKo z(IBL~0@%4`tD0ph$4j@@8AY&7r4*S8D`($4G?ml<)P;TkI?DMP9M$D>q0S%Dg%SiR zRH|wVpEm-(rGNqVr&h-HYI4O_!)V)?<`LO)m}NilqEvbi(u6w)aQf&JV)`c*j~Br@ z_r?7gGBn4K&QdfQer!RpQyf$`PavXj9Vz{Bj+OzAqJA-8G6L2NVm}jB#=(FBC6x%{a5koRU z@d4foY%X)*cyo11K0Ek+Fk&S2SZ{~F^>3nx#gx8@d>Gld=keUTD@1+6hM@b4G5u`; zDnm5f6OK+NhK%YjbQa$M*s7K`R=K~{;PdBE*dpK_foknO&%QuoT~2DTk3OJTxiA~5 z6-seaem!wymlDfl84{n2nT?Nx4Kv*^_%`hDC|I=^GWdp1n^-y0^-GMmO=`{2{C)pK+TPl9~vu_%U#0i_*G zerMQlNkF9=tJr&zC%o!D$bIyR>$>mNR%0C=H6eoSd`U~;HRF=0E3(%uZDF8DYOpNp zJjNu@0wTcmo3mq50n!!aIdQ%jhu#I%mzZ-uVAu2l#W@ zr174MaRNn~vzTHc&KB;)1wK;ViYy<#b;tk5?&mBf3;0H92v@?NHx9JOA~56_FzFv^ zTT0#zn|ZD{lxIn~ct~N=FrrmlE- zl;a~`(t64nu)S^Mf&uk&+OaE2fd9Okf8kNz{9V#Q_^#_%hUtm(kJqXQ7+_T6@Z^GP zl6MVJbB8uE=6QS()-ZmHrBwTQ0~eY%RRexGRNzMVd~nv5ced(fw}tf6>mn!IRsL>1sS#dqb;%7BX^^2T6vC+oyzThdk;+`r5iMHdz4TJ06Y$O zs4&0@jcnHW8Gd>Q>B`tCGVcCeS-mwlF=7z3z%|lRVE^O~j1VAWa6{kl^RUs$qBsh3 zZTm}4BP63@J#%x=P)u(Zm7Q26L(wn68KM|Ef3r<)a~*J;wL=Z2@?mof>>Z`2#hkfe zo^@&6#jWvUrYKMCCHMO5$iv|?q(V*IExEQJs%tWB_` zA-x9LGKX~6p@MvShsGJNNjG6IQXfd{r|f{|QCB7<3tJTu>dx63MEXcd#I|n}r%L|q$AH?k64=>maEc(4s_w4Xd1Sm&}mhAS> zCdi<%b20X+sIg6LREN?Nw&Wcw5ORD6qKjP#QffRCNs=cY{SF#6xb9 zN%=CFzpQw=xyLh6Y+;Ud=yj5E?=v4HgJ?O>ni2cv_dqs^>TT()%Zt0(T(z$qXo0S3 zw%h8tSH@3!wViDq-gmyX=R#Y1dB{;5DegpbsDL*=btt>>b+YF6RvM!a!Le+$fod^c z{6*&*p$y$&goZ0mjRq$(E152{2XHdao5c>_17V~k^H=!F%^G-_Xsmqb@b6Xkx}5+*0(Np)$i4N@Uh5FKOFs>}O`OJ8)eFLCjznz7AzdyBVmfJyz_ebuRc& z>ZZr5JE=j;Sq#g#e&Mz>%NE~6-J1I2R84tmI1$SMdS6cNpD7)G6nm&F^i|o#YG%#! zqK=9R*hS(rH?M6|0rEEVbmN)fav}+Czy?&%bsJ;q?q&vEkZBks2Ss*28{|RK@1Fnq|&6r5j-56cjP@RYG6$ zyTC^$<0ADd!x8h1_n=6^@u;prd>IO5)7)bNl(O=gNqo8$n+2r(^*dU7Mxf^ExzfxP z*OAck!kVirp&Lq}BR&gJuMV4HfTp-+Mn?ZgrrHe^6k~l#r>ltHwN=B)gMJ^rD}f_) zlDn*I`66Hw!Ee(>CrNIvz4`@!*hQ6 z;=E!boe11<-3bp!>t#x?7=!QjIBb)nH$`Cfsmhb>AXzRYKy{QZ&xo+Ugm zcITeeW!tN+-J_BwSyDi;N0;9m-BFQQVv8%lt<#PAiQbGa<3NO~4_$CLWt7)K7dD%Yv{{i7x+|U33 diff --git a/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryControllerNode.swift b/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryControllerNode.swift index 4e3badd9bc..7fe7482657 100644 --- a/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryControllerNode.swift +++ b/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryControllerNode.swift @@ -414,7 +414,7 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF prefix: codePrefix, count: codeLength, width: maximumWidth - 28.0, - compact: layout.size.width <= 320.0 + compact: layout.size.width <= 320.0 || (layout.size.width <= 375.0 && codeLength > 5) ) var items: [AuthorizationLayoutItem] = [] diff --git a/submodules/AuthorizationUI/Sources/AuthorizationSequencePhoneEntryControllerNode.swift b/submodules/AuthorizationUI/Sources/AuthorizationSequencePhoneEntryControllerNode.swift index baf313b0fc..aaf572aa59 100644 --- a/submodules/AuthorizationUI/Sources/AuthorizationSequencePhoneEntryControllerNode.swift +++ b/submodules/AuthorizationUI/Sources/AuthorizationSequencePhoneEntryControllerNode.swift @@ -968,7 +968,12 @@ final class PhoneConfirmationController: ViewController { if case .regular = layout.metrics.widthClass { originY = floorToScreenPixels((layout.size.height - backgroundSize.height) / 2.0) } else { - originY = layout.size.height - backgroundSize.height - 260.0 + let hasOnScreenNavigation = layout.deviceMetrics.onScreenNavigationHeight(inLandscape: false, systemOnScreenNavigationHeight: nil) != nil + if hasOnScreenNavigation || layout.deviceMetrics.hasTopNotch || layout.deviceMetrics.hasDynamicIsland { + originY = layout.size.height - backgroundSize.height - 260.0 + } else { + originY = floorToScreenPixels((layout.size.height - backgroundSize.height) / 2.0) + } } let backgroundFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((layout.size.width - backgroundSize.width) / 2.0), y: originY), size: backgroundSize) diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index c0f5faa412..0bb0ea591e 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -2131,12 +2131,20 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController } @objc fileprivate func reorderingDonePressed() { - if !self.chatListDisplayNode.isReorderingFilters { + guard let defaultFilters = self.tabContainerData else { return } + let defaultFilterIds = defaultFilters.0.compactMap { entry -> Int32? in + switch entry { + case .all: + return 0 + case let .filter(id, _, _): + return id + } + } var reorderedFilterIdsValue: [Int32]? - if let reorderedFilterIds = self.tabContainerNode.reorderedFilterIds { + if let reorderedFilterIds = self.tabContainerNode.reorderedFilterIds, reorderedFilterIds != defaultFilterIds { reorderedFilterIdsValue = reorderedFilterIds } diff --git a/submodules/Display/Source/TextFieldNode.swift b/submodules/Display/Source/TextFieldNode.swift index 6908acface..a111b12442 100644 --- a/submodules/Display/Source/TextFieldNode.swift +++ b/submodules/Display/Source/TextFieldNode.swift @@ -8,15 +8,15 @@ public final class TextFieldNodeView: UITextField { var fixOffset: Bool = true override public func editingRect(forBounds bounds: CGRect) -> CGRect { - return bounds.offsetBy(dx: 0.0, dy: 0.0).integral + return bounds.integral } override public func textRect(forBounds bounds: CGRect) -> CGRect { - return bounds.offsetBy(dx: 0.0, dy: 0.0).integral + return bounds.integral } override public func placeholderRect(forBounds bounds: CGRect) -> CGRect { - return self.editingRect(forBounds: bounds.offsetBy(dx: 0.0, dy: 0.0)) + return self.editingRect(forBounds: bounds) } override public func deleteBackward() { diff --git a/submodules/DrawingUI/Sources/DrawingStickerEntity.swift b/submodules/DrawingUI/Sources/DrawingStickerEntity.swift index 55332c1705..1d22294a9d 100644 --- a/submodules/DrawingUI/Sources/DrawingStickerEntity.swift +++ b/submodules/DrawingUI/Sources/DrawingStickerEntity.swift @@ -48,7 +48,7 @@ public final class DrawingStickerEntity: DrawingEntity, Codable { public var isAnimated: Bool { switch self.content { case let .file(file): - return file.isAnimatedSticker || file.isVideoSticker + return file.isAnimatedSticker || file.isVideoSticker || file.mimeType == "video/webm" case .image: return false } diff --git a/submodules/DrawingUI/Sources/StickerPickerScreen.swift b/submodules/DrawingUI/Sources/StickerPickerScreen.swift index fc76d525f9..67d4c400f2 100644 --- a/submodules/DrawingUI/Sources/StickerPickerScreen.swift +++ b/submodules/DrawingUI/Sources/StickerPickerScreen.swift @@ -318,11 +318,24 @@ class StickerPickerScreen: ViewController { guard let strongSelf = self, let controller = strongSelf.controller else { return } - if groupId == AnyHashable("popular") { - let presentationData = controller.context.sharedContext.currentPresentationData.with { $0 }.withUpdated(theme: defaultDarkColorPresentationTheme) + let presentationData = controller.context.sharedContext.currentPresentationData.with { $0 }.withUpdated(theme: defaultDarkColorPresentationTheme) + let context = controller.context + if groupId == AnyHashable("recent") { + let actionSheet = ActionSheetController(theme: ActionSheetControllerTheme(presentationTheme: presentationData.theme, fontSize: presentationData.listsFontSize)) + var items: [ActionSheetItem] = [] + items.append(ActionSheetButtonItem(title: presentationData.strings.Emoji_ClearRecent, color: .destructive, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + let _ = context.engine.stickers.clearRecentlyUsedEmoji().start() + })) + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + context.sharedContext.mainWindow?.presentInGlobalOverlay(actionSheet) + } else if groupId == AnyHashable("popular") { let actionSheet = ActionSheetController(theme: ActionSheetControllerTheme(presentationTheme: presentationData.theme, fontSize: presentationData.listsFontSize)) var items: [ActionSheetItem] = [] - let context = controller.context items.append(ActionSheetTextItem(title: presentationData.strings.Chat_ClearReactionsAlertText, parseMarkdown: true)) items.append(ActionSheetButtonItem(title: presentationData.strings.Chat_ClearReactionsAlertAction, color: .destructive, action: { [weak actionSheet] in actionSheet?.dismissAnimated() diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickersContext.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickersContext.swift index f0533842ef..65841ad319 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickersContext.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyPaintStickersContext.swift @@ -101,7 +101,7 @@ private class LegacyPaintStickerEntity: LegacyPaintEntity { case let .file(file): self.file = file if file.isAnimatedSticker || file.isVideoSticker || file.mimeType == "video/webm" { - self.source = AnimatedStickerResourceSource(account: account, resource: file.resource, isVideo: file.isVideoSticker) + self.source = AnimatedStickerResourceSource(account: account, resource: file.resource, isVideo: file.isVideoSticker || file.mimeType == "video/webm") if let source = self.source { let dimensions = file.dimensions ?? PixelDimensions(width: 512, height: 512) let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 384, height: 384)) @@ -406,10 +406,13 @@ public final class LegacyPaintEntityRenderer: NSObject, TGPhotoPaintEntityRender private let originalSize: CGSize private let cropRect: CGRect? + private let isAvatar: Bool + public init(account: Account?, adjustments: TGMediaEditAdjustments) { self.account = account self.originalSize = adjustments.originalSize self.cropRect = adjustments.cropRect.isEmpty ? nil : adjustments.cropRect + self.isAvatar = ((adjustments as? TGVideoEditAdjustments)?.documentId ?? 0) != 0 var renderEntities: [LegacyPaintEntity] = [] if let account = account, let paintingData = adjustments.paintingData, let entitiesData = paintingData.entitiesData { @@ -477,7 +480,7 @@ public final class LegacyPaintEntityRenderer: NSObject, TGPhotoPaintEntityRender } else { result = minDuration } - if result < minDuration { + if result < minDuration && !self.isAvatar { if result > 0 { result = result * ceil(minDuration / result) } else { diff --git a/submodules/PhoneInputNode/Sources/PhoneInputNode.swift b/submodules/PhoneInputNode/Sources/PhoneInputNode.swift index 2b5283a3e4..76b745cd23 100644 --- a/submodules/PhoneInputNode/Sources/PhoneInputNode.swift +++ b/submodules/PhoneInputNode/Sources/PhoneInputNode.swift @@ -198,7 +198,6 @@ public final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { self.countryCodeField.textField.returnKeyType = .next if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { self.countryCodeField.textField.keyboardType = .asciiCapableNumberPad -// self.countryCodeField.textField.textContentType = .telephoneNumber } else { self.countryCodeField.textField.keyboardType = .numberPad } @@ -209,7 +208,6 @@ public final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { self.numberField.textField.font = font if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { self.numberField.textField.keyboardType = .asciiCapableNumberPad -// self.numberField.textField.textContentType = .telephoneNumber } else { self.numberField.textField.keyboardType = .numberPad } diff --git a/submodules/RMIntro/Sources/platform/ios/RMIntroViewController.m b/submodules/RMIntro/Sources/platform/ios/RMIntroViewController.m index 4e8be0d8df..249ca084ca 100644 --- a/submodules/RMIntro/Sources/platform/ios/RMIntroViewController.m +++ b/submodules/RMIntro/Sources/platform/ios/RMIntroViewController.m @@ -243,7 +243,7 @@ typedef enum { CGPoint buttonTargetPosition = _startButton.center; _startButton.center = CGPointMake(buttonTargetPosition.x, buttonTargetPosition.y + 220.0); - _glkView.transform = CGAffineTransformMakeScale(0.68, 0.68); + _glkView.transform = CGAffineTransformMakeScale(0.66, 0.66); [UIView animateWithDuration:0.65 delay:0.15 usingSpringWithDamping:1.2f initialSpringVelocity:0.0 options:kNilOptions animations:^{ _glkView.center = logoTargetPosition; diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index cee0bc09a6..4de19de1e5 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -207,6 +207,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1383932651] = { return Api.EmailVerifyPurpose.parse_emailVerifyPurposeLoginChange($0) } dict[1128644211] = { return Api.EmailVerifyPurpose.parse_emailVerifyPurposeLoginSetup($0) } dict[-1141565819] = { return Api.EmailVerifyPurpose.parse_emailVerifyPurposePassport($0) } + dict[2056961449] = { return Api.EmojiGroup.parse_emojiGroup($0) } dict[-709641735] = { return Api.EmojiKeyword.parse_emojiKeyword($0) } dict[594408994] = { return Api.EmojiKeyword.parse_emojiKeywordDeleted($0) } dict[1556570557] = { return Api.EmojiKeywordsDifference.parse_emojiKeywordsDifference($0) } @@ -1031,6 +1032,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-253500010] = { return Api.messages.Dialogs.parse_dialogsNotModified($0) } dict[1910543603] = { return Api.messages.Dialogs.parse_dialogsSlice($0) } dict[-1506535550] = { return Api.messages.DiscussionMessage.parse_discussionMessage($0) } + dict[-2011186869] = { return Api.messages.EmojiGroups.parse_emojiGroups($0) } + dict[1874111879] = { return Api.messages.EmojiGroups.parse_emojiGroupsNotModified($0) } dict[410107472] = { return Api.messages.ExportedChatInvite.parse_exportedChatInvite($0) } dict[572915951] = { return Api.messages.ExportedChatInvite.parse_exportedChatInviteReplaced($0) } dict[-1111085620] = { return Api.messages.ExportedChatInvites.parse_exportedChatInvites($0) } @@ -1295,6 +1298,8 @@ public extension Api { _1.serialize(buffer, boxed) case let _1 as Api.EmailVerifyPurpose: _1.serialize(buffer, boxed) + case let _1 as Api.EmojiGroup: + _1.serialize(buffer, boxed) case let _1 as Api.EmojiKeyword: _1.serialize(buffer, boxed) case let _1 as Api.EmojiKeywordsDifference: @@ -1823,6 +1828,8 @@ public extension Api { _1.serialize(buffer, boxed) case let _1 as Api.messages.DiscussionMessage: _1.serialize(buffer, boxed) + case let _1 as Api.messages.EmojiGroups: + _1.serialize(buffer, boxed) case let _1 as Api.messages.ExportedChatInvite: _1.serialize(buffer, boxed) case let _1 as Api.messages.ExportedChatInvites: diff --git a/submodules/TelegramApi/Sources/Api26.swift b/submodules/TelegramApi/Sources/Api26.swift index f7e40833c8..8ad3ca293a 100644 --- a/submodules/TelegramApi/Sources/Api26.swift +++ b/submodules/TelegramApi/Sources/Api26.swift @@ -800,6 +800,64 @@ public extension Api.messages { } } +public extension Api.messages { + enum EmojiGroups: TypeConstructorDescription { + case emojiGroups(hash: Int32, groups: [Api.EmojiGroup]) + case emojiGroupsNotModified + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .emojiGroups(let hash, let groups): + if boxed { + buffer.appendInt32(-2011186869) + } + serializeInt32(hash, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(groups.count)) + for item in groups { + item.serialize(buffer, true) + } + break + case .emojiGroupsNotModified: + if boxed { + buffer.appendInt32(1874111879) + } + + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .emojiGroups(let hash, let groups): + return ("emojiGroups", [("hash", hash as Any), ("groups", groups as Any)]) + case .emojiGroupsNotModified: + return ("emojiGroupsNotModified", []) + } + } + + public static func parse_emojiGroups(_ reader: BufferReader) -> EmojiGroups? { + var _1: Int32? + _1 = reader.readInt32() + var _2: [Api.EmojiGroup]? + if let _ = reader.readInt32() { + _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.EmojiGroup.self) + } + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.messages.EmojiGroups.emojiGroups(hash: _1!, groups: _2!) + } + else { + return nil + } + } + public static func parse_emojiGroupsNotModified(_ reader: BufferReader) -> EmojiGroups? { + return Api.messages.EmojiGroups.emojiGroupsNotModified + } + + } +} public extension Api.messages { enum ExportedChatInvite: TypeConstructorDescription { case exportedChatInvite(invite: Api.ExportedChatInvite, users: [Api.User]) @@ -1364,101 +1422,3 @@ public extension Api.messages { } } -public extension Api.messages { - enum InactiveChats: TypeConstructorDescription { - case inactiveChats(dates: [Int32], chats: [Api.Chat], users: [Api.User]) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .inactiveChats(let dates, let chats, let users): - if boxed { - buffer.appendInt32(-1456996667) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(dates.count)) - for item in dates { - serializeInt32(item, buffer: buffer, boxed: false) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(chats.count)) - for item in chats { - item.serialize(buffer, true) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(users.count)) - for item in users { - item.serialize(buffer, true) - } - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .inactiveChats(let dates, let chats, let users): - return ("inactiveChats", [("dates", dates as Any), ("chats", chats as Any), ("users", users as Any)]) - } - } - - public static func parse_inactiveChats(_ reader: BufferReader) -> InactiveChats? { - var _1: [Int32]? - if let _ = reader.readInt32() { - _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) - } - var _2: [Api.Chat]? - if let _ = reader.readInt32() { - _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Chat.self) - } - var _3: [Api.User]? - if let _ = reader.readInt32() { - _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) - } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.messages.InactiveChats.inactiveChats(dates: _1!, chats: _2!, users: _3!) - } - else { - return nil - } - } - - } -} -public extension Api.messages { - enum MessageEditData: TypeConstructorDescription { - case messageEditData(flags: Int32) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .messageEditData(let flags): - if boxed { - buffer.appendInt32(649453030) - } - serializeInt32(flags, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .messageEditData(let flags): - return ("messageEditData", [("flags", flags as Any)]) - } - } - - public static func parse_messageEditData(_ reader: BufferReader) -> MessageEditData? { - var _1: Int32? - _1 = reader.readInt32() - let _c1 = _1 != nil - if _c1 { - return Api.messages.MessageEditData.messageEditData(flags: _1!) - } - else { - return nil - } - } - - } -} diff --git a/submodules/TelegramApi/Sources/Api27.swift b/submodules/TelegramApi/Sources/Api27.swift index ba46e29edf..42309a4b33 100644 --- a/submodules/TelegramApi/Sources/Api27.swift +++ b/submodules/TelegramApi/Sources/Api27.swift @@ -1,3 +1,101 @@ +public extension Api.messages { + enum InactiveChats: TypeConstructorDescription { + case inactiveChats(dates: [Int32], chats: [Api.Chat], users: [Api.User]) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .inactiveChats(let dates, let chats, let users): + if boxed { + buffer.appendInt32(-1456996667) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(dates.count)) + for item in dates { + serializeInt32(item, buffer: buffer, boxed: false) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(chats.count)) + for item in chats { + item.serialize(buffer, true) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(users.count)) + for item in users { + item.serialize(buffer, true) + } + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .inactiveChats(let dates, let chats, let users): + return ("inactiveChats", [("dates", dates as Any), ("chats", chats as Any), ("users", users as Any)]) + } + } + + public static func parse_inactiveChats(_ reader: BufferReader) -> InactiveChats? { + var _1: [Int32]? + if let _ = reader.readInt32() { + _1 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) + } + var _2: [Api.Chat]? + if let _ = reader.readInt32() { + _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Chat.self) + } + var _3: [Api.User]? + if let _ = reader.readInt32() { + _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) + } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.messages.InactiveChats.inactiveChats(dates: _1!, chats: _2!, users: _3!) + } + else { + return nil + } + } + + } +} +public extension Api.messages { + enum MessageEditData: TypeConstructorDescription { + case messageEditData(flags: Int32) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .messageEditData(let flags): + if boxed { + buffer.appendInt32(649453030) + } + serializeInt32(flags, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .messageEditData(let flags): + return ("messageEditData", [("flags", flags as Any)]) + } + } + + public static func parse_messageEditData(_ reader: BufferReader) -> MessageEditData? { + var _1: Int32? + _1 = reader.readInt32() + let _c1 = _1 != nil + if _c1 { + return Api.messages.MessageEditData.messageEditData(flags: _1!) + } + else { + return nil + } + } + + } +} public extension Api.messages { enum MessageReactionsList: TypeConstructorDescription { case messageReactionsList(flags: Int32, count: Int32, reactions: [Api.MessagePeerReaction], chats: [Api.Chat], users: [Api.User], nextOffset: String?) @@ -1318,67 +1416,3 @@ public extension Api.messages { } } -public extension Api.messages { - enum VotesList: TypeConstructorDescription { - case votesList(flags: Int32, count: Int32, votes: [Api.MessageUserVote], users: [Api.User], nextOffset: String?) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .votesList(let flags, let count, let votes, let users, let nextOffset): - if boxed { - buffer.appendInt32(136574537) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeInt32(count, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(votes.count)) - for item in votes { - item.serialize(buffer, true) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(users.count)) - for item in users { - item.serialize(buffer, true) - } - if Int(flags) & Int(1 << 0) != 0 {serializeString(nextOffset!, buffer: buffer, boxed: false)} - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .votesList(let flags, let count, let votes, let users, let nextOffset): - return ("votesList", [("flags", flags as Any), ("count", count as Any), ("votes", votes as Any), ("users", users as Any), ("nextOffset", nextOffset as Any)]) - } - } - - public static func parse_votesList(_ reader: BufferReader) -> VotesList? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int32? - _2 = reader.readInt32() - var _3: [Api.MessageUserVote]? - if let _ = reader.readInt32() { - _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageUserVote.self) - } - var _4: [Api.User]? - if let _ = reader.readInt32() { - _4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) - } - var _5: String? - if Int(_1!) & Int(1 << 0) != 0 {_5 = parseString(reader) } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - let _c5 = (Int(_1!) & Int(1 << 0) == 0) || _5 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 { - return Api.messages.VotesList.votesList(flags: _1!, count: _2!, votes: _3!, users: _4!, nextOffset: _5) - } - else { - return nil - } - } - - } -} diff --git a/submodules/TelegramApi/Sources/Api28.swift b/submodules/TelegramApi/Sources/Api28.swift index 508590d536..7a33c0f4b4 100644 --- a/submodules/TelegramApi/Sources/Api28.swift +++ b/submodules/TelegramApi/Sources/Api28.swift @@ -1,3 +1,67 @@ +public extension Api.messages { + enum VotesList: TypeConstructorDescription { + case votesList(flags: Int32, count: Int32, votes: [Api.MessageUserVote], users: [Api.User], nextOffset: String?) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .votesList(let flags, let count, let votes, let users, let nextOffset): + if boxed { + buffer.appendInt32(136574537) + } + serializeInt32(flags, buffer: buffer, boxed: false) + serializeInt32(count, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(votes.count)) + for item in votes { + item.serialize(buffer, true) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(users.count)) + for item in users { + item.serialize(buffer, true) + } + if Int(flags) & Int(1 << 0) != 0 {serializeString(nextOffset!, buffer: buffer, boxed: false)} + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .votesList(let flags, let count, let votes, let users, let nextOffset): + return ("votesList", [("flags", flags as Any), ("count", count as Any), ("votes", votes as Any), ("users", users as Any), ("nextOffset", nextOffset as Any)]) + } + } + + public static func parse_votesList(_ reader: BufferReader) -> VotesList? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int32? + _2 = reader.readInt32() + var _3: [Api.MessageUserVote]? + if let _ = reader.readInt32() { + _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageUserVote.self) + } + var _4: [Api.User]? + if let _ = reader.readInt32() { + _4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) + } + var _5: String? + if Int(_1!) & Int(1 << 0) != 0 {_5 = parseString(reader) } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + let _c4 = _4 != nil + let _c5 = (Int(_1!) & Int(1 << 0) == 0) || _5 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 { + return Api.messages.VotesList.votesList(flags: _1!, count: _2!, votes: _3!, users: _4!, nextOffset: _5) + } + else { + return nil + } + } + + } +} public extension Api.payments { enum BankCardData: TypeConstructorDescription { case bankCardData(title: String, openUrls: [Api.BankCardOpenUrl]) diff --git a/submodules/TelegramApi/Sources/Api30.swift b/submodules/TelegramApi/Sources/Api30.swift index a34000dc6e..700b36a3d5 100644 --- a/submodules/TelegramApi/Sources/Api30.swift +++ b/submodules/TelegramApi/Sources/Api30.swift @@ -4564,6 +4564,21 @@ public extension Api.functions.messages { }) } } +public extension Api.functions.messages { + static func getEmojiGroups(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1955122779) + serializeInt32(hash, buffer: buffer, boxed: false) + return (FunctionDescription(name: "messages.getEmojiGroups", parameters: [("hash", String(describing: hash))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.EmojiGroups? in + let reader = BufferReader(buffer) + var result: Api.messages.EmojiGroups? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.EmojiGroups + } + return result + }) + } +} public extension Api.functions.messages { static func getEmojiKeywords(langCode: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() @@ -4614,6 +4629,21 @@ public extension Api.functions.messages { }) } } +public extension Api.functions.messages { + static func getEmojiStatusGroups(hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(785209037) + serializeInt32(hash, buffer: buffer, boxed: false) + return (FunctionDescription(name: "messages.getEmojiStatusGroups", parameters: [("hash", String(describing: hash))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.EmojiGroups? in + let reader = BufferReader(buffer) + var result: Api.messages.EmojiGroups? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.EmojiGroups + } + return result + }) + } +} public extension Api.functions.messages { static func getEmojiStickers(hash: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() @@ -6027,6 +6057,22 @@ public extension Api.functions.messages { }) } } +public extension Api.functions.messages { + static func searchCustomEmoji(emoticon: String, hash: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(739360983) + serializeString(emoticon, buffer: buffer, boxed: false) + serializeInt64(hash, buffer: buffer, boxed: false) + return (FunctionDescription(name: "messages.searchCustomEmoji", parameters: [("emoticon", String(describing: emoticon)), ("hash", String(describing: hash))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.EmojiList? in + let reader = BufferReader(buffer) + var result: Api.EmojiList? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.EmojiList + } + return result + }) + } +} public extension Api.functions.messages { static func searchGlobal(flags: Int32, folderId: Int32?, q: String, filter: Api.MessagesFilter, minDate: Int32, maxDate: Int32, offsetRate: Int32, offsetPeer: Api.InputPeer, offsetId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() @@ -7676,12 +7722,12 @@ public extension Api.functions.photos { public extension Api.functions.photos { static func uploadProfilePhoto(flags: Int32, file: Api.InputFile?, video: Api.InputFile?, videoStartTs: Double?, videoEmojiMarkup: Api.VideoSize?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-771759753) + buffer.appendInt32(154966609) serializeInt32(flags, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 0) != 0 {file!.serialize(buffer, true)} if Int(flags) & Int(1 << 1) != 0 {video!.serialize(buffer, true)} if Int(flags) & Int(1 << 2) != 0 {serializeDouble(videoStartTs!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 3) != 0 {videoEmojiMarkup!.serialize(buffer, true)} + if Int(flags) & Int(1 << 4) != 0 {videoEmojiMarkup!.serialize(buffer, true)} return (FunctionDescription(name: "photos.uploadProfilePhoto", parameters: [("flags", String(describing: flags)), ("file", String(describing: file)), ("video", String(describing: video)), ("videoStartTs", String(describing: videoStartTs)), ("videoEmojiMarkup", String(describing: videoEmojiMarkup))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.photos.Photo? in let reader = BufferReader(buffer) var result: Api.photos.Photo? diff --git a/submodules/TelegramApi/Sources/Api5.swift b/submodules/TelegramApi/Sources/Api5.swift index b3effb2ab1..1d327a9163 100644 --- a/submodules/TelegramApi/Sources/Api5.swift +++ b/submodules/TelegramApi/Sources/Api5.swift @@ -220,6 +220,56 @@ public extension Api { } } +public extension Api { + enum EmojiGroup: TypeConstructorDescription { + case emojiGroup(title: String, iconEmojiId: Int64, emoticons: [String]) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .emojiGroup(let title, let iconEmojiId, let emoticons): + if boxed { + buffer.appendInt32(2056961449) + } + serializeString(title, buffer: buffer, boxed: false) + serializeInt64(iconEmojiId, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(emoticons.count)) + for item in emoticons { + serializeString(item, buffer: buffer, boxed: false) + } + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .emojiGroup(let title, let iconEmojiId, let emoticons): + return ("emojiGroup", [("title", title as Any), ("iconEmojiId", iconEmojiId as Any), ("emoticons", emoticons as Any)]) + } + } + + public static func parse_emojiGroup(_ reader: BufferReader) -> EmojiGroup? { + var _1: String? + _1 = parseString(reader) + var _2: Int64? + _2 = reader.readInt64() + var _3: [String]? + if let _ = reader.readInt32() { + _3 = Api.parseVector(reader, elementSignature: -1255641564, elementType: String.self) + } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.EmojiGroup.emojiGroup(title: _1!, iconEmojiId: _2!, emoticons: _3!) + } + else { + return nil + } + } + + } +} public extension Api { enum EmojiKeyword: TypeConstructorDescription { case emojiKeyword(keyword: String, emoticons: [String]) @@ -1054,47 +1104,3 @@ public extension Api { } } -public extension Api { - enum FileHash: TypeConstructorDescription { - case fileHash(offset: Int64, limit: Int32, hash: Buffer) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .fileHash(let offset, let limit, let hash): - if boxed { - buffer.appendInt32(-207944868) - } - serializeInt64(offset, buffer: buffer, boxed: false) - serializeInt32(limit, buffer: buffer, boxed: false) - serializeBytes(hash, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .fileHash(let offset, let limit, let hash): - return ("fileHash", [("offset", offset as Any), ("limit", limit as Any), ("hash", hash as Any)]) - } - } - - public static func parse_fileHash(_ reader: BufferReader) -> FileHash? { - var _1: Int64? - _1 = reader.readInt64() - var _2: Int32? - _2 = reader.readInt32() - var _3: Buffer? - _3 = parseBytes(reader) - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.FileHash.fileHash(offset: _1!, limit: _2!, hash: _3!) - } - else { - return nil - } - } - - } -} diff --git a/submodules/TelegramApi/Sources/Api6.swift b/submodules/TelegramApi/Sources/Api6.swift index 69adbb6013..226f3df1a4 100644 --- a/submodules/TelegramApi/Sources/Api6.swift +++ b/submodules/TelegramApi/Sources/Api6.swift @@ -1,3 +1,47 @@ +public extension Api { + enum FileHash: TypeConstructorDescription { + case fileHash(offset: Int64, limit: Int32, hash: Buffer) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .fileHash(let offset, let limit, let hash): + if boxed { + buffer.appendInt32(-207944868) + } + serializeInt64(offset, buffer: buffer, boxed: false) + serializeInt32(limit, buffer: buffer, boxed: false) + serializeBytes(hash, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .fileHash(let offset, let limit, let hash): + return ("fileHash", [("offset", offset as Any), ("limit", limit as Any), ("hash", hash as Any)]) + } + } + + public static func parse_fileHash(_ reader: BufferReader) -> FileHash? { + var _1: Int64? + _1 = reader.readInt64() + var _2: Int32? + _2 = reader.readInt32() + var _3: Buffer? + _3 = parseBytes(reader) + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.FileHash.fileHash(offset: _1!, limit: _2!, hash: _3!) + } + else { + return nil + } + } + + } +} public extension Api { enum Folder: TypeConstructorDescription { case folder(flags: Int32, id: Int32, title: String, photo: Api.ChatPhoto?) diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/PeerPhotoUpdater.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/PeerPhotoUpdater.swift index 8a788821e7..31e96678f9 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/PeerPhotoUpdater.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/PeerPhotoUpdater.swift @@ -15,7 +15,7 @@ public enum UploadPeerPhotoError { } func _internal_updateAccountPhoto(account: Account, resource: MediaResource?, videoResource: MediaResource?, videoStartTimestamp: Double?, fileId: Int64?, backgroundColors: [Int32]?, fallback: Bool, mapResourceToAvatarSizes: @escaping (MediaResource, [TelegramMediaImageRepresentation]) -> Signal<[Int: Data], NoError>) -> Signal { - return _internal_updatePeerPhoto(postbox: account.postbox, network: account.network, stateManager: account.stateManager, accountPeerId: account.peerId, peerId: account.peerId, photo: resource.flatMap({ _internal_uploadedPeerPhoto(postbox: account.postbox, network: account.network, resource: $0) }), video: videoResource.flatMap({ _internal_uploadedPeerVideo(postbox: account.postbox, network: account.network, messageMediaPreuploadManager: account.messageMediaPreuploadManager, resource: $0) |> map(Optional.init) }), videoStartTimestamp: videoStartTimestamp, fallback: fallback, mapResourceToAvatarSizes: mapResourceToAvatarSizes) + return _internal_updatePeerPhoto(postbox: account.postbox, network: account.network, stateManager: account.stateManager, accountPeerId: account.peerId, peerId: account.peerId, photo: resource.flatMap({ _internal_uploadedPeerPhoto(postbox: account.postbox, network: account.network, resource: $0) }), video: videoResource.flatMap({ _internal_uploadedPeerVideo(postbox: account.postbox, network: account.network, messageMediaPreuploadManager: account.messageMediaPreuploadManager, resource: $0) |> map(Optional.init) }), videoStartTimestamp: videoStartTimestamp, fileId: fileId, backgroundColors: backgroundColors, fallback: fallback, mapResourceToAvatarSizes: mapResourceToAvatarSizes) } public enum SetCustomPeerPhotoMode { @@ -77,7 +77,7 @@ func _internal_uploadedPeerVideo(postbox: Postbox, network: Network, messageMedi } func _internal_updatePeerPhoto(postbox: Postbox, network: Network, stateManager: AccountStateManager?, accountPeerId: PeerId, peerId: PeerId, photo: Signal?, video: Signal? = nil, videoStartTimestamp: Double? = nil, fileId: Int64? = nil, backgroundColors: [Int32]? = nil, fallback: Bool = false, customPeerPhotoMode: SetCustomPeerPhotoMode? = nil, mapResourceToAvatarSizes: @escaping (MediaResource, [TelegramMediaImageRepresentation]) -> Signal<[Int: Data], NoError>) -> Signal { - return _internal_updatePeerPhotoInternal(postbox: postbox, network: network, stateManager: stateManager, accountPeerId: accountPeerId, peer: postbox.loadedPeerWithId(peerId), photo: photo, video: video, videoStartTimestamp: videoStartTimestamp, fallback: fallback, customPeerPhotoMode: customPeerPhotoMode, mapResourceToAvatarSizes: mapResourceToAvatarSizes) + return _internal_updatePeerPhotoInternal(postbox: postbox, network: network, stateManager: stateManager, accountPeerId: accountPeerId, peer: postbox.loadedPeerWithId(peerId), photo: photo, video: video, videoStartTimestamp: videoStartTimestamp, fileId: fileId, backgroundColors: backgroundColors, fallback: fallback, customPeerPhotoMode: customPeerPhotoMode, mapResourceToAvatarSizes: mapResourceToAvatarSizes) } func _internal_updatePeerPhotoInternal(postbox: Postbox, network: Network, stateManager: AccountStateManager?, accountPeerId: PeerId, peer: Signal, photo: Signal?, video: Signal?, videoStartTimestamp: Double?, fileId: Int64? = nil, backgroundColors: [Int32]? = nil, fallback: Bool = false, customPeerPhotoMode: SetCustomPeerPhotoMode? = nil, mapResourceToAvatarSizes: @escaping (MediaResource, [TelegramMediaImageRepresentation]) -> Signal<[Int: Data], NoError>) -> Signal { diff --git a/submodules/TelegramUI/Components/AvatarEditorScreen/Sources/AvatarEditorScreen.swift b/submodules/TelegramUI/Components/AvatarEditorScreen/Sources/AvatarEditorScreen.swift index 3c1876b3be..3648e9902b 100644 --- a/submodules/TelegramUI/Components/AvatarEditorScreen/Sources/AvatarEditorScreen.swift +++ b/submodules/TelegramUI/Components/AvatarEditorScreen/Sources/AvatarEditorScreen.swift @@ -451,11 +451,24 @@ final class AvatarEditorScreenComponent: Component { guard let strongSelf = self, let controller = strongSelf.controller?() else { return } - if groupId == AnyHashable("popular") { - let presentationData = controller.context.sharedContext.currentPresentationData.with { $0 }.withUpdated(theme: defaultDarkColorPresentationTheme) + let context = controller.context + let presentationData = controller.context.sharedContext.currentPresentationData.with { $0 } + if groupId == AnyHashable("recent") { + let actionSheet = ActionSheetController(theme: ActionSheetControllerTheme(presentationTheme: presentationData.theme, fontSize: presentationData.listsFontSize)) + var items: [ActionSheetItem] = [] + items.append(ActionSheetButtonItem(title: presentationData.strings.Emoji_ClearRecent, color: .destructive, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + let _ = context.engine.stickers.clearRecentlyUsedEmoji().start() + })) + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + context.sharedContext.mainWindow?.presentInGlobalOverlay(actionSheet) + } else if groupId == AnyHashable("popular") { let actionSheet = ActionSheetController(theme: ActionSheetControllerTheme(presentationTheme: presentationData.theme, fontSize: presentationData.listsFontSize)) var items: [ActionSheetItem] = [] - let context = controller.context items.append(ActionSheetTextItem(title: presentationData.strings.Chat_ClearReactionsAlertText, parseMarkdown: true)) items.append(ActionSheetButtonItem(title: presentationData.strings.Chat_ClearReactionsAlertAction, color: .destructive, action: { [weak actionSheet] in actionSheet?.dismissAnimated() @@ -574,7 +587,7 @@ final class AvatarEditorScreenComponent: Component { } let context = controller.context if groupId == AnyHashable("recent") { - let presentationData = context.sharedContext.currentPresentationData.with { $0 }.withUpdated(theme: defaultDarkColorPresentationTheme) + let presentationData = context.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(theme: ActionSheetControllerTheme(presentationTheme: presentationData.theme, fontSize: presentationData.listsFontSize)) var items: [ActionSheetItem] = [] items.append(ActionSheetButtonItem(title: presentationData.strings.Stickers_ClearRecent, color: .destructive, action: { [weak actionSheet] in diff --git a/submodules/TelegramUI/Components/AvatarEditorScreen/Sources/AvatarPreviewComponent.swift b/submodules/TelegramUI/Components/AvatarEditorScreen/Sources/AvatarPreviewComponent.swift index fe0de627c7..d02043b8dd 100644 --- a/submodules/TelegramUI/Components/AvatarEditorScreen/Sources/AvatarPreviewComponent.swift +++ b/submodules/TelegramUI/Components/AvatarEditorScreen/Sources/AvatarPreviewComponent.swift @@ -59,6 +59,7 @@ final class AvatarPreviewComponent: Component { private weak var state: EmptyComponentState? private let stickerFetchedDisposable = MetaDisposable() + private let cachedDisposable = MetaDisposable() override init(frame: CGRect) { self.imageView = UIImageView() @@ -84,6 +85,7 @@ final class AvatarPreviewComponent: Component { deinit { self.stickerFetchedDisposable.dispose() + self.cachedDisposable.dispose() } @objc func tapped() { @@ -202,6 +204,9 @@ final class AvatarPreviewComponent: Component { let source = AnimatedStickerResourceSource(account: component.context.account, resource: file.resource, isVideo: file.isVideoSticker || file.mimeType == "video/webm") self.animationNode?.setup(source: source, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), playbackMode: .count(2), mode: .direct(cachePathPrefix: nil)) self.animationNode?.visibility = true + + self.cachedDisposable.set((source.cachedDataPath(width: 384, height: 384) + |> deliverOn(Queue.concurrentDefaultQueue())).start()) } } diff --git a/submodules/TelegramUI/Images.xcassets/Components/LaunchLogo.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Components/LaunchLogo.imageset/Contents.json new file mode 100644 index 0000000000..7ef092231a --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Components/LaunchLogo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "LaunchLogo@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "LaunchLogo@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Components/LaunchLogo.imageset/LaunchLogo@2x.png b/submodules/TelegramUI/Images.xcassets/Components/LaunchLogo.imageset/LaunchLogo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..674b7bd6fd6a30f966921510a2f821c6b4085ca5 GIT binary patch literal 7927 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 GQU3?_4FBu^ literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Components/LaunchLogo.imageset/LaunchLogo@3x.png b/submodules/TelegramUI/Images.xcassets/Components/LaunchLogo.imageset/LaunchLogo@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dbca014ba4e9a93e61c2aa3a8c638785ebf4bed4 GIT binary patch literal 12725 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 N%Dt1Vkum-J{{gExrX2tP literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Sources/AppDelegate.swift b/submodules/TelegramUI/Sources/AppDelegate.swift index c868643634..700bac95a4 100644 --- a/submodules/TelegramUI/Sources/AppDelegate.swift +++ b/submodules/TelegramUI/Sources/AppDelegate.swift @@ -316,8 +316,8 @@ private func extractAccountManagerState(records: AccountRecordsView