Various improvements

This commit is contained in:
Ilya Laktyushin 2025-06-19 15:17:38 +02:00
parent 546f6ca7c2
commit 2f440b5453
5 changed files with 51 additions and 17 deletions

View File

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

View File

@ -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<Bool>(true, ignoreRepeated: true)
private let isShowingContextMenuPromise = ValuePromise<Bool>(false, ignoreRepeated: true)
private let isShowingSettingsMenuPromise = ValuePromise<Bool>(false, ignoreRepeated: true)
private let isShowingAdMenuPromise = ValuePromise<Bool>(false, ignoreRepeated: true)
private let hasExpandedCaptionPromise = Promise<Bool>()
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<Void, NoError> = 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<Void, NoError> in
if isShowingContextMenu || isShowingSettingsMenu || hasExpandedCaptionPromise {
let shouldHideControlsSignal: Signal<Void, NoError> = 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<Void, NoError> 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)
}
})
}

View File

@ -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: {},

View File

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

View File

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