From c224d11417e3ea7c1329ed3896bb2eb440c2a9c6 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Mon, 16 Mar 2020 19:05:58 -0400 Subject: [PATCH] Allow pasting and drag/dropping video attachments on compose screen --- Tusker/Models/CompositionAttachment.swift | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Tusker/Models/CompositionAttachment.swift b/Tusker/Models/CompositionAttachment.swift index 27d1d585..13f0f5ec 100644 --- a/Tusker/Models/CompositionAttachment.swift +++ b/Tusker/Models/CompositionAttachment.swift @@ -27,6 +27,8 @@ final class CompositionAttachment: NSObject, Codable { } private let imageType = kUTTypeImage as String +private let mp4Type = kUTTypeMPEG4 as String +private let quickTimeType = kUTTypeQuickTimeMovie as String private let dataType = kUTTypeData as String extension CompositionAttachment: NSItemProviderWriting { @@ -61,7 +63,10 @@ extension CompositionAttachment: NSItemProviderWriting { extension CompositionAttachment: NSItemProviderReading { static var readableTypeIdentifiersForItemProvider: [String] { - [typeIdentifier] + UIImage.readableTypeIdentifiersForItemProvider + NSURL.readableTypeIdentifiersForItemProvider + // todo: is there a better way of handling movies than manually adding all possible UTI types? + // just using kUTTypeMovie doesn't work, because we need the actually type in order to get the file extension + // without the file extension, getting the thumbnail and exporting the video for attachment upload fails + [typeIdentifier] + UIImage.readableTypeIdentifiersForItemProvider + [mp4Type, quickTimeType] + NSURL.readableTypeIdentifiersForItemProvider } static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self { @@ -69,6 +74,13 @@ extension CompositionAttachment: NSItemProviderReading { return try PropertyListDecoder().decode(Self.self, from: data) } else if UIImage.readableTypeIdentifiersForItemProvider.contains(typeIdentifier), let image = try? UIImage.object(withItemProviderData: data, typeIdentifier: typeIdentifier) { return CompositionAttachment(data: .image(image)) as! Self + } else if typeIdentifier == mp4Type || typeIdentifier == quickTimeType { + let temporaryDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true) + let temporaryFileName = ProcessInfo().globallyUniqueString + let fileExt = UTTypeCopyPreferredTagWithClass(typeIdentifier as CFString, kUTTagClassFilenameExtension)! + let temporaryFileURL = temporaryDirectoryURL.appendingPathComponent(temporaryFileName).appendingPathExtension(fileExt.takeUnretainedValue() as String) + try data.write(to: temporaryFileURL) + return CompositionAttachment(data: .video(temporaryFileURL)) as! Self } else if NSURL.readableTypeIdentifiersForItemProvider.contains(typeIdentifier), let url = try? NSURL.object(withItemProviderData: data, typeIdentifier: typeIdentifier) as URL { return CompositionAttachment(data: .video(url)) as! Self } else {