Choose arbitrary attachments from iCloud/GDrive/Dropbox/etc

// FREEBIE
This commit is contained in:
Michael Kirk 2017-04-20 17:51:45 -04:00
parent b1ea340c36
commit 70d235a670
5 changed files with 119 additions and 5 deletions

View File

@ -1665,6 +1665,9 @@
com.apple.VPNLite = {
enabled = 0;
};
com.apple.iCloud = {
enabled = 1;
};
};
};
D221A0A9169C9E5F00537ABF = {

View File

@ -4,5 +4,17 @@
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.$(CFBundleIdentifier)</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
<string>CloudDocuments</string>
</array>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array>
<string>iCloud.$(CFBundleIdentifier)</string>
</array>
</dict>
</plist>

View File

@ -186,7 +186,10 @@ typedef enum : NSUInteger {
#pragma mark -
@interface MessagesViewController () <JSQMessagesComposerTextViewPasteDelegate, OWSTextViewPasteDelegate> {
@interface MessagesViewController () <JSQMessagesComposerTextViewPasteDelegate,
OWSTextViewPasteDelegate,
UIDocumentMenuDelegate,
UIDocumentPickerDelegate> {
UIImage *tappedImage;
BOOL isGroupConversation;
}
@ -2182,6 +2185,87 @@ typedef enum : NSUInteger {
[self presentViewController:actionSheetController animated:YES completion:nil];
}
#pragma mark - Attachment Picking: Documents
- (void)showAttachmentDocumentPicker
{
NSString *allItems = (__bridge NSString *)kUTTypeData;
NSArray<NSString *> *documentTypes = @[ allItems ];
// UIDocumentPickerModeImport copies to a temp file within our container.
// It uses more memory than "open" but let's us avoid working with security scoped URLs.
UIDocumentPickerMode pickerMode = UIDocumentPickerModeImport;
UIDocumentMenuViewController *menuController =
[[UIDocumentMenuViewController alloc] initWithDocumentTypes:documentTypes inMode:pickerMode];
menuController.delegate = self;
[self presentViewController:menuController animated:YES completion:nil];
}
#pragma mark UIDocumentMenuDelegate
- (void)documentMenu:(UIDocumentMenuViewController *)documentMenu
didPickDocumentPicker:(UIDocumentPickerViewController *)documentPicker
{
documentPicker.delegate = self;
[self presentViewController:documentPicker animated:YES completion:nil];
}
#pragma mark UIDocumentPickerDelegate
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url
{
DDLogDebug(@"%@ Picked document at url: %@", self.tag, url);
NSData *attachmentData = [NSData dataWithContentsOfURL:url];
NSString *type;
NSError *error;
[url getResourceValue:&type forKey:NSURLTypeIdentifierKey error:&error];
if (error) {
DDLogError(@"%@ Determining type of picked document at url: %@ failed with error: %@", self.tag, url, error);
OWSAssert(NO);
}
if (!type) {
DDLogDebug(@"%@ falling back to default filetype for picked document at url: %@", self.tag, url);
OWSAssert(NO);
type = (__bridge NSString *)kUTTypeData;
}
NSString *filename = url.lastPathComponent;
if (!filename) {
DDLogDebug(@"%@ Unable to determine filename from url: %@", self.tag, url);
OWSAssert(NO);
filename = NSLocalizedString(
@"ATTACHMENT_DEFAULT_FILENAME", @"Generic filename for an attachment with no known name");
}
if (!attachmentData || attachmentData.length == 0) {
DDLogError(@"%@ attachment data was unexpectedly empty for picked document url: %@", self.tag, url);
OWSAssert(NO);
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:NSLocalizedString(@"ATTACHMENT_PICKER_DOCUMENTS_FAILED_ALERT_TITLE",
@"Alert title when picking a document fails for an unknown reason")
message:nil
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *dismissAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"DISMISS_BUTTON_TEXT", nil)
style:UIAlertActionStyleCancel
handler:nil];
[alertController addAction:dismissAction];
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:alertController animated:YES completion:nil];
});
return;
}
OWSAssert(attachmentData);
OWSAssert(type);
OWSAssert(filename);
SignalAttachment *attachment =
[[SignalAttachment alloc] initWithData:attachmentData dataUTI:type filename:filename];
[ThreadUtil sendMessageWithAttachment:attachment inThread:self.thread messageSender:self.messageSender];
}
#pragma mark - UIImagePickerController
/*
@ -2680,7 +2764,16 @@ typedef enum : NSUInteger {
[self chooseFromLibrary];
}];
[actionSheetController addAction:chooseMediaAction];
UIAlertAction *chooseDocumentAction =
[UIAlertAction actionWithTitle:NSLocalizedString(@"MEDIA_FROM_DOCUMENT_PICKER_BUTTON",
@"action sheet button title when choosing attachment type")
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *_Nonnull action) {
[self showAttachmentDocumentPicker];
}];
[actionSheetController addAction:chooseDocumentAction];
[self presentViewController:actionSheetController animated:true completion:nil];
}

View File

@ -14,7 +14,7 @@ class AttachmentPointerView: UIView {
let isIncoming: Bool
let filename: String
let attachmentPointer: TSAttachmentPointer
let genericFilename = NSLocalizedString("ATTACHMENT_DOWNLOADING_DEFAULT_ATTACHMENT_LABEL", comment: "Generic name label when downloading an attachment with no known name.")
let genericFilename = NSLocalizedString("ATTACHMENT_DEFAULT_FILENAME", comment: "Generic filename for an attachment with no known name")
var progress: CGFloat = 0 {
didSet {

View File

@ -61,8 +61,8 @@
/* Label for 'send' button in the 'attachment approval' dialog. */
"ATTACHMENT_APPROVAL_SEND_BUTTON" = "Send";
/* Generic name label when downloading an attachment with no known name. */
"ATTACHMENT_DOWNLOADING_DEFAULT_ATTACHMENT_LABEL" = "Attachment";
/* Generic filename for an attachment with no known name */
"ATTACHMENT_DEFAULT_FILENAME" = "Attachment";
/* Status label when an attachment download has failed. */
"ATTACHMENT_DOWNLOADING_STATUS_FAILED" = "Failed. Tap to retry.";
@ -100,6 +100,9 @@
/* Accessibility label for attaching photos */
"ATTACHMENT_LABEL" = "Attachment";
/* Alert title when picking a document fails for an unknown reason */
"ATTACHMENT_PICKER_DOCUMENTS_FAILED_ALERT_TITLE" = "Failed to choose document.";
/* An explanation of the consequences of blocking another user. */
"BLOCK_BEHAVIOR_EXPLANATION" = "Blocked users will not be able to call you or send you messages.";
@ -589,6 +592,9 @@
/* media picker option to take photo or video */
"MEDIA_FROM_CAMERA_BUTTON" = "Camera";
/* action sheet button title when choosing attachment type */
"MEDIA_FROM_DOCUMENT_PICKER_BUTTON" = "Document";
/* media picker option to choose from library */
"MEDIA_FROM_LIBRARY_BUTTON" = "Photo Library";