From 2a55559f821ce6377c8a3320186d56423cb7b274 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 20 Mar 2026 15:46:56 +0100 Subject: [PATCH] Various fixes --- .../AccountContext/Sources/MediaManager.swift | 4 +-- .../Sources/FileMediaResourceStatus.swift | 22 +++++++++---- .../Sources/ListMessageFileItemNode.swift | 22 +++++++++++-- .../Sources/ListMessageItem.swift | 32 ++++++++++++++++--- .../Components/AttachmentFileController/BUILD | 1 + .../Sources/AttachmentFileController.swift | 28 ++++++++++++---- .../ChatMessageAttachedContentNode.swift | 2 +- .../ChatControllerOpenAttachmentMenu.swift | 4 +-- 8 files changed, 89 insertions(+), 26 deletions(-) diff --git a/submodules/AccountContext/Sources/MediaManager.swift b/submodules/AccountContext/Sources/MediaManager.swift index b2a0964af4..02cd0173d0 100644 --- a/submodules/AccountContext/Sources/MediaManager.swift +++ b/submodules/AccountContext/Sources/MediaManager.swift @@ -169,10 +169,10 @@ public func peerMessageMediaPlayerType(_ message: EngineMessage) -> MediaManager return nil } -public func peerMessagesMediaPlaylistAndItemId(_ message: EngineMessage, isRecentActions: Bool, isGlobalSearch: Bool, isDownloadList: Bool, isSavedMusic: Bool) -> (SharedMediaPlaylistId, SharedMediaPlaylistItemId)? { +public func peerMessagesMediaPlaylistAndItemId(_ message: EngineMessage, isRecentActions: Bool, isGlobalSearch: Bool, isDownloadList: Bool, isSavedMusic: Bool, isAttachMusic: Bool) -> (SharedMediaPlaylistId, SharedMediaPlaylistItemId)? { if isSavedMusic { return (PeerMessagesMediaPlaylistId.savedMusic(message.id.peerId), PeerMessagesMediaPlaylistItemId(messageId: message.id, messageIndex: message.index)) - } else if isGlobalSearch && !isDownloadList { + } else if isAttachMusic || (isGlobalSearch && !isDownloadList) { return (PeerMessagesMediaPlaylistId.custom, PeerMessagesMediaPlaylistItemId(messageId: message.id, messageIndex: message.index)) } else if isRecentActions && !isDownloadList { return (PeerMessagesMediaPlaylistId.recentActions(message.id.peerId), PeerMessagesMediaPlaylistItemId(messageId: message.id, messageIndex: message.index)) diff --git a/submodules/FileMediaResourceStatus/Sources/FileMediaResourceStatus.swift b/submodules/FileMediaResourceStatus/Sources/FileMediaResourceStatus.swift index a9e00836eb..1a1166b477 100644 --- a/submodules/FileMediaResourceStatus/Sources/FileMediaResourceStatus.swift +++ b/submodules/FileMediaResourceStatus/Sources/FileMediaResourceStatus.swift @@ -5,12 +5,12 @@ import SwiftSignalKit import UniversalMediaPlayer import AccountContext -private func internalMessageFileMediaPlaybackStatus(context: AccountContext, file: TelegramMediaFile, message: EngineMessage, isRecentActions: Bool, isGlobalSearch: Bool, isDownloadList: Bool, isSavedMusic: Bool) -> Signal { +private func internalMessageFileMediaPlaybackStatus(context: AccountContext, file: TelegramMediaFile, message: EngineMessage, isRecentActions: Bool, isGlobalSearch: Bool, isDownloadList: Bool, isSavedMusic: Bool, isAttachMusic: Bool) -> Signal { guard let playerType = peerMessageMediaPlayerType(message) else { return .single(nil) } - if let (playlistId, itemId) = peerMessagesMediaPlaylistAndItemId(message, isRecentActions: isRecentActions, isGlobalSearch: isGlobalSearch, isDownloadList: isDownloadList, isSavedMusic: isSavedMusic) { + if let (playlistId, itemId) = peerMessagesMediaPlaylistAndItemId(message, isRecentActions: isRecentActions, isGlobalSearch: isGlobalSearch, isDownloadList: isDownloadList, isSavedMusic: isSavedMusic, isAttachMusic: isAttachMusic) { return context.sharedContext.mediaManager.filteredPlaylistState(accountId: context.account.id, playlistId: playlistId, itemId: itemId, type: playerType) |> mapToSignal { state -> Signal in return .single(state?.status) @@ -26,7 +26,7 @@ public func messageFileMediaPlaybackStatus(context: AccountContext, file: Telegr duration = Double(value) } let defaultStatus = MediaPlayerStatus(generationTimestamp: 0.0, duration: duration, dimensions: CGSize(), timestamp: 0.0, baseRate: 1.0, seekId: 0, status: .paused, soundEnabled: true) - return internalMessageFileMediaPlaybackStatus(context: context, file: file, message: message, isRecentActions: isRecentActions, isGlobalSearch: isGlobalSearch, isDownloadList: isDownloadList, isSavedMusic: isSavedMusic) + return internalMessageFileMediaPlaybackStatus(context: context, file: file, message: message, isRecentActions: isRecentActions, isGlobalSearch: isGlobalSearch, isDownloadList: isDownloadList, isSavedMusic: isSavedMusic, isAttachMusic: false) |> map { status in return status ?? defaultStatus } @@ -37,15 +37,25 @@ public func messageFileMediaPlaybackAudioLevelEvents(context: AccountContext, fi return .never() } - if let (playlistId, itemId) = peerMessagesMediaPlaylistAndItemId(message, isRecentActions: isRecentActions, isGlobalSearch: isGlobalSearch, isDownloadList: isDownloadList, isSavedMusic: isSavedMusic) { + if let (playlistId, itemId) = peerMessagesMediaPlaylistAndItemId(message, isRecentActions: isRecentActions, isGlobalSearch: isGlobalSearch, isDownloadList: isDownloadList, isSavedMusic: isSavedMusic, isAttachMusic: false) { return context.sharedContext.mediaManager.filteredPlayerAudioLevelEvents(accountId: context.account.id, playlistId: playlistId, itemId: itemId, type: playerType) } else { return .never() } } -public func messageFileMediaResourceStatus(context: AccountContext, file: TelegramMediaFile, message: EngineMessage, isRecentActions: Bool, isSharedMedia: Bool = false, isGlobalSearch: Bool = false, isDownloadList: Bool = false, isSavedMusic: Bool = false) -> Signal { - let playbackStatus = internalMessageFileMediaPlaybackStatus(context: context, file: file, message: message, isRecentActions: isRecentActions, isGlobalSearch: isGlobalSearch, isDownloadList: isDownloadList, isSavedMusic: isSavedMusic) |> map { status -> MediaPlayerPlaybackStatus? in +public func messageFileMediaResourceStatus( + context: AccountContext, + file: TelegramMediaFile, + message: EngineMessage, + isRecentActions: Bool, + isSharedMedia: Bool = false, + isGlobalSearch: Bool = false, + isDownloadList: Bool = false, + isSavedMusic: Bool = false, + isAttachMusic: Bool = false +) -> Signal { + let playbackStatus = internalMessageFileMediaPlaybackStatus(context: context, file: file, message: message, isRecentActions: isRecentActions, isGlobalSearch: isGlobalSearch, isDownloadList: isDownloadList, isSavedMusic: isSavedMusic, isAttachMusic: isAttachMusic) |> map { status -> MediaPlayerPlaybackStatus? in return status?.status } diff --git a/submodules/ListMessageItem/Sources/ListMessageFileItemNode.swift b/submodules/ListMessageItem/Sources/ListMessageFileItemNode.swift index 3d45420937..ed761abcc4 100644 --- a/submodules/ListMessageItem/Sources/ListMessageFileItemNode.swift +++ b/submodules/ListMessageItem/Sources/ListMessageFileItemNode.swift @@ -367,6 +367,7 @@ public final class ListMessageFileItemNode: ListMessageNode { private let extensionIconText: TextNode public let iconImageNode: TransformImageNode private let iconStatusNode: SemanticStatusNode + private let iconButtonNode: HighlightTrackingButtonNode private let restrictionNode: ASDisplayNode @@ -480,6 +481,8 @@ public final class ListMessageFileItemNode: ListMessageNode { self.iconStatusNode = SemanticStatusNode(backgroundNodeColor: .clear, foregroundNodeColor: .white) self.iconStatusNode.isUserInteractionEnabled = false + self.iconButtonNode = HighlightTrackingButtonNode() + self.restrictionNode = ASDisplayNode() self.restrictionNode.isHidden = true @@ -499,6 +502,7 @@ public final class ListMessageFileItemNode: ListMessageNode { self.offsetContainerNode.addSubnode(self.extensionIconNode) self.offsetContainerNode.addSubnode(self.extensionIconText) self.offsetContainerNode.addSubnode(self.iconStatusNode) + self.offsetContainerNode.addSubnode(self.iconButtonNode) self.addSubnode(self.restrictionNode) self.addSubnode(self.separatorNode) @@ -535,6 +539,8 @@ public final class ListMessageFileItemNode: ListMessageNode { }) transition.updateAlpha(node: strongSelf.dateNode, alpha: isExtracted ? 0.0 : 1.0) } + + self.iconButtonNode.addTarget(self, action: #selector(self.iconButtonPressed), forControlEvents: .touchUpInside) } deinit { @@ -550,6 +556,13 @@ public final class ListMessageFileItemNode: ListMessageNode { self.item = item } + @objc private func iconButtonPressed() { + guard let item = self.item, let message = item.message else { + return + } + item.interaction.toggleMediaPlayback?(message) + } + override public func layoutForParams(_ params: ListViewItemLayoutParams, item: ListViewItem, previousItem: ListViewItem?, nextItem: ListViewItem?) { if let item = item as? ListMessageItem { let doLayout = self.asyncLayout() @@ -920,7 +933,7 @@ public final class ListMessageFileItemNode: ListMessageNode { if statusUpdated && item.displayFileInfo { if let file = selectedMedia as? TelegramMediaFile { - updatedStatusSignal = messageFileMediaResourceStatus(context: item.context, file: file, message: EngineMessage(message), isRecentActions: false, isSharedMedia: true, isGlobalSearch: item.isGlobalSearchResult, isDownloadList: item.isDownloadList, isSavedMusic: item.isSavedMusic) + updatedStatusSignal = messageFileMediaResourceStatus(context: item.context, file: file, message: EngineMessage(message), isRecentActions: false, isSharedMedia: true, isGlobalSearch: item.isGlobalSearchResult, isDownloadList: item.isDownloadList, isSavedMusic: item.isSavedMusic, isAttachMusic: item.isAttachMusic) |> mapToSignal { value -> Signal in if case .Fetching = value.fetchStatus, !item.isDownloadList { return .single(value) |> delay(0.1, queue: Queue.concurrentDefaultQueue()) @@ -1265,6 +1278,9 @@ public final class ListMessageFileItemNode: ListMessageNode { transition.updateFrame(node: strongSelf.iconStatusNode, frame: iconFrame) + strongSelf.iconButtonNode.isHidden = item.interaction.toggleMediaPlayback == nil + strongSelf.iconButtonNode.frame = iconFrame.insetBy(dx: -8.0, dy: -8.0) + let _ = extensionTextApply() strongSelf.currentIconImage = iconImage @@ -1331,7 +1347,7 @@ public final class ListMessageFileItemNode: ListMessageNode { } }))*/ } - + strongSelf.updateStatus(transition: transition) if item.message == nil { @@ -1505,7 +1521,7 @@ public final class ListMessageFileItemNode: ListMessageNode { var descriptionOffset: CGFloat = 0.0 var downloadingString: String? - if let resourceStatus = self.resourceStatus { + if let resourceStatus = self.resourceStatus, !item.isAttachMusic { var maybeFetchStatus: MediaResourceStatus = .Local switch resourceStatus { case .playbackStatus: diff --git a/submodules/ListMessageItem/Sources/ListMessageItem.swift b/submodules/ListMessageItem/Sources/ListMessageItem.swift index cd945b5dd1..1cdd52400d 100644 --- a/submodules/ListMessageItem/Sources/ListMessageItem.swift +++ b/submodules/ListMessageItem/Sources/ListMessageItem.swift @@ -14,7 +14,7 @@ public final class ListMessageItemInteraction { public let openMessage: (Message, ChatControllerInteractionOpenMessageMode) -> Bool public let openMessageContextMenu: (Message, Bool, ASDisplayNode, CGRect, UIGestureRecognizer?) -> Void public let toggleMessagesSelection: ([MessageId], Bool) -> Void - public let toggleMediaPlayback: ((MessageId) -> Void)? + public let toggleMediaPlayback: ((Message) -> Void)? let openUrl: (String, Bool, Bool?, Message?) -> Void let openInstantPage: (Message, ChatMessageItemAssociatedData?) -> Void let longTap: (ChatControllerInteractionLongTapAction, Message?) -> Void @@ -26,7 +26,7 @@ public final class ListMessageItemInteraction { public init( openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, UIGestureRecognizer?) -> Void, - toggleMediaPlayback: ((MessageId) -> Void)?, + toggleMediaPlayback: ((Message) -> Void)?, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, openUrl: @escaping (String, Bool, Bool?, Message?) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, @@ -70,6 +70,7 @@ public final class ListMessageItem: ListViewItem, ItemListItem { let isDownloadList: Bool let isSavedMusic: Bool let isStoryMusic: Bool + let isAttachMusic: Bool let displayFileInfo: Bool let displayBackground: Bool let canReorder: Bool @@ -81,7 +82,29 @@ public final class ListMessageItem: ListViewItem, ItemListItem { public let selectable: Bool = true - public init(presentationData: ChatPresentationData, systemStyle: ItemListSystemStyle = .legacy, context: AccountContext, chatLocation: ChatLocation, interaction: ListMessageItemInteraction, message: Message?, translateToLanguage: String? = nil, selection: ChatHistoryMessageSelection, displayHeader: Bool, customHeader: ListViewItemHeader? = nil, hintIsLink: Bool = false, isGlobalSearchResult: Bool = false, isDownloadList: Bool = false, isSavedMusic: Bool = false, isStoryMusic: Bool = false, displayFileInfo: Bool = true, displayBackground: Bool = false, canReorder: Bool = false, style: ItemListStyle = .plain, sectionId: ItemListSectionId = 0) { + public init( + presentationData: ChatPresentationData, + systemStyle: ItemListSystemStyle = .legacy, + context: AccountContext, + chatLocation: ChatLocation, + interaction: ListMessageItemInteraction, + message: Message?, + translateToLanguage: String? = nil, + selection: ChatHistoryMessageSelection, + displayHeader: Bool, + customHeader: ListViewItemHeader? = nil, + hintIsLink: Bool = false, + isGlobalSearchResult: Bool = false, + isDownloadList: Bool = false, + isSavedMusic: Bool = false, + isStoryMusic: Bool = false, + isAttachMusic: Bool = false, + displayFileInfo: Bool = true, + displayBackground: Bool = false, + canReorder: Bool = false, + style: ItemListStyle = .plain, + sectionId: ItemListSectionId = 0 + ) { self.presentationData = presentationData self.systemStyle = systemStyle self.context = context @@ -102,6 +125,7 @@ public final class ListMessageItem: ListViewItem, ItemListItem { self.isDownloadList = isDownloadList self.isSavedMusic = isSavedMusic self.isStoryMusic = isStoryMusic + self.isAttachMusic = isAttachMusic self.displayFileInfo = displayFileInfo self.displayBackground = displayBackground self.canReorder = canReorder @@ -224,7 +248,7 @@ public final class ListMessageItem: ListViewItem, ItemListItem { if case let .selectable(selected) = self.selection { self.interaction.toggleMessagesSelection([message.id], !selected) } else { - if !self.displayFileInfo { + if !self.displayFileInfo || self.isAttachMusic { let _ = self.interaction.openMessage(message, .default) } else { listView.forEachItemNode { itemNode in diff --git a/submodules/TelegramUI/Components/AttachmentFileController/BUILD b/submodules/TelegramUI/Components/AttachmentFileController/BUILD index d613660eb3..85197ff8d7 100644 --- a/submodules/TelegramUI/Components/AttachmentFileController/BUILD +++ b/submodules/TelegramUI/Components/AttachmentFileController/BUILD @@ -40,6 +40,7 @@ swift_library( "//submodules/TelegramUI/Components/GlassBackgroundComponent", "//submodules/TelegramUI/Components/SearchInputPanelComponent", "//submodules/TelegramUI/Components/EdgeEffect", + "//submodules/TelegramUI/Components/MediaManager/PeerMessagesMediaPlaylist", ], visibility = [ "//visibility:public", diff --git a/submodules/TelegramUI/Components/AttachmentFileController/Sources/AttachmentFileController.swift b/submodules/TelegramUI/Components/AttachmentFileController/Sources/AttachmentFileController.swift index df643b4bc2..9cfdd67955 100644 --- a/submodules/TelegramUI/Components/AttachmentFileController/Sources/AttachmentFileController.swift +++ b/submodules/TelegramUI/Components/AttachmentFileController/Sources/AttachmentFileController.swift @@ -19,6 +19,7 @@ import GlassBarButtonComponent import BundleIconComponent import EdgeEffect import SaveToCameraRoll +import PeerMessagesMediaPlaylist private final class AttachmentFileControllerArguments { let context: AccountContext @@ -29,8 +30,9 @@ private final class AttachmentFileControllerArguments { let expandSavedMusic: () -> Void let expandRecentMusic: () -> Void let send: (Message) -> Void + let toggleMediaPlayback: (Message) -> Void - init(context: AccountContext, isAudio: Bool, openGallery: @escaping () -> Void, openFiles: @escaping () -> Void, scanDocument: @escaping () -> Void, expandSavedMusic: @escaping () -> Void, expandRecentMusic: @escaping () -> Void, send: @escaping (Message) -> Void) { + init(context: AccountContext, isAudio: Bool, openGallery: @escaping () -> Void, openFiles: @escaping () -> Void, scanDocument: @escaping () -> Void, expandSavedMusic: @escaping () -> Void, expandRecentMusic: @escaping () -> Void, send: @escaping (Message) -> Void, toggleMediaPlayback: @escaping (Message) -> Void) { self.context = context self.isAudio = isAudio self.openGallery = openGallery @@ -39,6 +41,7 @@ private final class AttachmentFileControllerArguments { self.expandSavedMusic = expandSavedMusic self.expandRecentMusic = expandRecentMusic self.send = send + self.toggleMediaPlayback = toggleMediaPlayback } } @@ -223,11 +226,13 @@ private enum AttachmentFileEntry: ItemListNodeEntry { let interaction = ListMessageItemInteraction(openMessage: { message, _ in arguments.send(message) return false - }, openMessageContextMenu: { _, _, _, _, _ in }, toggleMediaPlayback: { _ in }, toggleMessagesSelection: { _, _ in }, openUrl: { _, _, _, _ in }, openInstantPage: { _, _ in }, longTap: { _, _ in }, getHiddenMedia: { return [:] }) + }, openMessageContextMenu: { _, _, _, _, _ in }, toggleMediaPlayback: { message in + arguments.toggleMediaPlayback(message) + }, toggleMessagesSelection: { _, _ in }, openUrl: { _, _, _, _ in }, openInstantPage: { _, _ in }, longTap: { _, _ in }, getHiddenMedia: { return [:] }) let dateTimeFormat = arguments.context.sharedContext.currentPresentationData.with({$0}).dateTimeFormat let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: presentationData.theme, wallpaper: .color(0)), fontSize: presentationData.fontSize, strings: presentationData.strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: .firstLast, disableAnimations: false, largeEmoji: false, chatBubbleCorners: PresentationChatBubbleCorners(mainRadius: 0, auxiliaryRadius: 0, mergeBubbleCorners: false)) - return ListMessageItem(presentationData: chatPresentationData, systemStyle: .glass, context: arguments.context, chatLocation: .peer(id: arguments.context.account.peerId), interaction: interaction, message: message, selection: .none, displayHeader: false, isDownloadList: arguments.isAudio, isStoryMusic: true, displayFileInfo: true, displayBackground: true, style: .blocks, sectionId: self.section) + return ListMessageItem(presentationData: chatPresentationData, systemStyle: .glass, context: arguments.context, chatLocation: .peer(id: arguments.context.account.peerId), interaction: interaction, message: message, selection: .none, displayHeader: false, isDownloadList: arguments.isAudio, isStoryMusic: true, isAttachMusic: true, displayFileInfo: true, displayBackground: true, style: .blocks, sectionId: self.section) case let .savedShowMore(theme, text): return ItemListPeerActionItem(presentationData: presentationData, systemStyle: .glass, icon: PresentationResourcesItemList.downArrowImage(theme), title: text, sectionId: self.section, editing: false, action: { arguments.expandSavedMusic() @@ -238,12 +243,14 @@ private enum AttachmentFileEntry: ItemListNodeEntry { let interaction = ListMessageItemInteraction(openMessage: { message, _ in arguments.send(message) return false - }, openMessageContextMenu: { _, _, _, _, _ in }, toggleMediaPlayback: { _ in }, toggleMessagesSelection: { _, _ in }, openUrl: { _, _, _, _ in }, openInstantPage: { _, _ in }, longTap: { _, _ in }, getHiddenMedia: { return [:] }) + }, openMessageContextMenu: { _, _, _, _, _ in }, toggleMediaPlayback: { message in + arguments.toggleMediaPlayback(message) + }, toggleMessagesSelection: { _, _ in }, openUrl: { _, _, _, _ in }, openInstantPage: { _, _ in }, longTap: { _, _ in }, getHiddenMedia: { return [:] }) let dateTimeFormat = arguments.context.sharedContext.currentPresentationData.with({$0}).dateTimeFormat let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: presentationData.theme, wallpaper: .color(0)), fontSize: presentationData.fontSize, strings: presentationData.strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: .firstLast, disableAnimations: false, largeEmoji: false, chatBubbleCorners: PresentationChatBubbleCorners(mainRadius: 0, auxiliaryRadius: 0, mergeBubbleCorners: false)) - return ListMessageItem(presentationData: chatPresentationData, systemStyle: .glass, context: arguments.context, chatLocation: .peer(id: PeerId(0)), interaction: interaction, message: message, selection: .none, displayHeader: false, isDownloadList: arguments.isAudio, isStoryMusic: true, displayFileInfo: true, displayBackground: true, style: .blocks, sectionId: self.section) + return ListMessageItem(presentationData: chatPresentationData, systemStyle: .glass, context: arguments.context, chatLocation: .peer(id: PeerId(0)), interaction: interaction, message: message, selection: .none, displayHeader: false, isDownloadList: arguments.isAudio, isStoryMusic: true, isAttachMusic: true, displayFileInfo: true, displayBackground: true, style: .blocks, sectionId: self.section) case let .recentShowMore(theme, text): return ItemListPeerActionItem(presentationData: presentationData, systemStyle: .glass, icon: PresentationResourcesItemList.downArrowImage(theme), title: text, sectionId: self.section, editing: false, action: { arguments.expandRecentMusic() @@ -254,12 +261,14 @@ private enum AttachmentFileEntry: ItemListNodeEntry { let interaction = ListMessageItemInteraction(openMessage: { message, _ in arguments.send(message) return false - }, openMessageContextMenu: { _, _, _, _, _ in }, toggleMediaPlayback: { _ in }, toggleMessagesSelection: { _, _ in }, openUrl: { _, _, _, _ in }, openInstantPage: { _, _ in }, longTap: { _, _ in }, getHiddenMedia: { return [:] }) + }, openMessageContextMenu: { _, _, _, _, _ in }, toggleMediaPlayback: { message in + arguments.toggleMediaPlayback(message) + }, toggleMessagesSelection: { _, _ in }, openUrl: { _, _, _, _ in }, openInstantPage: { _, _ in }, longTap: { _, _ in }, getHiddenMedia: { return [:] }) let dateTimeFormat = arguments.context.sharedContext.currentPresentationData.with({$0}).dateTimeFormat let chatPresentationData = ChatPresentationData(theme: ChatPresentationThemeData(theme: presentationData.theme, wallpaper: .color(0)), fontSize: presentationData.fontSize, strings: presentationData.strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: .firstLast, disableAnimations: false, largeEmoji: false, chatBubbleCorners: PresentationChatBubbleCorners(mainRadius: 0, auxiliaryRadius: 0, mergeBubbleCorners: false)) - return ListMessageItem(presentationData: chatPresentationData, systemStyle: .glass, context: arguments.context, chatLocation: .peer(id: PeerId(0)), interaction: interaction, message: message, selection: .none, displayHeader: false, isDownloadList: arguments.isAudio, isStoryMusic: true, displayFileInfo: true, displayBackground: true, style: .blocks, sectionId: self.section) + return ListMessageItem(presentationData: chatPresentationData, systemStyle: .glass, context: arguments.context, chatLocation: .peer(id: PeerId(0)), interaction: interaction, message: message, selection: .none, displayHeader: false, isDownloadList: arguments.isAudio, isStoryMusic: true, isAttachMusic: true, displayFileInfo: true, displayBackground: true, style: .blocks, sectionId: self.section) case let .globalShowMore(theme, text): return ItemListPeerActionItem(presentationData: presentationData, systemStyle: .glass, icon: PresentationResourcesItemList.downArrowImage(theme), title: text, sectionId: self.section, editing: false, action: { @@ -490,6 +499,7 @@ public func makeAttachmentFileControllerImpl( if message.id.namespace == Namespaces.Message.Local { if let file = message.media.first(where: { $0 is TelegramMediaFile }) as? TelegramMediaFile { send(.standalone(media: file)) + dismissImpl?() } } else { let _ = (context.engine.messages.getMessagesLoadIfNecessary([message.id], strategy: .cloud(skipLocal: true)) @@ -509,6 +519,10 @@ public func makeAttachmentFileControllerImpl( dismissImpl?() }) } + }, + toggleMediaPlayback: { message in + let playlistLocation: PeerMessagesPlaylistLocation = .custom(messages: .single(([message], 0, false)), canReorder: false, at: message.id, loadMore: nil) + context.sharedContext.mediaManager.setPlaylist((context, PeerMessagesMediaPlaylist(context: context, location: playlistLocation, chatLocationContextHolder: nil)), type: .music, control: .playback(.togglePlayPause)) } ) diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift index 7002a5595d..b7105892d9 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift @@ -1241,7 +1241,7 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode { } } - if "".isEmpty { + if let _ = message.media.first(where: { $0 is TelegramMediaPoll }) { let closeButton: ComponentView if let current = self.closeButton { closeButton = current diff --git a/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift b/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift index 93dc8aa1c0..ea763248aa 100644 --- a/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift +++ b/submodules/TelegramUI/Sources/ChatControllerOpenAttachmentMenu.swift @@ -403,9 +403,7 @@ extension ChatControllerImpl { controller.prepareForReuse() return true } - let controller = strongSelf.context.sharedContext.makeAttachmentFileController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, audio: true, bannedSendMedia: bannedSendFiles, presentGallery: { [weak self, weak attachmentController] in - attachmentController?.dismiss(animated: true) - self?.presentFileGallery() + let controller = strongSelf.context.sharedContext.makeAttachmentFileController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, audio: true, bannedSendMedia: bannedSendFiles, presentGallery: { }, presentFiles: { [weak self, weak attachmentController] in attachmentController?.dismiss(animated: true) self?.presentICloudFileGallery()