Allow context menu for secret chats in search results

This commit is contained in:
Ilya Laktyushin 2021-02-04 17:41:40 +04:00
parent 33ad1f5cf5
commit ca993ccfa5
3 changed files with 82 additions and 15 deletions

View File

@ -848,13 +848,20 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
return return
} }
var subject: ChatControllerSubject? let contextContentSource: ContextContentSource
if case let .search(messageId) = source, let id = messageId { if peer.id.namespace == Namespaces.Peer.SecretChat, let node = node.subnodes?.first as? ContextExtractedContentContainingNode {
subject = .message(id: id, highlight: false) contextContentSource = .extracted(ChatListHeaderBarContextExtractedContentSource(controller: strongSelf, sourceNode: node, keepInPlace: false))
} else {
var subject: ChatControllerSubject?
if case let .search(messageId) = source, let id = messageId {
subject = .message(id: id, highlight: false)
}
let chatController = strongSelf.context.sharedContext.makeChatController(context: strongSelf.context, chatLocation: .peer(peer.id), subject: subject, botStart: nil, mode: .standard(previewing: true))
chatController.canReadHistory.set(false)
contextContentSource = .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: node, navigationController: strongSelf.navigationController as? NavigationController))
} }
let chatController = strongSelf.context.sharedContext.makeChatController(context: strongSelf.context, chatLocation: .peer(peer.id), subject: subject, botStart: nil, mode: .standard(previewing: true))
chatController.canReadHistory.set(false) let contextController = ContextController(account: strongSelf.context.account, presentationData: strongSelf.presentationData, source: contextContentSource, items: chatContextMenuItems(context: strongSelf.context, peerId: peer.id, promoInfo: nil, source: .search(source), chatListController: strongSelf, joined: false), reactionItems: [], gesture: gesture)
let contextController = ContextController(account: strongSelf.context.account, presentationData: strongSelf.presentationData, source: .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: node, navigationController: strongSelf.navigationController as? NavigationController)), items: chatContextMenuItems(context: strongSelf.context, peerId: peer.id, promoInfo: nil, source: .search(source), chatListController: strongSelf, joined: false), reactionItems: [], gesture: gesture)
strongSelf.presentInGlobalOverlay(contextController) strongSelf.presentInGlobalOverlay(contextController)
} }

View File

