Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add completion handler compatible with UIActivityViewControllerCompletionHandler and re-using iOS6 compatible activities name. #63

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion REActivityViewController/REActivity.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@

typedef void (^REActivityActionBlock)(REActivity *activity, REActivityViewController *activityViewController);

@interface REActivity : NSObject
@interface REActivity : NSObject <NSCoding>

@property (readonly) NSString *activityType;
@property (strong, readonly, nonatomic) NSString *title;
@property (strong, readonly, nonatomic) UIImage *image;
@property (copy, nonatomic) REActivityActionBlock actionBlock;
Expand Down
20 changes: 20 additions & 0 deletions REActivityViewController/REActivity.m
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,24 @@ - (id)initWithTitle:(NSString *)title image:(UIImage *)image actionBlock:(REActi
return self;
}

-(NSString *)activityType
{
return NSStringFromClass([self class]);
}

-(void)encodeWithCoder:(NSCoder *)aCoder
{
// [aCoder encodeObject:self.title forKey:@"title"];
// [aCoder encodeObject:self.image forKey:@"image"];
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [self init];
if(self) {
// self.title = [aDecoder decodeObjectForKey:@"title"];
}
return self;
}

@end
2 changes: 2 additions & 0 deletions REActivityViewController/REActivityDelegateObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
@interface REActivityDelegateObject : NSObject <MFMessageComposeViewControllerDelegate, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate>

@property (strong, nonatomic) UIViewController *controller;
@property (strong, nonatomic) UIActivityViewControllerCompletionHandler sharingCompletion;
@property (strong, nonatomic) NSString* activityType;

+ (REActivityDelegateObject *)sharedObject;

Expand Down
24 changes: 22 additions & 2 deletions REActivityViewController/REActivityDelegateObject.m
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,32 @@ + (REActivityDelegateObject *)sharedObject

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
[self.controller dismissViewControllerAnimated:YES completion:nil];
UIActivityViewControllerCompletionHandler sharingCompletion = self.sharingCompletion;
NSString* activityType = self.activityType;
self.sharingCompletion = nil;
self.activityType = nil;

[self.controller dismissViewControllerAnimated:YES completion:^(void)
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if(sharingCompletion) sharingCompletion(activityType, result == MessageComposeResultSent);
}];
}];
}

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
[self.controller dismissViewControllerAnimated:YES completion:nil];
UIActivityViewControllerCompletionHandler sharingCompletion = self.sharingCompletion;
NSString* activityType = self.activityType;
self.sharingCompletion = nil;
self.activityType = nil;

[self.controller dismissViewControllerAnimated:YES completion:^(void)
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if(sharingCompletion) sharingCompletion(activityType, (result == MFMailComposeResultSent) && (error == nil));
}];
}];
}

@end
8 changes: 8 additions & 0 deletions REActivityViewController/REActivityView.m
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,10 @@ - (void)layoutSubviews
- (void)cancelButtonPressed
{
[_activityViewController dismissViewControllerAnimated:YES completion:nil];
UIActivityViewControllerCompletionHandler completionHandler = [_activityViewController completionHandler];
if(completionHandler) {
completionHandler(nil, NO);
}
}

- (void)buttonPressed:(UIButton *)button
Expand All @@ -256,6 +260,10 @@ - (void)buttonPressed:(UIButton *)button
if (activity.actionBlock) {
activity.actionBlock(activity, _activityViewController);
}
/*UIActivityViewControllerCompletionHandler completionHandler = [_activityViewController completionHandler];
if(completionHandler) {
completionHandler([activity activityType], YES);
}*/
}

#pragma mark -
Expand Down
1 change: 1 addition & 0 deletions REActivityViewController/REActivityViewController.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
@property (weak, nonatomic) UIPopoverController *presentingPopoverController;
@property (weak, nonatomic) UIViewController *presentingController;
@property (weak, nonatomic) UIViewController *rootViewController;
@property (nonatomic,copy) UIActivityViewControllerCompletionHandler completionHandler; // set to nil after call

- (id)initWithViewController:(UIViewController *)viewController activities:(NSArray *)activities;
- (void)presentFromRootViewController;
Expand Down
7 changes: 6 additions & 1 deletion REActivityViewController/RECopyActivity.m
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ - (id)init
if (url)
[UIPasteboard generalPasteboard].URL = url;
if (image) {
NSData *imageData = UIImageJPEGRepresentation(image, 0.75f);
NSData *imageData = UIImagePNGRepresentation(image);
[[UIPasteboard generalPasteboard] setData:imageData
forPasteboardType:[UIPasteboardTypeListImage objectAtIndex:0]];
}
Expand All @@ -59,4 +59,9 @@ - (id)init
return self;
}

