Bladeren bron

update send gif from photos

alqindiirsyam 6 maanden geleden
bovenliggende
commit
ff1dc26d84

+ 104 - 3
NexilisLite/NexilisLite/Source/View/Chat/EditorGroup.swift

@@ -14,6 +14,7 @@ import NotificationBannerSwift
 import nuSDKService
 import SwiftLinkPreview
 import SDWebImage
+import PhotosUI
 
 public class EditorGroup: UIViewController, CLLocationManagerDelegate {
     @IBOutlet var viewButton: UIView!
@@ -108,6 +109,7 @@ public class EditorGroup: UIViewController, CLLocationManagerDelegate {
     let locationManager = CLLocationManager()
     var longitude = ""
     var latitude = ""
+    var isBlackCancelButton = false
     
     public override func viewDidDisappear(_ animated: Bool) {
         if self.isMovingFromParent {
@@ -1387,9 +1389,31 @@ public class EditorGroup: UIViewController, CLLocationManagerDelegate {
         return UIAlertAction(title: title, style: .default) { [unowned self] _ in
             switch type {
             case "image":
-                imageVideoPicker.present(source: .imageAlbum)
+                var config = PHPickerConfiguration()
+                config.filter = .images
+                let picker = PHPickerViewController(configuration: config)
+                picker.delegate = self
+                if UIBarButtonItem.appearance().titleTextAttributes(for: .normal) != nil {
+                    isBlackCancelButton = UIBarButtonItem.appearance().titleTextAttributes(for: .normal)?.values.first as! NSObject == UIColor.black
+                }
+                if !isBlackCancelButton {
+                    let cancelButtonAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black, NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16)]
+                    UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes , for: .normal)
+                }
+                present(picker, animated: true, completion: nil)
             case "video":
-                imageVideoPicker.present(source: .videoAlbum)
+                var config = PHPickerConfiguration()
+                config.filter = .videos
+                let picker = PHPickerViewController(configuration: config)
+                picker.delegate = self
+                if UIBarButtonItem.appearance().titleTextAttributes(for: .normal) != nil {
+                    isBlackCancelButton = UIBarButtonItem.appearance().titleTextAttributes(for: .normal)?.values.first as! NSObject == UIColor.black
+                }
+                if !isBlackCancelButton {
+                    let cancelButtonAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black, NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16)]
+                    UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes , for: .normal)
+                }
+                present(picker, animated: true, completion: nil)
             case "imageCamera":
                 imageVideoPicker.present(source: .imageCamera)
             case "videoCamera":
@@ -2184,7 +2208,7 @@ public class EditorGroup: UIViewController, CLLocationManagerDelegate {
     }
 }
 
