From 0a8428f6b21cc50fddcd8b6b8bbec7b99bbe73c8 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 27 May 2020 23:08:52 +0300 Subject: [PATCH] Video editor fixes --- .../Items/UniversalVideoGalleryItem.swift | 67 ++++++++++++++++-- .../Sources/LegacyMediaPickers.swift | 7 +- .../SyncCore/Sources/TelegramMediaFile.swift | 9 +++ .../Contents.json | 22 ------ .../GalleryEmbeddedStickersIcon@2x.png | Bin 1735 -> 0 bytes .../GalleryEmbeddedStickersIcon@3x.png | Bin 2635 -> 0 bytes 6 files changed, 73 insertions(+), 32 deletions(-) delete mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/GalleryEmbeddedStickersIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/GalleryEmbeddedStickersIcon@3x.png diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index bf7551c22a..b832a6ee58 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -11,6 +11,9 @@ import UniversalMediaPlayer import AccountContext import RadialStatusNode import TelegramUniversalVideoContent +import PresentationDataUtils +import OverlayStatusController +import StickerPackPreviewUI import AppBundle public enum UniversalVideoGalleryItemContentInfo { @@ -244,7 +247,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { fileprivate let _ready = Promise() fileprivate let _title = Promise() fileprivate let _titleView = Promise() - fileprivate let _rightBarButtonItem = Promise() + fileprivate let _rightBarButtonItems = Promise<[UIBarButtonItem]?>() private let scrubberView: ChatVideoGalleryItemScrubberView private let footerContentNode: ChatItemGalleryFooterContentNode @@ -445,8 +448,12 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { self.dismissOnOrientationChange = item.landscape + var hasLinkedStickers = false + if let content = item.content as? NativeVideoContent { + hasLinkedStickers = content.fileReference.media.hasLinkedStickers + } + var disablePictureInPicture = false - var disablePlayerControls = false var isAnimated = false if let content = item.content as? NativeVideoContent { @@ -670,12 +677,18 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { })) self.zoomableContent = (videoSize, videoNode) - + + var barButtonItems: [UIBarButtonItem] = [] if !isAnimated && !disablePlayerControls && !disablePictureInPicture { let rightBarButtonItem = UIBarButtonItem(image: pictureInPictureButtonImage, style: .plain, target: self, action: #selector(self.pictureInPictureButtonPressed)) - self._rightBarButtonItem.set(.single(rightBarButtonItem)) + barButtonItems.append(rightBarButtonItem) } - + if hasLinkedStickers { + let rightBarButtonItem = UIBarButtonItem(image: UIImage(bundleImageName: "Media Gallery/Stickers"), style: .plain, target: self, action: #selector(self.openStickersButtonPressed)) + barButtonItems.append(rightBarButtonItem) + } + self._rightBarButtonItems.set(.single(barButtonItems)) + videoNode.playbackCompleted = { [weak videoNode] in Queue.mainQueue().async { item.playbackCompleted() @@ -1218,8 +1231,8 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { return self._titleView.get() } - override func rightBarButtonItem() -> Signal { - return self._rightBarButtonItem.get() + override func rightBarButtonItems() -> Signal<[UIBarButtonItem]?, NoError> { + return self._rightBarButtonItems.get() } @objc func statusButtonPressed() { @@ -1307,6 +1320,46 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } } + @objc func openStickersButtonPressed() { + if let content = self.item?.content as? NativeVideoContent { + let media = content.fileReference.abstract + + let presentationData = self.context.sharedContext.currentPresentationData.with { $0 } + let progressSignal = Signal { [weak self] subscriber in + guard let strongSelf = self else { + return EmptyDisposable + } + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) + (strongSelf.baseNavigationController()?.topViewController as? ViewController)?.present(controller, in: .window(.root), with: nil) + return ActionDisposable { [weak controller] in + Queue.mainQueue().async() { + controller?.dismiss() + } + } + } + |> runOn(Queue.mainQueue()) + |> delay(0.15, queue: Queue.mainQueue()) + let progressDisposable = progressSignal.start() + + let signal = stickerPacksAttachedToMedia(account: self.context.account, media: media) + |> afterDisposed { + Queue.mainQueue().async { + progressDisposable.dispose() + } + } + let _ = (signal + |> deliverOnMainQueue).start(next: { [weak self] packs in + guard let strongSelf = self, !packs.isEmpty else { + return + } + let baseNavigationController = strongSelf.baseNavigationController() + baseNavigationController?.view.endEditing(true) + let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packs[0], stickerPacks: packs, sendSticker: nil) + (baseNavigationController?.topViewController as? ViewController)?.present(controller, in: .window(.root), with: nil) + }) + } + } + override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { return .single((self.footerContentNode, nil)) } diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift index fe73746d49..d576b72149 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift @@ -143,9 +143,10 @@ private final class LegacyAssetItemWrapper: NSObject { public func legacyAssetPickerItemGenerator() -> ((Any?, String?, [Any]?, String?) -> [AnyHashable : Any]?) { return { anyDict, caption, entities, hash in let dict = anyDict as! NSDictionary - let stickers = (dict["stickers"] as? [TGDocumentMediaAttachment])?.compactMap { document -> FileMediaReference? in - if let sticker = stickerFromLegacyDocument(document) { - return FileMediaReference.standalone(media: sticker) + let stickers = (dict["stickers"] as? [Data])?.compactMap { data -> FileMediaReference? in + let decoder = PostboxDecoder(buffer: MemoryBuffer(data: data)) + if let file = decoder.decodeRootObject() as? TelegramMediaFile { + return FileMediaReference.standalone(media: file) } else { return nil } diff --git a/submodules/SyncCore/Sources/TelegramMediaFile.swift b/submodules/SyncCore/Sources/TelegramMediaFile.swift index fcef7225d4..293bef9d3f 100644 --- a/submodules/SyncCore/Sources/TelegramMediaFile.swift +++ b/submodules/SyncCore/Sources/TelegramMediaFile.swift @@ -440,6 +440,15 @@ public final class TelegramMediaFile: Media, Equatable, Codable { return false } + public var hasLinkedStickers: Bool { + for attribute in self.attributes { + if case .HasLinkedStickers = attribute { + return true + } + } + return false + } + public var isMusic: Bool { for attribute in self.attributes { if case .Audio(false, _, _, _, _) = attribute { diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/Contents.json deleted file mode 100644 index 3b767d8bbe..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "GalleryEmbeddedStickersIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "GalleryEmbeddedStickersIcon@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/GalleryEmbeddedStickersIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/GalleryEmbeddedStickersIcon@2x.png deleted file mode 100644 index dce30d8177961f762d0e39ba46765fd5f4d2671b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1735 zcmV;&1~~bNP)A~ni-=rOS`$~Op}eJ|I~k$cK)%|%$d~G&8U&U zalFcl=Xu~nTHd^h)E1Z(z>#ywwLN!@@&nS%QqWJf1fkLzo{5`uJ#l15z^G#KM3)$hmZ6mDssqSQW< z{97!kV~%X?#%i4Z#h{B6;#$2a7|UQvASudsW2KVbpHRqIVK@N|^-*~rWga!`g2Z+G zPO|b2R!0BUh?^W&Qa^-WEkEh(q^k4)q=FK1MwmAtaOR+UlcZHij)q^wuRnHB)$4#) z{1%5GbBqXF?qy0B&Ok$DAAO85P}N$<+hYinIp~p_tm=n`gq=cAWv+rxb|UE(`X~e@ z<4=^5-iL$N12~u0bQt5kfvk=CjTlq;>L6MO6i{Lzova08wpK!Cdhww zATUMcWRD%sX!`TmJiWSY&{R}T_Bjxk>_pNjVk6*lJ%)m+yz9_pI7$kk3qv4cBWDG9 ztq!V$pUw)Z9=dd)&=ecNF5XQ4B?41iL%KxbK6rguP1RE+Y1O-(O?G4GpKfqGr!YwYc z*P#o8AOFarkL@h*?|0@Ea>P}VW{8Ajh%7o>Q9WpY;it7_zh1B{RN?)GF zqB7sS)#4JA9(>>YBWStVMJewxUQp6ZPAQp3pz0kYyJw-{{LcD*N>-)%H2lj5X?{Wq zk$VBpse3%Fr2HPL`e;f8$FYQ*V-_c+*8Z~B;EyiszLiu&-WPbr-N|#u;Pd?m*=5Bt z#BZ+dq%`2TydD0;g|}NNmDF$@e6rKw^X*mat&qd6l(*rJDfruVN~3Pm2|TBI{ZkKFdIMgy zkErUOuKY3lGDOb`vTN294F7TrbAnQxCFwmZkavm{B7Hl&Qa(@wRgGiNkoB1&Nb_}Q zNqDzqf|4TsWicJg2!U7Q5ZU?!KKWnMC-Vq2+-M``MQjALT}m5p(ra329;{xU5n>Z$ zp$Q9QrFG5I>zh_+&__80nR@|CF$G^ryEjQevKq)bNGW3no}=HE^q%ewETL(Htm(t@ z=(puuC_fBby-E(dpeg_BQIB0rC@put+ly!1yiYb*5SWG`vi1Qq8BS8=6lH(I0?ngj zRWAZF<{^tNK@-=tS*db}^q)hOvdb;V>=*4#DrUnc7RMEYGK;4bCz_7b01;ls`|*r zVW@PW4WnFOPF!n@3x`U#wZ}#Zk(+_lxTq&*MO-*k=Aet`o5u&8ea^b!%X#`J_#|&1 zaF8yMlY-UJh1vvJ`W=>#ePTi(ZNhXMt5;k>y2aT8@GEI!SqlYeRSbu)7E(9#*vTPR z>OL&$;;9}RrS|F6Jy_)*T>UQmKbV7b dp{8I2;6JVWR@$;fr@sII002ovPDHLkV1kUDPCozu diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/GalleryEmbeddedStickersIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/GalleryEmbeddedStickersIcon@3x.png deleted file mode 100644 index 6fe4d5e5c33e642e88fdcefc3ba425d7e4389d16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2635 zcmV-R3bgf!P)TLiXE04>+D2nGS7(f-XzC+KB?BC{DyWMys4?A*- zo(0A0tGgtI5N_5djW7f_TSZUT*)7)`2r$ZO?&TCEf2@9)1kJ+q_;Wq*sriEF5-IG1#N0nNOtue4r)-++`~rCUam$WTMDRnW{rWUX;bf{#Nw zT%?Ys$EvymPGSwO(afn_(>(y6VU~AV9Zj+%z9TVkjmw`rG<0;gIa zoPCR?pJm}iJAB$lledyWnx&%*T>UkgZs{BEdm(sPzBTcAnu6jhcz_kJr0HZ#7-JBA za2r0PDblX=GH})=nm%T;#2}oz6Bk2Ipu8QNhaLG9O%JmX3_?K_R3zKEUmp6$zWw{N zGPFr=K}EvO^$;v4X*#5Bml!z4va(4w+i#j18H3-+1oE*BfV<&_ioz}7%|V6-nAu3O zo!sh@5Wvf{i^*qiDumQ+6kaK_nw$_06_RYGwWAC{D!Rx|H@jB?SJ6e`b?7*R@-~vq z5^>dqAmc1CmI9PCf^#zM3lu(aF@qAg8}9gdB-@@8gvdThK~g?}kfEmV$;pRc(vbqT z0R&=sRtf=Cj~84;CxuU=6WsMNQb4=F&ERJnO#PB3P;v!auLKo^NBoNt1DAK26w%Bv zY)p?g=~KT{FQP{-Ai3qF$gx^*b}xkoRJ{_o z@^%UVRhAV)twQ`2G} zk^m1Imh7G@J>}o$ZcB@yCjpgh079mg6x#ji1&5cxr){+0a}q3T+6OTqFS~rN&}jJu zO_gr-2m|Mk)Qd2;c#f2-y$hl6EXk6#9ij4wLzI08g6&RLEQQ#= zw(NA53juERH+(=!X&2x1;sIvbK{8x*A;5riv{D~MTyqA5x=wne%y-T-x)}VrZZy70 z%A{`fFmQt`X)QfQ@>ckbu{>*B3<(`SAMt|w!KIr`lS*DtRAl$!zgY8`_GnTf#{%Jw zN4tb3RZs&T+hD>P@@p!Bkh_g!(99_+8Is^L;TZ9!=uX0E83u#z^wJ z_==l>Yw9K0k{6WLj5GK&x1XL*a_OV$dm;S0UmZ=4ZTnpHX$lTy^hppHD=8znG)r%~AzbQ< zn@M_>hGt_B6;Fpth2+X ztR;RPO~U*a2*-|+Pi7o~*s5+ukxcr+exmJS*IG|bIYCn89kD<8Qdt_6+=FW z&)X#gxo`u|kxc4Ex7-kN%p~8w6eq)v*qN?`RWt!(WWNNi`Z@*3%0Y;%9FlGK+d~q# z0ZF}x56u=VE=tPh~N&PCxwqFOq+C@qjBaal0F!)I9 z+^tNlW)AsTTfhxU`X~yL@cLaZg5+6Afx3GT^nWB}v@5M$jKR;v>gI^Jqc`_d(FDpz!FIz?GaQMd};~FyuM&H=01U8G>dZg+s~; z2nThf$et7gky!3m^bl(&xB&?&3WuzC2>NBDh%vHd1VMTw%|Z$i7c;`ZRo|rWIQBib z0f`hdY+?*SN?R#Ni48)=7Ze^9*TA(pX$lS&Ac&XgmXTlT28n^YJV4=M>jihVi>72x za-W0%IYs1SiD-6$^D@JF3YYG2aK+W+r+%3fP|w|KD!p2D=luPu+l95sTgm50K7^t= z3ZFg+Tz)b6naxRC=m{C#9%bNqJnCo)9~T36D2x2|?Y};zo=Z<4Wmd~D1k(-*AE>~< zWv7u}=666vH&irb$EzTeHB&fQA|MBnwz@4~6Q4bvpGX;jHD1pOCSuh-S5+M z(JhCNS3*G!9F`a+!YaCT%PB-&5d<$YZl~$g?FMJ-qY!CdJ0t{gv+@r8dlUky;#vq^ zX5LBD>v%OdH`6Ym5W3kWy|vpm*gjV0C}}e3(WosI!9`WrkQ%B>gjo7ec>e{5#EzCGG%w|swU6Q_ttOgoH`^z6|s t+q?6~iGS4>*Pp1#J#N~Ou!{bF{0H6kYIsfQMb7{L002ovPDHLkV1m&W@T&j-