From 367dd879b77d441a17ee73e12a44ce92c98f074a Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:31:53 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- .../src/ios/CDVContacts.h | 160 ++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 js/ui/cordova/plugins/cordova-plugin-contacts/src/ios/CDVContacts.h diff --git a/js/ui/cordova/plugins/cordova-plugin-contacts/src/ios/CDVContacts.h b/js/ui/cordova/plugins/cordova-plugin-contacts/src/ios/CDVContacts.h new file mode 100644 index 0000000..479d390 --- /dev/null +++ b/js/ui/cordova/plugins/cordova-plugin-contacts/src/ios/CDVContacts.h @@ -0,0 +1,160 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 +#import +#import +#import +#import "CDVContact.h" + +@interface CDVContacts : CDVPlugin +{ + ABAddressBookRef addressBook; +} + +/* + * newContact - create a new contact via the GUI + * + * arguments: + * 1: successCallback: this is the javascript function that will be called with the newly created contactId + */ +- (void)newContact:(CDVInvokedUrlCommand*)command; + +/* + * displayContact - IN PROGRESS + * + * arguments: + * 1: recordID of the contact to display in the iPhone contact display + * 2: successCallback - currently not used + * 3: error callback + * options: + * allowsEditing: set to true to allow the user to edit the contact - currently not supported + */ +- (void)displayContact:(CDVInvokedUrlCommand*)command; + +/* + * chooseContact + * + * arguments: + * 1: this is the javascript function that will be called with the contact data as a JSON object (as the first param) + * options: + * allowsEditing: set to true to not choose the contact, but to edit it in the iPhone contact editor + */ +- (void)chooseContact:(CDVInvokedUrlCommand*)command; + +- (void)newPersonViewController:(ABNewPersonViewController*)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person; +- (BOOL)personViewController:(ABPersonViewController*)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person + property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue; +/* + * Launches the Contact Picker to select a single contact. + * + * arguments: + * 1: this is the javascript function that will be called with the contact data as a JSON object (as the first param) + * options: + * desiredFields: ContactFields array to be returned back + */ +- (void)pickContact:(CDVInvokedUrlCommand*)command; + +/* + * search - searches for contacts. Only person records are currently supported. + * + * arguments: + * 1: successcallback - this is the javascript function that will be called with the array of found contacts + * 2: errorCallback - optional javascript function to be called in the event of an error with an error code. + * options: dictionary containing ContactFields and ContactFindOptions + * fields - ContactFields array + * findOptions - ContactFindOptions object as dictionary + * + */ +- (void)search:(CDVInvokedUrlCommand*)command; + +/* + * save - saves a new contact or updates and existing contact + * + * arguments: + * 1: success callback - this is the javascript function that will be called with the JSON representation of the saved contact + * search calls a fixed navigator.service.contacts._findCallback which then calls the success callback stored before making the call into obj-c + */ +- (void)save:(CDVInvokedUrlCommand*)command; + +/* + * remove - removes a contact from the address book + * + * arguments: + * 1: 1: successcallback - this is the javascript function that will be called with a (now) empty contact object + * + * options: dictionary containing Contact object to remove + * contact - Contact object as dictionary + */ +- (void)remove:(CDVInvokedUrlCommand*)command; + +// - (void) dealloc; + +@end + +@interface CDVContactsPicker : ABPeoplePickerNavigationController +{ + BOOL allowsEditing; + NSString* callbackId; + NSDictionary* options; + NSDictionary* pickedContactDictionary; +} + +@property BOOL allowsEditing; +@property (copy) NSString* callbackId; +@property (nonatomic, strong) NSDictionary* options; +@property (nonatomic, strong) NSDictionary* pickedContactDictionary; + +@end + +@interface CDVNewContactsController : ABNewPersonViewController +{ + NSString* callbackId; +} +@property (copy) NSString* callbackId; +@end + +/* ABPersonViewController does not have any UI to dismiss. Adding navigationItems to it does not work properly, the navigationItems are lost when the app goes into the background. + The solution was to create an empty NavController in front of the ABPersonViewController. This + causes the ABPersonViewController to have a back button. By subclassing the ABPersonViewController, + we can override viewWillDisappear and take down the entire NavigationController at that time. + */ +@interface CDVDisplayContactViewController : ABPersonViewController +{} +@property (nonatomic, strong) CDVPlugin* contactsPlugin; + +@end +@interface CDVAddressBookAccessError : NSObject +{} +@property (assign) CDVContactError errorCode; +- (CDVAddressBookAccessError*)initWithCode:(CDVContactError)code; +@end + +typedef void (^ CDVAddressBookWorkerBlock)( + ABAddressBookRef addressBook, + CDVAddressBookAccessError* error + ); +@interface CDVAddressBookHelper : NSObject +{} + +- (void)createAddressBook:(CDVAddressBookWorkerBlock)workerBlock; +@end