5 // Created by Christian Brunschen on 29/05/2008.
7 * Copyright 2008 ZXing authors
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
22 #import "AddContactAction.h"
23 #import "AddressBook/AddressBook.h"
26 @implementation AddContactAction
29 @synthesize phoneNumbers;
32 @synthesize urlString;
35 + actionWithName:(NSString *)n
36 phoneNumbers:(NSArray *)nums
39 address:(NSString *)ad
41 AddContactAction *aca = [[[self alloc] init] autorelease];
43 aca.phoneNumbers = nums;
52 return NSLocalizedString(@"Add Contact", @"Add Contact");
55 - (void) addContactWithController:(UIViewController *)controller {
56 CFErrorRef *error = NULL;
57 NSCharacterSet *whitespaceSet = [NSCharacterSet whitespaceCharacterSet];
59 ABRecordRef person = ABPersonCreate();
61 NSRange commaRange = [name rangeOfString:@","];
62 if (commaRange.location != NSNotFound) {
63 NSString *lastName = [[name substringToIndex:commaRange.location]
64 stringByTrimmingCharactersInSet:whitespaceSet];
65 ABRecordSetValue(person, kABPersonLastNameProperty, lastName, error);
66 NSArray *firstNames = [[[name substringFromIndex:commaRange.location + commaRange.length]
67 stringByTrimmingCharactersInSet:whitespaceSet]
68 componentsSeparatedByCharactersInSet:whitespaceSet];
69 ABRecordSetValue(person, kABPersonFirstNameProperty, [firstNames objectAtIndex:0], error);
70 for (int i = 1; i < [firstNames count]; i++) {
71 ABRecordSetValue(person, kABPersonMiddleNameProperty, [firstNames objectAtIndex:1], error);
74 NSArray *nameParts = [name componentsSeparatedByCharactersInSet:whitespaceSet];
75 int nParts = nameParts.count;
77 ABRecordSetValue(person, kABPersonFirstNameProperty, name, error);
78 } else if (nParts >= 2) {
79 int lastPart = nParts - 1;
80 ABRecordSetValue(person, kABPersonFirstNameProperty, [nameParts objectAtIndex:0], error);
81 for (int i = 1; i < lastPart; i++) {
82 ABRecordSetValue(person, kABPersonMiddleNameProperty, [nameParts objectAtIndex:i], error);
84 ABRecordSetValue(person, kABPersonLastNameProperty, [nameParts objectAtIndex:lastPart], error);
89 ABRecordSetValue(person, kABPersonNoteProperty, self.note, error);
92 if (self.phoneNumbers && self.phoneNumbers.count > 0) {
93 // multi-values: nultiple phone numbers
94 ABMutableMultiValueRef phoneNumberMultiValue =
95 ABMultiValueCreateMutable(kABStringPropertyType);
96 for (NSString *number in self.phoneNumbers) {
97 ABMultiValueAddValueAndLabel(phoneNumberMultiValue, number,
98 kABPersonPhoneMainLabel, NULL);
100 ABRecordSetValue(person, kABPersonPhoneProperty,
101 phoneNumberMultiValue, error);
105 // a single email address
106 ABMutableMultiValueRef emailMultiValue =
107 ABMultiValueCreateMutable(kABStringPropertyType);
108 ABMultiValueAddValueAndLabel(emailMultiValue, self.email,
110 ABRecordSetValue(person, kABPersonEmailProperty, emailMultiValue, error);
113 if (self.urlString) {
114 // a single url as the home page
115 ABMutableMultiValueRef urlMultiValue =
116 ABMultiValueCreateMutable(kABStringPropertyType);
117 ABMultiValueAddValueAndLabel(urlMultiValue, self.urlString,
118 kABPersonHomePageLabel, NULL);
119 ABRecordSetValue(person, kABPersonURLProperty, urlMultiValue, error);
122 ABUnknownPersonViewController *unknownPersonViewController =
123 [[ABUnknownPersonViewController alloc] init];
124 unknownPersonViewController.displayedPerson = person;
125 unknownPersonViewController.allowsActions = true;
126 unknownPersonViewController.allowsAddingToAddressBook = true;
127 unknownPersonViewController.unknownPersonViewDelegate = self;
130 viewController = [controller retain];
131 [[viewController navigationController] pushViewController:unknownPersonViewController animated:YES];
132 [unknownPersonViewController release];
135 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
136 if (buttonIndex != [alertView cancelButtonIndex]) {
137 // perform the action
138 [self addContactWithController:viewController];
142 #ifdef CONFIRM_ADDING_CONTACT
143 #undef CONFIRM_ADDING_CONTACT
145 - (void)performActionWithController:(UIViewController *)controller
146 shouldConfirm:(bool)confirm {
147 #ifdef CONFIRM_ADDING_CONTACT
149 viewController = controller;
150 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil
151 message:NSLocalizedString(@"Add Contact?", @"add contact")
153 cancelButtonTitle:NSLocalizedString(@"Cancel", @"cancel button title")
154 otherButtonTitles:NSLocalizedString(@"Add Contact", @"add contact"), nil];
159 [self addContactWithController:controller];
160 #ifdef CONFIRM_ADDING_CONTACT
165 - (void)dismissUnknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonViewController {
166 [[viewController navigationController] popToViewController:viewController animated:YES];
167 [viewController release];
168 viewController = nil;
171 // ABUnknownPersonViewControllerDelegate
173 - (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonViewController
174 didResolveToPerson:(ABRecordRef)person {
176 [self performSelector:@selector(dismissUnknownPersonViewController:) withObject:unknownPersonViewController afterDelay:0.0];