From 45106409cf0cf17dfffc0dc0e1a576bee2527a11 Mon Sep 17 00:00:00 2001 From: huguesbr Date: Fri, 8 Nov 2013 11:09:58 -0800 Subject: [PATCH 1/3] Add completion handler compatible with UIActivityViewControllerCompletionHandler to the activityViewController, which return the selected activity type. Adding activityType to each activity to return which activity have been chose, and adding to each default iOS activities the right activity type, others activity return their own class type. --- REActivityViewController/REActivity.h | 1 + REActivityViewController/REActivity.m | 5 +++++ REActivityViewController/REActivityView.m | 8 ++++++++ REActivityViewController/REActivityViewController.h | 1 + REActivityViewController/RECopyActivity.m | 5 +++++ REActivityViewController/REFacebookActivity.m | 5 +++++ REActivityViewController/REMailActivity.m | 5 +++++ REActivityViewController/REMessageActivity.m | 5 +++++ REActivityViewController/REPrintActivity.m | 5 +++++ REActivityViewController/RESaveToCameraRollActivity.m | 5 +++++ REActivityViewController/RESinaWeiboActivity.m | 5 +++++ REActivityViewController/RETwitterActivity.m | 5 +++++ 12 files changed, 55 insertions(+) diff --git a/REActivityViewController/REActivity.h b/REActivityViewController/REActivity.h index bd0b81a..cacf056 100644 --- a/REActivityViewController/REActivity.h +++ b/REActivityViewController/REActivity.h @@ -32,6 +32,7 @@ typedef void (^REActivityActionBlock)(REActivity *activity, REActivityViewContro @interface REActivity : NSObject +@property (readonly) NSString *activityType; @property (strong, readonly, nonatomic) NSString *title; @property (strong, readonly, nonatomic) UIImage *image; @property (copy, nonatomic) REActivityActionBlock actionBlock; diff --git a/REActivityViewController/REActivity.m b/REActivityViewController/REActivity.m index 09b2157..369090d 100644 --- a/REActivityViewController/REActivity.m +++ b/REActivityViewController/REActivity.m @@ -38,4 +38,9 @@ - (id)initWithTitle:(NSString *)title image:(UIImage *)image actionBlock:(REActi return self; } +-(NSString *)activityType +{ + return [self class]; +} + @end diff --git a/REActivityViewController/REActivityView.m b/REActivityViewController/REActivityView.m index 0fe47bd..84baf00 100644 --- a/REActivityViewController/REActivityView.m +++ b/REActivityViewController/REActivityView.m @@ -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 @@ -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 - diff --git a/REActivityViewController/REActivityViewController.h b/REActivityViewController/REActivityViewController.h index b0b9346..694048d 100644 --- a/REActivityViewController/REActivityViewController.h +++ b/REActivityViewController/REActivityViewController.h @@ -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; diff --git a/REActivityViewController/RECopyActivity.m b/REActivityViewController/RECopyActivity.m index 3f96db6..56f2947 100644 --- a/REActivityViewController/RECopyActivity.m +++ b/REActivityViewController/RECopyActivity.m @@ -59,4 +59,9 @@ - (id)init return self; } +-(NSString *)activityType +{ + return UIActivityTypeCopyToPasteboard; +} + @end diff --git a/REActivityViewController/REFacebookActivity.m b/REActivityViewController/REFacebookActivity.m index 73bd1e1..0c2967d 100644 --- a/REActivityViewController/REFacebookActivity.m +++ b/REActivityViewController/REFacebookActivity.m @@ -69,4 +69,9 @@ - (void)shareFromViewController:(UIViewController *)viewController text:(NSStrin [viewController presentViewController:facebookViewComposer animated:YES completion:nil]; } +-(NSString *)activityType +{ + return UIActivityTypePostToFacebook; +} + @end diff --git a/REActivityViewController/REMailActivity.m b/REActivityViewController/REMailActivity.m index 31997c5..8be214a 100644 --- a/REActivityViewController/REMailActivity.m +++ b/REActivityViewController/REMailActivity.m @@ -108,4 +108,9 @@ - (id)init return self; } +-(NSString *)activityType +{ + return UIActivityTypeMail; +} + @end diff --git a/REActivityViewController/REMessageActivity.m b/REActivityViewController/REMessageActivity.m index f8fe2ff..48be10b 100644 --- a/REActivityViewController/REMessageActivity.m +++ b/REActivityViewController/REMessageActivity.m @@ -67,4 +67,9 @@ - (id)init return self; } +-(NSString *)activityType +{ + return UIActivityTypeMessage; +} + @end diff --git a/REActivityViewController/REPrintActivity.m b/REActivityViewController/REPrintActivity.m index 8ddcdc5..bde9b7c 100644 --- a/REActivityViewController/REPrintActivity.m +++ b/REActivityViewController/REPrintActivity.m @@ -70,4 +70,9 @@ - (id)init return self; } +-(NSString *)activityType +{ + return UIActivityTypePrint; +} + @end diff --git a/REActivityViewController/RESaveToCameraRollActivity.m b/REActivityViewController/RESaveToCameraRollActivity.m index fe533e3..6a7ccdd 100644 --- a/REActivityViewController/RESaveToCameraRollActivity.m +++ b/REActivityViewController/RESaveToCameraRollActivity.m @@ -53,4 +53,9 @@ - (id)init return self; } +-(NSString *)activityType +{ + return UIActivityTypeSaveToCameraRoll; +} + @end diff --git a/REActivityViewController/RESinaWeiboActivity.m b/REActivityViewController/RESinaWeiboActivity.m index 15759d6..53ffe62 100644 --- a/REActivityViewController/RESinaWeiboActivity.m +++ b/REActivityViewController/RESinaWeiboActivity.m @@ -71,4 +71,9 @@ - (void)shareFromViewController:(UIViewController *)viewController text:(NSStrin [viewController presentViewController:sinaWeiboViewComposer animated:YES completion:nil]; } +-(NSString *)activityType +{ + return UIActivityTypePostToWeibo; +} + @end diff --git a/REActivityViewController/RETwitterActivity.m b/REActivityViewController/RETwitterActivity.m index b6b1b7a..b7b78f8 100644 --- a/REActivityViewController/RETwitterActivity.m +++ b/REActivityViewController/RETwitterActivity.m @@ -61,4 +61,9 @@ - (id)init return self; } +-(NSString *)activityType +{ + return UIActivityTypePostToTwitter; +} + @end From 4329293e8c71694f252c5a7c52533fda247d3692 Mon Sep 17 00:00:00 2001 From: huguesbr Date: Fri, 15 Nov 2013 11:27:07 -0800 Subject: [PATCH 2/3] Fix crash coming back from safari --- REActivityViewController/REActivity.h | 2 +- REActivityViewController/REActivity.m | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/REActivityViewController/REActivity.h b/REActivityViewController/REActivity.h index cacf056..6885be0 100644 --- a/REActivityViewController/REActivity.h +++ b/REActivityViewController/REActivity.h @@ -30,7 +30,7 @@ typedef void (^REActivityActionBlock)(REActivity *activity, REActivityViewController *activityViewController); -@interface REActivity : NSObject +@interface REActivity : NSObject @property (readonly) NSString *activityType; @property (strong, readonly, nonatomic) NSString *title; diff --git a/REActivityViewController/REActivity.m b/REActivityViewController/REActivity.m index 369090d..c33bc12 100644 --- a/REActivityViewController/REActivity.m +++ b/REActivityViewController/REActivity.m @@ -43,4 +43,19 @@ -(NSString *)activityType return [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 From a4a424a99366d1129b203d866a3a789fe266d096 Mon Sep 17 00:00:00 2001 From: Virl Date: Thu, 6 Mar 2014 14:46:46 +0400 Subject: [PATCH 3/3] Sharing completion block called with success only upon real sharing completion (when content is really posted to social network). Fixed Mail and Messages image attachments. Using PNG attachment where possible. --- REActivityViewController/REActivity.m | 2 +- .../REActivityDelegateObject.h | 2 + .../REActivityDelegateObject.m | 24 ++++++- REActivityViewController/REActivityView.m | 4 +- REActivityViewController/RECopyActivity.m | 2 +- REActivityViewController/REMailActivity.m | 20 ++++-- REActivityViewController/REMessageActivity.m | 41 +++++++++++- REActivityViewController/REPocketActivity.m | 11 +++- REActivityViewController/REPrintActivity.m | 9 ++- .../REReadabilityActivity.m | 16 ++++- .../RESaveToCameraRollActivity.m | 12 +++- .../RESinaWeiboActivity.m | 12 +++- REActivityViewController/RETumblrActivity.m | 44 +++++++++++-- REActivityViewController/RETwitterActivity.m | 13 +++- REActivityViewController/REVKActivity.m | 63 ++++++++++++++----- 15 files changed, 237 insertions(+), 38 deletions(-) diff --git a/REActivityViewController/REActivity.m b/REActivityViewController/REActivity.m index c33bc12..2327467 100644 --- a/REActivityViewController/REActivity.m +++ b/REActivityViewController/REActivity.m @@ -40,7 +40,7 @@ - (id)initWithTitle:(NSString *)title image:(UIImage *)image actionBlock:(REActi -(NSString *)activityType { - return [self class]; + return NSStringFromClass([self class]); } -(void)encodeWithCoder:(NSCoder *)aCoder diff --git a/REActivityViewController/REActivityDelegateObject.h b/REActivityViewController/REActivityDelegateObject.h index f451751..051dca2 100644 --- a/REActivityViewController/REActivityDelegateObject.h +++ b/REActivityViewController/REActivityDelegateObject.h @@ -29,6 +29,8 @@ @interface REActivityDelegateObject : NSObject @property (strong, nonatomic) UIViewController *controller; +@property (strong, nonatomic) UIActivityViewControllerCompletionHandler sharingCompletion; +@property (strong, nonatomic) NSString* activityType; + (REActivityDelegateObject *)sharedObject; diff --git a/REActivityViewController/REActivityDelegateObject.m b/REActivityViewController/REActivityDelegateObject.m index f458856..724d5f1 100644 --- a/REActivityViewController/REActivityDelegateObject.m +++ b/REActivityViewController/REActivityDelegateObject.m @@ -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 diff --git a/REActivityViewController/REActivityView.m b/REActivityViewController/REActivityView.m index 84baf00..d130069 100644 --- a/REActivityViewController/REActivityView.m +++ b/REActivityViewController/REActivityView.m @@ -260,10 +260,10 @@ - (void)buttonPressed:(UIButton *)button if (activity.actionBlock) { activity.actionBlock(activity, _activityViewController); } - UIActivityViewControllerCompletionHandler completionHandler = [_activityViewController completionHandler]; + /*UIActivityViewControllerCompletionHandler completionHandler = [_activityViewController completionHandler]; if(completionHandler) { completionHandler([activity activityType], YES); - } + }*/ } #pragma mark - diff --git a/REActivityViewController/RECopyActivity.m b/REActivityViewController/RECopyActivity.m index 56f2947..361401d 100644 --- a/REActivityViewController/RECopyActivity.m +++ b/REActivityViewController/RECopyActivity.m @@ -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]]; } diff --git a/REActivityViewController/REMailActivity.m b/REActivityViewController/REMailActivity.m index 8be214a..4adb7a8 100644 --- a/REActivityViewController/REMailActivity.m +++ b/REActivityViewController/REMailActivity.m @@ -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:^{ @@ -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:@"%@ %@", text, url.absoluteString, url.absoluteString] isHTML:YES]; if (attachment) { if ([attachment isKindOfClass:[NSString class]] || [attachment isKindOfClass:[NSURL class]]) { @@ -93,15 +93,27 @@ - (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); + }]; + } }]; }; diff --git a/REActivityViewController/REMessageActivity.m b/REActivityViewController/REMessageActivity.m index 48be10b..d533327 100644 --- a/REActivityViewController/REMessageActivity.m +++ b/REActivityViewController/REMessageActivity.m @@ -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; @@ -59,7 +61,44 @@ - (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]; }]; }; diff --git a/REActivityViewController/REPocketActivity.m b/REActivityViewController/REPocketActivity.m index d2ac5e1..c0538cc 100644 --- a/REActivityViewController/REPocketActivity.m +++ b/REActivityViewController/REPocketActivity.m @@ -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 diff --git a/REActivityViewController/REPrintActivity.m b/REActivityViewController/REPrintActivity.m index bde9b7c..ac6d21e 100644 --- a/REActivityViewController/REPrintActivity.m +++ b/REActivityViewController/REPrintActivity.m @@ -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) { @@ -61,6 +64,10 @@ - (id)init [av show]; } + + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + if(sharingCompletion) sharingCompletion(activityType, !completed && error); + }]; }; [pc presentAnimated:YES completionHandler:completionHandler]; diff --git a/REActivityViewController/REReadabilityActivity.m b/REActivityViewController/REReadabilityActivity.m index 6aee2ed..2d4c504 100644 --- a/REActivityViewController/REReadabilityActivity.m +++ b/REActivityViewController/REReadabilityActivity.m @@ -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]; @@ -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]; } diff --git a/REActivityViewController/RESaveToCameraRollActivity.m b/REActivityViewController/RESaveToCameraRollActivity.m index 6a7ccdd..3d71341 100644 --- a/REActivityViewController/RESaveToCameraRollActivity.m +++ b/REActivityViewController/RESaveToCameraRollActivity.m @@ -43,11 +43,19 @@ - (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; diff --git a/REActivityViewController/RESinaWeiboActivity.m b/REActivityViewController/RESinaWeiboActivity.m index 53ffe62..171465d 100644 --- a/REActivityViewController/RESinaWeiboActivity.m +++ b/REActivityViewController/RESinaWeiboActivity.m @@ -59,7 +59,17 @@ - (void)shareFromViewController:(UIViewController *)viewController text:(NSStrin if (!sinaWeiboViewComposer) { return; } - + + UIActivityViewControllerCompletionHandler sharingCompletion = self.activityViewController.completionHandler; + NSString* activityType = self.activityType; + + sinaWeiboViewComposer.completionHandler = ^(SLComposeViewControllerResult result) + { + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + if(sharingCompletion) sharingCompletion(activityType, result == SLComposeViewControllerResultDone); + }]; + }; + viewController.modalPresentationStyle = UIModalPresentationCurrentContext; if (text) [sinaWeiboViewComposer setInitialText:text]; diff --git a/REActivityViewController/RETumblrActivity.m b/REActivityViewController/RETumblrActivity.m index 32d9882..6d18a49 100644 --- a/REActivityViewController/RETumblrActivity.m +++ b/REActivityViewController/RETumblrActivity.m @@ -163,6 +163,10 @@ - (void)shareUserInfo:(NSDictionary *)userInfo client:(AFXAuthClient *)client controller.hasAttachment = YES; controller.attachmentImage = image; } + + UIActivityViewControllerCompletionHandler sharingCompletion = self.activityViewController.completionHandler; + NSString* activityType = self.activityType; + controller.completionHandler = ^(REComposeViewController *composeViewController, REComposeResult result) { [composeViewController dismissViewControllerAnimated:YES completion:nil]; if (result == REComposeResultPosted) { @@ -172,6 +176,12 @@ - (void)shareUserInfo:(NSDictionary *)userInfo client:(AFXAuthClient *)client [weakSelf shareUsingClient:client text:composeViewController.text]; } } + else + { + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + if(sharingCompletion) sharingCompletion(activityType, NO); + }]; + } }; UIViewController *presentingViewController = self.activityViewController.rootViewController ? self.activityViewController.rootViewController : self.activityViewController.presentingController; [controller presentFromViewController:presentingViewController]; @@ -183,24 +193,46 @@ - (void)shareUsingClient:(AFXAuthClient *)client text:(NSString *)text NSDictionary *parameters = @{@"type": @"text", @"body": text}; NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:[NSString stringWithFormat:@"http://api.tumblr.com/v2/blog/%@/post", hostName] 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]; } - (void)shareUsingClient:(AFXAuthClient *)client text:(NSString *)text image:(UIImage *)image { NSString *hostName = [[NSUserDefaults standardUserDefaults] objectForKey:@"RETumblrActivity_Blog"]; - NSData *imageData = UIImageJPEGRepresentation(image, 0.8f); + NSData *imageData = UIImagePNGRepresentation(image); NSDictionary *parameters = @{@"type": @"photo", @"caption": text}; NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:[NSString stringWithFormat:@"http://api.tumblr.com/v2/blog/%@/post", hostName] parameters:parameters constructingBodyWithBlock:^(id formData) { - [formData appendPartWithFileData:imageData name:@"data" fileName:@"photo.jpg" mimeType:@"image/jpg"]; + [formData appendPartWithFileData:imageData name:@"data" fileName:@"photo.png" mimeType:@"image/png"]; }]; - - 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]; } diff --git a/REActivityViewController/RETwitterActivity.m b/REActivityViewController/RETwitterActivity.m index b7b78f8..5c161fa 100644 --- a/REActivityViewController/RETwitterActivity.m +++ b/REActivityViewController/RETwitterActivity.m @@ -42,9 +42,20 @@ - (id)init self.actionBlock = ^(REActivity *activity, REActivityViewController *activityViewController) { UIViewController *presenter = activityViewController.presentingController; NSDictionary *userInfo = weakSelf.userInfo ? weakSelf.userInfo : activityViewController.userInfo; - + + UIActivityViewControllerCompletionHandler sharingCompletion = activityViewController.completionHandler; + NSString* activityType = activity.activityType; + [activityViewController dismissViewControllerAnimated:YES completion:^{ TWTweetComposeViewController *composeController = [[TWTweetComposeViewController alloc] init]; + + composeController.completionHandler = ^(SLComposeViewControllerResult result) + { + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + if(sharingCompletion) sharingCompletion(activityType, result == SLComposeViewControllerResultDone); + }]; + }; + NSString *text = [userInfo objectForKey:@"text"]; UIImage *image = [userInfo objectForKey:@"image"]; NSURL *url = [userInfo objectForKey:@"url"]; diff --git a/REActivityViewController/REVKActivity.m b/REActivityViewController/REVKActivity.m index f2ee77c..2605a69 100644 --- a/REActivityViewController/REVKActivity.m +++ b/REActivityViewController/REVKActivity.m @@ -81,7 +81,10 @@ - (void)share if (text && url) textToShare = [NSString stringWithFormat:@"%@ %@", text, url.absoluteString]; - + + UIActivityViewControllerCompletionHandler sharingCompletion = self.activityViewController.completionHandler; + NSString* activityType = self.activityType; + REComposeViewController *controller = [[REComposeViewController alloc] init]; controller.title = NSLocalizedStringFromTable(@"activity.VKontakte.dialog.title", @"REActivityViewController", @"VKontakte"); controller.navigationBar.tintColor = [UIColor colorWithRed:56/255.0f green:99/255.0f blue:150/255.0f alpha:1.0]; @@ -100,6 +103,12 @@ - (void)share [weakSelf shareText:composeViewController.text]; } } + else + { + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + if(sharingCompletion) sharingCompletion(activityType, NO); + }]; + } }; UIViewController *presentingViewController = self.activityViewController.rootViewController ? self.activityViewController.rootViewController : self.activityViewController.presentingController; @@ -113,12 +122,19 @@ - (void)requestPhotoUploadURLWithSuccess:(void (^)(NSString *uploadURL))success { NSString *serverURL = [NSString stringWithFormat:@"https://api.vk.com/method/photos.getWallUploadServer?owner_id=%@&access_token=%@", self.ownerId, self.token]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:serverURL]]; - + + UIActivityViewControllerCompletionHandler sharingCompletion = self.activityViewController.completionHandler; + NSString* activityType = self.activityType; + AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { if (success) { success([[JSON objectForKey:@"response"] objectForKey:@"upload_url"]); } - } failure:nil]; + } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + if(sharingCompletion) sharingCompletion(activityType, NO); + }]; + }]; [operation start]; } @@ -126,22 +142,23 @@ - (void)uploadImage:(UIImage *)image toURL:(NSString *)urlString success:(void ( { NSURL *url = [NSURL URLWithString:urlString]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; - NSData *imageData = UIImageJPEGRepresentation(image, 0.75f); + NSData *imageData = UIImagePNGRepresentation(image); NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"" parameters:nil constructingBodyWithBlock:^(id formData) { - [formData appendPartWithFileData:imageData name:@"photo" fileName:@"photo.jpg" mimeType:@"image/jpg"]; + [formData appendPartWithFileData:imageData name:@"photo" fileName:@"photo.png" mimeType:@"image/png"]; }]; - + void (^parseJSON)(id JSON) = ^(id JSON){ if (success) success([JSON objectForKey:@"hash"], [JSON objectForKey:@"photo"], [JSON objectForKey:@"server"]); }; - + AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { parseJSON(JSON); } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { parseJSON(JSON); }]; + [operation start]; } @@ -150,11 +167,18 @@ - (void)saveImageToWallWithHash:(NSString *)hash photo:(NSString *)photo server: NSString *serverURL = [NSString stringWithFormat:@"https://api.vk.com/method/photos.saveWallPhoto?owner_id=%@&access_token=%@&server=%@&photo=%@&hash=%@", self.ownerId, self.token, server, photo, hash]; NSString *escapedURL = [serverURL stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:escapedURL]]; - + + UIActivityViewControllerCompletionHandler sharingCompletion = self.activityViewController.completionHandler; + NSString* activityType = self.activityType; + AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { if (success) success([[[JSON objectForKey:@"response"] objectAtIndex:0] objectForKey:@"id"]); - } failure:nil]; + } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + if(sharingCompletion) sharingCompletion(activityType, NO); + }]; + }]; [operation start]; } @@ -168,12 +192,23 @@ - (void)shareOnWall:(NSString *)text photoId:(NSString *)wallPhotoId completion: serverURL = [NSString stringWithFormat:@"https://api.vk.com/method/wall.post?owner_id=%@&access_token=%@&message=%@", self.ownerId, self.token, [self URLEncodedString:text]]; } NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:serverURL]]; - - - AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { - if (completion) + + 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); + }]; + + if (completion) completion(); - } failure:nil]; + } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + if(sharingCompletion) sharingCompletion(activityType, NO); + }]; + }]; [operation start]; }