Эх сурвалжийг харах

Merge pull request #415 from deltachat/streamline_attach_menu

Streamline attach menu
björn petersen 5 жил өмнө
parent
commit
482c14b395

+ 1 - 0
Pods/ALCameraViewController/ALCameraViewController/ViewController/CameraViewController.swift

@@ -579,6 +579,7 @@ open class CameraViewController: UIViewController {
 			}
 			
 			guard let image = image else {
+				self?.cameraView.startSession()
 				return
 			}
 			

+ 53 - 8
deltachat-ios/Controller/ChatViewController.swift

@@ -14,7 +14,22 @@ extension ChatViewController: MediaSendHandler {
     }
 }
 
+extension ChatViewController: MediaPickerDelegate {
+    func onVideoSelected(url: NSURL) {
+        sendVideo(url: url)
+    }
+
+    func onImageSelected(url: NSURL) {
+        sendImage(url: url)
+    }
+
+    func onImageSelected(image: UIImage) {
+        sendImage(image)
+    }
+}
+
 class ChatViewController: MessagesViewController {
+
     var dcContext: DcContext
     weak var coordinator: ChatViewCoordinator?
 
@@ -751,6 +766,36 @@ extension ChatViewController: MessagesDataSource {
         })
     }
 
+    private func sendImage(_ image: UIImage) {
+        DispatchQueue.global().async {
+            if let compressedImage = image.dcCompress() {
+                // at this point image is compressed by 85% by default
+                let pixelSize = compressedImage.imageSizeInPixel()
+                let path = Utils.saveImage(image: compressedImage)
+                let msg = DcMsg(viewType: DC_MSG_IMAGE)
+                msg.setFile(filepath: path, mimeType: "image/jpeg")
+                msg.setDimension(width: pixelSize.width, height: pixelSize.height)
+                msg.sendInChat(id: self.chatId)
+            }
+        }
+    }
+
+    private func sendVideo(url: NSURL) {
+        DispatchQueue.global().async {
+            let msg = DcMsg(viewType: DC_MSG_VIDEO)
+            msg.setFile(filepath: url.relativePath, mimeType: "video/mov")
+            msg.sendInChat(id: self.chatId)
+        }
+    }
+
+    private func sendImage(url: NSURL) {
+        if let data = try? Data(contentsOf: url as URL) {
+            if let image = UIImage(data: data) {
+                sendImage(image)
+            }
+        }
+    }
+
     func isLastSectionVisible() -> Bool {
         guard !messageList.isEmpty else { return false }
 
@@ -889,21 +934,21 @@ extension ChatViewController: MessagesLayoutDelegate {
 
     private func showClipperOptions() {
         let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
-        let photoAction = PhotoPickerAlertAction(title: String.localized("camera"), style: .default, handler: photoButtonPressed(_:))
-        let videoAction = PhotoPickerAlertAction(title: String.localized("video"), style: .default, handler: videoButtonPressed(_:))
+        let galleryAction = PhotoPickerAlertAction(title: String.localized("gallery"), style: .default, handler: galleryButtonPressed(_:))
+        let cameraAction = PhotoPickerAlertAction(title: String.localized("camera"), style: .default, handler: cameraButtonPressed(_:))
 
-        alert.addAction(photoAction)
-        alert.addAction(videoAction)
+        alert.addAction(cameraAction)
+        alert.addAction(galleryAction)
         alert.addAction(UIAlertAction(title: String.localized("cancel"), style: .cancel, handler: nil))
         self.present(alert, animated: true, completion: nil)
     }
 
-    private func photoButtonPressed(_ action: UIAlertAction) {
-        coordinator?.showCameraViewController()
+    private func cameraButtonPressed(_ action: UIAlertAction) {
+        coordinator?.showCameraViewController(delegate: self)
     }
 
-    private func videoButtonPressed(_ action: UIAlertAction) {
-        coordinator?.showVideoLibrary()
+    private func galleryButtonPressed(_ action: UIAlertAction) {
+        coordinator?.showPhotoVideoLibrary(delegate: self)
     }
 
 }

+ 10 - 99
deltachat-ios/Coordinator/AppCoordinator.swift

@@ -129,7 +129,7 @@ class MailboxCoordinator: ChatViewCoordinator {
         // ignore for now
     }
 
-    override func showCameraViewController() {
+    override func showCameraViewController(delegate: MediaPickerDelegate) {
         // ignore
     }
 
@@ -240,7 +240,7 @@ class EditSettingsCoordinator: Coordinator {
     }
 
     func showPhotoPicker(delegate: MediaPickerDelegate) {
-        mediaPicker.showGallery(delegate: delegate)
+        mediaPicker.showPhotoGallery(delegate: delegate)
     }
 
     func showCamera(delegate: MediaPickerDelegate) {
@@ -378,8 +378,6 @@ class GroupChatDetailCoordinator: Coordinator {
         navigationController.pushViewController(contactDetailController, animated: true)
     }
 
-
-
 }
 
 class ChatViewCoordinator: NSObject, Coordinator {
@@ -389,11 +387,13 @@ class ChatViewCoordinator: NSObject, Coordinator {
     var chatViewController: ChatViewController!
 
     var childCoordinators: [Coordinator] = []
+    let mediaPicker: MediaPicker
 
     init(dcContext: DcContext, navigationController: UINavigationController, chatId: Int) {
         self.dcContext = dcContext
         self.navigationController = navigationController
         self.chatId = chatId
+        self.mediaPicker = MediaPicker(navigationController: self.navigationController)
     }
 
     func navigateBack() {
@@ -441,101 +441,12 @@ class ChatViewCoordinator: NSObject, Coordinator {
         navigationController.pushViewController(chatViewController, animated: true)
     }
 
-    private func sendImage(_ image: UIImage) {
-        DispatchQueue.global().async {
-            if let compressedImage = image.dcCompress() {
-                // at this point image is compressed by 85% by default
-                let pixelSize = compressedImage.imageSizeInPixel()
-                let width = Int32(exactly: pixelSize.width)!
-                let height =  Int32(exactly: pixelSize.height)!
-                let path = Utils.saveImage(image: compressedImage)
-                let msg = dc_msg_new(mailboxPointer, DC_MSG_IMAGE)
-                dc_msg_set_file(msg, path, "image/jpeg")
-                dc_msg_set_dimension(msg, width, height)
-                dc_send_msg(mailboxPointer, UInt32(self.chatId), msg)
-                // cleanup
-                dc_msg_unref(msg)
-            }
-        }
-    }
-
-    private func sendVideo(url: NSURL) {
-        let msg = dc_msg_new(mailboxPointer, DC_MSG_VIDEO)
-        if let path = url.relativePath?.cString(using: .utf8) { //absoluteString?.cString(using: .utf8) {
-            dc_msg_set_file(msg, path, "video/mov")
-            dc_send_msg(mailboxPointer, UInt32(chatId), msg)
-            dc_msg_unref(msg)
-        }
-    }
-
-    private func handleMediaMessageSuccess() {
-        if let chatViewController = self.navigationController.visibleViewController as? MediaSendHandler {
-            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
-                chatViewController.onSuccess()
-            }
-        }
+    func showCameraViewController(delegate: MediaPickerDelegate) {
+        mediaPicker.showCamera(delegate: delegate, allowCropping: false)
     }
 
-    func showCameraViewController() {
-        if UIImagePickerController.isSourceTypeAvailable(.camera) {
-            let cameraViewController = CameraViewController { [weak self] image, _ in
-                self?.navigationController.dismiss(animated: true, completion: {
-                    self?.handleMediaMessageSuccess()
-                })
-                if let image = image {
-                    self?.sendImage(image)
-                }
-            }
-
-            navigationController.present(cameraViewController, animated: true, completion: nil)
-        } else {
-            let alert = UIAlertController(title: String.localized("chat_camera_unavailable"), message: nil, preferredStyle: .alert)
-            alert.addAction(UIAlertAction(title: String.localized("ok"), style: .cancel, handler: { _ in
-                self.navigationController.dismiss(animated: true, completion: nil)
-            }))
-            navigationController.present(alert, animated: true, completion: nil)
-        }
-
-    }
-    func showVideoLibrary() {
-        if PHPhotoLibrary.authorizationStatus() != .authorized {
-            PHPhotoLibrary.requestAuthorization { status in
-                DispatchQueue.main.async {
-                    [weak self] in
-                    switch status {
-                    case  .denied, .notDetermined, .restricted:
-                        print("denied")
-                    case .authorized:
-                        self?.presentVideoLibrary()
-                    }
-                }
-            }
-        } else {
-            presentVideoLibrary()
-        }
-    }
-
-    private func presentVideoLibrary() {
-        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
-            let videoPicker = UIImagePickerController()
-            videoPicker.title = String.localized("video")
-            videoPicker.delegate = self
-            videoPicker.sourceType = .photoLibrary
-            videoPicker.mediaTypes = [kUTTypeMovie as String, kUTTypeVideo as String]
-            navigationController.present(videoPicker, animated: true, completion: nil)
-        }
-    }
-}
-
-extension ChatViewCoordinator: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
-
-    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
-        if let videoUrl = info[UIImagePickerController.InfoKey.mediaURL] as? NSURL {
-            sendVideo(url: videoUrl)
-        }
-        navigationController.dismiss(animated: true) {
-            self.handleMediaMessageSuccess()
-        }
+    func showPhotoVideoLibrary(delegate: MediaPickerDelegate) {
+        mediaPicker.showPhotoVideoLibrary(delegate: delegate)
     }
 }
 
@@ -604,7 +515,7 @@ class GroupNameCoordinator: Coordinator {
     }
 
     func showPhotoPicker(delegate: MediaPickerDelegate) {
-          mediaPicker.showGallery(delegate: delegate)
+          mediaPicker.showPhotoGallery(delegate: delegate)
       }
 
       func showCamera(delegate: MediaPickerDelegate) {
@@ -654,7 +565,7 @@ class EditGroupCoordinator: Coordinator {
     }
 
     func showPhotoPicker(delegate: MediaPickerDelegate) {
-        mediaPicker.showGallery(delegate: delegate)
+        mediaPicker.showPhotoGallery(delegate: delegate)
     }
 
     func showCamera(delegate: MediaPickerDelegate) {

+ 27 - 0
deltachat-ios/DC/Wrapper.swift

@@ -512,6 +512,21 @@ class DcArray {
 class DcMsg: MessageType {
     private var messagePointer: OpaquePointer?
 
+    /**
+        viewType: one of
+            DC_MSG_TEXT,
+            DC_MSG_IMAGE,
+            DC_MSG_GIF,
+            DC_MSG_STICKER,
+            DC_MSG_AUDIO,
+            DC_MSG_VOICE,
+            DC_MSG_VIDEO,
+            DC_MSG_FILE
+     */
+    init(viewType: Int32) {
+        messagePointer = dc_msg_new(mailboxPointer, viewType)
+    }
+
     init(id: Int) {
         messagePointer = dc_get_msg(mailboxPointer, UInt32(id))
     }
@@ -748,6 +763,14 @@ class DcMsg: MessageType {
         return nil
     }
 
+    func setFile(filepath: String?, mimeType: String?) {
+        dc_msg_set_file(messagePointer, filepath, mimeType)
+    }
+
+    func setDimension(width: CGFloat, height: CGFloat) {
+        dc_msg_set_dimension(messagePointer, Int32(exactly: width)!, Int32(exactly: height)!)
+    }
+
     var filesize: Int {
         return Int(dc_msg_get_filebytes(messagePointer))
     }
@@ -792,6 +815,10 @@ class DcMsg: MessageType {
         let chatId = dc_create_chat_by_msg_id(mailboxPointer, UInt32(id))
         return DcChat(id: Int(chatId))
     }
+
+    func sendInChat(id: Int) {
+        dc_send_msg(mailboxPointer, UInt32(id), messagePointer)
+    }
 }
 
 class DcContact {

+ 67 - 6
deltachat-ios/Helper/MediaPicker.swift

@@ -5,6 +5,17 @@ import ALCameraViewController
 
 protocol MediaPickerDelegate: class {
     func onImageSelected(image: UIImage)
+    func onImageSelected(url: NSURL)
+    func onVideoSelected(url: NSURL)
+}
+
+extension MediaPickerDelegate {
+    func onImageSelected(url: NSURL) {
+        logger.debug("image selected: ", url.path ?? "unknown")
+    }
+    func onVideoSelected(url: NSURL) {
+        logger.debug("video selected: ", url.path ?? "unknown")
+    }
 }
 
 class MediaPicker: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@@ -15,7 +26,40 @@ class MediaPicker: NSObject, UINavigationControllerDelegate, UIImagePickerContro
         self.navigationController = navigationController
     }
 
-    func showGallery(delegate: MediaPickerDelegate) {
+
+    func showPhotoVideoLibrary(delegate: MediaPickerDelegate) {
+        if PHPhotoLibrary.authorizationStatus() != .authorized {
+            PHPhotoLibrary.requestAuthorization { status in
+                DispatchQueue.main.async {
+                    [weak self] in
+                    switch status {
+                    case  .denied, .notDetermined, .restricted:
+                        print("denied")
+                    case .authorized:
+                        self?.presentPhotoVideoLibrary(delegate: delegate)
+                    }
+                }
+            }
+        } else {
+            presentPhotoVideoLibrary(delegate: delegate)
+        }
+    }
+
+    private func presentPhotoVideoLibrary(delegate: MediaPickerDelegate) {
+        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
+            let videoPicker = UIImagePickerController()
+            videoPicker.title = String.localized("gallery")
+            videoPicker.delegate = self
+            videoPicker.sourceType = .photoLibrary
+            videoPicker.mediaTypes = [kUTTypeMovie as String,
+                                      kUTTypeVideo as String,
+                                      kUTTypeImage as String]
+            self.delegate = delegate
+            navigationController.present(videoPicker, animated: true, completion: nil)
+        }
+    }
+
+    func showPhotoGallery(delegate: MediaPickerDelegate) {
         let croppingParameters = CroppingParameters(isEnabled: true,
                                                     allowResizing: true,
                                                     allowMoving: true,
@@ -31,12 +75,16 @@ class MediaPicker: NSObject, UINavigationControllerDelegate, UIImagePickerContro
         navigationController.present(controller, animated: true, completion: nil)
     }
 
-    func showCamera(delegate: MediaPickerDelegate) {
+    func showCamera(delegate: MediaPickerDelegate, allowCropping: Bool) {
         if UIImagePickerController.isSourceTypeAvailable(.camera) {
-            let croppingParameters = CroppingParameters(isEnabled: true,
-            allowResizing: true,
-            allowMoving: true,
-            minimumSize: CGSize(width: 70, height: 70))
+            var croppingParameters: CroppingParameters = CroppingParameters()
+            if allowCropping {
+                croppingParameters = CroppingParameters(isEnabled: true,
+                allowResizing: true,
+                allowMoving: true,
+                minimumSize: CGSize(width: 70, height: 70))
+            }
+
             let cameraViewController = CameraViewController(croppingParameters: croppingParameters,
                                                             allowsLibraryAccess: false,
                                                             allowsSwapCameraOrientation: true,
@@ -57,4 +105,17 @@ class MediaPicker: NSObject, UINavigationControllerDelegate, UIImagePickerContro
         }
     }
 
+    func showCamera(delegate: MediaPickerDelegate) {
+        showCamera(delegate: delegate, allowCropping: true)
+    }
+
+    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
+        if let videoUrl = info[UIImagePickerController.InfoKey.mediaURL] as? NSURL {
+            self.delegate?.onVideoSelected(url: videoUrl)
+        } else if let imageUrl = info[UIImagePickerController.InfoKey.imageURL] as? NSURL {
+            self.delegate?.onImageSelected(url: imageUrl)
+        }
+        navigationController.dismiss(animated: true, completion: nil)
+    }
+
 }