From bbccbe42c13a156c2339b4ff8b4765d0aef6651b Mon Sep 17 00:00:00 2001 From: Ryan Zhao Date: Mon, 13 Dec 2021 15:51:42 +1100 Subject: [PATCH 1/3] copy / paste images directly --- .../ConversationVC+Interaction.swift | 10 ++++++++++ .../Input View/InputTextView.swift | 17 +++++++++++++++++ .../Conversations/Input View/InputView.swift | 5 +++++ .../SendMediaNavigationController.swift | 11 +++++++++++ 4 files changed, 43 insertions(+) diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 809d9f165..5a56aab8e 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -49,6 +49,16 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc } // MARK: Attachments + func didPasteImageFromPasteboard(_ image: UIImage) { + guard let imageData = image.jpegData(compressionQuality: 1.0) else { return } + let dataSource = DataSourceValue.dataSource(with: imageData, utiType: kUTTypeJPEG as String) + let attachment = SignalAttachment.attachment(dataSource: dataSource, dataUTI: kUTTypeJPEG as String, imageQuality: .medium) + + let sendMediaNavController = SendMediaNavigationController.showingWithImage(attachment, delegate: self) + sendMediaNavController.modalPresentationStyle = .fullScreen + self.present(sendMediaNavController, animated: true, completion: nil) + } + func sendMediaNavDidCancel(_ sendMediaNavigationController: SendMediaNavigationController) { dismiss(animated: true, completion: nil) } diff --git a/Session/Conversations/Input View/InputTextView.swift b/Session/Conversations/Input View/InputTextView.swift index 57546e407..69c61da67 100644 --- a/Session/Conversations/Input View/InputTextView.swift +++ b/Session/Conversations/Input View/InputTextView.swift @@ -37,6 +37,22 @@ public final class InputTextView : UITextView, UITextViewDelegate { public required init?(coder: NSCoder) { preconditionFailure("Use init(delegate:) instead.") } + + public override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { + if action == #selector(paste(_:)) { + if let _ = UIPasteboard.general.image { + return true + } + } + return super.canPerformAction(action, withSender: sender) + } + + public override func paste(_ sender: Any?) { + if let image = UIPasteboard.general.image { + snDelegate?.didPasteImageFromPasteboard(self, image: image) + } + super.paste(sender) + } private func setUpViewHierarchy() { showsHorizontalScrollIndicator = false @@ -80,4 +96,5 @@ protocol InputTextViewDelegate : AnyObject { func inputTextViewDidChangeSize(_ inputTextView: InputTextView) func inputTextViewDidChangeContent(_ inputTextView: InputTextView) + func didPasteImageFromPasteboard(_ inputTextView: InputTextView, image: UIImage) } diff --git a/Session/Conversations/Input View/InputView.swift b/Session/Conversations/Input View/InputView.swift index 599af7599..9b78dc9e6 100644 --- a/Session/Conversations/Input View/InputView.swift +++ b/Session/Conversations/Input View/InputView.swift @@ -143,6 +143,10 @@ final class InputView : UIView, InputViewButtonDelegate, InputTextViewDelegate, autoGenerateLinkPreviewIfPossible() delegate?.inputTextViewDidChangeContent(inputTextView) } + + func didPasteImageFromPasteboard(_ inputTextView: InputTextView, image: UIImage) { + delegate?.didPasteImageFromPasteboard(image) + } // We want to show either a link preview or a quote draft, but never both at the same time. When trying to // generate a link preview, wait until we're sure that we'll be able to build a link preview from the given @@ -351,4 +355,5 @@ protocol InputViewDelegate : AnyObject, ExpandingAttachmentsButtonDelegate, Voic func handleQuoteViewCancelButtonTapped() func inputTextViewDidChangeContent(_ inputTextView: InputTextView) func handleMentionSelected(_ mention: Mention, from view: MentionSelectionView) + func didPasteImageFromPasteboard(_ image: UIImage) } diff --git a/Session/Media Viewing & Editing/SendMediaNavigationController.swift b/Session/Media Viewing & Editing/SendMediaNavigationController.swift index de975713e..ff49dc45c 100644 --- a/Session/Media Viewing & Editing/SendMediaNavigationController.swift +++ b/Session/Media Viewing & Editing/SendMediaNavigationController.swift @@ -58,6 +58,17 @@ class SendMediaNavigationController: OWSNavigationController { @objc public weak var sendMediaNavDelegate: SendMediaNavDelegate? + + @objc class func showingWithImage(_ attachment: SignalAttachment, delegate: SendMediaNavDelegate) -> SendMediaNavigationController { + let navController = SendMediaNavigationController() + navController.sendMediaNavDelegate = delegate + let approvalViewController = AttachmentApprovalViewController(mode: .modal, attachments: [ attachment ]) + approvalViewController.approvalDelegate = navController + approvalViewController.messageText = delegate.sendMediaNavInitialMessageText(navController) + navController.setViewControllers([approvalViewController], animated: false) + + return navController + } @objc public class func showingCameraFirst() -> SendMediaNavigationController { From d74af622bcbd95754ffe27b5bb52c9e3e568ab2e Mon Sep 17 00:00:00 2001 From: Ryan Zhao Date: Mon, 13 Dec 2021 16:22:45 +1100 Subject: [PATCH 2/3] fix photos from original camera is rotated in the preview page --- .../Image Editing/ImageEditorCanvasView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SignalUtilitiesKit/Media Viewing & Editing/Image Editing/ImageEditorCanvasView.swift b/SignalUtilitiesKit/Media Viewing & Editing/Image Editing/ImageEditorCanvasView.swift index 12fae43f5..92e4f93c1 100644 --- a/SignalUtilitiesKit/Media Viewing & Editing/Image Editing/ImageEditorCanvasView.swift +++ b/SignalUtilitiesKit/Media Viewing & Editing/Image Editing/ImageEditorCanvasView.swift @@ -166,7 +166,7 @@ public class ImageEditorCanvasView: UIView { // of code simplicity. We could modify the image layer's // transform to handle the normalization, which would // have perf benefits. - return srcImage + return srcImage.normalized() } // MARK: - Content From 5803eae134279d1765df83746dba2d1f95b60d12 Mon Sep 17 00:00:00 2001 From: Ryan Zhao Date: Tue, 14 Dec 2021 15:12:48 +1100 Subject: [PATCH 3/3] clean --- .../Conversations/ConversationVC+Interaction.swift | 6 +++--- .../SendMediaNavigationController.swift | 11 ----------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 5a56aab8e..61ff20d9f 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -54,9 +54,9 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc let dataSource = DataSourceValue.dataSource(with: imageData, utiType: kUTTypeJPEG as String) let attachment = SignalAttachment.attachment(dataSource: dataSource, dataUTI: kUTTypeJPEG as String, imageQuality: .medium) - let sendMediaNavController = SendMediaNavigationController.showingWithImage(attachment, delegate: self) - sendMediaNavController.modalPresentationStyle = .fullScreen - self.present(sendMediaNavController, animated: true, completion: nil) + let approvalVC = AttachmentApprovalViewController.wrappedInNavController(attachments: [ attachment ], approvalDelegate: self) + approvalVC.modalPresentationStyle = .fullScreen + self.present(approvalVC, animated: true, completion: nil) } func sendMediaNavDidCancel(_ sendMediaNavigationController: SendMediaNavigationController) { diff --git a/Session/Media Viewing & Editing/SendMediaNavigationController.swift b/Session/Media Viewing & Editing/SendMediaNavigationController.swift index ff49dc45c..de975713e 100644 --- a/Session/Media Viewing & Editing/SendMediaNavigationController.swift +++ b/Session/Media Viewing & Editing/SendMediaNavigationController.swift @@ -58,17 +58,6 @@ class SendMediaNavigationController: OWSNavigationController { @objc public weak var sendMediaNavDelegate: SendMediaNavDelegate? - - @objc class func showingWithImage(_ attachment: SignalAttachment, delegate: SendMediaNavDelegate) -> SendMediaNavigationController { - let navController = SendMediaNavigationController() - navController.sendMediaNavDelegate = delegate - let approvalViewController = AttachmentApprovalViewController(mode: .modal, attachments: [ attachment ]) - approvalViewController.approvalDelegate = navController - approvalViewController.messageText = delegate.sendMediaNavInitialMessageText(navController) - navController.setViewControllers([approvalViewController], animated: false) - - return navController - } @objc public class func showingCameraFirst() -> SendMediaNavigationController {