-(NSString *)activityType
{
return UIActivityTypeCopyToPasteboard;
}

@end
5 changes: 5 additions & 0 deletions REActivityViewController/REFacebookActivity.m
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,9 @@ - (void)shareFromViewController:(UIViewController *)viewController text:(NSStrin
[viewController presentViewController:facebookViewComposer animated:YES completion:nil];
}

-(NSString *)activityType
{
return UIActivityTypePostToFacebook;
}

@end
25 changes: 21 additions & 4 deletions REActivityViewController/REMailActivity.m
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ - (id)init
NSDictionary *userInfo = weakSelf.userInfo ? weakSelf.userInfo : activityViewController.userInfo;
NSString *subject = [userInfo objectForKey:@"subject"];
NSString *text = [userInfo objectForKey:@"text"];
id attachment = [userInfo objectForKey:@"attachment"];
id attachment = [userInfo objectForKey:@"image"];
NSURL *url = [userInfo objectForKey:@"url"];

[activityViewController dismissViewControllerAnimated:YES completion:^{
Expand All @@ -60,7 +60,7 @@ - (id)init
[mailComposeViewController setMessageBody:url.absoluteString isHTML:YES];

if (text && url)
[mailComposeViewController setMessageBody:[NSString stringWithFormat:@"%@ %@", text, url.absoluteString] isHTML:YES];
[mailComposeViewController setMessageBody:[NSString stringWithFormat:@"%@ <a href=\"%@\">%@</a>", text, url.absoluteString, url.absoluteString] isHTML:YES];

if (attachment) {
if ([attachment isKindOfClass:[NSString class]] || [attachment isKindOfClass:[NSURL class]]) {
Expand Down Expand Up @@ -93,19 +93,36 @@ - (id)init
[alertView show];
}
} else if ([attachment isKindOfClass:[UIImage class]]) {
[mailComposeViewController addAttachmentData:UIImageJPEGRepresentation(attachment, 0.75f) mimeType:@"image/jpeg" fileName:@"image.jpg"];
[mailComposeViewController addAttachmentData:UIImagePNGRepresentation(attachment) mimeType:@"image/png" fileName:@"image.png"];
}
}

if (subject)
[mailComposeViewController setSubject:subject];


[REActivityDelegateObject sharedObject].sharingCompletion = activityViewController.completionHandler;
[REActivityDelegateObject sharedObject].activityType = activity.activityType;

[activityViewController.presentingController presentViewController:mailComposeViewController animated:YES completion:nil];
}
else
{
UIActivityViewControllerCompletionHandler sharingCompletion = activityViewController.completionHandler;
NSString* activityType = activity.activityType;

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if(sharingCompletion) sharingCompletion(activityType, NO);
}];
}
}];
};

return self;
}

-(NSString *)activityType
{
return UIActivityTypeMail;
}

@end
46 changes: 45 additions & 1 deletion REActivityViewController/REMessageActivity.m
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ - (id)init
NSDictionary *userInfo = weakSelf.userInfo ? weakSelf.userInfo : activityViewController.userInfo;
NSString *text = [userInfo objectForKey:@"text"];
NSURL *url = [userInfo objectForKey:@"url"];
id attachment = [userInfo objectForKey:@"image"];

