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 dce30d8177..0000000000 Binary files a/submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/GalleryEmbeddedStickersIcon@2x.png and /dev/null differ 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 6fe4d5e5c3..0000000000 Binary files a/submodules/TelegramUI/Images.xcassets/Media Gallery/AssociatedMasksButton.imageset/GalleryEmbeddedStickersIcon@3x.png and /dev/null differ