From 3f7b2f547c58023b793aded4d70100644eb1a93c Mon Sep 17 00:00:00 2001 From: Steve Hannah Date: Thu, 8 Mar 2018 06:26:57 -0800 Subject: [PATCH] Added defines in iOS native code to strip usage of APIs that require usage descriptions in Xcode 9. The build server will automatically uncomment these defines if the appropriate ios.NSXXXUsageDescription build hints are provided. If building with Xcode 7, the server will uncomment all of these defines. --- .../CodenameOne_GLViewController.h | 13 + Ports/iOSPort/nativeSources/IOSNative.m | 235 +++++++++++++++++- .../codename1/impl/ios/IOSImplementation.java | 39 +++ .../src/com/codename1/impl/ios/IOSNative.java | 28 ++- 4 files changed, 310 insertions(+), 5 deletions(-) diff --git a/Ports/iOSPort/nativeSources/CodenameOne_GLViewController.h b/Ports/iOSPort/nativeSources/CodenameOne_GLViewController.h index 219fd444ce..d88af339ca 100644 --- a/Ports/iOSPort/nativeSources/CodenameOne_GLViewController.h +++ b/Ports/iOSPort/nativeSources/CodenameOne_GLViewController.h @@ -53,6 +53,19 @@ #import #endif +//#define INCLUDE_CONTACTS_USAGE +//#define INCLUDE_CALENDARS_USAGE +//#define INCLUDE_CAMERA_USAGE +//#define INCLUDE_FACEID_USAGE +//#define INCLUDE_LOCATION_USAGE +//#define INCLUDE_MICROPHONE_USAGE +//#define INCLUDE_MOTION_USAGE +//#define INCLUDE_PHOTOLIBRARYADD_USAGE +//#define INCLUDE_PHOTOLIBRARY_USAGE +//#define INCLUDE_REMINDERS_USAGE +//#define INCLUDE_SIRI_USAGE +//#define INCLUDE_SPEECHRECOGNITION_USAGE +//#define INCLUDE_NFCREADER_USAGE //#define INCLUDE_CN1_BACKGROUND_FETCH //#define INCLUDE_FACEBOOK_CONNECT diff --git a/Ports/iOSPort/nativeSources/IOSNative.m b/Ports/iOSPort/nativeSources/IOSNative.m index 496441796b..402121f7c6 100644 --- a/Ports/iOSPort/nativeSources/IOSNative.m +++ b/Ports/iOSPort/nativeSources/IOSNative.m @@ -2973,9 +2973,11 @@ void com_codename1_impl_ios_IOSNative_showNativePlayerController___long(CN1_THRE POOL_END(); }); } - +#ifdef INCLUDE_LOCATION_USAGE CLLocationManager* com_codename1_impl_ios_IOSNative_createCLLocation = nil; +#endif JAVA_LONG com_codename1_impl_ios_IOSNative_createCLLocation__(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject) { +#ifdef INCLUDE_LOCATION_USAGE dispatch_sync(dispatch_get_main_queue(), ^{ com_codename1_impl_ios_IOSNative_createCLLocation = [[CLLocationManager alloc] init]; if ([com_codename1_impl_ios_IOSNative_createCLLocation respondsToSelector:@selector (CN1_REQUEST_LOCATION_AUTH)]) { @@ -2988,9 +2990,13 @@ JAVA_LONG com_codename1_impl_ios_IOSNative_createCLLocation__(CN1_THREAD_STATE_M CLLocationManager* c = com_codename1_impl_ios_IOSNative_createCLLocation; com_codename1_impl_ios_IOSNative_createCLLocation = nil; return (JAVA_LONG)((BRIDGE_CAST void*)c); +#else + return 0; +#endif } JAVA_LONG com_codename1_impl_ios_IOSNative_getCurrentLocationObject___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_LOCATION_USAGE dispatch_sync(dispatch_get_main_queue(), ^{ POOL_BEGIN(); CLLocationManager* l = (BRIDGE_CAST CLLocationManager*)((void *)peer); @@ -3003,46 +3009,78 @@ JAVA_LONG com_codename1_impl_ios_IOSNative_getCurrentLocationObject___long(CN1_T CLLocationManager* c = com_codename1_impl_ios_IOSNative_createCLLocation; com_codename1_impl_ios_IOSNative_createCLLocation = nil; return (JAVA_LONG)((BRIDGE_CAST void*)c); +#else + return 0; +#endif } JAVA_DOUBLE com_codename1_impl_ios_IOSNative_getLocationLatitude___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_LOCATION_USAGE CLLocation* loc = (BRIDGE_CAST CLLocation*)((void *)peer); return loc.coordinate.latitude; +#else + return 0; +#endif } JAVA_DOUBLE com_codename1_impl_ios_IOSNative_getLocationAltitude___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_LOCATION_USAGE CLLocation* loc = (BRIDGE_CAST CLLocation*)((void *)peer); return loc.altitude; +#else + return 0; +#endif } JAVA_DOUBLE com_codename1_impl_ios_IOSNative_getLocationLongtitude___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_LOCATION_USAGE CLLocation* loc = (BRIDGE_CAST CLLocation*)((void *)peer); return loc.coordinate.longitude; +#else + return 0; +#endif; } JAVA_DOUBLE com_codename1_impl_ios_IOSNative_getLocationAccuracy___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_LOCATION_USAGE CLLocation* loc = (BRIDGE_CAST CLLocation*)((void *)peer); return loc.horizontalAccuracy; +#else + return 0; +#endif } JAVA_DOUBLE com_codename1_impl_ios_IOSNative_getLocationDirection___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_LOCATION_USAGE CLLocation* loc = (BRIDGE_CAST CLLocation*)((void *)peer); return loc.course; +#else + return 0; +#endif } JAVA_DOUBLE com_codename1_impl_ios_IOSNative_getLocationVelocity___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_LOCATION_USAGE CLLocation* loc = (BRIDGE_CAST CLLocation*)((void *)peer); return loc.speed; +#else + return 0; +#endif } JAVA_LONG com_codename1_impl_ios_IOSNative_getLocationTimeStamp___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_LOCATION_USAGE CLLocation* loc = (BRIDGE_CAST CLLocation*)((void *)peer); NSTimeInterval t = [loc.timestamp timeIntervalSince1970]; return (JAVA_LONG)(t * 1000.0); +#else + return 0; +#endif } UIPopoverController* popoverController; void com_codename1_impl_ios_IOSNative_captureCamera___boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_BOOLEAN movie) { +#ifdef INCLUDE_CAMERA_USAGE dispatch_sync(dispatch_get_main_queue(), ^{ POOL_BEGIN(); UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; // default @@ -3088,9 +3126,11 @@ void com_codename1_impl_ios_IOSNative_captureCamera___boolean(CN1_THREAD_STATE_M POOL_END(); } }); +#endif } void com_codename1_impl_ios_IOSNative_openGallery___int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_INT type) { +#ifdef INCLUDE_PHOTOLIBRARY_USAGE dispatch_async(dispatch_get_main_queue(), ^{ POOL_BEGIN(); UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypePhotoLibrary; @@ -3137,6 +3177,7 @@ void com_codename1_impl_ios_IOSNative_openGallery___int(CN1_THREAD_STATE_MULTI_A } POOL_END(); }); +#endif } int popoverSupported() { @@ -3279,6 +3320,7 @@ void com_codename1_impl_ios_IOSNative_removeGeofencing___long_java_lang_String(C } } +#ifdef INCLUDE_CONTACTS_USAGE ABAddressBookRef globalAddressBook = nil; bool grantedPermission; ABAddressBookRef getAddressBook() { @@ -3300,16 +3342,22 @@ ABAddressBookRef getAddressBook() { } return globalAddressBook; } - +#endif JAVA_VOID com_codename1_impl_ios_IOSNative_refreshContacts__(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject) { +#ifdef INCLUDE_CONTACTS_USAGE globalAddressBook = nil; +#endif } JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_isContactsPermissionGranted__(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); getAddressBook(); POOL_END(); return grantedPermission; +#else + return JAVA_FALSE; +#endif } @@ -3330,6 +3378,7 @@ void throwError(CFErrorRef error) { } JAVA_OBJECT com_codename1_impl_ios_IOSNative_createContact___java_lang_String_java_lang_String_java_lang_String_java_lang_String_java_lang_String_java_lang_String(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT firstName, JAVA_OBJECT surname, JAVA_OBJECT officePhone, JAVA_OBJECT homePhone, JAVA_OBJECT cellPhone, JAVA_OBJECT email) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABAddressBookRef addressBook = getAddressBook(); @@ -3374,9 +3423,13 @@ JAVA_OBJECT com_codename1_impl_ios_IOSNative_createContact___java_lang_String_ja JAVA_OBJECT o = fromNSString(CN1_THREAD_STATE_PASS_ARG [NSString stringWithFormat:@"%i", ABRecordGetRecordID(person)]); POOL_END(); return o; +#else + return JAVA_NULL; +#endif } JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_deleteContact___int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_INT i) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABAddressBookRef addressBook = getAddressBook(); if(!grantedPermission) { @@ -3388,10 +3441,14 @@ JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_deleteContact___int(CN1_THREAD_STA } POOL_END(); return ref != nil; +#else + return JAVA_FALSE; +#endif } JAVA_INT com_codename1_impl_ios_IOSNative_getContactCount___boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_BOOLEAN includeNumbers) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABAddressBookRef addressBook = getAddressBook(); if(!grantedPermission) { @@ -3417,9 +3474,13 @@ JAVA_INT com_codename1_impl_ios_IOSNative_getContactCount___boolean(CN1_THREAD_S POOL_END(); return MAX(nPeople, 0); +#else + return 0; +#endif } JAVA_INT com_codename1_impl_ios_IOSNative_countLinkedContacts___int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_INT recId) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABRecordRef i = ABAddressBookGetPersonWithRecordID(getAddressBook(), recId); NSArray *linkedRecordsArray = (__bridge NSArray *)ABPersonCopyArrayOfAllLinkedPeople(i); @@ -3427,6 +3488,9 @@ JAVA_INT com_codename1_impl_ios_IOSNative_countLinkedContacts___int(CN1_THREAD_S [linkedRecordsArray release]; POOL_END(); return numLinked; +#else + return 0; +#endif } #ifdef NEW_CODENAME_ONE_VM @@ -3438,6 +3502,7 @@ JAVA_INT com_codename1_impl_ios_IOSNative_countLinkedContacts___int_R_int(CN1_TH void com_codename1_impl_ios_IOSNative_getLinkedContactIds___int_int_int_1ARRAY(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_INT num, JAVA_INT refId, JAVA_OBJECT out) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); #ifndef NEW_CODENAME_ONE_VM org_xmlvm_runtime_XMLVMArray* iArray = intArray; @@ -3457,10 +3522,12 @@ void com_codename1_impl_ios_IOSNative_getLinkedContactIds___int_int_int_1ARRAY(C } [linkedRecordsArray release]; POOL_END(); +#endif } void com_codename1_impl_ios_IOSNative_getContactRefIds___int_1ARRAY_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT intArray, JAVA_BOOLEAN includeNumbers) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); #ifndef NEW_CODENAME_ONE_VM org_xmlvm_runtime_XMLVMArray* iArray = intArray; @@ -3513,32 +3580,46 @@ void com_codename1_impl_ios_IOSNative_getContactRefIds___int_1ARRAY_boolean(CN1_ data[iter] = ABRecordGetRecordID(ref); } POOL_END(); +#endif } JAVA_OBJECT com_codename1_impl_ios_IOSNative_getPersonFirstName___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABRecordRef i = (ABRecordRef)peer; NSString* k = (BRIDGE_CAST NSString*)ABRecordCopyValue(i,kABPersonFirstNameProperty); JAVA_OBJECT ret = fromNSString(CN1_THREAD_STATE_PASS_ARG k); POOL_END(); return ret; +#else + return JAVA_NULL; +#endif } JAVA_OBJECT com_codename1_impl_ios_IOSNative_getPersonSurnameName___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABRecordRef i = (ABRecordRef)peer; NSString* k = (BRIDGE_CAST NSString*)ABRecordCopyValue(i,kABPersonLastNameProperty); JAVA_OBJECT ret = fromNSString(CN1_THREAD_STATE_PASS_ARG k); POOL_END(); return ret; +#else + return JAVA_NULL; +#endif } JAVA_INT com_codename1_impl_ios_IOSNative_getPersonPhoneCount___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_CONTACTS_USAGE //POOL_BEGIN(); //POOL_END(); return 1; +#else + return 0; +#endif } +#ifdef INCLUDE_CONTACTS_USAGE JAVA_OBJECT copyValueAsString(CN1_THREAD_STATE_MULTI_ARG ABMultiValueRef r) { JAVA_OBJECT ret = JAVA_NULL; if(ABMultiValueGetCount(r) > 0) { @@ -3547,17 +3628,23 @@ JAVA_OBJECT copyValueAsString(CN1_THREAD_STATE_MULTI_ARG ABMultiValueRef r) { } return ret; } +#endif JAVA_OBJECT com_codename1_impl_ios_IOSNative_getPersonPhone___long_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer, JAVA_INT offset) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABRecordRef i = (ABRecordRef)peer; ABMultiValueRef k = (ABMultiValueRef)ABRecordCopyValue(i,kABPersonPhoneProperty); JAVA_OBJECT ret = copyValueAsString(CN1_THREAD_STATE_PASS_ARG k); POOL_END(); return ret; +#else + return JAVA_NULL; +#endif } JAVA_OBJECT com_codename1_impl_ios_IOSNative_getPersonPhoneType___long_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer, JAVA_INT offset) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); //ABRecordRef i = (ABRecordRef)peer; //ABMultiValueRef k = (ABMultiValueRef)ABRecordCopyValue(i,kABPersonPhoneMainLabel); @@ -3565,36 +3652,52 @@ JAVA_OBJECT com_codename1_impl_ios_IOSNative_getPersonPhoneType___long_int(CN1_T JAVA_OBJECT ret = fromNSString(CN1_THREAD_STATE_PASS_ARG @"work"); POOL_END(); return ret; +#else + return JAVA_NULL; +#endif } JAVA_OBJECT com_codename1_impl_ios_IOSNative_getPersonPrimaryPhone___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABRecordRef i = (ABRecordRef)peer; ABMultiValueRef k = (ABMultiValueRef)ABRecordCopyValue(i,kABPersonPhoneProperty); JAVA_OBJECT ret = copyValueAsString(CN1_THREAD_STATE_PASS_ARG k); POOL_END(); return ret; +#else + return JAVA_NULL; +#endif } JAVA_OBJECT com_codename1_impl_ios_IOSNative_getPersonEmail___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABRecordRef i = (ABRecordRef)peer; ABMultiValueRef emails = (ABMultiValueRef)ABRecordCopyValue(i,kABPersonEmailProperty); JAVA_OBJECT ret = copyValueAsString(CN1_THREAD_STATE_PASS_ARG emails); POOL_END(); return ret; +#else + return JAVA_NULL; +#endif } JAVA_OBJECT com_codename1_impl_ios_IOSNative_getPersonAddress___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABRecordRef i = (ABRecordRef)peer; NSString* k = (BRIDGE_CAST NSString*)ABRecordCopyValue(i,kABPersonAddressProperty); JAVA_OBJECT ret = fromNSString(CN1_THREAD_STATE_PASS_ARG k); POOL_END(); return ret; +#else + return JAVA_NULL; +#endif } JAVA_LONG com_codename1_impl_ios_IOSNative_createPersonPhotoImage___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABRecordRef i = (ABRecordRef)peer; GLUIImage* g = nil; @@ -3604,8 +3707,12 @@ JAVA_LONG com_codename1_impl_ios_IOSNative_createPersonPhotoImage___long(CN1_THR } POOL_END(); return (JAVA_LONG)((BRIDGE_CAST void*)g); +#else + return 0; +#endif } +#ifdef INCLUDE_CONTACTS_USAGE void addToHashtable(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT hash, ABMultiValueRef ref, int count) { for(int iter = 0 ; iter < count ; iter++) { NSString *key = (BRIDGE_CAST NSString *)ABMultiValueCopyLabelAtIndex(ref, iter); @@ -3628,9 +3735,11 @@ void addToHashtable(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT hash, ABMultiValueRef #endif } } +#endif void com_codename1_impl_ios_IOSNative_updatePersonWithRecordID___int_com_codename1_contacts_Contact_boolean_boolean_boolean_boolean_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_INT recId, JAVA_OBJECT cnt, - JAVA_BOOLEAN includesFullName, JAVA_BOOLEAN includesPicture, JAVA_BOOLEAN includesNumbers, JAVA_BOOLEAN includesEmail, JAVA_BOOLEAN includeAddress) { + JAVA_BOOLEAN includesFullName, JAVA_BOOLEAN includesPicture, JAVA_BOOLEAN includesNumbers, JAVA_BOOLEAN includesEmail, JAVA_BOOLEAN includeAddress) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABRecordRef i = ABAddressBookGetPersonWithRecordID(getAddressBook(), recId); @@ -3803,10 +3912,12 @@ void com_codename1_impl_ios_IOSNative_updatePersonWithRecordID___int_com_codenam } POOL_END(); +#endif } JAVA_LONG com_codename1_impl_ios_IOSNative_getPersonWithRecordID___int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_INT recId) { +#ifdef INCLUDE_CONTACTS_USAGE POOL_BEGIN(); ABRecordRef i = ABAddressBookGetPersonWithRecordID(getAddressBook(), recId); #ifndef CN1_USE_ARC @@ -3814,6 +3925,114 @@ JAVA_LONG com_codename1_impl_ios_IOSNative_getPersonWithRecordID___int(CN1_THREA #endif POOL_END(); return (JAVA_LONG)i; +#else + return (JAVA_LONG)0; +#endif +} + +//native boolean checkContactsUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkContactsUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_CONTACTS_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkCalendarsUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkCalendarsUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_CALENDARS_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkCameraUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkCameraUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_CAMERA_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkFaceIDUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkFaceIDUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_FACEID_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkLocationUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkLocationUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_LOCATION_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkMicrophoneUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkMicrophoneUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_MICROPHONE_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkMotionUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkMotionUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_MOTION_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkPhotoLibraryAddUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkPhotoLibraryAddUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_PHOTOLIBRARYADD_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkPhotoLibraryUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkPhotoLibraryUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_PHOTOLIBRARY_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkRemindersUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkRemindersUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_REMINDERS_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkSiriUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkSiriUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_SIRI_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkSpeechRecognitionUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkSpeechRecognitionUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_SPEECHRECOGNITION_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif +} +//native boolean checkNFCReaderUsage(); +JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_checkNFCReaderUsage___R_boolean(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT me) { +#ifdef INCLUDE_NFCREADER_USAGE + return JAVA_TRUE; +#else + return JAVA_FALSE; +#endif } void com_codename1_impl_ios_IOSNative_dial___java_lang_String(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT phone) { @@ -4018,6 +4237,7 @@ void com_codename1_impl_ios_IOSNative_nsDataToByteArray___long_byte_1ARRAY(CN1_T JAVA_LONG com_codename1_impl_ios_IOSNative_createAudioRecorder___java_lang_String(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT destinationFile) { +#ifdef INCLUDE_MICROPHONE_USAGE __block AVAudioRecorder* recorder = nil; dispatch_sync(dispatch_get_main_queue(), ^{ POOL_BEGIN(); @@ -4095,10 +4315,14 @@ JAVA_LONG com_codename1_impl_ios_IOSNative_createAudioRecorder___java_lang_Strin POOL_END(); }); return (JAVA_LONG)((BRIDGE_CAST void*)recorder); +#else + return (JAVA_LONG)0; +#endif } void com_codename1_impl_ios_IOSNative_startAudioRecord___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_MICROPHONE_USAGE AVAudioRecorder* recorder = (BRIDGE_CAST AVAudioRecorder*)((void *)peer); dispatch_sync(dispatch_get_main_queue(), ^{ POOL_BEGIN(); @@ -4113,20 +4337,24 @@ void com_codename1_impl_ios_IOSNative_startAudioRecord___long(CN1_THREAD_STATE_M #endif POOL_END(); }); +#endif } void com_codename1_impl_ios_IOSNative_pauseAudioRecord___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_MICROPHONE_USAGE AVAudioRecorder* recorder = (BRIDGE_CAST AVAudioRecorder*)((void *)peer); dispatch_sync(dispatch_get_main_queue(), ^{ POOL_BEGIN(); [recorder pause]; POOL_END(); }); +#endif } void com_codename1_impl_ios_IOSNative_cleanupAudioRecord___long(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_LONG peer) { +#ifdef INCLUDE_MICROPHONE_USAGE AVAudioRecorder* recorder = (BRIDGE_CAST AVAudioRecorder*)((void *)peer); dispatch_sync(dispatch_get_main_queue(), ^{ POOL_BEGIN(); @@ -4136,6 +4364,7 @@ void com_codename1_impl_ios_IOSNative_cleanupAudioRecord___long(CN1_THREAD_STATE #endif POOL_END(); }); +#endif } #ifdef NEW_CODENAME_ONE_VM diff --git a/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java b/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java index c52a4b6214..5ead1f01e5 100644 --- a/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java +++ b/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java @@ -2759,6 +2759,9 @@ public static void appDidLaunchWithLocation() { } public LocationManager getLocationManager() { + if (!nativeInstance.checkLocationUsage()) { + throw new RuntimeException("Please add the ios.NSLocationUsageDescription or ios.NSLocationAlwaysUsageDescription build hint"); + } if(lm == null) { lm = new Loc(); } @@ -2793,6 +2796,9 @@ public static void capturePictureResult(String r) { public void captureAudio(ActionListener response) { + if (!nativeInstance.checkMicrophoneUsage()) { + throw new RuntimeException("Please add the ios.NSMicrophoneUsageDescription build hint"); + } dropEvents = false; String p = FileSystemStorage.getInstance().getAppHomePath(); if(!p.endsWith("/")) { @@ -2835,6 +2841,9 @@ public static void captureMovieResult(String r) { * @param response callback for the resulting image */ public void capturePhoto(ActionListener response) { + if (!nativeInstance.checkCameraUsage()) { + throw new RuntimeException("Please add the ios.NSCameraUsageDescription build hint"); + } captureCallback = new EventDispatcher(); captureCallback.addListener(response); nativeInstance.captureCamera(false); @@ -2848,6 +2857,9 @@ public void capturePhoto(ActionListener response) { @Override public Media createMediaRecorder(String path, String mimeType) throws IOException{ + if (!nativeInstance.checkMicrophoneUsage()) { + throw new RuntimeException("Please add the ios.NSMicrophoneUsageDescription build hint"); + } final long[] peer = new long[] { nativeInstance.createAudioRecorder(path) }; return new Media() { private boolean playing; @@ -2955,6 +2967,9 @@ public void prepare() { * @param response callback for the resulting video */ public void captureVideo(ActionListener response) { + if (!nativeInstance.checkCameraUsage() || !nativeInstance.checkMicrophoneUsage()) { + throw new RuntimeException("Please add the ios.NSCameraUsageDescription and ios.NSMicrophoneUsageDescription build hints"); + } captureCallback = new EventDispatcher(); captureCallback.addListener(response); nativeInstance.captureCamera(true); @@ -2968,6 +2983,9 @@ public void openImageGallery(ActionListener response) { @Override public void openGallery(ActionListener response, int type) { + if (!nativeInstance.checkPhotoLibraryUsage()) { + throw new RuntimeException("Please add the ios.NSPhotoLibraryUsageDescription build hint"); + } captureCallback = new EventDispatcher(); captureCallback.addListener(response); nativeInstance.openGallery(type); @@ -5517,17 +5535,26 @@ public void run() { @Override public String createContact(String firstName, String surname, String officePhone, String homePhone, String cellPhone, String email) { + if (!nativeInstance.checkContactsUsage()) { + throw new RuntimeException("Please add the ios.NSContactsUsageDescription build hint"); + } return nativeInstance.createContact(firstName, surname, officePhone, homePhone, cellPhone, email); } @Override public boolean deleteContact(String id) { + if (!nativeInstance.checkContactsUsage()) { + throw new RuntimeException("Please add the ios.NSContactsUsageDescription build hint"); + } return nativeInstance.deleteContact(Integer.parseInt(id)); } @Override public String[] getAllContacts(boolean withNumbers) { + if (!nativeInstance.checkContactsUsage()) { + throw new RuntimeException("Please add the ios.NSContactsUsageDescription build hint"); + } int[] c = new int[nativeInstance.getContactCount(withNumbers)]; int clen = c.length; nativeInstance.getContactRefIds(c, withNumbers); @@ -5540,11 +5567,17 @@ public String[] getAllContacts(boolean withNumbers) { @Override public void refreshContacts() { + if (!nativeInstance.checkContactsUsage()) { + throw new RuntimeException("Please add the ios.NSContactsUsageDescription build hint"); + } nativeInstance.refreshContacts(); } @Override public String[] getLinkedContactIds(Contact c) { + if (!nativeInstance.checkContactsUsage()) { + throw new RuntimeException("Please add the ios.NSContactsUsageDescription build hint"); + } int recId = Integer.parseInt(c.getId()); int num = nativeInstance.countLinkedContacts(recId); String[] out = new String[num]; @@ -5563,6 +5596,9 @@ public String[] getLinkedContactIds(Contact c) { @Override public Contact getContactById(String id, boolean includesFullName, boolean includesPicture, boolean includesNumbers, boolean includesEmail, boolean includeAddress) { + if (!nativeInstance.checkContactsUsage()) { + throw new RuntimeException("Please add the ios.NSContactsUsageDescription build hint"); + } int recId = Integer.parseInt(id); Contact c = new Contact(); c.setId(id); @@ -5581,6 +5617,9 @@ public Contact getContactById(String id, boolean includesFullName, boolean inclu @Override public Contact getContactById(String id) { + if (!nativeInstance.checkContactsUsage()) { + throw new RuntimeException("Please add the ios.NSContactsUsageDescription build hint"); + } return getContactById(id, true, true, true, true, true); /*c.setId("" + id); diff --git a/Ports/iOSPort/src/com/codename1/impl/ios/IOSNative.java b/Ports/iOSPort/src/com/codename1/impl/ios/IOSNative.java index c1512ef154..5a0b0fa848 100644 --- a/Ports/iOSPort/src/com/codename1/impl/ios/IOSNative.java +++ b/Ports/iOSPort/src/com/codename1/impl/ios/IOSNative.java @@ -625,8 +625,32 @@ native void nativeSetTransformMutable( native void blockCopyPaste(boolean blockCopyPaste); - - + //#define INCLUDE_CONTACTS_USAGE + //#define INCLUDE_CALENDARS_USAGE + //#define INCLUDE_CAMERA_USAGE + //#define INCLUDE_FACEID_USAGE + //#define INCLUDE_LOCATION_USAGE + //#define INCLUDE_MICROPHONE_USAGE + //#define INCLUDE_MOTION_USAGE + //#define INCLUDE_PHOTOLIBRARYADD_USAGE + //#define INCLUDE_PHOTOLIBRARY_USAGE + //#define INCLUDE_REMINDERS_USAGE + //#define INCLUDE_SIRI_USAGE + //#define INCLUDE_SPEECHRECOGNITION_USAGE + //#define INCLUDE_NFCREADER_USAGE + native boolean checkContactsUsage(); + native boolean checkCalendarsUsage(); + native boolean checkCameraUsage(); + native boolean checkFaceIDUsage(); + native boolean checkLocationUsage(); + native boolean checkMicrophoneUsage(); + native boolean checkMotionUsage(); + native boolean checkPhotoLibraryAddUsage(); + native boolean checkPhotoLibraryUsage(); + native boolean checkRemindersUsage(); + native boolean checkSiriUsage(); + native boolean checkSpeechRecognitionUsage(); + native boolean checkNFCReaderUsage();