From 0630286dcc12d5e97e28b3578f6ff3145d57f012 Mon Sep 17 00:00:00 2001
From: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
Date: Thu, 30 Apr 2020 16:02:18 -0400
Subject: [PATCH] conversations: data transfer from Files

This patch fixes creating data transfer from Files(iCloud)

Change-Id: I02b91744439c9a32c1b949965fda77394dc85eec
---
 Ring/Ring/Extensions/String+Helpers.swift     | 34 +++++++++++++++++++
 .../ConversationViewController.swift          | 34 ++++---------------
 .../Conversation/MessageViewModel.swift       | 17 +---------
 3 files changed, 42 insertions(+), 43 deletions(-)

diff --git a/Ring/Ring/Extensions/String+Helpers.swift b/Ring/Ring/Extensions/String+Helpers.swift
index 5f04b7cd1..3fbafddbe 100644
--- a/Ring/Ring/Extensions/String+Helpers.swift
+++ b/Ring/Ring/Extensions/String+Helpers.swift
@@ -21,6 +21,7 @@
  */
 
 import Foundation
+import MobileCoreServices
 
 extension String {
     func toBool() -> Bool? {
@@ -97,4 +98,37 @@ extension String {
     var boolValue: Bool {
         return (self as NSString).boolValue
     }
+
+    func isMediaExtension() -> Bool {
+        let uti = UTTypeCreatePreferredIdentifierForTag(
+            kUTTagClassFilenameExtension,
+            self as CFString,
+            nil)
+
+        var fileIsMedia = false
+        if let value = uti?.takeRetainedValue(),
+            UTTypeConformsTo(value, kUTTypeMovie) || UTTypeConformsTo(value, kUTTypeVideo)
+                || UTTypeConformsTo(value, kUTTypeAudio) {
+            fileIsMedia = true
+        }
+        let mediaExtension = ["ogg", "webm"]
+        if mediaExtension.contains(where: {$0.compare(self, options: .caseInsensitive) == .orderedSame}) {
+            fileIsMedia = true
+        }
+        return fileIsMedia
+    }
+
+    func isImageExtension() -> Bool {
+        let uti = UTTypeCreatePreferredIdentifierForTag(
+            kUTTagClassFilenameExtension,
+            self as CFString,
+            nil)
+
+        var fileIsImage = false
+        if let value = uti?.takeRetainedValue(),
+            UTTypeConformsTo(value, kUTTypeImage) {
+            fileIsImage = true
+        }
+        return fileIsImage
+    }
 }
diff --git a/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.swift b/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.swift
index decc5f333..c21a1eab4 100644
--- a/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.swift
+++ b/Ring/Ring/Features/Conversations/Conversation/ConversationViewController.swift
@@ -115,35 +115,15 @@ class ConversationViewController: UIViewController,
         let filePath = urls[0].absoluteURL.path
         self.log.debug("Successfully imported \(filePath)")
         let fileName = urls[0].absoluteURL.lastPathComponent
-
-        let result = PHAsset.fetchAssets(withALAssetURLs: urls, options: nil)
-
-        guard let localCachePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName) else {
+        let fileExtension = urls[0].pathExtension
+        if !fileExtension.isMediaExtension() && !fileExtension.isImageExtension() {
+            self.viewModel.sendFile(filePath: filePath, displayName: fileName)
             return
         }
-        self.log.debug("localCachePath: \(String(describing: localCachePath))")
-
-        guard let phAsset = result.firstObject else { return }
-
-        if phAsset.mediaType == .video {
-            PHImageManager.default()
-                .requestAVAsset(forVideo: phAsset,
-                                options: PHVideoRequestOptions(),
-                                resultHandler: { (asset, _, _) -> Void in
-                                    guard let asset = asset as? AVURLAsset else {
-                                        self.log.error("couldn't get asset")
-                                        return
-                                    }
-                                    guard let videoData = NSData(contentsOf: asset.url) else {
-                                        self.log.error("couldn't get movie data")
-                                        return
-                                    }
-                                    self.log.debug("copying movie to: \(String(describing: localCachePath))")
-                                    videoData.write(toFile: localCachePath.path, atomically: true)
-                                    self.viewModel.sendAndSaveFile(displayName: fileName,
-                                                                   imageData: videoData as Data)
-                })
-        } else {
+        do {
+            let data = try Data(contentsOf: urls[0])
+            self.viewModel.sendAndSaveFile(displayName: fileName, imageData: data)
+        } catch {
             self.viewModel.sendFile(filePath: filePath, displayName: fileName)
         }
     }
diff --git a/Ring/Ring/Features/Conversations/Conversation/MessageViewModel.swift b/Ring/Ring/Features/Conversations/Conversation/MessageViewModel.swift
index 35a8ea36c..86c55b7e3 100644
--- a/Ring/Ring/Features/Conversations/Conversation/MessageViewModel.swift
+++ b/Ring/Ring/Features/Conversations/Conversation/MessageViewModel.swift
@@ -246,22 +246,7 @@ class MessageViewModel {
         guard let fileExtension = NSURL(fileURLWithPath: name).pathExtension else {
             return nil
         }
-        let uti = UTTypeCreatePreferredIdentifierForTag(
-            kUTTagClassFilenameExtension,
-            fileExtension as CFString,
-            nil)
-
-        var fileIsMedia = false
-        if let value = uti?.takeRetainedValue(),
-            UTTypeConformsTo(value, kUTTypeMovie) || UTTypeConformsTo(value, kUTTypeVideo)
-                || UTTypeConformsTo(value, kUTTypeAudio) {
-            fileIsMedia = true
-                   }
-        let mediaExtension = ["ogg", "webm"]
-        if mediaExtension.contains(where: {$0.compare(fileExtension, options: .caseInsensitive) == .orderedSame}) {
-            fileIsMedia = true
-        }
-        if fileIsMedia {
+        if fileExtension.isMediaExtension() {
             // first search for incoming video in downloads folder and for outgoing in recorded
             let folderName = self.message.incoming ? Directories.downloads.rawValue : Directories.recorded.rawValue
             var path = self.dataTransferService
-- 
GitLab