diff --git a/submodules/GalleryUI/Sources/GalleryControllerNode.swift b/submodules/GalleryUI/Sources/GalleryControllerNode.swift index eb0a2ca33d..1c8cf7ec67 100644 --- a/submodules/GalleryUI/Sources/GalleryControllerNode.swift +++ b/submodules/GalleryUI/Sources/GalleryControllerNode.swift @@ -276,6 +276,8 @@ open class GalleryControllerNode: ASDisplayNode, ASScrollViewDelegate, ASGesture if #available(iOSApplicationExtension 11.0, iOS 11.0, *), !self.isLayerBacked { self.view.accessibilityIgnoresInvertColors = true } + + self.view.disablesInteractiveTransitionGestureRecognizer = true } open func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index 58f0aca788..0b508d2344 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -262,7 +262,7 @@ private final class UniversalVideoGalleryItemOverlayNode: GalleryOverlayContentN if !state.messages.isEmpty { self.adState = (state.startDelay, state.betweenDelay, state.messages) - var startTime = Int32(CFAbsoluteTimeGetCurrent()) // + (state.startDelay ?? 0) + var startTime = Int32(CFAbsoluteTimeGetCurrent()) + (state.startDelay ?? 0) var program: [(Int32, Message?)] = [] var maxDisplayDuration: Int32 = 30 for message in state.messages { @@ -1161,7 +1161,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private let moreButtonStateDisposable = MetaDisposable() private let settingsButtonStateDisposable = MetaDisposable() private let mediaPlaybackStateDisposable = MetaDisposable() - + private let fetchDisposable = MetaDisposable() private var fetchStatus: MediaResourceStatus? private var fetchControls: FetchControls? @@ -1176,6 +1176,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private let controlsVisiblePromise = ValuePromise(true, ignoreRepeated: true) private let isShowingContextMenuPromise = ValuePromise(false, ignoreRepeated: true) private let isShowingSettingsMenuPromise = ValuePromise(false, ignoreRepeated: true) + private let isShowingAdMenuPromise = ValuePromise(false, ignoreRepeated: true) private let hasExpandedCaptionPromise = Promise() private var hideControlsDisposable: Disposable? private var automaticPictureInPictureDisposable: Disposable? @@ -1369,9 +1370,9 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { self.titleContentView = GalleryTitleView(frame: CGRect()) self._titleView.set(.single(self.titleContentView)) - let shouldHideControlsSignal: Signal = combineLatest(self.isPlayingPromise.get(), self.isInteractingPromise.get(), self.controlsVisiblePromise.get(), self.isShowingContextMenuPromise.get(), self.isShowingSettingsMenuPromise.get(), self.hasExpandedCaptionPromise.get()) - |> mapToSignal { isPlaying, isInteracting, controlsVisible, isShowingContextMenu, isShowingSettingsMenu, hasExpandedCaptionPromise -> Signal in - if isShowingContextMenu || isShowingSettingsMenu || hasExpandedCaptionPromise { + let shouldHideControlsSignal: Signal = combineLatest(self.isPlayingPromise.get(), self.isInteractingPromise.get(), self.controlsVisiblePromise.get(), self.isShowingContextMenuPromise.get(), self.isShowingSettingsMenuPromise.get(), self.isShowingAdMenuPromise.get(), self.hasExpandedCaptionPromise.get()) + |> mapToSignal { isPlaying, isInteracting, controlsVisible, isShowingContextMenu, isShowingSettingsMenu, isShowingAdMenu, hasExpandedCaptionPromise -> Signal in + if isShowingContextMenu || isShowingSettingsMenu || isShowingAdMenu || hasExpandedCaptionPromise { return .complete() } if isPlaying && !isInteracting && controlsVisible { @@ -1822,7 +1823,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } self.settingsBarButton.setIsMenuOpen(isMenuOpen: isShowingSettingsMenu) })) - + self.statusDisposable.set((combineLatest(queue: .mainQueue(), videoNode.status, mediaFileStatus) |> deliverOnMainQueue).start(next: { [weak self] value, fetchStatus in if let strongSelf = self { @@ -1887,7 +1888,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { strongSelf.isPlayingPromise.set(false) strongSelf.isPlaying = false if strongSelf.isCentral == true { - if !item.isSecret { + if !item.isSecret && !strongSelf.playOnDismiss { strongSelf.updateControlsVisibility(true) } } @@ -2089,7 +2090,15 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { self.footerContentNode.setup(origin: item.originData, caption: item.caption, isAd: isAd) if let contentInfo = item.contentInfo, case let .message(message, _) = contentInfo { - self.overlayContentNode.performAction = item.performAction + self.overlayContentNode.performAction = { [weak self] action in + guard let self , let item = self.item else { + return + } + if case .url = action { + self.pictureInPictureButtonPressed() + } + item.performAction(action) + } self.overlayContentNode.presentPremiumDemo = { [weak self] in self?.presentPremiumDemo() } @@ -3214,11 +3223,12 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { self.moreBarButton.contextAction?(self.moreBarButton.containerNode, nil) } + private var playOnDismiss = false private func openMoreMenu(sourceNode: ContextReferenceContentNode, gesture: ContextGesture?, adMessage: Message?, isSettings: Bool, actionsOnTop: Bool = false) { guard let controller = self.baseNavigationController()?.topViewController as? ViewController else { return } - + var dismissImpl: (() -> Void)? let items: Signal<(items: [ContextMenuItem], topItems: [ContextMenuItem]), NoError> if let adMessage { @@ -3238,7 +3248,14 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { return ContextController.Items(id: AnyHashable(0), content: .list(items.items)) } }, gesture: gesture) - if isSettings { + + if let _ = adMessage { + if self.isPlaying { + self.playOnDismiss = true + self.videoNode?.pause() + } + self.isShowingAdMenuPromise.set(true) + } else if isSettings { self.isShowingSettingsMenuPromise.set(true) } else { self.isShowingContextMenuPromise.set(true) @@ -3249,10 +3266,19 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } contextController.dismissed = { [weak self] in Queue.mainQueue().after(isSettings ? 0.0 : 0.1, { - if isSettings { - self?.isShowingSettingsMenuPromise.set(false) + guard let self else { + return + } + if let _ = adMessage { + if self.playOnDismiss { + self.playOnDismiss = false + self.videoNode?.play() + } + self.isShowingAdMenuPromise.set(false) + } else if isSettings { + self.isShowingSettingsMenuPromise.set(false) } else { - self?.isShowingContextMenuPromise.set(false) + self.isShowingContextMenuPromise.set(false) } }) } diff --git a/submodules/GalleryUI/Sources/Items/VideoAdComponent.swift b/submodules/GalleryUI/Sources/Items/VideoAdComponent.swift index 2f23afe3a1..d563e9ae42 100644 --- a/submodules/GalleryUI/Sources/Items/VideoAdComponent.swift +++ b/submodules/GalleryUI/Sources/Items/VideoAdComponent.swift @@ -143,7 +143,7 @@ final class VideoAdComponent: Component { component: AnyComponent( MultilineTextComponent( text: .plain(NSAttributedString(string: component.message.text, font: Font.regular(14.0), textColor: .white)), - maximumNumberOfLines: 2 + maximumNumberOfLines: 0 ) ), environment: {}, diff --git a/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift b/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift index b75418379e..20488d4a14 100644 --- a/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift +++ b/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift @@ -111,12 +111,13 @@ extension ChatControllerImpl { availableButtons.append(.location) availableButtons.append(.contact) } + if canSendPolls { availableButtons.insert(.poll, at: max(0, availableButtons.count - 1)) } - availableButtons.append(.todo) - + availableButtons.insert(.todo, at: max(0, availableButtons.count - 1)) + let presentationData = self.presentationData var isScheduledMessages = false diff --git a/submodules/TelegramUI/Sources/OpenChatMessage.swift b/submodules/TelegramUI/Sources/OpenChatMessage.swift index 9973541700..60683621d9 100644 --- a/submodules/TelegramUI/Sources/OpenChatMessage.swift +++ b/submodules/TelegramUI/Sources/OpenChatMessage.swift @@ -328,6 +328,11 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool { params.blockInteraction.set(.single(true)) + var presentInCurrent = false + if let channel = params.message.peers[params.message.id.peerId] as? TelegramChannel, case .broadcast = channel.info { + presentInCurrent = true + } + let _ = (gallery |> deliverOnMainQueue).startStandalone(next: { gallery in params.blockInteraction.set(.single(false)) @@ -341,7 +346,7 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool { return GalleryTransitionArguments(transitionNode: selectedTransitionNode, addToTransitionSurface: params.addToTransitionSurface) } return nil - }), params.message.adAttribute != nil ? .current : .window(.root)) + }), presentInCurrent ? .current : .window(.root)) }) return true case let .secretGallery(gallery):