diff --git a/submodules/AccountContext/Sources/OpenChatMessage.swift b/submodules/AccountContext/Sources/OpenChatMessage.swift index 25c58ae4dc..ae43e03132 100644 --- a/submodules/AccountContext/Sources/OpenChatMessage.swift +++ b/submodules/AccountContext/Sources/OpenChatMessage.swift @@ -48,6 +48,7 @@ public final class OpenChatMessageParams { public let gallerySource: GalleryControllerItemSource? public let centralItemUpdated: ((MessageId) -> Void)? public let getSourceRect: (() -> CGRect?)? + public let blockInteraction: Promise public init( context: AccountContext, @@ -109,5 +110,6 @@ public final class OpenChatMessageParams { self.gallerySource = gallerySource self.centralItemUpdated = centralItemUpdated self.getSourceRect = getSourceRect + self.blockInteraction = Promise() } } diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index 0ea471dc67..5e2b000949 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -1076,7 +1076,6 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private var customUnembedWhenPortrait: ((OverlayMediaItemNode) -> Bool)? - private var pictureInPictureContent: AnyObject? private var nativePictureInPictureContent: AnyObject? private var activePictureInPictureNavigationController: NavigationController? @@ -1544,10 +1543,6 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { strongSelf.videoNode?.setBaseRate(playbackRate) } } - - if strongSelf.nativePictureInPictureContent == nil { - strongSelf.setupNativePictureInPicture() - } } } self.videoNode = videoNode @@ -2963,19 +2958,29 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } @objc func pictureInPictureButtonPressed() { - if let currentPictureInPictureNode = self.context.sharedContext.mediaManager.currentPictureInPictureNode as? UniversalVideoGalleryItemNode, let currentItem = currentPictureInPictureNode.item, case let .message(currentMessage, _) = currentItem.contentInfo, case let .message(message, _) = self.item?.contentInfo, currentMessage.id == message.id { - if let controller = self.galleryController() as? GalleryController { - controller.dismiss(forceAway: true) - } - return + if self.nativePictureInPictureContent == nil { + self.setupNativePictureInPicture() } - if #available(iOS 15.0, *) { - if let nativePictureInPictureContent = self.nativePictureInPictureContent as? NativePictureInPictureContentImpl { - addAppLogEvent(postbox: self.context.account.postbox, type: "pip_btn", peerId: self.context.account.peerId) - nativePictureInPictureContent.beginPictureInPicture() + DispatchQueue.main.async { [weak self] in + guard let self else { return } + + if let currentPictureInPictureNode = self.context.sharedContext.mediaManager.currentPictureInPictureNode as? UniversalVideoGalleryItemNode, let currentItem = currentPictureInPictureNode.item, case let .message(currentMessage, _) = currentItem.contentInfo, case let .message(message, _) = self.item?.contentInfo, currentMessage.id == message.id { + if let controller = self.galleryController() as? GalleryController { + controller.dismiss(forceAway: true) + } + return + } + + if #available(iOS 15.0, *) { + if let nativePictureInPictureContent = self.nativePictureInPictureContent as? NativePictureInPictureContentImpl { + addAppLogEvent(postbox: self.context.account.postbox, type: "pip_btn", peerId: self.context.account.peerId) + nativePictureInPictureContent.beginPictureInPicture() + return + } + } } } diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageMediaBubbleContentNode/Sources/ChatMessageMediaBubbleContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageMediaBubbleContentNode/Sources/ChatMessageMediaBubbleContentNode.swift index 6450e44497..49392be769 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageMediaBubbleContentNode/Sources/ChatMessageMediaBubbleContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageMediaBubbleContentNode/Sources/ChatMessageMediaBubbleContentNode.swift @@ -58,7 +58,10 @@ public class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode { openChatMessageMode = .automaticPlayback } - let _ = item.controllerInteraction.openMessage(item.message, OpenMessageParams(mode: openChatMessageMode, mediaIndex: self.mediaIndex, progress: self.itemNode?.makeProgress())) + if !item.controllerInteraction.isOpeningMedia { + let params = OpenMessageParams(mode: openChatMessageMode, mediaIndex: self.mediaIndex, progress: self.itemNode?.makeProgress()) + let _ = item.controllerInteraction.openMessage(item.message, params) + } } self.interactiveImageNode.activateAgeRestrictedMedia = { [weak self] in diff --git a/submodules/TelegramUI/Components/ChatControllerInteraction/Sources/ChatControllerInteraction.swift b/submodules/TelegramUI/Components/ChatControllerInteraction/Sources/ChatControllerInteraction.swift index 93368bc6e6..b34776baba 100644 --- a/submodules/TelegramUI/Components/ChatControllerInteraction/Sources/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/Components/ChatControllerInteraction/Sources/ChatControllerInteraction.swift @@ -303,6 +303,29 @@ public final class ChatControllerInteraction: ChatControllerInteractionProtocol public var chatIsRotated: Bool = true public var canReadHistory: Bool = false + private var isOpeningMediaValue: Bool = false + public var isOpeningMedia: Bool { + return self.isOpeningMediaValue + } + private var isOpeningMediaDisposable: Disposable? + public var isOpeningMediaSignal: Signal? { + didSet { + self.isOpeningMediaDisposable?.dispose() + self.isOpeningMediaDisposable = nil + self.isOpeningMediaValue = false + + if let isOpeningMediaSignal = self.isOpeningMediaSignal { + self.isOpeningMediaValue = true + self.isOpeningMediaDisposable = (isOpeningMediaSignal |> filter { !$0 } |> take(1) |> timeout(1.0, queue: .mainQueue(), alternate: .single(false)) |> deliverOnMainQueue).startStrict(next: { [weak self] _ in + guard let self else { + return + } + self.isOpeningMediaValue = false + }) + } + } + } + public init( openMessage: @escaping (Message, OpenMessageParams) -> Bool, openPeer: @escaping (EnginePeer, ChatControllerInteractionNavigateToPeer, MessageReference?, OpenPeerSource) -> Void, @@ -538,4 +561,8 @@ public final class ChatControllerInteraction: ChatControllerInteractionProtocol self.presentationContext = presentationContext } + + deinit { + self.isOpeningMediaDisposable?.dispose() + } } diff --git a/submodules/TelegramUI/Sources/OpenChatMessage.swift b/submodules/TelegramUI/Sources/OpenChatMessage.swift index e19daaeab9..ac593bd233 100644 --- a/submodules/TelegramUI/Sources/OpenChatMessage.swift +++ b/submodules/TelegramUI/Sources/OpenChatMessage.swift @@ -323,8 +323,12 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool { return true } + params.blockInteraction.set(.single(true)) + let _ = (gallery |> deliverOnMainQueue).startStandalone(next: { gallery in + params.blockInteraction.set(.single(false)) + gallery.centralItemUpdated = { messageId in params.centralItemUpdated?(messageId) }