@ -206,7 +206,7 @@ private enum ChatListRecentEntry: Comparable, Identifiable {
} }
}, deletePeer: deletePeer, contextAction: peerContextAction.flatMap { peerContextAction in }, deletePeer: deletePeer, contextAction: peerContextAction.flatMap { peerContextAction in
return { node, gesture in return { node, gesture in
if let chatPeer = peer.peer.peers[peer.peer.peerId], chatPeer.id.namespace != Namespaces.Peer.SecretChat { if let chatPeer = peer.peer.peers[peer.peer.peerId] {
peerContextAction(chatPeer, .recentSearch, node, gesture) peerContextAction(chatPeer, .recentSearch, node, gesture)
} else { } else {
gesture?.cancel() gesture?.cancel()

View File

@ -310,7 +310,15 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
private let separatorNode: ASDisplayNode private let separatorNode: ASDisplayNode
private let highlightedBackgroundNode: ASDisplayNode private let highlightedBackgroundNode: ASDisplayNode
private let extractedBackgroundImageNode: ASImageNode
private let containerNode: ContextControllerSourceNode private let containerNode: ContextControllerSourceNode
private let contextSourceNode: ContextExtractedContentContainingNode
private var extractedRect: CGRect?
private var nonExtractedRect: CGRect?
private let offsetContainerNode: ASDisplayNode
private let avatarNode: AvatarNode private let avatarNode: AvatarNode
private let titleNode: TextNode private let titleNode: TextNode
@ -356,8 +364,15 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
self.highlightedBackgroundNode = ASDisplayNode() self.highlightedBackgroundNode = ASDisplayNode()
self.highlightedBackgroundNode.isLayerBacked = true self.highlightedBackgroundNode.isLayerBacked = true
self.extractedBackgroundImageNode = ASImageNode()
self.extractedBackgroundImageNode.displaysAsynchronously = false
self.extractedBackgroundImageNode.alpha = 0.0
self.contextSourceNode = ContextExtractedContentContainingNode()
self.containerNode = ContextControllerSourceNode() self.containerNode = ContextControllerSourceNode()
self.offsetContainerNode = ASDisplayNode()
self.avatarNode = AvatarNode(font: avatarFont) self.avatarNode = AvatarNode(font: avatarFont)
self.avatarNode.isLayerBacked = !smartInvertColorsEnabled() self.avatarNode.isLayerBacked = !smartInvertColorsEnabled()
@ -369,12 +384,20 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
self.isAccessibilityElement = true self.isAccessibilityElement = true
self.addSubnode(self.backgroundNode) self.addSubnode(self.backgroundNode)
self.addSubnode(self.topSeparatorNode) self.addSubnode(self.topSeparatorNode)
self.addSubnode(self.separatorNode) self.addSubnode(self.separatorNode)
self.containerNode.addSubnode(self.contextSourceNode)
self.containerNode.targetNodeForActivationProgress = self.contextSourceNode.contentNode
self.addSubnode(self.containerNode) self.addSubnode(self.containerNode)
self.containerNode.addSubnode(self.avatarNode)
self.containerNode.addSubnode(self.titleNode) self.contextSourceNode.contentNode.addSubnode(self.extractedBackgroundImageNode)
self.containerNode.addSubnode(self.statusNode) self.contextSourceNode.contentNode.addSubnode(self.offsetContainerNode)
self.offsetContainerNode.addSubnode(self.avatarNode)
self.offsetContainerNode.addSubnode(self.titleNode)
self.offsetContainerNode.addSubnode(self.statusNode)
self.peerPresenceManager = PeerPresenceStatusManager(update: { [weak self] in self.peerPresenceManager = PeerPresenceStatusManager(update: { [weak self] in
if let strongSelf = self, let layoutParams = strongSelf.layoutParams { if let strongSelf = self, let layoutParams = strongSelf.layoutParams {
@ -390,6 +413,28 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
} }
contextAction(strongSelf.containerNode, gesture) contextAction(strongSelf.containerNode, gesture)
} }
self.contextSourceNode.willUpdateIsExtractedToContextPreview = { [weak self] isExtracted, transition in
guard let strongSelf = self, let item = strongSelf.item else {
return
}
if isExtracted {
strongSelf.extractedBackgroundImageNode.image = generateStretchableFilledCircleImage(diameter: 28.0, color: item.presentationData.theme.list.plainBackgroundColor)
}
if let extractedRect = strongSelf.extractedRect, let nonExtractedRect = strongSelf.nonExtractedRect {
let rect = isExtracted ? extractedRect : nonExtractedRect
transition.updateFrame(node: strongSelf.extractedBackgroundImageNode, frame: rect)
}
transition.updateSublayerTransformOffset(layer: strongSelf.offsetContainerNode.layer, offset: CGPoint(x: isExtracted ? 12.0 : 0.0, y: 0.0))
transition.updateAlpha(node: strongSelf.extractedBackgroundImageNode, alpha: isExtracted ? 1.0 : 0.0, completion: { _ in
if !isExtracted {
self?.extractedBackgroundImageNode.image = nil
}
})
}
} }
override public func layoutForParams(_ params: ListViewItemLayoutParams, item: ListViewItem, previousItem: ListViewItem?, nextItem: ListViewItem?) { override public func layoutForParams(_ params: ListViewItemLayoutParams, item: ListViewItem, previousItem: ListViewItem?, nextItem: ListViewItem?) {
@ -741,8 +786,23 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
strongSelf.accessibilityValue = statusAttributedString?.string strongSelf.accessibilityValue = statusAttributedString?.string
strongSelf.containerNode.frame = CGRect(origin: CGPoint(), size: nodeLayout.contentSize) strongSelf.containerNode.frame = CGRect(origin: CGPoint(), size: nodeLayout.contentSize)
strongSelf.contextSourceNode.frame = CGRect(origin: CGPoint(), size: nodeLayout.contentSize)
strongSelf.offsetContainerNode.frame = CGRect(origin: CGPoint(), size: nodeLayout.contentSize)
strongSelf.contextSourceNode.contentNode.frame = CGRect(origin: CGPoint(), size: nodeLayout.contentSize)
strongSelf.containerNode.isGestureEnabled = item.contextAction != nil strongSelf.containerNode.isGestureEnabled = item.contextAction != nil
let nonExtractedRect = CGRect(origin: CGPoint(), size: CGSize(width: nodeLayout.contentSize.width - 16.0, height: nodeLayout.contentSize.height))
let extractedRect = CGRect(origin: CGPoint(), size: nodeLayout.contentSize).insetBy(dx: 16.0 + params.leftInset, dy: 0.0)
strongSelf.extractedRect = extractedRect
strongSelf.nonExtractedRect = nonExtractedRect
if strongSelf.contextSourceNode.isExtractedToContextPreview {
strongSelf.extractedBackgroundImageNode.frame = extractedRect
} else {
strongSelf.extractedBackgroundImageNode.frame = nonExtractedRect
}
strongSelf.contextSourceNode.contentRect = extractedRect
switch item.peer { switch item.peer {
case let .peer(peer, _): case let .peer(peer, _):
if let peer = peer { if let peer = peer {
@ -827,7 +887,7 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
verificationIconNode.displayWithoutProcessing = true verificationIconNode.displayWithoutProcessing = true
verificationIconNode.displaysAsynchronously = false verificationIconNode.displaysAsynchronously = false
strongSelf.verificationIconNode = verificationIconNode strongSelf.verificationIconNode = verificationIconNode
strongSelf.containerNode.addSubnode(verificationIconNode) strongSelf.offsetContainerNode.addSubnode(verificationIconNode)
} }
if let verificationIconNode = strongSelf.verificationIconNode { if let verificationIconNode = strongSelf.verificationIconNode {
verificationIconNode.image = verificationIconImage verificationIconNode.image = verificationIconImage
@ -846,7 +906,7 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
let actionButtonNode = HighlightableButtonNode() let actionButtonNode = HighlightableButtonNode()
actionButtonNode.isUserInteractionEnabled = action.action != nil actionButtonNode.isUserInteractionEnabled = action.action != nil
actionButtonNode.addTarget(strongSelf, action: #selector(strongSelf.actionButtonPressed(_:)), forControlEvents: .touchUpInside) actionButtonNode.addTarget(strongSelf, action: #selector(strongSelf.actionButtonPressed(_:)), forControlEvents: .touchUpInside)
strongSelf.containerNode.addSubnode(actionButtonNode) strongSelf.offsetContainerNode.addSubnode(actionButtonNode)
actionButtonNodes.append(actionButtonNode) actionButtonNodes.append(actionButtonNode)
} }
@ -877,7 +937,7 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
let arrowButtonNode = HighlightableButtonNode() let arrowButtonNode = HighlightableButtonNode()
arrowButtonNode.addTarget(self, action: #selector(strongSelf.arrowButtonPressed), forControlEvents: .touchUpInside) arrowButtonNode.addTarget(self, action: #selector(strongSelf.arrowButtonPressed), forControlEvents: .touchUpInside)
strongSelf.arrowButtonNode = arrowButtonNode strongSelf.arrowButtonNode = arrowButtonNode
strongSelf.containerNode.addSubnode(arrowButtonNode) strongSelf.offsetContainerNode.addSubnode(arrowButtonNode)
} }
if let arrowButtonNode = strongSelf.arrowButtonNode { if let arrowButtonNode = strongSelf.arrowButtonNode {
arrowButtonNode.setImage(arrowButtonImage, for: .normal) arrowButtonNode.setImage(arrowButtonImage, for: .normal)
@ -901,7 +961,7 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
badgeBackgroundNode.isLayerBacked = true badgeBackgroundNode.isLayerBacked = true
badgeBackgroundNode.displaysAsynchronously = false badgeBackgroundNode.displaysAsynchronously = false
badgeBackgroundNode.displayWithoutProcessing = true badgeBackgroundNode.displayWithoutProcessing = true
strongSelf.containerNode.addSubnode(badgeBackgroundNode) strongSelf.offsetContainerNode.addSubnode(badgeBackgroundNode)
strongSelf.badgeBackgroundNode = badgeBackgroundNode strongSelf.badgeBackgroundNode = badgeBackgroundNode
badgeTransition = .immediate badgeTransition = .immediate
} }
@ -920,7 +980,7 @@ public class ContactsPeerItemNode: ItemListRevealOptionsItemNode {
let badgeTextNode = badgeTextApply() let badgeTextNode = badgeTextApply()
if badgeTextNode !== strongSelf.badgeTextNode { if badgeTextNode !== strongSelf.badgeTextNode {
strongSelf.badgeTextNode?.removeFromSupernode() strongSelf.badgeTextNode?.removeFromSupernode()
strongSelf.containerNode.addSubnode(badgeTextNode) strongSelf.offsetContainerNode.addSubnode(badgeTextNode)
strongSelf.badgeTextNode = badgeTextNode strongSelf.badgeTextNode = badgeTextNode
} }