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