Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios

This commit is contained in:
Ilya Laktyushin 2019-09-03 15:22:53 +03:00
commit 3c214cd206
4 changed files with 238 additions and 206 deletions

View File

@ -526,6 +526,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
} }
if let messages = strongSelf.chatDisplayNode.historyNode.messageGroupInCurrentHistoryView(message.id) { if let messages = strongSelf.chatDisplayNode.historyNode.messageGroupInCurrentHistoryView(message.id) {
(strongSelf.view.window as? WindowHost)?.cancelInteractiveKeyboardGestures() (strongSelf.view.window as? WindowHost)?.cancelInteractiveKeyboardGestures()
strongSelf.chatDisplayNode.cancelInteractiveKeyboardGestures()
var updatedMessages = messages var updatedMessages = messages
for i in 0 ..< updatedMessages.count { for i in 0 ..< updatedMessages.count {
if updatedMessages[i].id == message.id { if updatedMessages[i].id == message.id {
@ -562,7 +563,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if Namespaces.Message.allScheduled.contains(message.id.namespace) { if Namespaces.Message.allScheduled.contains(message.id.namespace) {
reactionItems = [] reactionItems = []
} }
let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: reactionItems, recognizer: recognizer) let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextExtractedContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: reactionItems, recognizer: recognizer)
strongSelf.currentContextController = controller strongSelf.currentContextController = controller
controller.reactionSelected = { [weak controller] value in controller.reactionSelected = { [weak controller] value in
guard let strongSelf = self, let message = updatedMessages.first else { guard let strongSelf = self, let message = updatedMessages.first else {
@ -1391,7 +1392,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
} }
}))) })))
let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: [], recognizer: nil) let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextExtractedContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: [], recognizer: nil)
strongSelf.currentContextController = controller strongSelf.currentContextController = controller
strongSelf.window?.presentInGlobalOverlay(controller) strongSelf.window?.presentInGlobalOverlay(controller)
}) })
@ -1431,7 +1432,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
f(.dismissWithoutContent) f(.dismissWithoutContent)
}))) })))
let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextControllerContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: [], recognizer: nil) let controller = ContextController(account: strongSelf.context.account, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, source: ChatMessageContextExtractedContentSource(chatNode: strongSelf.chatDisplayNode, message: message), items: actions, reactionItems: [], recognizer: nil)
strongSelf.currentContextController = controller strongSelf.currentContextController = controller
strongSelf.window?.presentInGlobalOverlay(controller) strongSelf.window?.presentInGlobalOverlay(controller)
}) })

View File

