diff --git a/REActivityViewController/REActivity.h b/REActivityViewController/REActivity.h index bd0b81a..6885be0 100644 --- a/REActivityViewController/REActivity.h +++ b/REActivityViewController/REActivity.h @@ -30,8 +30,9 @@ typedef void (^REActivityActionBlock)(REActivity *activity, REActivityViewController *activityViewController); -@interface REActivity : NSObject +@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..2327467 100644 --- a/REActivityViewController/REActivity.m +++ b/REActivityViewController/REActivity.m @@ -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 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 0fe47bd..d130069 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..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]]; } @@ -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..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,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 diff --git a/REActivityViewController/REMessageActivity.m b/REActivityViewController/REMessageActivity.m index f8fe2ff..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]; }]; }; @@ -67,4 +106,9 @@ - (id)init return self; } +-(NSString *)activityType +{ + return UIActivityTypeMessage; +} + @end 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 8ddcdc5..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]; @@ -70,4 +77,9 @@ - (id)init return self; } +-(NSString *)activityType +{ + return UIActivityTypePrint; +} + @end 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 fe533e3..3d71341 100644 --- a/REActivityViewController/RESaveToCameraRollActivity.m +++ b/REActivityViewController/RESaveToCameraRollActivity.m @@ -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 diff --git a/REActivityViewController/RESinaWeiboActivity.m b/REActivityViewController/RESinaWeiboActivity.m index 15759d6..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]; @@ -71,4 +81,9 @@ - (void)shareFromViewController:(UIViewController *)viewController text:(NSStrin [viewController presentViewController:sinaWeiboViewComposer animated:YES completion:nil]; } +-(NSString *)activityType +{ + return UIActivityTypePostToWeibo; +} + @end 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 b6b1b7a..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"]; @@ -61,4 +72,9 @@ - (id)init return self; } +-(NSString *)activityType +{ + return UIActivityTypePostToTwitter; +} + @end 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]; }