-extension EditorGroup: ImageVideoPickerDelegate, PreviewAttachmentImageVideoDelegate {
+extension EditorGroup: ImageVideoPickerDelegate, PreviewAttachmentImageVideoDelegate, PHPickerViewControllerDelegate {
     public func didSelect(imagevideo: Any?) {
         if (imagevideo != nil) {
             let imageVideoData = imagevideo as! [UIImagePickerController.InfoKey: Any]
@@ -2202,6 +2226,83 @@ extension EditorGroup: ImageVideoPickerDelegate, PreviewAttachmentImageVideoDele
         }
     }
     
+    public func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
+        if !isBlackCancelButton {
+            let cancelButtonAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16)]
+            UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes , for: .normal)
+        }
+        picker.dismiss(animated: true, completion: nil)
+        guard let result = results.first else { return }
+        if result.itemProvider.hasItemConformingToTypeIdentifier("com.compuserve.gif") {
+            result.itemProvider.loadDataRepresentation(forTypeIdentifier: "com.compuserve.gif") { data, error in
+                if let error = error {
+                    print("Error loading GIF: \(error.localizedDescription)")
+                } else if let data = data {
+                    DispatchQueue.main.async {
+                        let previewImageVC = PreviewAttachmentImageVideo(nibName: "PreviewAttachmentImageVideo", bundle: Bundle.resourceBundle(for: Nexilis.self))
+                        if (self.textFieldSend.textColor != .lightGray) {
+                            previewImageVC.currentTextTextField = self.textFieldSend.text
+                        }
+                        previewImageVC.fromCopy = true
+                        previewImageVC.isGIF = true
+                        previewImageVC.dataGIF = data
+                        previewImageVC.modalPresentationStyle = .custom
+                        previewImageVC.delegate = self
+                        previewImageVC.isAck = self.isAck
+                        previewImageVC.isConfidential = self.isConfidential
+                        self.present(previewImageVC, animated: true, completion: nil)
+                    }
+                }
+            }
+        } else if result.itemProvider.hasItemConformingToTypeIdentifier("public.image") {
+            result.itemProvider.loadObject(ofClass: UIImage.self) { object, error in
+                if let image = object as? UIImage {
+                    DispatchQueue.main.async {
+                        let previewImageVC = PreviewAttachmentImageVideo(nibName: "PreviewAttachmentImageVideo", bundle: Bundle.resourceBundle(for: Nexilis.self))
+                        if (self.textFieldSend.textColor != .lightGray) {
+                            previewImageVC.currentTextTextField = self.textFieldSend.text
+                        }
+                        previewImageVC.fromCopy = true
+                        previewImageVC.image = image
+                        previewImageVC.modalPresentationStyle = .custom
+                        previewImageVC.delegate = self
+                        previewImageVC.isAck = self.isAck
+                        previewImageVC.isConfidential = self.isConfidential
+                        self.present(previewImageVC, animated: true, completion: nil)
+                    }
+                }
+            }
+        } else if result.itemProvider.hasItemConformingToTypeIdentifier("public.movie") {
+            result.itemProvider.loadFileRepresentation(forTypeIdentifier: "public.movie") { tempURL, error in
+                if let tempURL = tempURL {
+                    let fileManager = FileManager.default
+                    let documentsDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
+                    let destinationURL = documentsDirectory.appendingPathComponent(tempURL.lastPathComponent)
+                    do {
+                        if fileManager.fileExists(atPath: destinationURL.path) {
+                            try fileManager.removeItem(at: destinationURL)
+                        }
+                        try fileManager.copyItem(at: tempURL, to: destinationURL)
+                        DispatchQueue.main.async {
+                            let previewImageVC = PreviewAttachmentImageVideo(nibName: "PreviewAttachmentImageVideo", bundle: Bundle.resourceBundle(for: Nexilis.self))
+                            if (self.textFieldSend.textColor != .lightGray) {
+                                previewImageVC.currentTextTextField = self.textFieldSend.text
+                            }
+                            previewImageVC.modalPresentationStyle = .custom
+                            previewImageVC.urlVideoPhpPicker = destinationURL
+                            previewImageVC.delegate = self
+                            previewImageVC.isAck = self.isAck
+                            previewImageVC.isConfidential = self.isConfidential
+                            self.present(previewImageVC, animated: true, completion: nil)
+                        }
+                    } catch {
+                        print("Error copying video file: \(error.localizedDescription)")
+                    }
+                }
+            }
+        }
+    }
+    
     func sendChatFromPreviewImage(message_text: String, attachment_flag: String, image_id: String, video_id: String, thumb_id: String, gif_id: String, viewController: UIViewController) {
         sendChat(message_text: message_text, attachment_flag: attachment_flag, image_id: image_id, video_id: video_id, thumb_id: thumb_id, viewController: viewController, gif_id: gif_id)
     }

+ 108 - 4
NexilisLite/NexilisLite/Source/View/Chat/EditorPersonal.swift

@@ -14,6 +14,7 @@ import Photos
 import nuSDKService
 import SwiftLinkPreview
 import SDWebImage
