Added rudimentary handling of address information. Since we can't really parse
[zxing.git] / iphone / Classes / AddContactAction.m
index 6d381ee..ffb8949 100644 (file)
 }
 
 - (NSString *)title {
-  return NSLocalizedString(@"Add Contact", @"Add Contact");
+  return NSLocalizedString(@"AddContactAction title", @"Add Contact");
 }
 
-- (void)performActionWithController:(UIViewController *)controller {
+- (void) addContactWithController:(UIViewController *)controller {
   CFErrorRef *error = NULL;
   NSCharacterSet *whitespaceSet = [NSCharacterSet whitespaceCharacterSet];
   
   ABRecordRef person = ABPersonCreate();
-    
+  
   NSRange commaRange = [name rangeOfString:@","];
   if (commaRange.location != NSNotFound) {
     NSString *lastName = [[name substringToIndex:commaRange.location] 
     ABRecordSetValue(person, kABPersonURLProperty, urlMultiValue, error);
   }
   
+  if (self.address) {
+    // we can't parse all the possible address formats, alas, so we punt by putting
+    // the entire thing into a multi-line 'street' address.
+    // This won't look great on the phone, but at least the info will be there, 
+    // and can be syned to a desktop computer, adjusted as necessary, and so on.
+    
+    // split the address into parts at each comma or return
+    NSArray *parts =
+        [self.address componentsSeparatedByCharactersInSet:
+         [NSCharacterSet characterSetWithCharactersInString:@",;\r\n"]];
+    NSMutableArray *strippedParts = [NSMutableArray arrayWithCapacity:[parts count]];
+    // for each part:
+    for (NSString *part in parts) {
+      // strip the part of whitespace
+      NSString *strippedPart =
+          [part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
+      if ([strippedPart length] > 0) {
+        // if there is anything in this address part, add it to the list of stripped parts
+        [strippedParts addObject:strippedPart];
+      }
+    }
+    // finally, create a 'street' address by concatenating all the stripped parts, separated by linefeeds
+    NSString *street = [strippedParts componentsJoinedByString:@"\n"];
+
+    CFMutableDictionaryRef addressDict =
+        CFDictionaryCreateMutable(NULL, 
+                                  1, 
+                                  &kCFTypeDictionaryKeyCallBacks, 
+                                  &kCFTypeDictionaryValueCallBacks);
+    CFDictionarySetValue(addressDict, kABPersonAddressStreetKey, street);
+    
+    ABMutableMultiValueRef addressMultiValue = 
+        ABMultiValueCreateMutable(kABStringPropertyType);
+    ABMultiValueAddValueAndLabel(addressMultiValue, 
+                                 addressDict, 
+                                 kABHomeLabel, 
+                                 NULL);
+    ABRecordSetValue(person, kABPersonAddressProperty, addressMultiValue, error);
+    CFRelease(addressMultiValue);
+    CFRelease(addressDict);
+  }
+  
   ABUnknownPersonViewController *unknownPersonViewController = 
   [[ABUnknownPersonViewController alloc] init];
   unknownPersonViewController.displayedPerson = person;
   unknownPersonViewController.allowsAddingToAddressBook = true;
   unknownPersonViewController.unknownPersonViewDelegate = self;
   CFRelease(person);
-
+  
   viewController = [controller retain];
   [[viewController navigationController] pushViewController:unknownPersonViewController animated:YES];
   [unknownPersonViewController release];
 }
 
+- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
+  if (buttonIndex != [alertView cancelButtonIndex]) {
+    // perform the action
+    [self addContactWithController:viewController];
+  }
+}
+
+#ifdef CONFIRM_ADDING_CONTACT
+#undef CONFIRM_ADDING_CONTACT
+#endif
+- (void)performActionWithController:(UIViewController *)controller 
+                      shouldConfirm:(bool)confirm {
+#ifdef CONFIRM_ADDING_CONTACT 
+  if (confirm) {
+    viewController = controller;
+    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil 
+                                                        message:NSLocalizedString(@"AddContactAction alert message", @"Add Contact?") 
+                                                       delegate:self 
+                                              cancelButtonTitle:NSLocalizedString(@"AddContactAction cancel button title", @"Cancel") 
+                                              otherButtonTitles:NSLocalizedString(@"AddContactAction confirm button title", @"Add Contact"), nil];
+    [alertView show];
+    [alertView release];
+  } else {
+#endif
+    [self addContactWithController:controller];
+#ifdef CONFIRM_ADDING_CONTACT    
+  }
+#endif
+}
+
 - (void)dismissUnknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonViewController {
   [[viewController navigationController] popToViewController:viewController animated:YES];
   [viewController release];