Include filename, support sharing all other image types

// FREEBIE
pull/1/head
Michael Kirk 8 years ago
parent 3eceb86371
commit 3036337a5a

@ -382,41 +382,62 @@ public class ShareViewController: UINavigationController, SAELoadViewDelegate, S
} }
// TODO Multiple attachments. In that case I'm unclear if we'll // TODO Multiple attachments. In that case I'm unclear if we'll
// be given multile inputItems or a signle inputItem with multiple attachments. // be given multiple inputItems or a single inputItem with multiple attachments.
guard let itemProvider: NSItemProvider = inputItem.attachments?.first as? NSItemProvider else { guard let itemProvider: NSItemProvider = inputItem.attachments?.first as? NSItemProvider else {
let error = ShareViewControllerError.assertionError(description: "No item provider in input item attachments") let error = ShareViewControllerError.assertionError(description: "No item provider in input item attachments")
return Promise(error: error) return Promise(error: error)
} }
Logger.info("\(self.logTag) attachment: \(itemProvider)") Logger.info("\(self.logTag) attachment: \(itemProvider)")
guard itemProvider.hasItemConformingToTypeIdentifier(kUTTypeJPEG as String) else { // TODO support other utiTypes
let error = ShareViewControllerError.assertionError(description: "only supporting jpegs for now") let utiType = kUTTypeImage as String
guard itemProvider.hasItemConformingToTypeIdentifier(utiType) else {
let error = ShareViewControllerError.assertionError(description: "only supporting images for now")
return Promise(error: error) return Promise(error: error)
} }
let (promise, fulfill, reject) = Promise<UIImage>.pending() let (promise, fulfill, reject) = Promise<URL>.pending()
itemProvider.loadItem(forTypeIdentifier: utiType, options: nil, completionHandler: {
(provider, error) in
guard error == nil else {
reject(error!)
return
}
guard let url = provider as? URL else {
let unexpectedTypeError = ShareViewControllerError.assertionError(description: "unexpected item type: \(String(describing: provider))")
reject(unexpectedTypeError)
return
}
fulfill(url)
})
// TODO accept other data types // TODO accept other data types
// TODO whitelist attachment types // TODO whitelist attachment types
// TODO coerce when necessary and possible // TODO coerce when necessary and possible
itemProvider.loadPreviewImage(options: nil, return promise.then { (url: URL) -> SignalAttachment in
completionHandler: { (previewImage, error) in // TODO use lazy DataProvider?
guard error == nil else { guard let dataSource = DataSourcePath.dataSource(with: url) else {
reject(error!) throw ShareViewControllerError.assertionError(description: "Unable to read attachment data")
return }
} dataSource.sourceFilename = url.lastPathComponent
guard let image = previewImage as? UIImage else { // start with base utiType, but it might be something generic like "image"
let unexpectedTypeError = ShareViewControllerError.assertionError(description: "unexpected item type: \(String(describing: previewImage))") var specificUTIType = utiType
reject(unexpectedTypeError) if url.pathExtension.count > 0 {
return // Determine a more specific utiType based on file extension
} if let typeExtension = MIMETypeUtil.utiType(forFileExtension: url.pathExtension) {
specificUTIType = typeExtension
fulfill(image) }
}) }
let attachment = SignalAttachment.attachment(dataSource: dataSource, dataUTI: specificUTIType)
return promise.then { (image: UIImage) in return attachment
return SignalAttachment.imageAttachment(image: image, dataUTI: kUTTypeJPEG as String, filename: "from-share-extension-2345")
} }
} }
} }

Loading…
Cancel
Save