@ -190,6 +190,15 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
} }
return .waitForSingleTap return .waitForSingleTap
} }
recognizer.longTap = { [weak self] point, recognizer in
guard let strongSelf = self else {
return
}
//strongSelf.reactionRecognizer?.cancel()
if strongSelf.gestureRecognized(gesture: .longTap, location: point, recognizer: recognizer) {
recognizer.cancel()
}
}
self.view.addGestureRecognizer(recognizer) self.view.addGestureRecognizer(recognizer)
let replyRecognizer = ChatSwipeToReplyRecognizer(target: self, action: #selector(self.swipeToReplyGesture(_:))) let replyRecognizer = ChatSwipeToReplyRecognizer(target: self, action: #selector(self.swipeToReplyGesture(_:)))
@ -736,6 +745,14 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
switch recognizer.state { switch recognizer.state {
case .ended: case .ended:
if let (gesture, location) = recognizer.lastRecognizedGestureAndLocation { if let (gesture, location) = recognizer.lastRecognizedGestureAndLocation {
let _ = self.gestureRecognized(gesture: gesture, location: location, recognizer: nil)
}
default:
break
}
}
private func gestureRecognized(gesture: TapLongTapOrDoubleTapGesture, location: CGPoint, recognizer: TapLongTapOrDoubleTapGestureRecognizer?) -> Bool {
switch gesture { switch gesture {
case .tap: case .tap:
if let avatarNode = self.accessoryItemNode as? ChatMessageAvatarAccessoryItemNode, avatarNode.frame.contains(location) { if let avatarNode = self.accessoryItemNode as? ChatMessageAvatarAccessoryItemNode, avatarNode.frame.contains(location) {
@ -763,13 +780,13 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
if case .member = channel.participationStatus { if case .member = channel.participationStatus {
} else { } else {
item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_PrivateChannelTooltip, self, avatarNode.frame) item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_PrivateChannelTooltip, self, avatarNode.frame)
return return true
} }
} }
item.controllerInteraction.openPeer(openPeerId, navigate, item.message) item.controllerInteraction.openPeer(openPeerId, navigate, item.message)
} }
} }
return return true
} }
if let viaBotNode = self.viaBotNode, viaBotNode.frame.contains(location) { if let viaBotNode = self.viaBotNode, viaBotNode.frame.contains(location) {
@ -791,7 +808,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
return .text return .text
} }
} }
return return true
} }
} }
} }
@ -802,7 +819,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
for attribute in item.message.attributes { for attribute in item.message.attributes {
if let attribute = attribute as? ReplyMessageAttribute { if let attribute = attribute as? ReplyMessageAttribute {
item.controllerInteraction.navigateToMessage(item.message.id, attribute.messageId) item.controllerInteraction.navigateToMessage(item.message.id, attribute.messageId)
return return true
} }
} }
} }
@ -842,21 +859,19 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
}) })
} }
} }
return return true
} }
self.item?.controllerInteraction.clickThroughMessage() self.item?.controllerInteraction.clickThroughMessage()
case .longTap, .doubleTap: case .longTap, .doubleTap:
if let item = self.item, self.imageNode.frame.contains(location) { if let item = self.item, self.imageNode.frame.contains(location) {
item.controllerInteraction.openMessageContextMenu(item.message, false, self, self.imageNode.frame, nil) item.controllerInteraction.openMessageContextMenu(item.message, false, self, self.imageNode.frame, nil)
return false
} }
case .hold: case .hold:
break break
} }
} return true
default:
break
}
} }
@objc func shareButtonPressed() { @objc func shareButtonPressed() {

View File

@ -832,7 +832,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
} }
strongSelf.fetchDisposable.set(visibilityAwareFetchSignal.start()) strongSelf.fetchDisposable.set(visibilityAwareFetchSignal.start())
} }
} else if case .prefetch = automaticDownload, message.id.namespace != Namespaces.Message.SecretIncoming { } else if case .prefetch = automaticDownload, message.id.namespace != Namespaces.Message.SecretIncoming && message.id.namespace != Namespaces.Message.Local {
if let file = media as? TelegramMediaFile { if let file = media as? TelegramMediaFile {
let fetchSignal = preloadVideoResource(postbox: context.account.postbox, resourceReference: AnyMediaReference.message(message: MessageReference(message), media: file).resourceReference(file.resource), duration: 4.0) let fetchSignal = preloadVideoResource(postbox: context.account.postbox, resourceReference: AnyMediaReference.message(message: MessageReference(message), media: file).resourceReference(file.resource), duration: 4.0)
let visibilityAwareFetchSignal = strongSelf.visibilityPromise.get() let visibilityAwareFetchSignal = strongSelf.visibilityPromise.get()

View File

@ -80,6 +80,15 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
} }
return .waitForSingleTap return .waitForSingleTap
} }
recognizer.longTap = { [weak self] point, recognizer in
guard let strongSelf = self else {
return
}
//strongSelf.reactionRecognizer?.cancel()
if strongSelf.gestureRecognized(gesture: .longTap, location: point, recognizer: recognizer) {
recognizer.cancel()
}
}
self.view.addGestureRecognizer(recognizer) self.view.addGestureRecognizer(recognizer)
let replyRecognizer = ChatSwipeToReplyRecognizer(target: self, action: #selector(self.swipeToReplyGesture(_:))) let replyRecognizer = ChatSwipeToReplyRecognizer(target: self, action: #selector(self.swipeToReplyGesture(_:)))
@ -579,6 +588,14 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
switch recognizer.state { switch recognizer.state {
case .ended: case .ended:
if let (gesture, location) = recognizer.lastRecognizedGestureAndLocation { if let (gesture, location) = recognizer.lastRecognizedGestureAndLocation {
let _ = self.gestureRecognized(gesture: gesture, location: location, recognizer: nil)
}
default:
break
}
}
private func gestureRecognized(gesture: TapLongTapOrDoubleTapGesture, location: CGPoint, recognizer: TapLongTapOrDoubleTapGestureRecognizer?) -> Bool {
switch gesture { switch gesture {
case .tap: case .tap:
if let avatarNode = self.accessoryItemNode as? ChatMessageAvatarAccessoryItemNode, avatarNode.frame.contains(location) { if let avatarNode = self.accessoryItemNode as? ChatMessageAvatarAccessoryItemNode, avatarNode.frame.contains(location) {
@ -606,13 +623,13 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
if case .member = channel.participationStatus { if case .member = channel.participationStatus {
} else { } else {
item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_PrivateChannelTooltip, self, avatarNode.frame) item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_PrivateChannelTooltip, self, avatarNode.frame)
return return true
} }
} }
item.controllerInteraction.openPeer(openPeerId, navigate, item.message) item.controllerInteraction.openPeer(openPeerId, navigate, item.message)
} }
} }
return return true
} }
if let viaBotNode = self.viaBotNode, viaBotNode.frame.contains(location) { if let viaBotNode = self.viaBotNode, viaBotNode.frame.contains(location) {
@ -634,7 +651,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
return .text return .text
} }
} }
return return true
} }
} }
} }
@ -645,7 +662,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
for attribute in item.message.attributes { for attribute in item.message.attributes {
if let attribute = attribute as? ReplyMessageAttribute { if let attribute = attribute as? ReplyMessageAttribute {
item.controllerInteraction.navigateToMessage(item.message.id, attribute.messageId) item.controllerInteraction.navigateToMessage(item.message.id, attribute.messageId)
return return true
} }
} }
} }
@ -653,21 +670,20 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
if let item = self.item, self.imageNode.frame.contains(location) { if let item = self.item, self.imageNode.frame.contains(location) {
let _ = item.controllerInteraction.openMessage(item.message, .default) let _ = item.controllerInteraction.openMessage(item.message, .default)
return return true
} }
self.item?.controllerInteraction.clickThroughMessage() self.item?.controllerInteraction.clickThroughMessage()
case .longTap, .doubleTap: case .longTap, .doubleTap:
if let item = self.item, self.imageNode.frame.contains(location) { if let item = self.item, self.imageNode.frame.contains(location) {
item.controllerInteraction.openMessageContextMenu(item.message, false, self, self.imageNode.frame, nil) item.controllerInteraction.openMessageContextMenu(item.message, false, self, self.imageNode.frame, recognizer)
return false
} }
case .hold: case .hold:
break break
} }
}
default: return true
break
}
} }
@objc func shareButtonPressed() { @objc func shareButtonPressed() {