[activityViewController dismissViewControllerAnimated:YES completion:^{
if (![MFMessageComposeViewController canSendText])
return;
Expand All @@ -59,12 +61,54 @@ - (id)init

if (text && url)
messageComposeViewController.body = [NSString stringWithFormat:@"%@ %@", text, url.absoluteString];


if (attachment) {
if ([attachment isKindOfClass:[NSString class]] || [attachment isKindOfClass:[NSURL class]]) {
NSURL *attachmentURL = nil;
if ([attachment isKindOfClass:[NSString class]]) {
attachmentURL = [NSURL URLWithString:attachment];
} else {
attachmentURL = attachment;
}

NSURLRequest *attachmentURLRequest = [NSURLRequest requestWithURL:attachmentURL];
NSError *error = nil;
NSURLResponse *response = nil;

NSData *attachmentData = [NSURLConnection sendSynchronousRequest:attachmentURLRequest
returningResponse:&response
error:&error];
if (!error) {
NSString *attachmentFileName = [attachmentURL lastPathComponent];

[messageComposeViewController addAttachmentData:attachmentData typeIdentifier:@"public.data" filename:attachmentFileName];
} else {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedStringFromTable(@"activity.Message.error.title", @"REActivityViewController", @"Error.")
message:NSLocalizedStringFromTable(@"activity.Mail.error.message", @"REActivityViewController", error)
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];

[alertView show];
}
} else if ([attachment isKindOfClass:[UIImage class]]) {
[messageComposeViewController addAttachmentData:UIImagePNGRepresentation(attachment) typeIdentifier:@"public.data" filename:@"image.png"];
}
}

[REActivityDelegateObject sharedObject].sharingCompletion = activityViewController.completionHandler;
[REActivityDelegateObject sharedObject].activityType = activity.activityType;

[activityViewController.presentingController presentViewController:messageComposeViewController animated:YES completion:nil];
}];
};

return self;
}

-(NSString *)activityType
{
return UIActivityTypeMessage;
}

@end
11 changes: 10 additions & 1 deletion REActivityViewController/REPocketActivity.m
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,16 @@ - (id)initWithConsumerKey:(NSString *)consumerKey
- (void)saveURL:(NSURL *)url
{
if (!url) return;
[[PocketAPI sharedAPI] saveURL:url handler:nil];

UIActivityViewControllerCompletionHandler sharingCompletion = self.activityViewController.completionHandler;
NSString* activityType = self.activityType;

[[PocketAPI sharedAPI] saveURL:url handler:^(PocketAPI *api, NSURL *url, NSError *error)
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if(sharingCompletion) sharingCompletion(activityType, error == nil);
}];
}];
}

@end
14 changes: 13 additions & 1 deletion REActivityViewController/REPrintActivity.m
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ - (id)init
pc.printInfo = printInfo;

pc.printingItem = [userInfo objectForKey:@"image"];


UIActivityViewControllerCompletionHandler sharingCompletion = activityViewController.completionHandler;
NSString* activityType = activity.activityType;

void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
if (!completed && error) {
Expand All @@ -61,6 +64,10 @@ - (id)init

[av show];
}

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if(sharingCompletion) sharingCompletion(activityType, !completed && error);
}];
};

[pc presentAnimated:YES completionHandler:completionHandler];
Expand All @@ -70,4 +77,9 @@ - (id)init
return self;
}

-(NSString *)activityType
{
return UIActivityTypePrint;
}

@end
16 changes: 15 additions & 1 deletion REActivityViewController/REReadabilityActivity.m
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ - (void)showAuthDialogWithActivityViewController:(REActivityViewController *)act
[alertView show];
}];
};

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
[presenter presentViewController:navigationController animated:YES completion:nil];
Expand Down Expand Up @@ -124,7 +125,20 @@ - (void)bookmark:(NSDictionary *)userInfo
NSURL *url = [userInfo objectForKey:@"url"];
NSDictionary *parameters = @{@"url": url.absoluteString};
NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:@"/api/rest/v1/bookmarks" parameters:parameters];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:nil failure:nil];

UIActivityViewControllerCompletionHandler sharingCompletion = self.activityViewController.completionHandler;
NSString* activityType = self.activityType;

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if(sharingCompletion) sharingCompletion(activityType, YES);
}];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if(sharingCompletion) sharingCompletion(activityType, NO);
}];
}];

[client enqueueHTTPRequestOperation:operation];
}

Expand Down
17 changes: 15 additions & 2 deletions REActivityViewController/RESaveToCameraRollActivity.m
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,27 @@ - (id)init
[activityViewController dismissViewControllerAnimated:YES completion:nil];
NSDictionary *userInfo = weakSelf.userInfo ? weakSelf.userInfo : activityViewController.userInfo;
UIImage *image = [userInfo objectForKey:@"image"];


UIActivityViewControllerCompletionHandler sharingCompletion = activityViewController.completionHandler;
NSString* activityType = activity.activityType;

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageToSavedPhotosAlbum:image.CGImage
orientation:(ALAssetOrientation)image.imageOrientation
completionBlock:nil];
completionBlock:^(NSURL *assetURL, NSError *error)
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if(sharingCompletion) sharingCompletion(activityType, error == nil);
}];
}];
};

return self;
}

-(NSString *)activityType
{
return UIActivityTypeSaveToCameraRoll;
}

@end
Loading