| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -450,7 +450,30 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // TODO accept other data types
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // TODO whitelist attachment types
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // TODO coerce when necessary and possible
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return promise.then { (url: URL) -> Promise<SignalAttachment> in
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return promise.then { (itemUrl: URL) -> Promise<SignalAttachment> in
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            let url: URL = try {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // iOS converts at least some video formats (e.g. com.apple.quicktime-movie) into mp4s as part of the
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // NSItemProvider `loadItem` API.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // However, for some reason, AVFoundation operations such as generating a preview image and playing
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // the url in the AVMoviePlayer fail on these converted formats until unless we first copy the media
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // into our container. (These operations succeed when resending mp4s received and sent in Signal)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                //
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // I don't understand why this is, and I haven't found any relevant documentation in the NSItemProvider
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // or AVFoundation docs.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                //
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // I *did* verify that the size and sah256 sum of the original url matches that of the copied url.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // Perhaps the AVFoundation API's require some extra file system permssion we don't have in the
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // passed through URL.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                if MIMETypeUtil.isSupportedVideoFile(itemUrl.path) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    return try SignalAttachment.copyToVideoTempDir(url: itemUrl)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                } else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    return itemUrl
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            Logger.debug("\(self.logTag) building DataSource with url: \(url)")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            guard let dataSource = DataSourcePath.dataSource(with: url) else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                throw ShareViewControllerError.assertionError(description: "Unable to read attachment data")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -467,7 +490,8 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            guard !SignalAttachment.isInvalidVideo(dataSource: dataSource, dataUTI: specificUTIType) else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // TODO show progress with exportSession
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // This can happen, e.g. when sharing a quicktime-video from iCloud drive.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                let (promise, exportSession) = SignalAttachment.compressVideoAsMp4(dataSource: dataSource, dataUTI: specificUTIType)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // Can we move this process to the end of the share flow rather than up front?
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -488,8 +512,6 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                return promise
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            // DO NOT COMMIT
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				//            specificUTIType = "com.apple.quicktime-movie"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            let attachment = SignalAttachment.attachment(dataSource: dataSource, dataUTI: specificUTIType, imageQuality: .medium)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return Promise(value: attachment)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |