Video editor fixes

This commit is contained in:
Ilya Laktyushin
2020-05-27 23:08:52 +03:00
parent 451e033dd1
commit 0a8428f6b2
6 changed files with 73 additions and 32 deletions

View File

@@ -11,6 +11,9 @@ import UniversalMediaPlayer
import AccountContext import AccountContext
import RadialStatusNode import RadialStatusNode
import TelegramUniversalVideoContent import TelegramUniversalVideoContent
import PresentationDataUtils
import OverlayStatusController
import StickerPackPreviewUI
import AppBundle import AppBundle
public enum UniversalVideoGalleryItemContentInfo { public enum UniversalVideoGalleryItemContentInfo {
@@ -244,7 +247,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
fileprivate let _ready = Promise<Void>() fileprivate let _ready = Promise<Void>()
fileprivate let _title = Promise<String>() fileprivate let _title = Promise<String>()
fileprivate let _titleView = Promise<UIView?>() fileprivate let _titleView = Promise<UIView?>()
fileprivate let _rightBarButtonItem = Promise<UIBarButtonItem?>() fileprivate let _rightBarButtonItems = Promise<[UIBarButtonItem]?>()
private let scrubberView: ChatVideoGalleryItemScrubberView private let scrubberView: ChatVideoGalleryItemScrubberView
private let footerContentNode: ChatItemGalleryFooterContentNode private let footerContentNode: ChatItemGalleryFooterContentNode
@@ -445,8 +448,12 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
self.dismissOnOrientationChange = item.landscape self.dismissOnOrientationChange = item.landscape
var disablePictureInPicture = false var hasLinkedStickers = false
if let content = item.content as? NativeVideoContent {
hasLinkedStickers = content.fileReference.media.hasLinkedStickers
}
var disablePictureInPicture = false
var disablePlayerControls = false var disablePlayerControls = false
var isAnimated = false var isAnimated = false
if let content = item.content as? NativeVideoContent { if let content = item.content as? NativeVideoContent {
@@ -671,10 +678,16 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
self.zoomableContent = (videoSize, videoNode) self.zoomableContent = (videoSize, videoNode)
var barButtonItems: [UIBarButtonItem] = []
if !isAnimated && !disablePlayerControls && !disablePictureInPicture { if !isAnimated && !disablePlayerControls && !disablePictureInPicture {
let rightBarButtonItem = UIBarButtonItem(image: pictureInPictureButtonImage, style: .plain, target: self, action: #selector(self.pictureInPictureButtonPressed)) 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 videoNode.playbackCompleted = { [weak videoNode] in
Queue.mainQueue().async { Queue.mainQueue().async {
@@ -1218,8 +1231,8 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
return self._titleView.get() return self._titleView.get()
} }
override func rightBarButtonItem() -> Signal<UIBarButtonItem?, NoError> { override func rightBarButtonItems() -> Signal<[UIBarButtonItem]?, NoError> {
return self._rightBarButtonItem.get() return self._rightBarButtonItems.get()
} }
@objc func statusButtonPressed() { @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<Never, NoError> { [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> { override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> {
return .single((self.footerContentNode, nil)) return .single((self.footerContentNode, nil))
} }

View File

@@ -143,9 +143,10 @@ private final class LegacyAssetItemWrapper: NSObject {
public func legacyAssetPickerItemGenerator() -> ((Any?, String?, [Any]?, String?) -> [AnyHashable : Any]?) { public func legacyAssetPickerItemGenerator() -> ((Any?, String?, [Any]?, String?) -> [AnyHashable : Any]?) {
return { anyDict, caption, entities, hash in return { anyDict, caption, entities, hash in
let dict = anyDict as! NSDictionary let dict = anyDict as! NSDictionary
let stickers = (dict["stickers"] as? [TGDocumentMediaAttachment])?.compactMap { document -> FileMediaReference? in let stickers = (dict["stickers"] as? [Data])?.compactMap { data -> FileMediaReference? in
if let sticker = stickerFromLegacyDocument(document) { let decoder = PostboxDecoder(buffer: MemoryBuffer(data: data))
return FileMediaReference.standalone(media: sticker) if let file = decoder.decodeRootObject() as? TelegramMediaFile {
return FileMediaReference.standalone(media: file)
} else { } else {
return nil return nil
} }

View File

@@ -440,6 +440,15 @@ public final class TelegramMediaFile: Media, Equatable, Codable {
return false return false
} }
public var hasLinkedStickers: Bool {
for attribute in self.attributes {
if case .HasLinkedStickers = attribute {
return true
}
}
return false
}
public var isMusic: Bool { public var isMusic: Bool {
for attribute in self.attributes { for attribute in self.attributes {
if case .Audio(false, _, _, _, _) = attribute { if case .Audio(false, _, _, _, _) = attribute {

View File

@@ -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"
}
}