From 9e7c9abceb7f324e5457a30bbdc2379cbd5d93dd Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 16 Feb 2021 17:31:11 +0400 Subject: [PATCH] Dismiss gallery when currently displayed entry becomes deleted --- .../GalleryUI/Sources/GalleryController.swift | 42 ++++++++++++++----- .../Items/UniversalVideoGalleryItem.swift | 22 +++++++++- .../Sources/OverlayUniversalVideoNode.swift | 14 ++++++- 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/submodules/GalleryUI/Sources/GalleryController.swift b/submodules/GalleryUI/Sources/GalleryController.swift index 9f07705918..ab2d04e0f5 100644 --- a/submodules/GalleryUI/Sources/GalleryController.swift +++ b/submodules/GalleryUI/Sources/GalleryController.swift @@ -463,7 +463,6 @@ public class GalleryController: ViewController, StandalonePresentableController } } } - |> take(1) let semaphore: DispatchSemaphore? if synchronousLoad { @@ -487,6 +486,23 @@ public class GalleryController: ViewController, StandalonePresentableController strongSelf.configuration = configuration let entries = view.entries + + if let centralEntryStableId = strongSelf.centralEntryStableId { + var found = false + for i in 0 ..< entries.count { + let message = entries[i].message + if message.stableId == centralEntryStableId { + found = true + break + } + } + + if !found { + strongSelf.dismiss(forceAway: true) + return + } + } + var centralEntryStableId: UInt32? loop: for i in 0 ..< entries.count { let message = entries[i].message @@ -515,14 +531,16 @@ public class GalleryController: ViewController, StandalonePresentableController strongSelf.entries = entries.reversed() strongSelf.hasLeftEntries = view.hasLater strongSelf.hasRightEntries = view.hasEarlier - if let centralEntryStableId = centralEntryStableId { + if strongSelf.centralEntryStableId == nil, let centralEntryStableId = centralEntryStableId { strongSelf.centralEntryStableId = centralEntryStableId } } else { strongSelf.entries = entries strongSelf.hasLeftEntries = view.hasEarlier strongSelf.hasRightEntries = view.hasLater - strongSelf.centralEntryStableId = centralEntryStableId + if strongSelf.centralEntryStableId == nil { + strongSelf.centralEntryStableId = centralEntryStableId + } } if strongSelf.isViewLoaded { var items: [GalleryItem] = [] @@ -547,13 +565,17 @@ public class GalleryController: ViewController, StandalonePresentableController strongSelf.galleryNode.pager.replaceItems(items, centralItemIndex: centralItemIndex) if strongSelf.temporaryDoNotWaitForReady { - strongSelf.didSetReady = true - strongSelf._ready.set(.single(true)) - } else { - let ready = strongSelf.galleryNode.pager.ready() |> timeout(2.0, queue: Queue.mainQueue(), alternate: .single(Void())) |> afterNext { [weak strongSelf] _ in - strongSelf?.didSetReady = true + if !strongSelf.didSetReady { + strongSelf.didSetReady = true + strongSelf._ready.set(.single(true)) + } + } else { + if !strongSelf.didSetReady { + let ready = strongSelf.galleryNode.pager.ready() |> timeout(2.0, queue: Queue.mainQueue(), alternate: .single(Void())) |> afterNext { [weak strongSelf] _ in + strongSelf?.didSetReady = true + } + strongSelf._ready.set(ready |> map { true }) } - strongSelf._ready.set(ready |> map { true }) } } } @@ -568,7 +590,7 @@ public class GalleryController: ViewController, StandalonePresentableController return (true, nil) } semaphore?.signal() - if process { + if process || true { Queue.mainQueue().async { f() } diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index 310b5bcb7f..ecd6cbea61 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -1482,7 +1482,27 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { let baseNavigationController = self.baseNavigationController() let mediaManager = self.context.sharedContext.mediaManager var expandImpl: (() -> Void)? - let overlayNode = OverlayUniversalVideoNode(postbox: self.context.account.postbox, audioSession: context.sharedContext.mediaManager.audioSession, manager: context.sharedContext.mediaManager.universalVideoManager, content: item.content, expand: { + + let shouldBeDismissed: Signal + if let contentInfo = item.contentInfo, case let .message(message) = contentInfo { + let viewKey = PostboxViewKey.messages(Set([message.id])) + shouldBeDismissed = context.account.postbox.combinedView(keys: [viewKey]) + |> map { views -> Bool in + guard let view = views.views[viewKey] as? MessagesView else { + return false + } + if view.messages.isEmpty { + return true + } else { + return false + } + } + |> distinctUntilChanged + } else { + shouldBeDismissed = .single(false) + } + + let overlayNode = OverlayUniversalVideoNode(postbox: self.context.account.postbox, audioSession: context.sharedContext.mediaManager.audioSession, manager: context.sharedContext.mediaManager.universalVideoManager, content: item.content, shouldBeDismissed: shouldBeDismissed, expand: { expandImpl?() }, close: { [weak mediaManager] in mediaManager?.setOverlayVideoNode(nil) diff --git a/submodules/TelegramUniversalVideoContent/Sources/OverlayUniversalVideoNode.swift b/submodules/TelegramUniversalVideoContent/Sources/OverlayUniversalVideoNode.swift index 2068dadf88..da44ebe879 100644 --- a/submodules/TelegramUniversalVideoContent/Sources/OverlayUniversalVideoNode.swift +++ b/submodules/TelegramUniversalVideoContent/Sources/OverlayUniversalVideoNode.swift @@ -16,6 +16,8 @@ public final class OverlayUniversalVideoNode: OverlayMediaItemNode { private var validLayoutSize: CGSize? + private var shouldBeDismissedDisposable: Disposable? + override public var group: OverlayMediaItemNodeGroup? { return OverlayMediaItemNodeGroup(rawValue: 0) } @@ -35,7 +37,7 @@ public final class OverlayUniversalVideoNode: OverlayMediaItemNode { public var customClose: (() -> Void)? public var controlsAreShowingUpdated: ((Bool) -> Void)? - public init(postbox: Postbox, audioSession: ManagedAudioSession, manager: UniversalVideoManager, content: UniversalVideoContent, expand: @escaping () -> Void, close: @escaping () -> Void) { + public init(postbox: Postbox, audioSession: ManagedAudioSession, manager: UniversalVideoManager, content: UniversalVideoContent, shouldBeDismissed: Signal = .single(false), expand: @escaping () -> Void, close: @escaping () -> Void) { self.content = content self.defaultExpand = expand @@ -112,6 +114,16 @@ public final class OverlayUniversalVideoNode: OverlayMediaItemNode { } self.videoNode.canAttachContent = true + + self.shouldBeDismissedDisposable = (shouldBeDismissed + |> filter { $0 } + |> deliverOnMainQueue).start(next: { [weak self] _ in + guard let strongSelf = self else { + return + } + strongSelf.dismiss() + closeImpl?() + }) } override public func didLoad() {