diff --git a/SignalServiceKit/src/Util/OWSFileSystem.h b/SignalServiceKit/src/Util/OWSFileSystem.h index b2db4cd45..cf6f091ce 100644 --- a/SignalServiceKit/src/Util/OWSFileSystem.h +++ b/SignalServiceKit/src/Util/OWSFileSystem.h @@ -29,6 +29,9 @@ NS_ASSUME_NONNULL_BEGIN + (NSArray *_Nullable)allFilesInDirectoryRecursive:(NSString *)dirPath error:(NSError **)error; ++ (NSString *)temporaryFilePath; ++ (NSString *)temporaryFilePathWithFileExtension:(NSString *_Nullable)fileExtension; + // Returns nil on failure. + (nullable NSString *)writeDataToTemporaryFile:(NSData *)data fileExtension:(NSString *_Nullable)fileExtension; diff --git a/SignalServiceKit/src/Util/OWSFileSystem.m b/SignalServiceKit/src/Util/OWSFileSystem.m index 13a0bb7f4..bd089cca6 100644 --- a/SignalServiceKit/src/Util/OWSFileSystem.m +++ b/SignalServiceKit/src/Util/OWSFileSystem.m @@ -166,16 +166,28 @@ NS_ASSUME_NONNULL_BEGIN return filePaths; } -+ (nullable NSString *)writeDataToTemporaryFile:(NSData *)data fileExtension:(NSString *_Nullable)fileExtension ++ (NSString *)temporaryFilePath { - OWSAssert(data); + return [self temporaryFilePathWithFileExtension:nil]; +} ++ (NSString *)temporaryFilePathWithFileExtension:(NSString *_Nullable)fileExtension +{ NSString *temporaryDirectory = NSTemporaryDirectory(); NSString *tempFileName = NSUUID.UUID.UUIDString; if (fileExtension.length > 0) { tempFileName = [[tempFileName stringByAppendingString:@"."] stringByAppendingString:fileExtension]; } NSString *tempFilePath = [temporaryDirectory stringByAppendingPathComponent:tempFileName]; + + return tempFilePath; +} + ++ (nullable NSString *)writeDataToTemporaryFile:(NSData *)data fileExtension:(NSString *_Nullable)fileExtension +{ + OWSAssert(data); + + NSString *tempFilePath = [self temporaryFilePathWithFileExtension:fileExtension]; NSError *error; BOOL success = [data writeToFile:tempFilePath options:NSDataWritingAtomic error:&error]; if (!success || error) { diff --git a/SignalShareExtension/ShareViewController.swift b/SignalShareExtension/ShareViewController.swift index 273c9717f..b37994355 100644 --- a/SignalShareExtension/ShareViewController.swift +++ b/SignalShareExtension/ShareViewController.swift @@ -608,6 +608,19 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE } else { fulfill((itemUrl: url, utiType: srcUtiType)) } + } else if let image = value as? UIImage { + if let data = UIImagePNGRepresentation(image) { + let tempFilePath = OWSFileSystem.temporaryFilePath(withFileExtension:"png") + do { + let url = NSURL.fileURL(withPath:tempFilePath) + try data.write(to: url, options: .atomicWrite) + fulfill((url, srcUtiType)) + } catch { + reject(ShareViewControllerError.assertionError(description: "couldn't write UIImage: \(String(describing: error))")) + } + } else { + reject(ShareViewControllerError.assertionError(description: "couldn't convert UIImage to PNG: \(String(describing: error))")) + } } else { // It's unavoidable that we may sometimes receives data types that we // don't know how to handle.