+import PhotosUI
 
 public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestureRecognizerDelegate, CLLocationManagerDelegate {
     @IBOutlet var viewButton: UIView!
@@ -118,6 +119,7 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
     let locationManager = CLLocationManager()
     var longitude = ""
     var latitude = ""
+    var isBlackCancelButton = false
     
     public override func viewDidDisappear(_ animated: Bool) {
         if self.isMovingFromParent {
@@ -2073,15 +2075,37 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
         return UIAlertAction(title: title, style: .default) { [unowned self] _ in
             switch type {
             case "image":
-                imageVideoPicker.present(source: .imageAlbum)
+                var config = PHPickerConfiguration()
+                config.filter = .images
+                let picker = PHPickerViewController(configuration: config)
+                picker.delegate = self
+                if UIBarButtonItem.appearance().titleTextAttributes(for: .normal) != nil {
+                    isBlackCancelButton = UIBarButtonItem.appearance().titleTextAttributes(for: .normal)?.values.first as! NSObject == UIColor.black
+                }
+                if !isBlackCancelButton {
+                    let cancelButtonAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black, NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16)]
+                    UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes , for: .normal)
+                }
+                present(picker, animated: true, completion: nil)
             case "video":
-                imageVideoPicker.present(source: .videoAlbum)
+                var config = PHPickerConfiguration()
+                config.filter = .videos
+                let picker = PHPickerViewController(configuration: config)
+                picker.delegate = self
+                if UIBarButtonItem.appearance().titleTextAttributes(for: .normal) != nil {
+                    isBlackCancelButton = UIBarButtonItem.appearance().titleTextAttributes(for: .normal)?.values.first as! NSObject == UIColor.black
+                }
+                if !isBlackCancelButton {
+                    let cancelButtonAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black, NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16)]
+                    UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes , for: .normal)
+                }
+                present(picker, animated: true, completion: nil)
             case "imageCamera":
                 imageVideoPicker.present(source: .imageCamera)
             case "videoCamera":
                 imageVideoPicker.present(source: .videoCamera)
             default:
-                imageVideoPicker.present(source: .imageAlbum)
+                break
             }
         }
     }
@@ -3346,7 +3370,7 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
 }
 
 //EPV
-extension EditorPersonal: PreviewAttachmentImageVideoDelegate {
+extension EditorPersonal: PreviewAttachmentImageVideoDelegate, PHPickerViewControllerDelegate {
     public func didSelect(imagevideo: Any?) {
         if (imagevideo != nil) {
             let imageVideoData = imagevideo as! [UIImagePickerController.InfoKey: Any]
@@ -3364,6 +3388,86 @@ extension EditorPersonal: PreviewAttachmentImageVideoDelegate {
         }
     }
     
+    public func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
+        if !isBlackCancelButton {
+            let cancelButtonAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16)]
+            UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes , for: .normal)
+        }
+        picker.dismiss(animated: true, completion: nil)
+        guard let result = results.first else { return }
+        if result.itemProvider.hasItemConformingToTypeIdentifier("com.compuserve.gif") {
+            result.itemProvider.loadDataRepresentation(forTypeIdentifier: "com.compuserve.gif") { data, error in
+                if let error = error {
+                    print("Error loading GIF: \(error.localizedDescription)")
+                } else if let data = data {
+                    DispatchQueue.main.async {
+                        let previewImageVC = PreviewAttachmentImageVideo(nibName: "PreviewAttachmentImageVideo", bundle: Bundle.resourceBundle(for: Nexilis.self))
+                        if (self.textFieldSend.textColor != .lightGray) {
+                            previewImageVC.currentTextTextField = self.textFieldSend.text
+                        }
+                        previewImageVC.fromCopy = true
+                        previewImageVC.isGIF = true
+                        previewImageVC.dataGIF = data
+                        previewImageVC.modalPresentationStyle = .custom
+                        previewImageVC.delegate = self
+                        previewImageVC.isAck = self.isAck
+                        previewImageVC.isConfidential = self.isConfidential
+                        previewImageVC.isCC = self.isContactCenter
+                        self.present(previewImageVC, animated: true, completion: nil)
+                    }
+                }
+            }
+        } else if result.itemProvider.hasItemConformingToTypeIdentifier("public.image") {
+            result.itemProvider.loadObject(ofClass: UIImage.self) { object, error in
+                if let image = object as? UIImage {
+                    DispatchQueue.main.async {
+                        let previewImageVC = PreviewAttachmentImageVideo(nibName: "PreviewAttachmentImageVideo", bundle: Bundle.resourceBundle(for: Nexilis.self))
+                        if (self.textFieldSend.textColor != .lightGray) {
+                            previewImageVC.currentTextTextField = self.textFieldSend.text
+                        }
+                        previewImageVC.fromCopy = true
+                        previewImageVC.image = image
+                        previewImageVC.modalPresentationStyle = .custom
+                        previewImageVC.delegate = self
+                        previewImageVC.isAck = self.isAck
+                        previewImageVC.isConfidential = self.isConfidential
+                        previewImageVC.isCC = self.isContactCenter
+                        self.present(previewImageVC, animated: true, completion: nil)
+                    }
+                }
+            }
+        } else if result.itemProvider.hasItemConformingToTypeIdentifier("public.movie") {
+            result.itemProvider.loadFileRepresentation(forTypeIdentifier: "public.movie") { tempURL, error in
+                if let tempURL = tempURL {
+                    let fileManager = FileManager.default
+                    let documentsDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
+                    let destinationURL = documentsDirectory.appendingPathComponent(tempURL.lastPathComponent)
+                    do {
+                        if fileManager.fileExists(atPath: destinationURL.path) {
+                            try fileManager.removeItem(at: destinationURL)
+                        }
+                        try fileManager.copyItem(at: tempURL, to: destinationURL)
+                        DispatchQueue.main.async {
+                            let previewImageVC = PreviewAttachmentImageVideo(nibName: "PreviewAttachmentImageVideo", bundle: Bundle.resourceBundle(for: Nexilis.self))
+                            if (self.textFieldSend.textColor != .lightGray) {
+                                previewImageVC.currentTextTextField = self.textFieldSend.text
+                            }
+                            previewImageVC.modalPresentationStyle = .custom
+                            previewImageVC.urlVideoPhpPicker = destinationURL
+                            previewImageVC.delegate = self
+                            previewImageVC.isAck = self.isAck
+                            previewImageVC.isConfidential = self.isConfidential
+                            previewImageVC.isCC = self.isContactCenter
+                            self.present(previewImageVC, animated: true, completion: nil)
+                        }
+                    } catch {
+                        print("Error copying video file: \(error.localizedDescription)")
+                    }
+                }
+            }
+        }
+    }
+    
     func sendChatFromPreviewImage(message_text: String, attachment_flag: String, image_id: String, video_id: String, thumb_id: String, gif_id: String, viewController: UIViewController) {
         sendChat(message_text: message_text, attachment_flag: attachment_flag, image_id: image_id, video_id: video_id, thumb_id: thumb_id, viewController: viewController, gif_id : gif_id)
     }

+ 38 - 9
NexilisLite/NexilisLite/Source/View/Chat/PreviewAttachmentImageVideo.swift

@@ -28,6 +28,7 @@ class PreviewAttachmentImageVideo: UIViewController, UIScrollViewDelegate, UITex
     @IBOutlet weak var constraintButtonAckCondential: NSLayoutConstraint!
     var imageVideoData: [UIImagePickerController.InfoKey: Any]?
     var image: UIImage?
+    var urlVideoPhpPicker: URL?
     var dataGIF: Data?
     var animatedImageView: SDAnimatedImageView!
     var currentTextTextField: String?
@@ -68,7 +69,27 @@ class PreviewAttachmentImageVideo: UIViewController, UIScrollViewDelegate, UITex
                 imagePreview.image = imageVideoData![.originalImage] as? UIImage
             }
         } else {
-            if isGIF {
+            if urlVideoPhpPicker != nil {
+                do {
+                    let asset = AVURLAsset(url: urlVideoPhpPicker!, options: nil)
+                    let imgGenerator = AVAssetImageGenerator(asset: asset)
+                    imgGenerator.appliesPreferredTrackTransform = true
+                    let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(value: 0, timescale: 1), actualTime: nil)
+                    let thumbnail = UIImage(cgImage: cgImage)
+                    imagePreview.image = thumbnail
+                    let symbolPlay = UIImageView(image: UIImage(systemName: "play.circle.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 50, weight: .bold, scale: .default)))
+                    imagePreview.addSubview(symbolPlay)
+                    symbolPlay.tintColor = .black.withAlphaComponent(0.5)
+                    symbolPlay.translatesAutoresizingMaskIntoConstraints = false
+                    symbolPlay.centerXAnchor.constraint(equalTo: imagePreview.centerXAnchor).isActive = true
+                    symbolPlay.centerYAnchor.constraint(equalTo: imagePreview.centerYAnchor).isActive = true
+                    let objectTap = ObjectGesture(target: self, action: #selector(previewImageVideoTapped(_:)))
+                    scrollViewImage.addGestureRecognizer(objectTap)
+                    objectTap.videoURL = urlVideoPhpPicker as? NSURL
+                } catch let error {
+                    print("*** Error generating thumbnail: \(error.localizedDescription)")
+                }
+            } else if isGIF {
                 animatedImageView = SDAnimatedImageView()
                 animatedImageView.contentMode = .scaleAspectFit
                 imagePreview.addSubview(animatedImageView)
@@ -289,22 +310,22 @@ class PreviewAttachmentImageVideo: UIViewController, UIScrollViewDelegate, UITex
     }
     
     @objc func sendTapped() {
-        if (fromCopy && image != nil) || (imageVideoData != nil && imageVideoData![.mediaType] as! String == "public.image") {
+        if (image != nil) || (imageVideoData != nil && imageVideoData![.mediaType] as! String == "public.image") {
             var originalImageName = ""
             if (fromCopy) {
-                originalImageName = "\(Date().currentTimeMillis())_copyImage"
+                originalImageName = "\(Date().currentTimeMillis())"
             } else if (imageVideoData![.imageURL] == nil) {
-                originalImageName = "\(Date().currentTimeMillis())_takeImage"
+                originalImageName = "takeImage_\(Date().currentTimeMillis())"
             } else {
                 let urlImage = (imageVideoData![.imageURL] as! NSURL).absoluteString
                 originalImageName = (urlImage! as NSString).lastPathComponent
             }
             let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
-            let compressedImageName = "THUMB-Nexilis_image_\(originalImageName)"
+            let compressedImageName = "Nexilis_image_\(originalImageName)"
             let thumbName = "THUMB_Nexilis_image_\(originalImageName)"
             let fileURL = documentsDirectory.appendingPathComponent(compressedImageName)
             var compressedImage:Data?
-            if (fromCopy) {
+            if (image != nil) {
                 compressedImage = image!.jpegData(compressionQuality:  1.0)
             } else {
                 compressedImage = (imageVideoData![.originalImage] as! UIImage).jpegData(compressionQuality:  1.0)
@@ -337,8 +358,12 @@ class PreviewAttachmentImageVideo: UIViewController, UIScrollViewDelegate, UITex
             }
         } else {
             var dataVideo: Data?
-            if imageVideoData != nil {
-                dataVideo = try? Data(contentsOf: imageVideoData![.mediaURL] as! URL)
+            if imageVideoData != nil || urlVideoPhpPicker != nil {
+                if imageVideoData != nil {
+                    dataVideo = try? Data(contentsOf: imageVideoData![.mediaURL] as! URL)
+                } else {
+                    dataVideo = try? Data(contentsOf: urlVideoPhpPicker!)
+                }
             }
             if var dataVideo = dataVideo {
                 let sizeOfVideo = Double(dataVideo.count / 1048576)
@@ -382,7 +407,11 @@ class PreviewAttachmentImageVideo: UIViewController, UIScrollViewDelegate, UITex
                 renamedVideoName = "Nexilis_gif_\(originalVideoName)"
                 thumbName = "THUMB_Nexilis_gif_\(originalVideoName)"
             } else {
-                urlVideo = (imageVideoData![.mediaURL] as! NSURL).absoluteString!
+                if imageVideoData != nil {
+                    urlVideo = (imageVideoData![.mediaURL] as! NSURL).absoluteString!
+                } else {
+                    urlVideo = (urlVideoPhpPicker! as NSURL).absoluteString!
+                }
                 originalVideoName = (urlVideo as NSString).lastPathComponent
                 renamedVideoName = "Nexilis_video_\(originalVideoName)"
                 thumbName = "THUMB_Nexilis_video_\(originalVideoName)"