Prevent media gallery from opening multiple times

This commit is contained in:
Isaac 2025-02-28 14:52:13 +01:00
parent 99d210e364
commit 16768ffb10
5 changed files with 56 additions and 15 deletions

View File

@ -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<Bool>
public init(
context: AccountContext,
@ -109,5 +110,6 @@ public final class OpenChatMessageParams {
self.gallerySource = gallerySource
self.centralItemUpdated = centralItemUpdated
self.getSourceRect = getSourceRect
self.blockInteraction = Promise()
}
}

View File

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

View File

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

View File

@ -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<Bool, NoError>? {
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()
}
}

View File

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