diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index f2b27b142a..994a53283d 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -522,6 +522,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { var peer: Peer? var displayAsMessage = false + var enablePreview = true switch item.content { case let .peer(message, peerValue, _, _, _, _, _, _, _, _, displayAsMessageValue): displayAsMessage = displayAsMessageValue @@ -530,6 +531,9 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { } else { peer = peerValue.chatMainPeer } + if peerValue.peerId.namespace == Namespaces.Peer.SecretChat { + enablePreview = false + } case let .groupReference(groupReference): if let previousItem = previousItem, case let .groupReference(previousGroupReference) = previousItem.content, groupReference.hiddenByDefault != previousGroupReference.hiddenByDefault { UIView.transition(with: self.avatarNode.view, duration: 0.3, options: [.transitionCrossDissolve], animations: { @@ -547,6 +551,8 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { } self.avatarNode.setPeer(account: item.context.account, theme: item.presentationData.theme, peer: peer, overrideImage: overrideImage, emptyColor: item.presentationData.theme.list.mediaPlaceholderColor, synchronousLoad: synchronousLoads) } + + self.contextContainer.isGestureEnabled = enablePreview } override func layoutForParams(_ params: ListViewItemLayoutParams, item: ListViewItem, previousItem: ListViewItem?, nextItem: ListViewItem?) { diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index cdfbbfc99c..3f4f59ddc1 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -566,7 +566,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi let contentContainerOffset = CGPoint(x: localSourceFrame.center.x - self.contentContainerNode.frame.center.x, y: localSourceFrame.center.y - self.contentContainerNode.frame.center.y) if let contentNode = self.contentContainerNode.contentNode, case let .controller(controller) = contentNode { - let snapshotView = controller.sourceNode.view.snapshotContentTree() + let snapshotView: UIView? = nil// controller.sourceNode.view.snapshotContentTree() if let snapshotView = snapshotView { controller.sourceNode.isHidden = true @@ -859,7 +859,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi let localSourceFrame = self.view.convert(CGRect(origin: CGPoint(x: originalProjectedContentViewFrame.1.minX, y: originalProjectedContentViewFrame.1.minY), size: CGSize(width: originalProjectedContentViewFrame.1.width, height: originalProjectedContentViewFrame.1.height)), to: self.scrollNode.view) - if let snapshotView = targetNode.view.snapshotContentTree(unhide: true, keepTransform: true) { + if let snapshotView = targetNode.view.snapshotContentTree(unhide: true, keepTransform: true), false { self.view.addSubview(snapshotView) snapshotView.layer.animatePosition(from: CGPoint(x: self.contentContainerNode.frame.midX, y: self.contentContainerNode.frame.minY + localSourceFrame.height / 2.0), to: localSourceFrame.center, duration: transitionDuration * animationDurationFactor, timingFunction: transitionCurve.timingFunction, removeOnCompletion: false) snapshotView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2 * animationDurationFactor, removeOnCompletion: false, completion: { _ in diff --git a/submodules/Display/Display/KeyboardManager.swift b/submodules/Display/Display/KeyboardManager.swift index dc9dc0622e..5d705dd9dc 100644 --- a/submodules/Display/Display/KeyboardManager.swift +++ b/submodules/Display/Display/KeyboardManager.swift @@ -145,6 +145,13 @@ class KeyboardManager { } } +private func endAnimations(view: UIView) { + view.layer.removeAllAnimations() + for subview in view.subviews { + endAnimations(view: subview) + } +} + final class KeyboardViewManager { private let host: StatusBarHost @@ -152,12 +159,23 @@ final class KeyboardViewManager { self.host = host } + func dismissEditingWithoutAnimation(view: UIView) { + view.endEditing(true) + if let keyboardWindow = self.host.keyboardWindow { + for view in keyboardWindow.subviews { + endAnimations(view: view) + } + } + } + func update(leftEdge: CGFloat, transition: ContainedViewLayoutTransition) { + print("leftEdge: \(leftEdge) canSet: \(self.host.keyboardWindow != nil)") guard let keyboardWindow = self.host.keyboardWindow else { return } let t = keyboardWindow.layer.sublayerTransform let currentOffset = CGPoint(x: t.m41, y: t.m42) - transition.updateSublayerTransformOffset(layer: keyboardWindow.layer, offset: CGPoint(x: leftEdge, y: currentOffset.y)) + transition.updateSublayerTransformOffset(layer: keyboardWindow.layer, offset: CGPoint(x: leftEdge, y: currentOffset.y), completion: { _ in + }) } } diff --git a/submodules/Display/Display/Navigation/NavigationContainer.swift b/submodules/Display/Display/Navigation/NavigationContainer.swift index 4487bbf95b..2aa9bb4bdf 100644 --- a/submodules/Display/Display/Navigation/NavigationContainer.swift +++ b/submodules/Display/Display/Navigation/NavigationContainer.swift @@ -105,7 +105,7 @@ final class NavigationContainer: ASDisplayNode, UIGestureRecognizerDelegate { panRecognizer.cancelsTouchesInView = true self.view.addGestureRecognizer(panRecognizer) - self.view.disablesInteractiveTransitionGestureRecognizerNow = { [weak self] in + /*self.view.disablesInteractiveTransitionGestureRecognizerNow = { [weak self] in guard let strongSelf = self else { return false } @@ -113,7 +113,7 @@ final class NavigationContainer: ASDisplayNode, UIGestureRecognizerDelegate { return true } return false - } + }*/ } public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { @@ -196,9 +196,7 @@ final class NavigationContainer: ASDisplayNode, UIGestureRecognizerDelegate { let topController = top.value let bottomController = transition.previous.value - UIView.setAnimationsEnabled(false) - topController.view.endEditing(true) - UIView.setAnimationsEnabled(true) + strongSelf.keyboardViewManager?.dismissEditingWithoutAnimation(view: topController.view) strongSelf.state.transition = nil @@ -370,6 +368,7 @@ final class NavigationContainer: ASDisplayNode, UIGestureRecognizerDelegate { guard let strongSelf = self, let topTransition = topTransition, strongSelf.state.transition === topTransition else { return } + strongSelf.keyboardViewManager?.dismissEditingWithoutAnimation(view: topTransition.previous.value.view) strongSelf.state.transition = nil topTransition.previous.value.setIgnoreAppearanceMethodInvocations(true) @@ -422,6 +421,10 @@ final class NavigationContainer: ASDisplayNode, UIGestureRecognizerDelegate { case .push: break } + } else { + if isMaster { + shouldSyncKeyboard = true + } } if child.value.displayNode.frame != childFrame { transition.updateFrame(node: child.value.displayNode, frame: childFrame) diff --git a/submodules/Display/Display/NavigationTransitionCoordinator.swift b/submodules/Display/Display/NavigationTransitionCoordinator.swift index 5cbf82a864..a6b8c9b5b2 100644 --- a/submodules/Display/Display/NavigationTransitionCoordinator.swift +++ b/submodules/Display/Display/NavigationTransitionCoordinator.swift @@ -9,7 +9,13 @@ enum NavigationTransition { private let shadowWidth: CGFloat = 16.0 private func generateShadow() -> UIImage? { - return UIImage(named: "NavigationShadow", in: getAppBundle(), compatibleWith: nil)?.precomposed().resizableImage(withCapInsets: UIEdgeInsets(), resizingMode: .tile) + return generateImage(CGSize(width: 16.0, height: 1.0), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(UIColor.black.cgColor) + context.setShadow(offset: CGSize(), blur: 16.0, color: UIColor(white: 0.0, alpha: 0.5).cgColor) + context.fill(CGRect(origin: CGPoint(x: size.width, y: 0.0), size: CGSize(width: 16.0, height: 1.0))) + }) + //return UIImage(named: "NavigationShadow", in: getAppBundle(), compatibleWith: nil)?.precomposed().resizableImage(withCapInsets: UIEdgeInsets(), resizingMode: .tile) } private let shadowImage = generateShadow() diff --git a/submodules/Display/Display/WindowContent.swift b/submodules/Display/Display/WindowContent.swift index 65f4e68d52..8a2562fd69 100644 --- a/submodules/Display/Display/WindowContent.swift +++ b/submodules/Display/Display/WindowContent.swift @@ -1059,18 +1059,6 @@ public class Window1 { let currentLocation = location let deltaY = keyboardGestureBeginLocation.y - location.y if deltaY * deltaY >= 3.0 * 3.0 || self.windowLayout.upperKeyboardInputPositionBound != nil { - if self.windowLayout.upperKeyboardInputPositionBound == nil { - var enableGesture = true - if let view = self.hostView.containerView.hitTest(location, with: nil) { - if doesViewTreeDisableInteractiveTransitionGestureRecognizer(view) { - enableGesture = false - } - } - if !enableGesture { - self.keyboardGestureBeginLocation = nil - return - } - } self.updateLayout { $0.update(upperKeyboardInputPositionBound: currentLocation.y + (self.keyboardGestureAccessoryHeight ?? 0.0), transition: .immediate, overrideTransition: false) } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 3217d8e28b..849e41666d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -382,7 +382,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode self.tapRecognizer = recognizer self.view.addGestureRecognizer(recognizer) - /*let replyRecognizer = ChatSwipeToReplyRecognizer(target: self, action: #selector(self.swipeToReplyGesture(_:))) + let replyRecognizer = ChatSwipeToReplyRecognizer(target: self, action: #selector(self.swipeToReplyGesture(_:))) replyRecognizer.shouldBegin = { [weak self] in if let strongSelf = self, let item = strongSelf.item { if strongSelf.selectionNode != nil { @@ -404,9 +404,9 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } return false } - self.view.addGestureRecognizer(replyRecognizer)*/ + self.view.addGestureRecognizer(replyRecognizer) - let reactionRecognizer = ReactionSwipeGestureRecognizer(target: nil, action: nil) + /*let reactionRecognizer = ReactionSwipeGestureRecognizer(target: nil, action: nil) self.reactionRecognizer = reactionRecognizer reactionRecognizer.availableReactions = { [weak self] in guard let strongSelf = self, let item = strongSelf.item, !item.presentationData.isPreview && !Namespaces.Message.allScheduled.contains(item.message.id.namespace) else { @@ -559,7 +559,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } } - self.view.addGestureRecognizer(reactionRecognizer) + self.view.addGestureRecognizer(reactionRecognizer)*/ } override func asyncLayout() -> (_ item: ChatMessageItem, _ params: ListViewItemLayoutParams, _ mergedTop: ChatMessageMerge, _ mergedBottom: ChatMessageMerge, _ dateHeaderAtBottom: Bool) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation, Bool) -> Void) { @@ -2739,7 +2739,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } @objc func swipeToReplyGesture(_ recognizer: ChatSwipeToReplyRecognizer) { - /*switch recognizer.state { + switch recognizer.state { case .began: self.currentSwipeToReplyTranslation = 0.0 if self.swipeToReplyFeedback == nil { @@ -2798,7 +2798,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } default: break - }*/ + } } private var absoluteRect: (CGRect, CGSize)? diff --git a/submodules/WalletUI/Sources/WalletSendScreen.swift b/submodules/WalletUI/Sources/WalletSendScreen.swift index e9d3092d6c..1e829fc71f 100644 --- a/submodules/WalletUI/Sources/WalletSendScreen.swift +++ b/submodules/WalletUI/Sources/WalletSendScreen.swift @@ -229,7 +229,7 @@ private enum WalletSendScreenEntry: ItemListNodeEntry { case let .commentHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .comment(theme, placeholder, value): - return ItemListMultilineInputItem(theme: theme, text: value, placeholder: placeholder, maxLength: ItemListMultilineInputItemTextLimit(value: 128, display: true), sectionId: self.section, style: .blocks, returnKeyType: .send, textUpdated: { text in + return ItemListMultilineInputItem(theme: theme, text: value, placeholder: placeholder, maxLength: ItemListMultilineInputItemTextLimit(value: 124, display: true), sectionId: self.section, style: .blocks, returnKeyType: .send, textUpdated: { text in arguments.updateText(WalletSendScreenEntryTag.comment, text) }, tag: WalletSendScreenEntryTag.comment, action: { arguments.proceed() @@ -412,7 +412,7 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, ra let amount = amountValue(state.amount) var sendEnabled = false if let balance = balance { - sendEnabled = isValidAddress(state.address, exactLength: true) && amount > 0 && amount <= balance.balance && state.comment.count <= 128 + sendEnabled = isValidAddress(state.address, exactLength: true) && amount > 0 && amount <= balance.balance && state.comment.count <= 124 } let rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Wallet_Send_Send), style: .bold, enabled: sendEnabled, action: { arguments.proceed()