2
0
MasterPassword/External/google-plus-ios-sdk/SampleCode/GooglePlusSampleShareViewController.m
Maarten Billemont a6e3b83ebb Dumped Google+ SDK.
[UPDATED]   Google+ SDK.
2013-04-27 17:14:05 -04:00

704 lines
22 KiB
Objective-C

//
// GooglePlusSampleShareViewController.m
//
// Copyright 2012 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#import "GooglePlusSampleShareViewController.h"
#import <QuartzCore/QuartzCore.h>
#import "GPPSignIn.h"
#import "GTLPlusConstants.h"
#import "GTMOAuth2Authentication.h"
@interface GooglePlusSampleShareViewController()
- (void)animateKeyboard:(NSNotification *)notification
shouldShow:(BOOL)shouldShow;
- (void)layout;
- (void)placeView:(UIView *)view x:(CGFloat)x y:(CGFloat)y;
- (void)populateTextFields;
@end
@implementation GooglePlusSampleShareViewController
@synthesize callToActions = callToActions_;
@synthesize selectedCallToAction = selectedCallToAction_;
@synthesize callToActionPickerView = callToActionPickerView_;
@synthesize addContentDeepLinkSwitch = addContentDeepLinkSwitch_;
@synthesize contentDeepLinkDescription = contentDeepLinkDescription_;
@synthesize contentDeepLinkID = contentDeepLinkID_;
@synthesize contentDeepLinkTitle = contentDeepLinkTitle_;
@synthesize contentDeepLinkThumbnailURL = contentDeepLinkThumbnailURL_;
@synthesize sharePrefillText = sharePrefillText_;
@synthesize shareURL = shareURL_;
@synthesize shareStatus = shareStatus_;
@synthesize shareToolbar = shareToolbar_;
@synthesize shareScrollView = shareScrollView_;
@synthesize shareView = shareView_;
@synthesize addContentDeepLinkLabel = addContentDeepLinkLabel_;
@synthesize urlToShareLabel = urlToShareLabel_;
@synthesize prefillTextLabel = prefillTextLabel_;
@synthesize contentDeepLinkIDLabel = contentDeepLinkIDLabel_;
@synthesize contentDeepLinkTitleLabel = contentDeepLinkTitleLabel_;
@synthesize contentDeepLinkDescriptionLabel =
contentDeepLinkDescriptionLabel_;
@synthesize contentDeepLinkThumbnailURLLabel =
contentDeepLinkThumbnailURLLabel_;
@synthesize shareButton = shareButton_;
@synthesize urlForContentDeepLinkMetadataSwitch =
urlForContentDeepLinkMetadataSwitch_;
@synthesize urlForContentDeepLinkMetadataLabel =
urlForContentDeepLinkMetadataLabel_;
@synthesize addCallToActionButtonSwitch = addCallToActionButtonSwitch_;
@synthesize addCallToActionButtonLabel = addCallToActionButtonLabel_;
- (void)dealloc {
[callToActions_ release];
[selectedCallToAction_ release];
[callToActionPickerView_ release];
[addContentDeepLinkSwitch_ release];
[contentDeepLinkID_ release];
[contentDeepLinkTitle_ release];
[contentDeepLinkDescription_ release];
[contentDeepLinkThumbnailURL_ release];
[sharePrefillText_ release];
[shareURL_ release];
[shareStatus_ release];
[shareToolbar_ release];
[shareScrollView_ release];
[shareView_ release];
[addContentDeepLinkLabel_ release];
[urlToShareLabel_ release];
[prefillTextLabel_ release];
[contentDeepLinkIDLabel_ release];
[contentDeepLinkTitleLabel_ release];
[contentDeepLinkDescriptionLabel_ release];
[contentDeepLinkThumbnailURLLabel_ release];
[shareButton_ release];
[urlForContentDeepLinkMetadataSwitch_ release];
[urlForContentDeepLinkMetadataLabel_ release];
[addCallToActionButtonSwitch_ release];
[addCallToActionButtonLabel_ release];
[super dealloc];
}
#pragma mark - View lifecycle
- (void)viewDidLoad {
// Set up Google+ share dialog.
[GPPShare sharedInstance].delegate = self;
[addCallToActionButtonSwitch_ setOn:NO];
[addContentDeepLinkSwitch_ setOn:NO];
if (![GPPSignIn sharedInstance].authentication ||
![[GPPSignIn sharedInstance].scopes containsObject:
kGTLAuthScopePlusLogin]) {
addCallToActionButtonLabel_.text = @"Sign in for call-to-action";
addCallToActionButtonSwitch_.enabled = NO;
}
addCallToActionButtonLabel_.adjustsFontSizeToFitWidth = YES;
self.callToActions = [NSArray arrayWithObjects:
@"ACCEPT",
@"ACCEPT_GIFT",
@"ADD",
@"ANSWER",
@"ADD_TO_CALENDAR",
@"APPLY",
@"ASK",
@"ATTACK",
@"BEAT",
@"BID",
@"BOOK",
@"BOOKMARK",
@"BROWSE",
@"BUY",
@"CAPTURE",
@"CHALLENGE",
@"CHANGE",
@"CHECKIN",
@"CLICK_HERE",
@"CLICK_ME",
@"COLLECT",
@"COMMENT",
@"COMPARE",
@"COMPLAIN",
@"CONFIRM",
@"CONNECT",
@"CONTRIBUTE",
@"COOK",
@"CREATE",
@"DEFEND",
@"DINE",
@"DISCOVER",
@"DISCUSS",
@"DONATE",
@"DOWNLOAD",
@"EARN",
@"EAT",
@"EXPLAIN",
@"FOLLOW",
@"GET",
@"GIFT",
@"GIVE",
@"GO",
@"HELP",
@"IDENTIFY",
@"INSTALL_APP",
@"INTRODUCE",
@"INVITE",
@"JOIN",
@"JOIN_ME",
@"LEARN",
@"LEARN_MORE",
@"LISTEN",
@"LOVE",
@"MAKE",
@"MATCH",
@"OFFER",
@"OPEN",
@"OPEN_APP",
@"OWN",
@"PAY",
@"PIN",
@"PLAN",
@"PLAY",
@"RATE",
@"READ",
@"RECOMMEND",
@"RECORD",
@"REDEEM",
@"REPLY",
@"RESERVE",
@"REVIEW",
@"RSVP",
@"SAVE",
@"SAVE_OFFER",
@"SELL",
@"SEND",
@"SHARE_X",
@"SIGN_IN",
@"SIGN_UP",
@"START",
@"ST0P",
@"TEST",
@"UPVOTE",
@"VIEW",
@"VIEW_ITEM",
@"VIEW_PROFILE",
@"VISIT",
@"VOTE",
@"WANT",
@"WATCH",
@"WRITE",
nil
];
self.selectedCallToAction = [callToActions_ objectAtIndex:0];
self.callToActionPickerView = [[[UIPickerView alloc] init] autorelease];
callToActionPickerView_.delegate = self;
callToActionPickerView_.dataSource = self;
[addCallToActionButtonSwitch_ addTarget:self
action:@selector(addCallToActionSwitched)
forControlEvents:UIControlEventValueChanged];
[self layout];
[self populateTextFields];
[super viewDidLoad];
}
- (void)viewDidUnload {
[GPPShare sharedInstance].delegate = nil;
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIKeyboardWillHideNotification
object:nil];
[self setAddContentDeepLinkSwitch:nil];
[self setContentDeepLinkID:nil];
[self setContentDeepLinkTitle:nil];
[self setContentDeepLinkDescription:nil];
[self setContentDeepLinkThumbnailURL:nil];
[self setShareScrollView:nil];
[self setShareView:nil];
[self setShareToolbar:nil];
[self setAddContentDeepLinkLabel:nil];
[self setUrlToShareLabel:nil];
[self setPrefillTextLabel:nil];
[self setContentDeepLinkIDLabel:nil];
[self setContentDeepLinkTitleLabel:nil];
[self setContentDeepLinkDescriptionLabel:nil];
[self setContentDeepLinkThumbnailURLLabel:nil];
[self setShareButton:nil];
[self setUrlForContentDeepLinkMetadataSwitch:nil];
[self setUrlForContentDeepLinkMetadataLabel:nil];
[self setAddCallToActionButtonSwitch:nil];
[self setAddCallToActionButtonLabel:nil];
[super viewDidUnload];
}
- (void)viewWillAppear:(BOOL)animated {
if ([[UIDevice currentDevice] userInterfaceIdiom]
== UIUserInterfaceIdiomPad) {
shareScrollView_.frame = self.view.frame;
}
[super viewWillAppear:animated];
// Register for keyboard notifications while visible.
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
// Unregister for keyboard notifications while not visible.
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIKeyboardWillHideNotification
object:nil];
[super viewWillDisappear:animated];
}
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField {
activeField_ = textField;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
activeField_ = nil;
}
#pragma mark - GPPShareDelegate
- (void)finishedSharing:(BOOL)shared {
NSString *text = shared ? @"Success" : @"Canceled";
shareStatus_.text = [NSString stringWithFormat:@"Status: %@", text];
}
#pragma mark - UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet
didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0) {
[self shareButton:nil];
} else if (buttonIndex == 1) {
shareStatus_.text = @"Status: Sharing...";
MFMailComposeViewController *picker =
[[[MFMailComposeViewController alloc] init] autorelease];
picker.mailComposeDelegate = self;
[picker setSubject:sharePrefillText_.text];
[picker setMessageBody:shareURL_.text isHTML:NO];
[self presentModalViewController:picker animated:YES];
}
}
#pragma mark - MFMailComposeViewControllerDelegate
- (void)mailComposeController:(MFMailComposeViewController *)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError*)error {
NSString *text;
switch (result) {
case MFMailComposeResultCancelled:
text = @"Canceled";
break;
case MFMailComposeResultSaved:
text = @"Saved";
break;
case MFMailComposeResultSent:
text = @"Sent";
break;
case MFMailComposeResultFailed:
text = @"Failed";
break;
default:
text = @"Not sent";
break;
}
shareStatus_.text = [NSString stringWithFormat:@"Status: %@", text];
[self dismissModalViewControllerAnimated:YES];
}
#pragma mark - UIKeyboard
- (void)keyboardWillShow:(NSNotification *)notification {
[self animateKeyboard:notification shouldShow:YES];
}
- (void)keyboardWillHide:(NSNotification *)notification {
[self animateKeyboard:notification shouldShow:NO];
}
#pragma mark - IBActions
- (IBAction)shareButton:(id)sender {
shareStatus_.text = @"Status: Sharing...";
id<GPPShareBuilder> shareBuilder = [[GPPShare sharedInstance] shareDialog];
NSString *inputURL = shareURL_.text;
NSURL *urlToShare = [inputURL length] ? [NSURL URLWithString:inputURL] : nil;
if (urlToShare) {
[shareBuilder setURLToShare:urlToShare];
}
if ([contentDeepLinkID_ text]) {
[shareBuilder setContentDeepLinkID:[contentDeepLinkID_ text]];
NSString *title = [contentDeepLinkTitle_ text];
NSString *description = [contentDeepLinkDescription_ text];
if (title && description) {
NSURL *thumbnailURL =
[NSURL URLWithString:[contentDeepLinkThumbnailURL_ text]];
[shareBuilder setTitle:title
description:description
thumbnailURL:thumbnailURL];
}
}
NSString *inputText = sharePrefillText_.text;
NSString *text = [inputText length] ? inputText : nil;
if (text) {
[shareBuilder setPrefillText:text];
}
if ([addCallToActionButtonSwitch_ isOn]) {
// Please replace the URL below with your own call-to-action button URL.
NSURL *callToActionURL = [NSURL URLWithString:
@"http://developers.google.com/+/mobile/ios/"];
[shareBuilder setCallToActionButtonWithLabel:selectedCallToAction_
URL:callToActionURL
deepLinkID:@"call-to-action"];
}
if (![shareBuilder open]) {
shareStatus_.text = @"Status: Error (see console).";
}
}
- (IBAction)shareToolbar:(id)sender {
UIActionSheet *actionSheet =
[[[UIActionSheet alloc] initWithTitle:@"Share this post"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Google+", @"Email", nil]
autorelease];
[actionSheet showFromToolbar:shareToolbar_];
}
- (IBAction)urlForContentDeepLinkMetadataSwitchToggle:(id)sender {
[self layout];
[self populateTextFields];
}
- (IBAction)contentDeepLinkSwitchToggle:(id)sender {
if (!addContentDeepLinkSwitch_.on) {
[urlForContentDeepLinkMetadataSwitch_ setOn:YES];
}
[self layout];
[self populateTextFields];
}
#pragma mark - Helper methods
- (void)placeView:(UIView *)view x:(CGFloat)x y:(CGFloat)y {
CGSize frameSize = view.frame.size;
view.frame = CGRectMake(x, y, frameSize.width, frameSize.height);
}
- (void)layout {
CGFloat originX = 20.0;
CGFloat originY = 10.0;
CGFloat yPadding = 10.0;
CGFloat currentY = originY;
CGFloat middleX = 150;
// Place the switch for adding call-to-action button.
[self placeView:addCallToActionButtonLabel_ x:originX y:currentY];
[self placeView:addCallToActionButtonSwitch_ x:middleX * 1.5 y:currentY];
CGSize frameSize = addCallToActionButtonSwitch_.frame.size;
currentY += frameSize.height + yPadding;
// Place the switch for attaching content deep-link data.
[self placeView:addContentDeepLinkLabel_ x:originX y:currentY];
[self placeView:addContentDeepLinkSwitch_ x:middleX * 1.5 y:currentY];
frameSize = addContentDeepLinkSwitch_.frame.size;
currentY += frameSize.height + yPadding;
// Place the switch for preview URL.
if (addContentDeepLinkSwitch_.on) {
[self placeView:urlForContentDeepLinkMetadataLabel_ x:originX y:currentY];
[self placeView:urlForContentDeepLinkMetadataSwitch_
x:middleX * 1.5
y:currentY];
frameSize = urlForContentDeepLinkMetadataSwitch_.frame.size;
currentY += frameSize.height + yPadding;
urlForContentDeepLinkMetadataSwitch_.hidden = NO;
urlForContentDeepLinkMetadataLabel_.hidden = NO;
} else {
urlForContentDeepLinkMetadataSwitch_.hidden = YES;
urlForContentDeepLinkMetadataLabel_.hidden = YES;
}
// Place the field for URL to share.
if (urlForContentDeepLinkMetadataSwitch_.on) {
[self placeView:urlToShareLabel_ x:originX y:currentY];
frameSize = urlToShareLabel_.frame.size;
currentY += frameSize.height + 0.5 * yPadding;
[self placeView:shareURL_ x:originX y:currentY];
frameSize = shareURL_.frame.size;
currentY += frameSize.height + yPadding;
urlToShareLabel_.hidden = NO;
shareURL_.hidden = NO;
} else {
urlToShareLabel_.hidden = YES;
shareURL_.hidden = YES;
}
// Place the field for prefill text.
[self placeView:prefillTextLabel_ x:originX y:currentY];
frameSize = prefillTextLabel_.frame.size;
currentY += frameSize.height + 0.5 * yPadding;
[self placeView:sharePrefillText_ x:originX y:currentY];
frameSize = sharePrefillText_.frame.size;
currentY += frameSize.height + yPadding;
// Place the content deep-link ID field.
if (addContentDeepLinkSwitch_.on) {
[self placeView:contentDeepLinkIDLabel_ x:originX y:currentY];
frameSize = contentDeepLinkIDLabel_.frame.size;
currentY += frameSize.height + 0.5 * yPadding;
[self placeView:contentDeepLinkID_ x:originX y:currentY];
frameSize = contentDeepLinkID_.frame.size;
currentY += frameSize.height + yPadding;
contentDeepLinkIDLabel_.hidden = NO;
contentDeepLinkID_.hidden = NO;
} else {
contentDeepLinkIDLabel_.hidden = YES;
contentDeepLinkID_.hidden = YES;
}
// Place fields for content deep-link metadata.
if (addContentDeepLinkSwitch_.on &&
!urlForContentDeepLinkMetadataSwitch_.on) {
[self placeView:contentDeepLinkTitleLabel_ x:originX y:currentY];
frameSize = contentDeepLinkTitleLabel_.frame.size;
currentY += frameSize.height + 0.5 * yPadding;
[self placeView:contentDeepLinkTitle_ x:originX y:currentY];
frameSize = contentDeepLinkTitle_.frame.size;
currentY += frameSize.height + yPadding;
[self placeView:contentDeepLinkDescriptionLabel_ x:originX y:currentY];
frameSize = contentDeepLinkDescriptionLabel_.frame.size;
currentY += frameSize.height + 0.5 * yPadding;
[self placeView:contentDeepLinkDescription_ x:originX y:currentY];
frameSize = contentDeepLinkDescription_.frame.size;
currentY += frameSize.height + yPadding;
[self placeView:contentDeepLinkThumbnailURLLabel_ x:originX y:currentY];
frameSize = contentDeepLinkThumbnailURLLabel_.frame.size;
currentY += frameSize.height + 0.5 * yPadding;
[self placeView:contentDeepLinkThumbnailURL_ x:originX y:currentY];
frameSize = contentDeepLinkThumbnailURL_.frame.size;
currentY += frameSize.height + yPadding;
contentDeepLinkTitle_.hidden = NO;
contentDeepLinkTitleLabel_.hidden = NO;
contentDeepLinkDescriptionLabel_.hidden = NO;
contentDeepLinkDescription_.hidden = NO;
contentDeepLinkThumbnailURLLabel_.hidden = NO;
contentDeepLinkThumbnailURL_.hidden = NO;
} else {
contentDeepLinkTitle_.hidden = YES;
contentDeepLinkTitleLabel_.hidden = YES;
contentDeepLinkDescriptionLabel_.hidden = YES;
contentDeepLinkDescription_.hidden = YES;
contentDeepLinkThumbnailURLLabel_.hidden = YES;
contentDeepLinkThumbnailURL_.hidden = YES;
}
// Place the share button and status.
[[shareButton_ layer] setCornerRadius:5];
[[shareButton_ layer] setMasksToBounds:YES];
CGColorRef borderColor = [[UIColor colorWithWhite:203.0/255.0
alpha:1.0] CGColor];
[[shareButton_ layer] setBorderColor:borderColor];
[[shareButton_ layer] setBorderWidth:1.0];
[self placeView:shareButton_ x:originX y:currentY + yPadding];
frameSize = shareButton_.frame.size;
currentY += frameSize.height + yPadding * 2;
[self placeView:shareStatus_ x:originX y:currentY];
frameSize = shareStatus_.frame.size;
currentY += frameSize.height + yPadding;
shareScrollView_.contentSize =
CGSizeMake(shareScrollView_.frame.size.width, currentY);
}
- (void)populateTextFields {
// Pre-populate text fields for Google+ share sample.
if (sharePrefillText_.hidden) {
sharePrefillText_.text = @"";
} else {
sharePrefillText_.text = @"Welcome to Google+ Platform";
}
if (shareURL_.hidden) {
shareURL_.text = @"";
} else {
shareURL_.text = @"http://developers.google.com/+/mobile/ios/";
}
if (contentDeepLinkID_.hidden) {
contentDeepLinkID_.text = @"";
} else {
contentDeepLinkID_.text = @"playlist/314159265358";
}
if (contentDeepLinkTitle_.hidden) {
contentDeepLinkTitle_.text = @"";
} else {
contentDeepLinkTitle_.text = @"Joe's Pop Music Playlist";
}
if (contentDeepLinkDescription_.hidden) {
contentDeepLinkDescription_.text = @"";
} else {
contentDeepLinkDescription_.text =
@"Check out this playlist of my favorite pop songs!";
}
if (contentDeepLinkThumbnailURL_.hidden) {
contentDeepLinkThumbnailURL_.text = @"";
} else {
contentDeepLinkThumbnailURL_.text =
@"http://www.google.com/logos/2012/childrensday-2012-hp.jpg";
}
}
- (void)animateKeyboard:(NSNotification *)notification
shouldShow:(BOOL)shouldShow {
if (!shouldShow) {
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
shareScrollView_.contentInset = contentInsets;
shareScrollView_.scrollIndicatorInsets = contentInsets;
return;
}
NSDictionary *userInfo = [notification userInfo];
CGRect kbFrame =
[[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
CGSize kbSize = kbFrame.size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
shareScrollView_.contentInset = contentInsets;
shareScrollView_.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll so it's visible.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;
CGPoint bottomLeft =
CGPointMake(0.0, activeField_.frame.origin.y +
activeField_.frame.size.height + 10);
if (!CGRectContainsPoint(aRect, bottomLeft)) {
CGPoint scrollPoint = CGPointMake(0.0, bottomLeft.y - aRect.size.height);
[shareScrollView_ setContentOffset:scrollPoint animated:YES];
}
return;
}
- (void)addCallToActionSwitched {
if (!addCallToActionButtonSwitch_.on) {
return;
}
[self.view addSubview:callToActionPickerView_];
}
#pragma mark - UIPickerViewDataSource
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
return callToActions_.count;
}
#pragma mark - UIPickerViewDelegate
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
forComponent:(NSInteger)component reusingView:(UIView *)view {
UITableViewCell *cell = (UITableViewCell *)view;
if (cell == nil) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:nil] autorelease];
[cell setBackgroundColor:[UIColor clearColor]];
[cell setBounds: CGRectMake(0, 0, cell.frame.size.width - 20 , 44)];
UITapGestureRecognizer *singleTapGestureRecognizer =
[[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(toggleSelection:)] autorelease];
singleTapGestureRecognizer.numberOfTapsRequired = 1;
[cell addGestureRecognizer:singleTapGestureRecognizer];
}
NSString *callToAction = [callToActions_ objectAtIndex:row];
if ([selectedCallToAction_ isEqualToString:callToAction]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
cell.textLabel.text = callToAction;
cell.textLabel.font = [UIFont systemFontOfSize:12];
cell.tag = row;
return cell;
}
- (void)toggleSelection:(UITapGestureRecognizer *)recognizer {
int row = recognizer.view.tag;
self.selectedCallToAction = [callToActions_ objectAtIndex:row];
[callToActionPickerView_ removeFromSuperview];
// Force refresh checked/unchecked marks.
[callToActionPickerView_ reloadAllComponents];
addCallToActionButtonLabel_.text =
[NSString stringWithFormat:@"Call-to-Action: %@", selectedCallToAction_];
}
@end