Improve handling of contacts.

pull/1/head
Matthew Chen 8 years ago
parent d85ccd1aa8
commit 6e70c479eb

@ -441,7 +441,7 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
}.retainUntilComplete() }.retainUntilComplete()
} }
private func itemMatchesSpecificUtiType(itemProvider: NSItemProvider, utiType: String) -> Bool { private class func itemMatchesSpecificUtiType(itemProvider: NSItemProvider, utiType: String) -> Bool {
// URLs, contacts and other special items have to be detected separately. // URLs, contacts and other special items have to be detected separately.
// Many shares (e.g. pdfs) will register many UTI types and/or conform to kUTTypeData. // Many shares (e.g. pdfs) will register many UTI types and/or conform to kUTTypeData.
guard itemProvider.registeredTypeIdentifiers.count == 1 else { guard itemProvider.registeredTypeIdentifiers.count == 1 else {
@ -453,17 +453,17 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
return firstUtiType == utiType return firstUtiType == utiType
} }
private func isUrlItem(itemProvider: NSItemProvider) -> Bool { private class func isUrlItem(itemProvider: NSItemProvider) -> Bool {
return itemMatchesSpecificUtiType(itemProvider:itemProvider, return itemMatchesSpecificUtiType(itemProvider:itemProvider,
utiType:kUTTypeURL as String) utiType:kUTTypeURL as String)
} }
private func isContactItem(itemProvider: NSItemProvider) -> Bool { private class func isContactItem(itemProvider: NSItemProvider) -> Bool {
return itemMatchesSpecificUtiType(itemProvider:itemProvider, return itemMatchesSpecificUtiType(itemProvider:itemProvider,
utiType:kUTTypeContact as String) utiType:kUTTypeContact as String)
} }
private func isSpecialItem(itemProvider: NSItemProvider) -> Bool { private class func isSpecialItem(itemProvider: NSItemProvider) -> Bool {
if isUrlItem(itemProvider:itemProvider) { if isUrlItem(itemProvider:itemProvider) {
return true return true
} else if isContactItem(itemProvider:itemProvider) { } else if isContactItem(itemProvider:itemProvider) {
@ -473,7 +473,7 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
} }
} }
private func utiTypeForItem(itemProvider: NSItemProvider) -> String? { private class func utiTypeForItem(itemProvider: NSItemProvider) -> String? {
Logger.info("\(self.logTag) utiTypeForItem: \(itemProvider.registeredTypeIdentifiers)") Logger.info("\(self.logTag) utiTypeForItem: \(itemProvider.registeredTypeIdentifiers)")
if isUrlItem(itemProvider:itemProvider) { if isUrlItem(itemProvider:itemProvider) {
@ -508,7 +508,7 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
} }
Logger.info("\(self.logTag) attachment: \(itemProvider)") Logger.info("\(self.logTag) attachment: \(itemProvider)")
guard let utiType = utiTypeForItem(itemProvider: itemProvider) else { guard let utiType = ShareViewController.utiTypeForItem(itemProvider: itemProvider) else {
let error = ShareViewControllerError.unsupportedMedia let error = ShareViewControllerError.unsupportedMedia
return Promise(error: error) return Promise(error: error)
} }
@ -516,6 +516,8 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
let (promise, fulfill, reject) = Promise<URL>.pending() let (promise, fulfill, reject) = Promise<URL>.pending()
var customFileName: String?
itemProvider.loadItem(forTypeIdentifier: utiType, options: nil, completionHandler: { itemProvider.loadItem(forTypeIdentifier: utiType, options: nil, completionHandler: {
(provider, error) in (provider, error) in
@ -533,6 +535,11 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
Logger.info("\(self.logTag) provider type: \(type(of:provider))") Logger.info("\(self.logTag) provider type: \(type(of:provider))")
if let data = provider as? Data { if let data = provider as? Data {
if ShareViewController.itemMatchesSpecificUtiType(itemProvider:itemProvider,
utiType:kUTTypeVCard as String) {
customFileName = "Contact.vcf"
}
let tempDirPath = NSTemporaryDirectory() let tempDirPath = NSTemporaryDirectory()
var tempFileName = NSUUID().uuidString var tempFileName = NSUUID().uuidString
if let customFileExtension = MIMETypeUtil.fileExtension(forUTIType:utiType) { if let customFileExtension = MIMETypeUtil.fileExtension(forUTIType:utiType) {
@ -585,7 +592,9 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
guard let dataSource = rawDataSource else { guard let dataSource = rawDataSource else {
throw ShareViewControllerError.assertionError(description: "Unable to read attachment data") throw ShareViewControllerError.assertionError(description: "Unable to read attachment data")
} }
if utiType != (kUTTypeURL as String) { if let customFileName = customFileName {
dataSource.sourceFilename = customFileName
} else if utiType != (kUTTypeURL as String) {
// Ignore the filename for URLs. // Ignore the filename for URLs.
dataSource.sourceFilename = url.lastPathComponent dataSource.sourceFilename = url.lastPathComponent
} }
@ -654,7 +663,7 @@ public class ShareViewController: UINavigationController, ShareViewDelegate, SAE
// Perhaps the AVFoundation APIs require some extra file system permssion we don't have in the // Perhaps the AVFoundation APIs require some extra file system permssion we don't have in the
// passed through URL. // passed through URL.
private func isVideoNeedingRelocation(itemProvider: NSItemProvider, itemUrl: URL) -> Bool { private func isVideoNeedingRelocation(itemProvider: NSItemProvider, itemUrl: URL) -> Bool {
if isSpecialItem(itemProvider:itemProvider) { if ShareViewController.isSpecialItem(itemProvider:itemProvider) {
return false return false
} }

Loading…
Cancel
Save