Merge branch 'charlesmchen/arbitraryAttachments'

pull/1/head
Matthew Chen 7 years ago
commit c1f2ae61b6

@ -54,8 +54,6 @@ enum TSImageQuality {
// [SignalAttachment hasError] will be true for non-valid attachments. // [SignalAttachment hasError] will be true for non-valid attachments.
// //
// TODO: Perhaps do conversion off the main thread? // TODO: Perhaps do conversion off the main thread?
// TODO: Show error on error.
// TODO: Show progress on upload.
class SignalAttachment: NSObject { class SignalAttachment: NSObject {
static let TAG = "[SignalAttachment]" static let TAG = "[SignalAttachment]"
@ -195,8 +193,6 @@ class SignalAttachment: NSObject {
return fileExtension.takeRetainedValue() as String return fileExtension.takeRetainedValue() as String
} }
private static let allowArbitraryAttachments = false
// Returns the set of UTIs that correspond to valid _input_ image formats // Returns the set of UTIs that correspond to valid _input_ image formats
// for Signal attachments. // for Signal attachments.
// //
@ -209,17 +205,7 @@ class SignalAttachment: NSObject {
// Returns the set of UTIs that correspond to valid _output_ image formats // Returns the set of UTIs that correspond to valid _output_ image formats
// for Signal attachments. // for Signal attachments.
private class var outputImageUTISet: Set<String> { private class var outputImageUTISet: Set<String> {
if allowArbitraryAttachments { return MIMETypeUtil.supportedImageUTITypes().union(animatedImageUTISet)
return MIMETypeUtil.supportedImageUTITypes().union(animatedImageUTISet)
} else {
// Until Android client can handle arbitrary attachments,
// restrict output.
return [
kUTTypeJPEG as String,
kUTTypeGIF as String,
kUTTypePNG as String
]
}
} }
// Returns the set of UTIs that correspond to valid animated image formats // Returns the set of UTIs that correspond to valid animated image formats
@ -231,32 +217,13 @@ class SignalAttachment: NSObject {
// Returns the set of UTIs that correspond to valid video formats // Returns the set of UTIs that correspond to valid video formats
// for Signal attachments. // for Signal attachments.
private class var videoUTISet: Set<String> { private class var videoUTISet: Set<String> {
if allowArbitraryAttachments { return MIMETypeUtil.supportedVideoUTITypes()
return MIMETypeUtil.supportedVideoUTITypes()
} else {
return [
kUTTypeMPEG4 as String
]
}
} }
// Returns the set of UTIs that correspond to valid audio formats // Returns the set of UTIs that correspond to valid audio formats
// for Signal attachments. // for Signal attachments.
private class var audioUTISet: Set<String> { private class var audioUTISet: Set<String> {
if allowArbitraryAttachments { return MIMETypeUtil.supportedAudioUTITypes()
return MIMETypeUtil.supportedAudioUTITypes()
} else {
return [
kUTTypeMP3 as String,
kUTTypeMPEG4Audio as String
]
}
}
// Returns the set of UTIs that correspond to valid input formats
// for Signal attachments.
public class var validInputUTISet: Set<String> {
return inputImageUTISet.union(videoUTISet.union(audioUTISet))
} }
public var isImage: Bool { public var isImage: Bool {
@ -276,16 +243,7 @@ class SignalAttachment: NSObject {
} }
public class func pasteboardHasPossibleAttachment() -> Bool { public class func pasteboardHasPossibleAttachment() -> Bool {
guard UIPasteboard.general.numberOfItems >= 1 else { return UIPasteboard.general.numberOfItems > 0
return false
}
// If pasteboard contains multiple items, use only the first.
let itemSet = IndexSet(integer:0)
guard let pasteboardUTITypes = UIPasteboard.general.types(forItemSet:itemSet) else {
return false
}
let pasteboardUTISet = Set<String>(pasteboardUTITypes[0])
return pasteboardUTISet.intersection(validInputUTISet).count > 0
} }
// Returns an attachment from the pasteboard, or nil if no attachment // Returns an attachment from the pasteboard, or nil if no attachment
@ -306,7 +264,8 @@ class SignalAttachment: NSObject {
for dataUTI in inputImageUTISet { for dataUTI in inputImageUTISet {
if pasteboardUTISet.contains(dataUTI) { if pasteboardUTISet.contains(dataUTI) {
guard let data = dataForFirstPasteboardItem(dataUTI:dataUTI) else { guard let data = dataForFirstPasteboardItem(dataUTI:dataUTI) else {
Logger.verbose("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)") Logger.error("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)")
assertionFailure()
return nil return nil
} }
return imageAttachment(data : data, dataUTI : dataUTI) return imageAttachment(data : data, dataUTI : dataUTI)
@ -315,7 +274,8 @@ class SignalAttachment: NSObject {
for dataUTI in videoUTISet { for dataUTI in videoUTISet {
if pasteboardUTISet.contains(dataUTI) { if pasteboardUTISet.contains(dataUTI) {
guard let data = dataForFirstPasteboardItem(dataUTI:dataUTI) else { guard let data = dataForFirstPasteboardItem(dataUTI:dataUTI) else {
Logger.verbose("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)") Logger.error("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)")
assertionFailure()
return nil return nil
} }
return videoAttachment(data : data, dataUTI : dataUTI) return videoAttachment(data : data, dataUTI : dataUTI)
@ -324,15 +284,21 @@ class SignalAttachment: NSObject {
for dataUTI in audioUTISet { for dataUTI in audioUTISet {
if pasteboardUTISet.contains(dataUTI) { if pasteboardUTISet.contains(dataUTI) {
guard let data = dataForFirstPasteboardItem(dataUTI:dataUTI) else { guard let data = dataForFirstPasteboardItem(dataUTI:dataUTI) else {
Logger.verbose("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)") Logger.error("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)")
assertionFailure()
return nil return nil
} }
return audioAttachment(data : data, dataUTI : dataUTI) return audioAttachment(data : data, dataUTI : dataUTI)
} }
} }
// TODO: We could handle generic attachments at this point.
return nil let dataUTI = pasteboardUTISet[pasteboardUTISet.startIndex]
guard let data = dataForFirstPasteboardItem(dataUTI:dataUTI) else {
Logger.error("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)")
assertionFailure()
return nil
}
return genericAttachment(data : data, dataUTI : dataUTI)
} }
// This method should only be called for dataUTIs that // This method should only be called for dataUTIs that
@ -340,15 +306,18 @@ class SignalAttachment: NSObject {
private class func dataForFirstPasteboardItem(dataUTI: String) -> Data? { private class func dataForFirstPasteboardItem(dataUTI: String) -> Data? {
let itemSet = IndexSet(integer:0) let itemSet = IndexSet(integer:0)
guard let datas = UIPasteboard.general.data(forPasteboardType:dataUTI, inItemSet:itemSet) else { guard let datas = UIPasteboard.general.data(forPasteboardType:dataUTI, inItemSet:itemSet) else {
Logger.verbose("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)") Logger.error("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)")
assertionFailure()
return nil return nil
} }
guard datas.count > 0 else { guard datas.count > 0 else {
Logger.verbose("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)") Logger.error("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)")
assertionFailure()
return nil return nil
} }
guard let data = datas[0] as? Data else { guard let data = datas[0] as? Data else {
Logger.verbose("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)") Logger.error("\(TAG) Missing expected pasteboard data for UTI: \(dataUTI)")
assertionFailure()
return nil return nil
} }
return data return data

Loading…
Cancel
Save