From e625323f11f8613a6a248280ebe1a76771a9d2cc Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sat, 22 Oct 2022 21:55:09 +0300 Subject: [PATCH] Various fixes --- .../Sources/ChatMessageBackground.swift | 2 + .../ChatMessageBubbleContentNode.swift | 5 +- .../Sources/ChatMessageBubbleItemNode.swift | 63 +++++++++++++++---- ...MessageInstantVideoBubbleContentNode.swift | 11 ++-- 4 files changed, 64 insertions(+), 17 deletions(-) diff --git a/submodules/ChatMessageBackground/Sources/ChatMessageBackground.swift b/submodules/ChatMessageBackground/Sources/ChatMessageBackground.swift index 4aa47030ad..37d8b8cab5 100644 --- a/submodules/ChatMessageBackground/Sources/ChatMessageBackground.swift +++ b/submodules/ChatMessageBackground/Sources/ChatMessageBackground.swift @@ -71,6 +71,8 @@ public class ChatMessageBackground: ASDisplayNode { private let outlineImageNode: ASImageNode private weak var backgroundNode: WallpaperBackgroundNode? + public var backgroundFrame: CGRect = .zero + public var hasImage: Bool { self.imageNode.image != nil } diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift index 52711efaf8..5f2a263ff3 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift @@ -27,6 +27,7 @@ struct ChatMessageBubbleContentProperties { let forceFullCorners: Bool let forceAlignment: ChatMessageBubbleContentAlignment let shareButtonOffset: CGPoint? + let hidesHeaders: Bool init( hidesSimpleAuthorHeader: Bool, @@ -34,7 +35,8 @@ struct ChatMessageBubbleContentProperties { hidesBackground: ChatMessageBubbleContentBackgroundHiding, forceFullCorners: Bool, forceAlignment: ChatMessageBubbleContentAlignment, - shareButtonOffset: CGPoint? = nil + shareButtonOffset: CGPoint? = nil, + hidesHeaders: Bool = false ) { self.hidesSimpleAuthorHeader = hidesSimpleAuthorHeader self.headerSpacing = headerSpacing @@ -42,6 +44,7 @@ struct ChatMessageBubbleContentProperties { self.forceFullCorners = forceFullCorners self.forceAlignment = forceAlignment self.shareButtonOffset = shareButtonOffset + self.hidesHeaders = hidesHeaders } } diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift index 69054d9893..c4dedd0ddf 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift @@ -1520,6 +1520,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode } } + var hidesHeaders = false var shareButtonOffset: CGPoint? var index = 0 for (message, _, attributes, bubbleAttributes, prepareLayout) in contentPropertiesAndPrepareLayouts { @@ -1579,6 +1580,9 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode if let offset = properties.shareButtonOffset { shareButtonOffset = offset } + if properties.hidesHeaders { + hidesHeaders = true + } contentPropertiesAndLayouts.append((unboundSize, properties, prepareContentPosition, bubbleAttributes, nodeLayout, needSeparateContainers && !bubbleAttributes.isAttachment ? message.stableId : nil, itemSelection)) @@ -1619,7 +1623,9 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode var currentCredibilityIcon: EmojiStatusComponent.Content? var initialDisplayHeader = true - if let backgroundHiding = backgroundHiding, case .always = backgroundHiding { + if hidesHeaders { + initialDisplayHeader = false + } else if let backgroundHiding = backgroundHiding, case .always = backgroundHiding { initialDisplayHeader = false } else { if inlineBotNameString == nil && (ignoreForward || firstMessage.forwardInfo == nil) && replyMessage == nil { @@ -2371,7 +2377,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode mosaicStatusOrigin: mosaicStatusOrigin, mosaicStatusSizeAndApply: mosaicStatusSizeAndApply, needsShareButton: needsShareButton, - shareButtonOffset: shareButtonOffset + shareButtonOffset: shareButtonOffset, + hidesHeaders: hidesHeaders ) }) } @@ -2416,7 +2423,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode mosaicStatusOrigin: CGPoint?, mosaicStatusSizeAndApply: (CGSize, (ListViewItemUpdateAnimation) -> ChatMessageDateAndStatusNode)?, needsShareButton: Bool, - shareButtonOffset: CGPoint? + shareButtonOffset: CGPoint?, + hidesHeaders: Bool ) -> Void { guard let strongSelf = selfReference.value else { return @@ -2472,6 +2480,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode strongSelf.backgroundType = backgroundType + strongSelf.backgroundNode.backgroundFrame = backgroundFrame + let isFailed = item.content.firstMessage.effectivelyFailed(timestamp: item.context.account.network.getApproximateRemoteTimestamp()) if isFailed { let deliveryFailedNode: ChatMessageDeliveryFailedNode @@ -2516,6 +2526,10 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode } strongSelf.clippingNode.addSubnode(nameNode) nameNode.frame = nameNodeFrame + + if animation.isAnimated { + nameNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } } else { animation.animator.updateFrame(layer: nameNode.layer, frame: nameNodeFrame, completion: nil) } @@ -2529,6 +2543,10 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode credibilityIconView.isUserInteractionEnabled = false strongSelf.credibilityIconView = credibilityIconView strongSelf.clippingNode.view.addSubview(credibilityIconView) + + if animation.isAnimated { + credibilityIconView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } } let credibilityIconComponent = EmojiStatusComponent( @@ -2563,6 +2581,10 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode } strongSelf.clippingNode.addSubnode(adminBadgeNode) adminBadgeNode.frame = adminBadgeFrame + + if animation.isAnimated { + adminBadgeNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } } else { //let previousAdminBadgeFrame = adminBadgeNode.frame animation.animator.updateFrame(layer: adminBadgeNode.layer, frame: adminBadgeFrame, completion: nil) @@ -2572,12 +2594,33 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode strongSelf.adminBadgeNode = nil } } else { - strongSelf.nameNode?.removeFromSupernode() - strongSelf.nameNode = nil - strongSelf.adminBadgeNode?.removeFromSupernode() - strongSelf.adminBadgeNode = nil - strongSelf.credibilityIconView?.removeFromSuperview() - strongSelf.credibilityIconView = nil + if animation.isAnimated { + if let nameNode = strongSelf.nameNode { + strongSelf.nameNode = nil + nameNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak nameNode] _ in + nameNode?.removeFromSupernode() + }) + } + if let adminBadgeNode = strongSelf.adminBadgeNode { + strongSelf.adminBadgeNode = nil + adminBadgeNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak adminBadgeNode] _ in + adminBadgeNode?.removeFromSupernode() + }) + } + if let credibilityIconView = strongSelf.credibilityIconView { + strongSelf.credibilityIconView = nil + credibilityIconView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak credibilityIconView] _ in + credibilityIconView?.removeFromSuperview() + }) + } + } else { + strongSelf.nameNode?.removeFromSupernode() + strongSelf.nameNode = nil + strongSelf.adminBadgeNode?.removeFromSupernode() + strongSelf.adminBadgeNode = nil + strongSelf.credibilityIconView?.removeFromSuperview() + strongSelf.credibilityIconView = nil + } } let beginAt = applyInfo.timestamp ?? CACurrentMediaTime() @@ -2896,10 +2939,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode let contentNode = strongSelf.contentNodes[contentNodeIndex] - var useContentOrigin = useContentOrigin if contentNode.disablesClipping { shouldClipOnTransitions = false - useContentOrigin = false } let contentNodeFrame = relativeFrame.offsetBy(dx: contentOrigin.x, dy: useContentOrigin ? contentOrigin.y : 0.0) diff --git a/submodules/TelegramUI/Sources/ChatMessageInstantVideoBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageInstantVideoBubbleContentNode.swift index ae0f691df5..621e7c2045 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInstantVideoBubbleContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInstantVideoBubbleContentNode.swift @@ -226,7 +226,7 @@ class ChatMessageInstantVideoBubbleContentNode: ChatMessageBubbleContentNode { let videoFrame = CGRect(origin: CGPoint(x: 1.0, y: 1.0), size: videoLayout.contentSize) - let contentProperties = ChatMessageBubbleContentProperties(hidesSimpleAuthorHeader: false, headerSpacing: 0.0, hidesBackground: .never, forceFullCorners: false, forceAlignment: .none, shareButtonOffset: isExpanded ? .zero : CGPoint(x: -16.0, y: -24.0)) + let contentProperties = ChatMessageBubbleContentProperties(hidesSimpleAuthorHeader: false, headerSpacing: 0.0, hidesBackground: .never, forceFullCorners: false, forceAlignment: .none, shareButtonOffset: isExpanded ? .zero : CGPoint(x: -16.0, y: -24.0), hidesHeaders: !isExpanded) let width = videoFrame.width + 2.0 @@ -282,16 +282,17 @@ class ChatMessageInstantVideoBubbleContentNode: ChatMessageBubbleContentNode { strongSelf.maskLayer.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: 640.0, height: 640.0)) strongSelf.backdropMaskLayer.frame = strongSelf.maskLayer.frame - + + let bubbleSize = strongSelf.bubbleBackgroundNode?.backgroundFrame.size ?? finalSize + let radius: CGFloat = displaySize.width / 2.0 let maskCornerRadius = isExpanded ? 1.0 : radius - let maskFrame = CGRect(origin: CGPoint(x: isExpanded ? 1.0 : (incoming ? 7.0 : 1.0), y: isExpanded ? 0.0 : 1.0), size: isExpanded ? finalSize : CGSize(width: radius * 2.0, height: radius * 2.0)) + let maskFrame = CGRect(origin: CGPoint(x: isExpanded ? 1.0 : (incoming ? 7.0 : 1.0), y: isExpanded ? 0.0 : 1.0), size: isExpanded ? bubbleSize : CGSize(width: radius * 2.0, height: radius * 2.0)) animation.animator.updateCornerRadius(layer: strongSelf.maskForeground, cornerRadius: maskCornerRadius, completion: nil) animation.animator.updateFrame(layer: strongSelf.maskForeground, frame: maskFrame, completion: nil) - let backdropMaskFrame = CGRect(origin: CGPoint(x: isExpanded ? (incoming ? 8.0 : 2.0) : (incoming ? 8.0 : 2.0), y: isExpanded ? 2.0 : 2.0), size: isExpanded ? CGSize(width: finalSize.width - 11.0, height: finalSize.height - 2.0) : CGSize(width: radius * 2.0, height: radius * 2.0)) + let backdropMaskFrame = CGRect(origin: CGPoint(x: isExpanded ? (incoming ? 8.0 : 2.0) : (incoming ? 8.0 : 2.0), y: isExpanded ? 2.0 : 2.0), size: isExpanded ? CGSize(width: bubbleSize.width - 8.0, height: bubbleSize.height - 3.0) : CGSize(width: radius * 2.0, height: radius * 2.0)) - let topLeftCornerRadius: CGFloat let topRightCornerRadius: CGFloat let bottomLeftCornerRadius: CGFloat