diff --git a/CHANGELOG.md b/CHANGELOG.md index da549f8e3..b8c2d7493 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Group changes to describe their impact on the project, as follows: ### Added - Support of IOS 11 +- new algorithm to adapt audio and video codec bitrates to the available bandwidth (https://wiki.linphone.org/xwiki/wiki/public/view/FAQ/How%20does%20adaptive%20bitrate%20algorithm%20work%20%3F/) ### Changed - Contact, CNContact implmentation. diff --git a/Classes/AssistantView.m b/Classes/AssistantView.m index 40711d036..41a8aa45d 100644 --- a/Classes/AssistantView.m +++ b/Classes/AssistantView.m @@ -449,12 +449,14 @@ static UICompositeViewDescription *compositeDescription = nil; BOOL show_logo = [LinphoneManager.instance lpConfigBoolForKey:@"show_assistant_logo_in_choice_view_preference"]; BOOL show_extern = ![LinphoneManager.instance lpConfigBoolForKey:@"hide_assistant_custom_account"]; BOOL show_new = ![LinphoneManager.instance lpConfigBoolForKey:@"hide_assistant_create_account"]; - + BOOL show_fetch_remote = ![LinphoneManager.instance lpConfigBoolForKey:@"show_remote_provisioning_in_assistant"]; + if (!placement_done) { // visibility _welcomeLogoImage.hidden = !show_logo; _gotoLoginButton.hidden = !show_extern; _gotoCreateAccountButton.hidden = !show_new; + _gotoRemoteProvisioningButton.hidden = !show_fetch_remote; // placement if (show_logo && show_new && !show_extern) { diff --git a/Classes/Base.lproj/PhoneMainView.xib b/Classes/Base.lproj/PhoneMainView.xib index d41018616..1f3e8d6fa 100644 --- a/Classes/Base.lproj/PhoneMainView.xib +++ b/Classes/Base.lproj/PhoneMainView.xib @@ -30,8 +30,8 @@ - - + + diff --git a/Classes/CallView.m b/Classes/CallView.m index 6a7914795..4f416edb4 100644 --- a/Classes/CallView.m +++ b/Classes/CallView.m @@ -179,8 +179,8 @@ static UICompositeViewDescription *compositeDescription = nil; [super viewDidAppear:animated]; [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; - UIDevice.currentDevice.proximityMonitoringEnabled = !_speakerButton.enabled; - + [[UIDevice currentDevice] setProximityMonitoringEnabled:TRUE]; + [PhoneMainView.instance setVolumeHidden:TRUE]; hiddenVolume = TRUE; @@ -192,7 +192,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; - +[[UIDevice currentDevice] setProximityMonitoringEnabled:FALSE]; [self disableVideoDisplay:TRUE animated:NO]; if (hideControlsTimer != nil) { @@ -219,7 +219,7 @@ static UICompositeViewDescription *compositeDescription = nil; [super viewDidDisappear:animated]; [[UIApplication sharedApplication] setIdleTimerDisabled:false]; - UIDevice.currentDevice.proximityMonitoringEnabled = NO; + [[UIDevice currentDevice] setProximityMonitoringEnabled:FALSE]; [PhoneMainView.instance fullScreen:false]; // Disable tap @@ -357,7 +357,9 @@ static void hideSpinner(LinphoneCall *call, void *user_data) { hideControlsTimer = nil; } - [PhoneMainView.instance fullScreen:!disabled]; + if(![PhoneMainView.instance isIphoneXDevice]){ + [PhoneMainView.instance fullScreen:!disabled]; + } [PhoneMainView.instance hideTabBar:!disabled]; if (!disabled) { diff --git a/Classes/ContactDetailsView.m b/Classes/ContactDetailsView.m index f88ecfd2a..fc2eb6735 100644 --- a/Classes/ContactDetailsView.m +++ b/Classes/ContactDetailsView.m @@ -154,7 +154,6 @@ - (void)newContact:(NSString *)address { CNContact *contact = [[CNContact alloc] init]; Contact *mContact = [[Contact alloc] initWithCNContact:contact]; - [mContact setSipAddress:address atIndex:0]; [self selectContact:mContact andReload:NO]; [self addCurrentContactContactField:address]; // force to restart server subscription to add new contact into the list @@ -475,13 +474,19 @@ static UICompositeViewDescription *compositeDescription = nil; - (IBAction)onEditClick:(id)event { if (_tableController.isEditing) { - [self setEditing:FALSE]; - [self saveData]; - _isAdding = FALSE; - self.tmpContact = NULL; - _avatarImage.hidden = FALSE; - _deleteButton.hidden = FALSE; - _editButton.hidden = FALSE; + [LinphoneManager.instance setContactsUpdated:TRUE]; + if(![self hasDuplicateContactOf:_contact]){ + [self setEditing:FALSE]; + [self saveData]; + _isAdding = FALSE; + self.tmpContact = NULL; + _avatarImage.hidden = FALSE; + _deleteButton.hidden = FALSE; + _editButton.hidden = FALSE; + }else{ + LOGE(@"====>>>> Duplicated Contacts detected !!!"); + [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Contact error", nil) message:NSLocalizedString(@"Contact duplicate", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show]; + } } else { [self modifyTmpContact:_contact]; [self setEditing:TRUE]; @@ -519,6 +524,30 @@ static UICompositeViewDescription *compositeDescription = nil; } } +- (BOOL) hasDuplicateContactOf:(Contact*) contactToCheck{ + CNContactStore *store = [[CNContactStore alloc] init]; + NSArray *keysToFetch = @[ + CNContactEmailAddressesKey, CNContactPhoneNumbersKey, + CNContactInstantMessageAddressesKey, CNInstantMessageAddressUsernameKey, + CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey, + CNContactIdentifierKey, CNContactImageDataKey, CNContactNicknameKey + ]; + CNMutableContact *mCNContact = + [[store unifiedContactWithIdentifier:contactToCheck.identifier keysToFetch:keysToFetch error:nil] mutableCopy]; + if(mCNContact == NULL){ + for(NSString *address in contactToCheck.sipAddresses){ + NSString *name = [FastAddressBook normalizeSipURI:address]; + if([LinphoneManager.instance.fastAddressBook.addressBookMap objectForKey:name]){ + return TRUE; + } + } + return FALSE; + }else{ + return FALSE; + } +} + + #pragma mark - Image picker delegate - (void)imagePickerDelegateImage:(UIImage *)image info:(NSDictionary *)info { diff --git a/Classes/ContactsListTableView.m b/Classes/ContactsListTableView.m index a9c8b55b4..40f8e7b3e 100644 --- a/Classes/ContactsListTableView.m +++ b/Classes/ContactsListTableView.m @@ -157,7 +157,8 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) { if ([ContactSelection getSipFilter] || [ContactSelection emailFilterEnabled]) { add = false; - }else if ([FastAddressBook contactHasValidSipDomain:contact]) { + } + if ([FastAddressBook contactHasValidSipDomain:contact]) { add = true; }else if (contact.friend && linphone_presence_model_get_basic_status( @@ -191,10 +192,7 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) { [subAr insertObject:contact atIndex:idx]; } } - //} } - [super loadData]; - // since we refresh the tableview, we must perform this on main // thread dispatch_async(dispatch_get_main_queue(), ^(void) { @@ -208,6 +206,7 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) { } [LinphoneManager.instance setLinphoneManagerAddressBookMap:addressBookMap]; } + [super loadData]; _ongoing = FALSE; } @@ -405,23 +404,15 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) { } UIContactCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell setContact:NULL]; - [[LinphoneManager.instance fastAddressBook] - deleteContact:contact]; - [tableView - deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] - withRowAnimation:UITableViewRowAnimationFade]; - [tableView endUpdates]; + [[LinphoneManager.instance fastAddressBook] deleteContact:contact]; + [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; + [tableView endUpdates]; - [NSNotificationCenter.defaultCenter - addObserver:self - selector:@selector(onAddressBookUpdate:) + [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(onAddressBookUpdate:) name:kLinphoneAddressBookUpdate object:nil]; - dispatch_async(dispatch_get_main_queue(), - ^{ - [self loadData]; - }); - } + [self loadData]; + } } - (void)removeSelectionUsing:(void (^)(NSIndexPath *))remover { @@ -437,10 +428,9 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) { } UIContactCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell setContact:NULL]; - [[LinphoneManager.instance fastAddressBook] deleteContact:contact]; + [[LinphoneManager.instance fastAddressBook] deleteContact:contact]; - [NSNotificationCenter.defaultCenter - addObserver:self + [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(onAddressBookUpdate:) name:kLinphoneAddressBookUpdate object:nil]; diff --git a/Classes/ContactsListView.m b/Classes/ContactsListView.m index a4e38b49a..56dc3399e 100644 --- a/Classes/ContactsListView.m +++ b/Classes/ContactsListView.m @@ -157,6 +157,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)changeView:(ContactsCategory)view { CGRect frame = _selectedButtonImage.frame; if (view == ContactsAll && !allButton.selected) { + //REQUIRED TO RELOAD WITH FILTER [LinphoneManager.instance setContactsUpdated:TRUE]; frame.origin.x = allButton.frame.origin.x; [ContactSelection setSipFilter:nil]; @@ -165,6 +166,7 @@ static UICompositeViewDescription *compositeDescription = nil; linphoneButton.selected = FALSE; [tableController loadData]; } else if (view == ContactsLinphone && !linphoneButton.selected) { + //REQUIRED TO RELOAD WITH FILTER [LinphoneManager.instance setContactsUpdated:TRUE]; frame.origin.x = linphoneButton.frame.origin.x; [ContactSelection setSipFilter:LinphoneManager.instance.contactFilter]; @@ -204,6 +206,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (IBAction)onDeleteClick:(id)sender { NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected contacts?", nil)]; + [LinphoneManager.instance setContactsUpdated:TRUE]; [UIConfirmationDialog ShowWithMessage:msg cancelMessage:nil confirmMessage:nil @@ -218,13 +221,13 @@ static UICompositeViewDescription *compositeDescription = nil; } - (IBAction)onEditionChangeClick:(id)sender { - allButton.hidden = linphoneButton.hidden = _selectedButtonImage.hidden = addButton.hidden = - self.tableController.isEditing; + allButton.hidden = linphoneButton.hidden = _selectedButtonImage.hidden = addButton.hidden = self.tableController.isEditing; } - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { searchBar.text = @""; [self searchBar:searchBar textDidChange:@""]; + [LinphoneManager.instance setContactsUpdated:TRUE]; [tableController loadData]; [searchBar resignFirstResponder]; } @@ -242,6 +245,7 @@ static UICompositeViewDescription *compositeDescription = nil; // searchBar.text = [searchText uppercaseString]; [ContactSelection setNameOrEmailFilter:searchText]; if (searchText.length == 0) { + [LinphoneManager.instance setContactsUpdated:TRUE]; [tableController loadData]; } else { [tableController loadSearchedData]; diff --git a/Classes/ImagePickerView.m b/Classes/ImagePickerView.m index 7f8fa79e8..584f4088a 100644 --- a/Classes/ImagePickerView.m +++ b/Classes/ImagePickerView.m @@ -18,7 +18,9 @@ */ #import - +#import +#import +#import #import "ImagePickerView.h" #import "PhoneMainView.h" @@ -226,13 +228,25 @@ static UICompositeViewDescription *compositeDescription = nil; if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { [sheet addButtonWithTitle:NSLocalizedString(@"Camera", nil) block:^() { - block(UIImagePickerControllerSourceTypeCamera); + if([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo] == AVAuthorizationStatusAuthorized ){ + if([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusDenied ){ + block(UIImagePickerControllerSourceTypeCamera); + }else{ + [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Photo's permission", nil) message:NSLocalizedString(@"Photo not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show]; + } + }else { + [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Camera's permission", nil) message:NSLocalizedString(@"Camera not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show]; + } }]; } if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { [sheet addButtonWithTitle:NSLocalizedString(@"Photo library", nil) block:^() { - block(UIImagePickerControllerSourceTypePhotoLibrary); + if([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusDenied ){ + block(UIImagePickerControllerSourceTypePhotoLibrary); + }else{ + [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Photo's permission", nil) message:NSLocalizedString(@"Photo not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show]; + } }]; } [sheet addCancelButtonWithTitle:NSLocalizedString(@"Cancel", nil) block:nil]; diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 7735cd659..856d04c39 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -84,7 +84,7 @@ } LinphoneManager *instance = LinphoneManager.instance; [instance becomeActive]; - + if (instance.fastAddressBook.needToUpdate) { //Update address book for external changes if (PhoneMainView.instance.currentView == ContactsListView.compositeViewDescription || PhoneMainView.instance.currentView == ContactDetailsView.compositeViewDescription) { @@ -193,7 +193,7 @@ answer.activationMode = UIUserNotificationActivationModeForeground; answer.destructive = NO; answer.authenticationRequired = YES; - + UIMutableUserNotificationAction *decline = [[UIMutableUserNotificationAction alloc] init]; decline.identifier = @"decline"; decline.title = NSLocalizedString(@"Decline", nil); @@ -212,7 +212,7 @@ } - (UIUserNotificationCategory *)getAccountExpiryNotificationCategory { - + UIMutableUserNotificationCategory *expiryNotification = [[UIMutableUserNotificationCategory alloc] init]; expiryNotification.identifier = @"expiry_notification"; return expiryNotification; @@ -333,20 +333,20 @@ [RootViewManager setupWithPortrait:(PhoneMainView *)self.window.rootViewController]; [PhoneMainView.instance startUp]; [PhoneMainView.instance updateStatusBar:nil]; - + if (bgStartId != UIBackgroundTaskInvalid) [[UIApplication sharedApplication] endBackgroundTask:bgStartId]; - + //Enable all notification type. VoIP Notifications don't present a UI but we will use this to show local nofications later UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert| UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; - + //register the notification settings [application registerUserNotificationSettings:notificationSettings]; - + //output what state the app is in. This will be used to see when the app is started in the background LOGI(@"app launched with state : %li", (long)application.applicationState); LOGI(@"FINISH LAUNCHING WITH OPTION : %@", launchOptions.description); - + return YES; } @@ -384,18 +384,18 @@ UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Remote configuration", nil) message:NSLocalizedString(@"This operation will load a remote configuration. Continue ?", nil) preferredStyle:UIAlertControllerStyleAlert]; - + UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"No", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}]; - + UIAlertAction* yesAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Yes", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { [self showWaitingIndicator]; [self attemptRemoteConfiguration]; }]; - + [errView addAction:defaultAction]; [errView addAction:yesAction]; @@ -422,79 +422,64 @@ } - (void)processRemoteNotification:(NSDictionary *)userInfo { + if (linphone_core_get_calls(LC)) // if there are calls, obviously our TCP socket shall be working + return; NSDictionary *aps = [userInfo objectForKey:@"aps"]; + if (!aps) + return; - if (aps != nil) { - NSDictionary *alert = [aps objectForKey:@"alert"]; - NSString *loc_key = [aps objectForKey:@"loc-key"]; - NSString *callId = [aps objectForKey:@"call-id"]; - if (alert != nil) { - loc_key = [alert objectForKey:@"loc-key"]; - /*if we receive a remote notification, it is probably because our TCP background socket was no more working. - As a result, break it and refresh registers in order to make sure to receive incoming INVITE or MESSAGE*/ - if (linphone_core_get_calls(LC) == NULL) { // if there are calls, obviously our TCP socket shall be working - //linphone_core_set_network_reachable(LC, FALSE); - if (!linphone_core_is_network_reachable(LC)) { - LinphoneManager.instance.connectivity = none; //Force connectivity to be discovered again - [LinphoneManager.instance setupNetworkReachabilityCallback]; - } - if (loc_key != nil) { + NSString *loc_key = [aps objectForKey:@"loc-key"]; + NSString *callId = [aps objectForKey:@"call-id"] ?: @""; + if (!loc_key) + return; - callId = [userInfo objectForKey:@"call-id"]; - if (callId != nil) { - if ([callId isEqualToString:@""]){ - //Present apn pusher notifications for info - if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { - UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init]; - content.title = @"APN Pusher"; - content.body = @"Push notification received !"; - - UNNotificationRequest *req = [UNNotificationRequest requestWithIdentifier:@"call_request" content:content trigger:NULL]; - [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:req withCompletionHandler:^(NSError * _Nullable error) { - // Enable or disable features based on authorization. - if (error) { - LOGD(@"Error while adding notification request :"); - LOGD(error.description); - } - }]; - } else { - UILocalNotification *notification = [[UILocalNotification alloc] init]; - notification.repeatInterval = 0; - notification.alertBody = @"Push notification received !"; - notification.alertTitle = @"APN Pusher"; - [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; - } - } else { - [LinphoneManager.instance addPushCallId:callId]; - } - } else if ([callId isEqual: @""]) { - LOGE(@"PushNotification: does not have call-id yet, fix it !"); - } - } - } - } - - if (callId && [self addLongTaskIDforCallID:callId]) { - if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive && loc_key && - index > 0) { - if ([loc_key isEqualToString:@"IC_MSG"]) { - [LinphoneManager.instance startPushLongRunningTask:FALSE callId:callId]; - [self fixRing]; - } else if ([loc_key isEqualToString:@"IM_MSG"]) { - [LinphoneManager.instance startPushLongRunningTask:TRUE callId:callId]; - } - } - } + if ([self addLongTaskIDforCallID:callId] && [UIApplication sharedApplication].applicationState != UIApplicationStateActive) { + if ([loc_key isEqualToString:@"IC_MSG"]) + [LinphoneManager.instance startPushLongRunningTask:FALSE callId:callId]; + else if ([loc_key isEqualToString:@"IM_MSG"]) + [LinphoneManager.instance startPushLongRunningTask:TRUE callId:callId]; } + + // if we receive a remote notification, it is probably because our TCP background socket was no more working. + // As a result, break it and refresh registers in order to make sure to receive incoming INVITE or MESSAGE + if (!linphone_core_is_network_reachable(LC)) { + LinphoneManager.instance.connectivity = none; //Force connectivity to be discovered again + [LinphoneManager.instance setupNetworkReachabilityCallback]; + } + + if ([callId isEqualToString:@""]) { + //Present apn pusher notifications for info + if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { + UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init]; + content.title = @"APN Pusher"; + content.body = @"Push notification received !"; + + UNNotificationRequest *req = [UNNotificationRequest requestWithIdentifier:@"call_request" content:content trigger:NULL]; + [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:req withCompletionHandler:^(NSError * _Nullable error) { + // Enable or disable features based on authorization. + if (error) { + LOGD(@"Error while adding notification request :"); + LOGD(error.description); + } + }]; + } else { + UILocalNotification *notification = [[UILocalNotification alloc] init]; + notification.repeatInterval = 0; + notification.alertBody = @"Push notification received !"; + notification.alertTitle = @"APN Pusher"; + [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; + } + } else + [LinphoneManager.instance addPushCallId:callId]; + LOGI(@"Notification %@ processed", userInfo.description); } - (BOOL)addLongTaskIDforCallID:(NSString *)callId { NSDictionary *dict = LinphoneManager.instance.pushDict; - if ([[dict allKeys] indexOfObject:callId] != NSNotFound) { + if ([[dict allKeys] indexOfObject:callId] != NSNotFound) return FALSE; - } LOGI(@"Adding long running task for call id : %@ with index : 1", callId); [dict setValue:[NSNumber numberWithInt:1] forKey:callId]; @@ -503,7 +488,6 @@ - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { LOGI(@"%@ : %@", NSStringFromSelector(_cmd), userInfo); - [self processRemoteNotification:userInfo]; } @@ -513,9 +497,9 @@ while (rooms) { const LinphoneAddress *room_from_address = linphone_chat_room_get_peer_address((LinphoneChatRoom *)rooms->data); char *room_from = linphone_address_as_string_uri_only(room_from_address); - if (room_from && strcmp(from, room_from) == 0) { + if (room_from && strcmp(from, room_from) == 0) return rooms->data; - } + rooms = rooms->next; } return NULL; @@ -536,31 +520,31 @@ #pragma mark - PushKit Functions +- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(PKPushType)type { + LOGI(@"PushKit credentials updated"); + LOGI(@"voip token: %@", (credentials.token)); + dispatch_async(dispatch_get_main_queue(), ^{ + [LinphoneManager.instance setPushNotificationToken:credentials.token]; + }); +} + - (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(NSString *)type { LOGI(@"PushKit Token invalidated"); dispatch_async(dispatch_get_main_queue(), ^{[LinphoneManager.instance setPushNotificationToken:nil];}); } -- (void)pushRegistry:(PKPushRegistry *)registry - didReceiveIncomingPushWithPayload:(PKPushPayload *)payload - forType:(NSString *)type { - - LOGI(@"PushKit : incoming voip notfication: %@", payload.dictionaryPayload); +#ifdef __IPHONE_11_0 +- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion { +#else +- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type { +#endif [LinphoneManager.instance setupNetworkReachabilityCallback]; - dispatch_async(dispatch_get_main_queue(), ^{ - [self processRemoteNotification:payload.dictionaryPayload]; - }); -} - -- (void)pushRegistry:(PKPushRegistry *)registry - didUpdatePushCredentials:(PKPushCredentials *)credentials - forType:(PKPushType)type { - LOGI(@"PushKit credentials updated"); - LOGI(@"voip token: %@", (credentials.token)); - dispatch_async(dispatch_get_main_queue(), ^{ - [LinphoneManager.instance setPushNotificationToken:credentials.token]; - }); + //to avoid IOS to suspend the app before being able to launch long running task + [self processRemoteNotification:payload.dictionaryPayload]; +#ifdef __IPHONE_11_0 + dispatch_async(dispatch_get_main_queue(), ^{completion();}); +#endif } #pragma mark - UNUserNotifications Framework @@ -864,11 +848,11 @@ didInvalidatePushTokenForType:(NSString *)type { UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Success", nil) message:NSLocalizedString(@"Remote configuration successfully fetched and applied.", nil) preferredStyle:UIAlertControllerStyleAlert]; - + UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}]; - + [errView addAction:defaultAction]; [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; @@ -880,11 +864,11 @@ didInvalidatePushTokenForType:(NSString *)type { UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Failure", nil) message:NSLocalizedString(@"Failed configuring from the specified URL.", nil) preferredStyle:UIAlertControllerStyleAlert]; - + UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}]; - + [errView addAction:defaultAction]; [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; } @@ -894,13 +878,13 @@ didInvalidatePushTokenForType:(NSString *)type { _waitingIndicator = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Fetching remote configuration...", nil) message:@"" preferredStyle:UIAlertControllerStyleAlert]; - + UIActivityIndicatorView *progress = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 60, 30, 30)]; progress.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; - + [_waitingIndicator setValue:progress forKey:@"accessoryView"]; [progress setColor:[UIColor blackColor]]; - + [progress startAnimating]; [PhoneMainView.instance presentViewController:_waitingIndicator animated:YES completion:nil]; } diff --git a/Classes/LinphoneCoreSettingsStore.m b/Classes/LinphoneCoreSettingsStore.m index 3d4659bc6..baa3c7f3c 100644 --- a/Classes/LinphoneCoreSettingsStore.m +++ b/Classes/LinphoneCoreSettingsStore.m @@ -808,14 +808,14 @@ if ([turn_username length] > 0) { const LinphoneAuthInfo *turnAuthInfo = nil; - if ([turn_password length] > 0) + if ([turn_password length] > 0){ turnAuthInfo = linphone_auth_info_new([turn_username UTF8String], NULL, [turn_password UTF8String], NULL, NULL, NULL); - else - turnAuthInfo = linphone_core_find_auth_info(LC, NULL, [turn_username UTF8String], NULL); - if (turnAuthInfo != NULL) linphone_core_add_auth_info(LC, turnAuthInfo); - linphone_nat_policy_set_stun_server_username(LNP, linphone_auth_info_get_username(turnAuthInfo)); + }else{ + turnAuthInfo = linphone_core_find_auth_info(LC, NULL, [turn_username UTF8String], NULL); + } + linphone_nat_policy_set_stun_server_username(LNP, [turn_username UTF8String]); } } else { linphone_nat_policy_enable_stun(LNP, FALSE); diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 825e65bec..9fe060d85 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -858,6 +858,8 @@ static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char if (state == LinphoneCallConnected && !mCallCenter) { /*only register CT call center CB for connected call*/ [self setupGSMInteraction]; + if (!_bluetoothEnabled) + [self setSpeakerEnabled:FALSE]; } // Post event @@ -1627,7 +1629,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach linphone_proxy_config_expires(proxy, 0); } linphone_core_set_network_reachable(theLinphoneCore, true); - linphone_core_iterate(theLinphoneCore); + [LinphoneManager.instance iterate]; LOGI(@"Network connectivity changed to type [%s]", (newConnectivity == wifi ? "wifi" : "wwan")); lm.connectivity = newConnectivity; } @@ -1717,7 +1719,14 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach // scheduling loop - (void)iterate { + UIBackgroundTaskIdentifier coreIterateTaskId = 0; + coreIterateTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ + LOGW(@"Background task for core iteration launching expired."); + [[UIApplication sharedApplication] endBackgroundTask:coreIterateTaskId]; + }]; linphone_core_iterate(theLinphoneCore); + if (coreIterateTaskId != UIBackgroundTaskInvalid) + [[UIApplication sharedApplication] endBackgroundTask:coreIterateTaskId]; } - (void)audioSessionInterrupted:(NSNotification *)notification { @@ -1731,6 +1740,9 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach /** Should be called once per linphone_core_new() */ - (void)finishCoreConfiguration { + + //Force keep alive to workaround push notif on chat message + linphone_core_enable_keep_alive(theLinphoneCore, true); // get default config from bundle NSString *zrtpSecretsFileName = [LinphoneManager documentFile:@"zrtp_secrets"]; @@ -2003,7 +2015,7 @@ void popup_link_account_cb(LinphoneAccountCreator *creator, LinphoneAccountCreat /*call iterate once immediately in order to initiate background connections with sip server or remote provisioning * grab, if any */ - linphone_core_iterate(theLinphoneCore); + [self iterate]; // start scheduler mIterateTimer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(iterate) userInfo:nil repeats:YES]; @@ -2236,7 +2248,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { proxies = proxies->next; } // force registration update first, then update friend list subscription - linphone_core_iterate(theLinphoneCore); + [self iterate]; } const MSList *lists = linphone_core_get_friends_lists(LC); @@ -2266,28 +2278,6 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { } if ([LinphoneManager.instance lpConfigBoolForKey:@"backgroundmode_preference"]) { - // register keepalive - if ([[UIApplication sharedApplication] - setKeepAliveTimeout:600 /*(NSTimeInterval)linphone_proxy_config_get_expires(proxyCfg)*/ - handler:^{ - LOGW(@"keepalive handler"); - mLastKeepAliveDate = [NSDate date]; - if (theLinphoneCore == nil) { - LOGW(@"It seems that Linphone BG mode was deactivated, just skipping"); - return; - } - [_iapManager check]; - if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { - // For registration register - [self refreshRegisters]; - } - linphone_core_iterate(theLinphoneCore); - }]) { - - LOGI(@"keepalive handler succesfully registered"); - } else { - LOGI(@"keepalive handler cannot be registered"); - } shouldEnterBgMode = TRUE; } } @@ -2306,7 +2296,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { /*stop the video preview*/ if (theLinphoneCore) { linphone_core_enable_video_preview(theLinphoneCore, FALSE); - linphone_core_iterate(theLinphoneCore); + [self iterate]; } linphone_core_stop_dtmf_stream(theLinphoneCore); diff --git a/Classes/LinphoneUI/Base.lproj/UICompositeView.xib b/Classes/LinphoneUI/Base.lproj/UICompositeView.xib index 20bf9702e..093c2cb44 100644 --- a/Classes/LinphoneUI/Base.lproj/UICompositeView.xib +++ b/Classes/LinphoneUI/Base.lproj/UICompositeView.xib @@ -1,9 +1,13 @@ - - + + + + + - - + + + @@ -23,73 +27,72 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + diff --git a/Classes/LinphoneUI/UICompositeView.m b/Classes/LinphoneUI/UICompositeView.m index a48be7d61..716623fd1 100644 --- a/Classes/LinphoneUI/UICompositeView.m +++ b/Classes/LinphoneUI/UICompositeView.m @@ -387,7 +387,9 @@ return UIInterfaceOrientationPortrait; } -#define IPHONE_STATUSBAR_HEIGHT 20 +#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) +#define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0) +#define IPHONE_STATUSBAR_HEIGHT (IS_IPHONE_X ? 35 : 20) - (void)update:(UICompositeViewDescription *)description tabBar:(NSNumber *)tabBar @@ -571,6 +573,7 @@ // Compute frame for each elements CGRect viewFrame = self.view.frame; int origin = currentViewDescription.fullscreen ? 0 : IPHONE_STATUSBAR_HEIGHT; + // 1. status bar - fixed size on top CGRect statusBarFrame = self.statusBarView.frame; diff --git a/Classes/LinphoneUI/UIVideoButton.m b/Classes/LinphoneUI/UIVideoButton.m index accf67675..6b1b36ea7 100644 --- a/Classes/LinphoneUI/UIVideoButton.m +++ b/Classes/LinphoneUI/UIVideoButton.m @@ -58,7 +58,7 @@ INIT_WITH_COMMON_CF { if (!linphone_core_video_display_enabled(LC)) return; - + [LinphoneManager.instance setSpeakerEnabled:FALSE]; [self setEnabled:FALSE]; [waitView startAnimating]; diff --git a/Classes/MainStoryboard.storyboard b/Classes/MainStoryboard.storyboard index d720f290a..c153f01fd 100644 --- a/Classes/MainStoryboard.storyboard +++ b/Classes/MainStoryboard.storyboard @@ -1,7 +1,12 @@ - - + + + + + - + + + @@ -15,15 +20,15 @@ - + - - + + - + @@ -39,9 +44,4 @@ - - - - - diff --git a/Classes/PhoneMainView.h b/Classes/PhoneMainView.h index c50068483..29b8a5f64 100644 --- a/Classes/PhoneMainView.h +++ b/Classes/PhoneMainView.h @@ -111,6 +111,8 @@ - (void)createChatRoomWithSubject:(const char *)subject addresses:(bctbx_list_t *)addresses andWaitView:(UIView *)waitView; + (PhoneMainView*) instance; +- (BOOL)isIphoneXDevice; + @end void main_view_chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState); diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index 3f6c1c72a..126b0ddc6 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -202,11 +202,33 @@ static RootViewManager *rootViewManagerInstance = nil; - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [NSNotificationCenter.defaultCenter removeObserver:self]; + [NSNotificationCenter.defaultCenter removeObserver:self name:UIDeviceBatteryLevelDidChangeNotification object:nil]; [[UIDevice currentDevice] setBatteryMonitoringEnabled:NO]; } +/* IPHONE X specific : hide the HomeIndcator when not used */ +#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) +#define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0) +#define IPHONE_STATUSBAR_HEIGHT (IS_IPHONE_X ? 35 : 20) + +- (BOOL)isIphoneXDevice{ + return IS_IPHONE_X; +} + - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; + if([self isIphoneXDevice]){ + if(@available(iOS 11.0, *)) { + [self childViewControllerForHomeIndicatorAutoHidden]; + [self prefersHomeIndicatorAutoHidden]; + [self setNeedsUpdateOfHomeIndicatorAutoHidden]; + } + } + +} + +- (BOOL)prefersHomeIndicatorAutoHidden{ + return YES; } - (void)setVolumeHidden:(BOOL)hidden { @@ -486,7 +508,7 @@ static RootViewManager *rootViewManagerInstance = nil; - (void)startUp { @try { LinphoneManager *lm = LinphoneManager.instance; - LOGE(@"%s", linphone_global_state_to_string( + LOGI(@"%s", linphone_global_state_to_string( linphone_core_get_global_state(LC))); if (linphone_core_get_global_state(LC) != LinphoneGlobalOn) { [self changeCurrentView:DialerView.compositeViewDescription]; diff --git a/Classes/ProviderDelegate.m b/Classes/ProviderDelegate.m index 276273131..5f182c710 100644 --- a/Classes/ProviderDelegate.m +++ b/Classes/ProviderDelegate.m @@ -89,12 +89,11 @@ completion:^(NSError *error) { if (error) { LOGE(@"CallKit: cannot complete incoming call from [%@] caused by [%@]",handle,[error localizedDescription]); - if ( [error code] == CXErrorCodeIncomingCallErrorFilteredByDoNotDisturb - || [error code] == CXErrorCodeIncomingCallErrorFilteredByBlockList) { + if ([error code] == CXErrorCodeIncomingCallErrorFilteredByDoNotDisturb || + [error code] == CXErrorCodeIncomingCallErrorFilteredByBlockList) linphone_call_decline(call,LinphoneReasonBusy); /*to give a chance for other devices to answer*/ - } else { + else linphone_call_decline(call,LinphoneReasonUnknown); - } } linphone_call_unref(call); }]; diff --git a/Classes/Utils/FastAddressBook.m b/Classes/Utils/FastAddressBook.m index 23a47cb51..800c4c58a 100644 --- a/Classes/Utils/FastAddressBook.m +++ b/Classes/Utils/FastAddressBook.m @@ -129,7 +129,8 @@ } - (void) fetchContactsInBackGroundThread{ - + [_addressBookMap removeAllObjects]; + _addressBookMap = [NSMutableDictionary dictionary]; CNEntityType entityType = CNEntityTypeContacts; [store requestAccessForEntityType:entityType completionHandler:^(BOOL granted, NSError *_Nullable error) { BOOL success = FALSE; @@ -204,9 +205,7 @@ }else{ // Dosomte } - } - } if (normalizedPhone) ms_free(normalizedPhone); @@ -293,9 +292,6 @@ return ret; } -- (BOOL)deleteContact:(Contact *)contact { - return [self deleteCNContact:contact.person]; -} - (CNContact *)getCNContactFromContact:(Contact *)acontact { NSArray *keysToFetch = @[ @@ -312,20 +308,47 @@ } - (BOOL)deleteCNContact:(CNContact *)contact { + return TRUE;//[self deleteContact:] ; +} + +- (BOOL)deleteContact:(Contact *)contact { CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; - [saveRequest deleteContact:[contact mutableCopy]]; - @try { - BOOL success = [store executeSaveRequest:saveRequest error:nil]; - NSLog(@"Success %d", success); - if(success) - [self fetchContactsInBackGroundThread]; - } @catch (NSException *exception) { - NSLog(@"description = %@", [exception description]); - return FALSE; + NSArray *keysToFetch = @[ + CNContactEmailAddressesKey, CNContactPhoneNumbersKey, + CNContactInstantMessageAddressesKey, CNInstantMessageAddressUsernameKey, + CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey, + CNContactIdentifierKey, CNContactImageDataKey, CNContactNicknameKey + ]; + CNMutableContact *mCNContact = + [[store unifiedContactWithIdentifier:contact.identifier + keysToFetch:keysToFetch + error:nil] mutableCopy]; + if(mCNContact != nil){ + [saveRequest deleteContact:mCNContact]; + @try { + BOOL success = [store executeSaveRequest:saveRequest error:nil]; + NSLog(@"Success %d", success); + [self removeFriend:contact ]; + [LinphoneManager.instance setContactsUpdated:TRUE]; + if([contact.sipAddresses count] > 0){ + for (NSString *sip in contact.sipAddresses) { + [_addressBookMap removeObjectForKey:([FastAddressBook normalizeSipURI:sip] ?: sip)]; + } + } + if([contact.phones count] > 0){ + for (NSString *phone in contact.phones) { + [_addressBookMap removeObjectForKey:([FastAddressBook normalizeSipURI:phone] ?: phone)]; + } + } + } @catch (NSException *exception) { + NSLog(@"description = %@", [exception description]); + return FALSE; + } } return TRUE; } + - (BOOL)deleteAllContacts { NSArray *keys = @[ CNContactPhoneNumbersKey ]; NSString *containerId = store.defaultContainerIdentifier; @@ -416,4 +439,16 @@ lists = lists->next; } } + +-(void)removeFriend:(Contact*) contact{ + BOOL enabled = [LinphoneManager.instance lpConfigBoolForKey:@"use_rls_presence"]; + const MSList *lists = linphone_core_get_friends_lists(LC); + while (lists) { + linphone_friend_list_remove_friend(lists->data, contact.friend); + linphone_friend_list_enable_subscriptions(lists->data, FALSE); + linphone_friend_list_enable_subscriptions(lists->data, enabled); + linphone_friend_list_update_subscriptions(lists->data); + lists = lists->next; + } +} @end diff --git a/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m b/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m index 9fe942583..ec99769a9 100755 --- a/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m +++ b/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m @@ -234,6 +234,7 @@ CGRect IASKCGRectSwap(CGRect rect); - (void)viewDidDisappear:(BOOL)animated { [[NSNotificationCenter defaultCenter] removeObserver:self]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillTerminateNotification object:[UIApplication sharedApplication]]; // hide the keyboard [self.currentFirstResponder resignFirstResponder]; diff --git a/Resources/ar.lproj/Localizable.strings b/Resources/ar.lproj/Localizable.strings index 1296a9a45..2ffe410e6 100644 Binary files a/Resources/ar.lproj/Localizable.strings and b/Resources/ar.lproj/Localizable.strings differ diff --git a/Resources/de.lproj/Localizable.strings b/Resources/de.lproj/Localizable.strings index defa01e49..c80a3c330 100644 Binary files a/Resources/de.lproj/Localizable.strings and b/Resources/de.lproj/Localizable.strings differ diff --git a/Resources/en.lproj/Localizable.strings b/Resources/en.lproj/Localizable.strings index 2154467a9..bc8499f08 100644 Binary files a/Resources/en.lproj/Localizable.strings and b/Resources/en.lproj/Localizable.strings differ diff --git a/Resources/fr.lproj/Localizable.strings b/Resources/fr.lproj/Localizable.strings index 6e4d4297b..15486845e 100644 Binary files a/Resources/fr.lproj/Localizable.strings and b/Resources/fr.lproj/Localizable.strings differ diff --git a/Resources/ja.lproj/Localizable.strings b/Resources/ja.lproj/Localizable.strings index e13263e19..5e589d0b5 100644 Binary files a/Resources/ja.lproj/Localizable.strings and b/Resources/ja.lproj/Localizable.strings differ diff --git a/Resources/linphonerc-factory b/Resources/linphonerc-factory index 5c5903db1..4ffd8c0a2 100644 --- a/Resources/linphonerc-factory +++ b/Resources/linphonerc-factory @@ -8,6 +8,11 @@ hide_assistant_custom_account=0 #Hide in the assistant the button to create a new SIP account hide_assistant_create_account=0 +#Hide in the assistant the logo +show_assistant_logo_in_choice_view_preference=0 + +#Hide in the assistant the button to fetch a remote configuration +show_remote_provisioning_in_assistant=0 #contact_display_username_only=1 #contact_filter_on_default_domain=1 @@ -31,6 +36,8 @@ sip_random_port=0 store_ha1_passwd=0 deliver_imdn=1 linphone_specs=groupchat +#to avoid app to not detect broken sockets when in long running task. +tcp_tls_keepalive=30000 [misc] #by default it is set to 30 by liblinphone diff --git a/Resources/nl.lproj/Localizable.strings b/Resources/nl.lproj/Localizable.strings index ac90746ac..7b40c3461 100644 Binary files a/Resources/nl.lproj/Localizable.strings and b/Resources/nl.lproj/Localizable.strings differ diff --git a/Resources/ru.lproj/Localizable.strings b/Resources/ru.lproj/Localizable.strings index f43c8000c..d12a7ff87 100644 Binary files a/Resources/ru.lproj/Localizable.strings and b/Resources/ru.lproj/Localizable.strings differ diff --git a/Resources/zh_TW.lproj/Localizable.strings b/Resources/zh_TW.lproj/Localizable.strings index 83afe2287..5b7ed5d28 100644 Binary files a/Resources/zh_TW.lproj/Localizable.strings and b/Resources/zh_TW.lproj/Localizable.strings differ diff --git a/linphone-Info.plist b/linphone-Info.plist index f2a5accec..8d83e7037 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -24,7 +24,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.16.5 + 3.16.6 CFBundleURLTypes @@ -53,7 +53,7 @@ CFBundleVersion - 9 + 0 ITSAppUsesNonExemptEncryption ITSEncryptionExportComplianceCode diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index d1e4c46ef..8ef6762b7 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -37,6 +37,7 @@ 244523B01E8266CC0037A187 /* chat_error.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AD1E8266CC0037A187 /* chat_error.png */; }; 244523B11E8266CC0037A187 /* chat_read.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AE1E8266CC0037A187 /* chat_read.png */; }; 244523BE1E8D3A6C0037A187 /* chat_unsecure.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */; }; + 249660951FD6A35F001D55AA /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249660941FD6A359001D55AA /* Photos.framework */; }; 24A3459E1D95797700881A5C /* UIShopTableCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24A3459D1D95797700881A5C /* UIShopTableCell.xib */; }; 24A345A61D95798A00881A5C /* UIShopTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 24A345A51D95798A00881A5C /* UIShopTableCell.m */; }; 24E1C7C01F9A235600D3F981 /* Contacts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24E1C7B91F9A235500D3F981 /* Contacts.framework */; }; @@ -983,6 +984,7 @@ 244523AD1E8266CC0037A187 /* chat_error.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_error.png; sourceTree = ""; }; 244523AE1E8266CC0037A187 /* chat_read.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_read.png; sourceTree = ""; }; 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_unsecure.png; sourceTree = ""; }; + 249660941FD6A359001D55AA /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; }; 24A3459D1D95797700881A5C /* UIShopTableCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UIShopTableCell.xib; sourceTree = ""; }; 24A345A51D95798A00881A5C /* UIShopTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIShopTableCell.m; sourceTree = ""; }; 24A345A71D95799900881A5C /* UIShopTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIShopTableCell.h; sourceTree = ""; }; @@ -1920,6 +1922,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 249660951FD6A35F001D55AA /* Photos.framework in Frameworks */, 24E1C7C01F9A235600D3F981 /* Contacts.framework in Frameworks */, 8C5BCED61EB3859300A9AAEF /* mediastreamer_voip.framework in Frameworks */, 8C2595DF1DEDCC8E007A6424 /* CallKit.framework in Frameworks */, @@ -2298,6 +2301,7 @@ 8C1A1F7C1FA331D40064BE00 /* libsoci_sqlite3.a */, 8CD0B3C81FA2357B008FEB16 /* libsqlite3.a */, 8CD0B3BE1FA22CBA008FEB16 /* libsoci_core.a */, + 249660941FD6A359001D55AA /* Photos.framework */, 24E1C7B91F9A235500D3F981 /* Contacts.framework */, 8C3EAA191EB8D9C300B732B6 /* linphonetester.framework */, 8C5BCEC61EB3859200A9AAEF /* bctoolbox-tester.framework */, @@ -4656,6 +4660,7 @@ "$(SRCROOT)/Classes/Utils/XMLRPC/", ); INFOPLIST_FILE = "linphone-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)"; LINK_WITH_STANDARD_LIBRARIES = YES; @@ -4754,6 +4759,7 @@ "$(SRCROOT)/Classes/Utils/XMLRPC/", ); INFOPLIST_FILE = "linphone-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)"; LINK_WITH_STANDARD_LIBRARIES = YES; @@ -4852,6 +4858,7 @@ "$(SRCROOT)/Classes/Utils/XMLRPC/", ); INFOPLIST_FILE = "linphone-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)"; LINK_WITH_STANDARD_LIBRARIES = YES; @@ -4950,6 +4957,7 @@ "$(SRCROOT)/Classes/Utils/XMLRPC/", ); INFOPLIST_FILE = "linphone-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)"; LINK_WITH_STANDARD_LIBRARIES = YES; diff --git a/submodules/bctoolbox b/submodules/bctoolbox index 8bf53c5cd..8a1d19db3 160000 --- a/submodules/bctoolbox +++ b/submodules/bctoolbox @@ -1 +1 @@ -Subproject commit 8bf53c5cd816c37e008bcceb67cab9527505a9b9 +Subproject commit 8a1d19db312444b0288db7dd62119c982d8beb1e diff --git a/submodules/bcunit b/submodules/bcunit index cf1aaa36c..d8d2f4b40 160000 --- a/submodules/bcunit +++ b/submodules/bcunit @@ -1 +1 @@ -Subproject commit cf1aaa36c5738c25e59c8fafbade388a0081cd53 +Subproject commit d8d2f4b40209e06b400f893cce58e4c6ba73341d diff --git a/submodules/belcard b/submodules/belcard index 7524da1a0..b9e1951be 160000 --- a/submodules/belcard +++ b/submodules/belcard @@ -1 +1 @@ -Subproject commit 7524da1a0548af6ee11ea910858af322161207c4 +Subproject commit b9e1951be4575c62e326d761a7f7c79c5cce9cb9 diff --git a/submodules/belr b/submodules/belr index fdce52526..9364d69fb 160000 --- a/submodules/belr +++ b/submodules/belr @@ -1 +1 @@ -Subproject commit fdce52526089e88c98f19b0d36483cc3d31ef9bd +Subproject commit 9364d69fb16b058066a129f993558d764a6836cf diff --git a/submodules/bzrtp b/submodules/bzrtp index 49a0bb2c0..37adaa053 160000 --- a/submodules/bzrtp +++ b/submodules/bzrtp @@ -1 +1 @@ -Subproject commit 49a0bb2c0237237fc1b4213918dc9032817b25f1 +Subproject commit 37adaa0536432149a51332d8eb04973a3ba6bac9 diff --git a/submodules/cmake-builder b/submodules/cmake-builder index 96d053fac..5bbb321ae 160000 --- a/submodules/cmake-builder +++ b/submodules/cmake-builder @@ -1 +1 @@ -Subproject commit 96d053faca4a35bfd27eef64a081c0a193c97735 +Subproject commit 5bbb321ae4cf522086220efd54bff31f8742f1d1 diff --git a/submodules/linphone b/submodules/linphone index 918b217f9..7c9d810ee 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 918b217f9907cccab2d5be39649b3dab5b02ed38 +Subproject commit 7c9d810eeb8ddb024be426c00e10c71f13329f43 diff --git a/submodules/mediastreamer2 b/submodules/mediastreamer2 index f82450663..3555dbbdd 160000 --- a/submodules/mediastreamer2 +++ b/submodules/mediastreamer2 @@ -1 +1 @@ -Subproject commit f82450663f3d89aa6aa4dc4bae7d060b3a5be495 +Subproject commit 3555dbbdd2119d083166ca65ef7360b0c894268d