diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index d54c283bff..fba8b98fbd 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -11488,7 +11488,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if !strongSelf.traceVisibility() { return false } - + if strongSelf.currentContextController != nil { + return false + } if !isTopmostChatController(strongSelf) { return false } @@ -11593,14 +11595,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } let _ = (self.context.sharedContext.mediaManager.globalMediaPlayerState - |> filter { playlistStateAndType in - if let (_, state, _) = playlistStateAndType, case .state = state { - return true - } else { - return false - } - } - |> take(1)).startStandalone(next: { [weak self] playlistStateAndType in + |> take(1) + |> deliverOnMainQueue).startStandalone(next: { [weak self] playlistStateAndType in if let self, let (_, playbackState, _) = playlistStateAndType, case let .state(state) = playbackState { if let source = state.item.playbackData?.source, case let .telegramFile(_, _, isViewOnce) = source, isViewOnce { self.context.sharedContext.mediaManager.setPlaylist(nil, type: .voice, control: .playback(.pause)) diff --git a/submodules/TelegramUI/Sources/ChatMessageContextControllerContentSource.swift b/submodules/TelegramUI/Sources/ChatMessageContextControllerContentSource.swift index a1103af4b4..61fa9d1913 100644 --- a/submodules/TelegramUI/Sources/ChatMessageContextControllerContentSource.swift +++ b/submodules/TelegramUI/Sources/ChatMessageContextControllerContentSource.swift @@ -121,6 +121,8 @@ final class ChatViewOnceMessageContextExtractedContentSource: ContextExtractedCo private var messageNodeCopy: ChatMessageItemView? private weak var tooltipController: TooltipScreen? + private let idleTimerExtensionDisposable = MetaDisposable() + var shouldBeDismissed: Signal { return self.context.sharedContext.mediaManager.globalMediaPlayerState |> filter { playlistStateAndType in @@ -156,11 +158,17 @@ final class ChatViewOnceMessageContextExtractedContentSource: ContextExtractedCo self.present = present } + deinit { + self.idleTimerExtensionDisposable.dispose() + } + func takeView() -> ContextControllerTakeViewInfo? { guard let chatNode = self.chatNode, let backgroundNode = self.backgroundNode, let validLayout = chatNode.validLayout?.0 else { return nil } + self.idleTimerExtensionDisposable.set(self.context.sharedContext.applicationBindings.pushIdleTimerExtension()) + var result: ContextControllerTakeViewInfo? var sourceNode: ContextExtractedContentContainingNode? var sourceRect: CGRect = .zero @@ -309,6 +317,8 @@ final class ChatViewOnceMessageContextExtractedContentSource: ContextExtractedCo return nil } + self.idleTimerExtensionDisposable.set(nil) + if let tooltipController = self.tooltipController { tooltipController.dismiss() } diff --git a/submodules/TelegramUI/Sources/PeerMessagesMediaPlaylist.swift b/submodules/TelegramUI/Sources/PeerMessagesMediaPlaylist.swift index 89386c20b7..2dc30772ef 100644 --- a/submodules/TelegramUI/Sources/PeerMessagesMediaPlaylist.swift +++ b/submodules/TelegramUI/Sources/PeerMessagesMediaPlaylist.swift @@ -173,19 +173,27 @@ private func aroundMessagesFromMessages(_ messages: [Message], centralIndex: Mes } private func aroundMessagesFromView(view: MessageHistoryView, centralIndex: MessageIndex) -> [Message] { - guard let index = view.entries.firstIndex(where: { $0.index.id == centralIndex.id }) else { + let filteredEntries = view.entries.filter { entry in + if entry.message.minAutoremoveOrClearTimeout == viewOnceTimeout { + return false + } else { + return true + } + } + + guard let index = filteredEntries.firstIndex(where: { $0.index.id == centralIndex.id }) else { return [] } var result: [Message] = [] if index != 0 { for i in (0 ..< index).reversed() { - result.append(view.entries[i].message) + result.append(filteredEntries[i].message) break } } - if index != view.entries.count - 1 { - for i in index + 1 ..< view.entries.count { - result.append(view.entries[i].message) + if index != filteredEntries.count - 1 { + for i in index + 1 ..< filteredEntries.count { + result.append(filteredEntries[i].message) break } } @@ -234,7 +242,15 @@ private func navigatedMessageFromMessages(_ messages: [Message], anchorIndex: Me private func navigatedMessageFromView(_ view: MessageHistoryView, anchorIndex: MessageIndex, position: NavigatedMessageFromViewPosition, reversed: Bool) -> (message: Message, around: [Message], exact: Bool)? { var index = 0 - for entry in view.entries { + let filteredEntries = view.entries.filter { entry in + if entry.message.minAutoremoveOrClearTimeout == viewOnceTimeout { + return false + } else { + return true + } + } + + for entry in filteredEntries { if entry.index.id == anchorIndex.id { let currentGroupKey = entry.message.groupingKey @@ -243,63 +259,63 @@ private func navigatedMessageFromView(_ view: MessageHistoryView, anchorIndex: M return (entry.message, aroundMessagesFromView(view: view, centralIndex: entry.index), true) case .later: if !reversed, let currentGroupKey { - if index - 1 > 0, view.entries[index - 1].message.groupingKey == currentGroupKey { - let message = view.entries[index - 1].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index - 1].index), true) + if index - 1 > 0, filteredEntries[index - 1].message.groupingKey == currentGroupKey { + let message = filteredEntries[index - 1].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[index - 1].index), true) } else { - for i in index ..< view.entries.count { - if view.entries[i].message.groupingKey != currentGroupKey { - let message = view.entries[i].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i].index), true) + for i in index ..< filteredEntries.count { + if filteredEntries[i].message.groupingKey != currentGroupKey { + let message = filteredEntries[i].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[i].index), true) } } } - } else if index + 1 < view.entries.count { - let message = view.entries[index + 1].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index + 1].index), true) + } else if index + 1 < filteredEntries.count { + let message = filteredEntries[index + 1].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[index + 1].index), true) } else { return nil } case .earlier: if !reversed, let currentGroupKey { - if index + 1 < view.entries.count, view.entries[index + 1].message.groupingKey == currentGroupKey { - let message = view.entries[index + 1].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index + 1].index), true) + if index + 1 < filteredEntries.count, filteredEntries[index + 1].message.groupingKey == currentGroupKey { + let message = filteredEntries[index + 1].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[index + 1].index), true) } else { var nextGroupingKey: Int64? for i in (0 ..< index).reversed() { if let nextGroupingKey { - if view.entries[i].message.groupingKey != nextGroupingKey { - let message = view.entries[i + 1].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i + 1].index), true) + if filteredEntries[i].message.groupingKey != nextGroupingKey { + let message = filteredEntries[i + 1].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[i + 1].index), true) } else if i == 0 { - let message = view.entries[i].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i].index), true) + let message = filteredEntries[i].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[i].index), true) } - } else if view.entries[i].message.groupingKey != currentGroupKey { - if let groupingKey = view.entries[i].message.groupingKey { + } else if filteredEntries[i].message.groupingKey != currentGroupKey { + if let groupingKey = filteredEntries[i].message.groupingKey { nextGroupingKey = groupingKey } else { - let message = view.entries[i].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i].index), true) + let message = filteredEntries[i].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[i].index), true) } } } } } else if index != 0 { - let message = view.entries[index - 1].message + let message = filteredEntries[index - 1].message if !reversed, let nextGroupingKey = message.groupingKey { for i in (0 ..< index).reversed() { - if view.entries[i].message.groupingKey != nextGroupingKey { - let message = view.entries[i + 1].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i + 1].index), true) + if filteredEntries[i].message.groupingKey != nextGroupingKey { + let message = filteredEntries[i + 1].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[i + 1].index), true) } else if i == 0 { - let message = view.entries[i].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[i].index), true) + let message = filteredEntries[i].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[i].index), true) } } } - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[index - 1].index), true) + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[index - 1].index), true) } else { return nil } @@ -307,14 +323,14 @@ private func navigatedMessageFromView(_ view: MessageHistoryView, anchorIndex: M } index += 1 } - if !view.entries.isEmpty { + if !filteredEntries.isEmpty { switch position { case .later, .exact: - let message = view.entries[view.entries.count - 1].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[view.entries.count - 1].index), false) + let message = filteredEntries[filteredEntries.count - 1].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[filteredEntries.count - 1].index), false) case .earlier: - let message = view.entries[0].message - return (message, aroundMessagesFromView(view: view, centralIndex: view.entries[0].index), false) + let message = filteredEntries[0].message + return (message, aroundMessagesFromView(view: view, centralIndex: filteredEntries[0].index), false) } } else { return nil