From 252530cd3e05b346800b5e1cf11783bb5330479c Mon Sep 17 00:00:00 2001 From: Peter Iakovlev Date: Thu, 8 Feb 2018 14:25:39 +0400 Subject: [PATCH] no message --- .../Contents.json | 12 + .../ic_bot1.pdf | Bin 0 -> 4007 bytes .../Contents.json | 12 + .../Rectangle2.pdf | Bin 0 -> 4495 bytes .../Contents.json | 12 + .../Rectangle1.pdf | Bin 0 -> 4626 bytes TelegramUI.xcodeproj/project.pbxproj | 1366 +---------------- TelegramUI/AudioWaveform.swift | 7 +- TelegramUI/AvatarNode.swift | 2 +- TelegramUI/ChatController.swift | 215 ++- TelegramUI/ChatControllerNode.swift | 53 +- TelegramUI/ChatInterfaceInputContexts.swift | 8 + TelegramUI/ChatInterfaceState.swift | 41 +- .../ChatInterfaceStateInputPanels.swift | 4 + TelegramUI/ChatInterfaceTitlePanelNodes.swift | 3 + TelegramUI/ChatMessageActionItemNode.swift | 2 + TelegramUI/ChatMessageBubbleItemNode.swift | 17 +- TelegramUI/ChatMessageDateHeader.swift | 15 +- .../ChatMessageInteractiveFileNode.swift | 3 + .../ChatMessageInteractiveMediaNode.swift | 19 +- TelegramUI/ChatMessageItemView.swift | 5 + .../ChatPanelInterfaceInteraction.swift | 4 +- .../ChatPresentationInterfaceState.swift | 12 + TelegramUI/ChatRecentActionsController.swift | 1 + .../ChatRecentActionsControllerNode.swift | 5 +- TelegramUI/ChatRecentActionsEmptyNode.swift | 2 +- TelegramUI/ChatRestrictedNode.swift | 1 + TelegramUI/ChatTextInputAccessoryItem.swift | 14 + .../ChatTextInputMediaRecordingButton.swift | 17 + TelegramUI/ChatTextInputPanelNode.swift | 40 +- .../ChatVideoGalleryItemScrubberView.swift | 4 + TelegramUI/DeclareEncodables.swift | 1 + TelegramUI/DeviceLocationManager.swift | 11 + .../ExternalMusicAlbumArtResources.swift | 14 +- .../FFMpegMediaFrameSourceContext.swift | 24 +- TelegramUI/FetchManager.swift | 12 +- .../FetchPhotoLibraryImageResource.swift | 2 +- TelegramUI/FetchResource.swift | 2 +- TelegramUI/FetchVideoMediaResource.swift | 31 +- TelegramUI/ICloudResources.swift | 222 +++ TelegramUI/LegacyImagePicker.swift | 49 + TelegramUI/LegacyMediaPickers.swift | 6 + TelegramUI/LegacyWallpaperEditor.swift | 48 + TelegramUI/LegqacyICloudFileController.swift | 68 + TelegramUI/MapResources.swift | 2 +- TelegramUI/MediaPlayerScrubbingNode.swift | 122 +- TelegramUI/MediaResources.swift | 2 +- TelegramUI/NativeVideoContent.swift | 13 + TelegramUI/OngoingCallContext.swift | 4 +- TelegramUI/OngoingCallThreadLocalContext.h | 6 +- TelegramUI/OngoingCallThreadLocalContext.mm | 34 +- TelegramUI/OpenChatMessage.swift | 4 +- TelegramUI/OverlayPlayerController.swift | 2 +- TelegramUI/OverlayPlayerControllerNode.swift | 2 +- TelegramUI/OverlayPlayerControlsNode.swift | 17 +- .../PeerMediaCollectionController.swift | 6 +- TelegramUI/PresentationCall.swift | 6 +- TelegramUI/PresentationResourceKey.swift | 3 + TelegramUI/PresentationResourcesChat.swift | 18 + TelegramUI/PresentationThemeSettings.swift | 9 + TelegramUI/PrivacyAndSecurityController.swift | 2 +- TelegramUI/ProcessedPeerRestrictionText.swift | 9 + TelegramUI/RecentSessionsController.swift | 2 +- TelegramUI/StickerPackPreviewController.swift | 7 +- .../StickerPackPreviewControllerNode.swift | 9 +- TelegramUI/StorageUsageController.swift | 191 ++- TelegramUI/SystemVideoContent.swift | 7 + .../TelegramAccountAuxiliaryMethods.swift | 4 +- TelegramUI/TelegramController.swift | 4 +- TelegramUI/TelegramUIPrivate/module.modulemap | 1 + TelegramUI/ThemeGridController.swift | 32 + TelegramUI/ThemeGridControllerNode.swift | 66 +- TelegramUI/ThemeSettingsChatPreviewItem.swift | 4 +- TelegramUI/UniversalVideoCalleryItem.swift | 2 + TelegramUI/UniversalVideoContentManager.swift | 60 +- TelegramUI/UniversalVideoNode.swift | 7 + TelegramUI/WebEmbedVideoContent.swift | 7 + 77 files changed, 1575 insertions(+), 1475 deletions(-) create mode 100644 Images.xcassets/Chat/Input/Text/AccessoryIconCommands.imageset/Contents.json create mode 100644 Images.xcassets/Chat/Input/Text/AccessoryIconCommands.imageset/ic_bot1.pdf create mode 100644 Images.xcassets/Chat/Input/Text/AccessoryIconSilentPostOff.imageset/Contents.json create mode 100644 Images.xcassets/Chat/Input/Text/AccessoryIconSilentPostOff.imageset/Rectangle2.pdf create mode 100644 Images.xcassets/Chat/Input/Text/AccessoryIconSilentPostOn.imageset/Contents.json create mode 100644 Images.xcassets/Chat/Input/Text/AccessoryIconSilentPostOn.imageset/Rectangle1.pdf create mode 100644 TelegramUI/ChatRestrictedNode.swift create mode 100644 TelegramUI/ICloudResources.swift create mode 100644 TelegramUI/LegacyImagePicker.swift create mode 100644 TelegramUI/LegacyWallpaperEditor.swift create mode 100644 TelegramUI/LegqacyICloudFileController.swift create mode 100644 TelegramUI/ProcessedPeerRestrictionText.swift diff --git a/Images.xcassets/Chat/Input/Text/AccessoryIconCommands.imageset/Contents.json b/Images.xcassets/Chat/Input/Text/AccessoryIconCommands.imageset/Contents.json new file mode 100644 index 0000000000..341da1ee5e --- /dev/null +++ b/Images.xcassets/Chat/Input/Text/AccessoryIconCommands.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_bot1.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Images.xcassets/Chat/Input/Text/AccessoryIconCommands.imageset/ic_bot1.pdf b/Images.xcassets/Chat/Input/Text/AccessoryIconCommands.imageset/ic_bot1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..35279034fb123b2cfcbae57d2ac4d6ca21ad3b19 GIT binary patch literal 4007 zcmai%c{r4P7soAA7_yWlQtre^S!OXbm30 z=*!I)t?ghX019|HxPnif1Qd;ko=#+E0LhTf0E&7p?qni~@pQ+Li8@5Q7l8<DrFLE4V>y07G1Ln%N>m{?I7IrIa zLF@PUEW=<#4;3@V=tYFtGdZgNTHI8!I(L`r-8MzPG3S$Dq9@_!XERpJY%x>Be8LgR z%$M8C-x7H?(3=P-n&6zae@R47GJyDz)H6gMFJBU#=mRMK5VXBK$&B|t0J9K`te+wh zTyR=m0e}^hA;6ip4VaPkpHY~*ewE9F=e(22j-Ya`z&cdE@XzfLTv% z9~hvr?N&{VS-PJ-j{WB2XUS39R*I(?$5hm0mfe$4b3jpt=;wkbo1FHh(TflOmDVJ2+Rkq|$f9eRQSvgZhApRl51B=Nd}+?OI8 z2Dv`-o3uBX>gdvk6WqAw%aC72vNt=hqeD|QgF{a9l)*X{lW!5AX0ioqm{OjF;HQ}; z>)m_0T36Wi^0V?x)%pYYwoZ=`E+m{s=Il zEmiYehKht$cwNzDmBxBxIj78(iOd1l z-c_Uuvn)$lUfW;QkYUbJ?XgpXK6cl59$@*rgQa@p`j-RI?zX9|?|Edn<7a2xeOPnd z6pnsS*~pFXde#_?TFL7Av~li4p@@3;A&d}$s7o&_Dm2u2{+x$5lSbHF;olm6f^zw@ zvqkQD?h}#4s1N3*AJVxZW1Z`xPKH|~D-ghuq5Wf_dzEE4L_>1i1f6~DSSV2_lUfYN zQ!iB(?L+KRp6Wqtlo>0282D+!W9PDz3ZEo+(D$iz32y5+&oLuSNwdjio+JWEI$ut- zU^LRbiEVc>2l*ygDO>@{CTG7(JPhH@J_4{rhUxROUtw3!XLHd2-Pcrm#RArZy<+vd zR#b?(eW5;!kEK3+<=1twErsp z>Nz8kNo7ZVMEF|7ZHNAQg%&b*)&01X1+FE^x1O_4vbUyx8sTEdvWiO z+P&6rPh>f$hHo&TK5V9C*BE3m;PH_W!TAWjCZ7d|iw7IPq2i$jMw2Ak8)cHYEJ1D& zdL&}o#xBaJ|fK<(RS zcHQypvnaV*mt$#6)u9+r6wzsj%rBYaon>jIDQ+1vnZeS=>4Ta6nRW`fGIj?;4ZatC zt7S87(r7XZFQ`11r#DvJtQv*U&Cbto_`@OFA=cs2dt{rb^yAd<)SBJK#TwI z^mam8LVZHg7p2KZv~k)SkzMot1Ni``-2QT?%U zz2$Xlwwn!}(h==Cj<4!29G-koRxCg2*EmNxk!@2sEL?xOp0>=pEV%*MfN`kC1jJBz zS6-3*4%bIg`UPe_jMa88CX92)1k2p(#T1R^V7q0zcXbzV^N1{n^vUlf^;{UM6(^-A z5EK&Z0=)D3%->{;Th6RMKQ)**<=5)bI{Zp?XtQ?XD4!u;3Oc?cy(n!;jK*#IM`p$O zl=BresVffiuJc7|$JJuh64mxJ_%)PL6jyPZY@2@T!(Rp$rq%~Hj6ughcey@*Z-Mkc z=Qz~3;at0S_<~xRSexo2BotrTNm=&^vuSNA&0G+&`YpP018!wCH4sg zOZkzCS6&Vq#*ELt2akVJKv-X?nte@rKrim1l_%RZVJ{pxuuo$DDF0UMp5|h@QTdYH zBY!$*Fs(jjBXz3%=v3mO%_{L*3Me!3eq@hMW~)ss9#f7H!i=*SYd(1Ad*AMJ_(XAf za(aO*qPVB{PnXE*)#_d?X@Y zvZ#S_>o<>1``a|tjeTvHN%8`$j$EM*2)|npQU0J6Fw5wrf4oG99DJ zcU$qgx48?s&kZ|PmASsjl(g;n>d^H*?!B?}+tis+Eam*#@bl%!IqL1@+Z+Dx{5bvJ z4o}y8vB+}3+77)ae`ixhfBrfDb4~sE*@kmCs|)sgE=h!>YWSV|RD%jvbbryuTOY&4 zlCmeMAA@V=a$a}58EhQ&2<>G}WN+h8J0K|jIP~d?iCdYbM;q?#*xeS|O#a8ZMyF7_ zP@Osb#S|Jk3VpkyImx&GMBkvw9hG$D=ET(Yd*c^6yf)u`)ehcMI&Fd|c(e*Sb`Z7r zzGGEl{szy}Ttj~g~n%GA2ehT_O_9ff{* zD`y{j{Lb}H3Jt+qwr^FZDI=Rb9L0RL>d%9YZ8~q_XUFqpz{W>zl&F_&_OA{)7E_mI zZw}his{U|FimugG+{#$1FmBmFE2bUQtJeF7E<@82))Iz;?k%+~bR}f=jz=}het)=< z(Nmfm;=e(4a_DSbaO;`LQa2d6(|}qZSoWAAe3>0r3mkATCe=+f26R0g8q$1Rn-G!+&`D4Ul0>^!~d?Z5$cr?&b6Y z>V1CF{9i~7gZTr z91evYgTkT8FenlQSGI&gWf=EgmcN~cLHz_@JYz81j>(u9v>Edl*~QCKhl%XlKAB^L z7vcB+f1NadM05m00T==d{qF@RBasLs;0XNG5J(tfz+qm1=PwP)5dWzm;Kvvx`-dGA z&iJf$n8=oD5oBoc;)ArS;Tj&Mu~L4Xn9 tN{)CG3P*sW5J*QH3a$qJ|0axKjZqRGGNU!N3xYtRpkQffU1L4)e*mu%#_<3E literal 0 HcmV?d00001 diff --git a/Images.xcassets/Chat/Input/Text/AccessoryIconSilentPostOff.imageset/Contents.json b/Images.xcassets/Chat/Input/Text/AccessoryIconSilentPostOff.imageset/Contents.json new file mode 100644 index 0000000000..4bcce3593c --- /dev/null +++ b/Images.xcassets/Chat/Input/Text/AccessoryIconSilentPostOff.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Rectangle2.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Images.xcassets/Chat/Input/Text/AccessoryIconSilentPostOff.imageset/Rectangle2.pdf b/Images.xcassets/Chat/Input/Text/AccessoryIconSilentPostOff.imageset/Rectangle2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..df9fa925b596b3671ce4ca7dcc2dbb9f816e5c3c GIT binary patch literal 4495 zcmai&2{e@7|Hmy;n1o7Xsh(uXHfGFNrm}BM6tZM6m>FZ=VyqFeg^@i=A(S;sk$o%? zNf|=4pot+{vZRpwN6Y`)cRAA8?;M1o889joVJ<$P>qe~Y68Er=wBEge>cfk?~ngqPNEdfwg273`b z30POKAEUQ1$_=B#{D&TT$NU-=%T_iXIFiA^Drk;x(%*$Dymd0lShgQatPU zAhgPjdC%C7v^Rhl#}n8d5uMP@eMaq z{WX^5h7q;al~9a(n4HDrakm8SQxB!;c)LUmXW38{H4zu?BXwJogv{5OfES2s;r=UZ zhM!cPJDuAP_Ny$@tQwLCE2^EFeg3u+b}cc%Qty-_;-r5jg4$HiER=N`B5=U`|Od=H8^|I-TY+2>+8U^OEH(@ ztQ-XM1$W;Nw}Em6$-2uPQPtyD8;EhTt|1RZzCn`9liYDs;UbVr}L%AoG~boO*lQXb6o-hE*b z(&bQ7wsB^K;X=V=U^}`JxD}Z74mNauOx!LytgC%4@rDu9Hb%o}=*rn^mi_#FQ{~Kpd)~Y&!B(k3%w-M=J%4y*JR)RX&<%xauXgI3iG>0WpWCB(sq# z(Tbc=%mJ<7@qP0zk&NwB9$G?{13T$)SU&ftO>$kU(@pO)dX(4F?UC7{-WdRSVk z(%groav{sR52Um9@~!6gZ6lw358PT9KDQkAIX0BX{L%NXopI+J;^D*%3+wO9Hrobm7P0eirz!h~VT}Df2!MR7O+Y?Xl z0_1-R8t!gH`g1Q}$8dCaog>&fV%6RK01GHxfFS`{Cfu}p(h(H7^ z=u>HG0~kO?!`;Q*)5rshCjdLX)$oD=3O~XsEALqJR}95JV*Ii;@<%V3^YmrPsO{L> zjqYtgMw8&R>m^7y3pgVrfY{^ z*)IkSH!v7{y9#*62jfBba z)I?^GV!LPu6G6ocl!WHZr zPIshzcw)D)RAsb|gGr{epQB#$)1$0bvtNhuhE%xU&|(xpyJk2fE|du_ETCUbIjpz5 z8b5NyXiMoyz^2KP=sYD`jg*ZZcbUH@L*`*v6E?qjxT-nTgrVAXw5Zd%EMwfLdTK&OQ)}$;ww@w+QhfR2;Vx}V`x97*x50=|2$V_6X0Kof+=F=xUFPy=mVX2QeE#8EjlC-R+6h>ptO3N z$lt(<3EQ~M(gz@RZ!rdi?@MPI!0sJks0n#hc}kE~=TXl)O}~S;Sa@6CP|w!!D09?4 z;-w0FVvvfkew56r`h=CaU)zjTU`bOw!AzKO-!bPzp*u{)TA2wPcLeI=&Lm!%WZoT> zi%mbo)5$jxg(gvPrr4Lbv(TY*e7dO~@07e97d&+R>RsH>{Q@(wdn!I`^80SaNq3mq z#M@X@rrl>A!Oou&)EF|?zLzSx$q}i+df|SNl3MszXlq_q+_T;yy*~*6KfVvH* z&+W5Hv&sCK{LTD){3iTqh)y}aOt;MLOj_nNqO01$e9uFWIn8|fp%pYWK z7M&K0;HRy9z-yaWwVQ24xiPsd*lcV*6@R=Wv9wvXk>8A*rtI}O<{MQau7w7$~AW7RlY@|?`glhjch;tBrxCq=DOq_rC77rES^yw zYpDe(Bk4J*qiAvTE;HBa*~*Rf*BzP87<^Dyq|*exs<&Wt>S0;2^teyULeQy9Oywv~ zo74&Oxs7M%hU2DvI$S$ON0eS|)on_0 z>T)LP#CD|=CQtKI_E=p@tGJkWv7$EV3vSVAu~7M>aw*9-jLG5jfZH-rt%Dk`^wjAVPQvasm6LFeN zjvaGw!|M=43UN<#-oMVo?~0!Hfe4g z9dvPh^x0bY0{QOR-A&(jKCHfPM`s#V%rbCjt5<#H?=WSwXUloZwT&0&n@zD6muxs4 z<89-sWs4q=&sI3;3>D7anGNNS&zvI9UanopdfoMAxMkcmcz`jE`7w*~5pKbz;3r=U zoXgZ)A7kHA@3m9r@@5-a?1Qa?H5bk-B~o-EbnbRNiuWEmH8`wLq>v*2C@!h<{=}s& z_pNuIH7*}0oiTvt*M9{m9z!m@@A`UlF`NDLEB~0Fk{PkBoVA)h^BD8omv3K2*W8hJ zysUS5d?sWd>u~R3X_cGXfvcpojLfR1_PUhB-h;PpB6EDNEUR}$EX79iMxDG!RBouA ze34aNSw7YinpR=8RPR~*hP?UBB(2oG9EmvMd89G>hV}dv$C-zVuH+ey zs;wInW!IZ`1x;^YHf6@v8iHuox3dJ8V|QS7l8u~hHS4>`=zddY2sk&w#A6cg%vz@wLq2IoXQcRK5uGXH_Dbt~l z)=8rQ_g5c(>LH~KOhmMZf3NwH+FzP;#dnizkL&LElSts2REOa?N$x_QT|W zuj67tVa!-*v&vfNR_-Q#wJULEUjM6pYEGPrZy?*ZWj|3@yQ%Rn;VYZ}rs^FE{ejZ* zFxlU*y2GzK8Xa;`8XD?YFM=(w1F#nW% zH`bFF0MH5j2kQF~#ec6G_Pb;_p?Ojk3R8s2LgisFxSSl!910bqfBx$E$9m}0Z|jYx z7vMkUq*n|Y^tzkq=PD=U4tti{xuc` zh5pC9|DFS`C`V6=f5byV|3j1iV_u>s*3pIF`Qt5zkz)XT|L6tK1$TFPe(dA`eIrqB zcJB0K`PtT_r^{))E!GZ?P(&)oDG(4iI24Y<+9@Dx<>64g0)4Rx%HaRqq9;QlvTJNl^oSiwdXLk0Unf1*PFi=$&gNnnz0`25A@?z1~ zhi}?nf#CoIz@ePMmoEbnx>z>{4@W?XBDxAls5`lMVDXf@3(^CtibdlvSU_GL?Cycb zB3;2g)Sk&oZWtLR)y)HT3%Y8)gk0fD_n`6_su<9T7YvZqy}-*|`&mcr-x8}E(# zC3^Edb=(%#$H^YsZ=^hbII$w0+1F2=MvXdB<_1|fqmWrtqNzt|>^aw;V zMbHjW&0NmEZB(8bwJ?gEf2VdQ8iSJMYOQFZw3pjju!!K%;7b<64z*{OMUJ~iaE(e+Ta?i}t4?nTzz!Q1 zGW(sF;|xkanH-FP_!9V7ATDu)Ug9+1gFGhwcfe36y-#vszTY@S=%eT%cO>8arIJ_ zTR!AsV@#Zqn0~=Zs;c9|n{iYqN%{cT=N9X=ePzJ*F)(~$L$Mfd^6(RbnoZ1{Ut^KO zwa3lh*D4owA}-WBHR-nEX<|0dF6ps}3BMPMd}+hg`1sz0=$5FfPglX^k#R1lxefp1 zbBFDquL%P;6@#O`aDAC}p6328tM2SI8)sT3XQ0)J%NMUyN&q8f-%XNx$Dlf0^`jjZ zMLJ6*gl~+eeh8z{du`>}h*x+Y(iZa(->aSFexulyo9 zO8%C!#>T9H%fT{Bvi3pPH5~^4dwq`crx#M z8yk&qgp-Ie#5c$J0D*OGUk2dqCC!r{!w9Va1Ddc9K`+%K>g;UiO)kKOuQeVf?_d3kSM`oW5k2tIlh8w61z6XI?JDel3`FujvR*Ea=xkdDwmC-8Ii`ijZ(V!fwRDn+pdAI4XL}RUVD)OdqfB)74T`CBBnr+XlV2(?K zq#8Td=ZG~LD*B{$#B)4z)HcE~i^`|aVLB2Np@k}B8%}j1&vn}GtkxK9qo5*5ZC57l z`sk9@YnkprI0LG1_tmHc%w5wQ;AlJda008A@C2alQ66rxv;2EN42Mii8+OY+1q42n0kS5 z`tx<0=!5JRoU5U8CWdoK3?UJYjiHwV&Emu{;1K`83I9{lLUderGOx2cdfHMELJ%cZ??hc7t{dpb81lWTm}NE3Qf7qzHPfB>#>ItOR{W z?G@~NgK8kq_YFudNczT6E6}wU$8In(1!yRO!&-D8)MJ58^g&-(Pv$C>#&P7cq$v-v zp0=RBrJ`gY%TD`JB_fVBL2>(yVDYI7!KFDW26F3vcyKq+TLaX+ox_u ze|l9_InIoqn(f^6c)om^61DU==KRz3F`Dr=r)iId=O9y0alGQ13OA3QK$#+kP}-2e zRCKDTF6WH2Ju575JE#CP_^8lKs9eE|L7FWiMy%b`F4oSnI^_}VJLJ+O9_Ef0T$4OE z?$n*Kl5~@*1U+LJj&2NCY&$j~xa#x#!WjEX5KD{u7u4-@O<;c>|Fh$Eb)>1XNpLfBg2hJnTU9(-Y}x7w{x=O5jBr}SKlM^G=3T`P>A^D6)O zwAw&pEoVM!K{-Ldv$E%b@11Z{$ZMj|ZbYs%E?io~+`>&c5LeggVQ!ztb=w&K}Bw&(n{ z_Y1$*(HOQUwipHGRh#ChPt>-`g=(p#=O&}>qS8?jsNhMdmxcn*69N;S9oH{WoUeW> zP;ic0xxe7n+q&8-wHM!G-$Tx5$mH+#C(gfI=ba<2GhhX({=S|E5vRK zc9p9jIx)I2I`%7krk*rK`XF89WOMNReDd}Mw+pwE`I7CEsgq+%bxm-C?1P!5uBG|| z5NAPWr1OaL?x1*C45^6ZokhyDg&$0R4_~Nmi14l3asJk}Ah(dnozC6F&BblPodSO) z#g*=s{yLqUJ`3-tb+ll70}Q5s*?cOlOr@6sz-^wXP>tMXHpg4Ge3S_xV)udf)r8yGXTYarEIbXn9$Y*Ccg{Ji-QGuPUM z>YcXt?djL8(S(jL=P7heZ{g_7lZq0taj)iO!liWU>QRnHy++ao^9J9p;4YL-F5D-a z$h`T^!%Mg^gfPgqI5$z(yBa-3C*&ves9&pSJkz}QeDAT|JVqwYFPsBnr|^9@C+c|c z@!}ZqXj`8fIRhpilBX;dcY3Z2$IN=QyS9(MlN;Hq+ZAEaVTsp>>PRX|oaH7l+T2a4 zx)y(}>RG}jYQ=e_NdBUHgnW$ri6*b6GJ?bwa*t-uYiIQ9@R!-0;az=@EU27e4xA5C z2bt2zGfFZXKjH~$YoTsw4C0k|Ys+snz(J$@UBxT(GJ_P8^~oLgQ{tlVa>1orbtXP{ ze7r$oC^c1;_D0Rv&bOT!Q864k9Ny}$HD0O>YFttCQ%h0PNih>OubEblwulA_56S<0g@w&q9=Jt)L z_x5$aX-4yB2n3rm);K>NbI`zMcNzAu&8$zSPrG%WdHwbE?j0$6DQ{1QCa?Xl?=4cF zuQOMK4pmxxsMqthZfThK*0dPw3b<;HeCby2j=`QDcZ(bwFnnlO-DKxjvoiBaxn9|D zf+*H&$?Wpd<)q8|BAujkmTh4sn@nN`m+||FII)?Too%~sLp6C9Zn+De_lw4mTKTedlkrs0o8k!ya zZT(f3HCN+F8lf5m9j&pRgO>(|Wr}5zq+4SWUOk$+*@4^p^i9R@MA^InEU$hGBzq3A zI@z(syOPCpdE{0kp>$qoFMH$Z8;eMboS~0H5l{1_o&0qD#^(e2Gtcy%5mU%GxV;{| zk(OT5<)A}~?>+e-1Ci~0XHEH4=xS61XZXcy9`X&f({D2?t1HL415>JOR_pO4ABel( zO;XAnDiPL~2$=-pa@bzX(AmbU`?gDWoaUdbxDw}Y)a>1#s<_v5gfP2fy(=-c(Lf;I zJIFju8+CN&vv`x=fz3y`dBWIUA6*HHjY5yF?4IKudTA}-X-cBopMUi7=O$r-LI@#$|#VlrJ|yYbjMk`QSq6eb0ew17Z_D4)MIe_IcQ`Z1np$~%A`J}Di83Z?b;aKgE%9wPe> zn}=-#4)go(zgOym$J&D_jRg!0`Tq-$mXd-=0rtR885|0ubR&ls;Py)fLC8>c<)1Pb z0zx^8f65>bNy^{)4;ey=vOoWnK_N2#(u2v$P|or{^q}y6`<0dYmmUluO9`KU&V@r@ z|3!xQ&94U@>EwdN|9H`2b literal 0 HcmV?d00001 diff --git a/TelegramUI.xcodeproj/project.pbxproj b/TelegramUI.xcodeproj/project.pbxproj index 02dceae807..90e16dc7a4 100644 --- a/TelegramUI.xcodeproj/project.pbxproj +++ b/TelegramUI.xcodeproj/project.pbxproj @@ -7,6 +7,13 @@ objects = { /* Begin PBXBuildFile section */ + D007019C2029E8F2006B9E34 /* LegqacyICloudFileController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D007019B2029E8F2006B9E34 /* LegqacyICloudFileController.swift */; }; + D007019E2029EFDD006B9E34 /* ICloudResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = D007019D2029EFDD006B9E34 /* ICloudResources.swift */; }; + D00701A12029F6D0006B9E34 /* TGMimeTypeMap.h in Headers */ = {isa = PBXBuildFile; fileRef = D007019F2029F6D0006B9E34 /* TGMimeTypeMap.h */; }; + D00701A22029F6D0006B9E34 /* TGMimeTypeMap.m in Sources */ = {isa = PBXBuildFile; fileRef = D00701A02029F6D0006B9E34 /* TGMimeTypeMap.m */; }; + D00ACA4B20222C280045D427 /* libtgvoip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D00ACA4C20222C280045D427 /* libtgvoip.framework */; }; + D00ACA58202285090045D427 /* ChatRestrictedNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00ACA57202285090045D427 /* ChatRestrictedNode.swift */; }; + D00ACA5A2022897D0045D427 /* ProcessedPeerRestrictionText.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00ACA592022897D0045D427 /* ProcessedPeerRestrictionText.swift */; }; D00ADFD91EBA2E9D00873D2E /* OngoingCallThreadLocalContext.h in Headers */ = {isa = PBXBuildFile; fileRef = D0EC6FFA1EBA1DE900EBF1C3 /* OngoingCallThreadLocalContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; D00ADFDB1EBA2EAF00873D2E /* OngoingCallContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00ADFDA1EBA2EAF00873D2E /* OngoingCallContext.swift */; }; D00ADFDD1EBB73C200873D2E /* OverlayMediaManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00ADFDC1EBB73C200873D2E /* OverlayMediaManager.swift */; }; @@ -136,6 +143,8 @@ D079FCDF1F05C9280038FADE /* BotReceiptController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D079FCDE1F05C9280038FADE /* BotReceiptController.swift */; }; D079FCE11F05C9380038FADE /* BotReceiptControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D079FCE01F05C9380038FADE /* BotReceiptControllerNode.swift */; }; D079FCE91F06A76C0038FADE /* Notices.swift in Sources */ = {isa = PBXBuildFile; fileRef = D079FCE81F06A76C0038FADE /* Notices.swift */; }; + D07ABBA5202A14BC003671DE /* LegacyImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07ABBA4202A14BC003671DE /* LegacyImagePicker.swift */; }; + D07ABBAB202A1BD1003671DE /* LegacyWallpaperEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07ABBAA202A1BD1003671DE /* LegacyWallpaperEditor.swift */; }; D07BCBFE1F2B792300ED97AA /* LegacyComponents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D07BCBFD1F2B792300ED97AA /* LegacyComponents.framework */; }; D080B27F1F4C7C6000AA3847 /* InstantPageManagedMediaId.swift in Sources */ = {isa = PBXBuildFile; fileRef = D080B27E1F4C7C6000AA3847 /* InstantPageManagedMediaId.swift */; }; D087BFAD1F741B9D003FD209 /* ShareContentContainerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D087BFAC1F741B9D003FD209 /* ShareContentContainerNode.swift */; }; @@ -156,9 +165,6 @@ D0943B001FDAE852001522CC /* ChatFeedNavigationInputPanelNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0943AFF1FDAE852001522CC /* ChatFeedNavigationInputPanelNode.swift */; }; D0943B051FDDFDA0001522CC /* OverlayInstantVideoNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0943B041FDDFDA0001522CC /* OverlayInstantVideoNode.swift */; }; D0943B071FDEC529001522CC /* InstantVideoRadialStatusNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0943B061FDEC528001522CC /* InstantVideoRadialStatusNode.swift */; }; - D0943B081FDEEF27001522CC /* TGLogWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = D0EC6B821EB9F42D00EBF1C3 /* TGLogWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D0943B0B1FDEF56E001522CC /* DarwinSpecific.mm in Sources */ = {isa = PBXBuildFile; fileRef = D0943B091FDEF56D001522CC /* DarwinSpecific.mm */; }; - D0943B0C1FDEF56E001522CC /* DarwinSpecific.h in Headers */ = {isa = PBXBuildFile; fileRef = D0943B0A1FDEF56E001522CC /* DarwinSpecific.h */; }; D099D74D1EEFEE1500A3128C /* GameController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D099D74C1EEFEE1500A3128C /* GameController.swift */; }; D099D74F1EEFEE6A00A3128C /* GameControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D099D74E1EEFEE6A00A3128C /* GameControllerNode.swift */; }; D099D7511EEFF91E00A3128C /* GameControllerTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D099D7501EEFF91E00A3128C /* GameControllerTitleView.swift */; }; @@ -353,82 +359,6 @@ D0EB42011F30ED4F00838FE6 /* LegacyImageProcessors.m in Sources */ = {isa = PBXBuildFile; fileRef = D0EB41FF1F30ED4F00838FE6 /* LegacyImageProcessors.m */; }; D0EB42051F3143AB00838FE6 /* LegacyComponentsResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D0EB42041F3143AB00838FE6 /* LegacyComponentsResources.bundle */; }; D0EB5ADF1F798033004E89B6 /* PeerMediaCollectionEmptyNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EB5ADE1F798033004E89B6 /* PeerMediaCollectionEmptyNode.swift */; }; - D0EC6C541EB9F42E00EBF1C3 /* checks.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B9E1EB9F42D00EBF1C3 /* checks.cc */; }; - D0EC6C551EB9F42E00EBF1C3 /* stringutils.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BA51EB9F42D00EBF1C3 /* stringutils.cc */; }; - D0EC6C561EB9F42E00EBF1C3 /* audio_util.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BA91EB9F42D00EBF1C3 /* audio_util.cc */; }; - D0EC6C571EB9F42E00EBF1C3 /* channel_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BAA1EB9F42D00EBF1C3 /* channel_buffer.cc */; }; - D0EC6C581EB9F42E00EBF1C3 /* fft4g.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BAC1EB9F42D00EBF1C3 /* fft4g.c */; }; - D0EC6C591EB9F42E00EBF1C3 /* ring_buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BB01EB9F42D00EBF1C3 /* ring_buffer.c */; }; - D0EC6C5A1EB9F42E00EBF1C3 /* auto_corr_to_refl_coef.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BB31EB9F42D00EBF1C3 /* auto_corr_to_refl_coef.c */; }; - D0EC6C5B1EB9F42E00EBF1C3 /* auto_correlation.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BB41EB9F42D00EBF1C3 /* auto_correlation.c */; }; - D0EC6C5C1EB9F42E00EBF1C3 /* complex_bit_reverse.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BB51EB9F42D00EBF1C3 /* complex_bit_reverse.c */; }; - D0EC6C5D1EB9F42E00EBF1C3 /* complex_bit_reverse_arm.S in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BB61EB9F42D00EBF1C3 /* complex_bit_reverse_arm.S */; }; - D0EC6C5E1EB9F42E00EBF1C3 /* complex_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BB71EB9F42D00EBF1C3 /* complex_fft.c */; }; - D0EC6C5F1EB9F42E00EBF1C3 /* copy_set_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BB91EB9F42D00EBF1C3 /* copy_set_operations.c */; }; - D0EC6C601EB9F42E00EBF1C3 /* cross_correlation.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BBA1EB9F42D00EBF1C3 /* cross_correlation.c */; }; - D0EC6C611EB9F42E00EBF1C3 /* cross_correlation_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BBB1EB9F42D00EBF1C3 /* cross_correlation_neon.c */; }; - D0EC6C621EB9F42E00EBF1C3 /* division_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BBC1EB9F42D00EBF1C3 /* division_operations.c */; }; - D0EC6C631EB9F42E00EBF1C3 /* dot_product_with_scale.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BBD1EB9F42D00EBF1C3 /* dot_product_with_scale.c */; }; - D0EC6C641EB9F42E00EBF1C3 /* downsample_fast.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BBE1EB9F42D00EBF1C3 /* downsample_fast.c */; }; - D0EC6C651EB9F42E00EBF1C3 /* downsample_fast_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BBF1EB9F42D00EBF1C3 /* downsample_fast_neon.c */; }; - D0EC6C661EB9F42E00EBF1C3 /* energy.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BC01EB9F42D00EBF1C3 /* energy.c */; }; - D0EC6C671EB9F42E00EBF1C3 /* filter_ar.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BC11EB9F42D00EBF1C3 /* filter_ar.c */; }; - D0EC6C681EB9F42E00EBF1C3 /* filter_ar_fast_q12.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BC21EB9F42D00EBF1C3 /* filter_ar_fast_q12.c */; }; - D0EC6C691EB9F42E00EBF1C3 /* filter_ar_fast_q12_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BC31EB9F42D00EBF1C3 /* filter_ar_fast_q12_armv7.S */; }; - D0EC6C6A1EB9F42E00EBF1C3 /* filter_ma_fast_q12.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BC41EB9F42D00EBF1C3 /* filter_ma_fast_q12.c */; }; - D0EC6C6B1EB9F42E00EBF1C3 /* get_hanning_window.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BC51EB9F42D00EBF1C3 /* get_hanning_window.c */; }; - D0EC6C6C1EB9F42E00EBF1C3 /* get_scaling_square.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BC61EB9F42D00EBF1C3 /* get_scaling_square.c */; }; - D0EC6C6D1EB9F42E00EBF1C3 /* ilbc_specific_functions.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BC71EB9F42D00EBF1C3 /* ilbc_specific_functions.c */; }; - D0EC6C6E1EB9F42E00EBF1C3 /* levinson_durbin.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BCE1EB9F42D00EBF1C3 /* levinson_durbin.c */; }; - D0EC6C6F1EB9F42E00EBF1C3 /* lpc_to_refl_coef.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BCF1EB9F42D00EBF1C3 /* lpc_to_refl_coef.c */; }; - D0EC6C701EB9F42E00EBF1C3 /* min_max_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BD01EB9F42D00EBF1C3 /* min_max_operations.c */; }; - D0EC6C711EB9F42E00EBF1C3 /* min_max_operations_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BD11EB9F42D00EBF1C3 /* min_max_operations_neon.c */; }; - D0EC6C721EB9F42E00EBF1C3 /* randomization_functions.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BD21EB9F42D00EBF1C3 /* randomization_functions.c */; }; - D0EC6C731EB9F42E00EBF1C3 /* real_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BD31EB9F42D00EBF1C3 /* real_fft.c */; }; - D0EC6C741EB9F42E00EBF1C3 /* refl_coef_to_lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BD41EB9F42D00EBF1C3 /* refl_coef_to_lpc.c */; }; - D0EC6C751EB9F42E00EBF1C3 /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BD51EB9F42D00EBF1C3 /* resample.c */; }; - D0EC6C761EB9F42E00EBF1C3 /* resample_48khz.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BD61EB9F42D00EBF1C3 /* resample_48khz.c */; }; - D0EC6C771EB9F42E00EBF1C3 /* resample_by_2.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BD71EB9F42D00EBF1C3 /* resample_by_2.c */; }; - D0EC6C781EB9F42E00EBF1C3 /* resample_by_2_internal.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BD81EB9F42D00EBF1C3 /* resample_by_2_internal.c */; }; - D0EC6C791EB9F42E00EBF1C3 /* resample_fractional.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BDA1EB9F42D00EBF1C3 /* resample_fractional.c */; }; - D0EC6C7A1EB9F42E00EBF1C3 /* spl_init.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BDB1EB9F42D00EBF1C3 /* spl_init.c */; }; - D0EC6C7B1EB9F42E00EBF1C3 /* spl_inl.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BDC1EB9F42D00EBF1C3 /* spl_inl.c */; }; - D0EC6C7C1EB9F42E00EBF1C3 /* spl_sqrt.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BDD1EB9F42D00EBF1C3 /* spl_sqrt.c */; }; - D0EC6C7D1EB9F42E00EBF1C3 /* spl_sqrt_floor.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BDE1EB9F42D00EBF1C3 /* spl_sqrt_floor.c */; }; - D0EC6C7E1EB9F42E00EBF1C3 /* spl_sqrt_floor_arm.S in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BDF1EB9F42D00EBF1C3 /* spl_sqrt_floor_arm.S */; }; - D0EC6C7F1EB9F42E00EBF1C3 /* splitting_filter_impl.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BE01EB9F42D00EBF1C3 /* splitting_filter_impl.c */; }; - D0EC6C801EB9F42E00EBF1C3 /* sqrt_of_one_minus_x_squared.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BE11EB9F42D00EBF1C3 /* sqrt_of_one_minus_x_squared.c */; }; - D0EC6C811EB9F42E00EBF1C3 /* vector_scaling_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BE21EB9F42D00EBF1C3 /* vector_scaling_operations.c */; }; - D0EC6C821EB9F42E00EBF1C3 /* sparse_fir_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BE31EB9F42D00EBF1C3 /* sparse_fir_filter.cc */; }; - D0EC6C831EB9F42E00EBF1C3 /* wav_file.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BE51EB9F42D00EBF1C3 /* wav_file.cc */; }; - D0EC6C841EB9F42E00EBF1C3 /* wav_header.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BE71EB9F42D00EBF1C3 /* wav_header.cc */; }; - D0EC6C851EB9F42E00EBF1C3 /* aec_core.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BED1EB9F42D00EBF1C3 /* aec_core.cc */; }; - D0EC6C861EB9F42E00EBF1C3 /* aec_core_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BEF1EB9F42D00EBF1C3 /* aec_core_neon.cc */; }; - D0EC6C871EB9F42E00EBF1C3 /* aec_core_sse2.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BF11EB9F42D00EBF1C3 /* aec_core_sse2.cc */; }; - D0EC6C881EB9F42E00EBF1C3 /* aec_resampler.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BF21EB9F42D00EBF1C3 /* aec_resampler.cc */; }; - D0EC6C891EB9F42E00EBF1C3 /* echo_cancellation.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BF41EB9F42D00EBF1C3 /* echo_cancellation.cc */; }; - D0EC6C8A1EB9F42E00EBF1C3 /* aecm_core.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BF71EB9F42D00EBF1C3 /* aecm_core.cc */; }; - D0EC6C8B1EB9F42E00EBF1C3 /* aecm_core_c.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BF91EB9F42D00EBF1C3 /* aecm_core_c.cc */; }; - D0EC6C8C1EB9F42E00EBF1C3 /* aecm_core_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BFA1EB9F42D00EBF1C3 /* aecm_core_neon.cc */; }; - D0EC6C8D1EB9F42E00EBF1C3 /* echo_control_mobile.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6BFC1EB9F42D00EBF1C3 /* echo_control_mobile.cc */; }; - D0EC6C8E1EB9F42E00EBF1C3 /* analog_agc.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C001EB9F42D00EBF1C3 /* analog_agc.c */; }; - D0EC6C8F1EB9F42E00EBF1C3 /* digital_agc.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C021EB9F42D00EBF1C3 /* digital_agc.c */; }; - D0EC6C901EB9F42E00EBF1C3 /* apm_data_dumper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C061EB9F42D00EBF1C3 /* apm_data_dumper.cc */; }; - D0EC6C911EB9F42E00EBF1C3 /* noise_suppression.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C0A1EB9F42D00EBF1C3 /* noise_suppression.c */; }; - D0EC6C921EB9F42E00EBF1C3 /* noise_suppression_x.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C0C1EB9F42D00EBF1C3 /* noise_suppression_x.c */; }; - D0EC6C931EB9F42E00EBF1C3 /* ns_core.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C0E1EB9F42D00EBF1C3 /* ns_core.c */; }; - D0EC6C941EB9F42E00EBF1C3 /* nsx_core.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C101EB9F42D00EBF1C3 /* nsx_core.c */; }; - D0EC6C951EB9F42E00EBF1C3 /* nsx_core_c.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C121EB9F42D00EBF1C3 /* nsx_core_c.c */; }; - D0EC6C961EB9F42E00EBF1C3 /* nsx_core_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C131EB9F42D00EBF1C3 /* nsx_core_neon.c */; }; - D0EC6C971EB9F42E00EBF1C3 /* splitting_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C161EB9F42E00EBF1C3 /* splitting_filter.cc */; }; - D0EC6C981EB9F42E00EBF1C3 /* three_band_filter_bank.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C181EB9F42E00EBF1C3 /* three_band_filter_bank.cc */; }; - D0EC6C991EB9F42E00EBF1C3 /* block_mean_calculator.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C1B1EB9F42E00EBF1C3 /* block_mean_calculator.cc */; }; - D0EC6C9A1EB9F42E00EBF1C3 /* delay_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C1D1EB9F42E00EBF1C3 /* delay_estimator.cc */; }; - D0EC6C9B1EB9F42E00EBF1C3 /* delay_estimator_wrapper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C201EB9F42E00EBF1C3 /* delay_estimator_wrapper.cc */; }; - D0EC6C9C1EB9F42E00EBF1C3 /* ooura_fft.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C221EB9F42E00EBF1C3 /* ooura_fft.cc */; }; - D0EC6C9D1EB9F42E00EBF1C3 /* ooura_fft_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C241EB9F42E00EBF1C3 /* ooura_fft_neon.cc */; }; - D0EC6C9E1EB9F42E00EBF1C3 /* ooura_fft_sse2.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C251EB9F42E00EBF1C3 /* ooura_fft_sse2.cc */; }; - D0EC6C9F1EB9F42E00EBF1C3 /* cpu_features.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6C2F1EB9F42E00EBF1C3 /* cpu_features.cc */; }; D0EC6CAE1EB9F58800EBF1C3 /* animations.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2CC1E48797500650E93 /* animations.c */; }; D0EC6CAF1EB9F58800EBF1C3 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2CE1E48797500650E93 /* buffer.c */; }; D0EC6CB01EB9F58800EBF1C3 /* objects.c in Sources */ = {isa = PBXBuildFile; fileRef = D04BB2D41E48797500650E93 /* objects.c */; }; @@ -901,104 +831,7 @@ D0EC6EA41EB9FB8000EBF1C3 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AB0BB21D6718EB002C78E7 /* libz.tbd */; }; D0EC6EA51EB9FBD300EBF1C3 /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AB0BB01D6718DA002C78E7 /* libiconv.tbd */; }; D0EC6EA61EB9FC2400EBF1C3 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D07551901DDA4FC70073E051 /* libc++.tbd */; }; - D0EC6EA71EBA0FB000EBF1C3 /* BlockingQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B501EB9F42D00EBF1C3 /* BlockingQueue.cpp */; }; - D0EC6EA81EBA0FB300EBF1C3 /* BufferInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B521EB9F42D00EBF1C3 /* BufferInputStream.cpp */; }; - D0EC6EA91EBA0FBB00EBF1C3 /* BufferOutputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B541EB9F42D00EBF1C3 /* BufferOutputStream.cpp */; }; - D0EC6EAA1EBA0FBB00EBF1C3 /* BufferPool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B561EB9F42D00EBF1C3 /* BufferPool.cpp */; }; - D0EC6EAB1EBA0FBB00EBF1C3 /* CongestionControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B5B1EB9F42D00EBF1C3 /* CongestionControl.cpp */; }; - D0EC6EAC1EBA0FBB00EBF1C3 /* EchoCanceller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B5D1EB9F42D00EBF1C3 /* EchoCanceller.cpp */; }; - D0EC6EAD1EBA0FBB00EBF1C3 /* JitterBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B5F1EB9F42D00EBF1C3 /* JitterBuffer.cpp */; }; - D0EC6EAE1EBA0FBB00EBF1C3 /* logging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B611EB9F42D00EBF1C3 /* logging.cpp */; }; - D0EC6EAF1EBA0FBB00EBF1C3 /* MediaStreamItf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B631EB9F42D00EBF1C3 /* MediaStreamItf.cpp */; }; - D0EC6EB01EBA0FBB00EBF1C3 /* NetworkSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B651EB9F42D00EBF1C3 /* NetworkSocket.cpp */; }; - D0EC6EB11EBA0FBB00EBF1C3 /* OpusDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B671EB9F42D00EBF1C3 /* OpusDecoder.cpp */; }; - D0EC6EB21EBA0FBB00EBF1C3 /* OpusEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B691EB9F42D00EBF1C3 /* OpusEncoder.cpp */; }; - D0EC6EB31EBA0FC100EBF1C3 /* AudioInput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B4A1EB9F42D00EBF1C3 /* AudioInput.cpp */; }; - D0EC6EB41EBA0FC100EBF1C3 /* AudioOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B4C1EB9F42D00EBF1C3 /* AudioOutput.cpp */; }; - D0EC6EB51EBA0FC100EBF1C3 /* Resampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B4E1EB9F42D00EBF1C3 /* Resampler.cpp */; }; - D0EC6EB61EBA0FD000EBF1C3 /* AudioInputAudioUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B781EB9F42D00EBF1C3 /* AudioInputAudioUnit.cpp */; }; - D0EC6EB81EBA0FD000EBF1C3 /* AudioOutputAudioUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B7C1EB9F42D00EBF1C3 /* AudioOutputAudioUnit.cpp */; }; - D0EC6EBA1EBA0FD000EBF1C3 /* AudioUnitIO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B801EB9F42D00EBF1C3 /* AudioUnitIO.cpp */; }; D0EC6EBD1EBA100F00EBF1C3 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0EC6EBC1EBA100F00EBF1C3 /* CoreAudio.framework */; }; - D0EC6FA31EBA10E400EBF1C3 /* checks.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EC41EBA10BB00EBF1C3 /* checks.cc */; }; - D0EC6FA41EBA10EA00EBF1C3 /* stringutils.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6ECB1EBA10BB00EBF1C3 /* stringutils.cc */; }; - D0EC6FA51EBA111500EBF1C3 /* audio_util.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6ECF1EBA10BB00EBF1C3 /* audio_util.cc */; }; - D0EC6FA61EBA111500EBF1C3 /* channel_buffer.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6ED01EBA10BB00EBF1C3 /* channel_buffer.cc */; }; - D0EC6FA71EBA111500EBF1C3 /* ring_buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6ED61EBA10BB00EBF1C3 /* ring_buffer.c */; }; - D0EC6FA81EBA111500EBF1C3 /* sparse_fir_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F091EBA10BB00EBF1C3 /* sparse_fir_filter.cc */; }; - D0EC6FA91EBA111500EBF1C3 /* wav_file.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F0B1EBA10BB00EBF1C3 /* wav_file.cc */; }; - D0EC6FAA1EBA111500EBF1C3 /* wav_header.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F0D1EBA10BB00EBF1C3 /* wav_header.cc */; }; - D0EC6FAB1EBA112600EBF1C3 /* splitting_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F3C1EBA10BB00EBF1C3 /* splitting_filter.cc */; }; - D0EC6FAC1EBA112600EBF1C3 /* three_band_filter_bank.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F3E1EBA10BB00EBF1C3 /* three_band_filter_bank.cc */; }; - D0EC6FAD1EBA112600EBF1C3 /* block_mean_calculator.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F411EBA10BB00EBF1C3 /* block_mean_calculator.cc */; }; - D0EC6FAE1EBA112600EBF1C3 /* delay_estimator.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F431EBA10BB00EBF1C3 /* delay_estimator.cc */; }; - D0EC6FAF1EBA112600EBF1C3 /* delay_estimator_wrapper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F461EBA10BB00EBF1C3 /* delay_estimator_wrapper.cc */; }; - D0EC6FB01EBA112600EBF1C3 /* ooura_fft.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F481EBA10BB00EBF1C3 /* ooura_fft.cc */; }; - D0EC6FB11EBA112600EBF1C3 /* ooura_fft_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F4A1EBA10BB00EBF1C3 /* ooura_fft_neon.cc */; }; - D0EC6FB21EBA114200EBF1C3 /* aec_core.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F131EBA10BB00EBF1C3 /* aec_core.cc */; }; - D0EC6FB31EBA114200EBF1C3 /* aec_core_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F151EBA10BB00EBF1C3 /* aec_core_neon.cc */; }; - D0EC6FB41EBA114200EBF1C3 /* aec_resampler.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F181EBA10BB00EBF1C3 /* aec_resampler.cc */; }; - D0EC6FB51EBA114200EBF1C3 /* echo_cancellation.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F1A1EBA10BB00EBF1C3 /* echo_cancellation.cc */; }; - D0EC6FB61EBA114200EBF1C3 /* aecm_core.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F1D1EBA10BB00EBF1C3 /* aecm_core.cc */; }; - D0EC6FB71EBA114200EBF1C3 /* aecm_core_c.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F1F1EBA10BB00EBF1C3 /* aecm_core_c.cc */; }; - D0EC6FB81EBA114200EBF1C3 /* aecm_core_neon.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F201EBA10BB00EBF1C3 /* aecm_core_neon.cc */; }; - D0EC6FB91EBA114200EBF1C3 /* echo_control_mobile.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F221EBA10BB00EBF1C3 /* echo_control_mobile.cc */; }; - D0EC6FBA1EBA114200EBF1C3 /* analog_agc.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F261EBA10BB00EBF1C3 /* analog_agc.c */; }; - D0EC6FBB1EBA114200EBF1C3 /* digital_agc.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F281EBA10BB00EBF1C3 /* digital_agc.c */; }; - D0EC6FBC1EBA132B00EBF1C3 /* noise_suppression.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F301EBA10BB00EBF1C3 /* noise_suppression.c */; }; - D0EC6FBD1EBA132B00EBF1C3 /* noise_suppression_x.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F321EBA10BB00EBF1C3 /* noise_suppression_x.c */; }; - D0EC6FBE1EBA132B00EBF1C3 /* ns_core.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F341EBA10BB00EBF1C3 /* ns_core.c */; }; - D0EC6FBF1EBA132B00EBF1C3 /* nsx_core.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F361EBA10BB00EBF1C3 /* nsx_core.c */; }; - D0EC6FC01EBA132B00EBF1C3 /* nsx_core_c.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F381EBA10BB00EBF1C3 /* nsx_core_c.c */; }; - D0EC6FC11EBA132B00EBF1C3 /* nsx_core_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F391EBA10BB00EBF1C3 /* nsx_core_neon.c */; }; - D0EC6FC21EBA135100EBF1C3 /* auto_corr_to_refl_coef.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6ED91EBA10BB00EBF1C3 /* auto_corr_to_refl_coef.c */; }; - D0EC6FC31EBA135100EBF1C3 /* auto_correlation.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EDA1EBA10BB00EBF1C3 /* auto_correlation.c */; }; - D0EC6FC41EBA135100EBF1C3 /* complex_bit_reverse.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EDB1EBA10BB00EBF1C3 /* complex_bit_reverse.c */; }; - D0EC6FC61EBA135100EBF1C3 /* complex_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EDD1EBA10BB00EBF1C3 /* complex_fft.c */; }; - D0EC6FC71EBA135100EBF1C3 /* copy_set_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EDF1EBA10BB00EBF1C3 /* copy_set_operations.c */; }; - D0EC6FC81EBA135100EBF1C3 /* cross_correlation.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EE01EBA10BB00EBF1C3 /* cross_correlation.c */; }; - D0EC6FC91EBA135100EBF1C3 /* cross_correlation_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EE11EBA10BB00EBF1C3 /* cross_correlation_neon.c */; }; - D0EC6FCA1EBA135100EBF1C3 /* division_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EE21EBA10BB00EBF1C3 /* division_operations.c */; }; - D0EC6FCB1EBA135100EBF1C3 /* dot_product_with_scale.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EE31EBA10BB00EBF1C3 /* dot_product_with_scale.c */; }; - D0EC6FCC1EBA135100EBF1C3 /* downsample_fast.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EE41EBA10BB00EBF1C3 /* downsample_fast.c */; }; - D0EC6FCD1EBA135100EBF1C3 /* downsample_fast_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EE51EBA10BB00EBF1C3 /* downsample_fast_neon.c */; }; - D0EC6FCE1EBA135100EBF1C3 /* energy.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EE61EBA10BB00EBF1C3 /* energy.c */; }; - D0EC6FCF1EBA135100EBF1C3 /* filter_ar.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EE71EBA10BB00EBF1C3 /* filter_ar.c */; }; - D0EC6FD01EBA135100EBF1C3 /* filter_ar_fast_q12.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EE81EBA10BB00EBF1C3 /* filter_ar_fast_q12.c */; }; - D0EC6FD11EBA135100EBF1C3 /* filter_ma_fast_q12.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EEA1EBA10BB00EBF1C3 /* filter_ma_fast_q12.c */; }; - D0EC6FD21EBA135100EBF1C3 /* get_hanning_window.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EEB1EBA10BB00EBF1C3 /* get_hanning_window.c */; }; - D0EC6FD31EBA135100EBF1C3 /* get_scaling_square.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EEC1EBA10BB00EBF1C3 /* get_scaling_square.c */; }; - D0EC6FD41EBA135100EBF1C3 /* ilbc_specific_functions.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EED1EBA10BB00EBF1C3 /* ilbc_specific_functions.c */; }; - D0EC6FD51EBA135100EBF1C3 /* levinson_durbin.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EF41EBA10BB00EBF1C3 /* levinson_durbin.c */; }; - D0EC6FD61EBA135100EBF1C3 /* lpc_to_refl_coef.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EF51EBA10BB00EBF1C3 /* lpc_to_refl_coef.c */; }; - D0EC6FD71EBA135100EBF1C3 /* min_max_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EF61EBA10BB00EBF1C3 /* min_max_operations.c */; }; - D0EC6FD81EBA135100EBF1C3 /* min_max_operations_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EF71EBA10BB00EBF1C3 /* min_max_operations_neon.c */; }; - D0EC6FD91EBA135100EBF1C3 /* randomization_functions.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EF81EBA10BB00EBF1C3 /* randomization_functions.c */; }; - D0EC6FDA1EBA135100EBF1C3 /* real_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EF91EBA10BB00EBF1C3 /* real_fft.c */; }; - D0EC6FDB1EBA135100EBF1C3 /* refl_coef_to_lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EFA1EBA10BB00EBF1C3 /* refl_coef_to_lpc.c */; }; - D0EC6FDC1EBA135100EBF1C3 /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EFB1EBA10BB00EBF1C3 /* resample.c */; }; - D0EC6FDD1EBA135100EBF1C3 /* resample_48khz.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EFC1EBA10BB00EBF1C3 /* resample_48khz.c */; }; - D0EC6FDE1EBA135100EBF1C3 /* resample_by_2.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EFD1EBA10BB00EBF1C3 /* resample_by_2.c */; }; - D0EC6FDF1EBA135100EBF1C3 /* resample_by_2_internal.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6EFE1EBA10BB00EBF1C3 /* resample_by_2_internal.c */; }; - D0EC6FE01EBA135100EBF1C3 /* resample_fractional.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F001EBA10BB00EBF1C3 /* resample_fractional.c */; }; - D0EC6FE11EBA135100EBF1C3 /* spl_init.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F011EBA10BB00EBF1C3 /* spl_init.c */; }; - D0EC6FE21EBA135100EBF1C3 /* spl_inl.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F021EBA10BB00EBF1C3 /* spl_inl.c */; }; - D0EC6FE31EBA135100EBF1C3 /* spl_sqrt.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F031EBA10BB00EBF1C3 /* spl_sqrt.c */; }; - D0EC6FE41EBA135100EBF1C3 /* spl_sqrt_floor.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F041EBA10BB00EBF1C3 /* spl_sqrt_floor.c */; }; - D0EC6FE51EBA135100EBF1C3 /* splitting_filter_impl.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F061EBA10BB00EBF1C3 /* splitting_filter_impl.c */; }; - D0EC6FE61EBA135100EBF1C3 /* sqrt_of_one_minus_x_squared.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F071EBA10BB00EBF1C3 /* sqrt_of_one_minus_x_squared.c */; }; - D0EC6FE71EBA135100EBF1C3 /* vector_scaling_operations.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F081EBA10BB00EBF1C3 /* vector_scaling_operations.c */; }; - D0EC6FE81EBA138700EBF1C3 /* ooura_fft.h in Headers */ = {isa = PBXBuildFile; fileRef = D0EC6F491EBA10BB00EBF1C3 /* ooura_fft.h */; }; - D0EC6FE91EBA15D500EBF1C3 /* signal_processing_library.h in Headers */ = {isa = PBXBuildFile; fileRef = D0EC6EF01EBA10BB00EBF1C3 /* signal_processing_library.h */; }; - D0EC6FEA1EBA17C300EBF1C3 /* fft4g.c in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6ED21EBA10BB00EBF1C3 /* fft4g.c */; }; - D0EC6FEB1EBA180900EBF1C3 /* ooura_fft_sse2.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F4B1EBA10BB00EBF1C3 /* ooura_fft_sse2.cc */; }; - D0EC6FEC1EBA182B00EBF1C3 /* aec_core_sse2.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F171EBA10BB00EBF1C3 /* aec_core_sse2.cc */; }; - D0EC6FED1EBA184A00EBF1C3 /* cpu_features.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F551EBA10BB00EBF1C3 /* cpu_features.cc */; }; - D0EC6FEE1EBA186800EBF1C3 /* apm_data_dumper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6F2C1EBA10BB00EBF1C3 /* apm_data_dumper.cc */; }; - D0EC6FEF1EBA18E800EBF1C3 /* VoIPController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B941EB9F42D00EBF1C3 /* VoIPController.cpp */; }; - D0EC6FF01EBA18EB00EBF1C3 /* VoIPServerConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B961EB9F42D00EBF1C3 /* VoIPServerConfig.cpp */; }; - D0EC6FF51EBA193C00EBF1C3 /* NetworkSocketPosix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6FF21EBA193800EBF1C3 /* NetworkSocketPosix.cpp */; }; - D0EC6FF61EBA195F00EBF1C3 /* TGLogWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6B831EB9F42D00EBF1C3 /* TGLogWrapper.m */; }; D0EC6FFD1EBA1F2400EBF1C3 /* OngoingCallThreadLocalContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = D0EC6FFC1EBA1F2400EBF1C3 /* OngoingCallThreadLocalContext.mm */; }; D0F0AAE01EC1E12C005EE2A5 /* PresentationCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F0AADF1EC1E12C005EE2A5 /* PresentationCall.swift */; }; D0F0AAE21EC20EF8005EE2A5 /* CallControllerStatusNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F0AAE11EC20EF8005EE2A5 /* CallControllerStatusNode.swift */; }; @@ -1037,6 +870,13 @@ D003702D1DA43052004308D3 /* ItemListAvatarAndNameItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListAvatarAndNameItem.swift; sourceTree = ""; }; D003702F1DA43077004308D3 /* ItemListItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListItem.swift; sourceTree = ""; }; D00370311DA46C06004308D3 /* ItemListTextWithLabelItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListTextWithLabelItem.swift; sourceTree = ""; }; + D007019B2029E8F2006B9E34 /* LegqacyICloudFileController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegqacyICloudFileController.swift; sourceTree = ""; }; + D007019D2029EFDD006B9E34 /* ICloudResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ICloudResources.swift; sourceTree = ""; }; + D007019F2029F6D0006B9E34 /* TGMimeTypeMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGMimeTypeMap.h; sourceTree = ""; }; + D00701A02029F6D0006B9E34 /* TGMimeTypeMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGMimeTypeMap.m; sourceTree = ""; }; + D00ACA4C20222C280045D427 /* libtgvoip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = libtgvoip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D00ACA57202285090045D427 /* ChatRestrictedNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatRestrictedNode.swift; sourceTree = ""; }; + D00ACA592022897D0045D427 /* ProcessedPeerRestrictionText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProcessedPeerRestrictionText.swift; sourceTree = ""; }; D00ADFDA1EBA2EAF00873D2E /* OngoingCallContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OngoingCallContext.swift; sourceTree = ""; }; D00ADFDC1EBB73C200873D2E /* OverlayMediaManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayMediaManager.swift; sourceTree = ""; }; D00B3F9D1E3A4847003872C3 /* ItemListSectionHeaderItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListSectionHeaderItem.swift; sourceTree = ""; }; @@ -1419,6 +1259,8 @@ D079FCE81F06A76C0038FADE /* Notices.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Notices.swift; sourceTree = ""; }; D07A7DA21D957671005BCD27 /* ListMessageSnippetItemNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListMessageSnippetItemNode.swift; sourceTree = ""; }; D07A7DA41D95783C005BCD27 /* ListMessageNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListMessageNode.swift; sourceTree = ""; }; + D07ABBA4202A14BC003671DE /* LegacyImagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyImagePicker.swift; sourceTree = ""; }; + D07ABBAA202A1BD1003671DE /* LegacyWallpaperEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyWallpaperEditor.swift; sourceTree = ""; }; D07BCBFD1F2B792300ED97AA /* LegacyComponents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LegacyComponents.framework; path = "../LegacyComponents/build/Debug-iphoneos/LegacyComponents.framework"; sourceTree = ""; }; D07CFF731DCA207200761F81 /* PeerSelectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerSelectionController.swift; sourceTree = ""; }; D07CFF751DCA224100761F81 /* PeerSelectionControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerSelectionControllerNode.swift; sourceTree = ""; }; @@ -1464,8 +1306,6 @@ D0943AFF1FDAE852001522CC /* ChatFeedNavigationInputPanelNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatFeedNavigationInputPanelNode.swift; sourceTree = ""; }; D0943B041FDDFDA0001522CC /* OverlayInstantVideoNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayInstantVideoNode.swift; sourceTree = ""; }; D0943B061FDEC528001522CC /* InstantVideoRadialStatusNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantVideoRadialStatusNode.swift; sourceTree = ""; }; - D0943B091FDEF56D001522CC /* DarwinSpecific.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DarwinSpecific.mm; sourceTree = ""; }; - D0943B0A1FDEF56E001522CC /* DarwinSpecific.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DarwinSpecific.h; sourceTree = ""; }; D096A4611EA681A90000A7AE /* PresentationsResourceCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationsResourceCache.swift; sourceTree = ""; }; D096A4631EA683C90000A7AE /* PresentationTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationTheme.swift; sourceTree = ""; }; D096A47A1EA6A2F00000A7AE /* PresentationStrings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationStrings.swift; sourceTree = ""; }; @@ -1793,323 +1633,10 @@ D0EC6B401EB8F7D700EBF1C3 /* VoipDynamic.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VoipDynamic.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/VoipDynamic.framework"; sourceTree = ""; }; D0EC6B421EB92DF600EBF1C3 /* OverlayMediaController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayMediaController.swift; sourceTree = ""; }; D0EC6B441EB92E5A00EBF1C3 /* OverlayMediaControllerNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayMediaControllerNode.swift; sourceTree = ""; }; - D0EC6B4A1EB9F42D00EBF1C3 /* AudioInput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioInput.cpp; sourceTree = ""; }; - D0EC6B4B1EB9F42D00EBF1C3 /* AudioInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioInput.h; sourceTree = ""; }; - D0EC6B4C1EB9F42D00EBF1C3 /* AudioOutput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioOutput.cpp; sourceTree = ""; }; - D0EC6B4D1EB9F42D00EBF1C3 /* AudioOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioOutput.h; sourceTree = ""; }; - D0EC6B4E1EB9F42D00EBF1C3 /* Resampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Resampler.cpp; sourceTree = ""; }; - D0EC6B4F1EB9F42D00EBF1C3 /* Resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Resampler.h; sourceTree = ""; }; - D0EC6B501EB9F42D00EBF1C3 /* BlockingQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BlockingQueue.cpp; path = submodules/libtgvoip/BlockingQueue.cpp; sourceTree = ""; }; - D0EC6B511EB9F42D00EBF1C3 /* BlockingQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlockingQueue.h; path = submodules/libtgvoip/BlockingQueue.h; sourceTree = ""; }; - D0EC6B521EB9F42D00EBF1C3 /* BufferInputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BufferInputStream.cpp; path = submodules/libtgvoip/BufferInputStream.cpp; sourceTree = ""; }; - D0EC6B531EB9F42D00EBF1C3 /* BufferInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BufferInputStream.h; path = submodules/libtgvoip/BufferInputStream.h; sourceTree = ""; }; - D0EC6B541EB9F42D00EBF1C3 /* BufferOutputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BufferOutputStream.cpp; path = submodules/libtgvoip/BufferOutputStream.cpp; sourceTree = ""; }; - D0EC6B551EB9F42D00EBF1C3 /* BufferOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BufferOutputStream.h; path = submodules/libtgvoip/BufferOutputStream.h; sourceTree = ""; }; - D0EC6B561EB9F42D00EBF1C3 /* BufferPool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BufferPool.cpp; path = submodules/libtgvoip/BufferPool.cpp; sourceTree = ""; }; - D0EC6B571EB9F42D00EBF1C3 /* BufferPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BufferPool.h; path = submodules/libtgvoip/BufferPool.h; sourceTree = ""; }; - D0EC6B5B1EB9F42D00EBF1C3 /* CongestionControl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CongestionControl.cpp; path = submodules/libtgvoip/CongestionControl.cpp; sourceTree = ""; }; - D0EC6B5C1EB9F42D00EBF1C3 /* CongestionControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CongestionControl.h; path = submodules/libtgvoip/CongestionControl.h; sourceTree = ""; }; - D0EC6B5D1EB9F42D00EBF1C3 /* EchoCanceller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = EchoCanceller.cpp; path = submodules/libtgvoip/EchoCanceller.cpp; sourceTree = ""; }; - D0EC6B5E1EB9F42D00EBF1C3 /* EchoCanceller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EchoCanceller.h; path = submodules/libtgvoip/EchoCanceller.h; sourceTree = ""; }; - D0EC6B5F1EB9F42D00EBF1C3 /* JitterBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JitterBuffer.cpp; path = submodules/libtgvoip/JitterBuffer.cpp; sourceTree = ""; }; - D0EC6B601EB9F42D00EBF1C3 /* JitterBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JitterBuffer.h; path = submodules/libtgvoip/JitterBuffer.h; sourceTree = ""; }; - D0EC6B611EB9F42D00EBF1C3 /* logging.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = logging.cpp; path = submodules/libtgvoip/logging.cpp; sourceTree = ""; }; - D0EC6B621EB9F42D00EBF1C3 /* logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = logging.h; path = submodules/libtgvoip/logging.h; sourceTree = ""; }; - D0EC6B631EB9F42D00EBF1C3 /* MediaStreamItf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MediaStreamItf.cpp; path = submodules/libtgvoip/MediaStreamItf.cpp; sourceTree = ""; }; - D0EC6B641EB9F42D00EBF1C3 /* MediaStreamItf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MediaStreamItf.h; path = submodules/libtgvoip/MediaStreamItf.h; sourceTree = ""; }; - D0EC6B651EB9F42D00EBF1C3 /* NetworkSocket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkSocket.cpp; path = submodules/libtgvoip/NetworkSocket.cpp; sourceTree = ""; }; - D0EC6B661EB9F42D00EBF1C3 /* NetworkSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkSocket.h; path = submodules/libtgvoip/NetworkSocket.h; sourceTree = ""; }; - D0EC6B671EB9F42D00EBF1C3 /* OpusDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OpusDecoder.cpp; path = submodules/libtgvoip/OpusDecoder.cpp; sourceTree = ""; }; - D0EC6B681EB9F42D00EBF1C3 /* OpusDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpusDecoder.h; path = submodules/libtgvoip/OpusDecoder.h; sourceTree = ""; }; - D0EC6B691EB9F42D00EBF1C3 /* OpusEncoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OpusEncoder.cpp; path = submodules/libtgvoip/OpusEncoder.cpp; sourceTree = ""; }; - D0EC6B6A1EB9F42D00EBF1C3 /* OpusEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpusEncoder.h; path = submodules/libtgvoip/OpusEncoder.h; sourceTree = ""; }; - D0EC6B781EB9F42D00EBF1C3 /* AudioInputAudioUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioInputAudioUnit.cpp; sourceTree = ""; }; - D0EC6B791EB9F42D00EBF1C3 /* AudioInputAudioUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioInputAudioUnit.h; sourceTree = ""; }; - D0EC6B7C1EB9F42D00EBF1C3 /* AudioOutputAudioUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioOutputAudioUnit.cpp; sourceTree = ""; }; - D0EC6B7D1EB9F42D00EBF1C3 /* AudioOutputAudioUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioOutputAudioUnit.h; sourceTree = ""; }; - D0EC6B801EB9F42D00EBF1C3 /* AudioUnitIO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioUnitIO.cpp; sourceTree = ""; }; - D0EC6B811EB9F42D00EBF1C3 /* AudioUnitIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioUnitIO.h; sourceTree = ""; }; - D0EC6B821EB9F42D00EBF1C3 /* TGLogWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGLogWrapper.h; sourceTree = ""; }; - D0EC6B831EB9F42D00EBF1C3 /* TGLogWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGLogWrapper.m; sourceTree = ""; }; - D0EC6B931EB9F42D00EBF1C3 /* threading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = threading.h; path = submodules/libtgvoip/threading.h; sourceTree = ""; }; - D0EC6B941EB9F42D00EBF1C3 /* VoIPController.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = VoIPController.cpp; path = submodules/libtgvoip/VoIPController.cpp; sourceTree = ""; }; - D0EC6B951EB9F42D00EBF1C3 /* VoIPController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VoIPController.h; path = submodules/libtgvoip/VoIPController.h; sourceTree = ""; }; - D0EC6B961EB9F42D00EBF1C3 /* VoIPServerConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VoIPServerConfig.cpp; path = submodules/libtgvoip/VoIPServerConfig.cpp; sourceTree = ""; }; - D0EC6B971EB9F42D00EBF1C3 /* VoIPServerConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VoIPServerConfig.h; path = submodules/libtgvoip/VoIPServerConfig.h; sourceTree = ""; }; - D0EC6B9B1EB9F42D00EBF1C3 /* array_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = array_view.h; sourceTree = ""; }; - D0EC6B9C1EB9F42D00EBF1C3 /* atomicops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = atomicops.h; sourceTree = ""; }; - D0EC6B9D1EB9F42D00EBF1C3 /* basictypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basictypes.h; sourceTree = ""; }; - D0EC6B9E1EB9F42D00EBF1C3 /* checks.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = checks.cc; sourceTree = ""; }; - D0EC6B9F1EB9F42D00EBF1C3 /* checks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = checks.h; sourceTree = ""; }; - D0EC6BA01EB9F42D00EBF1C3 /* constructormagic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constructormagic.h; sourceTree = ""; }; - D0EC6BA11EB9F42D00EBF1C3 /* safe_compare.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_compare.h; sourceTree = ""; }; - D0EC6BA21EB9F42D00EBF1C3 /* safe_conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions.h; sourceTree = ""; }; - D0EC6BA31EB9F42D00EBF1C3 /* safe_conversions_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions_impl.h; sourceTree = ""; }; - D0EC6BA41EB9F42D00EBF1C3 /* sanitizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sanitizer.h; sourceTree = ""; }; - D0EC6BA51EB9F42D00EBF1C3 /* stringutils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutils.cc; sourceTree = ""; }; - D0EC6BA61EB9F42D00EBF1C3 /* stringutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutils.h; sourceTree = ""; }; - D0EC6BA71EB9F42D00EBF1C3 /* type_traits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_traits.h; sourceTree = ""; }; - D0EC6BA91EB9F42D00EBF1C3 /* audio_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_util.cc; sourceTree = ""; }; - D0EC6BAA1EB9F42D00EBF1C3 /* channel_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = channel_buffer.cc; sourceTree = ""; }; - D0EC6BAB1EB9F42D00EBF1C3 /* channel_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = channel_buffer.h; sourceTree = ""; }; - D0EC6BAC1EB9F42D00EBF1C3 /* fft4g.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fft4g.c; sourceTree = ""; }; - D0EC6BAD1EB9F42D00EBF1C3 /* fft4g.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft4g.h; sourceTree = ""; }; - D0EC6BAF1EB9F42D00EBF1C3 /* audio_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_util.h; sourceTree = ""; }; - D0EC6BB01EB9F42D00EBF1C3 /* ring_buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ring_buffer.c; sourceTree = ""; }; - D0EC6BB11EB9F42D00EBF1C3 /* ring_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ring_buffer.h; sourceTree = ""; }; - D0EC6BB31EB9F42D00EBF1C3 /* auto_corr_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_corr_to_refl_coef.c; sourceTree = ""; }; - D0EC6BB41EB9F42D00EBF1C3 /* auto_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_correlation.c; sourceTree = ""; }; - D0EC6BB51EB9F42D00EBF1C3 /* complex_bit_reverse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_bit_reverse.c; sourceTree = ""; }; - D0EC6BB61EB9F42D00EBF1C3 /* complex_bit_reverse_arm.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = complex_bit_reverse_arm.S; sourceTree = ""; }; - D0EC6BB71EB9F42D00EBF1C3 /* complex_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_fft.c; sourceTree = ""; }; - D0EC6BB81EB9F42D00EBF1C3 /* complex_fft_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex_fft_tables.h; sourceTree = ""; }; - D0EC6BB91EB9F42D00EBF1C3 /* copy_set_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = copy_set_operations.c; sourceTree = ""; }; - D0EC6BBA1EB9F42D00EBF1C3 /* cross_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation.c; sourceTree = ""; }; - D0EC6BBB1EB9F42D00EBF1C3 /* cross_correlation_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation_neon.c; sourceTree = ""; }; - D0EC6BBC1EB9F42D00EBF1C3 /* division_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = division_operations.c; sourceTree = ""; }; - D0EC6BBD1EB9F42D00EBF1C3 /* dot_product_with_scale.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dot_product_with_scale.c; sourceTree = ""; }; - D0EC6BBE1EB9F42D00EBF1C3 /* downsample_fast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast.c; sourceTree = ""; }; - D0EC6BBF1EB9F42D00EBF1C3 /* downsample_fast_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast_neon.c; sourceTree = ""; }; - D0EC6BC01EB9F42D00EBF1C3 /* energy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = energy.c; sourceTree = ""; }; - D0EC6BC11EB9F42D00EBF1C3 /* filter_ar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar.c; sourceTree = ""; }; - D0EC6BC21EB9F42D00EBF1C3 /* filter_ar_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar_fast_q12.c; sourceTree = ""; }; - D0EC6BC31EB9F42D00EBF1C3 /* filter_ar_fast_q12_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = filter_ar_fast_q12_armv7.S; sourceTree = ""; }; - D0EC6BC41EB9F42D00EBF1C3 /* filter_ma_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ma_fast_q12.c; sourceTree = ""; }; - D0EC6BC51EB9F42D00EBF1C3 /* get_hanning_window.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_hanning_window.c; sourceTree = ""; }; - D0EC6BC61EB9F42D00EBF1C3 /* get_scaling_square.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_scaling_square.c; sourceTree = ""; }; - D0EC6BC71EB9F42D00EBF1C3 /* ilbc_specific_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ilbc_specific_functions.c; sourceTree = ""; }; - D0EC6BC91EB9F42D00EBF1C3 /* real_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = real_fft.h; sourceTree = ""; }; - D0EC6BCA1EB9F42D00EBF1C3 /* signal_processing_library.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signal_processing_library.h; sourceTree = ""; }; - D0EC6BCB1EB9F42D00EBF1C3 /* spl_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl.h; sourceTree = ""; }; - D0EC6BCC1EB9F42D00EBF1C3 /* spl_inl_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl_armv7.h; sourceTree = ""; }; - D0EC6BCD1EB9F42D00EBF1C3 /* spl_inl_mips.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl_mips.h; sourceTree = ""; }; - D0EC6BCE1EB9F42D00EBF1C3 /* levinson_durbin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = levinson_durbin.c; sourceTree = ""; }; - D0EC6BCF1EB9F42D00EBF1C3 /* lpc_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_to_refl_coef.c; sourceTree = ""; }; - D0EC6BD01EB9F42D00EBF1C3 /* min_max_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations.c; sourceTree = ""; }; - D0EC6BD11EB9F42D00EBF1C3 /* min_max_operations_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations_neon.c; sourceTree = ""; }; - D0EC6BD21EB9F42D00EBF1C3 /* randomization_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = randomization_functions.c; sourceTree = ""; }; - D0EC6BD31EB9F42D00EBF1C3 /* real_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = real_fft.c; sourceTree = ""; }; - D0EC6BD41EB9F42D00EBF1C3 /* refl_coef_to_lpc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = refl_coef_to_lpc.c; sourceTree = ""; }; - D0EC6BD51EB9F42D00EBF1C3 /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample.c; sourceTree = ""; }; - D0EC6BD61EB9F42D00EBF1C3 /* resample_48khz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_48khz.c; sourceTree = ""; }; - D0EC6BD71EB9F42D00EBF1C3 /* resample_by_2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2.c; sourceTree = ""; }; - D0EC6BD81EB9F42D00EBF1C3 /* resample_by_2_internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2_internal.c; sourceTree = ""; }; - D0EC6BD91EB9F42D00EBF1C3 /* resample_by_2_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resample_by_2_internal.h; sourceTree = ""; }; - D0EC6BDA1EB9F42D00EBF1C3 /* resample_fractional.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_fractional.c; sourceTree = ""; }; - D0EC6BDB1EB9F42D00EBF1C3 /* spl_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_init.c; sourceTree = ""; }; - D0EC6BDC1EB9F42D00EBF1C3 /* spl_inl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_inl.c; sourceTree = ""; }; - D0EC6BDD1EB9F42D00EBF1C3 /* spl_sqrt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt.c; sourceTree = ""; }; - D0EC6BDE1EB9F42D00EBF1C3 /* spl_sqrt_floor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt_floor.c; sourceTree = ""; }; - D0EC6BDF1EB9F42D00EBF1C3 /* spl_sqrt_floor_arm.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = spl_sqrt_floor_arm.S; sourceTree = ""; }; - D0EC6BE01EB9F42D00EBF1C3 /* splitting_filter_impl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = splitting_filter_impl.c; sourceTree = ""; }; - D0EC6BE11EB9F42D00EBF1C3 /* sqrt_of_one_minus_x_squared.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sqrt_of_one_minus_x_squared.c; sourceTree = ""; }; - D0EC6BE21EB9F42D00EBF1C3 /* vector_scaling_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vector_scaling_operations.c; sourceTree = ""; }; - D0EC6BE31EB9F42D00EBF1C3 /* sparse_fir_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sparse_fir_filter.cc; sourceTree = ""; }; - D0EC6BE41EB9F42D00EBF1C3 /* sparse_fir_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_fir_filter.h; sourceTree = ""; }; - D0EC6BE51EB9F42D00EBF1C3 /* wav_file.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_file.cc; sourceTree = ""; }; - D0EC6BE61EB9F42D00EBF1C3 /* wav_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_file.h; sourceTree = ""; }; - D0EC6BE71EB9F42D00EBF1C3 /* wav_header.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_header.cc; sourceTree = ""; }; - D0EC6BE81EB9F42D00EBF1C3 /* wav_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_header.h; sourceTree = ""; }; - D0EC6BEC1EB9F42D00EBF1C3 /* aec_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_common.h; sourceTree = ""; }; - D0EC6BED1EB9F42D00EBF1C3 /* aec_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core.cc; sourceTree = ""; }; - D0EC6BEE1EB9F42D00EBF1C3 /* aec_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core.h; sourceTree = ""; }; - D0EC6BEF1EB9F42D00EBF1C3 /* aec_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_neon.cc; sourceTree = ""; }; - D0EC6BF01EB9F42D00EBF1C3 /* aec_core_optimized_methods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core_optimized_methods.h; sourceTree = ""; }; - D0EC6BF11EB9F42D00EBF1C3 /* aec_core_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_sse2.cc; sourceTree = ""; }; - D0EC6BF21EB9F42D00EBF1C3 /* aec_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_resampler.cc; sourceTree = ""; }; - D0EC6BF31EB9F42D00EBF1C3 /* aec_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_resampler.h; sourceTree = ""; }; - D0EC6BF41EB9F42D00EBF1C3 /* echo_cancellation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_cancellation.cc; sourceTree = ""; }; - D0EC6BF51EB9F42D00EBF1C3 /* echo_cancellation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_cancellation.h; sourceTree = ""; }; - D0EC6BF71EB9F42D00EBF1C3 /* aecm_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core.cc; sourceTree = ""; }; - D0EC6BF81EB9F42D00EBF1C3 /* aecm_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_core.h; sourceTree = ""; }; - D0EC6BF91EB9F42D00EBF1C3 /* aecm_core_c.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_c.cc; sourceTree = ""; }; - D0EC6BFA1EB9F42D00EBF1C3 /* aecm_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_neon.cc; sourceTree = ""; }; - D0EC6BFB1EB9F42D00EBF1C3 /* aecm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_defines.h; sourceTree = ""; }; - D0EC6BFC1EB9F42D00EBF1C3 /* echo_control_mobile.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_control_mobile.cc; sourceTree = ""; }; - D0EC6BFD1EB9F42D00EBF1C3 /* echo_control_mobile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_control_mobile.h; sourceTree = ""; }; - D0EC6C001EB9F42D00EBF1C3 /* analog_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = analog_agc.c; sourceTree = ""; }; - D0EC6C011EB9F42D00EBF1C3 /* analog_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = analog_agc.h; sourceTree = ""; }; - D0EC6C021EB9F42D00EBF1C3 /* digital_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = digital_agc.c; sourceTree = ""; }; - D0EC6C031EB9F42D00EBF1C3 /* digital_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = digital_agc.h; sourceTree = ""; }; - D0EC6C041EB9F42D00EBF1C3 /* gain_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control.h; sourceTree = ""; }; - D0EC6C061EB9F42D00EBF1C3 /* apm_data_dumper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = apm_data_dumper.cc; sourceTree = ""; }; - D0EC6C071EB9F42D00EBF1C3 /* apm_data_dumper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apm_data_dumper.h; sourceTree = ""; }; - D0EC6C091EB9F42D00EBF1C3 /* defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defines.h; sourceTree = ""; }; - D0EC6C0A1EB9F42D00EBF1C3 /* noise_suppression.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression.c; sourceTree = ""; }; - D0EC6C0B1EB9F42D00EBF1C3 /* noise_suppression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression.h; sourceTree = ""; }; - D0EC6C0C1EB9F42D00EBF1C3 /* noise_suppression_x.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression_x.c; sourceTree = ""; }; - D0EC6C0D1EB9F42D00EBF1C3 /* noise_suppression_x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression_x.h; sourceTree = ""; }; - D0EC6C0E1EB9F42D00EBF1C3 /* ns_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ns_core.c; sourceTree = ""; }; - D0EC6C0F1EB9F42D00EBF1C3 /* ns_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ns_core.h; sourceTree = ""; }; - D0EC6C101EB9F42D00EBF1C3 /* nsx_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core.c; sourceTree = ""; }; - D0EC6C111EB9F42D00EBF1C3 /* nsx_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_core.h; sourceTree = ""; }; - D0EC6C121EB9F42D00EBF1C3 /* nsx_core_c.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_c.c; sourceTree = ""; }; - D0EC6C131EB9F42D00EBF1C3 /* nsx_core_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_neon.c; sourceTree = ""; }; - D0EC6C141EB9F42E00EBF1C3 /* nsx_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_defines.h; sourceTree = ""; }; - D0EC6C151EB9F42E00EBF1C3 /* windows_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = windows_private.h; sourceTree = ""; }; - D0EC6C161EB9F42E00EBF1C3 /* splitting_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = splitting_filter.cc; sourceTree = ""; }; - D0EC6C171EB9F42E00EBF1C3 /* splitting_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = splitting_filter.h; sourceTree = ""; }; - D0EC6C181EB9F42E00EBF1C3 /* three_band_filter_bank.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = three_band_filter_bank.cc; sourceTree = ""; }; - D0EC6C191EB9F42E00EBF1C3 /* three_band_filter_bank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = three_band_filter_bank.h; sourceTree = ""; }; - D0EC6C1B1EB9F42E00EBF1C3 /* block_mean_calculator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_mean_calculator.cc; sourceTree = ""; }; - D0EC6C1C1EB9F42E00EBF1C3 /* block_mean_calculator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_mean_calculator.h; sourceTree = ""; }; - D0EC6C1D1EB9F42E00EBF1C3 /* delay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator.cc; sourceTree = ""; }; - D0EC6C1E1EB9F42E00EBF1C3 /* delay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator.h; sourceTree = ""; }; - D0EC6C1F1EB9F42E00EBF1C3 /* delay_estimator_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_internal.h; sourceTree = ""; }; - D0EC6C201EB9F42E00EBF1C3 /* delay_estimator_wrapper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator_wrapper.cc; sourceTree = ""; }; - D0EC6C211EB9F42E00EBF1C3 /* delay_estimator_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_wrapper.h; sourceTree = ""; }; - D0EC6C221EB9F42E00EBF1C3 /* ooura_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft.cc; sourceTree = ""; }; - D0EC6C231EB9F42E00EBF1C3 /* ooura_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft.h; sourceTree = ""; }; - D0EC6C241EB9F42E00EBF1C3 /* ooura_fft_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_neon.cc; sourceTree = ""; }; - D0EC6C251EB9F42E00EBF1C3 /* ooura_fft_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_sse2.cc; sourceTree = ""; }; - D0EC6C261EB9F42E00EBF1C3 /* ooura_fft_tables_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_common.h; sourceTree = ""; }; - D0EC6C271EB9F42E00EBF1C3 /* ooura_fft_tables_neon_sse2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_neon_sse2.h; sourceTree = ""; }; - D0EC6C2A1EB9F42E00EBF1C3 /* asm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm_defines.h; sourceTree = ""; }; - D0EC6C2B1EB9F42E00EBF1C3 /* compile_assert_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compile_assert_c.h; sourceTree = ""; }; - D0EC6C2C1EB9F42E00EBF1C3 /* cpu_features_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_features_wrapper.h; sourceTree = ""; }; - D0EC6C2D1EB9F42E00EBF1C3 /* metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metrics.h; sourceTree = ""; }; - D0EC6C2F1EB9F42E00EBF1C3 /* cpu_features.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_features.cc; sourceTree = ""; }; - D0EC6C301EB9F42E00EBF1C3 /* typedefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typedefs.h; sourceTree = ""; }; D0EC6CA51EB9F4CC00EBF1C3 /* TelegramUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TelegramUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0EC6E941EB9F5B300EBF1C3 /* MtProtoKitDynamic.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MtProtoKitDynamic.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/MtProtoKitDynamic.framework"; sourceTree = ""; }; D0EC6E951EB9F5B300EBF1C3 /* TelegramLegacyComponents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TelegramLegacyComponents.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Telegram-iOS-diblohvjozhgaifjcniwdlixlilx/Build/Products/Debug-iphonesimulator/TelegramLegacyComponents.framework"; sourceTree = ""; }; D0EC6EBC1EBA100F00EBF1C3 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; - D0EC6EC11EBA10BB00EBF1C3 /* array_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = array_view.h; sourceTree = ""; }; - D0EC6EC21EBA10BB00EBF1C3 /* atomicops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = atomicops.h; sourceTree = ""; }; - D0EC6EC31EBA10BB00EBF1C3 /* basictypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basictypes.h; sourceTree = ""; }; - D0EC6EC41EBA10BB00EBF1C3 /* checks.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = checks.cc; sourceTree = ""; }; - D0EC6EC51EBA10BB00EBF1C3 /* checks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = checks.h; sourceTree = ""; }; - D0EC6EC61EBA10BB00EBF1C3 /* constructormagic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constructormagic.h; sourceTree = ""; }; - D0EC6EC71EBA10BB00EBF1C3 /* safe_compare.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_compare.h; sourceTree = ""; }; - D0EC6EC81EBA10BB00EBF1C3 /* safe_conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions.h; sourceTree = ""; }; - D0EC6EC91EBA10BB00EBF1C3 /* safe_conversions_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safe_conversions_impl.h; sourceTree = ""; }; - D0EC6ECA1EBA10BB00EBF1C3 /* sanitizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sanitizer.h; sourceTree = ""; }; - D0EC6ECB1EBA10BB00EBF1C3 /* stringutils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutils.cc; sourceTree = ""; }; - D0EC6ECC1EBA10BB00EBF1C3 /* stringutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutils.h; sourceTree = ""; }; - D0EC6ECD1EBA10BB00EBF1C3 /* type_traits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_traits.h; sourceTree = ""; }; - D0EC6ECF1EBA10BB00EBF1C3 /* audio_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio_util.cc; sourceTree = ""; }; - D0EC6ED01EBA10BB00EBF1C3 /* channel_buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = channel_buffer.cc; sourceTree = ""; }; - D0EC6ED11EBA10BB00EBF1C3 /* channel_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = channel_buffer.h; sourceTree = ""; }; - D0EC6ED21EBA10BB00EBF1C3 /* fft4g.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fft4g.c; sourceTree = ""; }; - D0EC6ED31EBA10BB00EBF1C3 /* fft4g.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft4g.h; sourceTree = ""; }; - D0EC6ED51EBA10BB00EBF1C3 /* audio_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio_util.h; sourceTree = ""; }; - D0EC6ED61EBA10BB00EBF1C3 /* ring_buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ring_buffer.c; sourceTree = ""; }; - D0EC6ED71EBA10BB00EBF1C3 /* ring_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ring_buffer.h; sourceTree = ""; }; - D0EC6ED91EBA10BB00EBF1C3 /* auto_corr_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_corr_to_refl_coef.c; sourceTree = ""; }; - D0EC6EDA1EBA10BB00EBF1C3 /* auto_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auto_correlation.c; sourceTree = ""; }; - D0EC6EDB1EBA10BB00EBF1C3 /* complex_bit_reverse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_bit_reverse.c; sourceTree = ""; }; - D0EC6EDC1EBA10BB00EBF1C3 /* complex_bit_reverse_arm.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = complex_bit_reverse_arm.S; sourceTree = ""; }; - D0EC6EDD1EBA10BB00EBF1C3 /* complex_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = complex_fft.c; sourceTree = ""; }; - D0EC6EDE1EBA10BB00EBF1C3 /* complex_fft_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex_fft_tables.h; sourceTree = ""; }; - D0EC6EDF1EBA10BB00EBF1C3 /* copy_set_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = copy_set_operations.c; sourceTree = ""; }; - D0EC6EE01EBA10BB00EBF1C3 /* cross_correlation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation.c; sourceTree = ""; }; - D0EC6EE11EBA10BB00EBF1C3 /* cross_correlation_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cross_correlation_neon.c; sourceTree = ""; }; - D0EC6EE21EBA10BB00EBF1C3 /* division_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = division_operations.c; sourceTree = ""; }; - D0EC6EE31EBA10BB00EBF1C3 /* dot_product_with_scale.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dot_product_with_scale.c; sourceTree = ""; }; - D0EC6EE41EBA10BB00EBF1C3 /* downsample_fast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast.c; sourceTree = ""; }; - D0EC6EE51EBA10BB00EBF1C3 /* downsample_fast_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = downsample_fast_neon.c; sourceTree = ""; }; - D0EC6EE61EBA10BB00EBF1C3 /* energy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = energy.c; sourceTree = ""; }; - D0EC6EE71EBA10BB00EBF1C3 /* filter_ar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar.c; sourceTree = ""; }; - D0EC6EE81EBA10BB00EBF1C3 /* filter_ar_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ar_fast_q12.c; sourceTree = ""; }; - D0EC6EE91EBA10BB00EBF1C3 /* filter_ar_fast_q12_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = filter_ar_fast_q12_armv7.S; sourceTree = ""; }; - D0EC6EEA1EBA10BB00EBF1C3 /* filter_ma_fast_q12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filter_ma_fast_q12.c; sourceTree = ""; }; - D0EC6EEB1EBA10BB00EBF1C3 /* get_hanning_window.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_hanning_window.c; sourceTree = ""; }; - D0EC6EEC1EBA10BB00EBF1C3 /* get_scaling_square.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_scaling_square.c; sourceTree = ""; }; - D0EC6EED1EBA10BB00EBF1C3 /* ilbc_specific_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ilbc_specific_functions.c; sourceTree = ""; }; - D0EC6EEF1EBA10BB00EBF1C3 /* real_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = real_fft.h; sourceTree = ""; }; - D0EC6EF01EBA10BB00EBF1C3 /* signal_processing_library.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signal_processing_library.h; sourceTree = ""; }; - D0EC6EF11EBA10BB00EBF1C3 /* spl_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl.h; sourceTree = ""; }; - D0EC6EF21EBA10BB00EBF1C3 /* spl_inl_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl_armv7.h; sourceTree = ""; }; - D0EC6EF31EBA10BB00EBF1C3 /* spl_inl_mips.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spl_inl_mips.h; sourceTree = ""; }; - D0EC6EF41EBA10BB00EBF1C3 /* levinson_durbin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = levinson_durbin.c; sourceTree = ""; }; - D0EC6EF51EBA10BB00EBF1C3 /* lpc_to_refl_coef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lpc_to_refl_coef.c; sourceTree = ""; }; - D0EC6EF61EBA10BB00EBF1C3 /* min_max_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations.c; sourceTree = ""; }; - D0EC6EF71EBA10BB00EBF1C3 /* min_max_operations_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = min_max_operations_neon.c; sourceTree = ""; }; - D0EC6EF81EBA10BB00EBF1C3 /* randomization_functions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = randomization_functions.c; sourceTree = ""; }; - D0EC6EF91EBA10BB00EBF1C3 /* real_fft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = real_fft.c; sourceTree = ""; }; - D0EC6EFA1EBA10BB00EBF1C3 /* refl_coef_to_lpc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = refl_coef_to_lpc.c; sourceTree = ""; }; - D0EC6EFB1EBA10BB00EBF1C3 /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample.c; sourceTree = ""; }; - D0EC6EFC1EBA10BB00EBF1C3 /* resample_48khz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_48khz.c; sourceTree = ""; }; - D0EC6EFD1EBA10BB00EBF1C3 /* resample_by_2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2.c; sourceTree = ""; }; - D0EC6EFE1EBA10BB00EBF1C3 /* resample_by_2_internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_by_2_internal.c; sourceTree = ""; }; - D0EC6EFF1EBA10BB00EBF1C3 /* resample_by_2_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resample_by_2_internal.h; sourceTree = ""; }; - D0EC6F001EBA10BB00EBF1C3 /* resample_fractional.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample_fractional.c; sourceTree = ""; }; - D0EC6F011EBA10BB00EBF1C3 /* spl_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_init.c; sourceTree = ""; }; - D0EC6F021EBA10BB00EBF1C3 /* spl_inl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_inl.c; sourceTree = ""; }; - D0EC6F031EBA10BB00EBF1C3 /* spl_sqrt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt.c; sourceTree = ""; }; - D0EC6F041EBA10BB00EBF1C3 /* spl_sqrt_floor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spl_sqrt_floor.c; sourceTree = ""; }; - D0EC6F051EBA10BB00EBF1C3 /* spl_sqrt_floor_arm.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = spl_sqrt_floor_arm.S; sourceTree = ""; }; - D0EC6F061EBA10BB00EBF1C3 /* splitting_filter_impl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = splitting_filter_impl.c; sourceTree = ""; }; - D0EC6F071EBA10BB00EBF1C3 /* sqrt_of_one_minus_x_squared.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sqrt_of_one_minus_x_squared.c; sourceTree = ""; }; - D0EC6F081EBA10BB00EBF1C3 /* vector_scaling_operations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vector_scaling_operations.c; sourceTree = ""; }; - D0EC6F091EBA10BB00EBF1C3 /* sparse_fir_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sparse_fir_filter.cc; sourceTree = ""; }; - D0EC6F0A1EBA10BB00EBF1C3 /* sparse_fir_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_fir_filter.h; sourceTree = ""; }; - D0EC6F0B1EBA10BB00EBF1C3 /* wav_file.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_file.cc; sourceTree = ""; }; - D0EC6F0C1EBA10BB00EBF1C3 /* wav_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_file.h; sourceTree = ""; }; - D0EC6F0D1EBA10BB00EBF1C3 /* wav_header.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wav_header.cc; sourceTree = ""; }; - D0EC6F0E1EBA10BB00EBF1C3 /* wav_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wav_header.h; sourceTree = ""; }; - D0EC6F121EBA10BB00EBF1C3 /* aec_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_common.h; sourceTree = ""; }; - D0EC6F131EBA10BB00EBF1C3 /* aec_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core.cc; sourceTree = ""; }; - D0EC6F141EBA10BB00EBF1C3 /* aec_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core.h; sourceTree = ""; }; - D0EC6F151EBA10BB00EBF1C3 /* aec_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_neon.cc; sourceTree = ""; }; - D0EC6F161EBA10BB00EBF1C3 /* aec_core_optimized_methods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_core_optimized_methods.h; sourceTree = ""; }; - D0EC6F171EBA10BB00EBF1C3 /* aec_core_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_core_sse2.cc; sourceTree = ""; }; - D0EC6F181EBA10BB00EBF1C3 /* aec_resampler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aec_resampler.cc; sourceTree = ""; }; - D0EC6F191EBA10BB00EBF1C3 /* aec_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aec_resampler.h; sourceTree = ""; }; - D0EC6F1A1EBA10BB00EBF1C3 /* echo_cancellation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_cancellation.cc; sourceTree = ""; }; - D0EC6F1B1EBA10BB00EBF1C3 /* echo_cancellation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_cancellation.h; sourceTree = ""; }; - D0EC6F1D1EBA10BB00EBF1C3 /* aecm_core.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core.cc; sourceTree = ""; }; - D0EC6F1E1EBA10BB00EBF1C3 /* aecm_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_core.h; sourceTree = ""; }; - D0EC6F1F1EBA10BB00EBF1C3 /* aecm_core_c.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_c.cc; sourceTree = ""; }; - D0EC6F201EBA10BB00EBF1C3 /* aecm_core_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aecm_core_neon.cc; sourceTree = ""; }; - D0EC6F211EBA10BB00EBF1C3 /* aecm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aecm_defines.h; sourceTree = ""; }; - D0EC6F221EBA10BB00EBF1C3 /* echo_control_mobile.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = echo_control_mobile.cc; sourceTree = ""; }; - D0EC6F231EBA10BB00EBF1C3 /* echo_control_mobile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = echo_control_mobile.h; sourceTree = ""; }; - D0EC6F261EBA10BB00EBF1C3 /* analog_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = analog_agc.c; sourceTree = ""; }; - D0EC6F271EBA10BB00EBF1C3 /* analog_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = analog_agc.h; sourceTree = ""; }; - D0EC6F281EBA10BB00EBF1C3 /* digital_agc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = digital_agc.c; sourceTree = ""; }; - D0EC6F291EBA10BB00EBF1C3 /* digital_agc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = digital_agc.h; sourceTree = ""; }; - D0EC6F2A1EBA10BB00EBF1C3 /* gain_control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gain_control.h; sourceTree = ""; }; - D0EC6F2C1EBA10BB00EBF1C3 /* apm_data_dumper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = apm_data_dumper.cc; sourceTree = ""; }; - D0EC6F2D1EBA10BB00EBF1C3 /* apm_data_dumper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apm_data_dumper.h; sourceTree = ""; }; - D0EC6F2F1EBA10BB00EBF1C3 /* defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defines.h; sourceTree = ""; }; - D0EC6F301EBA10BB00EBF1C3 /* noise_suppression.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression.c; sourceTree = ""; }; - D0EC6F311EBA10BB00EBF1C3 /* noise_suppression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression.h; sourceTree = ""; }; - D0EC6F321EBA10BB00EBF1C3 /* noise_suppression_x.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noise_suppression_x.c; sourceTree = ""; }; - D0EC6F331EBA10BB00EBF1C3 /* noise_suppression_x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noise_suppression_x.h; sourceTree = ""; }; - D0EC6F341EBA10BB00EBF1C3 /* ns_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ns_core.c; sourceTree = ""; }; - D0EC6F351EBA10BB00EBF1C3 /* ns_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ns_core.h; sourceTree = ""; }; - D0EC6F361EBA10BB00EBF1C3 /* nsx_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core.c; sourceTree = ""; }; - D0EC6F371EBA10BB00EBF1C3 /* nsx_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_core.h; sourceTree = ""; }; - D0EC6F381EBA10BB00EBF1C3 /* nsx_core_c.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_c.c; sourceTree = ""; }; - D0EC6F391EBA10BB00EBF1C3 /* nsx_core_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nsx_core_neon.c; sourceTree = ""; }; - D0EC6F3A1EBA10BB00EBF1C3 /* nsx_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsx_defines.h; sourceTree = ""; }; - D0EC6F3B1EBA10BB00EBF1C3 /* windows_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = windows_private.h; sourceTree = ""; }; - D0EC6F3C1EBA10BB00EBF1C3 /* splitting_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = splitting_filter.cc; sourceTree = ""; }; - D0EC6F3D1EBA10BB00EBF1C3 /* splitting_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = splitting_filter.h; sourceTree = ""; }; - D0EC6F3E1EBA10BB00EBF1C3 /* three_band_filter_bank.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = three_band_filter_bank.cc; sourceTree = ""; }; - D0EC6F3F1EBA10BB00EBF1C3 /* three_band_filter_bank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = three_band_filter_bank.h; sourceTree = ""; }; - D0EC6F411EBA10BB00EBF1C3 /* block_mean_calculator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = block_mean_calculator.cc; sourceTree = ""; }; - D0EC6F421EBA10BB00EBF1C3 /* block_mean_calculator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_mean_calculator.h; sourceTree = ""; }; - D0EC6F431EBA10BB00EBF1C3 /* delay_estimator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator.cc; sourceTree = ""; }; - D0EC6F441EBA10BB00EBF1C3 /* delay_estimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator.h; sourceTree = ""; }; - D0EC6F451EBA10BB00EBF1C3 /* delay_estimator_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_internal.h; sourceTree = ""; }; - D0EC6F461EBA10BB00EBF1C3 /* delay_estimator_wrapper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = delay_estimator_wrapper.cc; sourceTree = ""; }; - D0EC6F471EBA10BB00EBF1C3 /* delay_estimator_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = delay_estimator_wrapper.h; sourceTree = ""; }; - D0EC6F481EBA10BB00EBF1C3 /* ooura_fft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft.cc; sourceTree = ""; }; - D0EC6F491EBA10BB00EBF1C3 /* ooura_fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft.h; sourceTree = ""; }; - D0EC6F4A1EBA10BB00EBF1C3 /* ooura_fft_neon.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_neon.cc; sourceTree = ""; }; - D0EC6F4B1EBA10BB00EBF1C3 /* ooura_fft_sse2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ooura_fft_sse2.cc; sourceTree = ""; }; - D0EC6F4C1EBA10BB00EBF1C3 /* ooura_fft_tables_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_common.h; sourceTree = ""; }; - D0EC6F4D1EBA10BB00EBF1C3 /* ooura_fft_tables_neon_sse2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ooura_fft_tables_neon_sse2.h; sourceTree = ""; }; - D0EC6F501EBA10BB00EBF1C3 /* asm_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm_defines.h; sourceTree = ""; }; - D0EC6F511EBA10BB00EBF1C3 /* compile_assert_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compile_assert_c.h; sourceTree = ""; }; - D0EC6F521EBA10BB00EBF1C3 /* cpu_features_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_features_wrapper.h; sourceTree = ""; }; - D0EC6F531EBA10BB00EBF1C3 /* metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metrics.h; sourceTree = ""; }; - D0EC6F551EBA10BB00EBF1C3 /* cpu_features.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_features.cc; sourceTree = ""; }; - D0EC6F561EBA10BB00EBF1C3 /* typedefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typedefs.h; sourceTree = ""; }; - D0EC6FF21EBA193800EBF1C3 /* NetworkSocketPosix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkSocketPosix.cpp; sourceTree = ""; }; - D0EC6FF31EBA193800EBF1C3 /* NetworkSocketPosix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkSocketPosix.h; sourceTree = ""; }; D0EC6FFA1EBA1DE900EBF1C3 /* OngoingCallThreadLocalContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OngoingCallThreadLocalContext.h; sourceTree = ""; }; D0EC6FFC1EBA1F2400EBF1C3 /* OngoingCallThreadLocalContext.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = OngoingCallThreadLocalContext.mm; sourceTree = ""; }; D0ED5D4A1DC806D7007CBB15 /* ApplicationSpecificData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationSpecificData.swift; sourceTree = ""; }; @@ -2270,6 +1797,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D00ACA4B20222C280045D427 /* libtgvoip.framework in Frameworks */, D057C5402004215B00990762 /* Lottie.framework in Frameworks */, D07BCBFE1F2B792300ED97AA /* LegacyComponents.framework in Frameworks */, D053B4371F1A9CA000E2D58A /* WebKit.framework in Frameworks */, @@ -2899,6 +2427,9 @@ D0EB41FE1F30ED4F00838FE6 /* LegacyImageProcessors.h */, D0EB41FF1F30ED4F00838FE6 /* LegacyImageProcessors.m */, D0CFBB851FD715E700B65C0D /* LegacyHTTPOperationImpl.swift */, + D007019B2029E8F2006B9E34 /* LegqacyICloudFileController.swift */, + D07ABBA4202A14BC003671DE /* LegacyImagePicker.swift */, + D07ABBAA202A1BD1003671DE /* LegacyWallpaperEditor.swift */, ); name = "Legacy Components"; sourceTree = ""; @@ -3014,6 +2545,7 @@ D08D45281D5E340200A7428A /* Frameworks */ = { isa = PBXGroup; children = ( + D00ACA4C20222C280045D427 /* libtgvoip.framework */, D057C5412004215B00990762 /* Lottie.framework */, D057C52B2004202900990762 /* libLottie.a */, D07BCBFD1F2B792300ED97AA /* LegacyComponents.framework */, @@ -3610,668 +3142,6 @@ name = Call; sourceTree = ""; }; - D0EC6B481EB9F3E800EBF1C3 /* libtgvoip */ = { - isa = PBXGroup; - children = ( - D0EC6EBE1EBA10BB00EBF1C3 /* webrtc_dsp */, - D0EC6B491EB9F42D00EBF1C3 /* audio */, - D0EC6B501EB9F42D00EBF1C3 /* BlockingQueue.cpp */, - D0EC6B511EB9F42D00EBF1C3 /* BlockingQueue.h */, - D0EC6B521EB9F42D00EBF1C3 /* BufferInputStream.cpp */, - D0EC6B531EB9F42D00EBF1C3 /* BufferInputStream.h */, - D0EC6B541EB9F42D00EBF1C3 /* BufferOutputStream.cpp */, - D0EC6B551EB9F42D00EBF1C3 /* BufferOutputStream.h */, - D0EC6B561EB9F42D00EBF1C3 /* BufferPool.cpp */, - D0EC6B571EB9F42D00EBF1C3 /* BufferPool.h */, - D0EC6B5B1EB9F42D00EBF1C3 /* CongestionControl.cpp */, - D0EC6B5C1EB9F42D00EBF1C3 /* CongestionControl.h */, - D0EC6B5D1EB9F42D00EBF1C3 /* EchoCanceller.cpp */, - D0EC6B5E1EB9F42D00EBF1C3 /* EchoCanceller.h */, - D0EC6B5F1EB9F42D00EBF1C3 /* JitterBuffer.cpp */, - D0EC6B601EB9F42D00EBF1C3 /* JitterBuffer.h */, - D0EC6B611EB9F42D00EBF1C3 /* logging.cpp */, - D0EC6B621EB9F42D00EBF1C3 /* logging.h */, - D0EC6B631EB9F42D00EBF1C3 /* MediaStreamItf.cpp */, - D0EC6B641EB9F42D00EBF1C3 /* MediaStreamItf.h */, - D0EC6B651EB9F42D00EBF1C3 /* NetworkSocket.cpp */, - D0EC6B661EB9F42D00EBF1C3 /* NetworkSocket.h */, - D0EC6B671EB9F42D00EBF1C3 /* OpusDecoder.cpp */, - D0EC6B681EB9F42D00EBF1C3 /* OpusDecoder.h */, - D0EC6B691EB9F42D00EBF1C3 /* OpusEncoder.cpp */, - D0EC6B6A1EB9F42D00EBF1C3 /* OpusEncoder.h */, - D0EC6B6B1EB9F42D00EBF1C3 /* os */, - D0EC6B931EB9F42D00EBF1C3 /* threading.h */, - D0EC6B941EB9F42D00EBF1C3 /* VoIPController.cpp */, - D0EC6B951EB9F42D00EBF1C3 /* VoIPController.h */, - D0EC6B961EB9F42D00EBF1C3 /* VoIPServerConfig.cpp */, - D0EC6B971EB9F42D00EBF1C3 /* VoIPServerConfig.h */, - D0EC6B981EB9F42D00EBF1C3 /* webrtc_dsp */, - ); - name = libtgvoip; - sourceTree = ""; - }; - D0EC6B491EB9F42D00EBF1C3 /* audio */ = { - isa = PBXGroup; - children = ( - D0EC6B4A1EB9F42D00EBF1C3 /* AudioInput.cpp */, - D0EC6B4B1EB9F42D00EBF1C3 /* AudioInput.h */, - D0EC6B4C1EB9F42D00EBF1C3 /* AudioOutput.cpp */, - D0EC6B4D1EB9F42D00EBF1C3 /* AudioOutput.h */, - D0EC6B4E1EB9F42D00EBF1C3 /* Resampler.cpp */, - D0EC6B4F1EB9F42D00EBF1C3 /* Resampler.h */, - ); - name = audio; - path = submodules/libtgvoip/audio; - sourceTree = ""; - }; - D0EC6B6B1EB9F42D00EBF1C3 /* os */ = { - isa = PBXGroup; - children = ( - D0EC6FF11EBA193800EBF1C3 /* posix */, - D0EC6B771EB9F42D00EBF1C3 /* darwin */, - ); - name = os; - path = submodules/libtgvoip/os; - sourceTree = ""; - }; - D0EC6B771EB9F42D00EBF1C3 /* darwin */ = { - isa = PBXGroup; - children = ( - D0943B0A1FDEF56E001522CC /* DarwinSpecific.h */, - D0943B091FDEF56D001522CC /* DarwinSpecific.mm */, - D0EC6B781EB9F42D00EBF1C3 /* AudioInputAudioUnit.cpp */, - D0EC6B791EB9F42D00EBF1C3 /* AudioInputAudioUnit.h */, - D0EC6B7C1EB9F42D00EBF1C3 /* AudioOutputAudioUnit.cpp */, - D0EC6B7D1EB9F42D00EBF1C3 /* AudioOutputAudioUnit.h */, - D0EC6B801EB9F42D00EBF1C3 /* AudioUnitIO.cpp */, - D0EC6B811EB9F42D00EBF1C3 /* AudioUnitIO.h */, - D0EC6B821EB9F42D00EBF1C3 /* TGLogWrapper.h */, - D0EC6B831EB9F42D00EBF1C3 /* TGLogWrapper.m */, - ); - path = darwin; - sourceTree = ""; - }; - D0EC6B981EB9F42D00EBF1C3 /* webrtc_dsp */ = { - isa = PBXGroup; - children = ( - D0EC6B991EB9F42D00EBF1C3 /* webrtc */, - ); - name = webrtc_dsp; - path = submodules/libtgvoip/webrtc_dsp; - sourceTree = ""; - }; - D0EC6B991EB9F42D00EBF1C3 /* webrtc */ = { - isa = PBXGroup; - children = ( - D0EC6B9A1EB9F42D00EBF1C3 /* base */, - D0EC6BA81EB9F42D00EBF1C3 /* common_audio */, - D0EC6BE91EB9F42D00EBF1C3 /* modules */, - D0EC6C281EB9F42E00EBF1C3 /* system_wrappers */, - D0EC6C301EB9F42E00EBF1C3 /* typedefs.h */, - ); - path = webrtc; - sourceTree = ""; - }; - D0EC6B9A1EB9F42D00EBF1C3 /* base */ = { - isa = PBXGroup; - children = ( - D0EC6B9B1EB9F42D00EBF1C3 /* array_view.h */, - D0EC6B9C1EB9F42D00EBF1C3 /* atomicops.h */, - D0EC6B9D1EB9F42D00EBF1C3 /* basictypes.h */, - D0EC6B9E1EB9F42D00EBF1C3 /* checks.cc */, - D0EC6B9F1EB9F42D00EBF1C3 /* checks.h */, - D0EC6BA01EB9F42D00EBF1C3 /* constructormagic.h */, - D0EC6BA11EB9F42D00EBF1C3 /* safe_compare.h */, - D0EC6BA21EB9F42D00EBF1C3 /* safe_conversions.h */, - D0EC6BA31EB9F42D00EBF1C3 /* safe_conversions_impl.h */, - D0EC6BA41EB9F42D00EBF1C3 /* sanitizer.h */, - D0EC6BA51EB9F42D00EBF1C3 /* stringutils.cc */, - D0EC6BA61EB9F42D00EBF1C3 /* stringutils.h */, - D0EC6BA71EB9F42D00EBF1C3 /* type_traits.h */, - ); - path = base; - sourceTree = ""; - }; - D0EC6BA81EB9F42D00EBF1C3 /* common_audio */ = { - isa = PBXGroup; - children = ( - D0EC6BA91EB9F42D00EBF1C3 /* audio_util.cc */, - D0EC6BAA1EB9F42D00EBF1C3 /* channel_buffer.cc */, - D0EC6BAB1EB9F42D00EBF1C3 /* channel_buffer.h */, - D0EC6BAC1EB9F42D00EBF1C3 /* fft4g.c */, - D0EC6BAD1EB9F42D00EBF1C3 /* fft4g.h */, - D0EC6BAE1EB9F42D00EBF1C3 /* include */, - D0EC6BB01EB9F42D00EBF1C3 /* ring_buffer.c */, - D0EC6BB11EB9F42D00EBF1C3 /* ring_buffer.h */, - D0EC6BB21EB9F42D00EBF1C3 /* signal_processing */, - D0EC6BE31EB9F42D00EBF1C3 /* sparse_fir_filter.cc */, - D0EC6BE41EB9F42D00EBF1C3 /* sparse_fir_filter.h */, - D0EC6BE51EB9F42D00EBF1C3 /* wav_file.cc */, - D0EC6BE61EB9F42D00EBF1C3 /* wav_file.h */, - D0EC6BE71EB9F42D00EBF1C3 /* wav_header.cc */, - D0EC6BE81EB9F42D00EBF1C3 /* wav_header.h */, - ); - path = common_audio; - sourceTree = ""; - }; - D0EC6BAE1EB9F42D00EBF1C3 /* include */ = { - isa = PBXGroup; - children = ( - D0EC6BAF1EB9F42D00EBF1C3 /* audio_util.h */, - ); - path = include; - sourceTree = ""; - }; - D0EC6BB21EB9F42D00EBF1C3 /* signal_processing */ = { - isa = PBXGroup; - children = ( - D0EC6BB31EB9F42D00EBF1C3 /* auto_corr_to_refl_coef.c */, - D0EC6BB41EB9F42D00EBF1C3 /* auto_correlation.c */, - D0EC6BB51EB9F42D00EBF1C3 /* complex_bit_reverse.c */, - D0EC6BB61EB9F42D00EBF1C3 /* complex_bit_reverse_arm.S */, - D0EC6BB71EB9F42D00EBF1C3 /* complex_fft.c */, - D0EC6BB81EB9F42D00EBF1C3 /* complex_fft_tables.h */, - D0EC6BB91EB9F42D00EBF1C3 /* copy_set_operations.c */, - D0EC6BBA1EB9F42D00EBF1C3 /* cross_correlation.c */, - D0EC6BBB1EB9F42D00EBF1C3 /* cross_correlation_neon.c */, - D0EC6BBC1EB9F42D00EBF1C3 /* division_operations.c */, - D0EC6BBD1EB9F42D00EBF1C3 /* dot_product_with_scale.c */, - D0EC6BBE1EB9F42D00EBF1C3 /* downsample_fast.c */, - D0EC6BBF1EB9F42D00EBF1C3 /* downsample_fast_neon.c */, - D0EC6BC01EB9F42D00EBF1C3 /* energy.c */, - D0EC6BC11EB9F42D00EBF1C3 /* filter_ar.c */, - D0EC6BC21EB9F42D00EBF1C3 /* filter_ar_fast_q12.c */, - D0EC6BC31EB9F42D00EBF1C3 /* filter_ar_fast_q12_armv7.S */, - D0EC6BC41EB9F42D00EBF1C3 /* filter_ma_fast_q12.c */, - D0EC6BC51EB9F42D00EBF1C3 /* get_hanning_window.c */, - D0EC6BC61EB9F42D00EBF1C3 /* get_scaling_square.c */, - D0EC6BC71EB9F42D00EBF1C3 /* ilbc_specific_functions.c */, - D0EC6BC81EB9F42D00EBF1C3 /* include */, - D0EC6BCE1EB9F42D00EBF1C3 /* levinson_durbin.c */, - D0EC6BCF1EB9F42D00EBF1C3 /* lpc_to_refl_coef.c */, - D0EC6BD01EB9F42D00EBF1C3 /* min_max_operations.c */, - D0EC6BD11EB9F42D00EBF1C3 /* min_max_operations_neon.c */, - D0EC6BD21EB9F42D00EBF1C3 /* randomization_functions.c */, - D0EC6BD31EB9F42D00EBF1C3 /* real_fft.c */, - D0EC6BD41EB9F42D00EBF1C3 /* refl_coef_to_lpc.c */, - D0EC6BD51EB9F42D00EBF1C3 /* resample.c */, - D0EC6BD61EB9F42D00EBF1C3 /* resample_48khz.c */, - D0EC6BD71EB9F42D00EBF1C3 /* resample_by_2.c */, - D0EC6BD81EB9F42D00EBF1C3 /* resample_by_2_internal.c */, - D0EC6BD91EB9F42D00EBF1C3 /* resample_by_2_internal.h */, - D0EC6BDA1EB9F42D00EBF1C3 /* resample_fractional.c */, - D0EC6BDB1EB9F42D00EBF1C3 /* spl_init.c */, - D0EC6BDC1EB9F42D00EBF1C3 /* spl_inl.c */, - D0EC6BDD1EB9F42D00EBF1C3 /* spl_sqrt.c */, - D0EC6BDE1EB9F42D00EBF1C3 /* spl_sqrt_floor.c */, - D0EC6BDF1EB9F42D00EBF1C3 /* spl_sqrt_floor_arm.S */, - D0EC6BE01EB9F42D00EBF1C3 /* splitting_filter_impl.c */, - D0EC6BE11EB9F42D00EBF1C3 /* sqrt_of_one_minus_x_squared.c */, - D0EC6BE21EB9F42D00EBF1C3 /* vector_scaling_operations.c */, - ); - path = signal_processing; - sourceTree = ""; - }; - D0EC6BC81EB9F42D00EBF1C3 /* include */ = { - isa = PBXGroup; - children = ( - D0EC6BC91EB9F42D00EBF1C3 /* real_fft.h */, - D0EC6BCA1EB9F42D00EBF1C3 /* signal_processing_library.h */, - D0EC6BCB1EB9F42D00EBF1C3 /* spl_inl.h */, - D0EC6BCC1EB9F42D00EBF1C3 /* spl_inl_armv7.h */, - D0EC6BCD1EB9F42D00EBF1C3 /* spl_inl_mips.h */, - ); - path = include; - sourceTree = ""; - }; - D0EC6BE91EB9F42D00EBF1C3 /* modules */ = { - isa = PBXGroup; - children = ( - D0EC6BEA1EB9F42D00EBF1C3 /* audio_processing */, - ); - path = modules; - sourceTree = ""; - }; - D0EC6BEA1EB9F42D00EBF1C3 /* audio_processing */ = { - isa = PBXGroup; - children = ( - D0EC6BEB1EB9F42D00EBF1C3 /* aec */, - D0EC6BF61EB9F42D00EBF1C3 /* aecm */, - D0EC6BFE1EB9F42D00EBF1C3 /* agc */, - D0EC6C051EB9F42D00EBF1C3 /* logging */, - D0EC6C081EB9F42D00EBF1C3 /* ns */, - D0EC6C161EB9F42E00EBF1C3 /* splitting_filter.cc */, - D0EC6C171EB9F42E00EBF1C3 /* splitting_filter.h */, - D0EC6C181EB9F42E00EBF1C3 /* three_band_filter_bank.cc */, - D0EC6C191EB9F42E00EBF1C3 /* three_band_filter_bank.h */, - D0EC6C1A1EB9F42E00EBF1C3 /* utility */, - ); - path = audio_processing; - sourceTree = ""; - }; - D0EC6BEB1EB9F42D00EBF1C3 /* aec */ = { - isa = PBXGroup; - children = ( - D0EC6BEC1EB9F42D00EBF1C3 /* aec_common.h */, - D0EC6BED1EB9F42D00EBF1C3 /* aec_core.cc */, - D0EC6BEE1EB9F42D00EBF1C3 /* aec_core.h */, - D0EC6BEF1EB9F42D00EBF1C3 /* aec_core_neon.cc */, - D0EC6BF01EB9F42D00EBF1C3 /* aec_core_optimized_methods.h */, - D0EC6BF11EB9F42D00EBF1C3 /* aec_core_sse2.cc */, - D0EC6BF21EB9F42D00EBF1C3 /* aec_resampler.cc */, - D0EC6BF31EB9F42D00EBF1C3 /* aec_resampler.h */, - D0EC6BF41EB9F42D00EBF1C3 /* echo_cancellation.cc */, - D0EC6BF51EB9F42D00EBF1C3 /* echo_cancellation.h */, - ); - path = aec; - sourceTree = ""; - }; - D0EC6BF61EB9F42D00EBF1C3 /* aecm */ = { - isa = PBXGroup; - children = ( - D0EC6BF71EB9F42D00EBF1C3 /* aecm_core.cc */, - D0EC6BF81EB9F42D00EBF1C3 /* aecm_core.h */, - D0EC6BF91EB9F42D00EBF1C3 /* aecm_core_c.cc */, - D0EC6BFA1EB9F42D00EBF1C3 /* aecm_core_neon.cc */, - D0EC6BFB1EB9F42D00EBF1C3 /* aecm_defines.h */, - D0EC6BFC1EB9F42D00EBF1C3 /* echo_control_mobile.cc */, - D0EC6BFD1EB9F42D00EBF1C3 /* echo_control_mobile.h */, - ); - path = aecm; - sourceTree = ""; - }; - D0EC6BFE1EB9F42D00EBF1C3 /* agc */ = { - isa = PBXGroup; - children = ( - D0EC6BFF1EB9F42D00EBF1C3 /* legacy */, - ); - path = agc; - sourceTree = ""; - }; - D0EC6BFF1EB9F42D00EBF1C3 /* legacy */ = { - isa = PBXGroup; - children = ( - D0EC6C001EB9F42D00EBF1C3 /* analog_agc.c */, - D0EC6C011EB9F42D00EBF1C3 /* analog_agc.h */, - D0EC6C021EB9F42D00EBF1C3 /* digital_agc.c */, - D0EC6C031EB9F42D00EBF1C3 /* digital_agc.h */, - D0EC6C041EB9F42D00EBF1C3 /* gain_control.h */, - ); - path = legacy; - sourceTree = ""; - }; - D0EC6C051EB9F42D00EBF1C3 /* logging */ = { - isa = PBXGroup; - children = ( - D0EC6C061EB9F42D00EBF1C3 /* apm_data_dumper.cc */, - D0EC6C071EB9F42D00EBF1C3 /* apm_data_dumper.h */, - ); - path = logging; - sourceTree = ""; - }; - D0EC6C081EB9F42D00EBF1C3 /* ns */ = { - isa = PBXGroup; - children = ( - D0EC6C091EB9F42D00EBF1C3 /* defines.h */, - D0EC6C0A1EB9F42D00EBF1C3 /* noise_suppression.c */, - D0EC6C0B1EB9F42D00EBF1C3 /* noise_suppression.h */, - D0EC6C0C1EB9F42D00EBF1C3 /* noise_suppression_x.c */, - D0EC6C0D1EB9F42D00EBF1C3 /* noise_suppression_x.h */, - D0EC6C0E1EB9F42D00EBF1C3 /* ns_core.c */, - D0EC6C0F1EB9F42D00EBF1C3 /* ns_core.h */, - D0EC6C101EB9F42D00EBF1C3 /* nsx_core.c */, - D0EC6C111EB9F42D00EBF1C3 /* nsx_core.h */, - D0EC6C121EB9F42D00EBF1C3 /* nsx_core_c.c */, - D0EC6C131EB9F42D00EBF1C3 /* nsx_core_neon.c */, - D0EC6C141EB9F42E00EBF1C3 /* nsx_defines.h */, - D0EC6C151EB9F42E00EBF1C3 /* windows_private.h */, - ); - path = ns; - sourceTree = ""; - }; - D0EC6C1A1EB9F42E00EBF1C3 /* utility */ = { - isa = PBXGroup; - children = ( - D0EC6C1B1EB9F42E00EBF1C3 /* block_mean_calculator.cc */, - D0EC6C1C1EB9F42E00EBF1C3 /* block_mean_calculator.h */, - D0EC6C1D1EB9F42E00EBF1C3 /* delay_estimator.cc */, - D0EC6C1E1EB9F42E00EBF1C3 /* delay_estimator.h */, - D0EC6C1F1EB9F42E00EBF1C3 /* delay_estimator_internal.h */, - D0EC6C201EB9F42E00EBF1C3 /* delay_estimator_wrapper.cc */, - D0EC6C211EB9F42E00EBF1C3 /* delay_estimator_wrapper.h */, - D0EC6C221EB9F42E00EBF1C3 /* ooura_fft.cc */, - D0EC6C231EB9F42E00EBF1C3 /* ooura_fft.h */, - D0EC6C241EB9F42E00EBF1C3 /* ooura_fft_neon.cc */, - D0EC6C251EB9F42E00EBF1C3 /* ooura_fft_sse2.cc */, - D0EC6C261EB9F42E00EBF1C3 /* ooura_fft_tables_common.h */, - D0EC6C271EB9F42E00EBF1C3 /* ooura_fft_tables_neon_sse2.h */, - ); - path = utility; - sourceTree = ""; - }; - D0EC6C281EB9F42E00EBF1C3 /* system_wrappers */ = { - isa = PBXGroup; - children = ( - D0EC6C291EB9F42E00EBF1C3 /* include */, - D0EC6C2E1EB9F42E00EBF1C3 /* source */, - ); - path = system_wrappers; - sourceTree = ""; - }; - D0EC6C291EB9F42E00EBF1C3 /* include */ = { - isa = PBXGroup; - children = ( - D0EC6C2A1EB9F42E00EBF1C3 /* asm_defines.h */, - D0EC6C2B1EB9F42E00EBF1C3 /* compile_assert_c.h */, - D0EC6C2C1EB9F42E00EBF1C3 /* cpu_features_wrapper.h */, - D0EC6C2D1EB9F42E00EBF1C3 /* metrics.h */, - ); - path = include; - sourceTree = ""; - }; - D0EC6C2E1EB9F42E00EBF1C3 /* source */ = { - isa = PBXGroup; - children = ( - D0EC6C2F1EB9F42E00EBF1C3 /* cpu_features.cc */, - ); - path = source; - sourceTree = ""; - }; - D0EC6EBE1EBA10BB00EBF1C3 /* webrtc_dsp */ = { - isa = PBXGroup; - children = ( - D0EC6EBF1EBA10BB00EBF1C3 /* webrtc */, - ); - name = webrtc_dsp; - path = submodules/libtgvoip/webrtc_dsp; - sourceTree = ""; - }; - D0EC6EBF1EBA10BB00EBF1C3 /* webrtc */ = { - isa = PBXGroup; - children = ( - D0EC6EC01EBA10BB00EBF1C3 /* base */, - D0EC6ECE1EBA10BB00EBF1C3 /* common_audio */, - D0EC6F0F1EBA10BB00EBF1C3 /* modules */, - D0EC6F4E1EBA10BB00EBF1C3 /* system_wrappers */, - D0EC6F561EBA10BB00EBF1C3 /* typedefs.h */, - ); - path = webrtc; - sourceTree = ""; - }; - D0EC6EC01EBA10BB00EBF1C3 /* base */ = { - isa = PBXGroup; - children = ( - D0EC6EC11EBA10BB00EBF1C3 /* array_view.h */, - D0EC6EC21EBA10BB00EBF1C3 /* atomicops.h */, - D0EC6EC31EBA10BB00EBF1C3 /* basictypes.h */, - D0EC6EC41EBA10BB00EBF1C3 /* checks.cc */, - D0EC6EC51EBA10BB00EBF1C3 /* checks.h */, - D0EC6EC61EBA10BB00EBF1C3 /* constructormagic.h */, - D0EC6EC71EBA10BB00EBF1C3 /* safe_compare.h */, - D0EC6EC81EBA10BB00EBF1C3 /* safe_conversions.h */, - D0EC6EC91EBA10BB00EBF1C3 /* safe_conversions_impl.h */, - D0EC6ECA1EBA10BB00EBF1C3 /* sanitizer.h */, - D0EC6ECB1EBA10BB00EBF1C3 /* stringutils.cc */, - D0EC6ECC1EBA10BB00EBF1C3 /* stringutils.h */, - D0EC6ECD1EBA10BB00EBF1C3 /* type_traits.h */, - ); - path = base; - sourceTree = ""; - }; - D0EC6ECE1EBA10BB00EBF1C3 /* common_audio */ = { - isa = PBXGroup; - children = ( - D0EC6ECF1EBA10BB00EBF1C3 /* audio_util.cc */, - D0EC6ED01EBA10BB00EBF1C3 /* channel_buffer.cc */, - D0EC6ED11EBA10BB00EBF1C3 /* channel_buffer.h */, - D0EC6ED21EBA10BB00EBF1C3 /* fft4g.c */, - D0EC6ED31EBA10BB00EBF1C3 /* fft4g.h */, - D0EC6ED41EBA10BB00EBF1C3 /* include */, - D0EC6ED61EBA10BB00EBF1C3 /* ring_buffer.c */, - D0EC6ED71EBA10BB00EBF1C3 /* ring_buffer.h */, - D0EC6ED81EBA10BB00EBF1C3 /* signal_processing */, - D0EC6F091EBA10BB00EBF1C3 /* sparse_fir_filter.cc */, - D0EC6F0A1EBA10BB00EBF1C3 /* sparse_fir_filter.h */, - D0EC6F0B1EBA10BB00EBF1C3 /* wav_file.cc */, - D0EC6F0C1EBA10BB00EBF1C3 /* wav_file.h */, - D0EC6F0D1EBA10BB00EBF1C3 /* wav_header.cc */, - D0EC6F0E1EBA10BB00EBF1C3 /* wav_header.h */, - ); - path = common_audio; - sourceTree = ""; - }; - D0EC6ED41EBA10BB00EBF1C3 /* include */ = { - isa = PBXGroup; - children = ( - D0EC6ED51EBA10BB00EBF1C3 /* audio_util.h */, - ); - path = include; - sourceTree = ""; - }; - D0EC6ED81EBA10BB00EBF1C3 /* signal_processing */ = { - isa = PBXGroup; - children = ( - D0EC6ED91EBA10BB00EBF1C3 /* auto_corr_to_refl_coef.c */, - D0EC6EDA1EBA10BB00EBF1C3 /* auto_correlation.c */, - D0EC6EDB1EBA10BB00EBF1C3 /* complex_bit_reverse.c */, - D0EC6EDC1EBA10BB00EBF1C3 /* complex_bit_reverse_arm.S */, - D0EC6EDD1EBA10BB00EBF1C3 /* complex_fft.c */, - D0EC6EDE1EBA10BB00EBF1C3 /* complex_fft_tables.h */, - D0EC6EDF1EBA10BB00EBF1C3 /* copy_set_operations.c */, - D0EC6EE01EBA10BB00EBF1C3 /* cross_correlation.c */, - D0EC6EE11EBA10BB00EBF1C3 /* cross_correlation_neon.c */, - D0EC6EE21EBA10BB00EBF1C3 /* division_operations.c */, - D0EC6EE31EBA10BB00EBF1C3 /* dot_product_with_scale.c */, - D0EC6EE41EBA10BB00EBF1C3 /* downsample_fast.c */, - D0EC6EE51EBA10BB00EBF1C3 /* downsample_fast_neon.c */, - D0EC6EE61EBA10BB00EBF1C3 /* energy.c */, - D0EC6EE71EBA10BB00EBF1C3 /* filter_ar.c */, - D0EC6EE81EBA10BB00EBF1C3 /* filter_ar_fast_q12.c */, - D0EC6EE91EBA10BB00EBF1C3 /* filter_ar_fast_q12_armv7.S */, - D0EC6EEA1EBA10BB00EBF1C3 /* filter_ma_fast_q12.c */, - D0EC6EEB1EBA10BB00EBF1C3 /* get_hanning_window.c */, - D0EC6EEC1EBA10BB00EBF1C3 /* get_scaling_square.c */, - D0EC6EED1EBA10BB00EBF1C3 /* ilbc_specific_functions.c */, - D0EC6EEE1EBA10BB00EBF1C3 /* include */, - D0EC6EF41EBA10BB00EBF1C3 /* levinson_durbin.c */, - D0EC6EF51EBA10BB00EBF1C3 /* lpc_to_refl_coef.c */, - D0EC6EF61EBA10BB00EBF1C3 /* min_max_operations.c */, - D0EC6EF71EBA10BB00EBF1C3 /* min_max_operations_neon.c */, - D0EC6EF81EBA10BB00EBF1C3 /* randomization_functions.c */, - D0EC6EF91EBA10BB00EBF1C3 /* real_fft.c */, - D0EC6EFA1EBA10BB00EBF1C3 /* refl_coef_to_lpc.c */, - D0EC6EFB1EBA10BB00EBF1C3 /* resample.c */, - D0EC6EFC1EBA10BB00EBF1C3 /* resample_48khz.c */, - D0EC6EFD1EBA10BB00EBF1C3 /* resample_by_2.c */, - D0EC6EFE1EBA10BB00EBF1C3 /* resample_by_2_internal.c */, - D0EC6EFF1EBA10BB00EBF1C3 /* resample_by_2_internal.h */, - D0EC6F001EBA10BB00EBF1C3 /* resample_fractional.c */, - D0EC6F011EBA10BB00EBF1C3 /* spl_init.c */, - D0EC6F021EBA10BB00EBF1C3 /* spl_inl.c */, - D0EC6F031EBA10BB00EBF1C3 /* spl_sqrt.c */, - D0EC6F041EBA10BB00EBF1C3 /* spl_sqrt_floor.c */, - D0EC6F051EBA10BB00EBF1C3 /* spl_sqrt_floor_arm.S */, - D0EC6F061EBA10BB00EBF1C3 /* splitting_filter_impl.c */, - D0EC6F071EBA10BB00EBF1C3 /* sqrt_of_one_minus_x_squared.c */, - D0EC6F081EBA10BB00EBF1C3 /* vector_scaling_operations.c */, - ); - path = signal_processing; - sourceTree = ""; - }; - D0EC6EEE1EBA10BB00EBF1C3 /* include */ = { - isa = PBXGroup; - children = ( - D0EC6EEF1EBA10BB00EBF1C3 /* real_fft.h */, - D0EC6EF01EBA10BB00EBF1C3 /* signal_processing_library.h */, - D0EC6EF11EBA10BB00EBF1C3 /* spl_inl.h */, - D0EC6EF21EBA10BB00EBF1C3 /* spl_inl_armv7.h */, - D0EC6EF31EBA10BB00EBF1C3 /* spl_inl_mips.h */, - ); - path = include; - sourceTree = ""; - }; - D0EC6F0F1EBA10BB00EBF1C3 /* modules */ = { - isa = PBXGroup; - children = ( - D0EC6F101EBA10BB00EBF1C3 /* audio_processing */, - ); - path = modules; - sourceTree = ""; - }; - D0EC6F101EBA10BB00EBF1C3 /* audio_processing */ = { - isa = PBXGroup; - children = ( - D0EC6F111EBA10BB00EBF1C3 /* aec */, - D0EC6F1C1EBA10BB00EBF1C3 /* aecm */, - D0EC6F241EBA10BB00EBF1C3 /* agc */, - D0EC6F2B1EBA10BB00EBF1C3 /* logging */, - D0EC6F2E1EBA10BB00EBF1C3 /* ns */, - D0EC6F3C1EBA10BB00EBF1C3 /* splitting_filter.cc */, - D0EC6F3D1EBA10BB00EBF1C3 /* splitting_filter.h */, - D0EC6F3E1EBA10BB00EBF1C3 /* three_band_filter_bank.cc */, - D0EC6F3F1EBA10BB00EBF1C3 /* three_band_filter_bank.h */, - D0EC6F401EBA10BB00EBF1C3 /* utility */, - ); - path = audio_processing; - sourceTree = ""; - }; - D0EC6F111EBA10BB00EBF1C3 /* aec */ = { - isa = PBXGroup; - children = ( - D0EC6F121EBA10BB00EBF1C3 /* aec_common.h */, - D0EC6F131EBA10BB00EBF1C3 /* aec_core.cc */, - D0EC6F141EBA10BB00EBF1C3 /* aec_core.h */, - D0EC6F151EBA10BB00EBF1C3 /* aec_core_neon.cc */, - D0EC6F161EBA10BB00EBF1C3 /* aec_core_optimized_methods.h */, - D0EC6F171EBA10BB00EBF1C3 /* aec_core_sse2.cc */, - D0EC6F181EBA10BB00EBF1C3 /* aec_resampler.cc */, - D0EC6F191EBA10BB00EBF1C3 /* aec_resampler.h */, - D0EC6F1A1EBA10BB00EBF1C3 /* echo_cancellation.cc */, - D0EC6F1B1EBA10BB00EBF1C3 /* echo_cancellation.h */, - ); - path = aec; - sourceTree = ""; - }; - D0EC6F1C1EBA10BB00EBF1C3 /* aecm */ = { - isa = PBXGroup; - children = ( - D0EC6F1D1EBA10BB00EBF1C3 /* aecm_core.cc */, - D0EC6F1E1EBA10BB00EBF1C3 /* aecm_core.h */, - D0EC6F1F1EBA10BB00EBF1C3 /* aecm_core_c.cc */, - D0EC6F201EBA10BB00EBF1C3 /* aecm_core_neon.cc */, - D0EC6F211EBA10BB00EBF1C3 /* aecm_defines.h */, - D0EC6F221EBA10BB00EBF1C3 /* echo_control_mobile.cc */, - D0EC6F231EBA10BB00EBF1C3 /* echo_control_mobile.h */, - ); - path = aecm; - sourceTree = ""; - }; - D0EC6F241EBA10BB00EBF1C3 /* agc */ = { - isa = PBXGroup; - children = ( - D0EC6F251EBA10BB00EBF1C3 /* legacy */, - ); - path = agc; - sourceTree = ""; - }; - D0EC6F251EBA10BB00EBF1C3 /* legacy */ = { - isa = PBXGroup; - children = ( - D0EC6F261EBA10BB00EBF1C3 /* analog_agc.c */, - D0EC6F271EBA10BB00EBF1C3 /* analog_agc.h */, - D0EC6F281EBA10BB00EBF1C3 /* digital_agc.c */, - D0EC6F291EBA10BB00EBF1C3 /* digital_agc.h */, - D0EC6F2A1EBA10BB00EBF1C3 /* gain_control.h */, - ); - path = legacy; - sourceTree = ""; - }; - D0EC6F2B1EBA10BB00EBF1C3 /* logging */ = { - isa = PBXGroup; - children = ( - D0EC6F2C1EBA10BB00EBF1C3 /* apm_data_dumper.cc */, - D0EC6F2D1EBA10BB00EBF1C3 /* apm_data_dumper.h */, - ); - path = logging; - sourceTree = ""; - }; - D0EC6F2E1EBA10BB00EBF1C3 /* ns */ = { - isa = PBXGroup; - children = ( - D0EC6F2F1EBA10BB00EBF1C3 /* defines.h */, - D0EC6F301EBA10BB00EBF1C3 /* noise_suppression.c */, - D0EC6F311EBA10BB00EBF1C3 /* noise_suppression.h */, - D0EC6F321EBA10BB00EBF1C3 /* noise_suppression_x.c */, - D0EC6F331EBA10BB00EBF1C3 /* noise_suppression_x.h */, - D0EC6F341EBA10BB00EBF1C3 /* ns_core.c */, - D0EC6F351EBA10BB00EBF1C3 /* ns_core.h */, - D0EC6F361EBA10BB00EBF1C3 /* nsx_core.c */, - D0EC6F371EBA10BB00EBF1C3 /* nsx_core.h */, - D0EC6F381EBA10BB00EBF1C3 /* nsx_core_c.c */, - D0EC6F391EBA10BB00EBF1C3 /* nsx_core_neon.c */, - D0EC6F3A1EBA10BB00EBF1C3 /* nsx_defines.h */, - D0EC6F3B1EBA10BB00EBF1C3 /* windows_private.h */, - ); - path = ns; - sourceTree = ""; - }; - D0EC6F401EBA10BB00EBF1C3 /* utility */ = { - isa = PBXGroup; - children = ( - D0EC6F411EBA10BB00EBF1C3 /* block_mean_calculator.cc */, - D0EC6F421EBA10BB00EBF1C3 /* block_mean_calculator.h */, - D0EC6F431EBA10BB00EBF1C3 /* delay_estimator.cc */, - D0EC6F441EBA10BB00EBF1C3 /* delay_estimator.h */, - D0EC6F451EBA10BB00EBF1C3 /* delay_estimator_internal.h */, - D0EC6F461EBA10BB00EBF1C3 /* delay_estimator_wrapper.cc */, - D0EC6F471EBA10BB00EBF1C3 /* delay_estimator_wrapper.h */, - D0EC6F481EBA10BB00EBF1C3 /* ooura_fft.cc */, - D0EC6F491EBA10BB00EBF1C3 /* ooura_fft.h */, - D0EC6F4A1EBA10BB00EBF1C3 /* ooura_fft_neon.cc */, - D0EC6F4B1EBA10BB00EBF1C3 /* ooura_fft_sse2.cc */, - D0EC6F4C1EBA10BB00EBF1C3 /* ooura_fft_tables_common.h */, - D0EC6F4D1EBA10BB00EBF1C3 /* ooura_fft_tables_neon_sse2.h */, - ); - path = utility; - sourceTree = ""; - }; - D0EC6F4E1EBA10BB00EBF1C3 /* system_wrappers */ = { - isa = PBXGroup; - children = ( - D0EC6F4F1EBA10BB00EBF1C3 /* include */, - D0EC6F541EBA10BB00EBF1C3 /* source */, - ); - path = system_wrappers; - sourceTree = ""; - }; - D0EC6F4F1EBA10BB00EBF1C3 /* include */ = { - isa = PBXGroup; - children = ( - D0EC6F501EBA10BB00EBF1C3 /* asm_defines.h */, - D0EC6F511EBA10BB00EBF1C3 /* compile_assert_c.h */, - D0EC6F521EBA10BB00EBF1C3 /* cpu_features_wrapper.h */, - D0EC6F531EBA10BB00EBF1C3 /* metrics.h */, - ); - path = include; - sourceTree = ""; - }; - D0EC6F541EBA10BB00EBF1C3 /* source */ = { - isa = PBXGroup; - children = ( - D0EC6F551EBA10BB00EBF1C3 /* cpu_features.cc */, - ); - path = source; - sourceTree = ""; - }; - D0EC6FF11EBA193800EBF1C3 /* posix */ = { - isa = PBXGroup; - children = ( - D0EC6FF21EBA193800EBF1C3 /* NetworkSocketPosix.cpp */, - D0EC6FF31EBA193800EBF1C3 /* NetworkSocketPosix.h */, - ); - path = posix; - sourceTree = ""; - }; D0EC6FF71EBA1DAE00EBF1C3 /* Calls */ = { isa = PBXGroup; children = ( @@ -4552,6 +3422,7 @@ D0EF40DE1E73100D000DFCD4 /* ChatHistoryNavigationStack.swift */, D01C2AA01E758F90001F6F9A /* NavigateToChatController.swift */, D06E0F8D1F79ABFB003CF3DD /* ChatLoadingNode.swift */, + D00ACA57202285090045D427 /* ChatRestrictedNode.swift */, D0AF32391FB1D8D60097362B /* ChatOverlayNavigationBar.swift */, D0F69E181D6B8AD10046BCD6 /* Items */, D03ADB461D703250005A521C /* Interface State */, @@ -4737,6 +3608,8 @@ D0F69E7E1D6B8C500046BCD6 /* Supporting Files */ = { isa = PBXGroup; children = ( + D007019F2029F6D0006B9E34 /* TGMimeTypeMap.h */, + D00701A02029F6D0006B9E34 /* TGMimeTypeMap.m */, D0F69E981D6B8D200046BCD6 /* UIImage+WebP.h */, D0F69E991D6B8D200046BCD6 /* UIImage+WebP.m */, D0F69E7F1D6B8C850046BCD6 /* FastBlur.h */, @@ -4804,6 +3677,7 @@ D0C26D561FDF2388004ABF18 /* OpenChatMessage.swift */, D04ECD711FFBF22B00DE9029 /* OpenUrl.swift */, D0FC194C201F82A000FEDBB2 /* OpenResolvedUrl.swift */, + D00ACA592022897D0045D427 /* ProcessedPeerRestrictionText.swift */, ); name = Utils; sourceTree = ""; @@ -4824,6 +3698,7 @@ D04B4D101EEA04D400711AF6 /* MapResources.swift */, D0FB87B11F7C4C19004DE005 /* FetchMediaUtils.swift */, D056CD731FF2996B00880D28 /* ExternalMusicAlbumArtResources.swift */, + D007019D2029EFDD006B9E34 /* ICloudResources.swift */, ); name = Resources; sourceTree = ""; @@ -4869,7 +3744,6 @@ isa = PBXGroup; children = ( D0EB42041F3143AB00838FE6 /* LegacyComponentsResources.bundle */, - D0EC6B481EB9F3E800EBF1C3 /* libtgvoip */, D0F69DB91D6B88190046BCD6 /* TelegramUI.xcconfig */, D0AB0BBA1D6719B5002C78E7 /* Images.xcassets */, D0471B521EFD8EBC0074D609 /* Resources */, @@ -4937,13 +3811,9 @@ D0E9BA511F0559DA00F079A4 /* STPImageLibrary.h in Headers */, D0E9BA4C1F0559C700F079A4 /* NSString+Stripe_CardBrands.h in Headers */, D0E9BAE11F0574D800F079A4 /* STPBankAccount.h in Headers */, - D0EC6FE91EBA15D500EBF1C3 /* signal_processing_library.h in Headers */, D0E9BACE1F0573AF00F079A4 /* STPBlocks.h in Headers */, D0E9BA2A1F0557A600F079A4 /* STPFormEncoder.h in Headers */, D0E9BA321F05583A00F079A4 /* STPPostalCodeValidator.h in Headers */, - D0EC6FE81EBA138700EBF1C3 /* ooura_fft.h in Headers */, - D0943B081FDEEF27001522CC /* TGLogWrapper.h in Headers */, - D0943B0C1FDEF56E001522CC /* DarwinSpecific.h in Headers */, D0E9BADC1F0574D800F079A4 /* PKPayment+Stripe.h in Headers */, D0E9BA491F0559B600F079A4 /* STPPaymentMethod.h in Headers */, D08803C51F6064CF00DD7951 /* TelegramUI.h in Headers */, @@ -4951,6 +3821,7 @@ D0EB42001F30ED4F00838FE6 /* LegacyImageProcessors.h in Headers */, D0E9BA291F0557A600F079A4 /* STPFormEncodable.h in Headers */, D0E9BA141F05574500F079A4 /* STPCardValidationState.h in Headers */, + D00701A12029F6D0006B9E34 /* TGMimeTypeMap.h in Headers */, D0E9BA461F0559A500F079A4 /* NSDictionary+Stripe.h in Headers */, D0208AD91FA34017001F0D5F /* DeviceProximityManager.h in Headers */, D0E9BAC61F05738600F079A4 /* STPAPIClient.h in Headers */, @@ -5131,7 +4002,6 @@ D0EC6CAE1EB9F58800EBF1C3 /* animations.c in Sources */, D0FE4DDC1F09AD0400E8A0B3 /* PresentationSurfaceLevels.swift in Sources */, D0EC6CAF1EB9F58800EBF1C3 /* buffer.c in Sources */, - D0EC6FF01EBA18EB00EBF1C3 /* VoIPServerConfig.cpp in Sources */, D0EC6CB01EB9F58800EBF1C3 /* objects.c in Sources */, D0EC6CB11EB9F58800EBF1C3 /* program.c in Sources */, D0EC6CB21EB9F58800EBF1C3 /* rngs.c in Sources */, @@ -5143,7 +4013,6 @@ D0EC6CB61EB9F58800EBF1C3 /* RMGeometry.m in Sources */, D079FCDD1F05C4F20038FADE /* LocalAuth.swift in Sources */, D0EC6CB71EB9F58800EBF1C3 /* RMIntroPageView.m in Sources */, - D0EC6FCB1EBA135100EBF1C3 /* dot_product_with_scale.c in Sources */, D0EC6CB81EB9F58800EBF1C3 /* RMIntroViewController.m in Sources */, D0EC6CB91EB9F58800EBF1C3 /* RMLoginViewController.m in Sources */, D0E9BA631F055AD200F079A4 /* BotPaymentCardInputItemNode.swift in Sources */, @@ -5154,32 +4023,26 @@ D0EC6CBC1EB9F58800EBF1C3 /* LegacyController.swift in Sources */, D0EC6CBD1EB9F58800EBF1C3 /* LegacyControllerNode.swift in Sources */, D079FCE91F06A76C0038FADE /* Notices.swift in Sources */, - D0EC6EAF1EBA0FBB00EBF1C3 /* MediaStreamItf.cpp in Sources */, D0C0B5B71EE1DEF1000F4D2C /* ThemeGridControllerItem.swift in Sources */, D0EC6CBE1EB9F58800EBF1C3 /* TelegramInitializeLegacyComponents.swift in Sources */, D0EC6CBF1EB9F58800EBF1C3 /* LegacyAttachmentMenu.swift in Sources */, D0943B001FDAE852001522CC /* ChatFeedNavigationInputPanelNode.swift in Sources */, D0B37C601F8D286E004252DF /* ThemeSettingsFontSizeItem.swift in Sources */, - D0EC6FB51EBA114200EBF1C3 /* echo_cancellation.cc in Sources */, D0EC6CC01EB9F58800EBF1C3 /* LegacyMediaPickers.swift in Sources */, D0AF7C4A1ED84CE000CD8E0F /* LanguageSelectionControllerNode.swift in Sources */, D0EC6CC11EB9F58800EBF1C3 /* LegacyCamera.swift in Sources */, D0754D1E1EEDDF6200884F6E /* ChatMessageAttachedContentNode.swift in Sources */, D0E9BAC71F05738600F079A4 /* STPAPIClient.m in Sources */, D0CFBB911FD881A600B65C0D /* AudioRecordningToneData.swift in Sources */, - D0EC6FEC1EBA182B00EBF1C3 /* aec_core_sse2.cc in Sources */, D089F78A1F4E0C14000E934D /* InstantPagePresentationSettings.swift in Sources */, D01776B51F1D6CCC0044446D /* RadialStatusContentNode.swift in Sources */, D02F4AF01FD4C46D004DFBAE /* SystemVideoContent.swift in Sources */, - D0EC6FC81EBA135100EBF1C3 /* cross_correlation.c in Sources */, D0477D1F1F619E0700412B44 /* GalleryVideoDecoration.swift in Sources */, D01C99781F4F382C00DCFAF6 /* InstantPageSettingsItemTheme.swift in Sources */, - D0EC6FB11EBA112600EBF1C3 /* ooura_fft_neon.cc in Sources */, D0EC6CC21EB9F58800EBF1C3 /* LegacyEmptyController.swift in Sources */, D0EC6CC31EB9F58800EBF1C3 /* LegacyNavigationController.swift in Sources */, D0EC6CC41EB9F58800EBF1C3 /* LegacyLocationPicker.swift in Sources */, D0EC6CC51EB9F58800EBF1C3 /* TGDataItem.m in Sources */, - D0EC6FA41EBA10EA00EBF1C3 /* stringutils.cc in Sources */, D0EC6CC61EB9F58800EBF1C3 /* PresenceStrings.swift in Sources */, D0EC6CC71EB9F58800EBF1C3 /* PeerNotificationSoundStrings.swift in Sources */, D01C06C01FBF118A001561AB /* MessageUtils.swift in Sources */, @@ -5188,23 +4051,17 @@ D0EC6CC91EB9F58800EBF1C3 /* WebP.swift in Sources */, D0EC6CCA1EB9F58800EBF1C3 /* PeerPresenceStatusManager.swift in Sources */, D0EC6CCB1EB9F58800EBF1C3 /* ApplicationSpecificData.swift in Sources */, - D0EC6FB21EBA114200EBF1C3 /* aec_core.cc in Sources */, - D0EC6FE01EBA135100EBF1C3 /* resample_fractional.c in Sources */, D09E637F1F0E8C9F003444CD /* PeerMessagesMediaPlaylist.swift in Sources */, D0EC6CCC1EB9F58800EBF1C3 /* ServiceSoundManager.swift in Sources */, - D0EC6FCC1EBA135100EBF1C3 /* downsample_fast.c in Sources */, D0EC6CCD1EB9F58800EBF1C3 /* DeclareEncodables.swift in Sources */, D0CFBB951FD8B05000B65C0D /* OverlayInstantVideoDecoration.swift in Sources */, D0EC6CCE1EB9F58800EBF1C3 /* TelegramApplicationContext.swift in Sources */, - D0EC6FB41EBA114200EBF1C3 /* aec_resampler.cc in Sources */, D0EC6CCF1EB9F58800EBF1C3 /* GeoLocation.swift in Sources */, - D0EC6EA71EBA0FB000EBF1C3 /* BlockingQueue.cpp in Sources */, D09394132007F5BB00997F31 /* LocationBroadcastNavigationAccessoryPanel.swift in Sources */, D0471B5C1EFEB4F30074D609 /* BotPaymentFieldItemNode.swift in Sources */, D0C27B3D1F4B454800A4E170 /* InstantPagePlayableVideoNode.swift in Sources */, D0EC6CD11EB9F58800EBF1C3 /* UrlHandling.swift in Sources */, D0FC4FBB1F751E8900B7443F /* SelectablePeerNode.swift in Sources */, - D0EC6FE31EBA135100EBF1C3 /* spl_sqrt.c in Sources */, D0E9BAD21F0573C000F079A4 /* STPToken.m in Sources */, D0EC6CD21EB9F58800EBF1C3 /* HapticFeedback.swift in Sources */, D0EC6CD31EB9F58800EBF1C3 /* GenerateTextEntities.swift in Sources */, @@ -5222,7 +4079,6 @@ D01C7F001EF9D45B008305F1 /* DeviceContactsManager.swift in Sources */, D0EC6CDC1EB9F58800EBF1C3 /* TelegramAccountAuxiliaryMethods.swift in Sources */, D01BAA1A1ECC8E0D00295217 /* CallListControllerNode.swift in Sources */, - D0EC6FDF1EBA135100EBF1C3 /* resample_by_2_internal.c in Sources */, D0EC6CDD1EB9F58800EBF1C3 /* PresentationCallManager.swift in Sources */, D0A8BBA11F61EE83000F03FD /* UniversalVideoCalleryItem.swift in Sources */, D0EC6CDE1EB9F58800EBF1C3 /* ComponentsThemes.swift in Sources */, @@ -5237,24 +4093,19 @@ D0F67FF21EE6B915000E5906 /* ChannelMembersSearchControllerNode.swift in Sources */, D0EC6CE41EB9F58800EBF1C3 /* PresentationData.swift in Sources */, D0EC6CE51EB9F58800EBF1C3 /* PresentationStrings.swift in Sources */, - D0EC6EB41EBA0FC100EBF1C3 /* AudioOutput.cpp in Sources */, D0EC6CE61EB9F58800EBF1C3 /* PresentationsResourceCache.swift in Sources */, - D0EC6FEB1EBA180900EBF1C3 /* ooura_fft_sse2.cc in Sources */, D01776BA1F1D704F0044446D /* RadialStatusIconContentNode.swift in Sources */, D0EC6CE71EB9F58800EBF1C3 /* PresentationTheme.swift in Sources */, D0EC6CE81EB9F58800EBF1C3 /* DefaultPresentationTheme.swift in Sources */, D0EC6CE91EB9F58800EBF1C3 /* DefaultDarkPresentationTheme.swift in Sources */, - D0EC6FB01EBA112600EBF1C3 /* ooura_fft.cc in Sources */, D0EC6CEA1EB9F58800EBF1C3 /* DefaultPresentationStrings.swift in Sources */, D0C27B3B1F4B453700A4E170 /* InstantPagePlayableVideoItem.swift in Sources */, D0EC6CEB1EB9F58800EBF1C3 /* Wallpapers.swift in Sources */, D0EC6CEC1EB9F58800EBF1C3 /* PresentationThemeEssentialGraphics.swift in Sources */, D01BAA1E1ECC931D00295217 /* CallListNodeEntries.swift in Sources */, - D0EC6FEF1EBA18E800EBF1C3 /* VoIPController.cpp in Sources */, D0EC6CED1EB9F58800EBF1C3 /* StringPluralization.swift in Sources */, D020A9DC1FEAE6E7008C66F7 /* OverlayPlayerControllerNode.swift in Sources */, D04B26EC20082EB50053A58C /* LocationBroadcastPanelWavesNode.swift in Sources */, - D0EC6FC61EBA135100EBF1C3 /* complex_fft.c in Sources */, D0EC6CEE1EB9F58800EBF1C3 /* InAppNotificationSettings.swift in Sources */, D0EC6CEF1EB9F58800EBF1C3 /* PresentationPasscodeSettings.swift in Sources */, D06BEC8A1F6597A80035A545 /* OverlayVideoDecoration.swift in Sources */, @@ -5263,17 +4114,13 @@ D0EC6CF21EB9F58800EBF1C3 /* VoiceCallSettings.swift in Sources */, D0F8C397201774A200236FC5 /* FeedGroupingController.swift in Sources */, D0EC6CF31EB9F58800EBF1C3 /* PresentationThemeSettings.swift in Sources */, - D0EC6EB51EBA0FC100EBF1C3 /* Resampler.cpp in Sources */, D0EC6CF41EB9F58800EBF1C3 /* ManagedMediaId.swift in Sources */, - D0EC6FD41EBA135100EBF1C3 /* ilbc_specific_functions.c in Sources */, D0CFBB971FD8B0F700B65C0D /* ChatBubbleInstantVideoDecoration.swift in Sources */, D0471B601EFEB5A70074D609 /* BotPaymentTextItemNode.swift in Sources */, - D0EC6EB11EBA0FBB00EBF1C3 /* OpusDecoder.cpp in Sources */, D0EC6CF51EB9F58800EBF1C3 /* PeerMessageManagedMediaId.swift in Sources */, D0E9BA521F0559DA00F079A4 /* STPImageLibrary.m in Sources */, D0EC6CF61EB9F58800EBF1C3 /* ChatContextResultManagedMediaId.swift in Sources */, D04ECD721FFBF22B00DE9029 /* OpenUrl.swift in Sources */, - D0EC6EB01EBA0FBB00EBF1C3 /* NetworkSocket.cpp in Sources */, D04B4D661EEA993A00711AF6 /* LegacyLocationController.swift in Sources */, D056CD7A1FF3CC2A00880D28 /* ListMessagePlaybackOverlayNode.swift in Sources */, D0EC6CF71EB9F58800EBF1C3 /* RecentGifManagedMediaId.swift in Sources */, @@ -5308,9 +4155,7 @@ D0FFF7F61F55B82500BEBC01 /* InstantPageAudioItem.swift in Sources */, D0EC6D0C1EB9F58800EBF1C3 /* stream.c in Sources */, D0EC6D0D1EB9F58800EBF1C3 /* MediaFrameSource.swift in Sources */, - D0EC6FA71EBA111500EBF1C3 /* ring_buffer.c in Sources */, D0EC6D0E1EB9F58800EBF1C3 /* MediaPlaybackData.swift in Sources */, - D0EC6FF51EBA193C00EBF1C3 /* NetworkSocketPosix.cpp in Sources */, D0EC6D0F1EB9F58800EBF1C3 /* MediaPlayer.swift in Sources */, D0EC6D101EB9F58800EBF1C3 /* MediaPlayerAudioRenderer.swift in Sources */, D0EC6D111EB9F58800EBF1C3 /* MediaPlayerNode.swift in Sources */, @@ -5319,15 +4164,12 @@ D0EC6D141EB9F58800EBF1C3 /* MediaTrackFrame.swift in Sources */, D0EC6D151EB9F58800EBF1C3 /* MediaTrackFrameBuffer.swift in Sources */, D0EC6D161EB9F58800EBF1C3 /* MediaTrackFrameDecoder.swift in Sources */, - D0EC6FE61EBA135100EBF1C3 /* sqrt_of_one_minus_x_squared.c in Sources */, D056CD701FF147B000880D28 /* IconButtonNode.swift in Sources */, D0EC6D171EB9F58800EBF1C3 /* FFMpegAudioFrameDecoder.swift in Sources */, D0EC6D181EB9F58800EBF1C3 /* FFMpegMediaFrameSource.swift in Sources */, D0EC6D191EB9F58800EBF1C3 /* FFMpegMediaFrameSourceContext.swift in Sources */, D079FCE11F05C9380038FADE /* BotReceiptControllerNode.swift in Sources */, - D0EC6FF61EBA195F00EBF1C3 /* TGLogWrapper.m in Sources */, D053DADC201AAAB100993D32 /* ChatTextInputMenu.swift in Sources */, - D0EC6EAD1EBA0FBB00EBF1C3 /* JitterBuffer.cpp in Sources */, D0EC6D1A1EB9F58800EBF1C3 /* FFMpegMediaFrameSourceContextHelpers.swift in Sources */, D0EC6D1B1EB9F58800EBF1C3 /* FFMpegMediaVideoFrameDecoder.swift in Sources */, D01C06AF1FBB461E001561AB /* JoinLinkPreviewController.swift in Sources */, @@ -5339,14 +4181,12 @@ D0EC6D1F1EB9F58800EBF1C3 /* MediaPlayerTimeTextNode.swift in Sources */, D0EC6D201EB9F58800EBF1C3 /* PeerAvatar.swift in Sources */, D0EC6D211EB9F58800EBF1C3 /* FileResources.swift in Sources */, - D0EC6FB31EBA114200EBF1C3 /* aec_core_neon.cc in Sources */, D0461439200514F000EC0EF2 /* LiveLocationSummaryManager.swift in Sources */, D056CD781FF2A6EE00880D28 /* ChatMessageSwipeToReplyNode.swift in Sources */, D0CE67941F7DB45100FFB557 /* ChatMessageContactBubbleContentNode.swift in Sources */, D0943AFE1FDAE454001522CC /* ChatMultipleAvatarsNavigationNode.swift in Sources */, + D007019E2029EFDD006B9E34 /* ICloudResources.swift in Sources */, D0EC6D221EB9F58800EBF1C3 /* PhotoResources.swift in Sources */, - D0EC6FC11EBA132B00EBF1C3 /* nsx_core_neon.c in Sources */, - D0EC6FA81EBA111500EBF1C3 /* sparse_fir_filter.cc in Sources */, D048EA871F4F296400188713 /* InstantPageSettingsFontSizeItemNode.swift in Sources */, D0EC6D231EB9F58800EBF1C3 /* StickerResources.swift in Sources */, D0EC6D241EB9F58800EBF1C3 /* CachedResourceRepresentations.swift in Sources */, @@ -5356,7 +4196,6 @@ D0EC6D271EB9F58800EBF1C3 /* FetchResource.swift in Sources */, D048EA8F1F4F2A9C00188713 /* InstantPageSettingsItemNode.swift in Sources */, D056CD721FF1569800880D28 /* MusicPlaybackSettings.swift in Sources */, - D0EC6FDE1EBA135100EBF1C3 /* resample_by_2.c in Sources */, D0A723541FC3B40E0094D167 /* RadialCheckContentNode.swift in Sources */, D09D88731F86D56B00BEB4C9 /* AuthorizationLayout.swift in Sources */, D0EC6D281EB9F58800EBF1C3 /* MediaResources.swift in Sources */, @@ -5364,7 +4203,6 @@ D0EC6D291EB9F58800EBF1C3 /* FetchVideoMediaResource.swift in Sources */, D0AFCC791F4C8D2C000720C6 /* InstantPageSlideshowItem.swift in Sources */, D04281EF200E3D88009DDE36 /* GroupInfoSearchItem.swift in Sources */, - D0EC6FA51EBA111500EBF1C3 /* audio_util.cc in Sources */, D02660941F34CE5C000E2DC5 /* LegacyLocationVenueIconDataSource.swift in Sources */, D0EC6FFD1EBA1F2400EBF1C3 /* OngoingCallThreadLocalContext.mm in Sources */, D0E9BAE21F0574D800F079A4 /* STPBankAccount.m in Sources */, @@ -5372,10 +4210,8 @@ D0F67FF41EE6C10F000E5906 /* ChannelMembersSearchContainerNode.swift in Sources */, D0E9BA471F0559A500F079A4 /* NSDictionary+Stripe.m in Sources */, D0EC6D2A1EB9F58800EBF1C3 /* FetchPhotoLibraryImageResource.swift in Sources */, - D0EC6FDB1EBA135100EBF1C3 /* refl_coef_to_lpc.c in Sources */, D0E9BAE01F0574D800F079A4 /* STPDispatchFunctions.m in Sources */, D0EC6D2B1EB9F58800EBF1C3 /* FileMediaResourceStatus.swift in Sources */, - D0EC6FE51EBA135100EBF1C3 /* splitting_filter_impl.c in Sources */, D0EC6D2C1EB9F58800EBF1C3 /* TouchDownGestureRecognizer.swift in Sources */, D0EC6D2D1EB9F58800EBF1C3 /* TapLongTapOrDoubleTapGestureRecognizer.swift in Sources */, D0AF7C461ED84BC500CD8E0F /* LanguageSelectionController.swift in Sources */, @@ -5395,7 +4231,6 @@ D0EC6D381EB9F58800EBF1C3 /* SearchDisplayControllerContentNode.swift in Sources */, D06F1EA41F6C0A5D00FE8B74 /* ChatHistorySearchContainerNode.swift in Sources */, D0EC6D391EB9F58800EBF1C3 /* ImageContainingNode.swift in Sources */, - D0EC6FB61EBA114200EBF1C3 /* aecm_core.cc in Sources */, D0EC6D3A1EB9F58800EBF1C3 /* AudioWaveformNode.swift in Sources */, D0EB41F71F30D4A800838FE6 /* LegacyMediaLocations.swift in Sources */, D0EC6D3B1EB9F58800EBF1C3 /* EditableTokenListNode.swift in Sources */, @@ -5432,7 +4267,6 @@ D0208ADA1FA34017001F0D5F /* DeviceProximityManager.m in Sources */, D04281FC200E61BC009DDE36 /* ChatRecentActionsInteraction.swift in Sources */, D0EC6D561EB9F58800EBF1C3 /* ChatHistoryNode.swift in Sources */, - D0EC6FAF1EBA112600EBF1C3 /* delay_estimator_wrapper.cc in Sources */, D0EC6D571EB9F58800EBF1C3 /* ChatHistoryListNode.swift in Sources */, D0EC6D581EB9F58800EBF1C3 /* ChatHistoryGridNode.swift in Sources */, D0EC6D591EB9F58800EBF1C3 /* ChatMessageThrottledProcessingManager.swift in Sources */, @@ -5441,12 +4275,9 @@ D0EC6D5B1EB9F58800EBF1C3 /* ListMessageNode.swift in Sources */, D0DE66061F9A51E200EF4AE9 /* GalleryHiddenMediaManager.swift in Sources */, D0EC6D5C1EB9F58800EBF1C3 /* ListMessageFileItemNode.swift in Sources */, - D0EC6FA91EBA111500EBF1C3 /* wav_file.cc in Sources */, D0471B561EFDB40F0074D609 /* BotCheckoutActionButton.swift in Sources */, - D0EC6FBD1EBA132B00EBF1C3 /* noise_suppression_x.c in Sources */, D0EC6D5D1EB9F58800EBF1C3 /* ListMessageSnippetItemNode.swift in Sources */, D0EC6D5E1EB9F58800EBF1C3 /* ListMessageHoleItem.swift in Sources */, - D0EC6EB21EBA0FBB00EBF1C3 /* OpusEncoder.cpp in Sources */, D0EC6D5F1EB9F58800EBF1C3 /* GridMessageItem.swift in Sources */, D048EA851F4F295300188713 /* InstantPageSettingsBacklightItemNode.swift in Sources */, D0EC6D601EB9F58800EBF1C3 /* GridHoleItem.swift in Sources */, @@ -5465,21 +4296,16 @@ D0EC6D681EB9F58800EBF1C3 /* AuthorizationSequenceController.swift in Sources */, D0EC6D691EB9F58800EBF1C3 /* AuthorizationSequenceSplashController.swift in Sources */, D0EC6D6A1EB9F58800EBF1C3 /* AuthorizationSequenceSplashControllerNode.swift in Sources */, - D0EC6FB91EBA114200EBF1C3 /* echo_control_mobile.cc in Sources */, D0EC6D6B1EB9F58800EBF1C3 /* AuthorizationSequenceCountrySelectionController.swift in Sources */, D0EC6D6C1EB9F58800EBF1C3 /* AuthorizationSequenceCountrySelectionControllerNode.swift in Sources */, D0EC6D6D1EB9F58800EBF1C3 /* AuthorizationSequencePhoneEntryController.swift in Sources */, - D0EC6FD11EBA135100EBF1C3 /* filter_ma_fast_q12.c in Sources */, D0EC6D6E1EB9F58800EBF1C3 /* AuthorizationSequencePhoneEntryControllerNode.swift in Sources */, - D0EC6FD61EBA135100EBF1C3 /* lpc_to_refl_coef.c in Sources */, - D0EC6FAB1EBA112600EBF1C3 /* splitting_filter.cc in Sources */, D0B85C211FF70BEC00E795B4 /* AuthorizationSequenceAwaitingAccountResetControllerNode.swift in Sources */, D0EC6D6F1EB9F58800EBF1C3 /* AuthorizationSequenceCodeEntryController.swift in Sources */, D0C26D5E1FDF49E7004ABF18 /* DateFormat.swift in Sources */, D0EC6D701EB9F58800EBF1C3 /* AuthorizationSequenceCodeEntryControllerNode.swift in Sources */, D0E9BA4D1F0559C700F079A4 /* NSString+Stripe_CardBrands.m in Sources */, D099D7511EEFF91E00A3128C /* GameControllerTitleView.swift in Sources */, - D0EC6FBB1EBA114200EBF1C3 /* digital_agc.c in Sources */, D0EC6D711EB9F58800EBF1C3 /* AuthorizationSequencePasswordEntryController.swift in Sources */, D0EC6D721EB9F58800EBF1C3 /* AuthorizationSequencePasswordEntryControllerNode.swift in Sources */, D09D886F1F86C11F00BEB4C9 /* AuthorizationTheme.swift in Sources */, @@ -5487,14 +4313,11 @@ D0C12EB01F9A8D1300600BB2 /* ListMessageDateHeader.swift in Sources */, D0E9BA5D1F055A3300F079A4 /* STPBINRange.m in Sources */, D0EC6D741EB9F58800EBF1C3 /* AuthorizationSequenceSignUpControllerNode.swift in Sources */, - D0EC6FE21EBA135100EBF1C3 /* spl_inl.c in Sources */, - D0EC6FE41EBA135100EBF1C3 /* spl_sqrt_floor.c in Sources */, D0EC6D751EB9F58800EBF1C3 /* TelegramRootController.swift in Sources */, D0EC6D761EB9F58800EBF1C3 /* ChatListController.swift in Sources */, D0EC6D771EB9F58800EBF1C3 /* ChatListControllerNode.swift in Sources */, D0EC6D781EB9F58800EBF1C3 /* NetworkStatusTitleView.swift in Sources */, D048EA8D1F4F299A00188713 /* InstantPageSettingsSwitchItemNode.swift in Sources */, - D0EC6FAC1EBA112600EBF1C3 /* three_band_filter_bank.cc in Sources */, D0E9B9F41F018A6700F079A4 /* BotCheckoutPaymentMethodSheet.swift in Sources */, D0F6800A1EE750EE000E5906 /* ChannelBannedMemberController.swift in Sources */, D0EC6D791EB9F58800EBF1C3 /* ChatListTitleLockView.swift in Sources */, @@ -5537,11 +4360,10 @@ D01C06B31FBB49A5001561AB /* JoinLinkPreviewPeerContentNode.swift in Sources */, D0EC6D931EB9F58900EBF1C3 /* ChatMessageFileBubbleContentNode.swift in Sources */, D0EC6D941EB9F58900EBF1C3 /* ChatMessageForwardInfoNode.swift in Sources */, + D00ACA58202285090045D427 /* ChatRestrictedNode.swift in Sources */, D0104F2C1F471EEB004E4881 /* InstantPageGalleryFooterContentNode.swift in Sources */, D0754D241EEE0F4100884F6E /* ChatMessageInteractiveMediaLabelNode.swift in Sources */, D04B4D131EEA0A6500711AF6 /* ChatMessageMapBubbleContentNode.swift in Sources */, - D0EC6FB81EBA114200EBF1C3 /* aecm_core_neon.cc in Sources */, - D0EC6EB61EBA0FD000EBF1C3 /* AudioInputAudioUnit.cpp in Sources */, D0EC6D951EB9F58900EBF1C3 /* ChatMessageInteractiveFileNode.swift in Sources */, D01A21B11F3A050E00DDA104 /* InstantPageNavigationBar.swift in Sources */, D0EC6D961EB9F58900EBF1C3 /* ChatMessageInteractiveMediaNode.swift in Sources */, @@ -5568,13 +4390,10 @@ D0EC6DA11EB9F58900EBF1C3 /* ChatMessageSelectionNode.swift in Sources */, D0EC6DA21EB9F58900EBF1C3 /* ChatMessageBubbleImages.swift in Sources */, D0EC6DA31EB9F58900EBF1C3 /* ChatMessageDateHeader.swift in Sources */, - D0EC6FCD1EBA135100EBF1C3 /* downsample_fast_neon.c in Sources */, D0EC6DA41EB9F58900EBF1C3 /* ChatMessageActionButtonsNode.swift in Sources */, D0EC6DA51EB9F58900EBF1C3 /* ChatBotInfoItem.swift in Sources */, - D0EC6EB81EBA0FD000EBF1C3 /* AudioOutputAudioUnit.cpp in Sources */, D0EC6DA61EB9F58900EBF1C3 /* ChatEmptyItem.swift in Sources */, D0E9BAE41F0574D800F079A4 /* STPBankAccountParams.m in Sources */, - D0943B0B1FDEF56E001522CC /* DarwinSpecific.mm in Sources */, D06887F01F72DEE6000AB936 /* ShareInputFieldNode.swift in Sources */, D0EC6DA71EB9F58900EBF1C3 /* ChatMessageBackground.swift in Sources */, D0F0AAE01EC1E12C005EE2A5 /* PresentationCall.swift in Sources */, @@ -5589,7 +4408,6 @@ D056CD761FF2A30900880D28 /* ChatSwipeToReplyRecognizer.swift in Sources */, D091C7A41F8EBB1E00D7DE13 /* ChatPresentationData.swift in Sources */, D0EB41F31F2FEAB800838FE6 /* LegacyComponentsStickers.swift in Sources */, - D0EC6FAA1EBA111500EBF1C3 /* wav_header.cc in Sources */, D0EC6DAD1EB9F58900EBF1C3 /* ChatInterfaceStateNavigationButtons.swift in Sources */, D0EC6DAE1EB9F58900EBF1C3 /* ChatInterfaceStateContextMenus.swift in Sources */, D0F67FF01EE6B8A8000E5906 /* ChannelMembersSearchController.swift in Sources */, @@ -5600,7 +4418,6 @@ D0E9BA411F0558FE00F079A4 /* StripeError.m in Sources */, D0EC6DB31EB9F58900EBF1C3 /* ChatInterfaceStateContextQueries.swift in Sources */, D0EC6DB41EB9F58900EBF1C3 /* AccessoryPanelNode.swift in Sources */, - D0EC6FEE1EBA186800EBF1C3 /* apm_data_dumper.cc in Sources */, D01776BE1F1E76920044446D /* PeerMediaCollectionSectionsNode.swift in Sources */, D0EC6DB51EB9F58900EBF1C3 /* ReplyAccessoryPanelNode.swift in Sources */, D0EC6DB61EB9F58900EBF1C3 /* ForwardAccessoryPanelNode.swift in Sources */, @@ -5609,7 +4426,6 @@ D0EC6DB91EB9F58900EBF1C3 /* ChatInputNode.swift in Sources */, D0EC6DBA1EB9F58900EBF1C3 /* ChatMediaInputNode.swift in Sources */, D0E9BA2F1F0557D400F079A4 /* STPAddress.m in Sources */, - D0EC6FED1EBA184A00EBF1C3 /* cpu_features.cc in Sources */, D0EC6DBB1EB9F58900EBF1C3 /* ChatMediaInputStickerPane.swift in Sources */, D0EC6DBC1EB9F58900EBF1C3 /* ChatMediaInputGifPane.swift in Sources */, D0EC6DBD1EB9F58900EBF1C3 /* ChatMediaInputPanelEntries.swift in Sources */, @@ -5620,11 +4436,9 @@ D0EC6DC01EB9F58900EBF1C3 /* ChatMediaInputRecentGifsItem.swift in Sources */, D0477D211F61A47600412B44 /* UniversalVideoContentManager.swift in Sources */, D0EC6DC11EB9F58900EBF1C3 /* ChatMediaInputTrendingItem.swift in Sources */, - D0EC6FBC1EBA132B00EBF1C3 /* noise_suppression.c in Sources */, D0EC6DC21EB9F58900EBF1C3 /* ChatMediaInputStickerPackItem.swift in Sources */, D0EC6DC31EB9F58900EBF1C3 /* ChatMediaInputStickerGridItem.swift in Sources */, D0EC6DC41EB9F58900EBF1C3 /* MultiplexedSoftwareVideoNode.swift in Sources */, - D0EC6FDC1EBA135100EBF1C3 /* resample.c in Sources */, D0E9BAE81F0574FF00F079A4 /* STPCustomer.m in Sources */, D0C0B59F1EE082F5000F4D2C /* ChatSearchInputPanelNode.swift in Sources */, D079FCD91F05A5550038FADE /* BotCheckoutPasswordEntryController.swift in Sources */, @@ -5635,7 +4449,6 @@ D0EC6DC91EB9F58900EBF1C3 /* SoftwareVideoLayerFrameManager.swift in Sources */, D0EC6DCA1EB9F58900EBF1C3 /* SoftwareVideoThumbnailLayer.swift in Sources */, D0754D221EEDF89900884F6E /* ChatMessageInvoiceBubbleContentNode.swift in Sources */, - D0EC6FE11EBA135100EBF1C3 /* spl_init.c in Sources */, D0EC6DCB1EB9F58900EBF1C3 /* ChatMediaInputTrendingPane.swift in Sources */, D0430B021FF4584100A35ADD /* WebControllerNode.swift in Sources */, D0EC6DCC1EB9F58900EBF1C3 /* ChatButtonKeyboardInputNode.swift in Sources */, @@ -5647,6 +4460,7 @@ D0EC6DD01EB9F58900EBF1C3 /* HashtagChatInputContextPanelNode.swift in Sources */, D0EC6DD11EB9F58900EBF1C3 /* HashtagChatInputPanelItem.swift in Sources */, D0EC6DD21EB9F58900EBF1C3 /* MentionChatInputContextPanelNode.swift in Sources */, + D00701A22029F6D0006B9E34 /* TGMimeTypeMap.m in Sources */, D0EC6DD31EB9F58900EBF1C3 /* MentionChatInputPanelItem.swift in Sources */, D0EC6DD41EB9F58900EBF1C3 /* CommandChatInputContextPanelNode.swift in Sources */, D0EC6DD51EB9F58900EBF1C3 /* CommandChatInputPanelItem.swift in Sources */, @@ -5664,7 +4478,6 @@ D0EC6DDB1EB9F58900EBF1C3 /* ChatInputPanelNode.swift in Sources */, D01BAA221ECE076100295217 /* CallListCallItem.swift in Sources */, D0477D1B1F617E5800412B44 /* UniversalVideoNode.swift in Sources */, - D0EC6EAA1EBA0FBB00EBF1C3 /* BufferPool.cpp in Sources */, D0E9BA081F0446A300F079A4 /* BotCheckoutPaymentShippingOptionSheetController.swift in Sources */, D0EC6DDC1EB9F58900EBF1C3 /* ChatTextInputPanelNode.swift in Sources */, D0EB41F51F30D26A00838FE6 /* LegacySuggestionContext.swift in Sources */, @@ -5675,7 +4488,6 @@ D0EC6DDF1EB9F58900EBF1C3 /* ChatTextInputAudioRecordingTimeNode.swift in Sources */, D0EC6DE01EB9F58900EBF1C3 /* ChatTextInputAudioRecordingCancelIndicator.swift in Sources */, D09D88711F86D36700BEB4C9 /* CountryList.swift in Sources */, - D0EC6FAE1EBA112600EBF1C3 /* delay_estimator.cc in Sources */, D0EC6DE11EB9F58900EBF1C3 /* ChatMessageSelectionInputPanelNode.swift in Sources */, D04281FA200E5CDC009DDE36 /* ChatRecentActionsControllerState.swift in Sources */, D0EC6DE21EB9F58900EBF1C3 /* ChatChannelSubscriberInputPanelNode.swift in Sources */, @@ -5688,7 +4500,6 @@ D0428200200E6A00009DDE36 /* ChatRecentActionsHistoryTransition.swift in Sources */, D0EC6DE71EB9F58900EBF1C3 /* ChatTitleAccessoryPanelNode.swift in Sources */, D0EC6DE81EB9F58900EBF1C3 /* ChatPinnedMessageTitlePanelNode.swift in Sources */, - D0EC6FBF1EBA132B00EBF1C3 /* nsx_core.c in Sources */, D0EC6DE91EB9F58900EBF1C3 /* ChatInfoTitlePanelNode.swift in Sources */, D0EC6DEA1EB9F58900EBF1C3 /* ChatReportPeerTitlePanelNode.swift in Sources */, D0EC6DEB1EB9F58900EBF1C3 /* ChatRequestInProgressTitlePanelNode.swift in Sources */, @@ -5697,13 +4508,11 @@ D0FB87B21F7C4C19004DE005 /* FetchMediaUtils.swift in Sources */, D0E9BA0C1F04580700F079A4 /* BotCheckoutWebInteractionControllerNode.swift in Sources */, D0EC6DF11EB9F58900EBF1C3 /* ShareController.swift in Sources */, - D0EC6FC21EBA135100EBF1C3 /* auto_corr_to_refl_coef.c in Sources */, D0EC6DF21EB9F58900EBF1C3 /* ShareControllerNode.swift in Sources */, D0EC6DF31EB9F58900EBF1C3 /* ShareControllerPeerGridItem.swift in Sources */, D0EC6DF41EB9F58900EBF1C3 /* ShareActionButtonNode.swift in Sources */, D0EC6DF51EB9F58900EBF1C3 /* PeerMediaCollectionController.swift in Sources */, D0EC6DF61EB9F58900EBF1C3 /* PeerMediaCollectionControllerNode.swift in Sources */, - D0EC6FCA1EBA135100EBF1C3 /* division_operations.c in Sources */, D0477D1D1F617E8900412B44 /* NativeVideoContent.swift in Sources */, D0EC6DF81EB9F58900EBF1C3 /* PeerMediaCollectionInterfaceState.swift in Sources */, D033C60B1F0D306E0044EABA /* TelegramVideoNode.swift in Sources */, @@ -5715,7 +4524,6 @@ D0EC6DFD1EB9F58900EBF1C3 /* GalleryControllerNode.swift in Sources */, D0E9BA571F055A0B00F079A4 /* STPFormTextField.m in Sources */, D0EC6DFE1EB9F58900EBF1C3 /* GalleryControllerPresentationState.swift in Sources */, - D0EC6FC71EBA135100EBF1C3 /* copy_set_operations.c in Sources */, D0EC6DFF1EB9F58900EBF1C3 /* GalleryItem.swift in Sources */, D0EC6E001EB9F58900EBF1C3 /* GalleryItemNode.swift in Sources */, D048EA8B1F4F298A00188713 /* InstantPageSettingsThemeItemNode.swift in Sources */, @@ -5726,18 +4534,17 @@ D0EC6E041EB9F58900EBF1C3 /* SecretMediaPreviewController.swift in Sources */, D0C26D571FDF2388004ABF18 /* OpenChatMessage.swift in Sources */, D0EC6E051EB9F58900EBF1C3 /* SecretMediaPreviewControllerNode.swift in Sources */, + D007019C2029E8F2006B9E34 /* LegqacyICloudFileController.swift in Sources */, D0208AD61FA33D14001F0D5F /* RaiseToListenActivator.m in Sources */, D0EC6E061EB9F58900EBF1C3 /* ChatDocumentGalleryItem.swift in Sources */, D0EC6E071EB9F58900EBF1C3 /* ChatHoleGalleryItem.swift in Sources */, D0EC6E081EB9F58900EBF1C3 /* ChatImageGalleryItem.swift in Sources */, D048EA891F4F297500188713 /* InstantPageSettingsFontFamilyItemNode.swift in Sources */, D0EC6E0A1EB9F58900EBF1C3 /* ChatVideoGalleryItemScrubberView.swift in Sources */, - D0EC6FC31EBA135100EBF1C3 /* auto_correlation.c in Sources */, D0EC6E0B1EB9F58900EBF1C3 /* ZoomableContentGalleryItemNode.swift in Sources */, + D07ABBA5202A14BC003671DE /* LegacyImagePicker.swift in Sources */, D0EC6E0C1EB9F58900EBF1C3 /* ChatItemGalleryFooterContentNode.swift in Sources */, - D0EC6FD01EBA135100EBF1C3 /* filter_ar_fast_q12.c in Sources */, D0E9BABD1F05735F00F079A4 /* STPPaymentConfiguration.m in Sources */, - D0EC6FEA1EBA17C300EBF1C3 /* fft4g.c in Sources */, D0EC6E0E1EB9F58900EBF1C3 /* PeerAvatarImageGalleryItem.swift in Sources */, D0EC6E0F1EB9F58900EBF1C3 /* MapInputController.swift in Sources */, D04B4D111EEA04D400711AF6 /* MapResources.swift in Sources */, @@ -5754,7 +4561,6 @@ D0EC6E141EB9F58900EBF1C3 /* InstantPageMedia.swift in Sources */, D0EC6E151EB9F58900EBF1C3 /* InstantPageLinkSelectionView.swift in Sources */, D0FE4DE01F0ACA8300E8A0B3 /* InstantVideoNode.swift in Sources */, - D0EC6EBA1EBA0FD000EBF1C3 /* AudioUnitIO.cpp in Sources */, D0EC6E161EB9F58900EBF1C3 /* InstantPageLayoutSpacings.swift in Sources */, D0EC6E171EB9F58900EBF1C3 /* InstantPageTextStyleStack.swift in Sources */, D0EC6E181EB9F58900EBF1C3 /* InstantPageTextItem.swift in Sources */, @@ -5763,8 +4569,6 @@ D0EC6E191EB9F58900EBF1C3 /* InstantPageAnchorItem.swift in Sources */, D05677531F4CA0D0001B723E /* InstantPagePeerReferenceNode.swift in Sources */, D0EC6E1A1EB9F58900EBF1C3 /* InstantPageImageItem.swift in Sources */, - D0EC6FD81EBA135100EBF1C3 /* min_max_operations_neon.c in Sources */, - D0EC6FB71EBA114200EBF1C3 /* aecm_core_c.cc in Sources */, D0EC6E1B1EB9F58900EBF1C3 /* InstantPageImageNode.swift in Sources */, D0EC6E1C1EB9F58900EBF1C3 /* InstantPageWebEmbedItem.swift in Sources */, D0EC6E1D1EB9F58900EBF1C3 /* InstantPageWebEmbedNode.swift in Sources */, @@ -5774,32 +4578,26 @@ D0EC6E201EB9F58900EBF1C3 /* InstantPageTileNode.swift in Sources */, D0EC6E211EB9F58900EBF1C3 /* InstantPageController.swift in Sources */, D0EC6E221EB9F58900EBF1C3 /* InstantPageControllerNode.swift in Sources */, - D0EC6EAE1EBA0FBB00EBF1C3 /* logging.cpp in Sources */, D0EC6E231EB9F58900EBF1C3 /* StickerPackPreviewController.swift in Sources */, D0EC6E241EB9F58900EBF1C3 /* StickerPackPreviewControllerNode.swift in Sources */, D0FC194D201F82A000FEDBB2 /* OpenResolvedUrl.swift in Sources */, D0EC6E251EB9F58900EBF1C3 /* StickerPackPreviewGridItem.swift in Sources */, D0EC6E261EB9F58900EBF1C3 /* StickerPreviewController.swift in Sources */, D0EC6E271EB9F58900EBF1C3 /* StickerPreviewControllerNode.swift in Sources */, - D0EC6FBA1EBA114200EBF1C3 /* analog_agc.c in Sources */, D0EC6E281EB9F58900EBF1C3 /* ContactsController.swift in Sources */, D0EC6E291EB9F58900EBF1C3 /* ContactsControllerNode.swift in Sources */, D0AF323A1FB1D8D60097362B /* ChatOverlayNavigationBar.swift in Sources */, D0EC6E2A1EB9F58900EBF1C3 /* ContactsSearchContainerNode.swift in Sources */, D099D74F1EEFEE6A00A3128C /* GameControllerNode.swift in Sources */, D0943AF61FDAAE7E001522CC /* MultipleAvatarsNode.swift in Sources */, - D0EC6FD21EBA135100EBF1C3 /* get_hanning_window.c in Sources */, D0EC6E2B1EB9F58900EBF1C3 /* ComposeController.swift in Sources */, D099D74D1EEFEE1500A3128C /* GameController.swift in Sources */, D0EC6E2C1EB9F58900EBF1C3 /* ComposeControllerNode.swift in Sources */, D0EC6E2D1EB9F58900EBF1C3 /* CounterContollerTitleView.swift in Sources */, D0EC6E2E1EB9F58900EBF1C3 /* ContactMultiselectionController.swift in Sources */, - D0EC6FD31EBA135100EBF1C3 /* get_scaling_square.c in Sources */, D0EC6E2F1EB9F58900EBF1C3 /* ContactMultiselectionControllerNode.swift in Sources */, D0EC6E301EB9F58900EBF1C3 /* ContactSelectionController.swift in Sources */, - D0EC6FCF1EBA135100EBF1C3 /* filter_ar.c in Sources */, D0EC6E311EB9F58900EBF1C3 /* ContactSelectionControllerNode.swift in Sources */, - D0EC6EAB1EBA0FBB00EBF1C3 /* CongestionControl.cpp in Sources */, D0EC6E321EB9F58900EBF1C3 /* CreateGroupController.swift in Sources */, D00BED221F73F82400922292 /* SharePeersContainerNode.swift in Sources */, D0EC6E331EB9F58900EBF1C3 /* CreateChannelController.swift in Sources */, @@ -5810,6 +4608,7 @@ D0EC6E371EB9F58900EBF1C3 /* ItemListActionItem.swift in Sources */, D0EC6E381EB9F58900EBF1C3 /* ItemListDisclosureItem.swift in Sources */, D0E9BA651F055B4500F079A4 /* BotCheckoutNativeCardEntryController.swift in Sources */, + D00ACA5A2022897D0045D427 /* ProcessedPeerRestrictionText.swift in Sources */, D0EC6E391EB9F58900EBF1C3 /* ItemListCheckboxItem.swift in Sources */, D0EC6E3A1EB9F58900EBF1C3 /* ItemListSwitchItem.swift in Sources */, D0EC6E3B1EB9F58900EBF1C3 /* ItemListPeerItem.swift in Sources */, @@ -5822,7 +4621,6 @@ D0EC6E411EB9F58900EBF1C3 /* ItemListEditableItem.swift in Sources */, D0EC6E421EB9F58900EBF1C3 /* ItemListRevealOptionsNode.swift in Sources */, D0E8175920122FE100B82BBB /* ChatRecentActionsFilterController.swift in Sources */, - D0EC6FC91EBA135100EBF1C3 /* cross_correlation_neon.c in Sources */, D0EC6E431EB9F58900EBF1C3 /* ItemListEditableDeleteControlNode.swift in Sources */, D0EC6E441EB9F58900EBF1C3 /* ItemListSingleLineInputItem.swift in Sources */, D01776B31F1D69A80044446D /* RadialStatusNode.swift in Sources */, @@ -5848,13 +4646,10 @@ D0EC6E501EB9F58900EBF1C3 /* ChannelAdminsController.swift in Sources */, D0EC6E511EB9F58900EBF1C3 /* ChannelBlacklistController.swift in Sources */, D0EC6E521EB9F58900EBF1C3 /* ChannelInfoController.swift in Sources */, - D0EC6FA61EBA111500EBF1C3 /* channel_buffer.cc in Sources */, D0EC6E531EB9F58900EBF1C3 /* ChannelMembersController.swift in Sources */, - D0EC6FD71EBA135100EBF1C3 /* min_max_operations.c in Sources */, D01C06BA1FBBB076001561AB /* ItemListSelectableControlNode.swift in Sources */, D0EC6E541EB9F58900EBF1C3 /* ConvertToSupergroupController.swift in Sources */, D0EC6E551EB9F58900EBF1C3 /* GroupAdminsController.swift in Sources */, - D0EC6FDA1EBA135100EBF1C3 /* real_fft.c in Sources */, D0EC6E561EB9F58900EBF1C3 /* UserInfoController.swift in Sources */, D0EC6E571EB9F58900EBF1C3 /* GroupsInCommonController.swift in Sources */, D0EC6E581EB9F58900EBF1C3 /* PeerSelectionController.swift in Sources */, @@ -5864,7 +4659,6 @@ D0EC6E5D1EB9F58900EBF1C3 /* PrivacyAndSecurityController.swift in Sources */, D04281F8200E5C17009DDE36 /* ChatControllerBackground.swift in Sources */, D0EC6E5E1EB9F58900EBF1C3 /* ItemListRecentSessionItem.swift in Sources */, - D0EC6FCE1EBA135100EBF1C3 /* energy.c in Sources */, D00ADFDD1EBB73C200873D2E /* OverlayMediaManager.swift in Sources */, D056CD7C1FF3E92C00880D28 /* DirectionalPanGestureRecognizer.swift in Sources */, D0EC6E5F1EB9F58900EBF1C3 /* RecentSessionsController.swift in Sources */, @@ -5873,12 +4667,9 @@ D0EC6E611EB9F58900EBF1C3 /* SelectivePrivacySettingsController.swift in Sources */, D0471B4B1EFD64AC0074D609 /* BotCheckoutHeaderItem.swift in Sources */, D0EC6E621EB9F58900EBF1C3 /* SelectivePrivacySettingsPeersController.swift in Sources */, - D0EC6EA91EBA0FBB00EBF1C3 /* BufferOutputStream.cpp in Sources */, D0DFD5E21FCE2BA50039B3B1 /* CalculatingCacheSizeItem.swift in Sources */, D0EC6E631EB9F58900EBF1C3 /* TwoStepVerificationUnlockController.swift in Sources */, D0EC6E641EB9F58900EBF1C3 /* TwoStepVerificationPasswordEntryController.swift in Sources */, - D0EC6EAC1EBA0FBB00EBF1C3 /* EchoCanceller.cpp in Sources */, - D0EC6FAD1EBA112600EBF1C3 /* block_mean_calculator.cc in Sources */, D0EC6E651EB9F58900EBF1C3 /* TwoStepVerificationResetController.swift in Sources */, D0EC6E661EB9F58900EBF1C3 /* PasscodeOptionsController.swift in Sources */, D0EC6E671EB9F58900EBF1C3 /* DataAndStorageSettingsController.swift in Sources */, @@ -5887,41 +4678,33 @@ D0EC6E6A1EB9F58900EBF1C3 /* StorageUsageController.swift in Sources */, D079FCDF1F05C9280038FADE /* BotReceiptController.swift in Sources */, D0EC6E6B1EB9F58900EBF1C3 /* InstalledStickerPacksController.swift in Sources */, - D0EC6EB31EBA0FC100EBF1C3 /* AudioInput.cpp in Sources */, D0EC6E6C1EB9F58900EBF1C3 /* FeaturedStickerPacksController.swift in Sources */, D0B85C231FF70BF400E795B4 /* AuthorizationSequenceAwaitingAccountResetController.swift in Sources */, D0EC6E6D1EB9F58900EBF1C3 /* ItemListStickerPackItem.swift in Sources */, D0EC6E6E1EB9F58900EBF1C3 /* ArhivedStickerPacksController.swift in Sources */, - D0EC6EA81EBA0FB300EBF1C3 /* BufferInputStream.cpp in Sources */, D0EC6E711EB9F58900EBF1C3 /* ThemeGalleryController.swift in Sources */, D0C0B5B11EE1C421000F4D2C /* ChatDateSelectionSheet.swift in Sources */, - D0EC6FD91EBA135100EBF1C3 /* randomization_functions.c in Sources */, D0EC6E721EB9F58900EBF1C3 /* ThemeGalleryItem.swift in Sources */, D0471B581EFE6D020074D609 /* BotCheckoutInfoController.swift in Sources */, D0EC6E731EB9F58900EBF1C3 /* ThemeGalleryToolbarNode.swift in Sources */, D025A4261F79428E00563950 /* FetchManagerLocation.swift in Sources */, D087BFB11F745483003FD209 /* ShareSearchBarNode.swift in Sources */, - D0EC6FC41EBA135100EBF1C3 /* complex_bit_reverse.c in Sources */, D0EC6E741EB9F58900EBF1C3 /* ThemeGridController.swift in Sources */, D0EC6E751EB9F58900EBF1C3 /* ThemeGridControllerNode.swift in Sources */, D0EC6E761EB9F58900EBF1C3 /* SettingsController.swift in Sources */, D0EC6E771EB9F58900EBF1C3 /* NotificationsAndSounds.swift in Sources */, D0EC6E781EB9F58900EBF1C3 /* NotificationSoundSelection.swift in Sources */, D056CD741FF2996B00880D28 /* ExternalMusicAlbumArtResources.swift in Sources */, - D0EC6FDD1EBA135100EBF1C3 /* resample_48khz.c in Sources */, - D0EC6FD51EBA135100EBF1C3 /* levinson_durbin.c in Sources */, - D0EC6FC01EBA132B00EBF1C3 /* nsx_core_c.c in Sources */, D0F0AAE41EC21AAA005EE2A5 /* CallControllerButtonsNode.swift in Sources */, D0EC6E7A1EB9F58900EBF1C3 /* DebugController.swift in Sources */, + D07ABBAB202A1BD1003671DE /* LegacyWallpaperEditor.swift in Sources */, D0EC6E7B1EB9F58900EBF1C3 /* DebugAccountsController.swift in Sources */, - D0EC6FE71EBA135100EBF1C3 /* vector_scaling_operations.c in Sources */, D0EC6E7C1EB9F58900EBF1C3 /* UsernameSetupController.swift in Sources */, D0471B621EFEB5B70074D609 /* BotPaymentSwitchItemNode.swift in Sources */, D09250041FE5363D003F693F /* ExperimentalSettings.swift in Sources */, D0E8175B201254FA00B82BBB /* ChatRecentActionsEmptyNode.swift in Sources */, D0C44B641FC64D0500227BE0 /* SwipeToDismissGestureRecognizer.swift in Sources */, D0EC6E7D1EB9F58900EBF1C3 /* ChangePhoneNumberIntroController.swift in Sources */, - D0EC6FA31EBA10E400EBF1C3 /* checks.cc in Sources */, D0EC6E7E1EB9F58900EBF1C3 /* ChangePhoneNumberController.swift in Sources */, D0EC6E7F1EB9F58900EBF1C3 /* ChangePhoneNumberControllerNode.swift in Sources */, D0EC6E801EB9F58900EBF1C3 /* ChangePhoneNumberCodeController.swift in Sources */, @@ -5942,7 +4725,6 @@ D0EC6E881EB9F58900EBF1C3 /* FFMpegSwResample.m in Sources */, D0EC6E891EB9F58900EBF1C3 /* FrameworkBundle.swift in Sources */, D0EC6E8B1EB9F58900EBF1C3 /* RingBuffer.m in Sources */, - D0EC6FBE1EBA132B00EBF1C3 /* ns_core.c in Sources */, D0EC6E8C1EB9F58900EBF1C3 /* RingByteBuffer.swift in Sources */, D0E9BA181F05574500F079A4 /* STPPaymentCardTextFieldViewModel.m in Sources */, D0EC6E8D1EB9F58900EBF1C3 /* SecretChatKeyVisualization.m in Sources */, @@ -5954,83 +4736,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D0EC6C691EB9F42E00EBF1C3 /* filter_ar_fast_q12_armv7.S in Sources */, - D0EC6C661EB9F42E00EBF1C3 /* energy.c in Sources */, D0FC408E1D5B8E7500261D9D /* TelegramUITests.swift in Sources */, - D0EC6C8E1EB9F42E00EBF1C3 /* analog_agc.c in Sources */, - D0EC6C8D1EB9F42E00EBF1C3 /* echo_control_mobile.cc in Sources */, - D0EC6C701EB9F42E00EBF1C3 /* min_max_operations.c in Sources */, - D0EC6C791EB9F42E00EBF1C3 /* resample_fractional.c in Sources */, - D0EC6C571EB9F42E00EBF1C3 /* channel_buffer.cc in Sources */, - D0EC6C7F1EB9F42E00EBF1C3 /* splitting_filter_impl.c in Sources */, - D0EC6C7D1EB9F42E00EBF1C3 /* spl_sqrt_floor.c in Sources */, - D0EC6C8B1EB9F42E00EBF1C3 /* aecm_core_c.cc in Sources */, - D0EC6C8C1EB9F42E00EBF1C3 /* aecm_core_neon.cc in Sources */, - D0EC6C5B1EB9F42E00EBF1C3 /* auto_correlation.c in Sources */, - D0EC6C5D1EB9F42E00EBF1C3 /* complex_bit_reverse_arm.S in Sources */, - D0EC6C741EB9F42E00EBF1C3 /* refl_coef_to_lpc.c in Sources */, - D0EC6C561EB9F42E00EBF1C3 /* audio_util.cc in Sources */, - D0EC6C731EB9F42E00EBF1C3 /* real_fft.c in Sources */, - D0EC6C651EB9F42E00EBF1C3 /* downsample_fast_neon.c in Sources */, - D0EC6C761EB9F42E00EBF1C3 /* resample_48khz.c in Sources */, - D0EC6C641EB9F42E00EBF1C3 /* downsample_fast.c in Sources */, - D0EC6C9E1EB9F42E00EBF1C3 /* ooura_fft_sse2.cc in Sources */, - D0EC6C541EB9F42E00EBF1C3 /* checks.cc in Sources */, - D0EC6C631EB9F42E00EBF1C3 /* dot_product_with_scale.c in Sources */, - D0EC6C971EB9F42E00EBF1C3 /* splitting_filter.cc in Sources */, - D0EC6C681EB9F42E00EBF1C3 /* filter_ar_fast_q12.c in Sources */, - D0EC6C871EB9F42E00EBF1C3 /* aec_core_sse2.cc in Sources */, - D0EC6C961EB9F42E00EBF1C3 /* nsx_core_neon.c in Sources */, - D0EC6C5C1EB9F42E00EBF1C3 /* complex_bit_reverse.c in Sources */, - D0EC6C711EB9F42E00EBF1C3 /* min_max_operations_neon.c in Sources */, - D0EC6C7A1EB9F42E00EBF1C3 /* spl_init.c in Sources */, - D0EC6C9C1EB9F42E00EBF1C3 /* ooura_fft.cc in Sources */, - D0EC6C941EB9F42E00EBF1C3 /* nsx_core.c in Sources */, - D0EC6C591EB9F42E00EBF1C3 /* ring_buffer.c in Sources */, - D0EC6C991EB9F42E00EBF1C3 /* block_mean_calculator.cc in Sources */, - D0EC6C9A1EB9F42E00EBF1C3 /* delay_estimator.cc in Sources */, - D0EC6C921EB9F42E00EBF1C3 /* noise_suppression_x.c in Sources */, - D0EC6C931EB9F42E00EBF1C3 /* ns_core.c in Sources */, - D0EC6C911EB9F42E00EBF1C3 /* noise_suppression.c in Sources */, - D0EC6C5A1EB9F42E00EBF1C3 /* auto_corr_to_refl_coef.c in Sources */, - D0EC6C821EB9F42E00EBF1C3 /* sparse_fir_filter.cc in Sources */, - D0EC6C611EB9F42E00EBF1C3 /* cross_correlation_neon.c in Sources */, - D0EC6C891EB9F42E00EBF1C3 /* echo_cancellation.cc in Sources */, - D0EC6C801EB9F42E00EBF1C3 /* sqrt_of_one_minus_x_squared.c in Sources */, - D0EC6C851EB9F42E00EBF1C3 /* aec_core.cc in Sources */, - D0EC6C5F1EB9F42E00EBF1C3 /* copy_set_operations.c in Sources */, - D0EC6C7E1EB9F42E00EBF1C3 /* spl_sqrt_floor_arm.S in Sources */, - D0EC6C9D1EB9F42E00EBF1C3 /* ooura_fft_neon.cc in Sources */, - D0EC6C751EB9F42E00EBF1C3 /* resample.c in Sources */, - D0EC6C6F1EB9F42E00EBF1C3 /* lpc_to_refl_coef.c in Sources */, - D0EC6C721EB9F42E00EBF1C3 /* randomization_functions.c in Sources */, - D0EC6C861EB9F42E00EBF1C3 /* aec_core_neon.cc in Sources */, - D0EC6C811EB9F42E00EBF1C3 /* vector_scaling_operations.c in Sources */, - D0EC6C5E1EB9F42E00EBF1C3 /* complex_fft.c in Sources */, - D0EC6C6E1EB9F42E00EBF1C3 /* levinson_durbin.c in Sources */, - D0EC6C621EB9F42E00EBF1C3 /* division_operations.c in Sources */, - D0EC6C951EB9F42E00EBF1C3 /* nsx_core_c.c in Sources */, - D0EC6C8F1EB9F42E00EBF1C3 /* digital_agc.c in Sources */, - D0EC6C8A1EB9F42E00EBF1C3 /* aecm_core.cc in Sources */, - D0EC6C671EB9F42E00EBF1C3 /* filter_ar.c in Sources */, - D0EC6C9F1EB9F42E00EBF1C3 /* cpu_features.cc in Sources */, - D0EC6C981EB9F42E00EBF1C3 /* three_band_filter_bank.cc in Sources */, - D0EC6C771EB9F42E00EBF1C3 /* resample_by_2.c in Sources */, - D0EC6C7B1EB9F42E00EBF1C3 /* spl_inl.c in Sources */, - D0EC6C601EB9F42E00EBF1C3 /* cross_correlation.c in Sources */, - D0EC6C6C1EB9F42E00EBF1C3 /* get_scaling_square.c in Sources */, - D0EC6C831EB9F42E00EBF1C3 /* wav_file.cc in Sources */, - D0EC6C841EB9F42E00EBF1C3 /* wav_header.cc in Sources */, - D0EC6C7C1EB9F42E00EBF1C3 /* spl_sqrt.c in Sources */, - D0EC6C901EB9F42E00EBF1C3 /* apm_data_dumper.cc in Sources */, - D0EC6C6B1EB9F42E00EBF1C3 /* get_hanning_window.c in Sources */, - D0EC6C6D1EB9F42E00EBF1C3 /* ilbc_specific_functions.c in Sources */, - D0EC6C551EB9F42E00EBF1C3 /* stringutils.cc in Sources */, - D0EC6C581EB9F42E00EBF1C3 /* fft4g.c in Sources */, - D0EC6C881EB9F42E00EBF1C3 /* aec_resampler.cc in Sources */, - D0EC6C9B1EB9F42E00EBF1C3 /* delay_estimator_wrapper.cc in Sources */, - D0EC6C6A1EB9F42E00EBF1C3 /* filter_ma_fast_q12.c in Sources */, - D0EC6C781EB9F42E00EBF1C3 /* resample_by_2_internal.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/TelegramUI/AudioWaveform.swift b/TelegramUI/AudioWaveform.swift index 5aafe6dffe..01515cbead 100644 --- a/TelegramUI/AudioWaveform.swift +++ b/TelegramUI/AudioWaveform.swift @@ -55,7 +55,7 @@ final class AudioWaveform: Equatable { let numSamples = self.samples.count / 2 let bitstreamLength = (numSamples * 5) / 8 + (((numSamples * 5) % 8) == 0 ? 0 : 1) var result = Data() - result.count = bitstreamLength + result.count = bitstreamLength + 4 let maxSample: Int32 = self.peak @@ -63,11 +63,16 @@ final class AudioWaveform: Equatable { result.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) -> Void in for i in 0 ..< numSamples { let value: Int32 = min(Int32(31), abs(Int32(samples[i])) * 31 / maxSample) + if i == 99 { + assert(true) + } setBits(data: bytes, bitOffset: i * 5, numBits: 5, value: value & Int32(31)) } } } + result.count = bitstreamLength + return result } diff --git a/TelegramUI/AvatarNode.swift b/TelegramUI/AvatarNode.swift index d6fc453d48..07980684f2 100644 --- a/TelegramUI/AvatarNode.swift +++ b/TelegramUI/AvatarNode.swift @@ -139,7 +139,7 @@ public final class AvatarNode: ASDisplayNode { representation = nil savedMessagesIcon = true } - } else { + } else if peer.restrictionText == nil { representation = peer.smallProfileImage } let updatedState: AvatarNodeState = .peerAvatar(peer.id, peer.displayLetters, representation) diff --git a/TelegramUI/ChatController.swift b/TelegramUI/ChatController.swift index 554ac499a2..0d5f12e342 100644 --- a/TelegramUI/ChatController.swift +++ b/TelegramUI/ChatController.swift @@ -157,6 +157,9 @@ public final class ChatController: TelegramController { private var raiseToListen: RaiseToListenManager? + private weak var silentPostTooltipController: TooltipController? + private weak var mediaRecordingModeTooltipController: TooltipController? + public init(account: Account, chatLocation: ChatLocation, messageId: MessageId? = nil, botStart: ChatControllerInitialBotStart? = nil, mode: ChatControllerPresentationMode = .standard) { self.account = account self.chatLocation = chatLocation @@ -224,9 +227,11 @@ public final class ChatController: TelegramController { self?.openPeer(peerId: peer.id, navigation: navigation, fromMessage: nil) }, callPeer: { peerId in self?.controllerInteraction?.callPeer(peerId) - }, sendSticker: { file in + }, enqueueMessage: { message in + self?.sendMessages([message]) + }, sendSticker: canSendMessagesToChat(strongSelf.presentationInterfaceState) ? { file in self?.controllerInteraction?.sendSticker(file) - }, setupTemporaryHiddenMedia: { signal, centralIndex, galleryMedia in + } : nil, setupTemporaryHiddenMedia: { signal, centralIndex, galleryMedia in if let strongSelf = self { strongSelf.temporaryHiddenGalleryMediaDisposable.set((signal |> deliverOnMainQueue).start(next: { entry in if let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction { @@ -330,7 +335,7 @@ public final class ChatController: TelegramController { strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState { $0.withToggledSelectedMessages(ids, value: value) } }) } }, sendMessage: { [weak self] text in - if let strongSelf = self { + if let strongSelf = self, canSendMessagesToChat(strongSelf.presentationInterfaceState) { strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({ if let strongSelf = self { strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, { @@ -438,11 +443,33 @@ public final class ChatController: TelegramController { } }, shareCurrentLocation: { [weak self] in if let strongSelf = self { - + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Conversation_ShareBotLocationConfirmationTitle, text: strongSelf.presentationData.strings.Conversation_ShareBotLocationConfirmation, actions: [TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + if let strongSelf = self, let locationManager = strongSelf.account.telegramApplicationContext.locationManager { + let _ = (currentLocationManagerCoordinate(manager: locationManager, timeout: 5.0) + |> deliverOnMainQueue).start(next: { coordinate in + if let strongSelf = self { + if let coordinate = coordinate { + strongSelf.sendMessages([.message(text: "", attributes: [], media: TelegramMediaMap(latitude: coordinate.latitude, longitude: coordinate.longitude, geoPlace: nil, venue: nil, liveBroadcastingTimeout: nil), replyToMessageId: nil, localGroupingKey: nil)]) + } else { + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: {})]), in: .window(.root)) + } + } + }) + } + })]), in: .window(.root)) } }, shareAccountContact: { [weak self] in if let strongSelf = self { - + strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Conversation_ShareBotContactConfirmationTitle, text: strongSelf.presentationData.strings.Conversation_ShareBotContactConfirmation, actions: [TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + if let strongSelf = self { + let _ = (strongSelf.account.postbox.loadedPeerWithId(strongSelf.account.peerId) + |> deliverOnMainQueue).start(next: { peer in + if let peer = peer as? TelegramUser, let phone = peer.phone, !phone.isEmpty { + strongSelf.sendMessages([.message(text: "", attributes: [], media: TelegramMediaContact(firstName: peer.firstName ?? "", lastName: peer.lastName ?? "", phoneNumber: phone, peerId: peer.id), replyToMessageId: nil, localGroupingKey: nil)]) + } + }) + } + })]), in: .window(.root)) } }, sendBotCommand: { [weak self] messageId, command in if let strongSelf = self { @@ -486,7 +513,13 @@ public final class ChatController: TelegramController { if let strongSelf = self { strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { return $0.updatedInterfaceState { - return $0.withUpdatedEffectiveInputState(f($0.effectiveInputState)) + let updatedState: ChatTextInputState + if canSendMessagesToChat(strongSelf.presentationInterfaceState) { + updatedState = f($0.effectiveInputState) + } else { + updatedState = ChatTextInputState() + } + return $0.withUpdatedEffectiveInputState(updatedState) } }) } @@ -1312,6 +1345,16 @@ public final class ChatController: TelegramController { } } + self.chatDisplayNode.sendMessages = { [weak self] messages in + if let strongSelf = self, case let .peer(peerId) = strongSelf.chatLocation { + let _ = (enqueueMessages(account: strongSelf.account, peerId: peerId, messages: strongSelf.transformEnqueueMessages(messages)) |> deliverOnMainQueue).start(next: { _ in + if let strongSelf = self { + strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory() + } + }) + } + } + self.chatDisplayNode.requestUpdateChatInterfaceState = { [weak self] animated, f in self?.updateChatPresentationInterfaceState(animated: animated, interactive: true, { $0.updatedInterfaceState(f) }) } @@ -1345,7 +1388,7 @@ public final class ChatController: TelegramController { }) } }, openFileGallery: { - self?.presentMediaPicker(fileMode: true) + self?.presentFileMediaPickerOptions() }, openMap: { self?.presentMapPicker() }, openContacts: { @@ -1473,9 +1516,9 @@ public final class ChatController: TelegramController { } let interfaceInteraction = ChatPanelInterfaceInteraction(setupReplyMessage: { [weak self] messageId in - if let strongSelf = self, strongSelf.isNodeLoaded { + if let strongSelf = self, strongSelf.isNodeLoaded, canSendMessagesToChat(strongSelf.presentationInterfaceState) { if let message = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(messageId) { - strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState { $0.withUpdatedReplyMessageId(message.id) } }) + strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState({ $0.withUpdatedReplyMessageId(message.id) }).updatedSearch(nil) }) strongSelf.chatDisplayNode.ensureInputViewFocused() } } @@ -1810,6 +1853,7 @@ public final class ChatController: TelegramController { } strongSelf.recordingModeFeedback?.impact() + var updatedMode: ChatTextInputMediaRecordingButtonMode? strongSelf.updateChatPresentationInterfaceState(interactive: true, { return $0.updatedInterfaceState { current in @@ -1820,9 +1864,37 @@ public final class ChatController: TelegramController { case .video: mode = .audio } + updatedMode = mode return current.withUpdatedMediaRecordingMode(mode) } }) + + let rect: CGRect? = strongSelf.chatDisplayNode.frameForInputActionButton() + + let text: String + if let updatedMode = updatedMode, updatedMode == .audio { + text = strongSelf.presentationData.strings.Conversation_HoldForAudio + } else { + text = strongSelf.presentationData.strings.Conversation_HoldForVideo + } + + if let tooltipController = strongSelf.mediaRecordingModeTooltipController { + tooltipController.text = text + } else if let rect = rect { + let tooltipController = TooltipController(text: text) + strongSelf.mediaRecordingModeTooltipController = tooltipController + tooltipController.dismissed = { [weak tooltipController] in + if let strongSelf = self, let tooltipController = tooltipController, strongSelf.mediaRecordingModeTooltipController === tooltipController { + strongSelf.mediaRecordingModeTooltipController = nil + } + } + strongSelf.present(tooltipController, in: .window(.root), with: TooltipControllerPresentationArguments(sourceNodeAndRect: { + if let strongSelf = self { + return (strongSelf.chatDisplayNode, rect) + } + return nil + })) + } } }, setupMessageAutoremoveTimeout: { [weak self] in if let strongSelf = self, case let .peer(peerId) = strongSelf.chatLocation, peerId.namespace == Namespaces.Peer.SecretChat { @@ -1971,6 +2043,46 @@ public final class ChatController: TelegramController { if let strongSelf = self, case let .group(groupId) = strongSelf.chatLocation { (strongSelf.navigationController as? NavigationController)?.pushViewController(FeedGroupingController(account: strongSelf.account, groupId: groupId)) } + }, toggleSilentPost: { [weak self] in + if let strongSelf = self { + var value: Bool = false + strongSelf.updateChatPresentationInterfaceState(interactive: true, { + $0.updatedInterfaceState { + value = !$0.silentPosting + return $0.withUpdatedSilentPosting(value) + } + }) + + var rect: CGRect? = strongSelf.chatDisplayNode.frameForInputPanelAccessoryButton(.silentPost(true)) + if rect == nil { + rect = strongSelf.chatDisplayNode.frameForInputPanelAccessoryButton(.silentPost(false)) + } + + let text: String + if !value { + text = strongSelf.presentationData.strings.Conversation_SilentBroadcastTooltipOn + } else { + text = strongSelf.presentationData.strings.Conversation_SilentBroadcastTooltipOff + } + + if let tooltipController = strongSelf.silentPostTooltipController { + tooltipController.text = text + } else if let rect = rect { + let tooltipController = TooltipController(text: text) + strongSelf.silentPostTooltipController = tooltipController + tooltipController.dismissed = { [weak tooltipController] in + if let strongSelf = self, let tooltipController = tooltipController, strongSelf.silentPostTooltipController === tooltipController { + strongSelf.silentPostTooltipController = nil + } + } + strongSelf.present(tooltipController, in: .window(.root), with: TooltipControllerPresentationArguments(sourceNodeAndRect: { + if let strongSelf = self { + return (strongSelf.chatDisplayNode, rect) + } + return nil + })) + } + } }, statuses: ChatPanelInterfaceInteractionStatuses(editingMessage: self.editingMessage.get(), startingBot: self.startingBot.get(), unblockingPeer: self.unblockingPeer.get(), searching: self.searching.get(), loadingMessage: self.loadingMessage.get())) switch self.chatLocation { @@ -2496,7 +2608,7 @@ public final class ChatController: TelegramController { self.navigationActionDisposable.set((peerView.get() |> take(1) |> deliverOnMainQueue).start(next: { [weak self] peerView in - if let strongSelf = self, let peer = peerView.peers[peerView.peerId] { + if let strongSelf = self, let peer = peerView.peers[peerView.peerId], peer.restrictionText == nil { if let infoController = peerInfoController(account: strongSelf.account, peer: peer) { (strongSelf.navigationController as? NavigationController)?.pushViewController(infoController) } @@ -2512,6 +2624,64 @@ public final class ChatController: TelegramController { } } + private func presentFileMediaPickerOptions() { + let actionSheet = ActionSheetController(presentationTheme: self.presentationData.theme) + actionSheet.setItemGroups([ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: self.presentationData.strings.Conversation_FilePhotoOrVideo, action: { [weak self, weak actionSheet] in + actionSheet?.dismissAnimated() + if let strongSelf = self { + strongSelf.presentMediaPicker(fileMode: true) + } + }), + ActionSheetButtonItem(title: self.presentationData.strings.Conversation_FileICloudDrive, action: { [weak self, weak actionSheet] in + actionSheet?.dismissAnimated() + if let strongSelf = self { + strongSelf.present(legacyICloudFileController(theme: strongSelf.presentationData.theme, completion: { urls in + if let strongSelf = self, !urls.isEmpty { + var signals: [Signal] = [] + for url in urls { + signals.append(iCloudFileDescription(url)) + } + strongSelf.enqueueMediaMessageDisposable.set((combineLatest(signals) + |> deliverOnMainQueue).start(next: { results in + if let strongSelf = self { + let replyMessageId = strongSelf.presentationInterfaceState.interfaceState.replyMessageId + + var messages: [EnqueueMessage] = [] + for item in results { + if let item = item { + let fileId = arc4random64() + let file = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: fileId), resource: ICloudFileResource(urlData: item.urlData), previewRepresentations: [], mimeType: guessMimeTypeByFileExtension((item.fileName as NSString).pathExtension), size: item.fileSize, attributes: [.FileName(fileName: item.fileName)]) + let message: EnqueueMessage = .message(text: "", attributes: [], media: file, replyToMessageId: replyMessageId, localGroupingKey: nil) + messages.append(message) + } + } + + if !messages.isEmpty { + strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({ + if let strongSelf = self { + strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, { + $0.updatedInterfaceState { $0.withUpdatedReplyMessageId(nil) } + }) + } + }) + strongSelf.sendMessages(messages) + } + } + })) + } + }), in: .window(.root)) + } + }) + ]), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: self.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + self.chatDisplayNode.dismissInput() + self.present(actionSheet, in: .window(.root)) + } + private func presentMediaPicker(fileMode: Bool) { let _ = (self.account.postbox.modify { modifier -> GeneratedMediaStoreSettings in let entry = modifier.getPreferencesEntry(key: ApplicationSpecificPreferencesKeys.generatedMediaStoreSettings) as? GeneratedMediaStoreSettings @@ -2599,9 +2769,30 @@ public final class ChatController: TelegramController { }) } + private func transformEnqueueMessages(_ messages: [EnqueueMessage]) -> [EnqueueMessage] { + let silentPosting = self.presentationInterfaceState.interfaceState.silentPosting + return messages.map { message in + if silentPosting { + return message.withUpdatedAttributes { attributes in + var attributes = attributes + for i in 0 ..< attributes.count { + if attributes[i] is NotificationInfoMessageAttribute { + attributes.remove(at: i) + break + } + } + attributes.append(NotificationInfoMessageAttribute(flags: .muted)) + return attributes + } + } else { + return message + } + } + } + private func sendMessages(_ messages: [EnqueueMessage]) { if case let .peer(peerId) = self.chatLocation { - let _ = (enqueueMessages(account: self.account, peerId: peerId, messages: messages) + let _ = (enqueueMessages(account: self.account, peerId: peerId, messages: self.transformEnqueueMessages(messages)) |> deliverOnMainQueue).start(next: { [weak self] _ in self?.chatDisplayNode.historyNode.scrollToEndOfHistory() }) @@ -3338,7 +3529,7 @@ public final class ChatController: TelegramController { if let _ = data.peer as? TelegramUser { items.append(UIPreviewAction(title: "👍", style: .default, handler: { _, _ in if let strongSelf = self { - let _ = enqueueMessages(account: strongSelf.account, peerId: peer.id, messages: [.message(text: "👍", attributes: [], media: nil, replyToMessageId: nil, localGroupingKey: nil)]).start() + let _ = enqueueMessages(account: strongSelf.account, peerId: peer.id, messages: strongSelf.transformEnqueueMessages([.message(text: "👍", attributes: [], media: nil, replyToMessageId: nil, localGroupingKey: nil)])).start() } })) } diff --git a/TelegramUI/ChatControllerNode.swift b/TelegramUI/ChatControllerNode.swift index a28b414f3d..b9b124b368 100644 --- a/TelegramUI/ChatControllerNode.swift +++ b/TelegramUI/ChatControllerNode.swift @@ -29,6 +29,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { let backgroundNode: ASDisplayNode let historyNode: ChatHistoryListNode let loadingNode: ChatLoadingNode + var restrictedNode: ChatRecentActionsEmptyNode? private var validLayout: ContainerViewLayout? @@ -76,6 +77,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } var requestUpdateChatInterfaceState: (Bool, (ChatInterfaceState) -> ChatInterfaceState) -> Void = { _, _ in } + var sendMessages: ([EnqueueMessage]) -> Void = { _ in } var displayAttachmentMenu: () -> Void = { } var displayPasteMenu: ([UIImage]) -> Void = { _ in } var updateTypingActivity: () -> Void = { } @@ -231,11 +233,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } if case let .peer(peerId) = strongSelf.chatLocation { - let _ = (enqueueMessages(account: strongSelf.account, peerId: peerId, messages: messages) |> deliverOnMainQueue).start(next: { _ in - if let strongSelf = self { - strongSelf.historyNode.scrollToEndOfHistory() - } - }) + strongSelf.sendMessages(messages) } } } @@ -304,6 +302,9 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { containerNode.cornerRadius = 15.0 containerNode.addSubnode(self.backgroundNode) containerNode.addSubnode(self.historyNode) + if let restrictedNode = self.restrictedNode { + containerNode.addSubnode(restrictedNode) + } self.containerNode = containerNode self.scrollContainerNode?.addSubnode(containerNode) self.navigationBar.isHidden = true @@ -329,6 +330,9 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { containerNode.removeFromSupernode() self.insertSubnode(self.backgroundNode, at: 0) self.insertSubnode(self.historyNode, aboveSubnode: self.backgroundNode) + if let restrictedNode = self.restrictedNode { + self.insertSubnode(restrictedNode, aboveSubnode: self.historyNode) + } self.navigationBar.isHidden = false } if let overlayNavigationBar = self.overlayNavigationBar { @@ -521,6 +525,11 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { self.loadingNode.updateLayout(size: contentBounds.size, insets: insets, transition: transition) transition.updateFrame(node: self.loadingNode, frame: contentBounds) + if let restrictedNode = self.restrictedNode { + transition.updateFrame(node: restrictedNode, frame: contentBounds) + restrictedNode.updateLayout(size: contentBounds.size, transition: transition) + } + let listViewCurve: ListViewAnimationCurve if curve == 7 { listViewCurve = .Spring(duration: duration) @@ -948,6 +957,22 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { textInputPanelNode?.updateKeepSendButtonEnabled(keepSendButtonEnabled: keepSendButtonEnabled, extendedSearchLayout: extendedSearchLayout, animated: animated) } + if let peer = chatPresentationInterfaceState.peer, let restrictionText = peer.restrictionText { + if self.restrictedNode == nil { + let restrictedNode = ChatRecentActionsEmptyNode(theme: chatPresentationInterfaceState.theme) + self.historyNode.supernode?.insertSubnode(restrictedNode, aboveSubnode: self.historyNode) + self.restrictedNode = restrictedNode + } + self.restrictedNode?.setup(title: "", text: processedPeerRestrictionText(restrictionText)) + self.historyNode.isHidden = true + self.navigateButtons.isHidden = true + } else if let restrictedNode = self.restrictedNode { + self.restrictedNode = nil + restrictedNode.removeFromSupernode() + self.historyNode.isHidden = false + self.navigateButtons.isHidden = false + } + let layoutTransition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.4, curve: .spring) : .immediate if updatedInputFocus { @@ -1068,6 +1093,24 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { return self.inputPanelNode?.frame } + func frameForInputPanelAccessoryButton(_ item: ChatTextInputAccessoryItem) -> CGRect? { + if let textInputPanelNode = self.textInputPanelNode, self.inputPanelNode === textInputPanelNode { + return textInputPanelNode.frameForAccessoryButton(item).flatMap { + return $0.offsetBy(dx: textInputPanelNode.frame.minX, dy: textInputPanelNode.frame.minY) + } + } + return nil + } + + func frameForInputActionButton() -> CGRect? { + if let textInputPanelNode = self.textInputPanelNode, self.inputPanelNode === textInputPanelNode { + return textInputPanelNode.frameForInputActionButton().flatMap { + return $0.offsetBy(dx: textInputPanelNode.frame.minX, dy: textInputPanelNode.frame.minY) + } + } + return nil + } + var isTextInputPanelActive: Bool { return self.inputPanelNode is ChatTextInputPanelNode } diff --git a/TelegramUI/ChatInterfaceInputContexts.swift b/TelegramUI/ChatInterfaceInputContexts.swift index 0946abea7d..de22000351 100644 --- a/TelegramUI/ChatInterfaceInputContexts.swift +++ b/TelegramUI/ChatInterfaceInputContexts.swift @@ -199,6 +199,14 @@ func inputTextPanelStateForChatPresentationInterfaceState(_ chatPresentationInte if let peer = chatPresentationInterfaceState.peer as? TelegramSecretChat { accessoryItems.append(.messageAutoremoveTimeout(peer.messageAutoremoveTimeout)) } + if let peer = chatPresentationInterfaceState.peer as? TelegramChannel, case .broadcast = peer.info, canSendMessagesToPeer(peer) { + accessoryItems.append(.silentPost(chatPresentationInterfaceState.interfaceState.silentPosting)) + } + if let peer = chatPresentationInterfaceState.peer as? TelegramUser { + if let _ = peer.botInfo { + accessoryItems.append(.commands) + } + } accessoryItems.append(.stickers) if let message = chatPresentationInterfaceState.keyboardButtonsMessage, let _ = message.visibleButtonKeyboardMarkup { accessoryItems.append(.inputButtons) diff --git a/TelegramUI/ChatInterfaceState.swift b/TelegramUI/ChatInterfaceState.swift index e12b0c1fe1..a5f44dfb6c 100644 --- a/TelegramUI/ChatInterfaceState.swift +++ b/TelegramUI/ChatInterfaceState.swift @@ -429,6 +429,7 @@ final class ChatInterfaceState: SynchronizeableChatInterfaceState, Equatable { let messageActionsState: ChatInterfaceMessageActionsState let historyScrollState: ChatInterfaceHistoryScrollState? let mediaRecordingMode: ChatTextInputMediaRecordingButtonMode + let silentPosting: Bool var chatListEmbeddedState: PeerChatListEmbeddedInterfaceState? { if self.composeInputState.inputText.length != 0 && self.timestamp != 0 { @@ -477,9 +478,10 @@ final class ChatInterfaceState: SynchronizeableChatInterfaceState, Equatable { self.messageActionsState = ChatInterfaceMessageActionsState() self.historyScrollState = nil self.mediaRecordingMode = .audio + self.silentPosting = false } - init(timestamp: Int32, composeInputState: ChatTextInputState, composeDisableUrlPreview: String?, replyMessageId: MessageId?, forwardMessageIds: [MessageId]?, editMessage: ChatEditMessageState?, selectionState: ChatInterfaceSelectionState?, messageActionsState: ChatInterfaceMessageActionsState, historyScrollState: ChatInterfaceHistoryScrollState?, mediaRecordingMode: ChatTextInputMediaRecordingButtonMode) { + init(timestamp: Int32, composeInputState: ChatTextInputState, composeDisableUrlPreview: String?, replyMessageId: MessageId?, forwardMessageIds: [MessageId]?, editMessage: ChatEditMessageState?, selectionState: ChatInterfaceSelectionState?, messageActionsState: ChatInterfaceMessageActionsState, historyScrollState: ChatInterfaceHistoryScrollState?, mediaRecordingMode: ChatTextInputMediaRecordingButtonMode, silentPosting: Bool) { self.timestamp = timestamp self.composeInputState = composeInputState self.composeDisableUrlPreview = composeDisableUrlPreview @@ -490,6 +492,7 @@ final class ChatInterfaceState: SynchronizeableChatInterfaceState, Equatable { self.messageActionsState = messageActionsState self.historyScrollState = historyScrollState self.mediaRecordingMode = mediaRecordingMode + self.silentPosting = silentPosting } init(decoder: PostboxDecoder) { @@ -537,6 +540,8 @@ final class ChatInterfaceState: SynchronizeableChatInterfaceState, Equatable { self.historyScrollState = decoder.decodeObjectForKey("hss", decoder: { ChatInterfaceHistoryScrollState(decoder: $0) }) as? ChatInterfaceHistoryScrollState self.mediaRecordingMode = ChatTextInputMediaRecordingButtonMode(rawValue: decoder.decodeInt32ForKey("mrm", orElse: 0))! + + self.silentPosting = decoder.decodeInt32ForKey("sip", orElse: 0) != 0 } func encode(_ encoder: PostboxEncoder) { @@ -584,6 +589,7 @@ final class ChatInterfaceState: SynchronizeableChatInterfaceState, Equatable { encoder.encodeNil(forKey: "hss") } encoder.encodeInt32(self.mediaRecordingMode.rawValue, forKey: "mrm") + encoder.encodeInt32(self.silentPosting ? 1 : 0, forKey: "sip") } func isEqual(to: PeerChatInterfaceState) -> Bool { @@ -614,17 +620,20 @@ final class ChatInterfaceState: SynchronizeableChatInterfaceState, Equatable { if lhs.mediaRecordingMode != rhs.mediaRecordingMode { return false } + if lhs.silentPosting != rhs.silentPosting { + return false + } return lhs.composeInputState == rhs.composeInputState && lhs.replyMessageId == rhs.replyMessageId && lhs.selectionState == rhs.selectionState && lhs.editMessage == rhs.editMessage } func withUpdatedComposeInputState(_ inputState: ChatTextInputState) -> ChatInterfaceState { let updatedComposeInputState = inputState - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: updatedComposeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: updatedComposeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withUpdatedComposeDisableUrlPreview(_ disableUrlPreview: String?) -> ChatInterfaceState { - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: disableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: disableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withUpdatedEffectiveInputState(_ inputState: ChatTextInputState) -> ChatInterfaceState { @@ -636,15 +645,15 @@ final class ChatInterfaceState: SynchronizeableChatInterfaceState, Equatable { updatedComposeInputState = inputState } - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: updatedComposeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: updatedEditMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: updatedComposeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: updatedEditMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withUpdatedReplyMessageId(_ replyMessageId: MessageId?) -> ChatInterfaceState { - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withUpdatedForwardMessageIds(_ forwardMessageIds: [MessageId]?) -> ChatInterfaceState { - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withUpdatedSelectedMessages(_ messageIds: [MessageId]) -> ChatInterfaceState { @@ -655,7 +664,7 @@ final class ChatInterfaceState: SynchronizeableChatInterfaceState, Equatable { for messageId in messageIds { selectedIds.insert(messageId) } - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: ChatInterfaceSelectionState(selectedIds: selectedIds), messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: ChatInterfaceSelectionState(selectedIds: selectedIds), messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withToggledSelectedMessages(_ messageIds: [MessageId], value: Bool) -> ChatInterfaceState { @@ -670,30 +679,34 @@ final class ChatInterfaceState: SynchronizeableChatInterfaceState, Equatable { selectedIds.remove(messageId) } } - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: ChatInterfaceSelectionState(selectedIds: selectedIds), messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: ChatInterfaceSelectionState(selectedIds: selectedIds), messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withoutSelectionState() -> ChatInterfaceState { - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: nil, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: nil, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withUpdatedTimestamp(_ timestamp: Int32) -> ChatInterfaceState { - return ChatInterfaceState(timestamp: timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withUpdatedEditMessage(_ editMessage: ChatEditMessageState?) -> ChatInterfaceState { - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withUpdatedMessageActionsState(_ f: (ChatInterfaceMessageActionsState) -> ChatInterfaceMessageActionsState) -> ChatInterfaceState { - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: f(self.messageActionsState), historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: f(self.messageActionsState), historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withUpdatedHistoryScrollState(_ historyScrollState: ChatInterfaceHistoryScrollState?) -> ChatInterfaceState { - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: historyScrollState, mediaRecordingMode: self.mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: self.silentPosting) } func withUpdatedMediaRecordingMode(_ mediaRecordingMode: ChatTextInputMediaRecordingButtonMode) -> ChatInterfaceState { - return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: mediaRecordingMode) + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: mediaRecordingMode, silentPosting: self.silentPosting) + } + + func withUpdatedSilentPosting(_ silentPosting: Bool) -> ChatInterfaceState { + return ChatInterfaceState(timestamp: self.timestamp, composeInputState: self.composeInputState, composeDisableUrlPreview: self.composeDisableUrlPreview, replyMessageId: self.replyMessageId, forwardMessageIds: self.forwardMessageIds, editMessage: self.editMessage, selectionState: self.selectionState, messageActionsState: self.messageActionsState, historyScrollState: self.historyScrollState, mediaRecordingMode: self.mediaRecordingMode, silentPosting: silentPosting) } } diff --git a/TelegramUI/ChatInterfaceStateInputPanels.swift b/TelegramUI/ChatInterfaceStateInputPanels.swift index 0222cd13a6..ea4c816e66 100644 --- a/TelegramUI/ChatInterfaceStateInputPanels.swift +++ b/TelegramUI/ChatInterfaceStateInputPanels.swift @@ -3,6 +3,10 @@ import AsyncDisplayKit import TelegramCore func inputPanelForChatPresentationIntefaceState(_ chatPresentationInterfaceState: ChatPresentationInterfaceState, account: Account, currentPanel: ChatInputPanelNode?, textInputPanelNode: ChatTextInputPanelNode?, interfaceInteraction: ChatPanelInterfaceInteraction?) -> ChatInputPanelNode? { + if let peer = chatPresentationInterfaceState.peer, peer.restrictionText != nil { + return nil + } + if let _ = chatPresentationInterfaceState.search { var hasSelection = false if let selectionState = chatPresentationInterfaceState.interfaceState.selectionState, !selectionState.selectedIds.isEmpty { diff --git a/TelegramUI/ChatInterfaceTitlePanelNodes.swift b/TelegramUI/ChatInterfaceTitlePanelNodes.swift index b439b7dd75..4b36990015 100644 --- a/TelegramUI/ChatInterfaceTitlePanelNodes.swift +++ b/TelegramUI/ChatInterfaceTitlePanelNodes.swift @@ -5,6 +5,9 @@ func titlePanelForChatPresentationInterfaceState(_ chatPresentationInterfaceStat if case .overlay = chatPresentationInterfaceState.mode { return nil } + if chatPresentationInterfaceState.peer?.restrictionText != nil { + return nil + } if chatPresentationInterfaceState.search != nil { return nil } diff --git a/TelegramUI/ChatMessageActionItemNode.swift b/TelegramUI/ChatMessageActionItemNode.swift index ca84af48df..cca5c67a40 100644 --- a/TelegramUI/ChatMessageActionItemNode.swift +++ b/TelegramUI/ChatMessageActionItemNode.swift @@ -357,6 +357,8 @@ private func universalServiceMessageString(theme: PresentationTheme?, strings: P attributedString = NSAttributedString(string: titleString, font: titleFont, textColor: primaryTextColor) case let .customText(text, entities): attributedString = stringWithAppliedEntities(text, entities: entities, baseColor: primaryTextColor, linkColor: primaryTextColor, baseFont: titleFont, linkFont: titleBoldFont, boldFont: titleBoldFont, italicFont: titleFont, fixedFont: titleFont) + case let .botDomainAccessGranted(domain): + attributedString = NSAttributedString(string: "Granted access to \(domain)", font: titleFont, textColor: primaryTextColor) case .unknown: attributedString = nil } diff --git a/TelegramUI/ChatMessageBubbleItemNode.swift b/TelegramUI/ChatMessageBubbleItemNode.swift index 05d2134094..22b73bc044 100644 --- a/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/TelegramUI/ChatMessageBubbleItemNode.swift @@ -286,6 +286,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { let avatarInset: CGFloat var hasAvatar = false + var allowFullWidth = false switch item.chatLocation { case let .peer(peerId): if item.message.id.peerId == item.account.peerId { @@ -304,6 +305,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { var isBroadcastChannel = false if let peer = firstMessage.peers[firstMessage.id.peerId] as? TelegramChannel, case .broadcast = peer.info { isBroadcastChannel = true + allowFullWidth = true } if !isBroadcastChannel { @@ -314,6 +316,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { hasAvatar = true } case .group: + allowFullWidth = true hasAvatar = true displayAuthorInfo = true } @@ -365,9 +368,17 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { } } - var tmpWidth = layoutConstants.bubble.maximumWidthFill.widthFor(baseWidth) - if needShareButton { - tmpWidth -= 32.0 + var tmpWidth: CGFloat + if allowFullWidth { + tmpWidth = baseWidth + if needShareButton { + tmpWidth -= 38.0 + } + } else { + tmpWidth = layoutConstants.bubble.maximumWidthFill.widthFor(baseWidth) + if needShareButton && tmpWidth + 32.0 > baseWidth { + tmpWidth = baseWidth - 32.0 + } } let maximumContentWidth = floor(tmpWidth - layoutConstants.bubble.edgeInset - layoutConstants.bubble.edgeInset - layoutConstants.bubble.contentInsets.left - layoutConstants.bubble.contentInsets.right - avatarInset) diff --git a/TelegramUI/ChatMessageDateHeader.swift b/TelegramUI/ChatMessageDateHeader.swift index 95aae21098..e770f39912 100644 --- a/TelegramUI/ChatMessageDateHeader.swift +++ b/TelegramUI/ChatMessageDateHeader.swift @@ -14,7 +14,6 @@ private let granularity: Int32 = 60 * 60 * 24 final class ChatMessageDateHeader: ListViewItemHeader { private let timestamp: Int32 - private let roundedUtcTimestamp: Int32 private let roundedTimestamp: Int32 let id: Int64 @@ -28,10 +27,8 @@ final class ChatMessageDateHeader: ListViewItemHeader { if timestamp == Int32.max { self.roundedTimestamp = timestamp / (granularity) * (granularity) - self.roundedUtcTimestamp = self.roundedTimestamp } else { self.roundedTimestamp = ((timestamp + timezoneOffset) / (granularity)) * (granularity) - self.roundedUtcTimestamp = ((timestamp) / (granularity)) * (granularity) } self.id = Int64(self.roundedTimestamp) } @@ -41,7 +38,7 @@ final class ChatMessageDateHeader: ListViewItemHeader { let height: CGFloat = 34.0 func node() -> ListViewItemHeaderNode { - return ChatMessageDateHeaderNode(utcTimestamp: self.roundedUtcTimestamp, theme: self.theme, strings: self.strings) + return ChatMessageDateHeaderNode(localTimestamp: self.roundedTimestamp, theme: self.theme, strings: self.strings) } } @@ -83,15 +80,15 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { let backgroundNode: ASImageNode let stickBackgroundNode: ASImageNode - private let utcTimestamp: Int32 + private let localTimestamp: Int32 private var theme: PresentationTheme private var strings: PresentationStrings private var flashingOnScrolling = false private var stickDistanceFactor: CGFloat = 0.0 - init(utcTimestamp: Int32, theme: PresentationTheme, strings: PresentationStrings) { - self.utcTimestamp = utcTimestamp + init(localTimestamp: Int32, theme: PresentationTheme, strings: PresentationStrings) { + self.localTimestamp = localTimestamp self.theme = theme self.strings = strings @@ -129,9 +126,9 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { let nowTimestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) - var t: time_t = time_t(utcTimestamp) + var t: time_t = time_t(localTimestamp) var timeinfo: tm = tm() - localtime_r(&t, &timeinfo) + gmtime_r(&t, &timeinfo) var now: time_t = time_t(nowTimestamp) var timeinfoNow: tm = tm() diff --git a/TelegramUI/ChatMessageInteractiveFileNode.swift b/TelegramUI/ChatMessageInteractiveFileNode.swift index 200fac2bba..a041085278 100644 --- a/TelegramUI/ChatMessageInteractiveFileNode.swift +++ b/TelegramUI/ChatMessageInteractiveFileNode.swift @@ -415,6 +415,7 @@ final class ChatMessageInteractiveFileNode: ASTransformNode { if isVoice { if strongSelf.waveformScrubbingNode == nil { let waveformScrubbingNode = MediaPlayerScrubbingNode(content: .custom(backgroundNode: strongSelf.waveformNode, foregroundContentNode: strongSelf.waveformForegroundNode)) + waveformScrubbingNode.hitTestSlop = UIEdgeInsetsMake(-10.0, 0.0, -10.0, 0.0) waveformScrubbingNode.seek = { timestamp in if let strongSelf = self, let account = strongSelf.account, let message = strongSelf.message, let type = peerMessageMediaPlayerType(message) { account.telegramApplicationContext.mediaManager.playlistControl(.seek(timestamp), type: type) @@ -497,6 +498,7 @@ final class ChatMessageInteractiveFileNode: ASTransformNode { } switch status { case let .fetchStatus(fetchStatus): + strongSelf.waveformScrubbingNode?.enableScrubbing = false switch fetchStatus { case let .Fetching(isActive, progress): var adjustedProgress = progress @@ -520,6 +522,7 @@ final class ChatMessageInteractiveFileNode: ASTransformNode { } } case let .playbackStatus(playbackStatus): + strongSelf.waveformScrubbingNode?.enableScrubbing = true switch playbackStatus { case .playing: state = .pause(statusForegroundColor) diff --git a/TelegramUI/ChatMessageInteractiveMediaNode.swift b/TelegramUI/ChatMessageInteractiveMediaNode.swift index 86ced435bb..6a0bed8d80 100644 --- a/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -243,8 +243,7 @@ final class ChatMessageInteractiveMediaNode: ASTransformNode { statusUpdated = true } - var updatedVideoNode: UniversalVideoNode? - var replaceVideoNode = false + var replaceVideoNode: Bool? var updateVideoFile: TelegramMediaFile? if mediaUpdated { @@ -283,14 +282,11 @@ final class ChatMessageInteractiveMediaNode: ASTransformNode { updateVideoFile = file if hasCurrentVideoNode { } else { - let videoNode = UniversalVideoNode(postbox: account.postbox, audioSession: account.telegramApplicationContext.mediaManager.audioSession, manager: account.telegramApplicationContext.mediaManager.universalVideoManager, decoration: ChatBubbleVideoDecoration(cornerRadius: 17.0, nativeSize: nativeSize), content: NativeVideoContent(id: .message(message.id, file.fileId), file: file, enableSound: false), priority: .embedded) - videoNode.isUserInteractionEnabled = false - updatedVideoNode = videoNode replaceVideoNode = true } } else { if hasCurrentVideoNode { - replaceVideoNode = true + replaceVideoNode = false } } @@ -370,16 +366,19 @@ final class ChatMessageInteractiveMediaNode: ASTransformNode { strongSelf.statusNode?.position = CGPoint(x: imageFrame.midX, y: imageFrame.midY) strongSelf.timeoutNode?.position = CGPoint(x: imageFrame.midX, y: imageFrame.midY) - if replaceVideoNode { + if let replaceVideoNode = replaceVideoNode { if let videoNode = strongSelf.videoNode { videoNode.canAttachContent = false videoNode.removeFromSupernode() strongSelf.videoNode = nil } - if let updatedVideoNode = updatedVideoNode { - strongSelf.videoNode = updatedVideoNode - strongSelf.insertSubnode(updatedVideoNode, aboveSubnode: strongSelf.imageNode) + if replaceVideoNode, let updatedVideoFile = updateVideoFile { + let videoNode = UniversalVideoNode(postbox: account.postbox, audioSession: account.telegramApplicationContext.mediaManager.audioSession, manager: account.telegramApplicationContext.mediaManager.universalVideoManager, decoration: ChatBubbleVideoDecoration(cornerRadius: 17.0, nativeSize: nativeSize), content: NativeVideoContent(id: .message(message.id, updatedVideoFile.fileId), file: updatedVideoFile, enableSound: false), priority: .embedded) + videoNode.isUserInteractionEnabled = false + + strongSelf.videoNode = videoNode + strongSelf.insertSubnode(videoNode, aboveSubnode: strongSelf.imageNode) } } diff --git a/TelegramUI/ChatMessageItemView.swift b/TelegramUI/ChatMessageItemView.swift index 942a6ee330..422660bf5d 100644 --- a/TelegramUI/ChatMessageItemView.swift +++ b/TelegramUI/ChatMessageItemView.swift @@ -71,6 +71,11 @@ struct ChatMessageItemLayoutConstants { } } +enum ChatMessageItemBottomNeighbor { + case none + case merged(semi: Bool) +} + let defaultChatMessageItemLayoutConstants = ChatMessageItemLayoutConstants() public class ChatMessageItemView: ListViewItemNode { diff --git a/TelegramUI/ChatPanelInterfaceInteraction.swift b/TelegramUI/ChatPanelInterfaceInteraction.swift index 6381d3983c..74280beeb4 100644 --- a/TelegramUI/ChatPanelInterfaceInteraction.swift +++ b/TelegramUI/ChatPanelInterfaceInteraction.swift @@ -74,9 +74,10 @@ final class ChatPanelInterfaceInteraction { let presentController: (ViewController, Any?) -> Void let navigateFeed: () -> Void let openGrouping: () -> Void + let toggleSilentPost: () -> Void let statuses: ChatPanelInterfaceInteractionStatuses? - init(setupReplyMessage: @escaping (MessageId) -> Void, setupEditMessage: @escaping (MessageId) -> Void, beginMessageSelection: @escaping ([MessageId]) -> Void, deleteSelectedMessages: @escaping () -> Void, forwardSelectedMessages: @escaping () -> Void, shareSelectedMessages: @escaping () -> Void, updateTextInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputModeAndDismissedButtonKeyboardMessageId: @escaping ((ChatPresentationInterfaceState) -> (ChatInputMode, MessageId?)) -> Void, editMessage: @escaping () -> Void, beginMessageSearch: @escaping (ChatSearchDomain) -> Void, dismissMessageSearch: @escaping () -> Void, updateMessageSearch: @escaping (String) -> Void, navigateMessageSearch: @escaping (ChatPanelSearchNavigationAction) -> Void, openCalendarSearch: @escaping () -> Void, toggleMembersSearch: @escaping (Bool) -> Void, navigateToMessage: @escaping (MessageId) -> Void, openPeerInfo: @escaping () -> Void, togglePeerNotifications: @escaping () -> Void, sendContextResult: @escaping (ChatContextResultCollection, ChatContextResult) -> Void, sendBotCommand: @escaping (Peer, String) -> Void, sendBotStart: @escaping (String?) -> Void, botSwitchChatWithPayload: @escaping (PeerId, String) -> Void, beginMediaRecording: @escaping (Bool) -> Void, finishMediaRecording: @escaping (ChatFinishMediaRecordingAction) -> Void, stopMediaRecording: @escaping () -> Void, lockMediaRecording: @escaping () -> Void, deleteRecordedMedia: @escaping () -> Void, sendRecordedMedia: @escaping () -> Void, switchMediaRecordingMode: @escaping () -> Void, setupMessageAutoremoveTimeout: @escaping () -> Void, sendSticker: @escaping (TelegramMediaFile) -> Void, unblockPeer: @escaping () -> Void, pinMessage: @escaping (MessageId) -> Void, unpinMessage: @escaping () -> Void, reportPeer: @escaping () -> Void, dismissReportPeer: @escaping () -> Void, deleteChat: @escaping () -> Void, beginCall: @escaping () -> Void, toggleMessageStickerStarred: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigateFeed: @escaping () -> Void, openGrouping: @escaping () -> Void, statuses: ChatPanelInterfaceInteractionStatuses?) { + init(setupReplyMessage: @escaping (MessageId) -> Void, setupEditMessage: @escaping (MessageId) -> Void, beginMessageSelection: @escaping ([MessageId]) -> Void, deleteSelectedMessages: @escaping () -> Void, forwardSelectedMessages: @escaping () -> Void, shareSelectedMessages: @escaping () -> Void, updateTextInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputModeAndDismissedButtonKeyboardMessageId: @escaping ((ChatPresentationInterfaceState) -> (ChatInputMode, MessageId?)) -> Void, editMessage: @escaping () -> Void, beginMessageSearch: @escaping (ChatSearchDomain) -> Void, dismissMessageSearch: @escaping () -> Void, updateMessageSearch: @escaping (String) -> Void, navigateMessageSearch: @escaping (ChatPanelSearchNavigationAction) -> Void, openCalendarSearch: @escaping () -> Void, toggleMembersSearch: @escaping (Bool) -> Void, navigateToMessage: @escaping (MessageId) -> Void, openPeerInfo: @escaping () -> Void, togglePeerNotifications: @escaping () -> Void, sendContextResult: @escaping (ChatContextResultCollection, ChatContextResult) -> Void, sendBotCommand: @escaping (Peer, String) -> Void, sendBotStart: @escaping (String?) -> Void, botSwitchChatWithPayload: @escaping (PeerId, String) -> Void, beginMediaRecording: @escaping (Bool) -> Void, finishMediaRecording: @escaping (ChatFinishMediaRecordingAction) -> Void, stopMediaRecording: @escaping () -> Void, lockMediaRecording: @escaping () -> Void, deleteRecordedMedia: @escaping () -> Void, sendRecordedMedia: @escaping () -> Void, switchMediaRecordingMode: @escaping () -> Void, setupMessageAutoremoveTimeout: @escaping () -> Void, sendSticker: @escaping (TelegramMediaFile) -> Void, unblockPeer: @escaping () -> Void, pinMessage: @escaping (MessageId) -> Void, unpinMessage: @escaping () -> Void, reportPeer: @escaping () -> Void, dismissReportPeer: @escaping () -> Void, deleteChat: @escaping () -> Void, beginCall: @escaping () -> Void, toggleMessageStickerStarred: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigateFeed: @escaping () -> Void, openGrouping: @escaping () -> Void, toggleSilentPost: @escaping () -> Void, statuses: ChatPanelInterfaceInteractionStatuses?) { self.setupReplyMessage = setupReplyMessage self.setupEditMessage = setupEditMessage self.beginMessageSelection = beginMessageSelection @@ -119,6 +120,7 @@ final class ChatPanelInterfaceInteraction { self.presentController = presentController self.navigateFeed = navigateFeed self.openGrouping = openGrouping + self.toggleSilentPost = toggleSilentPost self.statuses = statuses } } diff --git a/TelegramUI/ChatPresentationInterfaceState.swift b/TelegramUI/ChatPresentationInterfaceState.swift index f17f8b6f3e..cbeb7fe52c 100644 --- a/TelegramUI/ChatPresentationInterfaceState.swift +++ b/TelegramUI/ChatPresentationInterfaceState.swift @@ -705,3 +705,15 @@ struct ChatPresentationInterfaceState: Equatable { return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, peer: self.peer, inputTextPanelState: self.inputTextPanelState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, canReportPeer: self.canReportPeer, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, fontSize: self.fontSize, accountPeerId: self.accountPeerId, mode: mode) } } + +func canSendMessagesToChat(_ state: ChatPresentationInterfaceState) -> Bool { + if let peer = state.peer { + if canSendMessagesToPeer(peer) { + return true + } else { + return false + } + } else { + return false + } +} diff --git a/TelegramUI/ChatRecentActionsController.swift b/TelegramUI/ChatRecentActionsController.swift index 01b9629f67..69e209cb60 100644 --- a/TelegramUI/ChatRecentActionsController.swift +++ b/TelegramUI/ChatRecentActionsController.swift @@ -135,6 +135,7 @@ final class ChatRecentActionsController: ViewController { }, presentController: { _, _ in }, navigateFeed: { }, openGrouping: { + }, toggleSilentPost: { }, statuses: nil) self.navigationItem.titleView = self.titleView diff --git a/TelegramUI/ChatRecentActionsControllerNode.swift b/TelegramUI/ChatRecentActionsControllerNode.swift index 665c47faae..5c84f89fab 100644 --- a/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/TelegramUI/ChatRecentActionsControllerNode.swift @@ -142,9 +142,8 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { self?.openPeer(peerId: peer.id, peer: peer) }, callPeer: { peerId in self?.controllerInteraction?.callPeer(peerId) - }, sendSticker: { file in - self?.controllerInteraction?.sendSticker(file) - }, setupTemporaryHiddenMedia: { signal, centralIndex, galleryMedia in + }, enqueueMessage: { _ in + }, sendSticker: nil, setupTemporaryHiddenMedia: { signal, centralIndex, galleryMedia in if let strongSelf = self { /*strongSelf.temporaryHiddenGalleryMediaDisposable.set((signal |> deliverOnMainQueue).start(next: { entry in if let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction { diff --git a/TelegramUI/ChatRecentActionsEmptyNode.swift b/TelegramUI/ChatRecentActionsEmptyNode.swift index bb53119547..480fc9c245 100644 --- a/TelegramUI/ChatRecentActionsEmptyNode.swift +++ b/TelegramUI/ChatRecentActionsEmptyNode.swift @@ -41,7 +41,6 @@ final class ChatRecentActionsEmptyNode: ASDisplayNode { func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) { self.layoutParams = size - let spacing: CGFloat = 5.0 let insets = UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0) let maxTextWidth = size.width - insets.left - insets.right - 18.0 * 2.0 @@ -50,6 +49,7 @@ final class ChatRecentActionsEmptyNode: ASDisplayNode { let makeTextLayout = TextNode.asyncLayout(self.textNode) let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: self.title, font: titleFont, textColor: self.theme.chat.serviceMessage.serviceMessagePrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: maxTextWidth, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets())) + let spacing: CGFloat = titleLayout.size.height.isZero ? 0.0 : 5.0 let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: self.text, font: textFont, textColor: self.theme.chat.serviceMessage.serviceMessagePrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: maxTextWidth, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets())) let contentSize = CGSize(width: max(titleLayout.size.width, textLayout.size.width) + insets.left + insets.right, height: insets.top + insets.bottom + titleLayout.size.height + spacing + textLayout.size.height) diff --git a/TelegramUI/ChatRestrictedNode.swift b/TelegramUI/ChatRestrictedNode.swift new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/TelegramUI/ChatRestrictedNode.swift @@ -0,0 +1 @@ + diff --git a/TelegramUI/ChatTextInputAccessoryItem.swift b/TelegramUI/ChatTextInputAccessoryItem.swift index 48c1ebd757..8563b39f21 100644 --- a/TelegramUI/ChatTextInputAccessoryItem.swift +++ b/TelegramUI/ChatTextInputAccessoryItem.swift @@ -4,6 +4,8 @@ enum ChatTextInputAccessoryItem: Equatable { case keyboard case stickers case inputButtons + case commands + case silentPost(Bool) case messageAutoremoveTimeout(Int32?) static func ==(lhs: ChatTextInputAccessoryItem, rhs: ChatTextInputAccessoryItem) -> Bool { @@ -26,6 +28,18 @@ enum ChatTextInputAccessoryItem: Equatable { } else { return false } + case .commands: + if case .commands = rhs { + return true + } else { + return false + } + case let .silentPost(value): + if case .silentPost(value) = rhs { + return true + } else { + return false + } case let .messageAutoremoveTimeout(lhsTimeout): if case let .messageAutoremoveTimeout(rhsTimeout) = rhs, lhsTimeout == rhsTimeout { return true diff --git a/TelegramUI/ChatTextInputMediaRecordingButton.swift b/TelegramUI/ChatTextInputMediaRecordingButton.swift index 73f5e2e9e2..329a4c9b23 100644 --- a/TelegramUI/ChatTextInputMediaRecordingButton.swift +++ b/TelegramUI/ChatTextInputMediaRecordingButton.swift @@ -14,13 +14,30 @@ enum ChatTextInputMediaRecordingButtonMode: Int32 { case video = 1 } +private func findTargetView(_ view: UIView, point: CGPoint) -> UIView? { + if view.bounds.contains(point) && view.tag == 0x01f2bca { + return view + } + for subview in view.subviews { + let frame = subview.frame + if let result = findTargetView(subview, point: point.offsetBy(dx: -frame.minX, dy: -frame.minY)) { + return result + } + } + return nil +} + private final class ChatTextInputMediaRecordingButtonPresenterContainer: UIView { override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if let result = findTargetView(self, point: point) { + return result + } for subview in self.subviews { if let result = subview.hitTest(point.offsetBy(dx: -subview.frame.minX, dy: -subview.frame.minY), with: event) { return result } } + return super.hitTest(point, with: event) } } diff --git a/TelegramUI/ChatTextInputPanelNode.swift b/TelegramUI/ChatTextInputPanelNode.swift index 9988c1b2d0..52d972f2c8 100644 --- a/TelegramUI/ChatTextInputPanelNode.swift +++ b/TelegramUI/ChatTextInputPanelNode.swift @@ -33,6 +33,14 @@ private final class AccessoryItemIconButton: HighlightableButton { self.setImage(PresentationResourcesChat.chatInputTextFieldStickersImage(theme), for: []) case .inputButtons: self.setImage(PresentationResourcesChat.chatInputTextFieldInputButtonsImage(theme), for: []) + case .commands: + self.setImage(PresentationResourcesChat.chatInputTextFieldCommandsImage(theme), for: []) + case let .silentPost(value): + if value { + self.setImage(PresentationResourcesChat.chatInputTextFieldSilentPostOnImage(theme), for: []) + } else { + self.setImage(PresentationResourcesChat.chatInputTextFieldSilentPostOffImage(theme), for: []) + } case let .messageAutoremoveTimeout(timeout): if let timeout = timeout { self.setImage(nil, for: []) @@ -54,6 +62,14 @@ private final class AccessoryItemIconButton: HighlightableButton { self.setImage(PresentationResourcesChat.chatInputTextFieldStickersImage(theme), for: []) case .inputButtons: self.setImage(PresentationResourcesChat.chatInputTextFieldInputButtonsImage(theme), for: []) + case .commands: + self.setImage(PresentationResourcesChat.chatInputTextFieldCommandsImage(theme), for: []) + case let .silentPost(value): + if value { + self.setImage(PresentationResourcesChat.chatInputTextFieldSilentPostOnImage(theme), for: []) + } else { + self.setImage(PresentationResourcesChat.chatInputTextFieldSilentPostOffImage(theme), for: []) + } case let .messageAutoremoveTimeout(timeout): if let timeout = timeout { self.setImage(nil, for: []) @@ -73,7 +89,7 @@ private final class AccessoryItemIconButton: HighlightableButton { var buttonWidth: CGFloat { switch self.item { - case .keyboard, .stickers, .inputButtons: + case .keyboard, .stickers, .inputButtons, .silentPost, .commands: return (self.image(for: [])?.size.width ?? 0.0) + CGFloat(8.0) case let .messageAutoremoveTimeout(timeout): return 24.0 @@ -1224,6 +1240,12 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { self.interfaceInteraction?.updateInputModeAndDismissedButtonKeyboardMessageId({ state in return (.inputButtons, nil) }) + case .commands: + self.interfaceInteraction?.updateTextInputState { _ in + return ChatTextInputState(inputText: NSAttributedString(string: "/")) + } + case .silentPost: + self.interfaceInteraction?.toggleSilentPost() case .messageAutoremoveTimeout: self.interfaceInteraction?.setupMessageAutoremoveTimeout() } @@ -1241,4 +1263,20 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { let result = super.hitTest(point, with: event) return result } + + func frameForAccessoryButton(_ item: ChatTextInputAccessoryItem) -> CGRect? { + for (buttonItem, buttonNode) in self.accessoryItemButtons { + if buttonItem == item { + return buttonNode.frame + } + } + return nil + } + + func frameForInputActionButton() -> CGRect? { + if !self.micButton.alpha.isZero { + return self.micButton.frame.insetBy(dx: 0.0, dy: 6.0) + } + return nil + } } diff --git a/TelegramUI/ChatVideoGalleryItemScrubberView.swift b/TelegramUI/ChatVideoGalleryItemScrubberView.swift index 6904338a85..ca2ade29e4 100644 --- a/TelegramUI/ChatVideoGalleryItemScrubberView.swift +++ b/TelegramUI/ChatVideoGalleryItemScrubberView.swift @@ -81,6 +81,10 @@ final class ChatVideoGalleryItemScrubberView: UIView { self.rightTimestampNode.status = status } + func setBufferingStatusSignal(_ status: Signal<(IndexSet, Int)?, NoError>?) { + self.scrubberNode.bufferingStatus = status + } + override func layoutSubviews() { super.layoutSubviews() diff --git a/TelegramUI/DeclareEncodables.swift b/TelegramUI/DeclareEncodables.swift index 7c268cf683..62fa22edf9 100644 --- a/TelegramUI/DeclareEncodables.swift +++ b/TelegramUI/DeclareEncodables.swift @@ -16,6 +16,7 @@ private var telegramUIDeclaredEncodables: Void = { declareEncodable(CallListSettings.self, f: { CallListSettings(decoder: $0) }) declareEncodable(ExperimentalSettings.self, f: { ExperimentalSettings(decoder: $0) }) declareEncodable(MusicPlaybackSettings.self, f: { MusicPlaybackSettings(decoder: $0) }) + declareEncodable(ICloudFileResource.self, f: { ICloudFileResource(decoder: $0) }) return }() diff --git a/TelegramUI/DeviceLocationManager.swift b/TelegramUI/DeviceLocationManager.swift index 49c6732624..e6b5672ed8 100644 --- a/TelegramUI/DeviceLocationManager.swift +++ b/TelegramUI/DeviceLocationManager.swift @@ -128,3 +128,14 @@ final class DeviceLocationManager: NSObject, CLLocationManagerDelegate { } } } + +func currentLocationManagerCoordinate(manager: DeviceLocationManager, timeout timeoutValue: Double) -> Signal { + return (Signal { subscriber in + let disposable = manager.push(mode: .precise, updated: { coordinate in + subscriber.putNext(coordinate) + subscriber.putCompletion() + }) + return disposable + } |> runOn(Queue.mainQueue())) + |> timeout(timeoutValue, queue: Queue.mainQueue(), alternate: .single(nil)) +} diff --git a/TelegramUI/ExternalMusicAlbumArtResources.swift b/TelegramUI/ExternalMusicAlbumArtResources.swift index fff1d8d0cc..75aa990fe5 100644 --- a/TelegramUI/ExternalMusicAlbumArtResources.swift +++ b/TelegramUI/ExternalMusicAlbumArtResources.swift @@ -16,7 +16,7 @@ func fetchExternalMusicAlbumArtResource(account: Account, resource: ExternalMusi subscriber.putNext(.reset) if resource.performer.isEmpty || resource.performer.lowercased().trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) == "unknown artist" || resource.title.isEmpty { - subscriber.putNext(.dataPart(data: Data(), range: 0 ..< 0, complete: true)) + subscriber.putNext(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: true)) subscriber.putCompletion() return EmptyDisposable } else { @@ -48,27 +48,27 @@ func fetchExternalMusicAlbumArtResource(account: Account, resource: ExternalMusi let fetchDisposable = MetaDisposable() let disposable = fetchHttpResource(url: metaUrl).start(next: { result in - if case let .dataPart(data, _, complete) = result, complete { + if case let .dataPart(_, data, _, complete) = result, complete { guard let dict = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String: Any] else { - subscriber.putNext(.dataPart(data: Data(), range: 0 ..< 0, complete: true)) + subscriber.putNext(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: true)) subscriber.putCompletion() return } guard let results = dict["results"] as? [Any] else { - subscriber.putNext(.dataPart(data: Data(), range: 0 ..< 0, complete: true)) + subscriber.putNext(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: true)) subscriber.putCompletion() return } guard let result = results.first as? [String: Any] else { - subscriber.putNext(.dataPart(data: Data(), range: 0 ..< 0, complete: true)) + subscriber.putNext(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: true)) subscriber.putCompletion() return } guard var artworkUrl = result["artworkUrl100"] as? String else { - subscriber.putNext(.dataPart(data: Data(), range: 0 ..< 0, complete: true)) + subscriber.putNext(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: true)) subscriber.putCompletion() return } @@ -78,7 +78,7 @@ func fetchExternalMusicAlbumArtResource(account: Account, resource: ExternalMusi } if artworkUrl.isEmpty { - subscriber.putNext(.dataPart(data: Data(), range: 0 ..< 0, complete: true)) + subscriber.putNext(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: true)) subscriber.putCompletion() return } else { diff --git a/TelegramUI/FFMpegMediaFrameSourceContext.swift b/TelegramUI/FFMpegMediaFrameSourceContext.swift index 4507ceaa16..c3809443ac 100644 --- a/TelegramUI/FFMpegMediaFrameSourceContext.swift +++ b/TelegramUI/FFMpegMediaFrameSourceContext.swift @@ -79,15 +79,19 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa if streamable { let data: Signal - data = postbox.mediaBox.resourceData(resource, size: resourceSize, in: context.readingOffset ..< (context.readingOffset + readCount), tag: context.fetchTag, mode: .complete) + data = postbox.mediaBox.resourceData(resource, size: resourceSize, in: context.readingOffset ..< (context.readingOffset + readCount), mode: .complete) let semaphore = DispatchSemaphore(value: 0) - let _ = data.start(next: { data in - if data.count == readCount { - fetchedData = data - semaphore.signal() - } - }) - semaphore.wait() + if readCount == 0 { + fetchedData = Data() + } else { + let _ = data.start(next: { data in + if data.count == readCount { + fetchedData = data + semaphore.signal() + } + }) + semaphore.wait() + } } else { let data = postbox.mediaBox.resourceData(resource, pathExtension: nil, option: .complete(waitUntilFetchStatus: false)) let range = context.readingOffset ..< (context.readingOffset + readCount) @@ -144,7 +148,7 @@ private func seekCallback(userData: UnsafeMutableRawPointer?, offset: Int64, whe context.requestedCompleteFetch = false } else { if streamable { - context.fetchedDataDisposable.set(postbox.mediaBox.fetchedResourceData(resource, size: resourceSize, in: context.readingOffset ..< resourceSize, tag: fetchTag).start()) + context.fetchedDataDisposable.set(postbox.mediaBox.fetchedResourceData(resource, in: context.readingOffset ..< resourceSize, tag: fetchTag).start()) } else if !context.requestedCompleteFetch { context.requestedCompleteFetch = true context.fetchedDataDisposable.set(postbox.mediaBox.fetchedResource(resource, tag: fetchTag).start()) @@ -210,7 +214,7 @@ final class FFMpegMediaFrameSourceContext: NSObject { let resourceSize: Int = resource.size ?? 0 if streamable { - self.fetchedDataDisposable.set(postbox.mediaBox.fetchedResourceData(resource, size: resourceSize, in: 0 ..< resourceSize, tag: self.fetchTag).start()) + self.fetchedDataDisposable.set(postbox.mediaBox.fetchedResourceData(resource, in: 0 ..< resourceSize, tag: self.fetchTag).start()) } else if !self.requestedCompleteFetch { self.requestedCompleteFetch = true self.fetchedDataDisposable.set(postbox.mediaBox.fetchedResource(resource, tag: self.fetchTag).start()) diff --git a/TelegramUI/FetchManager.swift b/TelegramUI/FetchManager.swift index 1acacc845e..f8e9c786d6 100644 --- a/TelegramUI/FetchManager.swift +++ b/TelegramUI/FetchManager.swift @@ -230,7 +230,17 @@ private final class FetchManagerCategoryContext { } } - func cancelEntry(_ id: FetchManagerLocationEntryId) { + func cancelEntry(_ entryId: FetchManagerLocationEntryId) { + var id: FetchManagerLocationEntryId = entryId + if self.entries[id] == nil { + for (key, _) in self.entries { + if key.resourceId.isEqual(to: entryId.resourceId) { + id = key + break + } + } + } + if let _ = self.entries[id] { self.entries.removeValue(forKey: id) diff --git a/TelegramUI/FetchPhotoLibraryImageResource.swift b/TelegramUI/FetchPhotoLibraryImageResource.swift index 04ae4d7696..74efdae386 100644 --- a/TelegramUI/FetchPhotoLibraryImageResource.swift +++ b/TelegramUI/FetchPhotoLibraryImageResource.swift @@ -51,7 +51,7 @@ func fetchPhotoLibraryResource(localIdentifier: String) -> Signal) -> Signal? { +func fetchResource(account: Account, resource: MediaResource, ranges: Signal) -> Signal? { return nil } diff --git a/TelegramUI/FetchVideoMediaResource.swift b/TelegramUI/FetchVideoMediaResource.swift index 2413b19b06..e3159a8521 100644 --- a/TelegramUI/FetchVideoMediaResource.swift +++ b/TelegramUI/FetchVideoMediaResource.swift @@ -40,6 +40,7 @@ public func fetchVideoLibraryMediaResource(resource: VideoLibraryMediaResource) if fetchResult.count != 0 { let asset = fetchResult.object(at: 0) let option = PHVideoRequestOptions() + option.isNetworkAccessAllowed = true option.deliveryMode = .highQualityFormat let alreadyReceivedAsset = Atomic(value: false) @@ -58,32 +59,33 @@ public func fetchVideoLibraryMediaResource(resource: VideoLibraryMediaResource) let signal = TGMediaVideoConverter.convert(avAsset, adjustments: adjustments, watcher: VideoConversionWatcher(update: { path, size in var value = stat() if stat(path, &value) == 0 { - if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { + /*if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { var range: Range? let _ = updatedSize.modify { updatedSize in range = updatedSize ..< Int(value.st_size) return Int(value.st_size) } //print("size = \(Int(value.st_size)), range: \(range!)") - subscriber.putNext(.dataPart(data: data, range: range!, complete: false)) - } + subscriber.putNext(.dataPart(resourceOffset: range!.lowerBound, data: data, range: range!, complete: false)) + }*/ } }))! let signalDisposable = signal.start(next: { next in if let result = next as? TGMediaVideoConversionResult { var value = stat() if stat(result.fileURL.path, &value) == 0 { - if let data = try? Data(contentsOf: result.fileURL, options: [.mappedRead]) { + /*if let data = try? Data(contentsOf: result.fileURL, options: [.mappedRead]) { var range: Range? let _ = updatedSize.modify { updatedSize in range = updatedSize ..< Int(value.st_size) return Int(value.st_size) } //print("finish size = \(Int(value.st_size)), range: \(range!)") - subscriber.putNext(.dataPart(data: data, range: range!, complete: false)) + subscriber.putNext(.dataPart(resourceOffset: range!.lowerBound, data: data, range: range!, complete: false)) subscriber.putNext(.replaceHeader(data: data, range: 0 ..< 1024)) - subscriber.putNext(.dataPart(data: Data(), range: 0 ..< 0, complete: true)) - } + subscriber.putNext(.dataPart(resourceOffset: data.count, data: Data(), range: 0 ..< 0, complete: true)) + }*/ + subscriber.putNext(.moveLocalFile(path: result.fileURL.path)) } subscriber.putCompletion() } @@ -119,32 +121,33 @@ func fetchLocalFileVideoMediaResource(resource: LocalFileVideoMediaResource) -> let signal = TGMediaVideoConverter.convert(avAsset, adjustments: adjustments, watcher: VideoConversionWatcher(update: { path, size in var value = stat() if stat(path, &value) == 0 { - if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { + /*if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { var range: Range? let _ = updatedSize.modify { updatedSize in range = updatedSize ..< Int(value.st_size) return Int(value.st_size) } //print("size = \(Int(value.st_size)), range: \(range!)") - subscriber.putNext(.dataPart(data: data, range: range!, complete: false)) - } + subscriber.putNext(.dataPart(resourceOffset: range!.lowerBound, data: data, range: range!, complete: false)) + }*/ } }))! let signalDisposable = signal.start(next: { next in if let result = next as? TGMediaVideoConversionResult { var value = stat() if stat(result.fileURL.path, &value) == 0 { - if let data = try? Data(contentsOf: result.fileURL, options: [.mappedRead]) { + subscriber.putNext(.moveLocalFile(path: result.fileURL.path)) + /*if let data = try? Data(contentsOf: result.fileURL, options: [.mappedRead]) { var range: Range? let _ = updatedSize.modify { updatedSize in range = updatedSize ..< Int(value.st_size) return Int(value.st_size) } //print("finish size = \(Int(value.st_size)), range: \(range!)") - subscriber.putNext(.dataPart(data: data, range: range!, complete: false)) + subscriber.putNext(.dataPart(resourceOffset: range!.lowerBound, data: data, range: range!, complete: false)) subscriber.putNext(.replaceHeader(data: data, range: 0 ..< 1024)) - subscriber.putNext(.dataPart(data: Data(), range: 0 ..< 0, complete: true)) - } + subscriber.putNext(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: true)) + }*/ } subscriber.putCompletion() } diff --git a/TelegramUI/ICloudResources.swift b/TelegramUI/ICloudResources.swift new file mode 100644 index 0000000000..8f3cb8d001 --- /dev/null +++ b/TelegramUI/ICloudResources.swift @@ -0,0 +1,222 @@ +import Foundation +import Postbox +import TelegramCore +import SwiftSignalKit + +public struct ICloudFileResourceId: MediaResourceId { + public let urlData: String + + public var uniqueId: String { + return "icloud-\(persistentHash32(self.urlData))" + } + + public var hashValue: Int { + return self.uniqueId.hashValue + } + + public func isEqual(to: MediaResourceId) -> Bool { + if let to = to as? ICloudFileResourceId { + return self.urlData == to.urlData + } else { + return false + } + } +} + +public class ICloudFileResource: TelegramMediaResource { + public let urlData: String + + public init(urlData: String) { + self.urlData = urlData + } + + public required init(decoder: PostboxDecoder) { + self.urlData = decoder.decodeStringForKey("url", orElse: "") + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeString(self.urlData, forKey: "url") + } + + public var id: MediaResourceId { + return ICloudFileResourceId(urlData: self.urlData) + } + + public func isEqual(to: TelegramMediaResource) -> Bool { + if let to = to as? ICloudFileResource { + if self.urlData != to.urlData { + return false + } + return true + } else { + return false + } + } +} + +struct ICloudFileDescription { + let urlData: String + let fileName: String + let fileSize: Int +} + +private func desctiptionWithUrl(_ url: URL) -> ICloudFileDescription? { + if #available(iOSApplicationExtension 9.0, *) { + guard url.startAccessingSecurityScopedResource() else { + return nil + } + + guard let urlData = try? url.bookmarkData(options: URL.BookmarkCreationOptions.suitableForBookmarkFile, includingResourceValuesForKeys: nil, relativeTo: nil) else { + return nil + } + + guard let values = try? url.resourceValues(forKeys: Set([.fileSizeKey])), let fileSize = values.fileSize else { + return nil + } + + guard let fileName = (url.lastPathComponent as NSString).removingPercentEncoding else { + return nil + } + + let result = ICloudFileDescription(urlData: urlData.base64EncodedString(), fileName: fileName, fileSize: fileSize) + + url.stopAccessingSecurityScopedResource() + + return result + } else { + return nil + } +} + +func iCloudFileDescription(_ url: URL) -> Signal { + return Signal { subscriber in + var isRemote = false + var isCurrent = true + + if let values = try? url.resourceValues(forKeys: Set([URLResourceKey.ubiquitousItemDownloadingStatusKey])), let status = values.ubiquitousItemDownloadingStatus { + isRemote = true + if status != URLUbiquitousItemDownloadingStatus.current { + isCurrent = false + } + } + + if !isRemote || isCurrent { + subscriber.putNext(desctiptionWithUrl(url)) + subscriber.putCompletion() + return EmptyDisposable + } else { + let query = NSMetadataQuery() + query.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope, NSMetadataQueryAccessibleUbiquitousExternalDocumentsScope] + query.predicate = NSPredicate(format: "%K.lastPathComponent == %@", NSMetadataItemFSNameKey, url.lastPathComponent) + query.valueListAttributes = [NSMetadataItemFSSizeKey] + + let observer = NotificationCenter.default.addObserver(forName: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: query, queue: OperationQueue.main, using: { notification in + query.disableUpdates() + + guard let metadataItem = query.results.first as? NSMetadataItem else { + query.enableUpdates() + return + } + + query.stop() + + guard let fileSize = metadataItem.value(forAttribute: NSMetadataItemFSSizeKey) as? NSNumber, fileSize != 0 else { + subscriber.putNext(nil) + subscriber.putCompletion() + return + } + + subscriber.putNext(desctiptionWithUrl(url)) + subscriber.putCompletion() + }) + + query.start() + + return ActionDisposable { + Queue.mainQueue().async { + query.stop() + NotificationCenter.default.removeObserver(observer) + } + } + } + } +} + +private final class ICloudFileResourceCopyItem: MediaResourceDataFetchCopyLocalItem { + private let url: URL + + init(url: URL) { + self.url = url + } + + deinit { + self.url.stopAccessingSecurityScopedResource() + } + + func copyTo(url: URL) -> Bool { + var success = true + do { + try FileManager.default.copyItem(at: self.url, to: url) + } catch { + success = false + } + return success + } +} + +func fetchICloudFileResource(resource: ICloudFileResource) -> Signal { + return Signal { subscriber in + subscriber.putNext(.reset) + + guard let urlData = Data(base64Encoded: resource.urlData) else { + subscriber.putCompletion() + return EmptyDisposable + } + + var bookmarkDataIsStale = false + guard let resolvedUrl = try? URL(resolvingBookmarkData: urlData, bookmarkDataIsStale: &bookmarkDataIsStale), let url = resolvedUrl else { + subscriber.putCompletion() + return EmptyDisposable + } + + var isRemote = false + var isCurrent = true + + if let values = try? url.resourceValues(forKeys: Set([URLResourceKey.ubiquitousItemDownloadingStatusKey])), let status = values.ubiquitousItemDownloadingStatus { + isRemote = true + if status != URLUbiquitousItemDownloadingStatus.current { + isCurrent = false + } + } + + guard url.startAccessingSecurityScopedResource() else { + subscriber.putCompletion() + return EmptyDisposable + } + + if !isRemote || isCurrent { + //url.stopAccessingSecurityScopedResource() + + subscriber.putNext(.copyLocalItem(ICloudFileResourceCopyItem(url: url))) + subscriber.putCompletion() + return EmptyDisposable + } + + let fileCoordinator = NSFileCoordinator(filePresenter: nil) + let fileAccessIntent = NSFileAccessIntent.readingIntent(with: url, options: [.withoutChanges]) + fileCoordinator.coordinate(with: [fileAccessIntent], queue: OperationQueue.main, byAccessor: { error in + if error == nil { + //url.stopAccessingSecurityScopedResource() + + subscriber.putNext(.copyLocalItem(ICloudFileResourceCopyItem(url: url))) + subscriber.putCompletion() + } else { + subscriber.putCompletion() + } + }) + + return ActionDisposable { + fileCoordinator.cancel() + } + } +} diff --git a/TelegramUI/LegacyImagePicker.swift b/TelegramUI/LegacyImagePicker.swift new file mode 100644 index 0000000000..d2bbb12a21 --- /dev/null +++ b/TelegramUI/LegacyImagePicker.swift @@ -0,0 +1,49 @@ +import Foundation +import Display +import LegacyComponents + +private final class LegacyImagePickerController: LegacyController, TGLegacyCameraControllerDelegate, TGImagePickerControllerDelegate { + private let completion: (UIImage?) -> Void + + init(presentation: LegacyControllerPresentation, theme: PresentationTheme?, completion: @escaping (UIImage?) -> Void) { + self.completion = completion + + super.init(presentation: presentation, theme: theme) + } + + required public init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func legacyCameraControllerCompletedWithNoResult() { + self.completion(nil) + } + + func imagePickerController(_ imagePicker: TGImagePickerController!, didFinishPickingWithAssets assets: [Any]!) { + if let image = assets.first as? UIImage { + self.completion(image) + } else { + self.completion(nil) + } + } +} + +func legacyImagePicker(theme: PresentationTheme, completion: @escaping (UIImage?) -> Void) -> ViewController { + var dismissImpl: (() -> Void)? + let legacyController = LegacyImagePickerController(presentation: .modal(animateIn: true), theme: theme, completion: { image in + dismissImpl?() + completion(image) + }) + + let imagePickerController = TGLegacyCameraController(context: legacyController.context)! + imagePickerController.sourceType = UIImagePickerControllerSourceType.photoLibrary + imagePickerController.completionDelegate = legacyController + + legacyController.bind(controller: imagePickerController) + + dismissImpl = { [weak legacyController] in + legacyController?.dismiss() + } + + return legacyController +} diff --git a/TelegramUI/LegacyMediaPickers.swift b/TelegramUI/LegacyMediaPickers.swift index 5cada9e4b4..ae8e611b01 100644 --- a/TelegramUI/LegacyMediaPickers.swift +++ b/TelegramUI/LegacyMediaPickers.swift @@ -7,6 +7,12 @@ import SSignalKit import UIKit import Display +import TelegramUIPrivateModule + +func guessMimeTypeByFileExtension(_ ext: String) -> String { + return TGMimeTypeMap.mimeType(forExtension: ext) ?? "application/binary" +} + func configureLegacyAssetPicker(_ controller: TGMediaAssetsController, account: Account, peer: Peer, captionsEnabled: Bool = true, storeCreatedAssets: Bool = true, showFileTooltip: Bool = false) { controller.captionsEnabled = captionsEnabled controller.inhibitDocumentCaptions = false diff --git a/TelegramUI/LegacyWallpaperEditor.swift b/TelegramUI/LegacyWallpaperEditor.swift new file mode 100644 index 0000000000..10752e1d94 --- /dev/null +++ b/TelegramUI/LegacyWallpaperEditor.swift @@ -0,0 +1,48 @@ +import Foundation +import Display +import LegacyComponents + +private final class LegacyWallpaperEditorController: LegacyController, TGWallpaperControllerDelegate { + private let completion: (UIImage?) -> Void + + init(presentation: LegacyControllerPresentation, theme: PresentationTheme?, completion: @escaping (UIImage?) -> Void) { + self.completion = completion + + super.init(presentation: presentation, theme: theme) + } + + required public init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func wallpaperController(_ wallpaperController: TGWallpaperController!, didSelectWallpaperWith wallpaperInfo: TGWallpaperInfo!) { + self.completion(wallpaperInfo.image()) + } +} + +func legacyWallpaperEditor(theme: PresentationTheme, image: UIImage, completion: @escaping (UIImage?) -> Void) -> ViewController { + var dismissImpl: (() -> Void)? + let legacyController = LegacyWallpaperEditorController(presentation: .modal(animateIn: true), theme: theme, completion: { image in + dismissImpl?() + completion(image) + }) + + let wallpaperController = TGWallpaperController(context: legacyController.context, wallpaperInfo: TGCustomImageWallpaperInfo(image: image), thumbnailImage: nil)! + //wallpaperController.presentation = self.presentation; + wallpaperController.customDismiss = { + dismissImpl?() + } + wallpaperController.delegate = legacyController + wallpaperController.enableWallpaperAdjustment = true + wallpaperController.doNotFlipIfRTL = true + + let navigationController = TGNavigationController(controllers: [wallpaperController])! + wallpaperController.navigation_setDismiss({ [weak legacyController] in + legacyController?.dismiss() + }, rootController: nil) + dismissImpl = { [weak legacyController] in + legacyController?.dismiss() + } + legacyController.bind(controller: navigationController) + return legacyController +} diff --git a/TelegramUI/LegqacyICloudFileController.swift b/TelegramUI/LegqacyICloudFileController.swift new file mode 100644 index 0000000000..d4577afcae --- /dev/null +++ b/TelegramUI/LegqacyICloudFileController.swift @@ -0,0 +1,68 @@ +import Foundation +import Display + +private final class LegacyICloudFileController: LegacyController, UIDocumentPickerDelegate { + let completion: ([URL]) -> Void + + init(presentation: LegacyControllerPresentation, theme: PresentationTheme?, completion: @escaping ([URL]) -> Void) { + self.completion = completion + + super.init(presentation: presentation, theme: theme) + } + + required public init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) { + self.completion([]) + } + + func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { + self.completion(urls) + } + + func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) { + self.completion([url]) + } +} + +func legacyICloudFileController(theme: PresentationTheme, completion: @escaping ([URL]) -> Void) -> ViewController { + var dismissImpl: (() -> Void)? + let legacyController = LegacyICloudFileController(presentation: .modal(animateIn: true), theme: theme, completion: { urls in + dismissImpl?() + completion(urls) + }) + legacyController.statusBar.statusBarStyle = .Black + + let documentTypes: [String] = [ + "public.composite-content", + "public.text", + "public.image", + "public.audio", + "public.video", + "public.movie", + "public.font", + "org.telegram.Telegram.webp", + "com.apple.iwork.pages.pages", + "com.apple.iwork.numbers.numbers", + "com.apple.iwork.keynote.key" + ] + + let controller = UIDocumentPickerViewController(documentTypes: documentTypes, in: .open) + controller.delegate = legacyController + + legacyController.presentationCompleted = { [weak legacyController] in + if let legacyController = legacyController { + legacyController.view.window?.rootViewController?.present(controller, animated: true) + } + } + + dismissImpl = { [weak legacyController] in + if let legacyController = legacyController { + legacyController.dismiss() + } + } + legacyController.bind(controller: UIViewController()) + return legacyController +} diff --git a/TelegramUI/MapResources.swift b/TelegramUI/MapResources.swift index 593defb554..c557f5addc 100644 --- a/TelegramUI/MapResources.swift +++ b/TelegramUI/MapResources.swift @@ -100,7 +100,7 @@ func fetchMapSnapshotResource(resource: MapSnapshotMediaResource) -> Signal() + + var bufferingStatus: Signal<(IndexSet, Int)?, NoError>? { + didSet { + if let bufferingStatus = self.bufferingStatus { + self.bufferingStatusValuePromise.set(bufferingStatus) + } else { + self.bufferingStatusValuePromise.set(.single(nil)) + } + } + } + init(content: MediaPlayerScrubbingNodeContent) { switch content { case let .standard(lineHeight, lineCap, scrubberHandle, backgroundColor, foregroundColor): @@ -176,6 +249,8 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { backgroundNode.displaysAsynchronously = false backgroundNode.displayWithoutProcessing = true + let bufferingNode = MediaPlayerScrubbingBufferingNode(color: foregroundColor.withAlphaComponent(0.5), lineCap: lineCap, lineHeight: lineHeight) + let foregroundContentNode = ASImageNode() foregroundContentNode.isLayerBacked = true foregroundContentNode.displaysAsynchronously = false @@ -220,13 +295,16 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { handleNodeContainerImpl = handleNodeContainer } - self.contentNodes = .standard(StandardMediaPlayerScrubbingNodeContentNode(lineHeight: lineHeight, lineCap: lineCap, backgroundNode: backgroundNode, foregroundContentNode: foregroundContentNode, foregroundNode: foregroundNode, handleNode: handleNodeImpl, handleNodeContainer: handleNodeContainerImpl)) + handleNodeContainerImpl?.isUserInteractionEnabled = self.enableScrubbing + + self.contentNodes = .standard(StandardMediaPlayerScrubbingNodeContentNode(lineHeight: lineHeight, lineCap: lineCap, backgroundNode: backgroundNode, bufferingNode: bufferingNode, foregroundContentNode: foregroundContentNode, foregroundNode: foregroundNode, handleNode: handleNodeImpl, handleNodeContainer: handleNodeContainerImpl)) case let .custom(backgroundNode, foregroundContentNode): let foregroundNode = MediaPlayerScrubbingForegroundNode() foregroundNode.isLayerBacked = true foregroundNode.clipsToBounds = true let handleNodeContainer = MediaPlayerScrubbingNodeButton() + handleNodeContainer.isUserInteractionEnabled = self.enableScrubbing self.contentNodes = .custom(CustomMediaPlayerScrubbingNodeContentNode(backgroundNode: backgroundNode, foregroundContentNode: foregroundContentNode, foregroundNode: foregroundNode, handleNodeContainer: handleNodeContainer)) } @@ -236,6 +314,7 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { switch self.contentNodes { case let .standard(node): self.addSubnode(node.backgroundNode) + self.addSubnode(node.bufferingNode) node.foregroundNode.addSubnode(node.foregroundContentNode) self.addSubnode(node.foregroundNode) @@ -325,10 +404,25 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { strongSelf.statusValue = status } }) + + self.bufferingStatusDisposable = (self.bufferingStatusValuePromise.get() + |> deliverOnMainQueue).start(next: { [weak self] status in + if let strongSelf = self { + switch strongSelf.contentNodes { + case let .standard(node): + if let status = status { + node.bufferingNode.updateStatus(status.0, status.1) + } + case .custom: + break + } + } + }) } deinit { self.statusDisposable?.dispose() + self.bufferingStatusDisposable?.dispose() } override var frame: CGRect { @@ -388,6 +482,8 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { node.backgroundNode.frame = backgroundFrame node.foregroundContentNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: backgroundFrame.size.width, height: backgroundFrame.size.height)) + node.bufferingNode.frame = backgroundFrame + node.bufferingNode.updateLayout(size: backgroundFrame.size, transition: .immediate) if let handleNode = node.handleNode { var handleSize: CGSize = CGSize(width: 2.0, height: bounds.size.height) @@ -574,14 +670,28 @@ final class MediaPlayerScrubbingNode: ASDisplayNode { } override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { - if self.bounds.contains(point) { + var hitBounds = self.bounds + let hitTestSlop = self.hitTestSlop + hitBounds.origin.x += hitTestSlop.left + hitBounds.origin.y += hitTestSlop.top + hitBounds.size.width += -hitTestSlop.left - hitTestSlop.right + hitBounds.size.height += -hitTestSlop.top - hitTestSlop.bottom + + if hitBounds.contains(point) { switch self.contentNodes { case let .standard(node): - return node.handleNodeContainer?.view + if let handleNodeContainer = node.handleNodeContainer, handleNodeContainer.isUserInteractionEnabled { + return handleNodeContainer.view + } else { + return nil + } case let .custom(node): - return node.handleNodeContainer?.view + if let handleNodeContainer = node.handleNodeContainer, handleNodeContainer.isUserInteractionEnabled { + return handleNodeContainer.view + } else { + return nil + } } - return super.hitTest(point, with: event) } else { return nil } diff --git a/TelegramUI/MediaResources.swift b/TelegramUI/MediaResources.swift index ed5f6ad6c4..54f45b7e3b 100644 --- a/TelegramUI/MediaResources.swift +++ b/TelegramUI/MediaResources.swift @@ -44,7 +44,7 @@ public struct VideoLibraryMediaResourceId: MediaResourceId { public func isEqual(to: MediaResourceId) -> Bool { if let to = to as? VideoLibraryMediaResourceId { - return self.localIdentifier == to.localIdentifier + return self.localIdentifier == to.localIdentifier && self.adjustmentsDigest == to.adjustmentsDigest } else { return false } diff --git a/TelegramUI/NativeVideoContent.swift b/TelegramUI/NativeVideoContent.swift index 2d897a8e66..e20ad2a6ee 100644 --- a/TelegramUI/NativeVideoContent.swift +++ b/TelegramUI/NativeVideoContent.swift @@ -72,6 +72,11 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent return self._status.get() } + private let _bufferingStatus = Promise<(IndexSet, Int)?>() + var bufferingStatus: Signal<(IndexSet, Int)?, NoError> { + return self._bufferingStatus.get() + } + private let _ready = Promise() var ready: Signal { return self._ready.get() @@ -111,6 +116,14 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent self.addSubnode(self.playerNode) self._status.set(self.player.status) + if let size = file.size { + self._bufferingStatus.set(postbox.mediaBox.resourceRangesStatus(file.resource) |> map { ranges in + return (ranges, size) + }) + } else { + self._bufferingStatus.set(.single(nil)) + } + self.imageNode.imageUpdated = { [weak self] in self?._ready.set(.single(Void())) } diff --git a/TelegramUI/OngoingCallContext.swift b/TelegramUI/OngoingCallContext.swift index f3fde3c844..0e7e97d523 100644 --- a/TelegramUI/OngoingCallContext.swift +++ b/TelegramUI/OngoingCallContext.swift @@ -63,11 +63,11 @@ final class OngoingCallContext { } } - func start(key: Data, isOutgoing: Bool, connections: CallSessionConnectionSet, audioSessionActive: Signal) { + func start(key: Data, isOutgoing: Bool, connections: CallSessionConnectionSet, maxLayer: Int32, audioSessionActive: Signal) { self.audioSessionDisposable.set((audioSessionActive |> filter { $0 } |> take(1)).start(next: { [weak self] _ in if let strongSelf = self { strongSelf.withContext { context in - context.start(withKey: key, isOutgoing: isOutgoing, primaryConnection: callConnectionDescription(connections.primary), alternativeConnections: connections.alternatives.map(callConnectionDescription)) + context.start(withKey: key, isOutgoing: isOutgoing, primaryConnection: callConnectionDescription(connections.primary), alternativeConnections: connections.alternatives.map(callConnectionDescription), maxLayer: maxLayer) } } })) diff --git a/TelegramUI/OngoingCallThreadLocalContext.h b/TelegramUI/OngoingCallThreadLocalContext.h index 0c5b407be2..cf7f1a6311 100644 --- a/TelegramUI/OngoingCallThreadLocalContext.h +++ b/TelegramUI/OngoingCallThreadLocalContext.h @@ -23,12 +23,12 @@ typedef NS_ENUM(int32_t, OngoingCallState) { @interface OngoingCallThreadLocalContext : NSObject -+ (void)setupLoggingFunction:(void (*)(NSString *))loggingFunction; ++ (void)setupLoggingFunction:(void (* _Nullable)(NSString * _Nullable))loggingFunction; -@property (nonatomic, copy) void (^stateChanged)(OngoingCallState); +@property (nonatomic, copy) void (^ _Nullable stateChanged)(OngoingCallState); - (instancetype _Nonnull)init; -- (void)startWithKey:(NSData * _Nonnull)key isOutgoing:(bool)isOutgoing primaryConnection:(OngoingCallConnectionDescription * _Nonnull)primaryConnection alternativeConnections:(NSArray * _Nonnull)alternativeConnections; +- (void)startWithKey:(NSData * _Nonnull)key isOutgoing:(bool)isOutgoing primaryConnection:(OngoingCallConnectionDescription * _Nonnull)primaryConnection alternativeConnections:(NSArray * _Nonnull)alternativeConnections maxLayer:(int32_t)maxLayer; - (void)stop; - (void)setIsMuted:(bool)isMuted; diff --git a/TelegramUI/OngoingCallThreadLocalContext.mm b/TelegramUI/OngoingCallThreadLocalContext.mm index c99ffa9fde..c0f7209025 100644 --- a/TelegramUI/OngoingCallThreadLocalContext.mm +++ b/TelegramUI/OngoingCallThreadLocalContext.mm @@ -1,7 +1,7 @@ #import "OngoingCallThreadLocalContext.h" -#import "../submodules/libtgvoip/VoIPController.h" -#import "../submodules/libtgvoip/os/darwin/TGLogWrapper.h" +#import "../../libtgvoip/VoIPController.h" +#import "../../libtgvoip/os/darwin/SetupLogging.h" #import @@ -94,8 +94,18 @@ static void controllerStateCallback(tgvoip::VoIPController *controller, int stat _controller = new tgvoip::VoIPController(); _controller->implData = (__bridge void *)self; + _controller->SetStateCallback(&controllerStateCallback); + /*master*/ + /*auto callbacks = tgvoip::VoIPController::Callbacks(); + callbacks.connectionStateChanged = &controllerStateCallback; + callbacks.groupCallKeyReceived = NULL; + callbacks.groupCallKeySent = NULL; + callbacks.signalBarCountChanged = NULL; + callbacks.upgradeToGroupCallRequested = NULL; + _controller->SetCallbacks(callbacks);*/ + tgvoip::VoIPController::crypto.sha1 = &TGCallSha1; tgvoip::VoIPController::crypto.sha256 = &TGCallSha256; tgvoip::VoIPController::crypto.rand_bytes = &TGCallRandomBytes; @@ -108,7 +118,7 @@ static void controllerStateCallback(tgvoip::VoIPController *controller, int stat return self; } -- (void)startWithKey:(NSData * _Nonnull)key isOutgoing:(bool)isOutgoing primaryConnection:(OngoingCallConnectionDescription * _Nonnull)primaryConnection alternativeConnections:(NSArray * _Nonnull)alternativeConnections { +- (void)startWithKey:(NSData * _Nonnull)key isOutgoing:(bool)isOutgoing primaryConnection:(OngoingCallConnectionDescription * _Nonnull)primaryConnection alternativeConnections:(NSArray * _Nonnull)alternativeConnections maxLayer:(int32_t)maxLayer { std::vector endpoints; NSArray *connections = [@[primaryConnection] arrayByAddingObjectsFromArray:alternativeConnections]; for (OngoingCallConnectionDescription *connection in connections) { @@ -126,6 +136,8 @@ static void controllerStateCallback(tgvoip::VoIPController *controller, int stat tgvoip::IPv6Address addressv6(std::string(connection.ipv6.UTF8String)); unsigned char peerTag[16]; [connection.peerTag getBytes:peerTag length:16]; + /*master*/ + //endpoints.push_back(tgvoip::Endpoint(connection.connectionId, (uint16_t)connection.port, address, addressv6, tgvoip::Endpoint::TYPE_UDP_RELAY, peerTag)); endpoints.push_back(tgvoip::Endpoint(connection.connectionId, (uint16_t)connection.port, address, addressv6, EP_TYPE_UDP_RELAY, peerTag)); } @@ -142,7 +154,8 @@ static void controllerStateCallback(tgvoip::VoIPController *controller, int stat _controller->SetConfig(&config); _controller->SetEncryptionKey((char *)key.bytes, isOutgoing); - _controller->SetRemoteEndpoints(endpoints, _allowP2P); + /*master*/ + _controller->SetRemoteEndpoints(endpoints, _allowP2P/*, 65*/); _controller->Start(); _controller->Connect(); @@ -151,6 +164,8 @@ static void controllerStateCallback(tgvoip::VoIPController *controller, int stat - (void)stop { if (_controller) { char *buffer = (char *)malloc(_controller->GetDebugLogLength()); + /*master*/ + //_controller->Stop(); _controller->GetDebugLog(buffer); NSString *debugLog = [[NSString alloc] initWithUTF8String:buffer]; @@ -173,6 +188,17 @@ static void controllerStateCallback(tgvoip::VoIPController *controller, int stat - (void)controllerStateChanged:(int)state { OngoingCallState callState = OngoingCallStateInitializing; + /*master*/ + /*switch (state) { + case tgvoip::STATE_ESTABLISHED: + callState = OngoingCallStateConnected; + break; + case tgvoip::STATE_FAILED: + callState = OngoingCallStateFailed; + break; + default: + break; + }*/ switch (state) { case STATE_ESTABLISHED: callState = OngoingCallStateConnected; diff --git a/TelegramUI/OpenChatMessage.swift b/TelegramUI/OpenChatMessage.swift index f52286bb24..6a3fefd1d4 100644 --- a/TelegramUI/OpenChatMessage.swift +++ b/TelegramUI/OpenChatMessage.swift @@ -6,7 +6,7 @@ import TelegramCore import SwiftSignalKit import PassKit -func openChatMessage(account: Account, message: Message, standalone: Bool, reverseMessageGalleryOrder: Bool, navigationController: NavigationController?, dismissInput: @escaping () -> Void, present: @escaping (ViewController, Any?) -> Void, transitionNode: @escaping (MessageId, Media) -> ASDisplayNode?, addToTransitionSurface: @escaping (UIView) -> Void, openUrl: (String) -> Void, openPeer: @escaping (Peer, ChatControllerInteractionNavigateToPeer) -> Void, callPeer: @escaping (PeerId) -> Void, sendSticker: @escaping (TelegramMediaFile) -> Void, setupTemporaryHiddenMedia: @escaping (Signal, Int, Media) -> Void) -> Bool { +func openChatMessage(account: Account, message: Message, standalone: Bool, reverseMessageGalleryOrder: Bool, navigationController: NavigationController?, dismissInput: @escaping () -> Void, present: @escaping (ViewController, Any?) -> Void, transitionNode: @escaping (MessageId, Media) -> ASDisplayNode?, addToTransitionSurface: @escaping (UIView) -> Void, openUrl: (String) -> Void, openPeer: @escaping (Peer, ChatControllerInteractionNavigateToPeer) -> Void, callPeer: @escaping (PeerId) -> Void, enqueueMessage: @escaping (EnqueueMessage) -> Void, sendSticker: ((TelegramMediaFile) -> Void)?, setupTemporaryHiddenMedia: @escaping (Signal, Int, Media) -> Void) -> Bool { var galleryMedia: Media? var otherMedia: Media? var instantPageMedia: [InstantPageGalleryEntry]? @@ -79,7 +79,7 @@ func openChatMessage(account: Account, message: Message, standalone: Bool, rever openPeer(peer, .info) }, sendLiveLocation: { coordinate, period in let outMessage: EnqueueMessage = .message(text: "", attributes: [], media: TelegramMediaMap(latitude: coordinate.latitude, longitude: coordinate.longitude, geoPlace: nil, venue: nil, liveBroadcastingTimeout: period), replyToMessageId: nil, localGroupingKey: nil) - let _ = enqueueMessages(account: account, peerId: message.id.peerId, messages: [outMessage]).start() + enqueueMessage(outMessage) }, stopLiveLocation: { account.telegramApplicationContext.liveLocationManager?.cancelLiveLocation(peerId: message.id.peerId) }), nil) diff --git a/TelegramUI/OverlayPlayerController.swift b/TelegramUI/OverlayPlayerController.swift index eb3b3eeefc..1cdf89d566 100644 --- a/TelegramUI/OverlayPlayerController.swift +++ b/TelegramUI/OverlayPlayerController.swift @@ -52,7 +52,7 @@ final class OverlayPlayerController: ViewController { navigateToChatController(navigationController: navigationController, account: strongSelf.account, chatLocation: .peer(message.id.peerId), messageId: messageId, animated: true) strongSelf.dismiss() } - }, externalShare: false) + }, externalShare: true) strongSelf.controllerNode.view.endEditing(true) strongSelf.present(shareController, in: .window(.root)) } diff --git a/TelegramUI/OverlayPlayerControllerNode.swift b/TelegramUI/OverlayPlayerControllerNode.swift index 98c67fd42b..526b9e3f45 100644 --- a/TelegramUI/OverlayPlayerControllerNode.swift +++ b/TelegramUI/OverlayPlayerControllerNode.swift @@ -147,7 +147,7 @@ final class OverlayPlayerControllerNode: ViewControllerTracingNode, UIGestureRec openMessageImpl = { [weak self] id in if let strongSelf = self, strongSelf.isNodeLoaded, let message = strongSelf.historyNode.messageInCurrentHistoryView(id) { - return openChatMessage(account: strongSelf.account, message: message, standalone: false, reverseMessageGalleryOrder: false, navigationController: nil, dismissInput: { }, present: { _, _ in }, transitionNode: { _, _ in return nil }, addToTransitionSurface: { _ in }, openUrl: { _ in }, openPeer: { _, _ in }, callPeer: { _ in }, sendSticker: { _ in }, setupTemporaryHiddenMedia: { _, _, _ in }) + return openChatMessage(account: strongSelf.account, message: message, standalone: false, reverseMessageGalleryOrder: false, navigationController: nil, dismissInput: { }, present: { _, _ in }, transitionNode: { _, _ in return nil }, addToTransitionSurface: { _ in }, openUrl: { _ in }, openPeer: { _, _ in }, callPeer: { _ in }, enqueueMessage: { _ in }, sendSticker: nil, setupTemporaryHiddenMedia: { _, _, _ in }) } return false } diff --git a/TelegramUI/OverlayPlayerControlsNode.swift b/TelegramUI/OverlayPlayerControlsNode.swift index b9447596d3..d69a5fadd2 100644 --- a/TelegramUI/OverlayPlayerControlsNode.swift +++ b/TelegramUI/OverlayPlayerControlsNode.swift @@ -248,13 +248,28 @@ final class OverlayPlayerControlsNode: ASDisplayNode { strongSelf.playPauseButton.isEnabled = false strongSelf.backwardButton.isEnabled = false strongSelf.forwardButton.isEnabled = false - displayData = nil } if strongSelf.displayData != displayData { strongSelf.displayData = displayData strongSelf.updateLabels(transition: .immediate) + + if let source = value?.item.playbackData?.source { + switch source { + case let .telegramFile(file): + if let size = file.size { + strongSelf.scrubberNode.bufferingStatus = postbox.mediaBox.resourceRangesStatus(file.resource) + |> map { ranges -> (IndexSet, Int) in + return (ranges, size) + } + } else { + strongSelf.scrubberNode.bufferingStatus = nil + } + } + } else { + strongSelf.scrubberNode.bufferingStatus = nil + } } } }) diff --git a/TelegramUI/PeerMediaCollectionController.swift b/TelegramUI/PeerMediaCollectionController.swift index 516765a031..b111aba558 100644 --- a/TelegramUI/PeerMediaCollectionController.swift +++ b/TelegramUI/PeerMediaCollectionController.swift @@ -89,9 +89,8 @@ public class PeerMediaCollectionController: TelegramController { self?.controllerInteraction?.openPeer(peer.id, navigation, nil) }, callPeer: { peerId in self?.controllerInteraction?.callPeer(peerId) - }, sendSticker: { file in - self?.controllerInteraction?.sendSticker(file) - }, setupTemporaryHiddenMedia: { signal, centralIndex, galleryMedia in + }, enqueueMessage: { _ in + }, sendSticker: nil, setupTemporaryHiddenMedia: { signal, centralIndex, galleryMedia in }) } return false @@ -369,6 +368,7 @@ public class PeerMediaCollectionController: TelegramController { }, presentController: { _, _ in }, navigateFeed: { }, openGrouping: { + }, toggleSilentPost: { }, statuses: nil) self.updateInterfaceState(animated: false, { return $0 }) diff --git a/TelegramUI/PresentationCall.swift b/TelegramUI/PresentationCall.swift index 5cec699bbb..603bd06d54 100644 --- a/TelegramUI/PresentationCall.swift +++ b/TelegramUI/PresentationCall.swift @@ -204,7 +204,7 @@ public final class PresentationCall { presentationState = .terminated case let .requesting(ringing): presentationState = .requesting(ringing) - case let .active(_, keyVisualHash, _): + case let .active(_, keyVisualHash, _, _): let timestamp: Double if let activeTimestamp = self.activeTimestamp { timestamp = activeTimestamp @@ -216,7 +216,7 @@ public final class PresentationCall { } switch sessionState.state { - case let .active(key, _, connections): + case let .active(key, _, connections, maxLayer): if let audioSessionControl = audioSessionControl, !wasActive || previousControl == nil { let audioSessionActive: Signal if let callKitIntegration = self.callKitIntegration { @@ -233,7 +233,7 @@ public final class PresentationCall { audioSessionActive = .single(true) } - self.ongoingGontext.start(key: key, isOutgoing: sessionState.isOutgoing, connections: connections, audioSessionActive: audioSessionActive) + self.ongoingGontext.start(key: key, isOutgoing: sessionState.isOutgoing, connections: connections, maxLayer: maxLayer, audioSessionActive: audioSessionActive) if sessionState.isOutgoing { self.callKitIntegration?.reportOutgoingCallConnected(uuid: sessionState.id, at: Date()) } diff --git a/TelegramUI/PresentationResourceKey.swift b/TelegramUI/PresentationResourceKey.swift index d3ddead83d..a8f934a64b 100644 --- a/TelegramUI/PresentationResourceKey.swift +++ b/TelegramUI/PresentationResourceKey.swift @@ -131,6 +131,9 @@ enum PresentationResourceKey: Int32 { case chatInputTextFieldStickersImage case chatInputTextFieldInputButtonsImage case chatInputTextFieldKeyboardImage + case chatInputTextFieldCommandsImage + case chatInputTextFieldSilentPostOnImage + case chatInputTextFieldSilentPostOffImage case chatInputTextFieldTimerImage case chatInputSearchPanelUpImage diff --git a/TelegramUI/PresentationResourcesChat.swift b/TelegramUI/PresentationResourcesChat.swift index 430dc1ae25..bf501f943f 100644 --- a/TelegramUI/PresentationResourcesChat.swift +++ b/TelegramUI/PresentationResourcesChat.swift @@ -504,6 +504,24 @@ struct PresentationResourcesChat { }) } + static func chatInputTextFieldCommandsImage(_ theme: PresentationTheme) -> UIImage? { + return theme.image(PresentationResourceKey.chatInputTextFieldCommandsImage.rawValue, { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/AccessoryIconCommands"), color: theme.chat.inputPanel.inputControlColor) + }) + } + + static func chatInputTextFieldSilentPostOnImage(_ theme: PresentationTheme) -> UIImage? { + return theme.image(PresentationResourceKey.chatInputTextFieldSilentPostOnImage.rawValue, { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/AccessoryIconSilentPostOn"), color: theme.chat.inputPanel.inputControlColor) + }) + } + + static func chatInputTextFieldSilentPostOffImage(_ theme: PresentationTheme) -> UIImage? { + return theme.image(PresentationResourceKey.chatInputTextFieldSilentPostOffImage.rawValue, { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/AccessoryIconSilentPostOff"), color: theme.chat.inputPanel.inputControlColor) + }) + } + static func chatInputTextFieldKeyboardImage(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.chatInputTextFieldKeyboardImage.rawValue, { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Text/AccessoryIconKeyboard"), color: theme.chat.inputPanel.inputControlColor) diff --git a/TelegramUI/PresentationThemeSettings.swift b/TelegramUI/PresentationThemeSettings.swift index 361a0387b5..13b9df8e2e 100644 --- a/TelegramUI/PresentationThemeSettings.swift +++ b/TelegramUI/PresentationThemeSettings.swift @@ -55,6 +55,15 @@ public struct PresentationThemeSettings: PreferencesEntry { public let theme: PresentationThemeReference public let fontSize: PresentationFontSize + public var relatedResources: [MediaResourceId] { + switch self.chatWallpaper { + case let .image(representations): + return representations.map({ $0.resource.id }) + default: + return [] + } + } + public static var defaultSettings: PresentationThemeSettings { return PresentationThemeSettings(chatWallpaper: .color(0x000000), theme: .builtin(.nightAccent), fontSize: .regular) } diff --git a/TelegramUI/PrivacyAndSecurityController.swift b/TelegramUI/PrivacyAndSecurityController.swift index 82434e04b2..ac45455d9b 100644 --- a/TelegramUI/PrivacyAndSecurityController.swift +++ b/TelegramUI/PrivacyAndSecurityController.swift @@ -313,7 +313,7 @@ private func stringForSelectiveSettings(strings: PresentationStrings, settings: } else if !enableFor.isEmpty { return strings.PrivacySettings_LastSeenContactsPlus("\(enableFor.count)").0 } else if !disableFor.isEmpty { - return strings.PrivacySettings_LastSeenContactsMinus("\(enableFor.count)").0 + return strings.PrivacySettings_LastSeenContactsMinus("\(disableFor.count)").0 } else { return strings.PrivacySettings_LastSeenContacts } diff --git a/TelegramUI/ProcessedPeerRestrictionText.swift b/TelegramUI/ProcessedPeerRestrictionText.swift new file mode 100644 index 0000000000..6cc6beb0d3 --- /dev/null +++ b/TelegramUI/ProcessedPeerRestrictionText.swift @@ -0,0 +1,9 @@ +import Foundation + +func processedPeerRestrictionText(_ text: String) -> String { + if let range = text.range(of: ":") { + return String(text[range.upperBound...]) + } else { + return text + } +} diff --git a/TelegramUI/RecentSessionsController.swift b/TelegramUI/RecentSessionsController.swift index 83a9ec864f..4e575d444f 100644 --- a/TelegramUI/RecentSessionsController.swift +++ b/TelegramUI/RecentSessionsController.swift @@ -317,7 +317,7 @@ public func recentSessionsController(account: Account) -> ViewController { return .complete() } - removeSessionDisposable.set((terminateAccountSession(account: account, hash: sessionId) |> then((applySessions |> mapError { _ in TerminateAccountSessionError.generic })) |> deliverOnMainQueue).start(error: { _ in + removeSessionDisposable.set((terminateAccountSession(account: account, hash: sessionId) |> then((applySessions |> mapError { _ in TerminateSessionError.generic })) |> deliverOnMainQueue).start(error: { _ in updateState { return $0.withUpdatedRemovingSessionId(nil) } diff --git a/TelegramUI/StickerPackPreviewController.swift b/TelegramUI/StickerPackPreviewController.swift index 5f7342cf31..63cbc7be7b 100644 --- a/TelegramUI/StickerPackPreviewController.swift +++ b/TelegramUI/StickerPackPreviewController.swift @@ -55,7 +55,12 @@ final class StickerPackPreviewController: ViewController { self?.present(controller, in: .window(.root), with: arguments) } self.controllerNode.sendSticker = { [weak self] file in - self?.sendSticker?(file) + if let sendSticker = self?.sendSticker { + sendSticker(file) + return true + } else { + return false + } } self.displayNodeDidLoad() self.stickerPackDisposable.set((self.stickerPackContents.get() |> deliverOnMainQueue).start(next: { [weak self] next in diff --git a/TelegramUI/StickerPackPreviewControllerNode.swift b/TelegramUI/StickerPackPreviewControllerNode.swift index 253a7b7dd2..d0057cc190 100644 --- a/TelegramUI/StickerPackPreviewControllerNode.swift +++ b/TelegramUI/StickerPackPreviewControllerNode.swift @@ -31,7 +31,7 @@ final class StickerPackPreviewControllerNode: ViewControllerTracingNode, UIScrol var presentPreview: ((ViewController, Any?) -> Void)? var dismiss: (() -> Void)? var cancel: (() -> Void)? - var sendSticker: ((TelegramMediaFile) -> Void)? + var sendSticker: ((TelegramMediaFile) -> Bool)? let ready = Promise() private var didSetReady = false @@ -111,9 +111,10 @@ final class StickerPackPreviewControllerNode: ViewControllerTracingNode, UIScrol super.init() self.interaction = StickerPackPreviewInteraction(sendSticker: { [weak self] item in - if let strongSelf = self { - strongSelf.sendSticker?(item.file) - strongSelf.cancel?() + if let strongSelf = self, let sendSticker = strongSelf.sendSticker { + if sendSticker(item.file) { + strongSelf.cancel?() + } } }) diff --git a/TelegramUI/StorageUsageController.swift b/TelegramUI/StorageUsageController.swift index 2195d01e1d..207feae076 100644 --- a/TelegramUI/StorageUsageController.swift +++ b/TelegramUI/StorageUsageController.swift @@ -7,17 +7,20 @@ import TelegramCore private final class StorageUsageControllerArguments { let account: Account let updateKeepMedia: () -> Void + let openClearAll: () -> Void let openPeerMedia: (PeerId) -> Void - init(account: Account, updateKeepMedia: @escaping () -> Void, openPeerMedia: @escaping (PeerId) -> Void) { + init(account: Account, updateKeepMedia: @escaping () -> Void, openClearAll: @escaping () -> Void, openPeerMedia: @escaping (PeerId) -> Void) { self.account = account self.updateKeepMedia = updateKeepMedia + self.openClearAll = openClearAll self.openPeerMedia = openPeerMedia } } private enum StorageUsageSection: Int32 { case keepMedia + case all case peers } @@ -26,6 +29,9 @@ private enum StorageUsageEntry: ItemListNodeEntry { case keepMediaInfo(PresentationTheme, String) case collecting(PresentationTheme, String) + + case clearAll(PresentationTheme, String, String) + case peersHeader(PresentationTheme, String) case peer(Int32, PresentationTheme, PresentationStrings, Peer, String) @@ -33,7 +39,9 @@ private enum StorageUsageEntry: ItemListNodeEntry { switch self { case .keepMedia, .keepMediaInfo: return StorageUsageSection.keepMedia.rawValue - case .collecting, .peersHeader, .peer: + case .collecting, .clearAll: + return StorageUsageSection.all.rawValue + case .peersHeader, .peer: return StorageUsageSection.peers.rawValue } } @@ -46,10 +54,12 @@ private enum StorageUsageEntry: ItemListNodeEntry { return 1 case .collecting: return 2 - case .peersHeader: + case .clearAll: return 3 + case .peersHeader: + return 4 case let .peer(index, _, _, _, _): - return 4 + index + return 5 + index } } @@ -73,6 +83,12 @@ private enum StorageUsageEntry: ItemListNodeEntry { } else { return false } + case let .clearAll(lhsTheme, lhsText, lhsValue): + if case let .clearAll(rhsTheme, rhsText, rhsValue) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsValue == rhsValue { + return true + } else { + return false + } case let .peersHeader(lhsTheme, lhsText): if case let .peersHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { return true @@ -119,6 +135,10 @@ private enum StorageUsageEntry: ItemListNodeEntry { return CalculatingCacheSizeItem(theme: theme, title: text, sectionId: self.section, style: .blocks) case let .peersHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) + case let .clearAll(theme, text, value): + return ItemListDisclosureItem(theme: theme, icon: nil, title: text, label: value, sectionId: self.section, style: .blocks, disclosureStyle: .arrow, action: { + arguments.openClearAll() + }) case let .peer(_, theme, strings, peer, value): return ItemListPeerItem(theme: theme, strings: strings, account: arguments.account, peer: peer, aliasHandling: .threatSelfAsSaved, presence: nil, text: .none, label: .disclosure(value), editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), switchValue: nil, enabled: true, sectionId: self.section, action: { arguments.openPeerMedia(peer.id) @@ -148,6 +168,7 @@ private func storageUsageControllerEntries(presentationData: PresentationData, c var addedHeader = false if let cacheStats = cacheStats, case let .result(stats) = cacheStats { + var peerSizes: Int64 = 0 var statsByPeerId: [(PeerId, Int64)] = [] for (peerId, categories) in stats.media { var combinedSize: Int64 = 0 @@ -157,7 +178,11 @@ private func storageUsageControllerEntries(presentationData: PresentationData, c } } statsByPeerId.append((peerId, combinedSize)) + peerSizes += combinedSize } + + entries.append(.clearAll(presentationData.theme, presentationData.strings.Cache_ClearCache, dataSizeString(Int(peerSizes + stats.otherSize + stats.cacheSize)))) + var index: Int32 = 0 for (peerId, size) in statsByPeerId.sorted(by: { $0.1 > $1.1 }) { if size >= 32 * 1024 { @@ -242,6 +267,162 @@ func storageUsageController(account: Account) -> ViewController { ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })]) ]) presentControllerImpl?(controller) + }, openClearAll: { + let _ = (statsPromise.get() |> take(1) |> deliverOnMainQueue).start(next: { [weak statsPromise] result in + if let result = result, case let .result(stats) = result { + let presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 } + let controller = ActionSheetController(presentationTheme: presentationData.theme) + let dismissAction: () -> Void = { [weak controller] in + controller?.dismissAnimated() + } + + var sizeIndex: [PeerCacheUsageCategory: (Bool, Int64)] = [:] + var otherSize: (Bool, Int64) = (true, 0) + + for (_, categories) in stats.media { + for (category, media) in categories { + var combinedSize: Int64 = 0 + for (_, size) in media { + combinedSize += size + } + if combinedSize != 0 { + sizeIndex[category] = (true, (sizeIndex[category]?.1 ?? 0) + combinedSize) + } + } + } + + if stats.cacheSize + stats.otherSize > 10 * 1024 { + otherSize = (true, stats.cacheSize + stats.otherSize) + } + + var itemIndex = 0 + + let updateTotalSize: () -> Void = { [weak controller] in + controller?.updateItem(groupIndex: 0, itemIndex: itemIndex, { item in + let title: String + var filteredSize = sizeIndex.values.reduce(0, { $0 + ($1.0 ? $1.1 : 0) }) + + if otherSize.0 { + filteredSize += otherSize.1 + } + + if filteredSize == 0 { + title = presentationData.strings.Cache_ClearNone + } else { + title = presentationData.strings.Cache_Clear("\(dataSizeString(Int(filteredSize)))").0 + } + + if let item = item as? ActionSheetButtonItem { + return ActionSheetButtonItem(title: title, color: filteredSize != 0 ? .accent : .disabled, enabled: filteredSize != 0, action: item.action) + } + return item + }) + } + + let toggleCheck: (PeerCacheUsageCategory?, Int) -> Void = { [weak controller] category, itemIndex in + if let category = category { + if let (value, size) = sizeIndex[category] { + sizeIndex[category] = (!value, size) + } + } else { + otherSize = (!otherSize.0, otherSize.1) + } + controller?.updateItem(groupIndex: 0, itemIndex: itemIndex, { item in + if let item = item as? ActionSheetCheckboxItem { + return ActionSheetCheckboxItem(title: item.title, label: item.label, value: !item.value, action: item.action) + } + return item + }) + updateTotalSize() + } + var items: [ActionSheetItem] = [] + + let validCategories: [PeerCacheUsageCategory] = [.image, .video, .audio, .file] + + var totalSize: Int64 = 0 + + for categoryId in validCategories { + if let (_, size) = sizeIndex[categoryId] { + let categorySize: Int64 = size + totalSize += categorySize + let index = itemIndex + items.append(ActionSheetCheckboxItem(title: stringForCategory(strings: presentationData.strings, category: categoryId), label: dataSizeString(Int(categorySize)), value: true, action: { value in + toggleCheck(categoryId, index) + })) + itemIndex += 1 + } + } + + if otherSize.1 != 0 { + let index = itemIndex + items.append(ActionSheetCheckboxItem(title: presentationData.strings.Localization_LanguageOther, label: dataSizeString(Int(otherSize.1)), value: true, action: { value in + toggleCheck(nil, index) + })) + itemIndex += 1 + } + + if !items.isEmpty { + items.append(ActionSheetButtonItem(title: presentationData.strings.Cache_Clear("\(dataSizeString(Int(totalSize)))").0, action: { + if let statsPromise = statsPromise { + let clearCategories = sizeIndex.keys.filter({ sizeIndex[$0]!.0 }) + + var clearMediaIds = Set() + + var media = stats.media + for (peerId, categories) in stats.media { + var categories = categories + for category in clearCategories { + if let contents = categories[category] { + for (mediaId, _) in contents { + clearMediaIds.insert(mediaId) + } + } + categories.removeValue(forKey: category) + } + + media[peerId] = categories + } + + var clearResourceIds = Set() + for id in clearMediaIds { + if let ids = stats.mediaResourceIds[id] { + for resourceId in ids { + clearResourceIds.insert(WrappedMediaResourceId(resourceId)) + } + } + } + + var updatedOtherPaths = stats.otherPaths + var updatedOtherSize = stats.otherSize + var updatedCacheSize = stats.cacheSize + + var signal: Signal = clearCachedMediaResources(account: account, mediaResourceIds: clearResourceIds) + if otherSize.0 { + signal = signal |> then(account.postbox.mediaBox.removeOtherCachedResources(paths: stats.otherPaths)) + } + + if otherSize.0 { + updatedOtherPaths = [] + updatedOtherSize = 0 + updatedCacheSize = 0 + } + + statsPromise.set(.single(.result(CacheUsageStats(media: media, mediaResourceIds: stats.mediaResourceIds, peers: stats.peers, otherSize: updatedOtherSize, otherPaths: updatedOtherPaths, cacheSize: updatedCacheSize)))) + + clearDisposable.set(signal.start()) + } + + dismissAction() + })) + + controller.setItemGroups([ + ActionSheetItemGroup(items: items), + ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })]) + ]) + presentControllerImpl?(controller) + } + } + }) }, openPeerMedia: { peerId in let _ = (statsPromise.get() |> take(1) |> deliverOnMainQueue).start(next: { [weak statsPromise] result in if let result = result, case let .result(stats) = result { @@ -340,7 +521,7 @@ func storageUsageController(account: Account) -> ViewController { } } - statsPromise.set(.single(.result(CacheUsageStats(media: media, mediaResourceIds: stats.mediaResourceIds, peers: stats.peers)))) + statsPromise.set(.single(.result(CacheUsageStats(media: media, mediaResourceIds: stats.mediaResourceIds, peers: stats.peers, otherSize: stats.otherSize, otherPaths: stats.otherPaths, cacheSize: stats.cacheSize)))) clearDisposable.set(clearCachedMediaResources(account: account, mediaResourceIds: clearResourceIds).start()) } diff --git a/TelegramUI/SystemVideoContent.swift b/TelegramUI/SystemVideoContent.swift index 813157bea0..245dbc17fc 100644 --- a/TelegramUI/SystemVideoContent.swift +++ b/TelegramUI/SystemVideoContent.swift @@ -46,6 +46,11 @@ private final class SystemVideoContentNode: ASDisplayNode, UniversalVideoContent return self._status.get() } + private let _bufferingStatus = Promise<(IndexSet, Int)?>() + var bufferingStatus: Signal<(IndexSet, Int)?, NoError> { + return self._bufferingStatus.get() + } + private let _ready = Promise() var ready: Signal { return self._ready.get() @@ -111,6 +116,8 @@ private final class SystemVideoContentNode: ASDisplayNode, UniversalVideoContent playerItem.addObserver(self, forKeyPath: "playbackBufferEmpty", options: .new, context: nil) playerItem.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: .new, context: nil) playerItem.addObserver(self, forKeyPath: "playbackBufferFull", options: .new, context: nil) + + self._bufferingStatus.set(.single(nil)) } deinit { diff --git a/TelegramUI/TelegramAccountAuxiliaryMethods.swift b/TelegramUI/TelegramAccountAuxiliaryMethods.swift index 28e2de34ed..eb2942f3ef 100644 --- a/TelegramUI/TelegramAccountAuxiliaryMethods.swift +++ b/TelegramUI/TelegramAccountAuxiliaryMethods.swift @@ -10,7 +10,7 @@ public let telegramAccountAuxiliaryMethods = AccountAuxiliaryMethods(updatePeerC } else { return interfaceState } -}, fetchResource: { account, resource, range, _ in +}, fetchResource: { account, resource, ranges, _ in if let resource = resource as? VideoLibraryMediaResource { return fetchVideoLibraryMediaResource(resource: resource) } else if let resource = resource as? LocalFileVideoMediaResource { @@ -21,6 +21,8 @@ public let telegramAccountAuxiliaryMethods = AccountAuxiliaryMethods(updatePeerC return fetchMapSnapshotResource(resource: mapSnapshotResource) } else if let resource = resource as? ExternalMusicAlbumArtResource { return fetchExternalMusicAlbumArtResource(account: account, resource: resource) + } else if let resource = resource as? ICloudFileResource { + return fetchICloudFileResource(resource: resource) } return nil }, fetchResourceMediaReferenceHash: { resource in diff --git a/TelegramUI/TelegramController.swift b/TelegramUI/TelegramController.swift index f539279bfb..da66b48030 100644 --- a/TelegramUI/TelegramController.swift +++ b/TelegramUI/TelegramController.swift @@ -26,8 +26,8 @@ private func presentLiveLocationController(account: Account, peerId: PeerId, con }, openUrl: { _ in }, openPeer: { peer, navigation in }, callPeer: { _ in - }, sendSticker: { _ in - }, setupTemporaryHiddenMedia: { _, _, _ in + }, enqueueMessage: { _ in + }, sendSticker: nil, setupTemporaryHiddenMedia: { _, _, _ in }) } }) diff --git a/TelegramUI/TelegramUIPrivate/module.modulemap b/TelegramUI/TelegramUIPrivate/module.modulemap index beaa71cfda..e179011863 100644 --- a/TelegramUI/TelegramUIPrivate/module.modulemap +++ b/TelegramUI/TelegramUIPrivate/module.modulemap @@ -24,4 +24,5 @@ module TelegramUIPrivateModule { header "../NumberPluralizationForm.h" header "../DeviceProximityManager.h" header "../RaiseToListenActivator.h" + header "../TGMimeTypeMap.h" } diff --git a/TelegramUI/ThemeGridController.swift b/TelegramUI/ThemeGridController.swift index d888dca690..2f66519ac3 100644 --- a/TelegramUI/ThemeGridController.swift +++ b/TelegramUI/ThemeGridController.swift @@ -70,12 +70,44 @@ final class ThemeGridController: ViewController { override func loadDisplayNode() { self.displayNode = ThemeGridControllerNode(account: self.account, presentationData: self.presentationData, present: { [weak self] controller, arguments in self?.present(controller, in: .window(.root), with: arguments) + }, selectCustomWallpaper: { [weak self] in + if let strongSelf = self { + strongSelf.present(legacyImagePicker(theme: strongSelf.presentationData.theme, completion: { image in + if let strongSelf = self, let image = image { + strongSelf.present(legacyWallpaperEditor(theme: strongSelf.presentationData.theme, image: image, completion: { image in + if let image = image { + self?.applyCustomWallpaperImage(image) + } + }), in: .window(.root)) + } + }), in: .window(.root)) + } }) self._ready.set(self.controllerNode.ready.get()) self.displayNodeDidLoad() } + private func applyCustomWallpaperImage(_ image: UIImage) { + guard let data = UIImageJPEGRepresentation(image, 0.8) else { + return + } + + let resource = LocalFileMediaResource(fileId: arc4random64()) + self.account.postbox.mediaBox.storeResourceData(resource.id, data: data) + + let wallpaper: TelegramWallpaper = .image([TelegramMediaImageRepresentation(dimensions: image.size, resource: resource)]) + let _ = (updatePresentationThemeSettingsInteractively(postbox: self.account.postbox, { current in + if case .color(0x000000) = wallpaper { + return PresentationThemeSettings(chatWallpaper: wallpaper, theme: current.theme, fontSize: .regular) + } + + return PresentationThemeSettings(chatWallpaper: wallpaper, theme: current.theme, fontSize: current.fontSize) + }) |> deliverOnMainQueue).start(completed: { [weak self] in + let _ = (self?.navigationController as? NavigationController)?.popViewController(animated: true) + }) + } + override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { super.containerLayoutUpdated(layout, transition: transition) diff --git a/TelegramUI/ThemeGridControllerNode.swift b/TelegramUI/ThemeGridControllerNode.swift index b830414463..bc35860e51 100644 --- a/TelegramUI/ThemeGridControllerNode.swift +++ b/TelegramUI/ThemeGridControllerNode.swift @@ -61,23 +61,49 @@ final class ThemeGridControllerNode: ASDisplayNode { private var presentationData: PresentationData private let present: (ViewController, Any?) -> Void + private let selectCustomWallpaper: () -> Void let ready = ValuePromise() + private let customWallpaperButton: HighlightableButtonNode + private var customWallpaperButtonBackground: ASDisplayNode + private var customWallpaperBackground: ASDisplayNode + private var customWallpaperSeparator: ASDisplayNode + private var customWallpaperButtonTopSeparator: ASDisplayNode + private var customWallpaperButtonBottomSeparator: ASDisplayNode + private let gridNode: GridNode private var queuedTransitions: [ThemeGridEntryTransition] = [] private var validLayout: (ContainerViewLayout, CGFloat)? private var disposable: Disposable? - init(account: Account, presentationData: PresentationData, present: @escaping (ViewController, Any?) -> Void) { + init(account: Account, presentationData: PresentationData, present: @escaping (ViewController, Any?) -> Void, selectCustomWallpaper: @escaping () -> Void) { self.account = account self.presentationData = presentationData self.present = present + self.selectCustomWallpaper = selectCustomWallpaper self.gridNode = GridNode() self.gridNode.showVerticalScrollIndicator = true + self.customWallpaperButton = HighlightableButtonNode() + + self.customWallpaperButtonBackground = ASDisplayNode() + self.customWallpaperButtonBackground.backgroundColor = presentationData.theme.list.itemBlocksBackgroundColor + + self.customWallpaperBackground = ASDisplayNode() + self.customWallpaperBackground.backgroundColor = presentationData.theme.list.blocksBackgroundColor + + self.customWallpaperSeparator = ASDisplayNode() + self.customWallpaperSeparator.backgroundColor = presentationData.theme.list.itemBlocksSeparatorColor + + self.customWallpaperButtonTopSeparator = ASDisplayNode() + self.customWallpaperButtonTopSeparator.backgroundColor = presentationData.theme.list.itemBlocksSeparatorColor + + self.customWallpaperButtonBottomSeparator = ASDisplayNode() + self.customWallpaperButtonBottomSeparator.backgroundColor = presentationData.theme.list.itemBlocksSeparatorColor + super.init() self.setViewBlock({ @@ -86,6 +112,26 @@ final class ThemeGridControllerNode: ASDisplayNode { self.backgroundColor = presentationData.theme.list.itemBlocksBackgroundColor + self.customWallpaperButton.setAttributedTitle(NSAttributedString(string: presentationData.strings.Wallpaper_PhotoLibrary, font: Font.regular(17.0), textColor: presentationData.theme.list.itemAccentColor), for: []) + self.customWallpaperButton.backgroundColor = presentationData.theme.list.itemBlocksBackgroundColor + self.customWallpaperButton.highligthedChanged = { [weak self] highlighted in + if let strongSelf = self { + if highlighted { + strongSelf.customWallpaperButton.backgroundColor = strongSelf.presentationData.theme.list.itemHighlightedBackgroundColor + } else { + UIView.animate(withDuration: 0.3, animations: { + strongSelf.customWallpaperButton.backgroundColor = nil + }) + } + } + } + + self.gridNode.addSubnode(self.customWallpaperBackground) + self.gridNode.addSubnode(self.customWallpaperSeparator) + self.gridNode.addSubnode(self.customWallpaperButtonTopSeparator) + self.gridNode.addSubnode(self.customWallpaperButtonBottomSeparator) + self.gridNode.addSubnode(self.customWallpaperButtonBackground) + self.gridNode.addSubnode(self.customWallpaperButton) self.addSubnode(self.gridNode) let previousEntries = Atomic<[ThemeGridControllerEntry]?>(value: nil) @@ -119,6 +165,8 @@ final class ThemeGridControllerNode: ASDisplayNode { strongSelf.enqueueTransition(transition) } }) + + self.customWallpaperButton.addTarget(self, action: #selector(self.customWallpaperPressed), forControlEvents: .touchUpInside) } deinit { @@ -164,7 +212,17 @@ final class ThemeGridControllerNode: ASDisplayNode { let spacing = floor((layout.size.width - CGFloat(imageCount) * imageSize.width) / CGFloat(imageCount + 1)) - insets.top += spacing + let buttonInset: CGFloat = 24.0 + 44.0 + 16.0 + let buttonOffset = buttonInset + 10.0 + + transition.updateFrame(node: self.customWallpaperBackground, frame: CGRect(origin: CGPoint(x: 0.0, y: -buttonOffset - 500.0), size: CGSize(width: layout.size.width, height: 16.0 + 44.0 + 16.0 + 500.0))) + transition.updateFrame(node: self.customWallpaperSeparator, frame: CGRect(origin: CGPoint(x: 0.0, y: -buttonOffset + 16.0 + 44.0 + 16.0 - UIScreenPixel), size: CGSize(width: layout.size.width, height: UIScreenPixel))) + transition.updateFrame(node: self.customWallpaperButtonTopSeparator, frame: CGRect(origin: CGPoint(x: 0.0, y: -buttonOffset + 16.0 - UIScreenPixel), size: CGSize(width: layout.size.width, height: UIScreenPixel))) + transition.updateFrame(node: self.customWallpaperButtonBottomSeparator, frame: CGRect(origin: CGPoint(x: 0.0, y: -buttonOffset + 16.0 + 44.0), size: CGSize(width: layout.size.width, height: UIScreenPixel))) + transition.updateFrame(node: self.customWallpaperButtonBackground, frame: CGRect(origin: CGPoint(x: 0.0, y: -buttonOffset + 16.0), size: CGSize(width: layout.size.width, height: 44.0))) + transition.updateFrame(node: self.customWallpaperButton, frame: CGRect(origin: CGPoint(x: 0.0, y: -buttonOffset + 16.0), size: CGSize(width: layout.size.width, height: 44.0))) + + insets.top += spacing + buttonInset self.gridNode.transaction(GridNodeTransaction(deleteItems: [], insertItems: [], updateItems: [], scrollToItem: nil, updateLayout: GridNodeUpdateLayout(layout: GridNodeLayout(size: layout.size, insets: insets, scrollIndicatorInsets: scrollIndicatorInsets, preloadSize: 300.0, type: .fixed(itemSize: imageSize, lineSpacing: spacing)), transition: .immediate), itemTransition: .immediate, stationaryItems: .none, updateFirstIndexInSectionOffset: nil), completion: { _ in }) @@ -180,4 +238,8 @@ final class ThemeGridControllerNode: ASDisplayNode { func scrollToTop() { self.gridNode.transaction(GridNodeTransaction(deleteItems: [], insertItems: [], updateItems: [], scrollToItem: GridNodeScrollToItem(index: 0, position: .top, transition: .animated(duration: 0.25, curve: .easeInOut), directionHint: .up, adjustForSection: true, adjustForTopInset: true), updateLayout: nil, itemTransition: .immediate, stationaryItems: .none, updateFirstIndexInSectionOffset: nil), completion: { _ in }) } + + @objc func customWallpaperPressed() { + self.selectCustomWallpaper() + } } diff --git a/TelegramUI/ThemeSettingsChatPreviewItem.swift b/TelegramUI/ThemeSettingsChatPreviewItem.swift index 5be5358952..536c3607db 100644 --- a/TelegramUI/ThemeSettingsChatPreviewItem.swift +++ b/TelegramUI/ThemeSettingsChatPreviewItem.swift @@ -137,14 +137,14 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode { var peers = SimpleDictionary() var messages = SimpleDictionary() - peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: "Lucio", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, flags: []) + peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: "Lucio", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3) messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "Reinhart, we need to find you some...", attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) let chatPresentationData = ChatPresentationData(theme: item.theme, fontSize: item.fontSize, strings: item.strings, wallpaper: item.wallpaper, timeFormat: item.timeFormat) let item2: ChatMessageItem = ChatMessageItem(presentationData: chatPresentationData, account: item.account, chatLocation: .peer(peerId), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: nil, text: "Ahh you kids today with techno music! Enjoy the classics, like Hasselhoff!", attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none), disableDate: true) - let item1: ChatMessageItem = ChatMessageItem(presentationData: chatPresentationData, account: item.account, chatLocation: .peer(peerId), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: TelegramUser(id: item.account.peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, flags: []), text: "I can't take you seriously right now. Sorry..", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none), disableDate: true) + let item1: ChatMessageItem = ChatMessageItem(presentationData: chatPresentationData, account: item.account, chatLocation: .peer(peerId), controllerInteraction: controllerInteraction, content: .message(message: Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: TelegramUser(id: item.account.peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []), text: "I can't take you seriously right now. Sorry..", attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), read: true, selection: .none), disableDate: true) var node1: ListViewItemNode? if let current = currentNode1 { diff --git a/TelegramUI/UniversalVideoCalleryItem.swift b/TelegramUI/UniversalVideoCalleryItem.swift index 820e60f6aa..939ae5864b 100644 --- a/TelegramUI/UniversalVideoCalleryItem.swift +++ b/TelegramUI/UniversalVideoCalleryItem.swift @@ -198,6 +198,8 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } }) + self.scrubberView.setBufferingStatusSignal(videoNode.bufferingStatus) + self.statusDisposable.set((videoNode.status |> deliverOnMainQueue).start(next: { [weak self] value in if let strongSelf = self { var initialBuffering = false diff --git a/TelegramUI/UniversalVideoContentManager.swift b/TelegramUI/UniversalVideoContentManager.swift index 433d26e86a..339d772b77 100644 --- a/TelegramUI/UniversalVideoContentManager.swift +++ b/TelegramUI/UniversalVideoContentManager.swift @@ -23,18 +23,28 @@ private final class UniversalVideoContentHolder { var statusDisposable: Disposable? var statusValue: MediaPlayerStatus? + var bufferingStatusDisposable: Disposable? + var bufferingStatusValue: (IndexSet, Int)? + var playbackCompletedIndex: Int? - init(content: UniversalVideoContentNode & ASDisplayNode, statusUpdated: @escaping (MediaPlayerStatus?) -> Void, playbackCompleted: @escaping () -> Void) { + init(content: UniversalVideoContentNode & ASDisplayNode, statusUpdated: @escaping (MediaPlayerStatus?) -> Void, bufferingStatusUpdated: @escaping ((IndexSet, Int)?) -> Void, playbackCompleted: @escaping () -> Void) { self.content = content - self.statusDisposable = (content.status |> deliverOn(Queue.mainQueue())).start(next: { [weak self] value in + self.statusDisposable = (content.status |> deliverOnMainQueue).start(next: { [weak self] value in if let strongSelf = self { strongSelf.statusValue = value statusUpdated(value) } }) + self.bufferingStatusDisposable = (content.bufferingStatus |> deliverOnMainQueue).start(next: { [weak self] value in + if let strongSelf = self { + strongSelf.bufferingStatusValue = value + bufferingStatusUpdated(value) + } + }) + self.playbackCompletedIndex = content.addPlaybackCompleted { playbackCompleted() } @@ -42,6 +52,7 @@ private final class UniversalVideoContentHolder { deinit { self.statusDisposable?.dispose() + self.bufferingStatusDisposable?.dispose() if let playbackCompletedIndex = self.playbackCompletedIndex { self.content.removePlaybackCompleted(playbackCompletedIndex) } @@ -115,9 +126,10 @@ private final class UniversalVideoContentHolder { private final class UniversalVideoContentHolderCallbacks { let playbackCompleted = Bag<() -> Void>() let status = Bag<(MediaPlayerStatus?) -> Void>() + let bufferingStatus = Bag<((IndexSet, Int)?) -> Void>() var isEmpty: Bool { - return self.playbackCompleted.isEmpty && self.status.isEmpty + return self.playbackCompleted.isEmpty && self.status.isEmpty && self.bufferingStatus.isEmpty } } @@ -143,6 +155,14 @@ final class UniversalVideoContentManager { } } } + }, bufferingStatusUpdated: { [weak self] value in + if let strongSelf = self { + if let current = strongSelf.holderCallbacks[id] { + for subscriber in current.bufferingStatus.copyItems() { + subscriber(value) + } + } + } }, playbackCompleted: { [weak self] in if let strongSelf = self { if let current = strongSelf.holderCallbacks[id] { @@ -187,6 +207,7 @@ final class UniversalVideoContentManager { } func addPlaybackCompleted(id: AnyHashable, _ f: @escaping () -> Void) -> Int { + assert(Queue.mainQueue().isCurrent()) var callbacks: UniversalVideoContentHolderCallbacks if let current = self.holderCallbacks[id] { callbacks = current @@ -238,4 +259,37 @@ final class UniversalVideoContentManager { } } |> runOn(Queue.mainQueue()) } + + func bufferingStatusSignal(content: UniversalVideoContent) -> Signal<(IndexSet, Int)?, NoError> { + return Signal { subscriber in + var callbacks: UniversalVideoContentHolderCallbacks + if let current = self.holderCallbacks[content.id] { + callbacks = current + } else { + callbacks = UniversalVideoContentHolderCallbacks() + self.holderCallbacks[content.id] = callbacks + } + + let index = callbacks.bufferingStatus.add({ value in + subscriber.putNext(value) + }) + + if let current = self.holders[content.id] { + subscriber.putNext(current.bufferingStatusValue) + } else { + subscriber.putNext(nil) + } + + return ActionDisposable { + Queue.mainQueue().async { + if let current = self.holderCallbacks[content.id] { + current.status.remove(index) + if current.playbackCompleted.isEmpty { + self.holderCallbacks.removeValue(forKey: content.id) + } + } + } + } + } |> runOn(Queue.mainQueue()) + } } diff --git a/TelegramUI/UniversalVideoNode.swift b/TelegramUI/UniversalVideoNode.swift index af1b377d63..6d09ce5b45 100644 --- a/TelegramUI/UniversalVideoNode.swift +++ b/TelegramUI/UniversalVideoNode.swift @@ -8,6 +8,7 @@ import Display protocol UniversalVideoContentNode: class { var ready: Signal { get } var status: Signal { get } + var bufferingStatus: Signal<(IndexSet, Int)?, NoError> { get } func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) @@ -91,6 +92,11 @@ final class UniversalVideoNode: ASDisplayNode { return self._status.get() } + private let _bufferingStatus = Promise<(IndexSet, Int)?>() + var bufferingStatus: Signal<(IndexSet, Int)?, NoError> { + return self._bufferingStatus.get() + } + private let _ready = Promise() var ready: Signal { return self._ready.get() @@ -144,6 +150,7 @@ final class UniversalVideoNode: ASDisplayNode { }) self._status.set(self.manager.statusSignal(content: self.content)) + self._bufferingStatus.set(self.manager.bufferingStatusSignal(content: self.content)) self.decoration.setStatus(self.status) diff --git a/TelegramUI/WebEmbedVideoContent.swift b/TelegramUI/WebEmbedVideoContent.swift index 4d98e0f79e..e1f0d57343 100644 --- a/TelegramUI/WebEmbedVideoContent.swift +++ b/TelegramUI/WebEmbedVideoContent.swift @@ -72,6 +72,11 @@ private final class WebEmbedVideoContentNode: ASDisplayNode, UniversalVideoConte return self._status.get() } + private let _bufferingStatus = Promise<(IndexSet, Int)?>() + var bufferingStatus: Signal<(IndexSet, Int)?, NoError> { + return self._bufferingStatus.get() + } + private var seekId: Int = 0 private let _ready = Promise() @@ -201,6 +206,8 @@ private final class WebEmbedVideoContentNode: ASDisplayNode, UniversalVideoConte strongSelf._status.set(MediaPlayerStatus(generationTimestamp: value.generationTimestamp, duration: value.duration, timestamp: value.timestamp, seekId: strongSelf.seekId, status: value.status)) } }) + + self._bufferingStatus.set(.single(nil)) } deinit {