diff --git a/.gitmodules b/.gitmodules index 9e25e15cb..0e5457618 100644 --- a/.gitmodules +++ b/.gitmodules @@ -105,3 +105,9 @@ [submodule "submodules/externals/libjpeg-turbo"] path = submodules/externals/libjpeg-turbo url = git://git.linphone.org/libjpeg-turbo.git +[submodule "submodules/mediastreamer2"] + path = submodules/mediastreamer2 + url = gitosis@git.linphone.org:mediastreamer2 +[submodule "submodules/ortp"] + path = submodules/ortp + url = gitosis@git.linphone.org:ortp diff --git a/.tx/config b/.tx/config index c5145ec27..304d48ace 100644 --- a/.tx/config +++ b/.tx/config @@ -226,3 +226,9 @@ source_file = Classes/Base.lproj/AssistantLinkView.strings source_lang = en file_filter = Classes/.lproj/CountryListView.strings source_file = Classes/Base.lproj/CountryListView.strings + +[linphone-ios.inappsettingschatstrings] +source_lang = en +file_filter = Settings/InAppSettings.bundle/.lproj/Chat.strings +source_file = Settings/InAppSettings.bundle/en.lproj/Chat.strings +type = STRINGS \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d29ca030..bd1eac65d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,26 @@ Group changes to describe their impact on the project, as follows: Added for new features. Changed for changes in existing functionality. - Deprecated for once-stable features removed in upcoming releases.é + Deprecated for once-stable features removed in upcoming releases. Removed for deprecated features removed in this release. Fixed for any bug fixes. Security to invite users to upgrade in case of vulnerabilities. -## [Unreleased] +## [3.16.2] - 2017-03-01 + +### Added +- Link to GPLv2 licence and Linphone privacy policy in About View. + +### Changed +- Optimization of Contact Lists + +### Fixed +- CallKit bugs when invalid SIP address +- CallKit error screens no longer displayed but ours +- Crashes in Contact Lists +- Presence supports network changes +- Uses of linked address instead of phone number in chat rooms +- Uses of display name instead of sip addresses in chat rooms and history lists ## [3.16.1] - 2017-09-01 @@ -99,9 +113,9 @@ consider inputs to be phone numbers, otherwise SIP addresses. ### Added - Initial version -[Unreleased]: https://github.com/BelledonneCommunications/linphone-iphone/compare/3.15...HEAD -[3.15]: http://www.linphone.org/releases/ios/liblinphone-iphone-sdk-3.14.12.zip -[3.13.9]: http://www.linphone.org/releases/ios/liblinphone-iphone-sdk-3.13.9.zip +[Unreleased]: https://github.com/BelledonneCommunications/linphone-iphone/compare/3.16.2...HEAD +[3.16.2]: http://www.linphone.org/releases/ios/liblinphone-iphone-sdk-3.16.2.zip +[3.16.1]: http://www.linphone.org/releases/ios/liblinphone-iphone-sdk-3.16.1.zip [plugins registration]: https://github.com/BelledonneCommunications/linphone-iphone/blob/3.12.1/Classes/LinphoneManager.m#L1461-L1472 [openh264 issue 2434]: https://github.com/cisco/openh264/issues/2434 [Full IPv6 support to comply Apple requirements]: https://developer.apple.com/news/?id=05042016a diff --git a/Classes/AboutView.h b/Classes/AboutView.h index 0fd2aca63..edb4ce1da 100644 --- a/Classes/AboutView.h +++ b/Classes/AboutView.h @@ -27,7 +27,11 @@ @property(weak, nonatomic) IBOutlet UILabel *descriptionLabel; @property(weak, nonatomic) IBOutlet UILabel *appVersionLabel; @property(weak, nonatomic) IBOutlet UILabel *libVersionLabel; +@property(weak, nonatomic) IBOutlet UILabel *licenceLabel; +@property(weak, nonatomic) IBOutlet UILabel *policyLabel; - (IBAction)onLinkTap:(id)sender; +- (IBAction)onLicenceTap; +- (IBAction)onPolicyTap; - (IBAction)onDialerBackClick:(id)sender; @end diff --git a/Classes/AboutView.m b/Classes/AboutView.m index 7cbd64eee..1bc831b8f 100644 --- a/Classes/AboutView.m +++ b/Classes/AboutView.m @@ -51,6 +51,16 @@ static UICompositeViewDescription *compositeDescription = nil; _nameLabel.text = name; _appVersionLabel.text = [NSString stringWithFormat:@"%@ iOS %s", name, LINPHONE_IOS_VERSION]; _libVersionLabel.text = [NSString stringWithFormat:@"%@ Core %s", name, linphone_core_get_version()]; + UITapGestureRecognizer *tapGestureRecognizer = + [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onLicenceTap)]; + tapGestureRecognizer.numberOfTapsRequired = 1; + [_licenceLabel addGestureRecognizer:tapGestureRecognizer]; + _licenceLabel.userInteractionEnabled = YES; + UITapGestureRecognizer *tapGestureRecognizerPolicy = + [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onPolicyTap)]; + tapGestureRecognizerPolicy.numberOfTapsRequired = 1; + [_policyLabel addGestureRecognizer:tapGestureRecognizerPolicy]; + _policyLabel.userInteractionEnabled = YES; } #pragma mark - Action Functions @@ -63,6 +73,20 @@ static UICompositeViewDescription *compositeDescription = nil; } } +- (IBAction)onPolicyTap { + NSString *url = @"http://www.linphone.org/privacy-policy.html"; + if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { + LOGE(@"Failed to open %@, invalid URL", url); + } +} + +- (IBAction)onLicenceTap { + NSString *url = @"https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html"; + if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { + LOGE(@"Failed to open %@, invalid URL", url); + } +} + - (IBAction)onDialerBackClick:(id)sender { [PhoneMainView.instance popToView:DialerView.compositeViewDescription]; } diff --git a/Classes/AssistantLinkView.m b/Classes/AssistantLinkView.m index aad8083b9..88ea6162e 100644 --- a/Classes/AssistantLinkView.m +++ b/Classes/AssistantLinkView.m @@ -53,14 +53,21 @@ assistant_activate_phone_number_link); LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(LC); - if (cfg && strcmp("sip.linphone.org", linphone_proxy_config_get_domain(cfg)) == 0) { + if (cfg && + strcmp([LinphoneManager.instance lpConfigStringForKey:@"domain_name" + inSection:@"app" + withDefault:@"sip.linphone.org"] + .UTF8String, + linphone_proxy_config_get_domain(cfg)) == 0) { linphone_account_creator_set_username( account_creator, linphone_address_get_username(linphone_proxy_config_get_identity_address(cfg))); const LinphoneAuthInfo *info = linphone_proxy_config_find_auth_info(cfg); - if (linphone_auth_info_get_passwd(info)) - linphone_account_creator_set_password(account_creator, linphone_auth_info_get_passwd(info)); - else - linphone_account_creator_set_ha1(account_creator, linphone_auth_info_get_ha1(info)); + if (info) { + if (linphone_auth_info_get_passwd(info)) + linphone_account_creator_set_password(account_creator, linphone_auth_info_get_passwd(info)); + else + linphone_account_creator_set_ha1(account_creator, linphone_auth_info_get_ha1(info)); + } linphone_account_creator_set_domain(account_creator, linphone_proxy_config_get_domain(cfg)); } else { LOGW(@"Default proxy is NOT a sip.linphone.org, aborting"); diff --git a/Classes/AssistantView.m b/Classes/AssistantView.m index 8787e3327..286f4cec8 100644 --- a/Classes/AssistantView.m +++ b/Classes/AssistantView.m @@ -873,21 +873,27 @@ static UICompositeViewDescription *compositeDescription = nil; UIView *usernameView = [self findView:ViewElement_UsernameFormView inView:self.contentView ofType:UIView.class]; usernameView.hidden = !usernameSwitch.isOn; - ((UITextField *)[self findView:ViewElement_Phone - inView:_linphoneLoginView - ofType:[UIAssistantTextField class]]) - .text = [NSString stringWithUTF8String:nationnal_significant_number]; + if (nationnal_significant_number) { + ((UITextField *)[self findView:ViewElement_Phone + inView:_linphoneLoginView + ofType:[UIAssistantTextField class]]) + .text = [NSString stringWithUTF8String:nationnal_significant_number]; + } ((UITextField *)[self findView:ViewElement_SMSCode inView:_createAccountActivateSMSView ofType:[UITextField class]]) .text = @""; linphone_account_creator_set_activation_code(account_creator, ""); - NSDictionary *country = - [CountryListView countryWithIso:[NSString stringWithUTF8String:dialplan.iso_country_code]]; - [self didSelectCountry:country]; + if (dialplan.iso_country_code) { + NSDictionary *country = [CountryListView + countryWithIso:[NSString stringWithUTF8String:dialplan.iso_country_code]]; + [self didSelectCountry:country]; + } // Reset phone number in account_creator to be sure to let the user retry - linphone_account_creator_set_phone_number(account_creator, nationnal_significant_number, - dialplan.ccc); + if (nationnal_significant_number) { + linphone_account_creator_set_phone_number(account_creator, nationnal_significant_number, + dialplan.ccc); + } }]; defaultAction.accessibilityLabel = @"PopUpResp"; diff --git a/Classes/AudioHelper.m b/Classes/AudioHelper.m new file mode 100644 index 000000000..d8e110899 --- /dev/null +++ b/Classes/AudioHelper.m @@ -0,0 +1,41 @@ +// +// AudioHelper.m +// linphone +// +// Created by REIS Benjamin on 01/03/2017. +// +// + +#import "AudioHelper.h" + +@implementation AudioHelper + ++ (NSArray *)bluetoothRoutes { + return @[ AVAudioSessionPortBluetoothA2DP, AVAudioSessionPortBluetoothLE, AVAudioSessionPortBluetoothHFP ]; +} + ++ (AVAudioSessionPortDescription *)bluetoothAudioDevice { + return [AudioHelper audioDeviceFromTypes:[AudioHelper bluetoothRoutes]]; +} + ++ (AVAudioSessionPortDescription *)builtinAudioDevice { + NSArray *builtinRoutes = @[ AVAudioSessionPortBuiltInMic ]; + return [AudioHelper audioDeviceFromTypes:builtinRoutes]; +} + ++ (AVAudioSessionPortDescription *)speakerAudioDevice { + NSArray *builtinRoutes = @[ AVAudioSessionPortBuiltInSpeaker ]; + return [AudioHelper audioDeviceFromTypes:builtinRoutes]; +} + ++ (AVAudioSessionPortDescription *)audioDeviceFromTypes:(NSArray *)types { + NSArray *routes = [[AVAudioSession sharedInstance] availableInputs]; + for (AVAudioSessionPortDescription *route in routes) { + if ([types containsObject:route.portType]) { + return route; + } + } + return nil; +} + +@end diff --git a/Classes/Base.lproj/AboutView.strings b/Classes/Base.lproj/AboutView.strings index 19b2330a5..19f156594 100644 Binary files a/Classes/Base.lproj/AboutView.strings and b/Classes/Base.lproj/AboutView.strings differ diff --git a/Classes/Base.lproj/AboutView.xib b/Classes/Base.lproj/AboutView.xib index df96118cf..4c02f0eaf 100644 --- a/Classes/Base.lproj/AboutView.xib +++ b/Classes/Base.lproj/AboutView.xib @@ -1,8 +1,11 @@ - + + + + - + @@ -12,7 +15,9 @@ + + @@ -23,19 +28,19 @@ - + - + - + - + - + - + - @@ -150,20 +162,20 @@ - - + + - + - + - + - - + + - - + + - + - + diff --git a/Classes/CallOutgoingView.m b/Classes/CallOutgoingView.m index 166382bb3..a18ebff95 100644 --- a/Classes/CallOutgoingView.m +++ b/Classes/CallOutgoingView.m @@ -94,6 +94,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (IBAction)onRoutesBluetoothClick:(id)sender { [self hideRoutes:TRUE animated:TRUE]; + [LinphoneManager.instance setSpeakerEnabled:FALSE]; [LinphoneManager.instance setBluetoothEnabled:TRUE]; } @@ -105,6 +106,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (IBAction)onRoutesSpeakerClick:(id)sender { [self hideRoutes:TRUE animated:TRUE]; + [LinphoneManager.instance setBluetoothEnabled:FALSE]; [LinphoneManager.instance setSpeakerEnabled:TRUE]; } @@ -119,19 +121,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (IBAction)onDeclineClick:(id)sender { LinphoneCall *call = linphone_core_get_current_call(LC); if (call) { - /*if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { - NSUUID *uuid = [LinphoneManager.instance.providerDelegate.uuids objectForKey:[NSString - stringWithUTF8String:linphone_call_log_get_call_id(linphone_call_get_call_log(call))]]; - if(!uuid) { - linphone_core_terminate_call(LC, call); - return; - } - CXEndCallAction *act = [[CXEndCallAction alloc] initWithCallUUID:uuid]; - CXTransaction *tr = [[CXTransaction alloc] initWithAction:act]; - [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr completion:^(NSError *err){}]; - } else {*/ - linphone_core_terminate_call(LC, call); - //} + linphone_call_terminate(call); } } diff --git a/Classes/CallSideMenuView.m b/Classes/CallSideMenuView.m index 2941d1fb7..9cd6b22a6 100644 --- a/Classes/CallSideMenuView.m +++ b/Classes/CallSideMenuView.m @@ -151,7 +151,7 @@ [result appendString:@"\n"]; // RTP stats section (packet loss count, etc) - rtp_stats_t rtp_stats = linphone_call_stats_get_rtp_stats(stats); + const rtp_stats_t rtp_stats = *linphone_call_stats_get_rtp_stats(stats); [result appendString:[NSString stringWithFormat: @"RTP packets: %llu total, %lld cum loss, %llu discarded, %llu OOT, %llu bad", diff --git a/Classes/CallView.m b/Classes/CallView.m index b936de75b..94744a9e9 100644 --- a/Classes/CallView.m +++ b/Classes/CallView.m @@ -17,6 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#import #import #import #import @@ -629,7 +630,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) { LOGI(@"User declined video proposal"); if (call == linphone_core_get_current_call(LC)) { LinphoneCallParams *params = linphone_core_create_call_params(LC, call); - linphone_core_accept_call_update(LC, call, params); + linphone_call_accept_update(call, params); linphone_call_params_destroy(params); [videoDismissTimer invalidate]; videoDismissTimer = nil; @@ -640,7 +641,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) { if (call == linphone_core_get_current_call(LC)) { LinphoneCallParams *params = linphone_core_create_call_params(LC, call); linphone_call_params_enable_video(params, TRUE); - linphone_core_accept_call_update(LC, call, params); + linphone_call_accept_update(call, params); linphone_call_params_destroy(params); [videoDismissTimer invalidate]; videoDismissTimer = nil; @@ -710,6 +711,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) { - (IBAction)onRoutesBluetoothClick:(id)sender { [self hideRoutes:TRUE animated:TRUE]; + [LinphoneManager.instance setSpeakerEnabled:FALSE]; [LinphoneManager.instance setBluetoothEnabled:TRUE]; } @@ -721,6 +723,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) { - (IBAction)onRoutesSpeakerClick:(id)sender { [self hideRoutes:TRUE animated:TRUE]; + [LinphoneManager.instance setBluetoothEnabled:FALSE]; [LinphoneManager.instance setSpeakerEnabled:TRUE]; } diff --git a/Classes/ChatConversationCreateTableView.m b/Classes/ChatConversationCreateTableView.m index 40204dad0..aaa9cd5e9 100644 --- a/Classes/ChatConversationCreateTableView.m +++ b/Classes/ChatConversationCreateTableView.m @@ -73,14 +73,25 @@ cell = [[UIChatCreateCell alloc] initWithIdentifier:kCellId]; } cell.displayNameLabel.text = [_contacts.allValues objectAtIndex:indexPath.row]; - cell.addressLabel.text = [_contacts.allKeys objectAtIndex:indexPath.row]; + LinphoneAddress *addr = [LinphoneUtils normalizeSipOrPhoneAddress:[_contacts.allKeys objectAtIndex:indexPath.row]]; + if (addr) { + cell.addressLabel.text = [NSString stringWithUTF8String:linphone_address_as_string(addr)]; + } else { + cell.addressLabel.text = [_contacts.allKeys objectAtIndex:indexPath.row]; + } return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; - LinphoneChatRoom *room = linphone_core_get_chat_room_from_uri( - LC, ((NSString *)[_contacts.allKeys objectAtIndex:indexPath.row]).UTF8String); + NSString *uri; + LinphoneAddress *addr = [LinphoneUtils normalizeSipOrPhoneAddress:[_contacts.allKeys objectAtIndex:indexPath.row]]; + if (addr) { + uri = [NSString stringWithUTF8String:linphone_address_as_string(addr)]; + } else { + uri = [_contacts.allKeys objectAtIndex:indexPath.row]; + } + LinphoneChatRoom *room = linphone_core_get_chat_room_from_uri(LC, uri.UTF8String); if (!room) { [PhoneMainView.instance popCurrentView]; UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Invalid address", nil) diff --git a/Classes/ChatConversationTableView.m b/Classes/ChatConversationTableView.m index bae83dd30..ba958810d 100644 --- a/Classes/ChatConversationTableView.m +++ b/Classes/ChatConversationTableView.m @@ -102,6 +102,7 @@ [self.tableView reloadData]; size_t count = bctbx_list_size(messageList); if (count) { + [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:(count - 1) inSection:0]]; [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:(count - 1) inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES]; @@ -126,8 +127,10 @@ if (index == -1 && count > 0) { index = (int)count - 1; } - - linphone_chat_room_mark_as_read(_chatRoom); + if (!([UIApplication sharedApplication].applicationState == UIApplicationStateBackground || + [UIApplication sharedApplication].applicationState == UIApplicationStateInactive)) { + linphone_chat_room_mark_as_read(_chatRoom); + } TabBarView *tab = (TabBarView *)[PhoneMainView.instance.mainViewController getCachedController:NSStringFromClass(TabBarView.class)]; [tab update:YES]; diff --git a/Classes/ChatConversationView.h b/Classes/ChatConversationView.h index 70d787bbc..4af6534c5 100644 --- a/Classes/ChatConversationView.h +++ b/Classes/ChatConversationView.h @@ -65,5 +65,7 @@ - (IBAction)onCallClick:(id)sender; - (IBAction)onDeleteClick:(id)sender; - (IBAction)onEditionChangeClick:(id)sender; +- (void)markAsRead; +- (void)update; @end diff --git a/Classes/ChatConversationView.m b/Classes/ChatConversationView.m index c24b14f34..58afb88d9 100644 --- a/Classes/ChatConversationView.m +++ b/Classes/ChatConversationView.m @@ -157,6 +157,7 @@ static UICompositeViewDescription *compositeDescription = nil; #pragma mark - - (void)setChatRoom:(LinphoneChatRoom *)chatRoom { + _chatRoom = chatRoom; [_messageField setText:@""]; [_tableController setChatRoom:_chatRoom]; @@ -190,6 +191,16 @@ static UICompositeViewDescription *compositeDescription = nil; _backToCallButton.hidden = !_callButton.hidden; } +- (void)markAsRead { + linphone_chat_room_mark_as_read(_chatRoom); + if (IPAD) { + if (IPAD) { + ChatsListView *listView = VIEW(ChatsListView); + [listView.tableController markCellAsRead:_chatRoom]; + } + } +} + - (void)update { if (_chatRoom == NULL) { LOGW(@"Cannot update chat room header: null contact"); @@ -241,6 +252,10 @@ static UICompositeViewDescription *compositeDescription = nil; [_tableController scrollToBottom:true]; + if (linphone_core_lime_enabled(LC) == LinphoneLimeMandatory && !linphone_chat_room_lime_available(_chatRoom)) { + [LinphoneManager.instance alertLIME:_chatRoom]; + } + return TRUE; } @@ -343,10 +358,11 @@ static UICompositeViewDescription *compositeDescription = nil; if (fromStr && cr_from_string) { if (strcasecmp(cr_from_string, fromStr) == 0) { - if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground) { + if (!([UIApplication sharedApplication].applicationState == UIApplicationStateBackground || + [UIApplication sharedApplication].applicationState == UIApplicationStateInactive)) { linphone_chat_room_mark_as_read(room); - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:self]; } + [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:self]; [_tableController addChatEntry:chat]; [_tableController scrollToLastUnread:TRUE]; } diff --git a/Classes/ChatsListTableView.h b/Classes/ChatsListTableView.h index 9754a4f99..79f50c9ee 100644 --- a/Classes/ChatsListTableView.h +++ b/Classes/ChatsListTableView.h @@ -24,4 +24,5 @@ @interface ChatsListTableView : UICheckBoxTableView - (void)loadData; +- (void)markCellAsRead:(LinphoneChatRoom *)chatRoom; @end diff --git a/Classes/ChatsListTableView.m b/Classes/ChatsListTableView.m index 79d551de4..54afa25b9 100644 --- a/Classes/ChatsListTableView.m +++ b/Classes/ChatsListTableView.m @@ -63,6 +63,14 @@ } } +- (void)layoutSubviews { + [self.tableView layoutSubviews]; + + CGSize contentSize = self.tableView.contentSize; + contentSize.width = self.tableView.bounds.size.width; + self.tableView.contentSize = contentSize; +} + #pragma mark - static int sorted_history_comparison(LinphoneChatRoom *to_insert, LinphoneChatRoom *elem) { @@ -130,6 +138,15 @@ static void chatTable_free_chatrooms(void *data) { } } +- (void)markCellAsRead:(LinphoneChatRoom *)chatRoom { + int idx = bctbx_list_index(data, VIEW(ChatConversationView).chatRoom); + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; + if (IPAD) { + UIChatCell *cell = (UIChatCell *)[self.tableView cellForRowAtIndexPath:indexPath]; + [cell updateUnreadBadge]; + } +} + #pragma mark - UITableViewDataSource Functions - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { diff --git a/Classes/Contact.h b/Classes/Contact.h index 846884826..edeb22d0c 100644 --- a/Classes/Contact.h +++ b/Classes/Contact.h @@ -21,6 +21,7 @@ @property(nonatomic, strong) NSMutableArray *sipAddresses; @property(nonatomic, strong) NSMutableArray *emails; @property(nonatomic, strong) NSMutableArray *phoneNumbers; +@property BOOL added; - (void)setAvatar:(UIImage *)avatar; - (UIImage *)avatar:(BOOL)thumbnail; diff --git a/Classes/Contact.m b/Classes/Contact.m index 0445d8eb7..6e99cccf0 100644 --- a/Classes/Contact.m +++ b/Classes/Contact.m @@ -7,6 +7,7 @@ // #import "Contact.h" +#import "ContactsListView.h" @implementation Contact @@ -22,7 +23,7 @@ self = [super init]; _person = aperson; _friend = afriend ? linphone_friend_ref(afriend) : NULL; - + _added = FALSE; if (_person) { [self loadProperties]; @@ -32,7 +33,12 @@ if (!_friend) { _friend = linphone_friend_ref(linphone_core_create_friend(LC)); linphone_friend_set_ref_key(_friend, key); - linphone_friend_set_name(_friend, [NSString stringWithFormat:@"%@ %@", _firstName, _lastName].UTF8String); + linphone_friend_set_name( + _friend, + [NSString + stringWithFormat:@"%@%@", _firstName ? _firstName : @"", + _lastName ? [_firstName ? @" " : @"" stringByAppendingString:_lastName] : @""] + .UTF8String); for (NSString* sipAddr in _sipAddresses) { LinphoneAddress* addr = linphone_core_interpret_url(LC, sipAddr.UTF8String); if (addr) { @@ -99,9 +105,10 @@ - (NSString *)displayName { if (_friend) { - // const char *dp = linphone_address_get_display_name(linphone_friend_get_address(_friend)); - //if (dp) - // return [NSString stringWithUTF8String:dp]; + const char *friend_name = linphone_friend_get_name(_friend); + if (friend_name) { + return [NSString stringWithUTF8String:friend_name]; + } } if (_person != nil) { @@ -186,10 +193,12 @@ - (BOOL)setSipAddress:(NSString *)sip atIndex:(NSInteger)index { BOOL ret = FALSE; + NSString *normSip = NULL; if (_person) { + normSip = [self setOrCreateSipContactEntry:index withValue:sip]; NSDictionary *lDict = @{ - (NSString *) kABPersonInstantMessageUsernameKey : sip, (NSString *) - kABPersonInstantMessageServiceKey : LinphoneManager.instance.contactSipField + (NSString *)kABPersonInstantMessageUsernameKey : normSip ? normSip : sip, + (NSString *)kABPersonInstantMessageServiceKey : LinphoneManager.instance.contactSipField }; ret = [self replaceInProperty:kABPersonInstantMessageProperty value:(__bridge CFTypeRef)(lDict) atIndex:index]; @@ -336,6 +345,46 @@ } #pragma mark - ABPerson utils +- (NSString *)setOrCreateSipContactEntry:(NSInteger)index withValue:(NSString *)value { + ABMultiValueRef lcMap = ABRecordCopyValue(_person, kABPersonInstantMessageProperty); + ABMutableMultiValueRef lMap; + NSString *ret = NULL; + if (lcMap != NULL) { + lMap = ABMultiValueCreateMutableCopy(lcMap); + CFRelease(lcMap); + } else { + lMap = ABMultiValueCreateMutable(kABStringPropertyType); + } + CFErrorRef error = NULL; + + NSDictionary *lDict = @{ + (NSString *)kABPersonInstantMessageUsernameKey : value, + (NSString *)kABPersonInstantMessageServiceKey : [LinphoneManager instance].contactSipField + }; + + if (![self replaceInProperty:kABPersonInstantMessageProperty value:(__bridge CFTypeRef)(lDict) atIndex:index]) { + LOGI(@"Can't set contact with value [%@] cause [%@]", value, [(__bridge NSError *)error localizedDescription]); + CFRelease(lMap); + } else { + CFRelease(lMap); + + /*check if message type is kept or not*/ + lcMap = ABRecordCopyValue(_person, kABPersonInstantMessageProperty); + lMap = ABMultiValueCreateMutableCopy(lcMap); + CFRelease(lcMap); + lDict = CFBridgingRelease(ABMultiValueCopyValueAtIndex(lMap, index)); + + if ([lDict objectForKey:(__bridge NSString *)kABPersonInstantMessageServiceKey] == nil) { + /*too bad probably a gtalk number, storing uri*/ + ret = [FastAddressBook normalizeSipURI:value]; + } else if (!_added) { + _added = TRUE; + [LinphoneManager.instance.fastAddressBook saveContact:self]; + } + CFRelease(lMap); + } + return ret ? ret : value; +} - (void)loadProperties { // First and Last name @@ -369,7 +418,7 @@ } // SIP (IM) - { + /*{ _sipAddresses = [[NSMutableArray alloc] init]; ABMultiValueRef map = ABRecordCopyValue(_person, kABPersonInstantMessageProperty); if (map) { @@ -389,8 +438,88 @@ } CFRelease(map); } + }*/ + + // SIP (IM) + { + _sipAddresses = [[NSMutableArray alloc] init]; + ABMultiValueRef lMap = ABRecordCopyValue(_person, kABPersonInstantMessageProperty); + if (lMap) { + for (int i = 0; i < ABMultiValueGetCount(lMap); ++i) { + CFDictionaryRef lDict = ABMultiValueCopyValueAtIndex(lMap, i); + BOOL add = false; + if (CFDictionaryContainsKey(lDict, kABPersonInstantMessageServiceKey)) { + if (CFStringCompare((CFStringRef)[LinphoneManager instance].contactSipField, + CFDictionaryGetValue(lDict, kABPersonInstantMessageServiceKey), + kCFCompareCaseInsensitive) == 0) { + add = true; + } + } else { + // check domain + LinphoneAddress *address = linphone_address_new( + [(NSString *)CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey) UTF8String]); + if (address) { + if ([[ContactSelection getSipFilter] compare:@"*" options:NSCaseInsensitiveSearch] == + NSOrderedSame) { + add = true; + } else { + NSString *domain = [NSString stringWithCString:linphone_address_get_domain(address) + encoding:[NSString defaultCStringEncoding]]; + add = [domain compare:[ContactSelection getSipFilter] options:NSCaseInsensitiveSearch] == + NSOrderedSame; + } + linphone_address_destroy(address); + } else { + add = false; + } + } + if (add) { + NSString *value = (NSString *)(CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey)); + if (value != NULL) { + [_sipAddresses addObject:value]; + } + } + CFRelease(lDict); + } + CFRelease(lMap); + } } + // SIP + /*{ + _sipAddresses = [[NSMutableArray alloc] init]; + ABMultiValueRef lMap = ABRecordCopyValue(_person, kABPersonInstantMessageProperty); + if (lMap) { + for (int i = 0; i < ABMultiValueGetCount(lMap); ++i) { + CFDictionaryRef lDict = ABMultiValueCopyValueAtIndex(lMap, i); + BOOL add = false; + if (CFDictionaryContainsKey(lDict, kABPersonInstantMessageServiceKey)) { + if (CFStringCompare((CFStringRef)LinphoneManager.instance.contactSipField, + CFDictionaryGetValue(lDict, kABPersonInstantMessageServiceKey), + kCFCompareCaseInsensitive) == 0) { + add = true; + } + } else { + add = true; + } + if (add) { + NSString *lValue = + (__bridge NSString *)CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey); + if(lValue) { + NSString *lNormalizedKey = [FastAddressBook normalizeSipURI:lValue]; + if (lNormalizedKey != NULL) { + [_sipAddresses addObject:lNormalizedKey]; + } else { + [_sipAddresses addObject:lValue]; + } + } + } + CFRelease(lDict); + } + CFRelease(lMap); + } + }*/ + // Email { _emails = [[NSMutableArray alloc] init]; diff --git a/Classes/ContactDetailsView.m b/Classes/ContactDetailsView.m index a82a227e9..d5a7b4f1d 100644 --- a/Classes/ContactDetailsView.m +++ b/Classes/ContactDetailsView.m @@ -44,7 +44,9 @@ #pragma mark - - (void)onAddressBookUpdate:(NSNotification *)k { - if (!inhibUpdate && ![_tableController isEditing]) { + if (!inhibUpdate && ![_tableController isEditing] && + (PhoneMainView.instance.currentView == self.compositeViewDescription) && + (_nameLabel.text == PhoneMainView.instance.currentName)) { [self resetData]; } } @@ -220,7 +222,9 @@ } - (void)viewWillDisappear:(BOOL)animated { - [_tableController.tableView removeObserver:self forKeyPath:@"contentSize"]; + if (_tableController && _tableController.tableView && [_tableController.tableView observationInfo]) { + [_tableController.tableView removeObserver:self forKeyPath:@"contentSize"]; + } [super viewWillDisappear:animated]; PhoneMainView.instance.currentName = NULL; if (self.tmpContact) { @@ -258,6 +262,24 @@ self.tmpContact = NULL; [self saveData]; } + BOOL rm = TRUE; + for (NSString *sip in _contact.sipAddresses) { + if (![sip isEqualToString:@""]) { + rm = FALSE; + break; + } + } + if (rm) { + for (NSString *phone in _contact.phoneNumbers) { + if (![phone isEqualToString:@""]) { + rm = FALSE; + break; + } + } + } + if (rm) { + [LinphoneManager.instance.fastAddressBook removeContact:_contact]; + } } #pragma mark - UICompositeViewDelegate Functions @@ -382,6 +404,25 @@ static UICompositeViewDescription *compositeDescription = nil; } [self saveData]; [self.tableController.tableView reloadData]; + } else { + BOOL rm = TRUE; + for (NSString *sip in _contact.sipAddresses) { + if (![sip isEqualToString:@""]) { + rm = FALSE; + break; + } + } + if (rm) { + for (NSString *phone in _contact.phoneNumbers) { + if (![phone isEqualToString:@""]) { + rm = FALSE; + break; + } + } + } + if (rm) { + [LinphoneManager.instance.fastAddressBook removeContact:_contact]; + } } [self setEditing:FALSE]; diff --git a/Classes/ContactsListView.m b/Classes/ContactsListView.m index cc9d4d127..5c46a68d4 100644 --- a/Classes/ContactsListView.m +++ b/Classes/ContactsListView.m @@ -120,7 +120,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - + [ContactSelection setNameOrEmailFilter:@""]; _searchBar.showsCancelButton = (_searchBar.text.length > 0); if (tableController.isEditing) { diff --git a/Classes/DialerView.m b/Classes/DialerView.m index b09b2224d..766085646 100644 --- a/Classes/DialerView.m +++ b/Classes/DialerView.m @@ -169,6 +169,13 @@ static UICompositeViewDescription *compositeDescription = nil; frame.origin = CGPointMake(0, 0); _videoPreview.frame = frame; _padView.hidden = !IPAD && UIInterfaceOrientationIsLandscape(toInterfaceOrientation); + if (linphone_core_get_calls_nb(LC)) { + _backButton.hidden = FALSE; + _addContactButton.hidden = TRUE; + } else { + _backButton.hidden = TRUE; + _addContactButton.hidden = FALSE; + } } - (void)viewDidAppear:(BOOL)animated { diff --git a/Classes/InAppProductsManager.m b/Classes/InAppProductsManager.m index 94ab2c96d..412afbdb3 100644 --- a/Classes/InAppProductsManager.m +++ b/Classes/InAppProductsManager.m @@ -301,7 +301,12 @@ - (NSString *)getPassword { NSString *pass; LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(LC); - if (cfg && strcmp("sip.linphone.org", linphone_proxy_config_get_domain(cfg)) == 0) { + if (cfg && + strcmp([LinphoneManager.instance lpConfigStringForKey:@"domain_name" + inSection:@"app" + withDefault:@"sip.linphone.org"] + .UTF8String, + linphone_proxy_config_get_domain(cfg)) == 0) { const LinphoneAuthInfo *info = linphone_proxy_config_find_auth_info(cfg); const char *tmpPass; if (linphone_auth_info_get_passwd(info)) { diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 69660ef11..fc3cb4c7e 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -17,12 +17,12 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#import "PhoneMainView.h" -#import "ContactsListView.h" -#import "ContactDetailsView.h" -#import "ShopView.h" -#import "linphoneAppDelegate.h" +#import "LinphoneAppDelegate.h" #import "AddressBook/ABPerson.h" +#import "ContactDetailsView.h" +#import "ContactsListView.h" +#import "PhoneMainView.h" +#import "ShopView.h" #import "CoreTelephony/CTCallCenter.h" #import "CoreTelephony/CTCall.h" @@ -117,7 +117,7 @@ } if ((floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max)) { if ([LinphoneManager.instance lpConfigBoolForKey:@"autoanswer_notif_preference"]) { - linphone_core_accept_call(LC, call); + linphone_call_accept(call); [PhoneMainView.instance changeCurrentView:CallView.compositeViewDescription]; } else { [PhoneMainView.instance displayIncomingCall:call]; @@ -276,7 +276,6 @@ actions:[NSArray arrayWithObjects:act_confirm, act_deny, nil] intentIdentifiers:[[NSMutableArray alloc] init] options:UNNotificationCategoryOptionCustomDismissAction]; - [UNUserNotificationCenter currentNotificationCenter].delegate = self; [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | @@ -422,8 +421,10 @@ if (aps != nil) { NSDictionary *alert = [aps objectForKey:@"alert"]; + NSString *loc_key = [aps objectForKey:@"loc-key"]; + NSString *callId = [aps objectForKey:@"call-id"]; if (alert != nil) { - NSString *loc_key = [alert objectForKey:@"loc-key"]; + 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 @@ -434,7 +435,7 @@ } if (loc_key != nil) { - NSString *callId = [userInfo objectForKey:@"call-id"]; + callId = [userInfo objectForKey:@"call-id"]; if (callId != nil) { if ([callId isEqualToString:@""]){ //Present apn pusher notifications for info @@ -464,10 +465,26 @@ } else if ([callId isEqual: @""]) { LOGE(@"PushNotification: does not have call-id yet, fix it !"); } + } + } + } - if ([loc_key isEqualToString:@"IC_MSG"]) { - [self fixRing]; - } + if (callId) { + int index = -1; + NSDictionary *dict = LinphoneManager.instance.pushDict; + if ([[dict allKeys] containsObject:callId]) { + index = [(NSNumber *)[LinphoneManager.instance.pushDict objectForKey:callId] intValue] + 1; + } else { + index = 1; + } + [LinphoneManager.instance.pushDict setValue:[NSNumber numberWithInt:index] forKey:callId]; + if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground && loc_key && + index > 0) { + if ([loc_key isEqualToString:@"IC_MSG"]) { + [LinphoneManager.instance startPushLongRunningTask:FALSE]; + [self fixRing]; + } else if ([loc_key isEqualToString:@"IM_MSG"]) { + [LinphoneManager.instance startPushLongRunningTask:TRUE]; } } } @@ -670,11 +687,13 @@ didInvalidatePushTokenForType:(NSString *)type { } - (void)pushRegistry:(PKPushRegistry *)registry - didUpdatePushCredentials:(PKPushCredentials *)credentials - forType:(NSString *)type { - LOGI(@"PushKit credentials updated"); - LOGI(@"voip token: %@", (credentials.token)); - dispatch_async(dispatch_get_main_queue(), ^{[LinphoneManager.instance setPushNotificationToken:credentials.token];}); + 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]; + }); } #pragma mark - UNUserNotifications Framework @@ -686,10 +705,13 @@ didInvalidatePushTokenForType:(NSString *)type { - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler { - LOGD(@"UN : response recieved"); - LOGD(response.description); + LOGD(@"UN : response received"); + LOGD(response.description); NSString *callId = (NSString *)[response.notification.request.content.userInfo objectForKey:@"CallId"]; + if (!callId) { + return; + } LinphoneCall *call = [LinphoneManager.instance callByCallId:callId]; if (call) { LinphoneCallAppData *data = (__bridge LinphoneCallAppData *)linphone_call_get_user_data(call); @@ -702,9 +724,9 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response if ([response.actionIdentifier isEqual:@"Answer"]) { // use the standard handler [PhoneMainView.instance changeCurrentView:CallView.compositeViewDescription]; - linphone_core_accept_call(LC, call); + linphone_call_accept(call); } else if ([response.actionIdentifier isEqual:@"Decline"]) { - linphone_core_decline_call(LC, call, LinphoneReasonDeclined); + linphone_call_decline(call, LinphoneReasonDeclined); } else if ([response.actionIdentifier isEqual:@"Reply"]) { LinphoneCore *lc = [LinphoneManager getLc]; NSString *replyText = [(UNTextInputNotificationResponse *)response userText]; @@ -713,6 +735,10 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response if (room) { LinphoneChatMessage *msg = linphone_chat_room_create_message(room, replyText.UTF8String); linphone_chat_room_send_chat_message(room, msg); + + if (linphone_core_lime_enabled(LC) == LinphoneLimeMandatory && !linphone_chat_room_lime_available(room)) { + [LinphoneManager.instance alertLIME:room]; + } linphone_chat_room_mark_as_read(room); TabBarView *tab = (TabBarView *)[PhoneMainView.instance.mainViewController getCachedController:NSStringFromClass(TabBarView.class)]; @@ -734,7 +760,7 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response LOGI(@"User declined video proposal"); if (call == linphone_core_get_current_call(LC)) { LinphoneCallParams *params = linphone_core_create_call_params(LC, call); - linphone_core_accept_call_update(LC, call, params); + linphone_call_accept_update(call, params); linphone_call_params_destroy(params); } } else if ([response.actionIdentifier isEqual:@"Accept"]) { @@ -744,7 +770,7 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response [PhoneMainView.instance changeCurrentView:CallView.compositeViewDescription]; LinphoneCallParams *params = linphone_core_create_call_params(LC, call); linphone_call_params_enable_video(params, TRUE); - linphone_core_accept_call_update(LC, call, params); + linphone_call_accept_update(call, params); linphone_call_params_destroy(params); } } else if ([response.actionIdentifier isEqual:@"Confirm"]) { @@ -755,6 +781,8 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response if (linphone_core_get_current_call(LC) == call) { linphone_call_set_authentication_token_verified(call, NO); } + } else if ([response.actionIdentifier isEqual:@"Call"]) { + } else { // in this case the value is : com.apple.UNNotificationDefaultActionIdentifier if ([response.notification.request.content.categoryIdentifier isEqual:@"call_cat"]) { [PhoneMainView.instance displayIncomingCall:call]; @@ -772,7 +800,7 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response LOGI(@"User declined video proposal"); if (call == linphone_core_get_current_call(LC)) { LinphoneCallParams *params = linphone_core_create_call_params(LC, call); - linphone_core_accept_call_update(LC, call, params); + linphone_call_accept_update(call, params); linphone_call_params_destroy(params); [videoDismissTimer invalidate]; } @@ -782,7 +810,7 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response if (call == linphone_core_get_current_call(LC)) { LinphoneCallParams *params = linphone_core_create_call_params(LC, call); linphone_call_params_enable_video(params, TRUE); - linphone_core_accept_call_update(LC, call, params); + linphone_call_accept_update(call, params); linphone_call_params_destroy(params); [videoDismissTimer invalidate]; } @@ -795,10 +823,22 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response userInfo:sheet repeats:NO]; } else if ([response.notification.request.content.categoryIdentifier isEqual:@"zrtp_request"]) { - [UIConfirmationDialog - ShowWithMessage:[NSString stringWithFormat:NSLocalizedString( - @"Confirm the following SAS with peer:\n%s", nil), - linphone_call_get_authentication_token(call)] + NSString *code = [NSString stringWithUTF8String:linphone_call_get_authentication_token(call)]; + NSString *myCode; + NSString *correspondantCode; + if (linphone_call_get_dir(call) == LinphoneCallIncoming) { + myCode = [code substringToIndex:2]; + correspondantCode = [code substringFromIndex:2]; + } else { + correspondantCode = [code substringToIndex:2]; + myCode = [code substringFromIndex:2]; + } + NSString *message = [NSString stringWithFormat:NSLocalizedString(@"Confirm the following SAS with peer:\n" + @"Say : %@\n" + @"Your correspondant should say : %@", + nil), + myCode, correspondantCode]; + [UIConfirmationDialog ShowWithMessage:message cancelMessage:NSLocalizedString(@"DENY", nil) confirmMessage:NSLocalizedString(@"ACCEPT", nil) onCancelClick:^() { @@ -811,6 +851,8 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response linphone_call_set_authentication_token_verified(call, YES); } }]; + } else if ([response.notification.request.content.categoryIdentifier isEqual:@"lime"]) { + return; } else { // Missed call [PhoneMainView.instance changeCurrentView:HistoryListView.compositeViewDescription]; } @@ -844,11 +886,11 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response if ([identifier isEqualToString:@"answer"]) { // use the standard handler [PhoneMainView.instance changeCurrentView:CallView.compositeViewDescription]; - linphone_core_accept_call(LC, call); + linphone_call_accept(call); } else if ([identifier isEqualToString:@"decline"]) { LinphoneCall *call = linphone_core_get_current_call(LC); if (call) - linphone_core_decline_call(LC, call, LinphoneReasonDeclined); + linphone_call_decline(call, LinphoneReasonDeclined); } } else if ([notification.category isEqualToString:@"incoming_msg"]) { if ([identifier isEqualToString:@"reply"]) { @@ -858,7 +900,9 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response NSString *from = [notification.userInfo objectForKey:@"from_addr"]; LinphoneChatRoom *room = linphone_core_get_chat_room_from_uri(LC, [from UTF8String]); if (room) { - linphone_chat_room_mark_as_read(room); + if (!([UIApplication sharedApplication].applicationState == UIApplicationStateBackground || + [UIApplication sharedApplication].applicationState == UIApplicationStateInactive)) + linphone_chat_room_mark_as_read(room); TabBarView *tab = (TabBarView *)[PhoneMainView.instance.mainViewController getCachedController:NSStringFromClass(TabBarView.class)]; [tab update:YES]; @@ -888,11 +932,11 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response if ([identifier isEqualToString:@"answer"]) { // use the standard handler [PhoneMainView.instance changeCurrentView:CallView.compositeViewDescription]; - linphone_core_accept_call(LC, call); + linphone_call_accept(call); } else if ([identifier isEqualToString:@"decline"]) { LinphoneCall *call = linphone_core_get_current_call(LC); if (call) - linphone_core_decline_call(LC, call, LinphoneReasonDeclined); + linphone_call_decline(call, LinphoneReasonDeclined); } } else if ([notification.category isEqualToString:@"incoming_msg"] && [identifier isEqualToString:@"reply_inline"]) { @@ -903,7 +947,14 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response if (room) { LinphoneChatMessage *msg = linphone_chat_room_create_message(room, replyText.UTF8String); linphone_chat_room_send_chat_message(room, msg); - linphone_chat_room_mark_as_read(room); + + if (linphone_core_lime_enabled(LC) == LinphoneLimeMandatory && !linphone_chat_room_lime_available(room)) { + [LinphoneManager.instance alertLIME:room]; + } + if (!([UIApplication sharedApplication].applicationState == UIApplicationStateBackground || + [UIApplication sharedApplication].applicationState == UIApplicationStateInactive)) { + linphone_chat_room_mark_as_read(room); + } [PhoneMainView.instance updateApplicationBadgeNumber]; } } diff --git a/Classes/LinphoneCoreSettingsStore.m b/Classes/LinphoneCoreSettingsStore.m index 6529a0fb7..012fac885 100644 --- a/Classes/LinphoneCoreSettingsStore.m +++ b/Classes/LinphoneCoreSettingsStore.m @@ -324,6 +324,12 @@ forKey:@"repeat_call_notification_preference"]; } + // chat section + { + [self setInteger:linphone_core_lime_enabled(LC) forKey:@"use_lime_preference"]; + [self setCString:linphone_core_get_file_transfer_server(LC) forKey:@"file_transfer_server_url_preference"]; + } + // network section { [self setBool:[lm lpConfigBoolForKey:@"edge_opt_preference" withDefault:NO] forKey:@"edge_opt_preference"]; @@ -401,6 +407,7 @@ [self setBool:[lm lpConfigBoolForKey:@"start_at_boot_preference"] forKey:@"start_at_boot_preference"]; [self setBool:[lm lpConfigBoolForKey:@"autoanswer_notif_preference"] forKey:@"autoanswer_notif_preference"]; [self setBool:[lm lpConfigBoolForKey:@"show_msg_in_notif" withDefault:YES] forKey:@"show_msg_in_notif"]; + [self setBool:[lm lpConfigBoolForKey:@"use_rls_presence" withDefault:YES] forKey:@"use_rls_presence"]; [self setBool:[lm lpConfigBoolForKey:@"enable_first_login_view_preference"] forKey:@"enable_first_login_view_preference"]; LinphoneAddress *parsed = linphone_core_get_primary_contact_parsed(LC); @@ -409,7 +416,6 @@ [self setCString:linphone_address_get_username(parsed) forKey:@"primary_username_preference"]; linphone_address_destroy(parsed); } - [self setCString:linphone_core_get_file_transfer_server(LC) forKey:@"file_transfer_server_url_preference"]; } changedDict = [[NSMutableDictionary alloc] init]; @@ -572,7 +578,12 @@ } LinphoneAuthInfo *proxyAi = (LinphoneAuthInfo *)linphone_proxy_config_find_auth_info(proxyCfg); - + char *realm; + if (proxyAi) { + realm = ms_strdup(linphone_auth_info_get_realm(proxyAi)); + } else { + realm = NULL; + } // setup new proxycfg linphone_proxy_config_done(proxyCfg); @@ -588,12 +599,21 @@ LinphoneAddress *from = linphone_core_interpret_url(LC, identity); if (from) { const char *userid_str = (userID != nil) ? [userID UTF8String] : NULL; - LinphoneAuthInfo *info = linphone_auth_info_new( - linphone_address_get_username(from), userid_str, password ? password : NULL, password ? NULL : ha1, - linphone_proxy_config_get_realm(proxyCfg), linphone_proxy_config_get_domain(proxyCfg)); + LinphoneAuthInfo *info; + if (password) { + info = linphone_auth_info_new(linphone_address_get_username(from), userid_str, password, NULL, + linphone_proxy_config_get_realm(proxyCfg), + linphone_proxy_config_get_domain(proxyCfg)); + } else { + info = linphone_auth_info_new(linphone_address_get_username(from), userid_str, NULL, ha1, + realm ? realm : linphone_proxy_config_get_realm(proxyCfg), + linphone_proxy_config_get_domain(proxyCfg)); + } + linphone_address_destroy(from); linphone_core_add_auth_info(LC, info); linphone_auth_info_destroy(info); + ms_free(realm); } bad_proxy: @@ -656,36 +676,36 @@ bool enableAutoAnswer = [self boolForKey:@"enable_auto_answer_preference"]; [LinphoneManager.instance lpConfigSetBool:enableAutoAnswer forKey:@"auto_answer"]; + } + + // audio section + { + [self synchronizeCodecs:linphone_core_get_audio_codecs(LC)]; + + float playback_gain = [self floatForKey:@"playback_gain_preference"]; + linphone_core_set_playback_gain_db(LC, playback_gain); + + float mic_gain = [self floatForKey:@"microphone_gain_preference"]; + linphone_core_set_mic_gain_db(LC, mic_gain); + + [lm lpConfigSetInt:[self integerForKey:@"audio_codec_bitrate_limit_preference"] + forKey:@"codec_bitrate_limit" + inSection:@"audio"]; + + BOOL voice_processing = [self boolForKey:@"voiceproc_preference"]; + [lm lpConfigSetInt:voice_processing forKey:@"voiceproc_preference"]; + + BOOL equalizer = [self boolForKey:@"eq_active"]; + [lm lpConfigSetBool:equalizer forKey:@"eq_active" inSection:@"sound"]; + + [LinphoneManager.instance configureVbrCodecs]; + + NSString *au_device = @"AU: Audio Unit Receiver"; + if (!voice_processing) { + au_device = @"AU: Audio Unit NoVoiceProc"; } - - // audio section - { - [self synchronizeCodecs:linphone_core_get_audio_codecs(LC)]; - - float playback_gain = [self floatForKey:@"playback_gain_preference"]; - linphone_core_set_playback_gain_db(LC, playback_gain); - - float mic_gain = [self floatForKey:@"microphone_gain_preference"]; - linphone_core_set_mic_gain_db(LC, mic_gain); - - [lm lpConfigSetInt:[self integerForKey:@"audio_codec_bitrate_limit_preference"] - forKey:@"codec_bitrate_limit" - inSection:@"audio"]; - - BOOL voice_processing = [self boolForKey:@"voiceproc_preference"]; - [lm lpConfigSetInt:voice_processing forKey:@"voiceproc_preference"]; - - BOOL equalizer = [self boolForKey:@"eq_active"]; - [lm lpConfigSetBool:equalizer forKey:@"eq_active" inSection:@"sound"]; - - [LinphoneManager.instance configureVbrCodecs]; - - NSString *au_device = @"AU: Audio Unit Receiver"; - if (!voice_processing) { - au_device = @"AU: Audio Unit NoVoiceProc"; - } - linphone_core_set_capture_device(LC, [au_device UTF8String]); - linphone_core_set_playback_device(LC, [au_device UTF8String]); + linphone_core_set_capture_device(LC, [au_device UTF8String]); + linphone_core_set_playback_device(LC, [au_device UTF8String]); } // video section @@ -743,6 +763,34 @@ forKey:@"repeat_call_notification"]; } + // chat section + { + int val = [self integerForKey:@"use_lime_preference"]; + linphone_core_enable_lime(LC, val); + if (val == LinphoneLimeMandatory && + (linphone_core_get_media_encryption(LC) != LinphoneMediaEncryptionZRTP)) { + linphone_core_set_media_encryption(LC, LinphoneMediaEncryptionZRTP); + [self setCString:"ZRTP" forKey:@"media_encryption_preference"]; + UIAlertController *errView = [UIAlertController + alertControllerWithTitle:NSLocalizedString(@"ZRTP activation", nil) + message: + NSLocalizedString( + @"LIME requires ZRTP encryption.\n" + @"By activating LIME you automatically activate ZRTP media encryption.", + nil) + preferredStyle:UIAlertControllerStyleAlert]; + + UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK" + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action){ + }]; + [errView addAction:defaultAction]; + [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; + } + linphone_core_set_file_transfer_server( + LC, [[self stringForKey:@"file_transfer_server_url_preference"] UTF8String]); + } + // network section { BOOL edgeOpt = [self boolForKey:@"edge_opt_preference"]; @@ -861,6 +909,36 @@ forKey:@"autoanswer_notif_preference"]; [lm lpConfigSetInt:[self integerForKey:@"show_msg_in_notif"] forKey:@"show_msg_in_notif"]; + if ([self integerForKey:@"use_rls_presence"]) { + [self setInteger:0 forKey:@"use_rls_presence"]; + NSString *rls_uri = + [lm lpConfigStringForKey:@"rls_uri" inSection:@"sip" withDefault:@"sips:rls@sip.linphone.org"]; + LinphoneAddress *rls_addr = linphone_address_new(rls_uri.UTF8String); + const char *rls_domain = linphone_address_get_domain(rls_addr); + const MSList *proxies = linphone_core_get_proxy_config_list(LC); + if (!proxies) { + // Enable it if no proxy config for first launch of app + [self setInteger:1 forKey:@"use_rls_presence"]; + } else { + while (proxies) { + const char *proxy_domain = linphone_proxy_config_get_domain(proxies->data); + if (strcmp(rls_domain, proxy_domain) == 0) { + [self setInteger:1 forKey:@"use_rls_presence"]; + break; + } + proxies = proxies->next; + } + } + linphone_address_unref(rls_addr); + } + [lm lpConfigSetInt:[self integerForKey:@"use_rls_presence"] forKey:@"use_rls_presence"]; + + const MSList *lists = linphone_core_get_friends_lists(LC); + while (lists) { + linphone_friend_list_enable_subscriptions(lists->data, [self integerForKey:@"use_rls_presence"]); + lists = lists->next; + } + BOOL firstloginview = [self boolForKey:@"enable_first_login_view_preference"]; [lm lpConfigSetInt:firstloginview forKey:@"enable_first_login_view_preference"]; @@ -878,9 +956,6 @@ [lm lpConfigSetInt:[self integerForKey:@"account_mandatory_advanced_preference"] forKey:@"account_mandatory_advanced_preference"]; - - linphone_core_set_file_transfer_server( - LC, [[self stringForKey:@"file_transfer_server_url_preference"] UTF8String]); } changedDict = [[NSMutableDictionary alloc] init]; diff --git a/Classes/LinphoneManager.h b/Classes/LinphoneManager.h index c785def8c..229b646d6 100644 --- a/Classes/LinphoneManager.h +++ b/Classes/LinphoneManager.h @@ -109,6 +109,7 @@ typedef struct _LinphoneManagerSounds { Connectivity connectivity; UIBackgroundTaskIdentifier pausedCallBgTask; UIBackgroundTaskIdentifier incallBgTask; + UIBackgroundTaskIdentifier pushBgTask; CTCallCenter* mCallCenter; NSDate *mLastKeepAliveDate; @public @@ -140,7 +141,8 @@ typedef struct _LinphoneManagerSounds { - (void)acceptCallForCallId:(NSString*)callid; - (LinphoneCall *)callByCallId:(NSString *)call_id; - (void)cancelLocalNotifTimerForCallId:(NSString*)callid; - +- (void)alertLIME:(LinphoneChatRoom *)room; +- (void)startPushLongRunningTask:(BOOL)msg; + (BOOL)langageDirectionIsRTL; + (void)kickOffNetworkConnection; - (void)setupNetworkReachabilityCallback; @@ -157,7 +159,8 @@ typedef struct _LinphoneManagerSounds { + (NSString*)cacheDirectory; - (void)acceptCall:(LinphoneCall *)call evenWithVideo:(BOOL)video; -- (BOOL)call:(const LinphoneAddress *)address; +- (void)call:(const LinphoneAddress *)address; +- (BOOL)doCall:(const LinphoneAddress *)iaddr; +(id)getMessageAppDataForKey:(NSString*)key inMessage:(LinphoneChatMessage*)msg; +(void)setValueInMessageAppData:(id)value forKey:(NSString*)key inMessage:(LinphoneChatMessage*)msg; @@ -218,5 +221,6 @@ typedef struct _LinphoneManagerSounds { @property(strong, nonatomic) NSMutableArray *fileTransferDelegates; @property BOOL nextCallIsTransfer; @property BOOL conf; +@property NSDictionary *pushDict; @end diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 4ede19f59..6acfc3cdc 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -24,14 +24,16 @@ #include #import +#import #import -#import #import -#import #import +#import +#import -#import "LinphoneManager.h" #import "LinphoneCoreSettingsStore.h" +#import "LinphoneManager.h" +#import "Utils/AudioHelper.h" #import "Utils/FileTransferDelegate.h" #include "linphone/linphonecore_utils.h" @@ -79,7 +81,6 @@ extern void libmsamr_init(MSFactory *factory); extern void libmsx264_init(MSFactory *factory); extern void libmsopenh264_init(MSFactory *factory); extern void libmssilk_init(MSFactory *factory); -extern void libmsbcg729_init(MSFactory *factory); extern void libmswebrtc_init(MSFactory *factory); #define FRONT_CAM_NAME \ @@ -237,7 +238,6 @@ struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_pre - (id)init { if ((self = [super init])) { - AudioSessionInitialize(NULL, NULL, NULL, NULL); [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(audioRouteChangeListenerCallback:) name:AVAudioSessionRouteChangeNotification @@ -249,6 +249,7 @@ struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_pre _sounds.vibrate = kSystemSoundID_Vibrate; _logs = [[NSMutableArray alloc] init]; + _pushDict = [[NSMutableDictionary alloc] init]; _database = NULL; _speakerEnabled = FALSE; _bluetoothEnabled = FALSE; @@ -258,7 +259,6 @@ struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_pre pushCallIDs = [[NSMutableArray alloc] init]; _photoLibrary = [[ALAssetsLibrary alloc] init]; _isTesting = [LinphoneManager isRunningTests]; - [self renameDefaultSettings]; [self copyDefaultSettings]; [self overrideDefaultSettings]; @@ -503,7 +503,11 @@ exit_dbmigration: LinphoneProxyConfig *proxy = (LinphoneProxyConfig *)proxies->data; const char *addr = linphone_proxy_config_get_addr(proxy); // we want to enable AVPF for the proxies - if (addr && strstr(addr, "sip.linphone.org") != 0) { + if (addr && + strstr(addr, [LinphoneManager.instance lpConfigStringForKey:@"domain_name" + inSection:@"app" + withDefault:@"sip.linphone.org"] + .UTF8String) != 0) { LOGI(@"Migrating proxy config to use AVPF"); linphone_proxy_config_enable_avpf(proxy, TRUE); } @@ -518,7 +522,11 @@ exit_dbmigration: LinphoneProxyConfig *proxy = (LinphoneProxyConfig *)proxies->data; const char *addr = linphone_proxy_config_get_addr(proxy); // we want to enable quality reporting for the proxies that are on linphone.org - if (addr && strstr(addr, "sip.linphone.org") != 0) { + if (addr && + strstr(addr, [LinphoneManager.instance lpConfigStringForKey:@"domain_name" + inSection:@"app" + withDefault:@"sip.linphone.org"] + .UTF8String) != 0) { LOGI(@"Migrating proxy config to send quality report"); linphone_proxy_config_set_quality_reporting_collector( proxy, "sip:voip-metrics@sip.linphone.org;transport=tls"); @@ -655,8 +663,25 @@ static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char NSString *address = [FastAddressBook displayNameForAddress:addr]; if (state == LinphoneCallIncomingReceived) { + // TESTING !! + // linphone_call_accept_early_media(call); LinphoneCallLog *callLog = linphone_call_get_call_log(call); NSString *callId = [NSString stringWithUTF8String:linphone_call_log_get_call_id(callLog)]; + int index = [(NSNumber *)[_pushDict objectForKey:callId] intValue] - 1; + [_pushDict setValue:[NSNumber numberWithInt:index] forKey:callId]; + BOOL need_bg_task = FALSE; + for (NSString *key in [_pushDict allKeys]) { + int value = [(NSNumber *)[_pushDict objectForKey:key] intValue]; + if (value > 0) { + need_bg_task = TRUE; + break; + } + } + if (pushBgTask && !need_bg_task) { + LOGI(@"Call received, stopping background task"); + [[UIApplication sharedApplication] endBackgroundTask:pushBgTask]; + pushBgTask = 0; + } /*first step is to re-enable ctcall center*/ CTCallCenter *lCTCallCenter = [[CTCallCenter alloc] init]; @@ -668,15 +693,15 @@ static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char LOGI(@"Mobile call ongoing... rejecting call from [%s]", tmp); ms_free(tmp); } - linphone_core_decline_call(theLinphoneCore, call, LinphoneReasonBusy); + linphone_call_decline(call, LinphoneReasonBusy); return; } if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max && call && (linphone_core_get_calls_nb(LC) < 2)) { +#if !TARGET_IPHONE_SIMULATOR NSString *callId = [NSString stringWithUTF8String:linphone_call_log_get_call_id(linphone_call_get_call_log(call))]; - NSString *address = [FastAddressBook displayNameForAddress:linphone_call_get_remote_address(call)]; NSUUID *uuid = [NSUUID UUID]; [LinphoneManager.instance.providerDelegate.calls setObject:callId forKey:uuid]; @@ -686,6 +711,9 @@ static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char linphone_core_get_video_policy(LC)->automatically_accept && linphone_call_params_video_enabled(linphone_call_get_remote_params(call))); [LinphoneManager.instance.providerDelegate reportIncomingCallwithUUID:uuid handle:address video:video]; +#else + [PhoneMainView.instance displayIncomingCall:call]; +#endif } else if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { // Create a UNNotification UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; @@ -864,11 +892,11 @@ static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char connectedAtDate:nil]; } - [self.providerDelegate.uuids removeObjectForKey:callId2]; - [self.providerDelegate.calls removeObjectForKey:uuid]; - [self.providerDelegate.provider reportCallWithUUID:uuid - endedAtDate:NULL - reason:CXCallEndedReasonRemoteEnded]; + CXEndCallAction *act = [[CXEndCallAction alloc] initWithCallUUID:uuid]; + CXTransaction *tr = [[CXTransaction alloc] initWithAction:act]; + [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr + completion:^(NSError *err){ + }]; } } else { if (data != nil && data->notification != nil) { @@ -896,6 +924,9 @@ static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char } } } + if (state == LinphoneCallError) { + [PhoneMainView.instance popCurrentView]; + } } if (state == LinphoneCallReleased) { @@ -1150,7 +1181,6 @@ static void linphone_iphone_popup_password_request(LinphoneCore *lc, const char _silentPushCompletion = nil; } #pragma deploymate pop - NSString *callID = [NSString stringWithUTF8String:linphone_chat_message_get_custom_header(msg, "Call-ID")]; const LinphoneAddress *remoteAddress = linphone_chat_message_get_from_address(msg); NSString *from = [FastAddressBook displayNameForAddress:remoteAddress]; @@ -1158,116 +1188,202 @@ static void linphone_iphone_popup_password_request(LinphoneCore *lc, const char char *c_address = linphone_address_as_string_uri_only(remoteAddress); NSString *remote_uri = [NSString stringWithUTF8String:c_address]; ms_free(c_address); + int index = [(NSNumber *)[_pushDict objectForKey:callID] intValue] - 1; + [_pushDict setValue:[NSNumber numberWithInt:index] forKey:callID]; + BOOL need_bg_task = FALSE; + for (NSString *key in [_pushDict allKeys]) { + int value = [(NSNumber *)[_pushDict objectForKey:key] intValue]; + if (value > 0) { + need_bg_task = TRUE; + break; + } + } + if (pushBgTask && !need_bg_task) { + LOGI(@"Message received, stopping background task"); + [[UIApplication sharedApplication] endBackgroundTask:pushBgTask]; + pushBgTask = 0; + } - if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground || ((PhoneMainView.instance.currentView != ChatsListView.compositeViewDescription) && ((PhoneMainView.instance.currentView != ChatConversationView.compositeViewDescription))) || (PhoneMainView.instance.currentView == ChatConversationView.compositeViewDescription && room != PhoneMainView.instance.currentRoom)) { - // Create a new notification - - if(floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { - NSArray *actions; - - if ([[UIDevice.currentDevice systemVersion] floatValue] < 9 || - [LinphoneManager.instance lpConfigBoolForKey:@"show_msg_in_notif"] == NO) { - - UIMutableUserNotificationAction *reply = [[UIMutableUserNotificationAction alloc] init]; - reply.identifier = @"reply"; - reply.title = NSLocalizedString(@"Reply", nil); - reply.activationMode = UIUserNotificationActivationModeForeground; - reply.destructive = NO; - reply.authenticationRequired = YES; - - UIMutableUserNotificationAction *mark_read = [[UIMutableUserNotificationAction alloc] init]; - mark_read.identifier = @"mark_read"; - mark_read.title = NSLocalizedString(@"Mark Read", nil); - mark_read.activationMode = UIUserNotificationActivationModeBackground; - mark_read.destructive = NO; - mark_read.authenticationRequired = NO; - - actions = @[ mark_read, reply ]; - } else { - // iOS 9 allows for inline reply. We don't propose mark_read in this case - UIMutableUserNotificationAction *reply_inline = [[UIMutableUserNotificationAction alloc] init]; - - reply_inline.identifier = @"reply_inline"; - reply_inline.title = NSLocalizedString(@"Reply", nil); - reply_inline.activationMode = UIUserNotificationActivationModeBackground; - reply_inline.destructive = NO; - reply_inline.authenticationRequired = NO; - reply_inline.behavior = UIUserNotificationActionBehaviorTextInput; - - actions = @[ reply_inline ]; - } - - UIMutableUserNotificationCategory *msgcat = [[UIMutableUserNotificationCategory alloc] init]; - msgcat.identifier = @"incoming_msg"; - [msgcat setActions:actions forContext:UIUserNotificationActionContextDefault]; - [msgcat setActions:actions forContext:UIUserNotificationActionContextMinimal]; - - NSSet* categories = [NSSet setWithObjects:msgcat, nil]; - - UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:categories]; - [[UIApplication sharedApplication] registerUserNotificationSettings:set]; - - UILocalNotification *notif = [[UILocalNotification alloc] init]; - if (notif) { - NSString *chat = [UIChatBubbleTextCell TextMessageForChat:msg]; - notif.repeatInterval = 0; - if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) { + if (linphone_chat_message_is_file_transfer(msg) || linphone_chat_message_is_text(msg)) { + if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground || + ((PhoneMainView.instance.currentView != ChatsListView.compositeViewDescription) && + ((PhoneMainView.instance.currentView != ChatConversationView.compositeViewDescription))) || + (PhoneMainView.instance.currentView == ChatConversationView.compositeViewDescription && + room != PhoneMainView.instance.currentRoom)) { + // Create a new notification + if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { + NSArray *actions; + + if ([[UIDevice.currentDevice systemVersion] floatValue] < 9 || + [LinphoneManager.instance lpConfigBoolForKey:@"show_msg_in_notif"] == NO) { + + UIMutableUserNotificationAction *reply = [[UIMutableUserNotificationAction alloc] init]; + reply.identifier = @"reply"; + reply.title = NSLocalizedString(@"Reply", nil); + reply.activationMode = UIUserNotificationActivationModeForeground; + reply.destructive = NO; + reply.authenticationRequired = YES; + + UIMutableUserNotificationAction *mark_read = [[UIMutableUserNotificationAction alloc] init]; + mark_read.identifier = @"mark_read"; + mark_read.title = NSLocalizedString(@"Mark Read", nil); + mark_read.activationMode = UIUserNotificationActivationModeBackground; + mark_read.destructive = NO; + mark_read.authenticationRequired = NO; + + actions = @[ mark_read, reply ]; + } else { + // iOS 9 allows for inline reply. We don't propose mark_read in this case + UIMutableUserNotificationAction *reply_inline = [[UIMutableUserNotificationAction alloc] init]; + + reply_inline.identifier = @"reply_inline"; + reply_inline.title = NSLocalizedString(@"Reply", nil); + reply_inline.activationMode = UIUserNotificationActivationModeBackground; + reply_inline.destructive = NO; + reply_inline.authenticationRequired = NO; + reply_inline.behavior = UIUserNotificationActionBehaviorTextInput; + + actions = @[ reply_inline ]; + } + + UIMutableUserNotificationCategory *msgcat = [[UIMutableUserNotificationCategory alloc] init]; + msgcat.identifier = @"incoming_msg"; + [msgcat setActions:actions forContext:UIUserNotificationActionContextDefault]; + [msgcat setActions:actions forContext:UIUserNotificationActionContextMinimal]; + + NSSet *categories = [NSSet setWithObjects:msgcat, nil]; + + UIUserNotificationSettings *set = [UIUserNotificationSettings + settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | + UIUserNotificationTypeSound) + categories:categories]; + [[UIApplication sharedApplication] registerUserNotificationSettings:set]; + + UILocalNotification *notif = [[UILocalNotification alloc] init]; + if (notif) { + NSString *chat = [UIChatBubbleTextCell TextMessageForChat:msg]; + notif.repeatInterval = 0; + if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) { #pragma deploymate push "ignored-api-availability" - notif.category = @"incoming_msg"; + notif.category = @"incoming_msg"; #pragma deploymate pop - } - if ([LinphoneManager.instance lpConfigBoolForKey:@"show_msg_in_notif" withDefault:YES]) { - notif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"IM_FULLMSG", nil), from, chat]; - } else { - notif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"IM_MSG", nil), from]; - } - notif.alertAction = NSLocalizedString(@"Show", nil); - notif.soundName = @"msg.caf"; - notif.userInfo = @{ @"from" : from, @"from_addr" : remote_uri, @"call-id" : callID }; - notif.accessibilityLabel = @"Message notif"; - [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; - } - } else { - // Msg category - UNTextInputNotificationAction *act_reply = - [UNTextInputNotificationAction actionWithIdentifier:@"Reply" - title:NSLocalizedString(@"Reply", nil) - options:UNNotificationActionOptionNone]; - UNNotificationAction *act_seen = - [UNNotificationAction actionWithIdentifier:@"Seen" - title:NSLocalizedString(@"Mark as seen", nil) - options:UNNotificationActionOptionNone]; - UNNotificationCategory *cat_msg = - [UNNotificationCategory categoryWithIdentifier:@"msg_cat" - actions:[NSArray arrayWithObjects:act_reply, act_seen, nil] - intentIdentifiers:[[NSMutableArray alloc] init] - options:UNNotificationCategoryOptionCustomDismissAction]; - - [[UNUserNotificationCenter currentNotificationCenter] - requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | - UNAuthorizationOptionBadge) - completionHandler:^(BOOL granted, NSError *_Nullable error) { - // Enable or disable features based on authorization. - if (error) { - LOGD(error.description); - } - }]; - NSSet *categories = [NSSet setWithObjects:cat_msg, nil]; - [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:categories]; - UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; - content.title = NSLocalizedString(@"Message received", nil); - if ([LinphoneManager.instance lpConfigBoolForKey:@"show_msg_in_notif" withDefault:YES]) { - content.subtitle = from; - content.body = [UIChatBubbleTextCell TextMessageForChat:msg]; + } + if ([LinphoneManager.instance lpConfigBoolForKey:@"show_msg_in_notif" withDefault:YES]) { + notif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"IM_FULLMSG", nil), from, chat]; + } else { + notif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"IM_MSG", nil), from]; + } + notif.alertAction = NSLocalizedString(@"Show", nil); + notif.soundName = @"msg.caf"; + notif.userInfo = @{ @"from" : from, @"from_addr" : remote_uri, @"call-id" : callID }; + notif.accessibilityLabel = @"Message notif"; + [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; + } } else { - content.body = from; + // Msg category + UNTextInputNotificationAction *act_reply = + [UNTextInputNotificationAction actionWithIdentifier:@"Reply" + title:NSLocalizedString(@"Reply", nil) + options:UNNotificationActionOptionNone]; + UNNotificationAction *act_seen = + [UNNotificationAction actionWithIdentifier:@"Seen" + title:NSLocalizedString(@"Mark as seen", nil) + options:UNNotificationActionOptionNone]; + UNNotificationCategory *cat_msg = + [UNNotificationCategory categoryWithIdentifier:@"msg_cat" + actions:[NSArray arrayWithObjects:act_reply, act_seen, nil] + intentIdentifiers:[[NSMutableArray alloc] init] + options:UNNotificationCategoryOptionCustomDismissAction]; + + [[UNUserNotificationCenter currentNotificationCenter] + requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | + UNAuthorizationOptionBadge) + completionHandler:^(BOOL granted, NSError *_Nullable error) { + // Enable or disable features based on authorization. + if (error) { + LOGD(error.description); + } + }]; + NSSet *categories = [NSSet setWithObjects:cat_msg, nil]; + [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:categories]; + UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; + content.title = NSLocalizedString(@"Message received", nil); + if ([LinphoneManager.instance lpConfigBoolForKey:@"show_msg_in_notif" withDefault:YES]) { + content.subtitle = from; + content.body = [UIChatBubbleTextCell TextMessageForChat:msg]; + } else { + content.body = from; + } + content.sound = [UNNotificationSound soundNamed:@"msg.caf"]; + content.categoryIdentifier = @"msg_cat"; + content.userInfo = @{ @"from" : from, @"from_addr" : remote_uri, @"CallId" : callID }; + content.accessibilityLabel = @"Message notif"; + 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); + } + }]; } - content.sound = [UNNotificationSound soundNamed:@"msg.caf"]; - content.categoryIdentifier = @"msg_cat"; - content.userInfo = @{ @"from" : from, @"from_addr" : remote_uri, @"call-id" : callID }; - content.accessibilityLabel = @"Message notif"; + } + // Post event + NSDictionary *dict = @{ + @"room" : [NSValue valueWithPointer:room], + @"from_address" : [NSValue valueWithPointer:linphone_chat_message_get_from_address(msg)], + @"message" : [NSValue valueWithPointer:msg], + @"call-id" : callID + }; + + [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:self userInfo:dict]; + } +} + +static void linphone_iphone_message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *message) { + [(__bridge LinphoneManager *)linphone_core_get_user_data(lc) onMessageReceived:lc room:room message:message]; +} + +static void linphone_iphone_message_received_unable_decrypt(LinphoneCore *lc, LinphoneChatRoom *room, + LinphoneChatMessage *message) { + + NSString *msgId = [NSString stringWithUTF8String:linphone_chat_message_get_custom_header(message, "Call-ID")]; + int index = [(NSNumber *)[LinphoneManager.instance.pushDict objectForKey:msgId] intValue] - 1; + [LinphoneManager.instance.pushDict setValue:[NSNumber numberWithInt:index] forKey:msgId]; + BOOL need_bg_task = FALSE; + for (NSString *key in [LinphoneManager.instance.pushDict allKeys]) { + int value = [(NSNumber *)[LinphoneManager.instance.pushDict objectForKey:key] intValue]; + if (value > 0) { + need_bg_task = TRUE; + break; + } + } + if (theLinphoneManager->pushBgTask && !need_bg_task) { + LOGI(@"Message received, stopping background task"); + [[UIApplication sharedApplication] endBackgroundTask:theLinphoneManager->pushBgTask]; + theLinphoneManager->pushBgTask = 0; + } + const LinphoneAddress *address = linphone_chat_message_get_peer_address(message); + NSString *strAddr = [FastAddressBook displayNameForAddress:address]; + NSString *title = NSLocalizedString(@"LIME warning", nil); + NSString *body = [NSString + stringWithFormat:NSLocalizedString(@"You have received an encrypted message you are unable to decrypt from " + @"%@.\nYou need to call your correspondant in order to exchange your ZRTP " + @"keys if you want to decrypt the future messages you will receive.", + nil), + strAddr]; + NSString *action = NSLocalizedString(@"Call", nil); + + if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { + if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { + UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; + content.title = title; + content.body = body; UNNotificationRequest *req = - [UNNotificationRequest requestWithIdentifier:@"call_request" content:content trigger:NULL]; + [UNNotificationRequest requestWithIdentifier:@"decrypt_request" content:content trigger:NULL]; [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:req withCompletionHandler:^(NSError *_Nullable error) { @@ -1277,21 +1393,32 @@ static void linphone_iphone_popup_password_request(LinphoneCore *lc, const char LOGD(error.description); } }]; + } else { + UILocalNotification *notification = [[UILocalNotification alloc] init]; + notification.repeatInterval = 0; + notification.alertTitle = title; + notification.alertBody = body; + [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; } + } else { + UIAlertController *errView = + [UIAlertController alertControllerWithTitle:title message:body preferredStyle:UIAlertControllerStyleAlert]; + + UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action){ + }]; + + UIAlertAction *callAction = [UIAlertAction actionWithTitle:action + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action) { + [LinphoneManager.instance call:address]; + }]; + + [errView addAction:defaultAction]; + [errView addAction:callAction]; + [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; } - // Post event - NSDictionary *dict = @{ - @"room" : [NSValue valueWithPointer:room], - @"from_address" : [NSValue valueWithPointer:linphone_chat_message_get_from_address(msg)], - @"message" : [NSValue valueWithPointer:msg], - @"call-id" : callID - }; - - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:self userInfo:dict]; -} - -static void linphone_iphone_message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *message) { - [(__bridge LinphoneManager *)linphone_core_get_user_data(lc) onMessageReceived:lc room:room message:message]; } - (void)onNotifyReceived:(LinphoneCore *)lc @@ -1362,6 +1489,59 @@ static void linphone_iphone_call_encryption_changed(LinphoneCore *lc, LinphoneCa } #pragma mark - Message composition start +- (void)alertLIME:(LinphoneChatRoom *)room { + NSString *title = NSLocalizedString(@"LIME warning", nil); + NSString *body = + NSLocalizedString(@"You are trying to send a message using LIME to a contact not verified by ZRTP.\n" + @"Please call this contact and verify his ZRTP key before sending your messages.", + nil); + + if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground) { + UIAlertController *errView = + [UIAlertController alertControllerWithTitle:title message:body preferredStyle:UIAlertControllerStyleAlert]; + + UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK" + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action){ + }]; + [errView addAction:defaultAction]; + + UIAlertAction *callAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Call", nil) + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action) { + [self call:linphone_chat_room_get_peer_address(room)]; + }]; + [errView addAction:callAction]; + [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; + } else { + if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { + UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; + content.title = title; + content.body = body; + content.categoryIdentifier = @"lime"; + + UNNotificationRequest *req = [UNNotificationRequest + requestWithIdentifier:@"lime_request" + content:content + trigger:[UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO]]; + [[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.alertTitle = title; + notification.alertBody = body; + [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; + } + } +} - (void)onMessageComposeReceived:(LinphoneCore *)core forRoom:(LinphoneChatRoom *)room { [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneTextComposeEvent @@ -1634,6 +1814,7 @@ static LinphoneCoreVTable linphonec_vtable = { .notify_presence_received_for_uri_or_tel = linphone_iphone_notify_presence_received_for_uri_or_tel, .auth_info_requested = linphone_iphone_popup_password_request, .message_received = linphone_iphone_message_received, + .message_received_unable_decrypt = linphone_iphone_message_received_unable_decrypt, .transfer_state_changed = linphone_iphone_transfer_state_changed, .is_composing_received = linphone_iphone_is_composing_received, .configuring_status = linphone_iphone_configuring_status_changed, @@ -1779,6 +1960,11 @@ static BOOL libStarted = FALSE; [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; } + // Enable notify policy for all + LinphoneImNotifPolicy *im_notif_policy; + im_notif_policy = linphone_core_get_im_notif_policy(theLinphoneCore); + linphone_im_notif_policy_enable_all(im_notif_policy); + if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { // go directly to bg mode [self enterBackgroundMode]; @@ -1790,7 +1976,12 @@ void popup_link_account_cb(LinphoneAccountCreator *creator, LinphoneAccountCreat [LinphoneManager.instance lpConfigSetInt:0 forKey:@"must_link_account_time"]; } else { LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(LC); - if (cfg) { + if (cfg && + strcmp(linphone_proxy_config_get_domain(cfg), + [LinphoneManager.instance lpConfigStringForKey:@"domain_name" + inSection:@"app" + withDefault:@"sip.linphone.org"] + .UTF8String) == 0) { UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Link your account", nil) message:[NSString stringWithFormat:NSLocalizedString(@"Link your Linphone.org account %s to your phone number.", nil), linphone_address_get_username(linphone_proxy_config_get_identity_address(cfg))] @@ -1876,7 +2067,6 @@ void popup_link_account_cb(LinphoneAccountCreator *creator, LinphoneAccountCreat libmsamr_init(f); libmsx264_init(f); libmsopenh264_init(f); - libmsbcg729_init(f); libmswebrtc_init(f); linphone_core_reload_ms_plugins(theLinphoneCore, NULL); [self migrationAllPost]; @@ -1962,7 +2152,10 @@ static int comp_call_id(const LinphoneCall *call, const char *callid) { } - (LinphoneCall *)callByCallId:(NSString *)call_id { - const bctbx_list_t *calls = linphone_core_get_calls(LC); + const bctbx_list_t *calls = linphone_core_get_calls(theLinphoneCore); + if (!calls || !call_id) { + return NULL; + } bctbx_list_t *call_tmp = bctbx_list_find_custom(calls, (bctbx_compare_func)comp_call_id, [call_id UTF8String]); if (!call_tmp) { return NULL; @@ -2047,6 +2240,59 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { [[UIApplication sharedApplication] backgroundTimeRemaining]); } +- (void)startPushLongRunningTask:(BOOL)msg { + [[UIApplication sharedApplication] endBackgroundTask:pushBgTask]; + pushBgTask = 0; + pushBgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ + if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { + if (msg) { + LOGW(@"Incomming message couldn't be received"); + UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; + content.title = NSLocalizedString(@"Message received", nil); + content.body = NSLocalizedString(@"You have received a message.", nil); + content.categoryIdentifier = @"push_msg"; + + UNNotificationRequest *req = + [UNNotificationRequest requestWithIdentifier:@"push_msg" 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 { + LOGW(@"Incomming call couldn't be received"); + UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; + content.title = NSLocalizedString(@"Missed call", nil); + content.body = NSLocalizedString(@"You have missed a call.", nil); + content.categoryIdentifier = @"push_call"; + + UNNotificationRequest *req = + [UNNotificationRequest requestWithIdentifier:@"push_call" 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); + } + }]; + } + } + for (NSString *key in [LinphoneManager.instance.pushDict allKeys]) { + [LinphoneManager.instance.pushDict setValue:[NSNumber numberWithInt:0] forKey:key]; + } + [[UIApplication sharedApplication] endBackgroundTask:pushBgTask]; + pushBgTask = 0; + }]; + LOGI(@"Long running task started, remaining [%g s] because a push has been received", + [[UIApplication sharedApplication] backgroundTimeRemaining]); +} + - (void)enableProxyPublish:(BOOL)enabled { if (linphone_core_get_global_state(LC) != LinphoneGlobalOn || !linphone_core_get_default_friend_list(LC)) { LOGW(@"Not changing presence configuration because linphone core not ready yet"); @@ -2072,7 +2318,9 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { linphone_core_iterate(theLinphoneCore); } - linphone_friend_list_enable_subscriptions(linphone_core_get_default_friend_list(LC), enabled); + linphone_friend_list_enable_subscriptions(linphone_core_get_default_friend_list(LC), + enabled && + [LinphoneManager.instance lpConfigBoolForKey:@"use_rls_presence"]); } - (BOOL)enterBackgroundMode { @@ -2172,6 +2420,9 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { /*IOS specific*/ linphone_core_start_dtmf_stream(theLinphoneCore); + [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo + completionHandler:^(BOOL granted){ + }]; /*start the video preview in case we are in the main view*/ if (linphone_core_video_display_enabled(theLinphoneCore) && [self lpConfigBoolForKey:@"preview_preference"]) { @@ -2193,22 +2444,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { LinphoneCall *c = linphone_core_get_current_call(theLinphoneCore); LOGI(@"Sound interruption detected!"); if (c && linphone_call_get_state(c) == LinphoneCallStreamsRunning) { - if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { - NSUUID *uuid = (NSUUID *)[LinphoneManager.instance.providerDelegate.uuids - objectForKey:[NSString - stringWithUTF8String:linphone_call_log_get_call_id(linphone_call_get_call_log(c))]]; - if (!uuid) { - linphone_core_pause_call(theLinphoneCore, c); - return; - } - CXSetHeldCallAction *act = [[CXSetHeldCallAction alloc] initWithCallUUID:uuid onHold:YES]; - CXTransaction *tr = [[CXTransaction alloc] initWithAction:act]; - [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr - completion:^(NSError *err){ - }]; - } else { - linphone_core_pause_call(theLinphoneCore, c); - } + linphone_call_pause(c); } } @@ -2273,13 +2509,12 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { return true; bool allow = true; - CFStringRef lNewRoute = CFSTR("Unknown"); - UInt32 lNewRouteSize = sizeof(lNewRoute); - OSStatus lStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &lNewRouteSize, &lNewRoute); - if (!lStatus && lNewRouteSize > 0) { - NSString *route = (__bridge NSString *)lNewRoute; - allow = ![route containsSubstring:@"Heads"] && ![route isEqualToString:@"Lineout"]; - CFRelease(lNewRoute); + AVAudioSessionRouteDescription *newRoute = [AVAudioSession sharedInstance].currentRoute; + if (newRoute) { + NSString *route = newRoute.outputs[0].portType; + allow = !([route isEqualToString:AVAudioSessionPortLineOut] || + [route isEqualToString:AVAudioSessionPortHeadphones] || + [[AudioHelper bluetoothRoutes] containsObject:route]); } return allow; } @@ -2297,17 +2532,14 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { AVAudioSessionRouteChangeReasonOldDeviceUnavailable) { _bluetoothAvailable = NO; } + AVAudioSessionRouteDescription *newRoute = [AVAudioSession sharedInstance].currentRoute; - CFStringRef newRoute = CFSTR("Unknown"); - UInt32 newRouteSize = sizeof(newRoute); - - OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &newRouteSize, &newRoute); - if (!status && newRouteSize > 0) { - NSString *route = (__bridge NSString *)newRoute; + if (newRoute) { + NSString *route = newRoute.outputs[0].portType; LOGI(@"Current audio route is [%s]", [route UTF8String]); - _speakerEnabled = [route isEqualToString:@"Speaker"] || [route isEqualToString:@"SpeakerAndMicrophone"]; - if ([route isEqualToString:@"HeadsetBT"] && !_speakerEnabled) { + _speakerEnabled = [route isEqualToString:AVAudioSessionPortBuiltInSpeaker]; + if (([[AudioHelper bluetoothRoutes] containsObject:route]) && !_speakerEnabled) { _bluetoothAvailable = TRUE; _bluetoothEnabled = TRUE; } else { @@ -2318,39 +2550,23 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneBluetoothAvailabilityUpdate object:self userInfo:dict]; - CFRelease(newRoute); } } - (void)setSpeakerEnabled:(BOOL)enable { - OSStatus ret; _speakerEnabled = enable; - UInt32 override = kAudioSessionUnspecifiedError; + NSError *err; - if (!enable && _bluetoothAvailable) { - UInt32 bluetoothInputOverride = _bluetoothEnabled; - ret = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, - sizeof(bluetoothInputOverride), &bluetoothInputOverride); - // if setting bluetooth failed, it must be because the device is not available - // anymore (disconnected), so deactivate bluetooth. - if (ret != kAudioSessionNoError) { - _bluetoothAvailable = _bluetoothEnabled = FALSE; - } + if (enable && [self allowSpeaker]) { + [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&err]; + _bluetoothEnabled = FALSE; + } else { + AVAudioSessionPortDescription *builtinPort = [AudioHelper builtinAudioDevice]; + [[AVAudioSession sharedInstance] setPreferredInput:builtinPort error:&err]; } - if (override != kAudioSessionNoError) { - if (enable && [self allowSpeaker]) { - override = kAudioSessionOverrideAudioRoute_Speaker; - ret = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(override), &override); - _bluetoothEnabled = FALSE; - } else { - override = kAudioSessionOverrideAudioRoute_None; - ret = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(override), &override); - } - } - - if (ret != kAudioSessionNoError) { - LOGE(@"Failed to change audio route: err %d", ret); + if (err) { + LOGE(@"Failed to change audio route: err %@", err.localizedDescription); } } @@ -2358,8 +2574,21 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { if (_bluetoothAvailable) { // The change of route will be done in setSpeakerEnabled _bluetoothEnabled = enable; - [self setSpeakerEnabled:!_bluetoothEnabled && _speakerEnabled]; + if (_bluetoothEnabled) { + NSError *err; + AVAudioSessionPortDescription *_bluetoothPort = [AudioHelper bluetoothAudioDevice]; + [[AVAudioSession sharedInstance] setPreferredInput:_bluetoothPort error:&err]; + // if setting bluetooth failed, it must be because the device is not available + // anymore (disconnected), so deactivate bluetooth. + if (err) { + _bluetoothEnabled = FALSE; + } else { + _speakerEnabled = FALSE; + return; + } + } } + [self setSpeakerEnabled:_speakerEnabled]; } #pragma mark - Call Functions @@ -2380,10 +2609,10 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { } linphone_call_params_enable_video(lcallParams, video); - linphone_core_accept_call_with_params(theLinphoneCore, call, lcallParams); + linphone_call_accept_with_params(call, lcallParams); } -- (BOOL)call:(const LinphoneAddress *)iaddr { +- (void)call:(const LinphoneAddress *)iaddr { // First verify that network is available, abort otherwise. if (!linphone_core_is_network_reachable(theLinphoneCore)) { UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Network Error", nil) @@ -2396,7 +2625,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { [errView addAction:defaultAction]; [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - return FALSE; + return; } // Then check that no GSM calls are in progress, abort otherwise. @@ -2413,7 +2642,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { [errView addAction:defaultAction]; [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - return FALSE; + return; } // Then check that the supplied address is valid @@ -2429,9 +2658,29 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { [errView addAction:defaultAction]; [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - return FALSE; + return; } + if (linphone_core_get_calls_nb(theLinphoneCore) < 1 && + floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max && + self.providerDelegate.callKitCalls < 1) { + self.providerDelegate.callKitCalls++; + NSUUID *uuid = [NSUUID UUID]; + [LinphoneManager.instance.providerDelegate.uuids setObject:uuid forKey:@""]; + LinphoneManager.instance.providerDelegate.pendingAddr = linphone_address_clone(iaddr); + NSString *address = [FastAddressBook displayNameForAddress:iaddr]; + CXHandle *handle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:address]; + CXStartCallAction *act = [[CXStartCallAction alloc] initWithCallUUID:uuid handle:handle]; + CXTransaction *tr = [[CXTransaction alloc] initWithAction:act]; + [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr + completion:^(NSError *err){ + }]; + } else { + [self doCall:iaddr]; + } +} + +- (BOOL)doCall:(const LinphoneAddress *)iaddr { LinphoneAddress *addr = linphone_address_clone(iaddr); NSString *displayName = [FastAddressBook displayNameForAddress:addr]; @@ -2454,7 +2703,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { if (LinphoneManager.instance.nextCallIsTransfer) { char *caddr = linphone_address_as_string(addr); call = linphone_core_get_current_call(theLinphoneCore); - linphone_core_transfer_call(theLinphoneCore, call, caddr); + linphone_call_transfer(call, caddr); LinphoneManager.instance.nextCallIsTransfer = NO; ms_free(caddr); } else { @@ -2785,7 +3034,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { if ([ct currentCalls] != nil) { if (call) { LOGI(@"Pausing SIP call because GSM call"); - linphone_core_pause_call(theLinphoneCore, call); + linphone_call_pause(call); [self startCallPausedLongRunningTask]; } else if (linphone_core_is_in_conference(theLinphoneCore)) { LOGI(@"Leaving conference call because GSM call"); diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.strings index 50aac70af..bbc940d42 100644 Binary files a/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib index bc35ae1e4..409ea31d6 100644 --- a/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib +++ b/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib @@ -1,12 +1,17 @@ - + + + + - + + + @@ -17,6 +22,8 @@ + + @@ -25,23 +32,21 @@ - - + + - + - + - - @@ -50,10 +55,9 @@ @@ -63,7 +67,6 @@ - @@ -76,29 +79,26 @@ - - - - - - + - - - + + + + + + + - - - + - + @@ -152,12 +162,19 @@ - - + + + + + + + + + diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.strings index caf8f1e21..36cc75de9 100644 Binary files a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib index b564ae75b..4d7e89297 100644 --- a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib +++ b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib @@ -1,17 +1,24 @@ - + + + + - + + + + + @@ -24,23 +31,21 @@ - - + + - + - + - - @@ -49,52 +54,70 @@ - - - + - - - + + - + + + + + + + - - - + + - - + + + + + + + + + diff --git a/Classes/LinphoneUI/StatusBarView.m b/Classes/LinphoneUI/StatusBarView.m index e0e2c785e..43db8ee5e 100644 --- a/Classes/LinphoneUI/StatusBarView.m +++ b/Classes/LinphoneUI/StatusBarView.m @@ -318,9 +318,23 @@ LinphoneMediaEncryption enc = linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)); if (enc == LinphoneMediaEncryptionZRTP) { + NSString *code = [NSString stringWithUTF8String:linphone_call_get_authentication_token(call)]; + NSString *myCode; + NSString *correspondantCode; + if (linphone_call_get_dir(call) == LinphoneCallIncoming) { + myCode = [code substringToIndex:2]; + correspondantCode = [code substringFromIndex:2]; + } else { + correspondantCode = [code substringToIndex:2]; + myCode = [code substringFromIndex:2]; + } NSString *message = - [NSString stringWithFormat:NSLocalizedString(@"Confirm the following SAS with peer:\n%s", nil), - linphone_call_get_authentication_token(call)]; + [NSString stringWithFormat:NSLocalizedString(@"Confirm the following SAS with peer:\n" + @"Say : %@\n" + @"Your correspondant should say : %@", + nil), + myCode, correspondantCode]; + if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground && floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; diff --git a/Classes/LinphoneUI/UIAvatarPresence.m b/Classes/LinphoneUI/UIAvatarPresence.m index 0c082002e..2074bbde6 100644 --- a/Classes/LinphoneUI/UIAvatarPresence.m +++ b/Classes/LinphoneUI/UIAvatarPresence.m @@ -57,11 +57,10 @@ INIT_WITH_COMMON_CF { _friend ? linphone_presence_model_get_basic_status(linphone_friend_get_presence_model(_friend)) : LinphonePresenceBasicStatusClosed; const LinphonePresenceModel *model = _friend ? linphone_friend_get_presence_model(_friend) : NULL; - LinphonePresenceActivity *activity = - model ? linphone_presence_model_get_activity(model) ?: LinphonePresenceActivityOffline : NULL; + LinphonePresenceActivity *activity = model ? linphone_presence_model_get_activity(model):NULL; LOGE(@"Friend %s status is now %s/%s since %@", _friend ? linphone_friend_get_name(_friend) : "NULL", - basic == LinphonePresenceBasicStatusOpen ? "open" : "closed", linphone_presence_activity_to_string(activity), + basic == LinphonePresenceBasicStatusOpen ? "open" : "closed", activity? linphone_presence_activity_to_string(activity):"Unknown", [NSDate dateWithTimeIntervalSince1970:linphone_presence_model_get_timestamp(model)]); NSString *imageName; diff --git a/Classes/LinphoneUI/UIBluetoothButton.m b/Classes/LinphoneUI/UIBluetoothButton.m index 002d02624..c5cc4c2a2 100644 --- a/Classes/LinphoneUI/UIBluetoothButton.m +++ b/Classes/LinphoneUI/UIBluetoothButton.m @@ -18,8 +18,10 @@ */ #import "UIBluetoothButton.h" -#import +#import "../Utils/AudioHelper.h" #import "Utils.h" +#import +#import #include "linphone/linphonecore.h" @@ -29,29 +31,11 @@ LOGE(@"UIBluetoothButton error for %s: ret=%ld", method, au) - (void)onOn { - // redirect audio to bluetooth - - UInt32 size = sizeof(CFStringRef); - CFStringRef route = CFSTR("HeadsetBT"); - OSStatus result = AudioSessionSetProperty(kAudioSessionProperty_AudioRoute, size, &route); - check_auresult(result, "set kAudioSessionProperty_AudioRoute HeadsetBT"); - - int allowBluetoothInput = 1; - result = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, - sizeof(allowBluetoothInput), &allowBluetoothInput); - check_auresult(result, "set kAudioSessionProperty_OverrideCategoryEnableBluetoothInput 1"); + [LinphoneManager.instance setBluetoothEnabled:TRUE]; } - (void)onOff { - // redirect audio to bluetooth - int allowBluetoothInput = 0; - OSStatus result = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, - sizeof(allowBluetoothInput), &allowBluetoothInput); - check_auresult(result, "set kAudioSessionProperty_OverrideCategoryEnableBluetoothInput 0"); - UInt32 size = sizeof(CFStringRef); - CFStringRef route = CFSTR("ReceiverAndMicrophone"); - result = AudioSessionSetProperty(kAudioSessionProperty_AudioRoute, size, &route); - check_auresult(result, "set kAudioSessionProperty_AudioRoute ReceiverAndMicrophone"); + [LinphoneManager.instance setBluetoothEnabled:FALSE]; } - (bool)onUpdate { diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.h b/Classes/LinphoneUI/UIChatBubbleTextCell.h index 5c300c628..9c3d71762 100644 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.h +++ b/Classes/LinphoneUI/UIChatBubbleTextCell.h @@ -36,6 +36,9 @@ @property(nonatomic, strong) id chatRoomDelegate; @property(strong, nonatomic) IBOutlet UIView *bubbleView; @property(strong, nonatomic) IBOutlet UITapGestureRecognizer *resendRecognizer; +@property(weak, nonatomic) IBOutlet UIImageView *LIMEKO; +@property(weak, nonatomic) IBOutlet UIImageView *imdmIcon; +@property(weak, nonatomic) IBOutlet UILabel *imdmLabel; + (CGSize)ViewSizeForMessage:(LinphoneChatMessage *)chat withWidth:(int)width; @@ -45,6 +48,7 @@ - (IBAction)onResendClick:(id)event; - (void)update; +- (void)displayImdmStatus:(LinphoneChatMessageState)state; + (CGSize)ViewHeightForMessage:(LinphoneChatMessage *)chat withWidth:(int)width; + (NSString *)TextMessageForChat:(LinphoneChatMessage *)message; + (CGSize)computeBoundingBox:(NSString *)text size:(CGSize)size font:(UIFont *)font; diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.m b/Classes/LinphoneUI/UIChatBubbleTextCell.m index e36672f4c..8cca9e4b7 100644 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.m +++ b/Classes/LinphoneUI/UIChatBubbleTextCell.m @@ -138,15 +138,6 @@ if (outgoing && state == LinphoneChatMessageStateInProgress) { _statusErrorImage.hidden = YES; [_statusInProgressSpinner startAnimating]; - } else if (outgoing && - (state == LinphoneChatMessageStateNotDelivered || state == LinphoneChatMessageStateFileTransferError)) { - _statusErrorImage.hidden = NO; - [_statusInProgressSpinner stopAnimating]; - - NSAttributedString *resend_text = - [[NSAttributedString alloc] initWithString:NSLocalizedString(@"Resend", @"Resend") - attributes:@{NSForegroundColorAttributeName : [UIColor redColor]}]; - [_contactDateLabel setAttributedText:resend_text]; } else if (!outgoing && state == LinphoneChatMessageStateFileTransferError) { _statusErrorImage.hidden = NO; [_statusInProgressSpinner stopAnimating]; @@ -159,6 +150,24 @@ [_messageText setAccessibilityLabel:@"Outgoing message"]; } else { [_messageText setAccessibilityLabel:@"Incoming message"]; + if (!([UIApplication sharedApplication].applicationState != UIApplicationStateBackground || + [UIApplication sharedApplication].applicationState != UIApplicationStateInactive)) { + VIEW(ChatConversationView).markAsRead; + } + } + + if (outgoing && + (state == LinphoneChatMessageStateDeliveredToUser || state == LinphoneChatMessageStateDisplayed || + state == LinphoneChatMessageStateNotDelivered || state == LinphoneChatMessageStateFileTransferError)) { + [self displayImdmStatus:state]; + } else + [self displayImdmStatus:LinphoneChatMessageStateInProgress]; + + if (!outgoing && !linphone_chat_message_is_secured(_message) && + linphone_core_lime_enabled(LC) == LinphoneLimeMandatory) { + _LIMEKO.hidden = FALSE; + } else { + _LIMEKO.hidden = TRUE; } } @@ -171,6 +180,21 @@ _resendRecognizer.enabled = !editing; } +- (void)displayLIMEWarning { + UIAlertController *errView = + [UIAlertController alertControllerWithTitle:NSLocalizedString(@"LIME warning", nil) + message:NSLocalizedString(@"This message is not encrypted.", 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]; +} + #pragma mark - Action Functions - (IBAction)onDeleteClick:(id)event { @@ -184,6 +208,11 @@ } - (IBAction)onResendClick:(id)event { + if (!_LIMEKO.hidden) { + [self displayLIMEWarning]; + return; + } + if (_message == nil || !linphone_chat_message_is_outgoing(_message)) return; @@ -224,6 +253,33 @@ static void message_status(LinphoneChatMessage *msg, LinphoneChatMessageState st [view.tableController updateChatEntry:msg]; } +- (void)displayImdmStatus:(LinphoneChatMessageState)state { + if (state == LinphoneChatMessageStateDeliveredToUser) { + [_imdmIcon setImage:[UIImage imageNamed:@"chat_delivered"]]; + [_imdmLabel setText:NSLocalizedString(@"Delivered", nil)]; + [_imdmLabel setTextColor:[UIColor grayColor]]; + [_imdmIcon setHidden:FALSE]; + [_imdmLabel setHidden:FALSE]; + } else if (state == LinphoneChatMessageStateDisplayed) { + [_imdmIcon setImage:[UIImage imageNamed:@"chat_read"]]; + [_imdmLabel setText:NSLocalizedString(@"Displayed", nil)]; + [_imdmLabel + setTextColor:([UIColor colorWithRed:(24 / 255.0) green:(167 / 255.0) blue:(175 / 255.0) alpha:1.0])]; + + [_imdmIcon setHidden:FALSE]; + [_imdmLabel setHidden:FALSE]; + } else if (state == LinphoneChatMessageStateNotDelivered || state == LinphoneChatMessageStateFileTransferError) { + [_imdmIcon setImage:[UIImage imageNamed:@"chat_error"]]; + [_imdmLabel setText:NSLocalizedString(@"Resend", nil)]; + [_imdmLabel setTextColor:[UIColor redColor]]; + [_imdmIcon setHidden:FALSE]; + [_imdmLabel setHidden:FALSE]; + } else { + [_imdmIcon setHidden:TRUE]; + [_imdmLabel setHidden:TRUE]; + } +} + #pragma mark - Bubble size computing + (CGSize)computeBoundingBox:(NSString *)text size:(CGSize)size font:(UIFont *)font { @@ -248,9 +304,9 @@ static void message_status(LinphoneChatMessage *msg, LinphoneChatMessageState st } static const CGFloat CELL_MIN_HEIGHT = 60.0f; -static const CGFloat CELL_MIN_WIDTH = 150.0f; +static const CGFloat CELL_MIN_WIDTH = 190.0f; static const CGFloat CELL_MESSAGE_X_MARGIN = 78 + 10.0f; -static const CGFloat CELL_MESSAGE_Y_MARGIN = 44; +static const CGFloat CELL_MESSAGE_Y_MARGIN = 52; // 44; static const CGFloat CELL_IMAGE_HEIGHT = 100.0f; static const CGFloat CELL_IMAGE_WIDTH = 100.0f; diff --git a/Classes/LinphoneUI/UIHangUpButton.m b/Classes/LinphoneUI/UIHangUpButton.m index 69d4c729d..48bd64528 100644 --- a/Classes/LinphoneUI/UIHangUpButton.m +++ b/Classes/LinphoneUI/UIHangUpButton.m @@ -97,11 +97,11 @@ LinphoneManager.instance.conf = TRUE; linphone_core_terminate_conference(LC); } else if (currentcall != NULL) { - linphone_core_terminate_call(LC, currentcall); + linphone_call_terminate(currentcall); } else { const MSList *calls = linphone_core_get_calls(LC); if (bctbx_list_size(calls) == 1) { // Only one call - linphone_core_terminate_call(LC, (LinphoneCall *)(calls->data)); + linphone_call_terminate((LinphoneCall *)(calls->data)); } } } diff --git a/Classes/LinphoneUI/UIPauseButton.m b/Classes/LinphoneUI/UIPauseButton.m index 9ca7b0689..b7c7ff508 100644 --- a/Classes/LinphoneUI/UIPauseButton.m +++ b/Classes/LinphoneUI/UIPauseButton.m @@ -82,22 +82,7 @@ switch (type) { case UIPauseButtonType_Call: { if (call != nil) { - if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { - NSUUID *uuid = (NSUUID *)[LinphoneManager.instance.providerDelegate.uuids - objectForKey:[NSString stringWithUTF8String:linphone_call_log_get_call_id( - linphone_call_get_call_log(call))]]; - if (!uuid) { - linphone_core_pause_call(LC, call); - return; - } - CXSetHeldCallAction *act = [[CXSetHeldCallAction alloc] initWithCallUUID:uuid onHold:YES]; - CXTransaction *tr = [[CXTransaction alloc] initWithAction:act]; - [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr - completion:^(NSError *err){ - }]; - } else { - linphone_core_pause_call(LC, call); - } + linphone_call_pause(call); } else { LOGW(@"Cannot toggle pause buttton, because no current call"); } @@ -113,22 +98,7 @@ case UIPauseButtonType_CurrentCall: { LinphoneCall *currentCall = [UIPauseButton getCall]; if (currentCall != nil) { - if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { - NSUUID *uuid = (NSUUID *)[LinphoneManager.instance.providerDelegate.uuids - objectForKey:[NSString stringWithUTF8String:linphone_call_log_get_call_id( - linphone_call_get_call_log(currentCall))]]; - if (!uuid) { - linphone_core_pause_call(LC, currentCall); - return; - } - CXSetHeldCallAction *act = [[CXSetHeldCallAction alloc] initWithCallUUID:uuid onHold:YES]; - CXTransaction *tr = [[CXTransaction alloc] initWithAction:act]; - [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr - completion:^(NSError *err){ - }]; - } else { - linphone_core_pause_call(LC, currentCall); - } + linphone_call_pause(currentCall); } else { LOGW(@"Cannot toggle pause buttton, because no current call"); } @@ -141,22 +111,7 @@ switch (type) { case UIPauseButtonType_Call: { if (call != nil) { - if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { - NSUUID *uuid = (NSUUID *)[LinphoneManager.instance.providerDelegate.uuids - objectForKey:[NSString stringWithUTF8String:linphone_call_log_get_call_id( - linphone_call_get_call_log(call))]]; - if (!uuid) { - linphone_core_resume_call(LC, call); - return; - } - CXSetHeldCallAction *act = [[CXSetHeldCallAction alloc] initWithCallUUID:uuid onHold:NO]; - CXTransaction *tr = [[CXTransaction alloc] initWithAction:act]; - [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr - completion:^(NSError *err){ - }]; - } else { - linphone_core_resume_call(LC, call); - } + linphone_call_resume(call); } else { LOGW(@"Cannot toggle pause buttton, because no current call"); } @@ -164,11 +119,9 @@ } case UIPauseButtonType_Conference: { if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { - NSUUID *uuid = (NSUUID *)[LinphoneManager.instance.providerDelegate.uuids allValues].firstObject; + NSString *key = (NSString *)[LinphoneManager.instance.providerDelegate.uuids allKeys][0]; + NSUUID *uuid = (NSUUID *)[LinphoneManager.instance.providerDelegate.uuids objectForKey:key]; if (!uuid) { - linphone_core_enter_conference(LC); - // Fake event - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self]; return; } CXSetHeldCallAction *act = [[CXSetHeldCallAction alloc] initWithCallUUID:uuid onHold:NO]; @@ -176,31 +129,15 @@ [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr completion:^(NSError *err){ }]; - } else { - linphone_core_enter_conference(LC); - // Fake event - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self]; } + linphone_core_enter_conference(LC); + // Fake event + [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self]; break; } case UIPauseButtonType_CurrentCall: { LinphoneCall *currentCall = [UIPauseButton getCall]; - if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { - NSUUID *uuid = (NSUUID *)[LinphoneManager.instance.providerDelegate.uuids - objectForKey:[NSString stringWithUTF8String:linphone_call_log_get_call_id( - linphone_call_get_call_log(currentCall))]]; - if (!uuid) { - linphone_core_resume_call(LC, currentCall); - return; - } - CXSetHeldCallAction *act = [[CXSetHeldCallAction alloc] initWithCallUUID:uuid onHold:NO]; - CXTransaction *tr = [[CXTransaction alloc] initWithAction:act]; - [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr - completion:^(NSError *err){ - }]; - } else { - linphone_core_resume_call(LC, currentCall); - } + linphone_call_resume(currentCall); break; } } diff --git a/Classes/LinphoneUI/ar.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatBubblePhotoCell.strings index 9e0f6b9bf..412b62d3f 100644 Binary files a/Classes/LinphoneUI/ar.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/ar.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/ar.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatBubbleTextCell.strings index 284b9231e..36ae34217 100644 Binary files a/Classes/LinphoneUI/ar.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/ar.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/de.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/de.lproj/UIChatBubblePhotoCell.strings index 18286f7eb..df1e5bd28 100644 Binary files a/Classes/LinphoneUI/de.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/de.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/de.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/de.lproj/UIChatBubbleTextCell.strings index 1f5a9c3c9..f9f86d643 100644 Binary files a/Classes/LinphoneUI/de.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/de.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/es.lproj/StatusBarView.strings b/Classes/LinphoneUI/es.lproj/StatusBarView.strings new file mode 100644 index 000000000..49754b1a6 Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/StatusBarView.strings differ diff --git a/Classes/LinphoneUI/es.lproj/TabBarView.strings b/Classes/LinphoneUI/es.lproj/TabBarView.strings new file mode 100644 index 000000000..555cc1b0c Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/TabBarView.strings differ diff --git a/Classes/LinphoneUI/es.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/es.lproj/UICallConferenceCell.strings new file mode 100644 index 000000000..729c7f8c0 Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/UICallConferenceCell.strings differ diff --git a/Classes/LinphoneUI/es.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/es.lproj/UICallPausedCell.strings new file mode 100644 index 000000000..33049fc41 Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/UICallPausedCell.strings differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/es.lproj/UIChatBubblePhotoCell.strings new file mode 100644 index 000000000..3187e367e Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/es.lproj/UIChatBubbleTextCell.strings new file mode 100644 index 000000000..792e134b4 Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatCell.strings b/Classes/LinphoneUI/es.lproj/UIChatCell.strings new file mode 100644 index 000000000..8c3c5d032 Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/UIChatCell.strings differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/es.lproj/UIChatCreateCell.strings new file mode 100644 index 000000000..ac8173e78 Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/UIChatCreateCell.strings differ diff --git a/Classes/LinphoneUI/es.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/es.lproj/UIConfirmationDialog.strings new file mode 100644 index 000000000..af4fe4ff8 Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/UIConfirmationDialog.strings differ diff --git a/Classes/LinphoneUI/es.lproj/UIContactCell.strings b/Classes/LinphoneUI/es.lproj/UIContactCell.strings new file mode 100644 index 000000000..db608de43 Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/UIContactCell.strings differ diff --git a/Classes/LinphoneUI/es.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/es.lproj/UIContactDetailsCell.strings new file mode 100644 index 000000000..c41a166fc Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/UIContactDetailsCell.strings differ diff --git a/Classes/LinphoneUI/es.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/es.lproj/UIHistoryCell.strings new file mode 100644 index 000000000..3453ea541 Binary files /dev/null and b/Classes/LinphoneUI/es.lproj/UIHistoryCell.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/StatusBarView.strings b/Classes/LinphoneUI/es_AR.lproj/StatusBarView.strings new file mode 100644 index 000000000..49754b1a6 Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/StatusBarView.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/TabBarView.strings b/Classes/LinphoneUI/es_AR.lproj/TabBarView.strings new file mode 100644 index 000000000..555cc1b0c Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/TabBarView.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/es_AR.lproj/UICallConferenceCell.strings new file mode 100644 index 000000000..729c7f8c0 Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/UICallConferenceCell.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/es_AR.lproj/UICallPausedCell.strings new file mode 100644 index 000000000..33049fc41 Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/UICallPausedCell.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatBubblePhotoCell.strings new file mode 100644 index 000000000..3187e367e Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatBubbleTextCell.strings new file mode 100644 index 000000000..792e134b4 Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatCell.strings new file mode 100644 index 000000000..8c3c5d032 Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/UIChatCell.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatCreateCell.strings new file mode 100644 index 000000000..ac8173e78 Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/UIChatCreateCell.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/es_AR.lproj/UIConfirmationDialog.strings new file mode 100644 index 000000000..af4fe4ff8 Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/UIConfirmationDialog.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIContactCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIContactCell.strings new file mode 100644 index 000000000..db608de43 Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/UIContactCell.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIContactDetailsCell.strings new file mode 100644 index 000000000..c41a166fc Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/UIContactDetailsCell.strings differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIHistoryCell.strings new file mode 100644 index 000000000..3453ea541 Binary files /dev/null and b/Classes/LinphoneUI/es_AR.lproj/UIHistoryCell.strings differ diff --git a/Classes/LinphoneUI/fr.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatBubblePhotoCell.strings index 4388780d7..35278ca31 100644 Binary files a/Classes/LinphoneUI/fr.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/fr.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/fr.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatBubbleTextCell.strings index 1125a27b4..28558bca1 100644 Binary files a/Classes/LinphoneUI/fr.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/fr.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/ja.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatBubblePhotoCell.strings index 4c19dc953..af4a19509 100644 Binary files a/Classes/LinphoneUI/ja.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/ja.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/ja.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatBubbleTextCell.strings index d63a348ef..9444b1ff2 100644 Binary files a/Classes/LinphoneUI/ja.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/ja.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/StatusBarView.strings b/Classes/LinphoneUI/ka.lproj/StatusBarView.strings new file mode 100644 index 000000000..3999e6ae1 Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/StatusBarView.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/TabBarView.strings b/Classes/LinphoneUI/ka.lproj/TabBarView.strings new file mode 100644 index 000000000..e9a560b0d Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/TabBarView.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/ka.lproj/UICallConferenceCell.strings new file mode 100644 index 000000000..c64971be4 Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/UICallConferenceCell.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/ka.lproj/UICallPausedCell.strings new file mode 100644 index 000000000..0f794318f Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/UICallPausedCell.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatBubblePhotoCell.strings new file mode 100644 index 000000000..59b7adb0e Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatBubbleTextCell.strings new file mode 100644 index 000000000..67f55dee7 Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatCell.strings new file mode 100644 index 000000000..7891cf6bb Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/UIChatCell.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatCreateCell.strings new file mode 100644 index 000000000..ac8173e78 Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/UIChatCreateCell.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/ka.lproj/UIConfirmationDialog.strings new file mode 100644 index 000000000..60f04981a Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/UIConfirmationDialog.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/UIContactCell.strings b/Classes/LinphoneUI/ka.lproj/UIContactCell.strings new file mode 100644 index 000000000..a310dd9ea Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/UIContactCell.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/ka.lproj/UIContactDetailsCell.strings new file mode 100644 index 000000000..051026beb Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/UIContactDetailsCell.strings differ diff --git a/Classes/LinphoneUI/ka.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/ka.lproj/UIHistoryCell.strings new file mode 100644 index 000000000..7fd385e38 Binary files /dev/null and b/Classes/LinphoneUI/ka.lproj/UIHistoryCell.strings differ diff --git a/Classes/LinphoneUI/nl.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatBubblePhotoCell.strings index 48990cd90..36fc255fd 100644 Binary files a/Classes/LinphoneUI/nl.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/nl.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/nl.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatBubbleTextCell.strings index 1ae790e79..5ee3be70e 100644 Binary files a/Classes/LinphoneUI/nl.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/nl.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/pl.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/pl.lproj/UIChatBubblePhotoCell.strings index ca13f5e68..78095b84b 100644 Binary files a/Classes/LinphoneUI/pl.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/pl.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/pl.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/pl.lproj/UIChatBubbleTextCell.strings index 1bb54e41b..704825f2b 100644 Binary files a/Classes/LinphoneUI/pl.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/pl.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIChatBubblePhotoCell.strings index 7fe1f9fc4..3f2b00d99 100644 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/pt_BR.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIChatBubbleTextCell.strings index 1aee20beb..92e14836f 100644 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/pt_BR.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/ru.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/ru.lproj/UICallConferenceCell.strings index f8f9c3150..1c337daf7 100644 Binary files a/Classes/LinphoneUI/ru.lproj/UICallConferenceCell.strings and b/Classes/LinphoneUI/ru.lproj/UICallConferenceCell.strings differ diff --git a/Classes/LinphoneUI/ru.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/ru.lproj/UICallPausedCell.strings index 12ea9ab12..1334b5315 100644 Binary files a/Classes/LinphoneUI/ru.lproj/UICallPausedCell.strings and b/Classes/LinphoneUI/ru.lproj/UICallPausedCell.strings differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatBubblePhotoCell.strings index 31e39ca0f..550177fad 100644 Binary files a/Classes/LinphoneUI/ru.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/ru.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatBubbleTextCell.strings index f695a8271..407cba00a 100644 Binary files a/Classes/LinphoneUI/ru.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/ru.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatCell.strings index 20c2bc60b..5312fc79e 100644 Binary files a/Classes/LinphoneUI/ru.lproj/UIChatCell.strings and b/Classes/LinphoneUI/ru.lproj/UIChatCell.strings differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatCreateCell.strings new file mode 100644 index 000000000..4adb71feb Binary files /dev/null and b/Classes/LinphoneUI/ru.lproj/UIChatCreateCell.strings differ diff --git a/Classes/LinphoneUI/ru.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/ru.lproj/UIConfirmationDialog.strings new file mode 100644 index 000000000..883fc080c Binary files /dev/null and b/Classes/LinphoneUI/ru.lproj/UIConfirmationDialog.strings differ diff --git a/Classes/LinphoneUI/ru.lproj/UIContactCell.strings b/Classes/LinphoneUI/ru.lproj/UIContactCell.strings index aca210d0b..5a5a8e4c0 100644 Binary files a/Classes/LinphoneUI/ru.lproj/UIContactCell.strings and b/Classes/LinphoneUI/ru.lproj/UIContactCell.strings differ diff --git a/Classes/LinphoneUI/ru.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/ru.lproj/UIHistoryCell.strings index 731db2b00..c2bcb90cb 100644 Binary files a/Classes/LinphoneUI/ru.lproj/UIHistoryCell.strings and b/Classes/LinphoneUI/ru.lproj/UIHistoryCell.strings differ diff --git a/Classes/LinphoneUI/sv.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/sv.lproj/UIChatBubblePhotoCell.strings index 3b0b8866d..19a014e74 100644 Binary files a/Classes/LinphoneUI/sv.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/sv.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/sv.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/sv.lproj/UIChatBubbleTextCell.strings index 5659420f7..ce7797f50 100644 Binary files a/Classes/LinphoneUI/sv.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/sv.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/tr.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/tr.lproj/UIChatBubblePhotoCell.strings index f00649e40..07a10d471 100644 Binary files a/Classes/LinphoneUI/tr.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/tr.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/tr.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/tr.lproj/UIChatBubbleTextCell.strings index ce754a6f5..16468d473 100644 Binary files a/Classes/LinphoneUI/tr.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/tr.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIChatBubblePhotoCell.strings index 3fb8b70f4..1692f7198 100644 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/zh_CN.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIChatBubbleTextCell.strings index e3604cdb6..aeeaf10f7 100644 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/zh_CN.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIChatBubblePhotoCell.strings index 95ab1e1a5..b7a8ecdeb 100644 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIChatBubblePhotoCell.strings and b/Classes/LinphoneUI/zh_TW.lproj/UIChatBubblePhotoCell.strings differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIChatBubbleTextCell.strings index 47febcdae..4aac372b4 100644 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIChatBubbleTextCell.strings and b/Classes/LinphoneUI/zh_TW.lproj/UIChatBubbleTextCell.strings differ diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index c7b461f27..aa873f26a 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -19,7 +19,6 @@ #import #import - #import "LinphoneAppDelegate.h" #import "PhoneMainView.h" @@ -335,7 +334,18 @@ static RootViewManager *rootViewManagerInstance = nil; break; } case LinphoneCallPausedByRemote: - case LinphoneCallConnected: + case LinphoneCallConnected: { + if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max && call) { + NSString *callId = + [NSString stringWithUTF8String:linphone_call_log_get_call_id(linphone_call_get_call_log(call))]; + NSUUID *uuid = [LinphoneManager.instance.providerDelegate.uuids objectForKey:callId]; + if (uuid) { + [LinphoneManager.instance.providerDelegate.provider reportOutgoingCallWithUUID:uuid + startedConnectingAtDate:nil]; + } + } + break; + } case LinphoneCallStreamsRunning: { [self changeCurrentView:CallView.compositeViewDescription]; if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max && call) { @@ -343,6 +353,8 @@ static RootViewManager *rootViewManagerInstance = nil; [NSString stringWithUTF8String:linphone_call_log_get_call_id(linphone_call_get_call_log(call))]; NSUUID *uuid = [LinphoneManager.instance.providerDelegate.uuids objectForKey:callId]; if (uuid) { + [LinphoneManager.instance.providerDelegate.provider reportOutgoingCallWithUUID:uuid + connectedAtDate:nil]; NSString *address = [FastAddressBook displayNameForAddress:linphone_call_get_remote_address(call)]; CXCallUpdate *update = [[CXCallUpdate alloc] init]; update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:address]; @@ -366,6 +378,7 @@ static RootViewManager *rootViewManagerInstance = nil; } case LinphoneCallError: { [self displayCallError:call message:message]; + break; } case LinphoneCallEnd: { const MSList *calls = linphone_core_get_calls(LC); @@ -376,23 +389,7 @@ static RootViewManager *rootViewManagerInstance = nil; [self popCurrentView]; } } else { - if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { - NSUUID *uuid = (NSUUID *)[LinphoneManager.instance.providerDelegate.uuids - objectForKey:[NSString - stringWithUTF8String:linphone_call_log_get_call_id(linphone_call_get_call_log( - (LinphoneCall *)calls->data))]]; - if (!uuid) { - linphone_core_resume_call(LC, (LinphoneCall *)calls->data); - return; - } - CXSetHeldCallAction *act = [[CXSetHeldCallAction alloc] initWithCallUUID:uuid onHold:NO]; - CXTransaction *tr = [[CXTransaction alloc] initWithAction:act]; - [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr - completion:^(NSError *err){ - }]; - } else { - linphone_core_resume_call(LC, (LinphoneCall *)calls->data); - } + linphone_call_resume((LinphoneCall *)calls->data); [self changeCurrentView:CallView.compositeViewDescription]; } break; @@ -400,51 +397,45 @@ static RootViewManager *rootViewManagerInstance = nil; case LinphoneCallEarlyUpdatedByRemote: case LinphoneCallEarlyUpdating: case LinphoneCallIdle: + break; case LinphoneCallOutgoingEarlyMedia: case LinphoneCallOutgoingProgress: { if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max && call && (linphone_core_get_calls_nb(LC) < 2)) { - // Create CallKit Call + // Link call ID to UUID NSString *callId = [NSString stringWithUTF8String:linphone_call_log_get_call_id(linphone_call_get_call_log(call))]; - NSUUID *uuid = [NSUUID UUID]; - [LinphoneManager.instance.providerDelegate.uuids setObject:uuid forKey:callId]; - [LinphoneManager.instance.providerDelegate.calls setObject:callId forKey:uuid]; - NSString *address = [FastAddressBook displayNameForAddress:linphone_call_get_remote_address(call)]; - CXHandle *handle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:address]; - CXStartCallAction *act = [[CXStartCallAction alloc] initWithCallUUID:uuid handle:handle]; + NSUUID *uuid = [LinphoneManager.instance.providerDelegate.uuids objectForKey:@""]; + if (uuid) { + [LinphoneManager.instance.providerDelegate.uuids removeObjectForKey:@""]; + [LinphoneManager.instance.providerDelegate.uuids setObject:uuid forKey:callId]; + [LinphoneManager.instance.providerDelegate.calls setObject:callId forKey:uuid]; + } + } + break; + } + case LinphoneCallOutgoingRinging: + case LinphoneCallPaused: + case LinphoneCallPausing: + case LinphoneCallRefered: + case LinphoneCallReleased: + break; + case LinphoneCallResuming: { + if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max && call) { + NSUUID *uuid = (NSUUID *)[LinphoneManager.instance.providerDelegate.uuids + objectForKey:[NSString stringWithUTF8String:linphone_call_log_get_call_id( + linphone_call_get_call_log(call))]]; + if (!uuid) { + return; + } + CXSetHeldCallAction *act = [[CXSetHeldCallAction alloc] initWithCallUUID:uuid onHold:NO]; CXTransaction *tr = [[CXTransaction alloc] initWithAction:act]; [LinphoneManager.instance.providerDelegate.controller requestTransaction:tr completion:^(NSError *err){ }]; } + break; } - case LinphoneCallOutgoingRinging: { - if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max && call) { - NSString *callId = - [NSString stringWithUTF8String:linphone_call_log_get_call_id(linphone_call_get_call_log(call))]; - NSUUID *uuid = [LinphoneManager.instance.providerDelegate.uuids objectForKey:callId]; - if (uuid) { - [LinphoneManager.instance.providerDelegate.provider reportOutgoingCallWithUUID:uuid - startedConnectingAtDate:nil]; - [LinphoneManager.instance.providerDelegate.provider reportOutgoingCallWithUUID:uuid - connectedAtDate:nil]; - NSString *address = [FastAddressBook displayNameForAddress:linphone_call_get_remote_address(call)]; - CXCallUpdate *update = [[CXCallUpdate alloc] init]; - update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:address]; - update.supportsGrouping = TRUE; - update.supportsDTMF = TRUE; - update.supportsHolding = TRUE; - update.supportsUngrouping = TRUE; - [LinphoneManager.instance.providerDelegate.provider reportCallWithUUID:uuid updated:update]; - } - } - } - case LinphoneCallPaused: - case LinphoneCallPausing: - case LinphoneCallRefered: - case LinphoneCallReleased: - case LinphoneCallResuming: case LinphoneCallUpdating: break; } @@ -804,7 +795,7 @@ static RootViewManager *rootViewManagerInstance = nil; } - (void)incomingCallDeclined:(LinphoneCall *)call { - linphone_core_terminate_call(LC, call); + linphone_call_terminate(call); } @end diff --git a/Classes/ProviderDelegate.h b/Classes/ProviderDelegate.h index 9652be9d2..00a96b98c 100644 --- a/Classes/ProviderDelegate.h +++ b/Classes/ProviderDelegate.h @@ -18,9 +18,14 @@ @property CXCallController *controller; @property NSMutableDictionary *calls; @property NSMutableDictionary *uuids; +@property LinphoneCall *pendingCall; +@property LinphoneAddress *pendingAddr; +@property BOOL pendingCallVideo; +@property int callKitCalls; - (void)reportIncomingCallwithUUID:(NSUUID *)uuid handle:(NSString *)handle video:(BOOL)video; - (void)config; +- (void)configAudioSession:(AVAudioSession *)audioSession; @end #endif /* ProviderDelegate_h */ diff --git a/Classes/ProviderDelegate.m b/Classes/ProviderDelegate.m index 97bdf5961..e7936cd3e 100644 --- a/Classes/ProviderDelegate.m +++ b/Classes/ProviderDelegate.m @@ -19,10 +19,13 @@ self = [super init]; self.calls = [[NSMutableDictionary alloc] init]; self.uuids = [[NSMutableDictionary alloc] init]; - + self.pendingCall = NULL; + self.pendingAddr = NULL; + self.pendingCallVideo = FALSE; CXCallController *callController = [[CXCallController alloc] initWithQueue:dispatch_get_main_queue()]; [callController.callObserver setDelegate:self queue:dispatch_get_main_queue()]; self.controller = callController; + self.callKitCalls = 0; if (!self) { LOGD(@"ProviderDelegate not initialized..."); @@ -31,8 +34,9 @@ } - (void)config { - CXProviderConfiguration *config = [[CXProviderConfiguration alloc] initWithLocalizedName:@"Linphone"]; - config.ringtoneSound = @"shortring.caf"; + CXProviderConfiguration *config = [[CXProviderConfiguration alloc] + initWithLocalizedName:[NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]]; + config.ringtoneSound = @"notes_of_the_optimistic.caf"; config.supportsVideo = FALSE; config.iconTemplateImageData = UIImagePNGRepresentation([UIImage imageNamed:@"callkit_logo"]); @@ -45,6 +49,15 @@ [self.provider setDelegate:self queue:dispatch_get_main_queue()]; } +- (void)configAudioSession:(AVAudioSession *)audioSession { + [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord + withOptions:AVAudioSessionCategoryOptionAllowBluetooth + error:nil]; + [audioSession setMode:AVAudioSessionModeVoiceChat error:nil]; + double sampleRate = 44100.0; + [audioSession setPreferredSampleRate:sampleRate error:nil]; +} + - (void)reportIncomingCallwithUUID:(NSUUID *)uuid handle:(NSString *)handle video:(BOOL)video { // Create update to describe the incoming call and caller CXCallUpdate *update = [[CXCallUpdate alloc] init]; @@ -55,36 +68,11 @@ update.supportsUngrouping = TRUE; update.hasVideo = video; - LOGD(@"configuring audio session"); - AVAudioSession *audioSession = [AVAudioSession sharedInstance]; - [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; - [audioSession setMode:AVAudioSessionModeVoiceChat error:nil]; - - double sampleRate = 44100.0; - [audioSession setPreferredSampleRate:sampleRate error:nil]; - - NSTimeInterval bufferDuration = .005; - [audioSession setPreferredIOBufferDuration:bufferDuration error:nil]; - LOGD(@"Activating audio session"); - [audioSession setActive:TRUE error:nil]; - // Report incoming call to system LOGD(@"CallKit: report new incoming call"); [self.provider reportNewIncomingCallWithUUID:uuid update:update completion:^(NSError *error) { - LOGD(@"configuring audio session"); - AVAudioSession *audioSession = [AVAudioSession sharedInstance]; - [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; - [audioSession setMode:AVAudioSessionModeVoiceChat error:nil]; - - double sampleRate = 44100.0; - [audioSession setPreferredSampleRate:sampleRate error:nil]; - - NSTimeInterval bufferDuration = .005; - [audioSession setPreferredIOBufferDuration:bufferDuration error:nil]; - LOGD(@"Activating audio session"); - [audioSession setActive:TRUE error:nil]; }]; } @@ -92,8 +80,10 @@ - (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action { LOGD(@"CallKit : Answering Call"); - NSUUID *uuid = action.callUUID; + self.callKitCalls++; + [self configAudioSession:[AVAudioSession sharedInstance]]; [action fulfill]; + NSUUID *uuid = action.callUUID; NSString *callID = [self.calls objectForKey:uuid]; // first, make sure this callid is not already involved in a call LinphoneCall *call = [LinphoneManager.instance callByCallId:callID]; @@ -101,7 +91,8 @@ BOOL video = (!([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) && linphone_core_get_video_policy(LC)->automatically_accept && linphone_call_params_video_enabled(linphone_call_get_remote_params((LinphoneCall *)call))); - [LinphoneManager.instance acceptCall:(LinphoneCall *)call evenWithVideo:video]; + self.pendingCall = call; + self.pendingCallVideo = video; return; }; } @@ -109,19 +100,26 @@ - (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action { LOGD(@"CallKit : Starting Call"); // To restart Audio Unit - AVAudioSession *audioSession = [AVAudioSession sharedInstance]; - [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; - [audioSession setMode:AVAudioSessionModeVoiceChat error:nil]; - double sampleRate = 44100.0; - [audioSession setPreferredSampleRate:sampleRate error:nil]; - NSTimeInterval bufferDuration = .005; - [audioSession setPreferredIOBufferDuration:bufferDuration error:nil]; - [audioSession setActive:TRUE error:nil]; + [self configAudioSession:[AVAudioSession sharedInstance]]; [action fulfill]; + NSUUID *uuid = action.callUUID; + + NSString *callID = [self.calls objectForKey:uuid]; // first, make sure this callid is not already involved in a call + LinphoneCall *call; + if (![callID isEqualToString:@""]) { + call = linphone_core_get_current_call(LC); + } else { + call = [LinphoneManager.instance callByCallId:callID]; + } + if (call != NULL) { + _pendingCall = call; + } } - (void)provider:(CXProvider *)provider performEndCallAction:(CXEndCallAction *)action { LOGD(@"CallKit : Ending the Call"); + self.callKitCalls--; + [action fulfill]; if (linphone_core_is_in_conference(LC)) { LinphoneManager.instance.conf = TRUE; linphone_core_terminate_conference(LC); @@ -133,10 +131,11 @@ NSString *callID = [self.calls objectForKey:uuid]; LinphoneCall *call = [LinphoneManager.instance callByCallId:callID]; if (call) { - linphone_core_terminate_call(LC, (LinphoneCall *)call); + linphone_call_terminate((LinphoneCall *)call); } + [self.uuids removeObjectForKey:callID]; + [self.calls removeObjectForKey:uuid]; } - [action fulfill]; } - (void)provider:(CXProvider *)provider performSetMutedCallAction:(nonnull CXSetMutedCallAction *)action { @@ -149,17 +148,7 @@ - (void)provider:(CXProvider *)provider performSetHeldCallAction:(nonnull CXSetHeldCallAction *)action { LOGD(@"CallKit : Call paused status changed"); - // To restart Audio Unit - AVAudioSession *audioSession = [AVAudioSession sharedInstance]; - [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; - [audioSession setMode:AVAudioSessionModeVoiceChat error:nil]; - double sampleRate = 44100.0; - [audioSession setPreferredSampleRate:sampleRate error:nil]; - NSTimeInterval bufferDuration = .005; - [audioSession setPreferredIOBufferDuration:bufferDuration error:nil]; - [audioSession setActive:TRUE error:nil]; [action fulfill]; - if (linphone_core_is_in_conference(LC) && action.isOnHold) { linphone_core_leave_conference(LC); [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self]; @@ -180,21 +169,22 @@ LinphoneCall *call = [LinphoneManager.instance callByCallId:callID]; if (call) { if (action.isOnHold) { - linphone_core_pause_call(LC, (LinphoneCall *)call); + linphone_call_pause((LinphoneCall *)call); } else { + [self configAudioSession:[AVAudioSession sharedInstance]]; if (linphone_core_get_conference(LC)) { linphone_core_enter_conference(LC); [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self]; } else { - linphone_core_resume_call(LC, (LinphoneCall *)call); + _pendingCall = call; } } } } - (void)provider:(CXProvider *)provider performPlayDTMFCallAction:(CXPlayDTMFCallAction *)action { - [action fulfill]; LOGD(@"CallKit : playing DTMF"); + [action fulfill]; NSUUID *call_uuid = action.callUUID; NSString *callID = [self.calls objectForKey:call_uuid]; LinphoneCall *call = [LinphoneManager.instance callByCallId:callID]; @@ -204,10 +194,41 @@ - (void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession { LOGD(@"CallKit : Audio session activated"); + // Now we can (re)start the call + if (_pendingCall) { + LinphoneCallState state = linphone_call_get_state(_pendingCall); + switch (state) { + case LinphoneCallIncomingReceived: + [LinphoneManager.instance acceptCall:(LinphoneCall *)_pendingCall evenWithVideo:_pendingCallVideo]; + break; + case LinphoneCallPaused: + linphone_call_resume((LinphoneCall *)_pendingCall); + break; + case LinphoneCallStreamsRunning: + // May happen when multiple calls + break; + default: + break; + } + } else { + if (_pendingAddr) { + [LinphoneManager.instance doCall:_pendingAddr]; + } else { + LOGE(@"CallKit : No pending call"); + } + } + + _pendingCall = NULL; + _pendingAddr = NULL; + _pendingCallVideo = FALSE; } - (void)provider:(CXProvider *)provider didDeactivateAudioSession:(nonnull AVAudioSession *)audioSession { LOGD(@"CallKit : Audio session deactivated"); + + _pendingCall = NULL; + _pendingAddr = NULL; + _pendingCallVideo = FALSE; } - (void)providerDidReset:(CXProvider *)provider { diff --git a/Classes/SettingsView.m b/Classes/SettingsView.m index ad771a29e..521e8c8c6 100644 --- a/Classes/SettingsView.m +++ b/Classes/SettingsView.m @@ -594,6 +594,10 @@ void update_hash_cbs(LinphoneAccountCreator *creator, LinphoneAccountCreatorStat [hiddenKeys addObject:@"media_encryption_preference"]; } + if (!linphone_core_lime_available(LC)) { + [hiddenKeys addObject:@"use_lime_preference"]; + } + #ifndef DEBUG [hiddenKeys addObject:@"debug_actions_group"]; [hiddenKeys addObject:@"release_button"]; @@ -828,7 +832,46 @@ void update_hash_cbs(LinphoneAccountCreator *creator, LinphoneAccountCreatorStat LinphoneAccountCreator *account_creator = linphone_account_creator_new( LC, [LinphoneManager.instance lpConfigStringForKey:@"xmlrpc_url" inSection:@"assistant" withDefault:@""] .UTF8String); - + if (!ai) { + UIAlertController *errView = [UIAlertController + alertControllerWithTitle: + NSLocalizedString( + @"Error while changing your " + @"password", + nil) + message: + NSLocalizedString( + @"Your " + @"account " + @"is not " + @"a " + @"Linphone" + @" account" + @".\n" + @"We can " + @"not " + @"change " + @"your " + @"password" + @".", + nil) + preferredStyle: + UIAlertControllerStyleAlert]; + + UIAlertAction *defaultAction = [UIAlertAction + actionWithTitle:@"OK" + style: + UIAlertActionStyleDefault + handler:^( + UIAlertAction *action){ + }]; + + [errView addAction:defaultAction]; + [self presentViewController:errView + animated:YES + completion:nil]; + return; + } linphone_account_creator_set_username(account_creator, linphone_auth_info_get_username(ai)); if (linphone_auth_info_get_passwd(ai) && !(strcmp(linphone_auth_info_get_passwd(ai),"") == 0)) { linphone_account_creator_set_password(account_creator, linphone_auth_info_get_passwd(ai)); @@ -852,7 +895,6 @@ void update_hash_cbs(LinphoneAccountCreator *creator, LinphoneAccountCreatorStat [self presentViewController:errView animated:YES completion:nil]; } } else { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Error while changing your password", nil) message:NSLocalizedString(@"Please enter and confirm your new password", nil) preferredStyle:UIAlertControllerStyleAlert]; diff --git a/Classes/SideMenuTableView.m b/Classes/SideMenuTableView.m index 231b80b19..0f7e82630 100644 --- a/Classes/SideMenuTableView.m +++ b/Classes/SideMenuTableView.m @@ -37,6 +37,7 @@ } - (void)viewWillAppear:(BOOL)animated { + linphone_core_stop_dtmf(LC); [super viewWillAppear:animated]; _sideMenuEntries = [[NSMutableArray alloc] init]; diff --git a/Classes/Utils/AudioHelper.h b/Classes/Utils/AudioHelper.h new file mode 100644 index 000000000..03ae31c66 --- /dev/null +++ b/Classes/Utils/AudioHelper.h @@ -0,0 +1,24 @@ +// +// AudioHelper.h +// linphone +// +// Created by REIS Benjamin on 01/03/2017. +// +// + +#ifndef AudioHelper_h +#define AudioHelper_h + +#import +#import + +@interface AudioHelper : NSObject + ++ (NSArray *)bluetoothRoutes; ++ (AVAudioSessionPortDescription *)bluetoothAudioDevice; ++ (AVAudioSessionPortDescription *)builtinAudioDevice; ++ (AVAudioSessionPortDescription *)speakerAudioDevice; ++ (AVAudioSessionPortDescription *)audioDeviceFromTypes:(NSArray *)types; +@end + +#endif /* AudioHelper_h */ diff --git a/Classes/Utils/FastAddressBook.m b/Classes/Utils/FastAddressBook.m index b732151f5..7b7abcc70 100644 --- a/Classes/Utils/FastAddressBook.m +++ b/Classes/Utils/FastAddressBook.m @@ -32,14 +32,16 @@ static void sync_address_book(ABAddressBookRef addressBook, CFDictionaryRef info, void *context); + (UIImage *)imageForContact:(Contact *)contact thumbnail:(BOOL)thumbnail { - UIImage *retImage = [contact avatar:thumbnail]; - if (retImage == nil) { - retImage = [UIImage imageNamed:@"avatar.png"]; + @synchronized(LinphoneManager.instance.fastAddressBook.addressBookMap) { + UIImage *retImage = [contact avatar:thumbnail]; + if (retImage == nil) { + retImage = [UIImage imageNamed:@"avatar.png"]; + } + if (retImage.size.width != retImage.size.height) { + retImage = [retImage squareCrop]; + } + return retImage; } - if (retImage.size.width != retImage.size.height) { - retImage = [retImage squareCrop]; - } - return retImage; } + (UIImage *)imageForAddress:(const LinphoneAddress *)addr thumbnail:(BOOL)thumbnail { @@ -159,7 +161,9 @@ static void sync_address_book(ABAddressBookRef addressBook, CFDictionaryRef info } ABAddressBookRegisterExternalChangeCallback(addressBook, sync_address_book, (__bridge void *)(weakSelf)); - [weakSelf loadData]; + dispatch_async(dispatch_get_main_queue(), ^(void) { + [weakSelf loadData]; + }); }); } else { @@ -296,8 +300,11 @@ void sync_address_book(ABAddressBookRef addressBook, CFDictionaryRef info, void + (NSString *)displayNameForAddress:(const LinphoneAddress *)addr { NSString *ret = NSLocalizedString(@"Unknown", nil); Contact *contact = [FastAddressBook getContactWithAddress:addr]; + LinphoneFriend *friend = linphone_core_find_friend(LC, addr); if (contact) { ret = [FastAddressBook displayNameForContact:contact]; + } else if (friend) { + ret = [NSString stringWithUTF8String:linphone_friend_get_name(friend)]; } else { const char *lDisplayName = linphone_address_get_display_name(addr); const char *lUserName = linphone_address_get_username(addr); @@ -312,54 +319,58 @@ void sync_address_book(ABAddressBookRef addressBook, CFDictionaryRef info, void - (int)removeContact:(Contact *)contact { // Remove contact from book - if (contact.person && ABRecordGetRecordID(contact.person) != kABRecordInvalidID) { - CFErrorRef error = NULL; - ABAddressBookRemoveRecord(addressBook, contact.person, (CFErrorRef *)&error); - if (error != NULL) { - LOGE(@"Remove contact %p: Fail(%@)", contact, [(__bridge NSError *)error localizedDescription]); - } else { - LOGI(@"Remove contact %p: Success!", contact); - } - contact = NULL; - // Save address book - error = NULL; - ABAddressBookSave(addressBook, (CFErrorRef *)&error); + @synchronized(_addressBookMap) { + if (contact.person && ABRecordGetRecordID(contact.person) != kABRecordInvalidID) { + CFErrorRef error = NULL; + ABAddressBookRemoveRecord(addressBook, contact.person, (CFErrorRef *)&error); + if (error != NULL) { + LOGE(@"Remove contact %p: Fail(%@)", contact, [(__bridge NSError *)error localizedDescription]); + } else { + LOGI(@"Remove contact %p: Success!", contact); + } + contact = NULL; + // Save address book + error = NULL; + ABAddressBookSave(addressBook, (CFErrorRef *)&error); - // TODO: stop reloading the whole address book but just clear the removed entries! - [self loadData]; + // TODO: stop reloading the whole address book but just clear the removed entries! + [self loadData]; - if (error != NULL) { - LOGE(@"Save AddressBook: Fail(%@)", [(__bridge NSError *)error localizedDescription]); - } else { - LOGI(@"Save AddressBook: Success!"); + if (error != NULL) { + LOGE(@"Save AddressBook: Fail(%@)", [(__bridge NSError *)error localizedDescription]); + } else { + LOGI(@"Save AddressBook: Success!"); + } + return error ? -1 : 0; } - return error ? -1 : 0; + return -2; } - return -2; } - (BOOL)saveContact:(Contact *)contact { - CFErrorRef error = NULL; - if (ABRecordGetRecordID(contact.person) == kABRecordInvalidID) { - if (ABAddressBookAddRecord(addressBook, contact.person, (CFErrorRef *)&error)) { - LOGI(@"Add contact %p: Success!", contact.person); + @synchronized(_addressBookMap) { + CFErrorRef error = NULL; + if (ABRecordGetRecordID(contact.person) == kABRecordInvalidID) { + if (ABAddressBookAddRecord(addressBook, contact.person, (CFErrorRef *)&error)) { + LOGI(@"Add contact %p: Success!", contact.person); + } else { + LOGE(@"Add contact %p: Fail(%@)", contact.person, [(__bridge NSError *)error localizedDescription]); + return FALSE; + } + } + + // Save address book + error = NULL; + if (ABAddressBookSave(addressBook, &error)) { + LOGI(@"Save AddressBook: Success!"); } else { - LOGE(@"Add contact %p: Fail(%@)", contact.person, [(__bridge NSError *)error localizedDescription]); + LOGE(@"Save AddressBook: Fail(%@)", [(__bridge NSError *)error localizedDescription]); return FALSE; } - } + [self reload]; - // Save address book - error = NULL; - if (ABAddressBookSave(addressBook, &error)) { - LOGI(@"Save AddressBook: Success!"); - } else { - LOGE(@"Save AddressBook: Fail(%@)", [(__bridge NSError *)error localizedDescription]); - return FALSE; + return error == NULL; } - [self reload]; - - return error == NULL; } @end diff --git a/Classes/Utils/FileTransferDelegate.m b/Classes/Utils/FileTransferDelegate.m index dc63afed5..2e335c885 100644 --- a/Classes/Utils/FileTransferDelegate.m +++ b/Classes/Utils/FileTransferDelegate.m @@ -7,8 +7,9 @@ // #import "FileTransferDelegate.h" -#import "Utils.h" +#import "LinphoneManager.h" #import "PhoneMainView.h" +#import "Utils.h" @interface FileTransferDelegate () @property(strong) NSMutableData *data; @@ -46,6 +47,24 @@ static void linphone_iphone_file_transfer_recv(LinphoneChatMessage *message, con // we're finished, save the image and update the message UIImage *image = [UIImage imageWithData:thiz.data]; + if (!image) { + UIAlertController *errView = [UIAlertController + alertControllerWithTitle:NSLocalizedString(@"File download error", nil) + message:NSLocalizedString(@"Error while downloading the file.\n" + @"The file is probably encrypted.\n" + @"Please retry to download this file after activating LIME.", + nil) + preferredStyle:UIAlertControllerStyleAlert]; + + UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK" + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action){ + }]; + + [errView addAction:defaultAction]; + [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; + return; + } CFBridgingRetain(thiz); [[LinphoneManager.instance fileTransferDelegates] removeObject:thiz]; @@ -171,8 +190,11 @@ static LinphoneBuffer *linphone_iphone_file_transfer_send(LinphoneChatMessage *m } LOGI(@"%p Uploading content from message %p", self, _message); - linphone_chat_room_send_chat_message(chatRoom, _message); + + if (linphone_core_lime_enabled(LC) == LinphoneLimeMandatory && !linphone_chat_room_lime_available(chatRoom)) { + [LinphoneManager.instance alertLIME:chatRoom]; + } } - (BOOL)download:(LinphoneChatMessage *)message { diff --git a/Classes/Utils/Log.m b/Classes/Utils/Log.m index 18edc3041..f89f2d095 100644 --- a/Classes/Utils/Log.m +++ b/Classes/Utils/Log.m @@ -114,8 +114,20 @@ void linphone_iphone_log_handler(const char *domain, OrtpLogLevel lev, const cha case ORTP_LOGLEV_END: return; } - os_log_with_type(log, type, "%{public}s/%{public}s", domain, - [formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"].UTF8String); + if ([formatedString containsString:@"\n"]) { + NSArray *myWords = [[formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"] + componentsSeparatedByString:@"\n"]; + for (int i = 0; i < myWords.count; i++) { + NSString *tab = i > 0 ? @"\t" : @""; + if (((NSString *)myWords[i]).length > 0) { + os_log_with_type(log, type, "%{public}s%{public}s", tab.UTF8String, + ((NSString *)myWords[i]).UTF8String); + } + } + } else { + os_log_with_type(log, type, "%{public}s/%{public}s", domain, + [formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"].UTF8String); + } } else { int lvl = ASL_LEVEL_NOTICE; switch (lev) { diff --git a/Classes/Utils/Utils.m b/Classes/Utils/Utils.m index 088269f8a..843ed7313 100644 --- a/Classes/Utils/Utils.m +++ b/Classes/Utils/Utils.m @@ -483,11 +483,15 @@ } // since user wants to escape plus, we assume it expects to have phone numbers by default - if (addr && cfg && (linphone_proxy_config_get_dial_escape_plus(cfg) || linphone_proxy_config_get_dial_prefix(cfg))) { - char *phone = linphone_proxy_config_normalize_phone_number(cfg, value.UTF8String); - if (phone) { - linphone_address_set_username(addr, phone); - ms_free(phone); + if (addr) { + if (cfg && (linphone_proxy_config_get_dial_escape_plus(cfg))) { + if (linphone_proxy_config_is_phone_number(cfg, normvalue)) { + linphone_address_set_username(addr, normvalue); + } + } else { + if (linphone_proxy_config_is_phone_number(cfg, value.UTF8String)) { + linphone_address_set_username(addr, value.UTF8String); + } } } diff --git a/Classes/ar.lproj/AboutView.strings b/Classes/ar.lproj/AboutView.strings index 04ff757c9..e569b365c 100644 Binary files a/Classes/ar.lproj/AboutView.strings and b/Classes/ar.lproj/AboutView.strings differ diff --git a/Classes/ar.lproj/AssistantLinkView.strings b/Classes/ar.lproj/AssistantLinkView.strings index c5dea0bad..4cdde4b17 100644 Binary files a/Classes/ar.lproj/AssistantLinkView.strings and b/Classes/ar.lproj/AssistantLinkView.strings differ diff --git a/Classes/ar.lproj/AssistantViewScreens.strings b/Classes/ar.lproj/AssistantViewScreens.strings index 8c294a08c..3f90b396a 100644 Binary files a/Classes/ar.lproj/AssistantViewScreens.strings and b/Classes/ar.lproj/AssistantViewScreens.strings differ diff --git a/Classes/ar.lproj/CallOutgoingView.strings b/Classes/ar.lproj/CallOutgoingView.strings index a3df2f172..41577a571 100644 Binary files a/Classes/ar.lproj/CallOutgoingView.strings and b/Classes/ar.lproj/CallOutgoingView.strings differ diff --git a/Classes/ar.lproj/ChatConversationView.strings b/Classes/ar.lproj/ChatConversationView.strings index 494a35724..e733daf8d 100644 Binary files a/Classes/ar.lproj/ChatConversationView.strings and b/Classes/ar.lproj/ChatConversationView.strings differ diff --git a/Classes/ar.lproj/ChatsListView.strings b/Classes/ar.lproj/ChatsListView.strings index ab9e8ef0c..60a475f33 100644 Binary files a/Classes/ar.lproj/ChatsListView.strings and b/Classes/ar.lproj/ChatsListView.strings differ diff --git a/Classes/ar.lproj/ContactDetailsView.strings b/Classes/ar.lproj/ContactDetailsView.strings index 457db11a4..863d6c8ef 100644 Binary files a/Classes/ar.lproj/ContactDetailsView.strings and b/Classes/ar.lproj/ContactDetailsView.strings differ diff --git a/Classes/ar.lproj/ContactsListView.strings b/Classes/ar.lproj/ContactsListView.strings index a62055cfb..9d6d02520 100644 Binary files a/Classes/ar.lproj/ContactsListView.strings and b/Classes/ar.lproj/ContactsListView.strings differ diff --git a/Classes/ar.lproj/CountryListView.strings b/Classes/ar.lproj/CountryListView.strings index 21d24951c..75501c496 100644 Binary files a/Classes/ar.lproj/CountryListView.strings and b/Classes/ar.lproj/CountryListView.strings differ diff --git a/Classes/ar.lproj/HistoryDetailsView.strings b/Classes/ar.lproj/HistoryDetailsView.strings index a2f95f004..3a508049f 100644 Binary files a/Classes/ar.lproj/HistoryDetailsView.strings and b/Classes/ar.lproj/HistoryDetailsView.strings differ diff --git a/Classes/ar.lproj/HistoryListView.strings b/Classes/ar.lproj/HistoryListView.strings index 5564ff5d6..de3c0d52f 100644 Binary files a/Classes/ar.lproj/HistoryListView.strings and b/Classes/ar.lproj/HistoryListView.strings differ diff --git a/Classes/ar.lproj/ShopView.strings b/Classes/ar.lproj/ShopView.strings index 7fb9e0297..a069982e0 100644 Binary files a/Classes/ar.lproj/ShopView.strings and b/Classes/ar.lproj/ShopView.strings differ diff --git a/Classes/cs.lproj/AboutView.strings b/Classes/cs.lproj/AboutView.strings new file mode 100644 index 000000000..bc2e07191 Binary files /dev/null and b/Classes/cs.lproj/AboutView.strings differ diff --git a/Classes/cs.lproj/AssistantLinkView.strings b/Classes/cs.lproj/AssistantLinkView.strings new file mode 100644 index 000000000..83f1e4a62 Binary files /dev/null and b/Classes/cs.lproj/AssistantLinkView.strings differ diff --git a/Classes/cs.lproj/AssistantView.strings b/Classes/cs.lproj/AssistantView.strings new file mode 100644 index 000000000..9a5202b81 Binary files /dev/null and b/Classes/cs.lproj/AssistantView.strings differ diff --git a/Classes/cs.lproj/AssistantViewScreens.strings b/Classes/cs.lproj/AssistantViewScreens.strings new file mode 100644 index 000000000..a10a0a4df Binary files /dev/null and b/Classes/cs.lproj/AssistantViewScreens.strings differ diff --git a/Classes/cs.lproj/ContactsListView.strings b/Classes/cs.lproj/ContactsListView.strings new file mode 100644 index 000000000..649dc7eba Binary files /dev/null and b/Classes/cs.lproj/ContactsListView.strings differ diff --git a/Classes/cs.lproj/FirstLoginView.strings b/Classes/cs.lproj/FirstLoginView.strings new file mode 100644 index 000000000..bd5327c5d Binary files /dev/null and b/Classes/cs.lproj/FirstLoginView.strings differ diff --git a/Classes/cs.lproj/SettingsView.strings b/Classes/cs.lproj/SettingsView.strings new file mode 100644 index 000000000..d715cb306 Binary files /dev/null and b/Classes/cs.lproj/SettingsView.strings differ diff --git a/Classes/cs.lproj/ShopView.strings b/Classes/cs.lproj/ShopView.strings new file mode 100644 index 000000000..c2255ce23 Binary files /dev/null and b/Classes/cs.lproj/ShopView.strings differ diff --git a/Classes/de.lproj/AboutView.strings b/Classes/de.lproj/AboutView.strings index a4b29b9e1..641325654 100644 Binary files a/Classes/de.lproj/AboutView.strings and b/Classes/de.lproj/AboutView.strings differ diff --git a/Classes/es.lproj/AboutView.strings b/Classes/es.lproj/AboutView.strings index 8810b6fca..1da819b6a 100644 Binary files a/Classes/es.lproj/AboutView.strings and b/Classes/es.lproj/AboutView.strings differ diff --git a/Classes/es.lproj/AssistantLinkView.strings b/Classes/es.lproj/AssistantLinkView.strings index e906f7cdb..f0b8dcb48 100644 Binary files a/Classes/es.lproj/AssistantLinkView.strings and b/Classes/es.lproj/AssistantLinkView.strings differ diff --git a/Classes/es.lproj/AssistantView.strings b/Classes/es.lproj/AssistantView.strings new file mode 100644 index 000000000..a62ff7261 Binary files /dev/null and b/Classes/es.lproj/AssistantView.strings differ diff --git a/Classes/es.lproj/AssistantViewScreens.strings b/Classes/es.lproj/AssistantViewScreens.strings new file mode 100644 index 000000000..d3c83f6d6 Binary files /dev/null and b/Classes/es.lproj/AssistantViewScreens.strings differ diff --git a/Classes/es.lproj/CallIncomingView.strings b/Classes/es.lproj/CallIncomingView.strings new file mode 100644 index 000000000..1ab84b080 Binary files /dev/null and b/Classes/es.lproj/CallIncomingView.strings differ diff --git a/Classes/es.lproj/CallOutgoingView.strings b/Classes/es.lproj/CallOutgoingView.strings new file mode 100644 index 000000000..b10453591 Binary files /dev/null and b/Classes/es.lproj/CallOutgoingView.strings differ diff --git a/Classes/es.lproj/CallView.strings b/Classes/es.lproj/CallView.strings new file mode 100644 index 000000000..062954d56 Binary files /dev/null and b/Classes/es.lproj/CallView.strings differ diff --git a/Classes/es.lproj/CallView~ipad.strings b/Classes/es.lproj/CallView~ipad.strings new file mode 100644 index 000000000..062954d56 Binary files /dev/null and b/Classes/es.lproj/CallView~ipad.strings differ diff --git a/Classes/es.lproj/ChatConversationCreateView.strings b/Classes/es.lproj/ChatConversationCreateView.strings new file mode 100644 index 000000000..14d0753b6 Binary files /dev/null and b/Classes/es.lproj/ChatConversationCreateView.strings differ diff --git a/Classes/es.lproj/ChatConversationView.strings b/Classes/es.lproj/ChatConversationView.strings new file mode 100644 index 000000000..e1b380efe Binary files /dev/null and b/Classes/es.lproj/ChatConversationView.strings differ diff --git a/Classes/es.lproj/ChatsListView.strings b/Classes/es.lproj/ChatsListView.strings new file mode 100644 index 000000000..c5db3d35b Binary files /dev/null and b/Classes/es.lproj/ChatsListView.strings differ diff --git a/Classes/es.lproj/ContactDetailsView.strings b/Classes/es.lproj/ContactDetailsView.strings new file mode 100644 index 000000000..8c5f8daa4 Binary files /dev/null and b/Classes/es.lproj/ContactDetailsView.strings differ diff --git a/Classes/es.lproj/ContactsListView.strings b/Classes/es.lproj/ContactsListView.strings index 3b79f8446..bb690d9a1 100644 Binary files a/Classes/es.lproj/ContactsListView.strings and b/Classes/es.lproj/ContactsListView.strings differ diff --git a/Classes/es.lproj/CountryListView.strings b/Classes/es.lproj/CountryListView.strings new file mode 100644 index 000000000..81c3daff6 Binary files /dev/null and b/Classes/es.lproj/CountryListView.strings differ diff --git a/Classes/es.lproj/DialerView.strings b/Classes/es.lproj/DialerView.strings new file mode 100644 index 000000000..f6e5cfefb Binary files /dev/null and b/Classes/es.lproj/DialerView.strings differ diff --git a/Classes/es.lproj/DialerView~ipad.strings b/Classes/es.lproj/DialerView~ipad.strings new file mode 100644 index 000000000..5b82d187c Binary files /dev/null and b/Classes/es.lproj/DialerView~ipad.strings differ diff --git a/Classes/es.lproj/FirstLoginView.strings b/Classes/es.lproj/FirstLoginView.strings new file mode 100644 index 000000000..648ad962f Binary files /dev/null and b/Classes/es.lproj/FirstLoginView.strings differ diff --git a/Classes/es.lproj/HistoryDetailsView.strings b/Classes/es.lproj/HistoryDetailsView.strings new file mode 100644 index 000000000..0b8f1d344 Binary files /dev/null and b/Classes/es.lproj/HistoryDetailsView.strings differ diff --git a/Classes/es.lproj/HistoryListView.strings b/Classes/es.lproj/HistoryListView.strings new file mode 100644 index 000000000..766ee54bb Binary files /dev/null and b/Classes/es.lproj/HistoryListView.strings differ diff --git a/Classes/es.lproj/ImageView.strings b/Classes/es.lproj/ImageView.strings new file mode 100644 index 000000000..2575a4289 Binary files /dev/null and b/Classes/es.lproj/ImageView.strings differ diff --git a/Classes/es.lproj/SettingsView.strings b/Classes/es.lproj/SettingsView.strings index ee136d227..64c8718bc 100644 Binary files a/Classes/es.lproj/SettingsView.strings and b/Classes/es.lproj/SettingsView.strings differ diff --git a/Classes/es.lproj/ShopView.strings b/Classes/es.lproj/ShopView.strings index 816d48982..0a146bbd5 100644 Binary files a/Classes/es.lproj/ShopView.strings and b/Classes/es.lproj/ShopView.strings differ diff --git a/Classes/es.lproj/SideMenuView.strings b/Classes/es.lproj/SideMenuView.strings new file mode 100644 index 000000000..a1f126d9b Binary files /dev/null and b/Classes/es.lproj/SideMenuView.strings differ diff --git a/Classes/es.lproj/SideMenuView~ipad.strings b/Classes/es.lproj/SideMenuView~ipad.strings new file mode 100644 index 000000000..0ec55c3e1 Binary files /dev/null and b/Classes/es.lproj/SideMenuView~ipad.strings differ diff --git a/Classes/es_AR.lproj/AboutView.strings b/Classes/es_AR.lproj/AboutView.strings new file mode 100644 index 000000000..659538607 Binary files /dev/null and b/Classes/es_AR.lproj/AboutView.strings differ diff --git a/Classes/es_AR.lproj/AssistantLinkView.strings b/Classes/es_AR.lproj/AssistantLinkView.strings new file mode 100644 index 000000000..3020b7185 Binary files /dev/null and b/Classes/es_AR.lproj/AssistantLinkView.strings differ diff --git a/Classes/es_AR.lproj/AssistantView.strings b/Classes/es_AR.lproj/AssistantView.strings new file mode 100644 index 000000000..a62ff7261 Binary files /dev/null and b/Classes/es_AR.lproj/AssistantView.strings differ diff --git a/Classes/es_AR.lproj/AssistantViewScreens.strings b/Classes/es_AR.lproj/AssistantViewScreens.strings new file mode 100644 index 000000000..0dca27403 Binary files /dev/null and b/Classes/es_AR.lproj/AssistantViewScreens.strings differ diff --git a/Classes/es_AR.lproj/CallIncomingView.strings b/Classes/es_AR.lproj/CallIncomingView.strings new file mode 100644 index 000000000..1ab84b080 Binary files /dev/null and b/Classes/es_AR.lproj/CallIncomingView.strings differ diff --git a/Classes/es_AR.lproj/CallOutgoingView.strings b/Classes/es_AR.lproj/CallOutgoingView.strings new file mode 100644 index 000000000..b10453591 Binary files /dev/null and b/Classes/es_AR.lproj/CallOutgoingView.strings differ diff --git a/Classes/es_AR.lproj/CallView.strings b/Classes/es_AR.lproj/CallView.strings new file mode 100644 index 000000000..062954d56 Binary files /dev/null and b/Classes/es_AR.lproj/CallView.strings differ diff --git a/Classes/es_AR.lproj/CallView~ipad.strings b/Classes/es_AR.lproj/CallView~ipad.strings new file mode 100644 index 000000000..062954d56 Binary files /dev/null and b/Classes/es_AR.lproj/CallView~ipad.strings differ diff --git a/Classes/es_AR.lproj/ChatConversationCreateView.strings b/Classes/es_AR.lproj/ChatConversationCreateView.strings new file mode 100644 index 000000000..14d0753b6 Binary files /dev/null and b/Classes/es_AR.lproj/ChatConversationCreateView.strings differ diff --git a/Classes/es_AR.lproj/ChatConversationView.strings b/Classes/es_AR.lproj/ChatConversationView.strings new file mode 100644 index 000000000..e1b380efe Binary files /dev/null and b/Classes/es_AR.lproj/ChatConversationView.strings differ diff --git a/Classes/es_AR.lproj/ChatsListView.strings b/Classes/es_AR.lproj/ChatsListView.strings new file mode 100644 index 000000000..c5db3d35b Binary files /dev/null and b/Classes/es_AR.lproj/ChatsListView.strings differ diff --git a/Classes/es_AR.lproj/ContactDetailsView.strings b/Classes/es_AR.lproj/ContactDetailsView.strings new file mode 100644 index 000000000..8c5f8daa4 Binary files /dev/null and b/Classes/es_AR.lproj/ContactDetailsView.strings differ diff --git a/Classes/es_AR.lproj/ContactsListView.strings b/Classes/es_AR.lproj/ContactsListView.strings new file mode 100644 index 000000000..7a6c2efb2 Binary files /dev/null and b/Classes/es_AR.lproj/ContactsListView.strings differ diff --git a/Classes/es_AR.lproj/CountryListView.strings b/Classes/es_AR.lproj/CountryListView.strings new file mode 100644 index 000000000..81c3daff6 Binary files /dev/null and b/Classes/es_AR.lproj/CountryListView.strings differ diff --git a/Classes/es_AR.lproj/DialerView.strings b/Classes/es_AR.lproj/DialerView.strings new file mode 100644 index 000000000..f6e5cfefb Binary files /dev/null and b/Classes/es_AR.lproj/DialerView.strings differ diff --git a/Classes/es_AR.lproj/DialerView~ipad.strings b/Classes/es_AR.lproj/DialerView~ipad.strings new file mode 100644 index 000000000..5b82d187c Binary files /dev/null and b/Classes/es_AR.lproj/DialerView~ipad.strings differ diff --git a/Classes/es_AR.lproj/FirstLoginView.strings b/Classes/es_AR.lproj/FirstLoginView.strings new file mode 100644 index 000000000..ec979500a Binary files /dev/null and b/Classes/es_AR.lproj/FirstLoginView.strings differ diff --git a/Classes/es_AR.lproj/HistoryDetailsView.strings b/Classes/es_AR.lproj/HistoryDetailsView.strings new file mode 100644 index 000000000..0b8f1d344 Binary files /dev/null and b/Classes/es_AR.lproj/HistoryDetailsView.strings differ diff --git a/Classes/es_AR.lproj/HistoryListView.strings b/Classes/es_AR.lproj/HistoryListView.strings new file mode 100644 index 000000000..766ee54bb Binary files /dev/null and b/Classes/es_AR.lproj/HistoryListView.strings differ diff --git a/Classes/es_AR.lproj/ImageView.strings b/Classes/es_AR.lproj/ImageView.strings new file mode 100644 index 000000000..2575a4289 Binary files /dev/null and b/Classes/es_AR.lproj/ImageView.strings differ diff --git a/Classes/es_AR.lproj/SettingsView.strings b/Classes/es_AR.lproj/SettingsView.strings new file mode 100644 index 000000000..b3f73e557 Binary files /dev/null and b/Classes/es_AR.lproj/SettingsView.strings differ diff --git a/Classes/es_AR.lproj/ShopView.strings b/Classes/es_AR.lproj/ShopView.strings new file mode 100644 index 000000000..d3ac8f971 Binary files /dev/null and b/Classes/es_AR.lproj/ShopView.strings differ diff --git a/Classes/es_AR.lproj/SideMenuView.strings b/Classes/es_AR.lproj/SideMenuView.strings new file mode 100644 index 000000000..a1f126d9b Binary files /dev/null and b/Classes/es_AR.lproj/SideMenuView.strings differ diff --git a/Classes/es_AR.lproj/SideMenuView~ipad.strings b/Classes/es_AR.lproj/SideMenuView~ipad.strings new file mode 100644 index 000000000..0ec55c3e1 Binary files /dev/null and b/Classes/es_AR.lproj/SideMenuView~ipad.strings differ diff --git a/Classes/fr.lproj/AboutView.strings b/Classes/fr.lproj/AboutView.strings index 4d4823142..c44f0f4d9 100644 Binary files a/Classes/fr.lproj/AboutView.strings and b/Classes/fr.lproj/AboutView.strings differ diff --git a/Classes/ja.lproj/AboutView.strings b/Classes/ja.lproj/AboutView.strings index ae92dcd50..d3ff03d5a 100644 Binary files a/Classes/ja.lproj/AboutView.strings and b/Classes/ja.lproj/AboutView.strings differ diff --git a/Classes/ka.lproj/AboutView.strings b/Classes/ka.lproj/AboutView.strings new file mode 100644 index 000000000..73a4c593f Binary files /dev/null and b/Classes/ka.lproj/AboutView.strings differ diff --git a/Classes/ka.lproj/AssistantLinkView.strings b/Classes/ka.lproj/AssistantLinkView.strings new file mode 100644 index 000000000..be1efee41 Binary files /dev/null and b/Classes/ka.lproj/AssistantLinkView.strings differ diff --git a/Classes/ka.lproj/AssistantView.strings b/Classes/ka.lproj/AssistantView.strings new file mode 100644 index 000000000..57254633a Binary files /dev/null and b/Classes/ka.lproj/AssistantView.strings differ diff --git a/Classes/ka.lproj/AssistantViewScreens.strings b/Classes/ka.lproj/AssistantViewScreens.strings new file mode 100644 index 000000000..0784dd4e0 Binary files /dev/null and b/Classes/ka.lproj/AssistantViewScreens.strings differ diff --git a/Classes/ka.lproj/CallIncomingView.strings b/Classes/ka.lproj/CallIncomingView.strings new file mode 100644 index 000000000..ffe5d9777 Binary files /dev/null and b/Classes/ka.lproj/CallIncomingView.strings differ diff --git a/Classes/ka.lproj/CallOutgoingView.strings b/Classes/ka.lproj/CallOutgoingView.strings new file mode 100644 index 000000000..591588a60 Binary files /dev/null and b/Classes/ka.lproj/CallOutgoingView.strings differ diff --git a/Classes/ka.lproj/CallView.strings b/Classes/ka.lproj/CallView.strings new file mode 100644 index 000000000..61ac3d57d Binary files /dev/null and b/Classes/ka.lproj/CallView.strings differ diff --git a/Classes/ka.lproj/CallView~ipad.strings b/Classes/ka.lproj/CallView~ipad.strings new file mode 100644 index 000000000..61ac3d57d Binary files /dev/null and b/Classes/ka.lproj/CallView~ipad.strings differ diff --git a/Classes/ka.lproj/ChatConversationCreateView.strings b/Classes/ka.lproj/ChatConversationCreateView.strings new file mode 100644 index 000000000..7e530d535 Binary files /dev/null and b/Classes/ka.lproj/ChatConversationCreateView.strings differ diff --git a/Classes/ka.lproj/ChatConversationView.strings b/Classes/ka.lproj/ChatConversationView.strings new file mode 100644 index 000000000..c7953e691 Binary files /dev/null and b/Classes/ka.lproj/ChatConversationView.strings differ diff --git a/Classes/ka.lproj/ChatsListView.strings b/Classes/ka.lproj/ChatsListView.strings new file mode 100644 index 000000000..f70da0e7d Binary files /dev/null and b/Classes/ka.lproj/ChatsListView.strings differ diff --git a/Classes/ka.lproj/ContactDetailsView.strings b/Classes/ka.lproj/ContactDetailsView.strings new file mode 100644 index 000000000..d27b45303 Binary files /dev/null and b/Classes/ka.lproj/ContactDetailsView.strings differ diff --git a/Classes/ka.lproj/ContactsListView.strings b/Classes/ka.lproj/ContactsListView.strings new file mode 100644 index 000000000..7bf7f6a88 Binary files /dev/null and b/Classes/ka.lproj/ContactsListView.strings differ diff --git a/Classes/ka.lproj/CountryListView.strings b/Classes/ka.lproj/CountryListView.strings new file mode 100644 index 000000000..870e6cad5 Binary files /dev/null and b/Classes/ka.lproj/CountryListView.strings differ diff --git a/Classes/ka.lproj/DialerView.strings b/Classes/ka.lproj/DialerView.strings new file mode 100644 index 000000000..43aa9f18f Binary files /dev/null and b/Classes/ka.lproj/DialerView.strings differ diff --git a/Classes/ka.lproj/DialerView~ipad.strings b/Classes/ka.lproj/DialerView~ipad.strings new file mode 100644 index 000000000..ee6935b39 Binary files /dev/null and b/Classes/ka.lproj/DialerView~ipad.strings differ diff --git a/Classes/ka.lproj/FirstLoginView.strings b/Classes/ka.lproj/FirstLoginView.strings new file mode 100644 index 000000000..74e3ad513 Binary files /dev/null and b/Classes/ka.lproj/FirstLoginView.strings differ diff --git a/Classes/ka.lproj/HistoryDetailsView.strings b/Classes/ka.lproj/HistoryDetailsView.strings new file mode 100644 index 000000000..d307b91d1 Binary files /dev/null and b/Classes/ka.lproj/HistoryDetailsView.strings differ diff --git a/Classes/ka.lproj/HistoryListView.strings b/Classes/ka.lproj/HistoryListView.strings new file mode 100644 index 000000000..2bffdc6fb Binary files /dev/null and b/Classes/ka.lproj/HistoryListView.strings differ diff --git a/Classes/ka.lproj/ImageView.strings b/Classes/ka.lproj/ImageView.strings new file mode 100644 index 000000000..06f252971 Binary files /dev/null and b/Classes/ka.lproj/ImageView.strings differ diff --git a/Classes/ka.lproj/SettingsView.strings b/Classes/ka.lproj/SettingsView.strings new file mode 100644 index 000000000..28732ffe7 Binary files /dev/null and b/Classes/ka.lproj/SettingsView.strings differ diff --git a/Classes/ka.lproj/ShopView.strings b/Classes/ka.lproj/ShopView.strings new file mode 100644 index 000000000..c01445cb1 Binary files /dev/null and b/Classes/ka.lproj/ShopView.strings differ diff --git a/Classes/ka.lproj/SideMenuView.strings b/Classes/ka.lproj/SideMenuView.strings new file mode 100644 index 000000000..a1f126d9b Binary files /dev/null and b/Classes/ka.lproj/SideMenuView.strings differ diff --git a/Classes/ka.lproj/SideMenuView~ipad.strings b/Classes/ka.lproj/SideMenuView~ipad.strings new file mode 100644 index 000000000..0ec55c3e1 Binary files /dev/null and b/Classes/ka.lproj/SideMenuView~ipad.strings differ diff --git a/Classes/nl.lproj/AboutView.strings b/Classes/nl.lproj/AboutView.strings index bb56ad48e..efa9375b5 100644 Binary files a/Classes/nl.lproj/AboutView.strings and b/Classes/nl.lproj/AboutView.strings differ diff --git a/Classes/pl.lproj/AboutView.strings b/Classes/pl.lproj/AboutView.strings index 6de30b494..dee5df574 100644 Binary files a/Classes/pl.lproj/AboutView.strings and b/Classes/pl.lproj/AboutView.strings differ diff --git a/Classes/pl.lproj/AssistantLinkView.strings b/Classes/pl.lproj/AssistantLinkView.strings index b59ca47fb..a953b6136 100644 Binary files a/Classes/pl.lproj/AssistantLinkView.strings and b/Classes/pl.lproj/AssistantLinkView.strings differ diff --git a/Classes/pl.lproj/AssistantViewScreens.strings b/Classes/pl.lproj/AssistantViewScreens.strings index f22442b9b..d4889cced 100644 Binary files a/Classes/pl.lproj/AssistantViewScreens.strings and b/Classes/pl.lproj/AssistantViewScreens.strings differ diff --git a/Classes/pl.lproj/CountryListView.strings b/Classes/pl.lproj/CountryListView.strings index 6f4a2434b..c36927107 100644 Binary files a/Classes/pl.lproj/CountryListView.strings and b/Classes/pl.lproj/CountryListView.strings differ diff --git a/Classes/pl.lproj/ShopView.strings b/Classes/pl.lproj/ShopView.strings index 61f20a681..64a226ae1 100644 Binary files a/Classes/pl.lproj/ShopView.strings and b/Classes/pl.lproj/ShopView.strings differ diff --git a/Classes/pt_BR.lproj/AboutView.strings b/Classes/pt_BR.lproj/AboutView.strings index 8018e3bc7..5015f60c9 100644 Binary files a/Classes/pt_BR.lproj/AboutView.strings and b/Classes/pt_BR.lproj/AboutView.strings differ diff --git a/Classes/pt_BR.lproj/AssistantLinkView.strings b/Classes/pt_BR.lproj/AssistantLinkView.strings index 96be0eb3c..9cf2f4c66 100644 Binary files a/Classes/pt_BR.lproj/AssistantLinkView.strings and b/Classes/pt_BR.lproj/AssistantLinkView.strings differ diff --git a/Classes/pt_BR.lproj/AssistantViewScreens.strings b/Classes/pt_BR.lproj/AssistantViewScreens.strings index 30e8bb6e9..5104a7e17 100644 Binary files a/Classes/pt_BR.lproj/AssistantViewScreens.strings and b/Classes/pt_BR.lproj/AssistantViewScreens.strings differ diff --git a/Classes/pt_BR.lproj/CountryListView.strings b/Classes/pt_BR.lproj/CountryListView.strings index 1cb546938..769356359 100644 Binary files a/Classes/pt_BR.lproj/CountryListView.strings and b/Classes/pt_BR.lproj/CountryListView.strings differ diff --git a/Classes/ru.lproj/AboutView.strings b/Classes/ru.lproj/AboutView.strings index d81bbd275..b4ece8905 100644 Binary files a/Classes/ru.lproj/AboutView.strings and b/Classes/ru.lproj/AboutView.strings differ diff --git a/Classes/ru.lproj/AssistantLinkView.strings b/Classes/ru.lproj/AssistantLinkView.strings index 605c139c9..7243c4f6c 100644 Binary files a/Classes/ru.lproj/AssistantLinkView.strings and b/Classes/ru.lproj/AssistantLinkView.strings differ diff --git a/Classes/ru.lproj/AssistantView.strings b/Classes/ru.lproj/AssistantView.strings index 9262b3e4e..5ad352a2d 100644 Binary files a/Classes/ru.lproj/AssistantView.strings and b/Classes/ru.lproj/AssistantView.strings differ diff --git a/Classes/ru.lproj/AssistantViewScreens.strings b/Classes/ru.lproj/AssistantViewScreens.strings index bb3d993ce..f49f9128b 100644 Binary files a/Classes/ru.lproj/AssistantViewScreens.strings and b/Classes/ru.lproj/AssistantViewScreens.strings differ diff --git a/Classes/ru.lproj/CallIncomingView.strings b/Classes/ru.lproj/CallIncomingView.strings index 94c94d672..35bd6d675 100644 Binary files a/Classes/ru.lproj/CallIncomingView.strings and b/Classes/ru.lproj/CallIncomingView.strings differ diff --git a/Classes/ru.lproj/CallOutgoingView.strings b/Classes/ru.lproj/CallOutgoingView.strings index d4ed24240..fc68c6947 100644 Binary files a/Classes/ru.lproj/CallOutgoingView.strings and b/Classes/ru.lproj/CallOutgoingView.strings differ diff --git a/Classes/ru.lproj/CallView.strings b/Classes/ru.lproj/CallView.strings index b6e6d54c0..366b14bc1 100644 Binary files a/Classes/ru.lproj/CallView.strings and b/Classes/ru.lproj/CallView.strings differ diff --git a/Classes/ru.lproj/CallView~ipad.strings b/Classes/ru.lproj/CallView~ipad.strings index b6e6d54c0..366b14bc1 100644 Binary files a/Classes/ru.lproj/CallView~ipad.strings and b/Classes/ru.lproj/CallView~ipad.strings differ diff --git a/Classes/ru.lproj/ContactDetailsView.strings b/Classes/ru.lproj/ContactDetailsView.strings index ebbfa2437..b5fe41bd1 100644 Binary files a/Classes/ru.lproj/ContactDetailsView.strings and b/Classes/ru.lproj/ContactDetailsView.strings differ diff --git a/Classes/ru.lproj/FirstLoginView.strings b/Classes/ru.lproj/FirstLoginView.strings index da43f8d5f..0cef2d481 100644 Binary files a/Classes/ru.lproj/FirstLoginView.strings and b/Classes/ru.lproj/FirstLoginView.strings differ diff --git a/Classes/ru.lproj/HistoryDetailsView.strings b/Classes/ru.lproj/HistoryDetailsView.strings index 2244a3324..6dd58ffcb 100644 Binary files a/Classes/ru.lproj/HistoryDetailsView.strings and b/Classes/ru.lproj/HistoryDetailsView.strings differ diff --git a/Classes/ru.lproj/ShopView.strings b/Classes/ru.lproj/ShopView.strings index 3dbc99b6b..0620a1096 100644 Binary files a/Classes/ru.lproj/ShopView.strings and b/Classes/ru.lproj/ShopView.strings differ diff --git a/Classes/ru.lproj/SideMenuView.strings b/Classes/ru.lproj/SideMenuView.strings new file mode 100644 index 000000000..2985951e5 Binary files /dev/null and b/Classes/ru.lproj/SideMenuView.strings differ diff --git a/Classes/ru.lproj/SideMenuView~ipad.strings b/Classes/ru.lproj/SideMenuView~ipad.strings new file mode 100644 index 000000000..fbe432155 Binary files /dev/null and b/Classes/ru.lproj/SideMenuView~ipad.strings differ diff --git a/Classes/sv.lproj/AboutView.strings b/Classes/sv.lproj/AboutView.strings index b83705684..0a5e3c3b5 100644 Binary files a/Classes/sv.lproj/AboutView.strings and b/Classes/sv.lproj/AboutView.strings differ diff --git a/Classes/tr.lproj/AboutView.strings b/Classes/tr.lproj/AboutView.strings index 8da6cda91..bebd94de5 100644 Binary files a/Classes/tr.lproj/AboutView.strings and b/Classes/tr.lproj/AboutView.strings differ diff --git a/Classes/zh_CN.lproj/AboutView.strings b/Classes/zh_CN.lproj/AboutView.strings index 7b94e3974..8fa0348eb 100644 Binary files a/Classes/zh_CN.lproj/AboutView.strings and b/Classes/zh_CN.lproj/AboutView.strings differ diff --git a/Classes/zh_TW.lproj/AboutView.strings b/Classes/zh_TW.lproj/AboutView.strings index caf43a426..8f3bc014a 100644 Binary files a/Classes/zh_TW.lproj/AboutView.strings and b/Classes/zh_TW.lproj/AboutView.strings differ diff --git a/LiblinphoneTester/MasterView.m b/LiblinphoneTester/MasterView.m index 3bf42530f..210ac73e7 100644 --- a/LiblinphoneTester/MasterView.m +++ b/LiblinphoneTester/MasterView.m @@ -9,9 +9,10 @@ #import "MasterView.h" #import "DetailTableView.h" +#import "Log.h" +#include "TargetConditionals.h" #include "linphone/liblinphone_tester.h" #include "mediastreamer2/msutils.h" -#import "Log.h" @interface MasterView () { NSMutableArray *_objects; @@ -31,12 +32,12 @@ } - (void)setupLogging { - [Log enableLogs:0]; - linphone_core_enable_log_collection(NO); + [Log enableLogs:ORTP_DEBUG]; + linphone_core_enable_log_collection(YES); } void tester_logs_handler(int level, const char *fmt, va_list args) { - linphone_iphone_log_handler(NULL, level, fmt, args); + linphone_iphone_log_handler("Tester", level, fmt, args); } - (void)viewDidLoad { @@ -45,15 +46,16 @@ void tester_logs_handler(int level, const char *fmt, va_list args) { self.detailViewController = (DetailTableView *)[[self.splitViewController.viewControllers lastObject] topViewController]; - [self setupLogging]; + //[self setupLogging]; liblinphone_tester_keep_accounts(TRUE); bundlePath = [[NSBundle mainBundle] bundlePath]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); writablePath = [paths objectAtIndex:0]; - - bc_tester_init(tester_logs_handler, ORTP_MESSAGE, ORTP_ERROR, "rcfiles"); - liblinphone_tester_add_suites(); + liblinphone_tester_init(NULL); + // bc_tester_init(tester_logs_handler, ORTP_MESSAGE, ORTP_ERROR, "rcfiles"); + // liblinphone_tester_add_suites(); + linphone_core_set_log_level_mask((OrtpLogLevel)(ORTP_MESSAGE | ORTP_WARNING | ORTP_ERROR | ORTP_FATAL)); bc_tester_set_resource_dir_prefix([bundlePath UTF8String]); bc_tester_set_writable_dir_prefix([writablePath UTF8String]); @@ -61,6 +63,15 @@ void tester_logs_handler(int level, const char *fmt, va_list args) { LOGI(@"Bundle path: %@", bundlePath); LOGI(@"Writable path: %@", writablePath); +#if (TARGET_OS_SIMULATOR) + char *xmlFile = bc_tester_file("LibLinphoneIOS.xml"); + char *args[] = {"--xml-file", xmlFile}; + bc_tester_parse_args(2, args, 0); + + char *logFile = bc_tester_file("LibLinphoneIOS.txt"); + liblinphone_tester_set_log_file(logFile); +#endif + liblinphonetester_ipv6 = true; int count = bc_tester_nb_suites(); diff --git a/README.md b/README.md index 32044b792..0b1d051c5 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,31 @@ Interested in helping translate Linphone? Contribute [on Transifex](https://www. ## Report bugs and submit patchs If you want to dig through Linphone code or report a bug, please read `CONTRIBUTING.md` first. You should also read this `README` entirely ;-). + +## How to be a beta tester ? + +Enter the Beta : + - Download TestFlight from the App Store and log in it with your apple-id + - Send an email to linphone-iphone@belledonne-communications.com, with object : [Beta test - Request], where you precise your apple-id you logged in TestFlight with + - You will receive an invitation code to the beta in the following days via your email associated to your apple-id + - Enter the invitation code received into TestFlight + - Download Linphone from TestFlight + - And voilà ! TestFlight will send you a notification every time a new beta test is available. + +Send a crash report : + - It is done automatically by TestFlight + +Report a bug : + - Open Linphone + - Go to Settings —> Advanced —> Send logs + - An email to linphone-iphone@belledonne-communications.com is created with your logs attached + - Fill in the bug description with : + * What you were doing + * What happened + * What you were expecting + * Approximately when the bug happened + - Change the object to [Beta test - Bug report] + - Send the mail # Building and customizing the SDK diff --git a/Resources/ar.lproj/Localizable.strings b/Resources/ar.lproj/Localizable.strings index d159006cd..1296a9a45 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 7e395a73c..defa01e49 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 0e4eefcd8..27ff2b32b 100644 Binary files a/Resources/en.lproj/Localizable.strings and b/Resources/en.lproj/Localizable.strings differ diff --git a/Resources/es.lproj/Localizable.strings b/Resources/es.lproj/Localizable.strings new file mode 100644 index 000000000..4841e6708 Binary files /dev/null and b/Resources/es.lproj/Localizable.strings differ diff --git a/Resources/es_AR.lproj/Localizable.strings b/Resources/es_AR.lproj/Localizable.strings new file mode 100644 index 000000000..4841e6708 Binary files /dev/null and b/Resources/es_AR.lproj/Localizable.strings differ diff --git a/Resources/fr.lproj/Localizable.strings b/Resources/fr.lproj/Localizable.strings index 8889f4b2e..6e4d4297b 100644 Binary files a/Resources/fr.lproj/Localizable.strings and b/Resources/fr.lproj/Localizable.strings differ diff --git a/Resources/images/chat_delivered.png b/Resources/images/chat_delivered.png new file mode 100644 index 000000000..9d741055d Binary files /dev/null and b/Resources/images/chat_delivered.png differ diff --git a/Resources/images/chat_error.png b/Resources/images/chat_error.png new file mode 100644 index 000000000..3791317c2 Binary files /dev/null and b/Resources/images/chat_error.png differ diff --git a/Resources/images/chat_read.png b/Resources/images/chat_read.png new file mode 100644 index 000000000..b7ae0d29a Binary files /dev/null and b/Resources/images/chat_read.png differ diff --git a/Resources/images/chat_secure.png b/Resources/images/chat_secure.png new file mode 100644 index 000000000..cc4b93786 Binary files /dev/null and b/Resources/images/chat_secure.png differ diff --git a/Resources/images/chat_unsecure.png b/Resources/images/chat_unsecure.png new file mode 100644 index 000000000..7c80434d8 Binary files /dev/null and b/Resources/images/chat_unsecure.png differ diff --git a/Resources/images/lime_ko.png b/Resources/images/lime_ko.png new file mode 100644 index 000000000..915e86773 Binary files /dev/null and b/Resources/images/lime_ko.png differ diff --git a/Resources/images/lime_ko@2x.png b/Resources/images/lime_ko@2x.png new file mode 100644 index 000000000..f3a5e6b80 Binary files /dev/null and b/Resources/images/lime_ko@2x.png differ diff --git a/Resources/ja.lproj/Localizable.strings b/Resources/ja.lproj/Localizable.strings index 7f77b27d6..e13263e19 100644 Binary files a/Resources/ja.lproj/Localizable.strings and b/Resources/ja.lproj/Localizable.strings differ diff --git a/Resources/ka.lproj/Localizable.strings b/Resources/ka.lproj/Localizable.strings new file mode 100644 index 000000000..05f07791e Binary files /dev/null and b/Resources/ka.lproj/Localizable.strings differ diff --git a/Resources/linphonerc b/Resources/linphonerc index 2415e7cf2..e75cdba56 100644 --- a/Resources/linphonerc +++ b/Resources/linphonerc @@ -79,6 +79,7 @@ rtcp_xr_voip_metrics_enabled=1 sip_port=-1 sip_tcp_port=-1 use_info=0 +deliver_imdn=1 [sound] capture_dev_id=AU: Audio Unit Receiver diff --git a/Resources/nl.lproj/Localizable.strings b/Resources/nl.lproj/Localizable.strings index dec362fe2..ac90746ac 100644 Binary files a/Resources/nl.lproj/Localizable.strings and b/Resources/nl.lproj/Localizable.strings differ diff --git a/Resources/pl.lproj/Localizable.strings b/Resources/pl.lproj/Localizable.strings index a5099db00..d7a7af62b 100644 Binary files a/Resources/pl.lproj/Localizable.strings and b/Resources/pl.lproj/Localizable.strings differ diff --git a/Resources/pt_BR.lproj/Localizable.strings b/Resources/pt_BR.lproj/Localizable.strings index 2ed7e919e..10ce54129 100644 Binary files a/Resources/pt_BR.lproj/Localizable.strings and b/Resources/pt_BR.lproj/Localizable.strings differ diff --git a/Resources/ru.lproj/Localizable.strings b/Resources/ru.lproj/Localizable.strings index a7bebb38a..f43c8000c 100644 Binary files a/Resources/ru.lproj/Localizable.strings and b/Resources/ru.lproj/Localizable.strings differ diff --git a/Resources/sv.lproj/Localizable.strings b/Resources/sv.lproj/Localizable.strings index d2a643357..d868775a1 100644 Binary files a/Resources/sv.lproj/Localizable.strings and b/Resources/sv.lproj/Localizable.strings differ diff --git a/Resources/tr.lproj/Localizable.strings b/Resources/tr.lproj/Localizable.strings index ec61c28da..88bb8c8c2 100644 Binary files a/Resources/tr.lproj/Localizable.strings and b/Resources/tr.lproj/Localizable.strings differ diff --git a/Resources/zh_CN.lproj/Localizable.strings b/Resources/zh_CN.lproj/Localizable.strings index e0e6a632d..8811b03d4 100644 Binary files a/Resources/zh_CN.lproj/Localizable.strings and b/Resources/zh_CN.lproj/Localizable.strings differ diff --git a/Resources/zh_TW.lproj/Localizable.strings b/Resources/zh_TW.lproj/Localizable.strings index 5c977628c..83afe2287 100644 Binary files a/Resources/zh_TW.lproj/Localizable.strings and b/Resources/zh_TW.lproj/Localizable.strings differ diff --git a/Settings/InAppSettings.bundle/Advanced.plist b/Settings/InAppSettings.bundle/Advanced.plist index 2e3e28ca1..9bfd8c7a0 100644 --- a/Settings/InAppSettings.bundle/Advanced.plist +++ b/Settings/InAppSettings.bundle/Advanced.plist @@ -4,6 +4,22 @@ PreferenceSpecifiers + + Title + Presence + Type + PSGroupSpecifier + + + Type + PSToggleSwitchSpecifier + Title + Enable smart address book + Key + use_rls_presence + DefaultValue + YES + Title Debug @@ -160,28 +176,6 @@ IASKTextAlignment IASKUITextAlignmentRight - - Type - PSGroupSpecifier - Title - File sharing - - - AutocapitalizationType - None - AutocorrectionType - No - KeyboardType - URL - Type - PSTextFieldSpecifier - Title - Server URL - Key - file_transfer_server_url_preference - IASKTextAlignment - IASKUITextAlignmentRight - diff --git a/Settings/InAppSettings.bundle/Chat.plist b/Settings/InAppSettings.bundle/Chat.plist new file mode 100644 index 000000000..17739d229 --- /dev/null +++ b/Settings/InAppSettings.bundle/Chat.plist @@ -0,0 +1,53 @@ + + + + + PreferenceSpecifiers + + + DefaultValue + 0 + Type + PSMultiValueSpecifier + Titles + + Disabled + Preferred + Mandatory + + Values + + 0 + 2 + 1 + + Title + Encrypt messages with LIME + Key + use_lime_preference + + + Type + PSGroupSpecifier + Title + File sharing + + + AutocapitalizationType + None + AutocorrectionType + No + KeyboardType + URL + Type + PSTextFieldSpecifier + Title + Server URL + Key + file_transfer_server_url_preference + IASKTextAlignment + IASKUITextAlignmentRight + + + + diff --git a/Settings/InAppSettings.bundle/Root.plist b/Settings/InAppSettings.bundle/Root.plist index f37c4fd13..2fbc0eab4 100644 --- a/Settings/InAppSettings.bundle/Root.plist +++ b/Settings/InAppSettings.bundle/Root.plist @@ -114,6 +114,16 @@ Type PSChildPaneSpecifier + + Type + PSChildPaneSpecifier + Key + message_menu + Title + Chat + File + Chat + Key network_menu diff --git a/Settings/InAppSettings.bundle/ar.lproj/Account.strings b/Settings/InAppSettings.bundle/ar.lproj/Account.strings index 3a03ddfa5..a35d674ff 100644 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Account.strings and b/Settings/InAppSettings.bundle/ar.lproj/Account.strings differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings index cad4b7e4e..b221e2573 100644 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Audio.strings b/Settings/InAppSettings.bundle/ar.lproj/Audio.strings index e82411dff..8022cda99 100644 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Audio.strings and b/Settings/InAppSettings.bundle/ar.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Chat.strings b/Settings/InAppSettings.bundle/ar.lproj/Chat.strings new file mode 100644 index 000000000..dc2602135 Binary files /dev/null and b/Settings/InAppSettings.bundle/ar.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Network.strings b/Settings/InAppSettings.bundle/ar.lproj/Network.strings index 85abec999..e42b1e57c 100644 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Network.strings and b/Settings/InAppSettings.bundle/ar.lproj/Network.strings differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Root.strings b/Settings/InAppSettings.bundle/ar.lproj/Root.strings index c0aba8813..9693ddf1b 100644 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Root.strings and b/Settings/InAppSettings.bundle/ar.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/cs.lproj/Account.strings b/Settings/InAppSettings.bundle/cs.lproj/Account.strings new file mode 100644 index 000000000..aa85549c5 Binary files /dev/null and b/Settings/InAppSettings.bundle/cs.lproj/Account.strings differ diff --git a/Settings/InAppSettings.bundle/cs.lproj/Advanced.strings b/Settings/InAppSettings.bundle/cs.lproj/Advanced.strings new file mode 100644 index 000000000..d13e4afec Binary files /dev/null and b/Settings/InAppSettings.bundle/cs.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Advanced.strings b/Settings/InAppSettings.bundle/de.lproj/Advanced.strings index 0abd00d8b..319b6f320 100644 Binary files a/Settings/InAppSettings.bundle/de.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/de.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Audio.strings b/Settings/InAppSettings.bundle/de.lproj/Audio.strings index 32b1fb205..17d4594b6 100644 Binary files a/Settings/InAppSettings.bundle/de.lproj/Audio.strings and b/Settings/InAppSettings.bundle/de.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Chat.strings b/Settings/InAppSettings.bundle/de.lproj/Chat.strings new file mode 100644 index 000000000..ed6dea56e Binary files /dev/null and b/Settings/InAppSettings.bundle/de.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Root.strings b/Settings/InAppSettings.bundle/de.lproj/Root.strings index a1f8ae1f8..a8ab5f489 100644 Binary files a/Settings/InAppSettings.bundle/de.lproj/Root.strings and b/Settings/InAppSettings.bundle/de.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/en.lproj/Advanced.strings b/Settings/InAppSettings.bundle/en.lproj/Advanced.strings index 0c2e24ca3..1fb4814ad 100644 --- a/Settings/InAppSettings.bundle/en.lproj/Advanced.strings +++ b/Settings/InAppSettings.bundle/en.lproj/Advanced.strings @@ -1,3 +1,5 @@ +"Presence" = "Presence"; +"Enable smart address book" = "Enable smart address book"; "Debug" = "Debug"; "Debug" = "Debug"; "Send Logs" = "Send Logs"; @@ -12,5 +14,3 @@ "Primary account" = "Primary account"; "Display name" = "Display name"; "Username" = "Username"; -"File sharing" = "File sharing"; -"Server URL" = "Server URL"; diff --git a/Settings/InAppSettings.bundle/en.lproj/Chat.strings b/Settings/InAppSettings.bundle/en.lproj/Chat.strings new file mode 100644 index 000000000..51086e9f7 --- /dev/null +++ b/Settings/InAppSettings.bundle/en.lproj/Chat.strings @@ -0,0 +1,3 @@ +"Encrypt messages with LIME" = "Encrypt messages with LIME"; +"File sharing" = "File sharing"; +"Server URL" = "Server URL"; diff --git a/Settings/InAppSettings.bundle/en.lproj/Root.strings b/Settings/InAppSettings.bundle/en.lproj/Root.strings index 7bc369289..fea930dec 100644 --- a/Settings/InAppSettings.bundle/en.lproj/Root.strings +++ b/Settings/InAppSettings.bundle/en.lproj/Root.strings @@ -10,6 +10,7 @@ "Audio" = "Audio"; "Video" = "Video"; "Call" = "Call"; +"Chat" = "Chat"; "Network" = "Network"; "Tunnel" = "Tunnel"; "Advanced" = "Advanced"; diff --git a/Settings/InAppSettings.bundle/es.lproj/Account.strings b/Settings/InAppSettings.bundle/es.lproj/Account.strings new file mode 100644 index 000000000..453e10052 Binary files /dev/null and b/Settings/InAppSettings.bundle/es.lproj/Account.strings differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Advanced.strings b/Settings/InAppSettings.bundle/es.lproj/Advanced.strings new file mode 100644 index 000000000..43134c028 Binary files /dev/null and b/Settings/InAppSettings.bundle/es.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Audio.strings b/Settings/InAppSettings.bundle/es.lproj/Audio.strings new file mode 100644 index 000000000..f76e560aa Binary files /dev/null and b/Settings/InAppSettings.bundle/es.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Call.strings b/Settings/InAppSettings.bundle/es.lproj/Call.strings new file mode 100644 index 000000000..952c4053e Binary files /dev/null and b/Settings/InAppSettings.bundle/es.lproj/Call.strings differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Chat.strings b/Settings/InAppSettings.bundle/es.lproj/Chat.strings new file mode 100644 index 000000000..82b1fe1de Binary files /dev/null and b/Settings/InAppSettings.bundle/es.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Network.strings b/Settings/InAppSettings.bundle/es.lproj/Network.strings new file mode 100644 index 000000000..e60ef5474 Binary files /dev/null and b/Settings/InAppSettings.bundle/es.lproj/Network.strings differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Root.strings b/Settings/InAppSettings.bundle/es.lproj/Root.strings new file mode 100644 index 000000000..f3ed1332f Binary files /dev/null and b/Settings/InAppSettings.bundle/es.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/es.lproj/Tunnel.strings new file mode 100644 index 000000000..011a6e911 Binary files /dev/null and b/Settings/InAppSettings.bundle/es.lproj/Tunnel.strings differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Video.strings b/Settings/InAppSettings.bundle/es.lproj/Video.strings new file mode 100644 index 000000000..59314e3db Binary files /dev/null and b/Settings/InAppSettings.bundle/es.lproj/Video.strings differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Account.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Account.strings new file mode 100644 index 000000000..453e10052 Binary files /dev/null and b/Settings/InAppSettings.bundle/es_AR.lproj/Account.strings differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Advanced.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Advanced.strings new file mode 100644 index 000000000..43134c028 Binary files /dev/null and b/Settings/InAppSettings.bundle/es_AR.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Audio.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Audio.strings new file mode 100644 index 000000000..f76e560aa Binary files /dev/null and b/Settings/InAppSettings.bundle/es_AR.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Call.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Call.strings new file mode 100644 index 000000000..952c4053e Binary files /dev/null and b/Settings/InAppSettings.bundle/es_AR.lproj/Call.strings differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Chat.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Chat.strings new file mode 100644 index 000000000..82b1fe1de Binary files /dev/null and b/Settings/InAppSettings.bundle/es_AR.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Network.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Network.strings new file mode 100644 index 000000000..e60ef5474 Binary files /dev/null and b/Settings/InAppSettings.bundle/es_AR.lproj/Network.strings differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Root.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Root.strings new file mode 100644 index 000000000..f3ed1332f Binary files /dev/null and b/Settings/InAppSettings.bundle/es_AR.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Tunnel.strings new file mode 100644 index 000000000..011a6e911 Binary files /dev/null and b/Settings/InAppSettings.bundle/es_AR.lproj/Tunnel.strings differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Video.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Video.strings new file mode 100644 index 000000000..59314e3db Binary files /dev/null and b/Settings/InAppSettings.bundle/es_AR.lproj/Video.strings differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Advanced.strings b/Settings/InAppSettings.bundle/fr.lproj/Advanced.strings index 5a7097876..38e2edff0 100644 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/fr.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Audio.strings b/Settings/InAppSettings.bundle/fr.lproj/Audio.strings index e124e98a6..7436c004d 100644 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Audio.strings and b/Settings/InAppSettings.bundle/fr.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Chat.strings b/Settings/InAppSettings.bundle/fr.lproj/Chat.strings new file mode 100644 index 000000000..90ebcafc7 Binary files /dev/null and b/Settings/InAppSettings.bundle/fr.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Root.strings b/Settings/InAppSettings.bundle/fr.lproj/Root.strings index bc18aae58..c9fdc1672 100644 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Root.strings and b/Settings/InAppSettings.bundle/fr.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ja.lproj/Advanced.strings index 6d6d583b0..70c590a90 100644 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/ja.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Audio.strings b/Settings/InAppSettings.bundle/ja.lproj/Audio.strings index 2c781dc34..be0260d5f 100644 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Audio.strings and b/Settings/InAppSettings.bundle/ja.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Chat.strings b/Settings/InAppSettings.bundle/ja.lproj/Chat.strings new file mode 100644 index 000000000..fc8c7bb2e Binary files /dev/null and b/Settings/InAppSettings.bundle/ja.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Root.strings b/Settings/InAppSettings.bundle/ja.lproj/Root.strings index 574f3dbe7..a6c2279a5 100644 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Root.strings and b/Settings/InAppSettings.bundle/ja.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Account.strings b/Settings/InAppSettings.bundle/ka.lproj/Account.strings new file mode 100644 index 000000000..d2c0d3662 Binary files /dev/null and b/Settings/InAppSettings.bundle/ka.lproj/Account.strings differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ka.lproj/Advanced.strings new file mode 100644 index 000000000..4d565581b Binary files /dev/null and b/Settings/InAppSettings.bundle/ka.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Audio.strings b/Settings/InAppSettings.bundle/ka.lproj/Audio.strings new file mode 100644 index 000000000..19c3d5663 Binary files /dev/null and b/Settings/InAppSettings.bundle/ka.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Call.strings b/Settings/InAppSettings.bundle/ka.lproj/Call.strings new file mode 100644 index 000000000..bb7735a00 Binary files /dev/null and b/Settings/InAppSettings.bundle/ka.lproj/Call.strings differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Chat.strings b/Settings/InAppSettings.bundle/ka.lproj/Chat.strings new file mode 100644 index 000000000..b5cabd720 Binary files /dev/null and b/Settings/InAppSettings.bundle/ka.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Network.strings b/Settings/InAppSettings.bundle/ka.lproj/Network.strings new file mode 100644 index 000000000..e99f6b379 Binary files /dev/null and b/Settings/InAppSettings.bundle/ka.lproj/Network.strings differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Root.strings b/Settings/InAppSettings.bundle/ka.lproj/Root.strings new file mode 100644 index 000000000..e113e3e13 Binary files /dev/null and b/Settings/InAppSettings.bundle/ka.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/ka.lproj/Tunnel.strings new file mode 100644 index 000000000..afbdeadbc Binary files /dev/null and b/Settings/InAppSettings.bundle/ka.lproj/Tunnel.strings differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Video.strings b/Settings/InAppSettings.bundle/ka.lproj/Video.strings new file mode 100644 index 000000000..b217afe27 Binary files /dev/null and b/Settings/InAppSettings.bundle/ka.lproj/Video.strings differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Advanced.strings b/Settings/InAppSettings.bundle/nl.lproj/Advanced.strings index cdee922f2..1ee9cd92d 100644 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/nl.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Audio.strings b/Settings/InAppSettings.bundle/nl.lproj/Audio.strings index 2c781dc34..be0260d5f 100644 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Audio.strings and b/Settings/InAppSettings.bundle/nl.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Chat.strings b/Settings/InAppSettings.bundle/nl.lproj/Chat.strings new file mode 100644 index 000000000..8f40f2244 Binary files /dev/null and b/Settings/InAppSettings.bundle/nl.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Root.strings b/Settings/InAppSettings.bundle/nl.lproj/Root.strings index 7048fa129..652663377 100644 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Root.strings and b/Settings/InAppSettings.bundle/nl.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Account.strings b/Settings/InAppSettings.bundle/pl.lproj/Account.strings index 015faa1dd..76a6bac8f 100644 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Account.strings and b/Settings/InAppSettings.bundle/pl.lproj/Account.strings differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Advanced.strings b/Settings/InAppSettings.bundle/pl.lproj/Advanced.strings index 49b965d8d..b4ab5b07d 100644 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/pl.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Audio.strings b/Settings/InAppSettings.bundle/pl.lproj/Audio.strings index 81efe0418..41e7316f2 100644 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Audio.strings and b/Settings/InAppSettings.bundle/pl.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Chat.strings b/Settings/InAppSettings.bundle/pl.lproj/Chat.strings new file mode 100644 index 000000000..95c447d76 Binary files /dev/null and b/Settings/InAppSettings.bundle/pl.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Network.strings b/Settings/InAppSettings.bundle/pl.lproj/Network.strings index 0ad957cdb..002ca26c4 100644 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Network.strings and b/Settings/InAppSettings.bundle/pl.lproj/Network.strings differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Root.strings b/Settings/InAppSettings.bundle/pl.lproj/Root.strings index bfd90c6d3..cd44a197a 100644 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Root.strings and b/Settings/InAppSettings.bundle/pl.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Account.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Account.strings index 5c4793e1e..79c713342 100644 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Account.strings and b/Settings/InAppSettings.bundle/pt_BR.lproj/Account.strings differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Advanced.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Advanced.strings index 581fed2c6..eafbe8e2b 100644 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/pt_BR.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Audio.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Audio.strings index cd04afddd..5de0e0fa2 100644 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Audio.strings and b/Settings/InAppSettings.bundle/pt_BR.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Chat.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Chat.strings new file mode 100644 index 000000000..b6de012ff Binary files /dev/null and b/Settings/InAppSettings.bundle/pt_BR.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Network.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Network.strings index e7c446304..da0bfa628 100644 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Network.strings and b/Settings/InAppSettings.bundle/pt_BR.lproj/Network.strings differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Root.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Root.strings index e1279a459..5c7b64033 100644 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Root.strings and b/Settings/InAppSettings.bundle/pt_BR.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings index 1aa1dcab2..e340e2dd7 100644 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Audio.strings b/Settings/InAppSettings.bundle/ru.lproj/Audio.strings index 28476bf72..f080d8c25 100644 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Audio.strings and b/Settings/InAppSettings.bundle/ru.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Chat.strings b/Settings/InAppSettings.bundle/ru.lproj/Chat.strings new file mode 100644 index 000000000..2e78b595d Binary files /dev/null and b/Settings/InAppSettings.bundle/ru.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Root.strings b/Settings/InAppSettings.bundle/ru.lproj/Root.strings index 4200d86f7..4c3371f00 100644 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Root.strings and b/Settings/InAppSettings.bundle/ru.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Advanced.strings b/Settings/InAppSettings.bundle/sv.lproj/Advanced.strings index bb75ba20e..52d30c491 100644 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/sv.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Audio.strings b/Settings/InAppSettings.bundle/sv.lproj/Audio.strings index 21d17caab..31fb2c322 100644 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Audio.strings and b/Settings/InAppSettings.bundle/sv.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Chat.strings b/Settings/InAppSettings.bundle/sv.lproj/Chat.strings new file mode 100644 index 000000000..eb6b0530a Binary files /dev/null and b/Settings/InAppSettings.bundle/sv.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Root.strings b/Settings/InAppSettings.bundle/sv.lproj/Root.strings index 053f7678a..d9ac69972 100644 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Root.strings and b/Settings/InAppSettings.bundle/sv.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Advanced.strings b/Settings/InAppSettings.bundle/tr.lproj/Advanced.strings index 174d04457..39b0debb6 100644 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/tr.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Audio.strings b/Settings/InAppSettings.bundle/tr.lproj/Audio.strings index 095cd4f56..24c3e0f07 100644 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Audio.strings and b/Settings/InAppSettings.bundle/tr.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Chat.strings b/Settings/InAppSettings.bundle/tr.lproj/Chat.strings new file mode 100644 index 000000000..dacd59ae5 Binary files /dev/null and b/Settings/InAppSettings.bundle/tr.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Root.strings b/Settings/InAppSettings.bundle/tr.lproj/Root.strings index 4bd2846af..2872a4e99 100644 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Root.strings and b/Settings/InAppSettings.bundle/tr.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings index 41de2dd84..e3ff332c5 100644 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Audio.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Audio.strings index 9d280eb4a..2bd9d8ab5 100644 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Audio.strings and b/Settings/InAppSettings.bundle/zh_CN.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Root.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Root.strings index 46ad1b604..da3b128c5 100644 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Root.strings and b/Settings/InAppSettings.bundle/zh_CN.lproj/Root.strings differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Advanced.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Advanced.strings index 0c6ecfdb0..370bdbd2c 100644 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/zh_TW.lproj/Advanced.strings differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings index dff496d06..6e9254a3a 100644 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings and b/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Chat.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Chat.strings new file mode 100644 index 000000000..664103d80 Binary files /dev/null and b/Settings/InAppSettings.bundle/zh_TW.lproj/Chat.strings differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings index 19bc586d1..b68e2e27c 100644 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings and b/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings differ diff --git a/TestsLiblinphone/LinphoneTester_Tests.m b/TestsLiblinphone/LinphoneTester_Tests.m index b9dfa030c..484f0255f 100644 --- a/TestsLiblinphone/LinphoneTester_Tests.m +++ b/TestsLiblinphone/LinphoneTester_Tests.m @@ -27,9 +27,10 @@ void dummy_logger(const char *domain, OrtpLogLevel lev, const char *fmt, va_list + (void)initialize { // turn off ALL logs because xcodebuild has problems with it - linphone_core_enable_logs_with_cb(dummy_logger); - - for (int i = 0; i < bc_tester_nb_suites(); i++) { + // linphone_core_enable_logs_with_cb(dummy_logger); + bc_tester_start(NULL); + bc_tester_uninit(); + /*for (int i = 0; i < bc_tester_nb_suites(); i++) { const char *suite = bc_tester_suite_name(i); LOGE(@"suite = %s", suite); int test_count = bc_tester_nb_tests(suite); @@ -53,7 +54,7 @@ void dummy_logger(const char *domain, OrtpLogLevel lev, const char *fmt, va_list } } } - } + }*/ } - (void)testForSuite:(NSString *)suite andTest:(NSString *)test { diff --git a/TestsUI/LinphoneTestCase.m b/TestsUI/LinphoneTestCase.m index c4bd1af24..667e14afc 100644 --- a/TestsUI/LinphoneTestCase.m +++ b/TestsUI/LinphoneTestCase.m @@ -146,7 +146,7 @@ linphone_proxy_config_unref(testProxy); linphone_auth_info_destroy(testAuth); - linphone_address_destroy(testAddr); + linphone_address_unref(testAddr); linphone_core_set_file_transfer_server(lc, "https://www.linphone.org:444/lft.php"); diff --git a/Tools/sdk_download.sh b/Tools/sdk_download.sh index 6cc8b3eb3..2e303ba8e 100755 --- a/Tools/sdk_download.sh +++ b/Tools/sdk_download.sh @@ -5,14 +5,27 @@ function die { exit 1 } -if [ $# != 1 ]; then - die "error: please provide liblinphone SDK version to download (for instance 3.13.9)" +if [ $# != 2 ]; then + die "error: please provide what kind of SDK (for instance release and liblinphone SDK version to download (for instance 3.16.1)" fi root_path="$(dirname $0)/.." -# only download SDK if it has not yet been built -if [ ! -d "$root_path"/liblinphone-sdk ]; then - sdk_version=liblinphone-iphone-sdk-$1 +sdk_version=liblinphone-iphone-sdk-$2 +filename=$(find . -name liblinphone-iphone-sdk-*.zip) +version=$(echo $filename| cut -d'-' -f 4) +version=$(echo "${version:0:${#version}-4}") +if [ -z "$version" ]; then + version="0"; +fi + +if [ $(expr ${version} \< ${2}) -eq 1 ]; then + for f in ./liblinphone-iphone-sdk* + do + rm -r -f "$f" + done + + echo "Downloading SDK" + sdk_dir=$1 sdk_path="$root_path/$sdk_version" if [ -L "$root_path/liblinphone-sdk" ]; then rm "$root_path/liblinphone-sdk" @@ -20,9 +33,9 @@ if [ ! -d "$root_path"/liblinphone-sdk ]; then if [ ! -d "$sdk_path" ]; then if which wget &>/dev/null; then - wget https://www.linphone.org/snapshots/ios/$sdk_version.zip -O "$sdk_path".zip + wget https://www.linphone.org/$sdk_dir/ios/$sdk_version.zip -O "$sdk_path".zip elif which curl &>/dev/null; then - curl -# https://www.linphone.org/snapshots/ios/$sdk_version.zip > "$sdk_path".zip + curl -# https://www.linphone.org/$sdk_dir/ios/$sdk_version.zip > "$sdk_path".zip else return 1 fi || die "error: cannot download liblinphone SDK from linphone.org. Please check the README.md" diff --git a/linphone-Info.plist b/linphone-Info.plist index 03244188e..0ddc1170c 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -24,7 +24,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.16.1 + 3.16.3 CFBundleURLTypes diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 45902561e..c82ad0abf 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -35,6 +35,10 @@ 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 22D1B68012A3E0BE001AE361 /* libresolv.dylib */; }; 22E0A822111C44E100B04932 /* AboutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E0A81C111C44E100B04932 /* AboutView.m */; }; 22F2508E107141E100AC9B3F /* DialerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 22F2508C107141E100AC9B3F /* DialerView.m */; }; + 244523AF1E8266CC0037A187 /* chat_delivered.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AC1E8266CC0037A187 /* chat_delivered.png */; }; + 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 */; }; 24A3459E1D95797700881A5C /* UIShopTableCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24A3459D1D95797700881A5C /* UIShopTableCell.xib */; }; 24A345A61D95798A00881A5C /* UIShopTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 24A345A51D95798A00881A5C /* UIShopTableCell.m */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; @@ -630,7 +634,6 @@ 63CFEE041B9EDD74007EA5BD /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0B13E830E400EFC6DC /* libvpx.a */; }; 63CFEE051B9EDD74007EA5BD /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFB13D7125500B30535 /* libx264.a */; }; 63CFEE061B9EDD88007EA5BD /* libmsamr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED51344B0EF00F6EF27 /* libmsamr.a */; }; - 63CFEE071B9EDD88007EA5BD /* libmsbcg729.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226CDADE14E2D0B800513B67 /* libmsbcg729.a */; }; 63CFEE091B9EDD88007EA5BD /* libmsopenh264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1560821E18EEF26100765332 /* libmsopenh264.a */; }; 63CFEE0A1B9EDD88007EA5BD /* libmssilk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AF147259670037138E /* libmssilk.a */; }; 63CFEE0B1B9EDD88007EA5BD /* libmswebrtc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 63EA4C941B50189D00922857 /* libmswebrtc.a */; }; @@ -669,12 +672,15 @@ 63FD3F121CA17FA400E9AECC /* libmbedx509.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 63FD3F081CA17F9100E9AECC /* libmbedx509.a */; }; 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; + 8C1B67061E671826001EA2FE /* AudioHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C1B67051E671826001EA2FE /* AudioHelper.m */; }; 8C2595DD1DEDC92D007A6424 /* ProviderDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C2595DC1DEDC92D007A6424 /* ProviderDelegate.m */; }; 8C2595DF1DEDCC8E007A6424 /* CallKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */; }; 8C2595E11DEDDC67007A6424 /* callkit_logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C2595E01DEDDC67007A6424 /* callkit_logo.png */; }; + 8C300D9A1E40E0CC00728EF3 /* lime_ko.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C300D981E40E0CC00728EF3 /* lime_ko.png */; }; + 8C300D9B1E40E0CC00728EF3 /* lime_ko@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C300D991E40E0CC00728EF3 /* lime_ko@2x.png */; }; + 8C5CADEB1E89160300F9DE91 /* libbcg729.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 63CFEDE41B9EDD36007EA5BD /* libbcg729.a */; }; 8C73477C1D9BA3A00022EE8C /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */; }; 8CA2004C1D8158440095F859 /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CA2004B1D8158440095F859 /* PushKit.framework */; }; - 9EC6C1E11DF96991006C2FD2 /* armv7-apple-darwin.ios in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EC6C1E01DF96991006C2FD2 /* armv7-apple-darwin.ios */; }; 9EC6C1E31DF969AA006C2FD2 /* libturbojpeg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EC6C1E21DF969AA006C2FD2 /* libturbojpeg.a */; }; 9EC6C1E41DF969D1006C2FD2 /* libturbojpeg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EC6C1E21DF969AA006C2FD2 /* libturbojpeg.a */; }; C90FAA7915AF54E6002091CB /* HistoryDetailsView.m in Sources */ = {isa = PBXBuildFile; fileRef = C90FAA7715AF54E6002091CB /* HistoryDetailsView.m */; }; @@ -775,7 +781,6 @@ F0BB8C1A1936245300974404 /* libbzrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 045B5CB218D72E9A0088350C /* libbzrtp.a */; }; F0BB8C1B1936245300974404 /* libgsm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2910765B400068D98F /* libgsm.a */; }; F0BB8C1D1936245300974404 /* libmsamr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED51344B0EF00F6EF27 /* libmsamr.a */; }; - F0BB8C1E1936245300974404 /* libmsbcg729.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226CDADE14E2D0B800513B67 /* libmsbcg729.a */; }; F0BB8C201936245300974404 /* libmssilk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AF147259670037138E /* libmssilk.a */; }; F0BB8C221936245300974404 /* libopencore-amrnb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED41344B0EF00F6EF27 /* libopencore-amrnb.a */; }; F0BB8C231936245300974404 /* libopencore-amrwb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED31344B0EF00F6EF27 /* libopencore-amrwb.a */; }; @@ -926,6 +931,10 @@ 22E0A81D111C44E100B04932 /* AboutView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AboutView.h; sourceTree = ""; }; 22F2508B107141E100AC9B3F /* DialerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DialerView.h; sourceTree = ""; }; 22F2508C107141E100AC9B3F /* DialerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DialerView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 244523AC1E8266CC0037A187 /* chat_delivered.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_delivered.png; sourceTree = ""; }; + 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 = ""; }; 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 = ""; }; @@ -1590,58 +1599,62 @@ 7066FC0B13E830E400EFC6DC /* libvpx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvpx.a; path = "liblinphone-sdk/apple-darwin/lib/libvpx.a"; sourceTree = ""; }; 70E542F213E147E3002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 70E542F413E147EB002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 8C1B67051E671826001EA2FE /* AudioHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioHelper.m; sourceTree = ""; }; + 8C1B67081E6718BC001EA2FE /* AudioHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioHelper.h; path = Utils/AudioHelper.h; sourceTree = ""; }; + 8C1C42E61E43408E00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AboutView.strings; sourceTree = ""; }; + 8C1C42E71E43408F00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantLinkView.strings; sourceTree = ""; }; + 8C1C42E81E43409000FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantView.strings; sourceTree = ""; }; + 8C1C42E91E43409000FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantViewScreens.strings; sourceTree = ""; }; + 8C1C42EA1E43409000FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CallIncomingView.strings; sourceTree = ""; }; + 8C1C42EB1E43409100FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CallOutgoingView.strings; sourceTree = ""; }; + 8C1C42EC1E43409100FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CallView.strings; sourceTree = ""; }; + 8C1C42ED1E43409100FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/CallView~ipad.strings"; sourceTree = ""; }; + 8C1C42EE1E43409200FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationCreateView.strings; sourceTree = ""; }; + 8C1C42EF1E43409200FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationView.strings; sourceTree = ""; }; + 8C1C42F01E43409300FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatsListView.strings; sourceTree = ""; }; + 8C1C42F11E43409300FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ContactDetailsView.strings; sourceTree = ""; }; + 8C1C42F21E43409300FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ContactsListView.strings; sourceTree = ""; }; + 8C1C42F31E43409400FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CountryListView.strings; sourceTree = ""; }; + 8C1C42F41E43409400FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/DialerView.strings; sourceTree = ""; }; + 8C1C42F51E43409400FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/DialerView~ipad.strings"; sourceTree = ""; }; + 8C1C42F61E43409500FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/FirstLoginView.strings; sourceTree = ""; }; + 8C1C42F71E43409500FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/HistoryDetailsView.strings; sourceTree = ""; }; + 8C1C42F81E43409500FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/HistoryListView.strings; sourceTree = ""; }; + 8C1C42F91E43409600FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ImageView.strings; sourceTree = ""; }; + 8C1C42FA1E43409600FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UICallConferenceCell.strings; sourceTree = ""; }; + 8C1C42FB1E43409600FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UICallPausedCell.strings; sourceTree = ""; }; + 8C1C42FC1E43409700FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatBubblePhotoCell.strings; sourceTree = ""; }; + 8C1C42FD1E43409700FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatBubbleTextCell.strings; sourceTree = ""; }; + 8C1C42FE1E43409800FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatCell.strings; sourceTree = ""; }; + 8C1C42FF1E43409800FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatCreateCell.strings; sourceTree = ""; }; + 8C1C43001E43409800FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UICompositeView.strings; sourceTree = ""; }; + 8C1C43011E43409900FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/UICompositeView~ipad.strings"; sourceTree = ""; }; + 8C1C43021E43409900FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIConfirmationDialog.strings; sourceTree = ""; }; + 8C1C43031E43409A00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIContactCell.strings; sourceTree = ""; }; + 8C1C43041E43409A00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIContactDetailsCell.strings; sourceTree = ""; }; + 8C1C43051E43409A00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIHistoryCell.strings; sourceTree = ""; }; + 8C1C43061E43409B00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PhoneMainView.strings; sourceTree = ""; }; + 8C1C43071E43409B00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SettingsView.strings; sourceTree = ""; }; + 8C1C43081E43409C00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ShopView.strings; sourceTree = ""; }; + 8C1C43091E43409C00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SideMenuView.strings; sourceTree = ""; }; + 8C1C430A1E43409D00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/SideMenuView~ipad.strings"; sourceTree = ""; }; + 8C1C430B1E43409D00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/StatusBarView.strings; sourceTree = ""; }; + 8C1C430C1E43409D00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/TabBarView.strings; sourceTree = ""; }; + 8C1C430D1E43409E00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main_iPad.strings; sourceTree = ""; }; + 8C1C430E1E43409E00FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main_iPhone.strings; sourceTree = ""; }; + 8C1C43211E438DB600FE9A91 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; 8C23BCB71D82AAC3005F19BB /* linphone.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = linphone.entitlements; sourceTree = ""; }; 8C2595D51DEDC8E1007A6424 /* ProviderDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ProviderDelegate.h; sourceTree = ""; }; 8C2595DC1DEDC92D007A6424 /* ProviderDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProviderDelegate.m; sourceTree = ""; }; 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CallKit.framework; path = System/Library/Frameworks/CallKit.framework; sourceTree = SDKROOT; }; 8C2595E01DEDDC67007A6424 /* callkit_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = callkit_logo.png; sourceTree = ""; }; + 8C300D981E40E0CC00728EF3 /* lime_ko.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lime_ko.png; sourceTree = ""; }; + 8C300D991E40E0CC00728EF3 /* lime_ko@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lime_ko@2x.png"; sourceTree = ""; }; 8C5D1B991D9BC48100DC6539 /* UIShopTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIShopTableCell.h; sourceTree = ""; }; 8C5D1B9A1D9BC48100DC6539 /* UIShopTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIShopTableCell.m; sourceTree = ""; }; 8C5D1B9B1D9BC48100DC6539 /* UIShopTableCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UIShopTableCell.xib; sourceTree = ""; }; 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; 8CA2004B1D8158440095F859 /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; - 8CA5F89D1DD093EE00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AboutView.strings; sourceTree = ""; }; - 8CA5F89E1DD093F200E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantLinkView.strings; sourceTree = ""; }; - 8CA5F89F1DD093F200E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantView.strings; sourceTree = ""; }; - 8CA5F8A01DD093F300E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantViewScreens.strings; sourceTree = ""; }; - 8CA5F8A11DD093F400E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CallIncomingView.strings; sourceTree = ""; }; - 8CA5F8A21DD093F400E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CallOutgoingView.strings; sourceTree = ""; }; - 8CA5F8A31DD093F500E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CallView.strings; sourceTree = ""; }; - 8CA5F8A41DD093F600E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/CallView~ipad.strings"; sourceTree = ""; }; - 8CA5F8A51DD093F600E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationCreateView.strings; sourceTree = ""; }; - 8CA5F8A61DD093F700E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationView.strings; sourceTree = ""; }; - 8CA5F8A71DD093F800E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatsListView.strings; sourceTree = ""; }; - 8CA5F8A81DD093F900E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ContactDetailsView.strings; sourceTree = ""; }; - 8CA5F8A91DD093F900E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ContactsListView.strings; sourceTree = ""; }; - 8CA5F8AA1DD093FA00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CountryListView.strings; sourceTree = ""; }; - 8CA5F8AB1DD093FB00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/DialerView.strings; sourceTree = ""; }; - 8CA5F8AC1DD093FC00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/DialerView~ipad.strings"; sourceTree = ""; }; - 8CA5F8AD1DD093FC00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/FirstLoginView.strings; sourceTree = ""; }; - 8CA5F8AE1DD093FD00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/HistoryDetailsView.strings; sourceTree = ""; }; - 8CA5F8AF1DD093FE00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/HistoryListView.strings; sourceTree = ""; }; - 8CA5F8B01DD093FE00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ImageView.strings; sourceTree = ""; }; - 8CA5F8B11DD093FF00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UICallConferenceCell.strings; sourceTree = ""; }; - 8CA5F8B21DD0940000E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UICallPausedCell.strings; sourceTree = ""; }; - 8CA5F8B31DD0940100E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatBubblePhotoCell.strings; sourceTree = ""; }; - 8CA5F8B41DD0940200E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatBubbleTextCell.strings; sourceTree = ""; }; - 8CA5F8B51DD0940200E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatCell.strings; sourceTree = ""; }; - 8CA5F8B61DD0940300E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatCreateCell.strings; sourceTree = ""; }; - 8CA5F8B71DD0940400E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UICompositeView.strings; sourceTree = ""; }; - 8CA5F8B81DD0940500E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/UICompositeView~ipad.strings"; sourceTree = ""; }; - 8CA5F8B91DD0940600E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIConfirmationDialog.strings; sourceTree = ""; }; - 8CA5F8BA1DD0940700E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIContactCell.strings; sourceTree = ""; }; - 8CA5F8BB1DD0940700E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIContactDetailsCell.strings; sourceTree = ""; }; - 8CA5F8BC1DD0940800E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIHistoryCell.strings; sourceTree = ""; }; - 8CA5F8BD1DD0940900E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PhoneMainView.strings; sourceTree = ""; }; - 8CA5F8BE1DD0940A00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SettingsView.strings; sourceTree = ""; }; - 8CA5F8BF1DD0940A00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ShopView.strings; sourceTree = ""; }; - 8CA5F8C01DD0940B00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SideMenuView.strings; sourceTree = ""; }; - 8CA5F8C11DD0940C00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/SideMenuView~ipad.strings"; sourceTree = ""; }; - 8CA5F8C21DD0940D00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/StatusBarView.strings; sourceTree = ""; }; - 8CA5F8C31DD0940E00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/TabBarView.strings; sourceTree = ""; }; - 8CA5F8C41DD0940F00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main_iPad.strings; sourceTree = ""; }; - 8CA5F8C51DD0941000E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main_iPhone.strings; sourceTree = ""; }; - 8CA5F8CC1DD21DCB00E06627 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; 9EC6C1E01DF96991006C2FD2 /* armv7-apple-darwin.ios */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "armv7-apple-darwin.ios"; path = "liblinphone-sdk/armv7-apple-darwin.ios"; sourceTree = ""; }; 9EC6C1E21DF969AA006C2FD2 /* libturbojpeg.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libturbojpeg.a; path = "liblinphone-sdk/apple-darwin/lib/libturbojpeg.a"; sourceTree = ""; }; C90FAA7615AF54E6002091CB /* HistoryDetailsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryDetailsView.h; sourceTree = ""; }; @@ -1836,7 +1849,6 @@ buildActionMask = 2147483647; files = ( 9EC6C1E31DF969AA006C2FD2 /* libturbojpeg.a in Frameworks */, - 9EC6C1E11DF96991006C2FD2 /* armv7-apple-darwin.ios in Frameworks */, 8C2595DF1DEDCC8E007A6424 /* CallKit.framework in Frameworks */, 8C73477C1D9BA3A00022EE8C /* UserNotifications.framework in Frameworks */, 8CA2004C1D8158440095F859 /* PushKit.framework in Frameworks */, @@ -1866,7 +1878,6 @@ 63CFEDF41B9EDD74007EA5BD /* libmediastreamer_base.a in Frameworks */, 63CFEDF51B9EDD74007EA5BD /* libmediastreamer_voip.a in Frameworks */, 63CFEE061B9EDD88007EA5BD /* libmsamr.a in Frameworks */, - 63CFEE071B9EDD88007EA5BD /* libmsbcg729.a in Frameworks */, 63CFEE091B9EDD88007EA5BD /* libmsopenh264.a in Frameworks */, 63CFEE0A1B9EDD88007EA5BD /* libmssilk.a in Frameworks */, 63CFEE0B1B9EDD88007EA5BD /* libmswebrtc.a in Frameworks */, @@ -1923,6 +1934,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 8C5CADEB1E89160300F9DE91 /* libbcg729.a in Frameworks */, 9EC6C1E41DF969D1006C2FD2 /* libturbojpeg.a in Frameworks */, 636920671D253DF700D44CAC /* libbcunit.a in Frameworks */, 63BB26A31D006F4B00DA1F83 /* libbv16.a in Frameworks */, @@ -1959,7 +1971,6 @@ F0BB8C141936242400974404 /* libmediastreamer_base.a in Frameworks */, F0BB8C151936242400974404 /* libmediastreamer_voip.a in Frameworks */, F0BB8C1D1936245300974404 /* libmsamr.a in Frameworks */, - F0BB8C1E1936245300974404 /* libmsbcg729.a in Frameworks */, F0BB8C201936245300974404 /* libmssilk.a in Frameworks */, F0BB8C221936245300974404 /* libopencore-amrnb.a in Frameworks */, F0BB8C231936245300974404 /* libopencore-amrwb.a in Frameworks */, @@ -2440,8 +2451,11 @@ 633FEBE11D3CD5570014B822 /* images */ = { isa = PBXGroup; children = ( + 8C300D981E40E0CC00728EF3 /* lime_ko.png */, + 8C300D991E40E0CC00728EF3 /* lime_ko@2x.png */, 8C2595E01DEDDC67007A6424 /* callkit_logo.png */, 633FEBE21D3CD5570014B822 /* add_field_default.png */, + 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */, 633FEBE31D3CD5570014B822 /* add_field_default@2x.png */, 633FEBE41D3CD5570014B822 /* add_field_over.png */, 633FEBE51D3CD5570014B822 /* add_field_over@2x.png */, @@ -2494,6 +2508,9 @@ 633FEC141D3CD5570014B822 /* call_quality_indicator_1.png */, 633FEC151D3CD5570014B822 /* call_quality_indicator_1@2x.png */, 633FEC161D3CD5570014B822 /* call_quality_indicator_2.png */, + 244523AC1E8266CC0037A187 /* chat_delivered.png */, + 244523AD1E8266CC0037A187 /* chat_error.png */, + 244523AE1E8266CC0037A187 /* chat_read.png */, 633FEC171D3CD5570014B822 /* call_quality_indicator_2@2x.png */, 633FEC181D3CD5570014B822 /* call_quality_indicator_3.png */, 633FEC191D3CD5570014B822 /* call_quality_indicator_3@2x.png */, @@ -2969,6 +2986,8 @@ 63D11C541C3D503A00E8FCEE /* Log.h */, 63423C081C4501D000D9A050 /* Contact.h */, 63423C091C4501D000D9A050 /* Contact.m */, + 8C1B67081E6718BC001EA2FE /* AudioHelper.h */, + 8C1B67051E671826001EA2FE /* AudioHelper.m */, ); name = Utils; sourceTree = ""; @@ -3294,6 +3313,7 @@ 633FEDC41D3CD5590014B822 /* call_hangup_disabled.png in Resources */, 633FEDA81D3CD5590014B822 /* backspace_default.png in Resources */, 636316D11A1DEBCB0009B839 /* AboutView.xib in Resources */, + 244523AF1E8266CC0037A187 /* chat_delivered.png in Resources */, 633FEF481D3CD55A0014B822 /* speaker_selected.png in Resources */, 633FEED91D3CD55A0014B822 /* numpad_7~ipad.png in Resources */, 633FEE2B1D3CD5590014B822 /* color_C.png in Resources */, @@ -3302,6 +3322,7 @@ 633FEF021D3CD55A0014B822 /* options_disabled.png in Resources */, 633FEDC81D3CD5590014B822 /* call_missed.png in Resources */, 633FEF4B1D3CD55A0014B822 /* splashscreen@2x.png in Resources */, + 8C300D9A1E40E0CC00728EF3 /* lime_ko.png in Resources */, 633FEE311D3CD5590014B822 /* color_I.png in Resources */, 633FEF1F1D3CD55A0014B822 /* presence_online@2x.png in Resources */, 633FEE641D3CD5590014B822 /* footer_chat_disabled.png in Resources */, @@ -3421,6 +3442,7 @@ 633FEF301D3CD55A0014B822 /* route_speaker_disabled.png in Resources */, 639CEAFD1A1DF4D9004DE38F /* StatusBarView.xib in Resources */, 633FEDE91D3CD5590014B822 /* call_status_missed~ipad@2x.png in Resources */, + 244523B11E8266CC0037A187 /* chat_read.png in Resources */, 639E9CAC1C0DB80300019A75 /* UIContactDetailsCell.xib in Resources */, 633FEE511D3CD5590014B822 /* deselect_all@2x.png in Resources */, F088488A19FF8C41007FFCF3 /* UIContactCell.xib in Resources */, @@ -3502,6 +3524,7 @@ 633FEE211D3CD5590014B822 /* chat_start_body_disabled~ipad@2x.png in Resources */, 63AADC011B6A0FF200AA16FD /* assistant_linphone_existing.rc in Resources */, 633FEE5A1D3CD5590014B822 /* edit_default.png in Resources */, + 244523B01E8266CC0037A187 /* chat_error.png in Resources */, 633FEDD11D3CD5590014B822 /* call_quality_indicator_2@2x.png in Resources */, 633FEDBC1D3CD5590014B822 /* call_audio_start_disabled.png in Resources */, 633FEE481D3CD5590014B822 /* delete_default.png in Resources */, @@ -3523,6 +3546,7 @@ 633FEDD61D3CD5590014B822 /* call_start_body_default.png in Resources */, 633FEEEC1D3CD55A0014B822 /* numpad_hash_default@2x.png in Resources */, 633FEE831D3CD5590014B822 /* led_disconnected@2x.png in Resources */, + 244523BE1E8D3A6C0037A187 /* chat_unsecure.png in Resources */, 633FEE031D3CD5590014B822 /* cancel_edit_default@2x.png in Resources */, 633FEDE01D3CD5590014B822 /* call_start_body_over~ipad.png in Resources */, D34F6F9E1594D3FB0095705B /* InAppSettings.bundle in Resources */, @@ -3689,6 +3713,7 @@ 633FEE941D3CD55A0014B822 /* micro_default.png in Resources */, 633FEE611D3CD5590014B822 /* edit_list_disabled@2x.png in Resources */, 633FEE761D3CD5590014B822 /* history_all_selected.png in Resources */, + 8C300D9B1E40E0CC00728EF3 /* lime_ko@2x.png in Resources */, 633FEF321D3CD55A0014B822 /* route_speaker_selected.png in Resources */, 633FEDF51D3CD5590014B822 /* call_video_start_disabled@2x.png in Resources */, 63B81A0C1B57DA33009604A6 /* LICENSE.txt in Resources */, @@ -3917,6 +3942,7 @@ D3ED3EA71587334E006C0DE4 /* HistoryListTableView.m in Sources */, D3ED3EB81587392C006C0DE4 /* HistoryListView.m in Sources */, 24A345A61D95798A00881A5C /* UIShopTableCell.m in Sources */, + 8C1B67061E671826001EA2FE /* AudioHelper.m in Sources */, D35497FE15875372000081D8 /* ContactsListView.m in Sources */, 635173F91BA082A40095EB0A /* UIChatBubblePhotoCell.m in Sources */, D3549816158761D0000081D8 /* ContactsListTableView.m in Sources */, @@ -4061,7 +4087,7 @@ children = ( 570742571D5A0691004B9C84 /* Base */, 570742631D5A1860004B9C84 /* en */, - 8CA5F8BF1DD0940A00E06627 /* fr */, + 8C1C43081E43409C00FE9A91 /* fr */, ); name = ShopView.xib; sourceTree = ""; @@ -4095,7 +4121,7 @@ isa = PBXVariantGroup; children = ( 63058A161B4E821E00EFAE36 /* Base */, - 8CA5F8C41DD0940F00E06627 /* fr */, + 8C1C430D1E43409E00FE9A91 /* fr */, ); name = Main_iPad.storyboard; sourceTree = ""; @@ -4104,7 +4130,7 @@ isa = PBXVariantGroup; children = ( 63058A181B4E821E00EFAE36 /* Base */, - 8CA5F8C51DD0941000E06627 /* fr */, + 8C1C430E1E43409E00FE9A91 /* fr */, ); name = Main_iPhone.storyboard; sourceTree = ""; @@ -4122,7 +4148,7 @@ isa = PBXVariantGroup; children = ( 631098511D4660630041F2B3 /* Base */, - 8CA5F8AA1DD093FA00E06627 /* fr */, + 8C1C42F31E43409400FE9A91 /* fr */, ); name = CountryListView.xib; sourceTree = ""; @@ -4131,7 +4157,7 @@ isa = PBXVariantGroup; children = ( 63130FB11C1ED06900371918 /* Base */, - 8CA5F8C11DD0940C00E06627 /* fr */, + 8C1C430A1E43409D00FE9A91 /* fr */, ); name = "SideMenuView~ipad.xib"; sourceTree = ""; @@ -4140,7 +4166,7 @@ isa = PBXVariantGroup; children = ( 634610111B6140A500548952 /* Base */, - 8CA5F8A21DD093F400E06627 /* fr */, + 8C1C42EB1E43409100FE9A91 /* fr */, ); name = CallOutgoingView.xib; sourceTree = ""; @@ -4150,7 +4176,7 @@ children = ( 636316D21A1DEBCB0009B839 /* Base */, F0AF06F01A24BA760086C9C1 /* ar */, - 8CA5F89D1DD093EE00E06627 /* fr */, + 8C1C42E61E43408E00FE9A91 /* fr */, ); name = AboutView.xib; sourceTree = ""; @@ -4160,7 +4186,7 @@ children = ( 636316D51A1DEC650009B839 /* Base */, F0AF070E1A24BA770086C9C1 /* ar */, - 8CA5F8BE1DD0940A00E06627 /* fr */, + 8C1C43071E43409B00FE9A91 /* fr */, ); name = SettingsView.xib; sourceTree = ""; @@ -4169,7 +4195,7 @@ isa = PBXVariantGroup; children = ( 638F1A611C2021B2004B8E02 /* Base */, - 8CA5F8AC1DD093FC00E06627 /* fr */, + 8C1C42F51E43409400FE9A91 /* fr */, ); name = "DialerView~ipad.xib"; sourceTree = ""; @@ -4178,7 +4204,7 @@ isa = PBXVariantGroup; children = ( 638F1A871C2167C2004B8E02 /* Base */, - 8CA5F8A41DD093F600E06627 /* fr */, + 8C1C42ED1E43409100FE9A91 /* fr */, ); name = "CallView~ipad.xib"; sourceTree = ""; @@ -4187,7 +4213,7 @@ isa = PBXVariantGroup; children = ( 638F1A901C21993D004B8E02 /* Base */, - 8CA5F8B81DD0940500E06627 /* fr */, + 8C1C43011E43409900FE9A91 /* fr */, ); name = "UICompositeView~ipad.xib"; sourceTree = ""; @@ -4197,7 +4223,7 @@ children = ( 639CEAFE1A1DF4D9004DE38F /* Base */, F0AF070C1A24BA770086C9C1 /* ar */, - 8CA5F8C21DD0940D00E06627 /* fr */, + 8C1C430B1E43409D00FE9A91 /* fr */, ); name = StatusBarView.xib; path = LinphoneUI; @@ -4208,7 +4234,7 @@ children = ( 639CEB011A1DF4E4004DE38F /* Base */, F0AF07091A24BA770086C9C1 /* ar */, - 8CA5F8BC1DD0940800E06627 /* fr */, + 8C1C43051E43409A00FE9A91 /* fr */, ); name = UIHistoryCell.xib; sourceTree = ""; @@ -4218,7 +4244,7 @@ children = ( 639CEB041A1DF4EB004DE38F /* Base */, F0AF07041A24BA770086C9C1 /* ar */, - 8CA5F8B71DD0940400E06627 /* fr */, + 8C1C43001E43409800FE9A91 /* fr */, ); name = UICompositeView.xib; sourceTree = ""; @@ -4228,7 +4254,7 @@ children = ( 639CEB0A1A1DF4FA004DE38F /* Base */, F0AF07021A24BA770086C9C1 /* ar */, - 8CA5F8B51DD0940200E06627 /* fr */, + 8C1C42FE1E43409800FE9A91 /* fr */, ); name = UIChatCell.xib; sourceTree = ""; @@ -4237,7 +4263,7 @@ isa = PBXVariantGroup; children = ( 639E9C941C0DB7BE00019A75 /* Base */, - 8CA5F8AD1DD093FC00E06627 /* fr */, + 8C1C42F61E43409500FE9A91 /* fr */, ); name = FirstLoginView.xib; sourceTree = ""; @@ -4246,7 +4272,7 @@ isa = PBXVariantGroup; children = ( 639E9C9E1C0DB7DF00019A75 /* Base */, - 8CA5F8B21DD0940000E06627 /* fr */, + 8C1C42FB1E43409600FE9A91 /* fr */, ); name = UICallPausedCell.xib; sourceTree = ""; @@ -4255,7 +4281,7 @@ isa = PBXVariantGroup; children = ( 639E9CA11C0DB7E500019A75 /* Base */, - 8CA5F8B31DD0940100E06627 /* fr */, + 8C1C42FC1E43409700FE9A91 /* fr */, ); name = UIChatBubblePhotoCell.xib; sourceTree = ""; @@ -4264,7 +4290,7 @@ isa = PBXVariantGroup; children = ( 639E9CA41C0DB7EA00019A75 /* Base */, - 8CA5F8B41DD0940200E06627 /* fr */, + 8C1C42FD1E43409700FE9A91 /* fr */, ); name = UIChatBubbleTextCell.xib; sourceTree = ""; @@ -4273,7 +4299,7 @@ isa = PBXVariantGroup; children = ( 639E9CA71C0DB7F200019A75 /* Base */, - 8CA5F8B61DD0940300E06627 /* fr */, + 8C1C42FF1E43409800FE9A91 /* fr */, ); name = UIChatCreateCell.xib; sourceTree = ""; @@ -4282,7 +4308,7 @@ isa = PBXVariantGroup; children = ( 639E9CAA1C0DB7FB00019A75 /* Base */, - 8CA5F8B91DD0940600E06627 /* fr */, + 8C1C43021E43409900FE9A91 /* fr */, ); name = UIConfirmationDialog.xib; sourceTree = ""; @@ -4291,7 +4317,7 @@ isa = PBXVariantGroup; children = ( 639E9CAD1C0DB80300019A75 /* Base */, - 8CA5F8BB1DD0940700E06627 /* fr */, + 8C1C43041E43409A00FE9A91 /* fr */, ); name = UIContactDetailsCell.xib; sourceTree = ""; @@ -4300,7 +4326,7 @@ isa = PBXVariantGroup; children = ( 639E9CB11C0DB83000019A75 /* Base */, - 8CA5F8C01DD0940B00E06627 /* fr */, + 8C1C43091E43409C00FE9A91 /* fr */, ); name = SideMenuView.xib; sourceTree = ""; @@ -4309,7 +4335,7 @@ isa = PBXVariantGroup; children = ( 639E9CB41C0DB88200019A75 /* Base */, - 8CA5F8BD1DD0940900E06627 /* fr */, + 8C1C43061E43409B00FE9A91 /* fr */, ); name = PhoneMainView.xib; sourceTree = ""; @@ -4324,7 +4350,7 @@ 63AADBDD1B6A0FF200AA16FD /* nl */, 63AADBE11B6A0FF200AA16FD /* ru */, 63AADBE71B6A0FF200AA16FD /* zh_TW */, - 8CA5F8CC1DD21DCB00E06627 /* fr */, + 8C1C43211E438DB600FE9A91 /* fr */, ); name = Localizable.strings; sourceTree = ""; @@ -4333,7 +4359,7 @@ isa = PBXVariantGroup; children = ( 63B8D68D1BCBE65600C12B09 /* Base */, - 8CA5F8A51DD093F600E06627 /* fr */, + 8C1C42EE1E43409200FE9A91 /* fr */, ); name = ChatConversationCreateView.xib; sourceTree = ""; @@ -4342,7 +4368,7 @@ isa = PBXVariantGroup; children = ( 63EC8D3A1D7438660066547B /* Base */, - 8CA5F89E1DD093F200E06627 /* fr */, + 8C1C42E71E43408F00FE9A91 /* fr */, ); name = AssistantLinkView.xib; sourceTree = ""; @@ -4351,7 +4377,7 @@ isa = PBXVariantGroup; children = ( 63F1DF521BCE986A00EDED90 /* Base */, - 8CA5F8B11DD093FF00E06627 /* fr */, + 8C1C42FA1E43409600FE9A91 /* fr */, ); name = UICallConferenceCell.xib; sourceTree = ""; @@ -4362,7 +4388,7 @@ F09548221883F15400E8A69B /* Base */, F09548441883F52900E8A69B /* ru */, F0AF06FB1A24BA770086C9C1 /* ar */, - 8CA5F8B01DD093FE00E06627 /* fr */, + 8C1C42F91E43409600FE9A91 /* fr */, ); name = ImageView.xib; sourceTree = ""; @@ -4373,7 +4399,7 @@ F09548181883F15300E8A69B /* Base */, F09548321883F20A00E8A69B /* ru */, F0AF06F11A24BA760086C9C1 /* ar */, - 8CA5F8A61DD093F700E06627 /* fr */, + 8C1C42EF1E43409200FE9A91 /* fr */, ); name = ChatConversationView.xib; sourceTree = ""; @@ -4384,7 +4410,7 @@ F09548191883F15300E8A69B /* Base */, F09548341883F25F00E8A69B /* ru */, F0AF06F21A24BA760086C9C1 /* ar */, - 8CA5F8A71DD093F800E06627 /* fr */, + 8C1C42F01E43409300FE9A91 /* fr */, ); name = ChatsListView.xib; sourceTree = ""; @@ -4395,7 +4421,7 @@ F095481B1883F15300E8A69B /* Base */, F09548381883F29C00E8A69B /* ru */, F0AF06F41A24BA760086C9C1 /* ar */, - 8CA5F8A81DD093F900E06627 /* fr */, + 8C1C42F11E43409300FE9A91 /* fr */, ); name = ContactDetailsView.xib; sourceTree = ""; @@ -4406,7 +4432,7 @@ F095481C1883F15300E8A69B /* Base */, F095483A1883F2CA00E8A69B /* ru */, F0AF06F51A24BA760086C9C1 /* ar */, - 8CA5F8A91DD093F900E06627 /* fr */, + 8C1C42F21E43409300FE9A91 /* fr */, ); name = ContactsListView.xib; sourceTree = ""; @@ -4417,7 +4443,7 @@ F095481D1883F15300E8A69B /* Base */, F095483C1883F2E300E8A69B /* ru */, F0AF06F61A24BA760086C9C1 /* ar */, - 8CA5F8AB1DD093FB00E06627 /* fr */, + 8C1C42F41E43409400FE9A91 /* fr */, ); name = DialerView.xib; sourceTree = ""; @@ -4428,7 +4454,7 @@ F09548201883F15400E8A69B /* Base */, 636316DB1A1DEDD80009B839 /* ru */, F0AF06F91A24BA760086C9C1 /* ar */, - 8CA5F8AE1DD093FD00E06627 /* fr */, + 8C1C42F71E43409500FE9A91 /* fr */, ); name = HistoryDetailsView.xib; sourceTree = ""; @@ -4439,7 +4465,7 @@ F09548211883F15400E8A69B /* Base */, F09548421883F51B00E8A69B /* ru */, F0AF06FA1A24BA770086C9C1 /* ar */, - 8CA5F8AF1DD093FE00E06627 /* fr */, + 8C1C42F81E43409500FE9A91 /* fr */, ); name = HistoryListView.xib; sourceTree = ""; @@ -4450,7 +4476,7 @@ F09548241883F15400E8A69B /* Base */, F09548481883F55800E8A69B /* ru */, F0AF06FD1A24BA770086C9C1 /* ar */, - 8CA5F8A11DD093F400E06627 /* fr */, + 8C1C42EA1E43409000FE9A91 /* fr */, ); name = CallIncomingView.xib; sourceTree = ""; @@ -4461,7 +4487,7 @@ F095482E1883F15500E8A69B /* Base */, F095485A1883F67B00E8A69B /* ru */, F0AF070F1A24BA770086C9C1 /* ar */, - 8CA5F89F1DD093F200E06627 /* fr */, + 8C1C42E81E43409000FE9A91 /* fr */, ); name = AssistantView.xib; sourceTree = ""; @@ -4472,7 +4498,7 @@ F095482C1883F15400E8A69B /* Base */, F09548561883F61600E8A69B /* ru */, F0AF070A1A24BA770086C9C1 /* ar */, - 8CA5F8C31DD0940E00E06627 /* fr */, + 8C1C430C1E43409D00FE9A91 /* fr */, ); name = TabBarView.xib; path = LinphoneUI; @@ -4484,7 +4510,7 @@ F09548231883F15400E8A69B /* Base */, F09548461883F54200E8A69B /* ru */, F0AF06FC1A24BA770086C9C1 /* ar */, - 8CA5F8A31DD093F500E06627 /* fr */, + 8C1C42EC1E43409100FE9A91 /* fr */, ); name = CallView.xib; sourceTree = ""; @@ -4495,7 +4521,7 @@ F09548301883F15500E8A69B /* Base */, F095485E1883F6EA00E8A69B /* ru */, F0AF07111A24BA770086C9C1 /* ar */, - 8CA5F8A01DD093F300E06627 /* fr */, + 8C1C42E91E43409000FE9A91 /* fr */, ); name = AssistantViewScreens.xib; sourceTree = ""; @@ -4505,7 +4531,7 @@ children = ( F088488C19FF8C41007FFCF3 /* Base */, F0AF07061A24BA770086C9C1 /* ar */, - 8CA5F8BA1DD0940700E06627 /* fr */, + 8C1C43031E43409A00FE9A91 /* fr */, ); name = UIContactCell.xib; sourceTree = ""; @@ -4527,6 +4553,7 @@ COMPRESS_PNG_FILES = NO; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = Z2V957B3D6; + ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; @@ -4619,6 +4646,7 @@ COMPRESS_PNG_FILES = NO; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = Z2V957B3D6; + ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; @@ -4710,6 +4738,7 @@ COMPRESS_PNG_FILES = NO; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = Z2V957B3D6; + ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; @@ -4801,6 +4830,7 @@ COMPRESS_PNG_FILES = NO; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = Z2V957B3D6; + ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; diff --git a/submodules/bcg729 b/submodules/bcg729 index 23418135d..20f7bdd81 160000 --- a/submodules/bcg729 +++ b/submodules/bcg729 @@ -1 +1 @@ -Subproject commit 23418135d21077bf41e71170179e4e3cb9723f8a +Subproject commit 20f7bdd8118cc518015a500033de45d39702f0ed diff --git a/submodules/bctoolbox b/submodules/bctoolbox index 058967d34..6ba9a5614 160000 --- a/submodules/bctoolbox +++ b/submodules/bctoolbox @@ -1 +1 @@ -Subproject commit 058967d340a97d7a4c155490398162b24c2ea399 +Subproject commit 6ba9a56146a876b1eaea20fafcfa5a1d8ff9fbc7 diff --git a/submodules/belcard b/submodules/belcard index 63e61b0ae..1a1c5e176 160000 --- a/submodules/belcard +++ b/submodules/belcard @@ -1 +1 @@ -Subproject commit 63e61b0ae0f20e6d9f790335184fa4a0fc2a90ab +Subproject commit 1a1c5e176b737b1c8d8e24023c4a5ac8eaa50fe1 diff --git a/submodules/belle-sip b/submodules/belle-sip index 8d49d1853..e26d92334 160000 --- a/submodules/belle-sip +++ b/submodules/belle-sip @@ -1 +1 @@ -Subproject commit 8d49d18532e1addebd21b61fc6a13920057bcd5b +Subproject commit e26d92334a7a68543f327553bb436919ddfb2385 diff --git a/submodules/belr b/submodules/belr index 8a7f0868a..e9acc91a8 160000 --- a/submodules/belr +++ b/submodules/belr @@ -1 +1 @@ -Subproject commit 8a7f0868a7d35f86ff5fa422c7333f113d935e0f +Subproject commit e9acc91a8f6cc48c0a52585ddafea3bb62622776 diff --git a/submodules/bzrtp b/submodules/bzrtp index 2b234b08e..556335fee 160000 --- a/submodules/bzrtp +++ b/submodules/bzrtp @@ -1 +1 @@ -Subproject commit 2b234b08e6c85babbcd76651ab432b91c76aaff4 +Subproject commit 556335fee2bbb28e6cbe40510499ef15abef85fb diff --git a/submodules/cmake-builder b/submodules/cmake-builder index 141c0b6c0..bc6df3cfa 160000 --- a/submodules/cmake-builder +++ b/submodules/cmake-builder @@ -1 +1 @@ -Subproject commit 141c0b6c0991fc79e8988961f2283936ca3c14f7 +Subproject commit bc6df3cfa2c2f8cc54fb225735374c246b68721b diff --git a/submodules/externals/mbedtls b/submodules/externals/mbedtls index 02d64e46b..d9385339a 160000 --- a/submodules/externals/mbedtls +++ b/submodules/externals/mbedtls @@ -1 +1 @@ -Subproject commit 02d64e46be98442e1f8ca001d6d5c62ff48e36a3 +Subproject commit d9385339a5c2979786cfc844c0527593c14662c5 diff --git a/submodules/externals/opus b/submodules/externals/opus index 96a78acac..35b371a85 160000 --- a/submodules/externals/opus +++ b/submodules/externals/opus @@ -1 +1 @@ -Subproject commit 96a78acaca1970c20e9ee7b1dd253b36d8deb56b +Subproject commit 35b371a85bf2cf21ab4b12b5475c76a2775b25d1 diff --git a/submodules/linphone b/submodules/linphone index 1c92cdd44..0ea7e7cf0 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 1c92cdd4466d8af34ff3faa1db7e2e3f0c8f5d46 +Subproject commit 0ea7e7cf0eb3b1ac9e1462a1126f8b1543f02ea3 diff --git a/submodules/mediastreamer2 b/submodules/mediastreamer2 new file mode 160000 index 000000000..21a3e023a --- /dev/null +++ b/submodules/mediastreamer2 @@ -0,0 +1 @@ +Subproject commit 21a3e023adef4fe2568340af28cd3487e268ba2e diff --git a/submodules/ortp b/submodules/ortp new file mode 160000 index 000000000..67c0672e2 --- /dev/null +++ b/submodules/ortp @@ -0,0 +1 @@ +Subproject commit 67c0672e2680baa85a74d8966b813fac259649df