Ads improvements

This commit is contained in:
Ilya Laktyushin 2024-10-24 22:22:29 +04:00
parent 025b7d56b0
commit 3eae06e717
2 changed files with 25 additions and 11 deletions

View File

@ -4278,6 +4278,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
adOpaqueId = adAttribute.opaqueId adOpaqueId = adAttribute.opaqueId
} }
} }
if adOpaqueId == nil, let panelMessage = self.chatDisplayNode.adPanelNode?.message, let adAttribute = panelMessage.adAttribute {
adOpaqueId = adAttribute.opaqueId
}
let _ = self.context.engine.accountData.updateAdMessagesEnabled(enabled: false).start() let _ = self.context.engine.accountData.updateAdMessagesEnabled(enabled: false).start()
if let adOpaqueId { if let adOpaqueId {
self.removeAd(opaqueId: adOpaqueId) self.removeAd(opaqueId: adOpaqueId)
@ -5541,7 +5544,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
adMessage adMessage
).startStrict(next: { [weak self] peerView, globalNotificationSettings, onlineMemberCount, hasScheduledMessages, peerReportNotice, pinnedCount, threadInfo, hasSearchTags, hasSavedChats, isPremiumRequiredForMessaging, managingBot, adMessage in ).startStrict(next: { [weak self] peerView, globalNotificationSettings, onlineMemberCount, hasScheduledMessages, peerReportNotice, pinnedCount, threadInfo, hasSearchTags, hasSavedChats, isPremiumRequiredForMessaging, managingBot, adMessage in
if let strongSelf = self { if let strongSelf = self {
if strongSelf.peerView === peerView && strongSelf.reportIrrelvantGeoNotice == peerReportNotice && strongSelf.hasScheduledMessages == hasScheduledMessages && strongSelf.threadInfo == threadInfo && strongSelf.presentationInterfaceState.hasSearchTags == hasSearchTags && strongSelf.presentationInterfaceState.hasSavedChats == hasSavedChats && strongSelf.presentationInterfaceState.isPremiumRequiredForMessaging == isPremiumRequiredForMessaging && managingBot == strongSelf.presentationInterfaceState.contactStatus?.managingBot { if strongSelf.peerView === peerView && strongSelf.reportIrrelvantGeoNotice == peerReportNotice && strongSelf.hasScheduledMessages == hasScheduledMessages && strongSelf.threadInfo == threadInfo && strongSelf.presentationInterfaceState.hasSearchTags == hasSearchTags && strongSelf.presentationInterfaceState.hasSavedChats == hasSavedChats && strongSelf.presentationInterfaceState.isPremiumRequiredForMessaging == isPremiumRequiredForMessaging && managingBot == strongSelf.presentationInterfaceState.contactStatus?.managingBot && adMessage?.id == strongSelf.presentationInterfaceState.adMessage?.id {
return return
} }
@ -5827,11 +5830,15 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
} }
var adMessage = adMessage var adMessage = adMessage
if let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer as? TelegramUser, peer.botInfo != nil { if let peer = peerView.peers[peerView.peerId] as? TelegramUser, peer.botInfo != nil {
} else { } else {
adMessage = nil adMessage = nil
} }
if strongSelf.presentationInterfaceState.adMessage?.id != adMessage?.id {
animated = true
}
strongSelf.updateChatPresentationInterfaceState(animated: animated, interactive: false, { strongSelf.updateChatPresentationInterfaceState(animated: animated, interactive: false, {
return $0.updatedPeer { _ in return $0.updatedPeer { _ in
return renderedPeer return renderedPeer

View File

@ -1432,21 +1432,32 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
var dismissedAdPanelNode: ChatAdPanelNode? var dismissedAdPanelNode: ChatAdPanelNode?
var adPanelHeight: CGFloat? var adPanelHeight: CGFloat?
if let _ = self.chatPresentationInterfaceState.adMessage { if let _ = self.chatPresentationInterfaceState.adMessage {
var animateAppearance = false
let adPanelNode: ChatAdPanelNode let adPanelNode: ChatAdPanelNode
if let current = self.adPanelNode { if let current = self.adPanelNode {
adPanelNode = current adPanelNode = current
} else { } else {
adPanelNode = ChatAdPanelNode(context: self.context, animationCache: self.controllerInteraction.presentationContext.animationCache, animationRenderer: self.controllerInteraction.presentationContext.animationRenderer) adPanelNode = ChatAdPanelNode(context: self.context, animationCache: self.controllerInteraction.presentationContext.animationCache, animationRenderer: self.controllerInteraction.presentationContext.animationRenderer)
adPanelNode.controllerInteraction = self.controllerInteraction adPanelNode.controllerInteraction = self.controllerInteraction
adPanelNode.clipsToBounds = true
animateAppearance = true
} }
if self.adPanelNode != adPanelNode { if self.adPanelNode != adPanelNode {
dismissedAdPanelNode = self.adPanelNode dismissedAdPanelNode = self.adPanelNode
self.adPanelNode = adPanelNode self.adPanelNode = adPanelNode
self.contentContainerNode.contentNode.addSubnode(adPanelNode) self.titleAccessoryPanelContainer.addSubnode(adPanelNode)
adPanelNode.clipsToBounds = true
} }
adPanelHeight = adPanelNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: transition, interfaceState: self.chatPresentationInterfaceState) let height = adPanelNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: transition, interfaceState: self.chatPresentationInterfaceState)
adPanelHeight = height
if transition.isAnimated && animateAppearance {
adPanelNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
adPanelNode.subnodeTransform = CATransform3DMakeTranslation(0.0, -height, 0.0)
transition.updateSublayerTransformOffset(layer: adPanelNode.layer, offset: CGPoint())
}
} else if let adPanelNode = self.adPanelNode { } else if let adPanelNode = self.adPanelNode {
dismissedAdPanelNode = adPanelNode dismissedAdPanelNode = adPanelNode
self.adPanelNode = nil self.adPanelNode = nil
@ -1759,7 +1770,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
var adPanelFrame: CGRect? var adPanelFrame: CGRect?
if let _ = self.adPanelNode, let panelHeight = adPanelHeight { if let _ = self.adPanelNode, let panelHeight = adPanelHeight {
adPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: insets.top), size: CGSize(width: layout.size.width, height: panelHeight)) adPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: extraNavigationBarHeight), size: CGSize(width: layout.size.width, height: panelHeight))
insets.top += panelHeight insets.top += panelHeight
extraNavigationBarHeight += panelHeight extraNavigationBarHeight += panelHeight
} }
@ -2212,12 +2223,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
} }
if let adPanelNode = self.adPanelNode, let adPanelFrame, !adPanelNode.frame.equalTo(adPanelFrame) { if let adPanelNode = self.adPanelNode, let adPanelFrame, !adPanelNode.frame.equalTo(adPanelFrame) {
if adPanelNode.frame.width.isZero { adPanelNode.frame = adPanelFrame
adPanelNode.frame = adPanelFrame
transition.animatePositionAdditive(node: adPanelNode, offset: CGPoint(x: 0.0, y: -adPanelFrame.height))
} else {
transition.updateFrame(node: adPanelNode, frame: adPanelFrame)
}
} }
if let secondaryInputPanelNode = self.secondaryInputPanelNode, let apparentSecondaryInputPanelFrame = apparentSecondaryInputPanelFrame, !secondaryInputPanelNode.frame.equalTo(apparentSecondaryInputPanelFrame) { if let secondaryInputPanelNode = self.secondaryInputPanelNode, let apparentSecondaryInputPanelFrame = apparentSecondaryInputPanelFrame, !secondaryInputPanelNode.frame.equalTo(apparentSecondaryInputPanelFrame) {
@ -2339,6 +2345,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
if let dismissedAdPanelNode { if let dismissedAdPanelNode {
var dismissedPanelFrame = dismissedAdPanelNode.frame var dismissedPanelFrame = dismissedAdPanelNode.frame
dismissedPanelFrame.origin.y = -dismissedPanelFrame.size.height dismissedPanelFrame.origin.y = -dismissedPanelFrame.size.height
transition.updateAlpha(node: dismissedAdPanelNode, alpha: 0.0)
transition.updateFrame(node: dismissedAdPanelNode, frame: dismissedPanelFrame, completion: { [weak dismissedAdPanelNode] _ in transition.updateFrame(node: dismissedAdPanelNode, frame: dismissedPanelFrame, completion: { [weak dismissedAdPanelNode] _ in
dismissedAdPanelNode?.removeFromSupernode() dismissedAdPanelNode?.removeFromSupernode()
}) })