From 0d7ff54a09886c7c4aaf08d7ebabb2369a4516ba Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 1 Feb 2016 16:45:04 +0100 Subject: [PATCH 01/87] LinphoneManager.m: remove , from user agent --- Classes/LinphoneManager.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index dd912378c..1ea87ca30 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -1307,9 +1307,11 @@ static LinphoneCoreVTable linphonec_vtable = { NSString *chatDBFileName = [LinphoneManager documentFile:kLinphoneInternalChatDBFilename]; const char *lRootCa = [[LinphoneManager bundleFile:@"rootca.pem"] UTF8String]; - NSString *device = [NSString + NSString *device = [[NSString stringWithFormat:@"%@_%@_iOS%@", [NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"], - [LinphoneUtils deviceName], UIDevice.currentDevice.systemVersion]; + [LinphoneUtils deviceName], UIDevice.currentDevice.systemVersion] + stringByReplacingOccurrencesOfString:@"," + withString:@"."]; linphone_core_set_user_agent(theLinphoneCore, device.UTF8String, LINPHONE_IOS_VERSION); _contactSipField = [self lpConfigStringForKey:@"contact_im_type_value" withDefault:@"SIP"]; From dd72bfe6e44f215f425b6ccaf75eb46069b1751a Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 1 Feb 2016 16:53:22 +0100 Subject: [PATCH 02/87] firstloginview: update view for ipad and landscape --- Classes/Base.lproj/FirstLoginView.strings | Bin 3330 -> 3630 bytes Classes/Base.lproj/FirstLoginView.xib | 428 ++++++++++++++-------- Classes/FirstLoginView.h | 2 +- Classes/FirstLoginView.m | 158 ++++++-- 4 files changed, 407 insertions(+), 181 deletions(-) diff --git a/Classes/Base.lproj/FirstLoginView.strings b/Classes/Base.lproj/FirstLoginView.strings index 79d9cfea7597bbdc5adac81882365b663595f71a..5663041fea3ac6ac8f54aa1fb1aff051d72aede6 100644 GIT binary patch delta 250 zcmZpYS|_t%0=scALn1>aLopZ^Go&(9F(@#UG2{b96o6tWK#@F#5+ExLh!er=;>jOb z - + - + + + - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Classes/FirstLoginView.h b/Classes/FirstLoginView.h index 25d54de97..56ea7341b 100644 --- a/Classes/FirstLoginView.h +++ b/Classes/FirstLoginView.h @@ -22,7 +22,7 @@ #import "UICompositeView.h" #import "UIAssistantTextField.h" -@interface FirstLoginView : UIViewController { +@interface FirstLoginView : TPMultiLayoutViewController { LinphoneAccountCreator *account_creator; } diff --git a/Classes/FirstLoginView.m b/Classes/FirstLoginView.m index 249163798..8c34852d2 100644 --- a/Classes/FirstLoginView.m +++ b/Classes/FirstLoginView.m @@ -36,7 +36,7 @@ static UICompositeViewDescription *compositeDescription = nil; tabBar:nil sideMenu:nil fullscreen:false - isLeftFragment:NO + isLeftFragment:YES fragmentWith:nil]; } return compositeDescription; @@ -48,19 +48,28 @@ static UICompositeViewDescription *compositeDescription = nil; #pragma mark - ViewController Functions +- (void)viewDidLoad { + [super viewDidLoad]; + NSString *siteUrl = + [[LinphoneManager instance] lpConfigStringForKey:@"first_login_view_url"] ?: @"http://www.linphone.org"; + [_siteButton setTitle:siteUrl forState:UIControlStateNormal]; +} + - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Set observer - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(registrationUpdateEvent:) - name:kLinphoneRegistrationUpdate - object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(registrationUpdateEvent:) + name:kLinphoneRegistrationUpdate + object:nil]; - [_usernameField setText:[LinphoneManager.instance lpConfigStringForKey:@"assistant_username"]]; - [_passwordField setText:[LinphoneManager.instance lpConfigStringForKey:@"assistant_password"]]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(configureStateUpdateEvent:) + name:kLinphoneConfiguringStateUpdate + object:nil]; // Update on show - const MSList *list = linphone_core_get_proxy_config_list(LC); + const MSList *list = linphone_core_get_proxy_config_list([LinphoneManager getLc]); if (list != NULL) { LinphoneProxyConfig *config = (LinphoneProxyConfig *)list->data; if (config) { @@ -68,27 +77,34 @@ static UICompositeViewDescription *compositeDescription = nil; } } - [_usernameField showError:[AssistantView errorForStatus:LinphoneAccountCreatorUsernameInvalid] + if (account_creator) { + linphone_account_creator_unref(account_creator); + } + NSString *siteUrl = + [[LinphoneManager instance] lpConfigStringForKey:@"first_login_view_url"] ?: @"http://www.linphone.org"; + account_creator = linphone_account_creator_new([LinphoneManager getLc], siteUrl.UTF8String); + + [_usernameField showError:[self.class errorForStatus:LinphoneAccountCreatorUsernameInvalid] when:^BOOL(NSString *inputEntry) { LinphoneAccountCreatorStatus s = linphone_account_creator_set_username(account_creator, inputEntry.UTF8String); - _usernameField.errorLabel.text = [AssistantView errorForStatus:s]; + _usernameField.errorLabel.text = [self.class errorForStatus:s]; return s != LinphoneAccountCreatorOK; }]; - [_passwordField showError:[AssistantView errorForStatus:LinphoneAccountCreatorPasswordTooShort] + [_passwordField showError:[self.class errorForStatus:LinphoneAccountCreatorPasswordTooShort] when:^BOOL(NSString *inputEntry) { LinphoneAccountCreatorStatus s = linphone_account_creator_set_password(account_creator, inputEntry.UTF8String); - _passwordField.errorLabel.text = [AssistantView errorForStatus:s]; + _passwordField.errorLabel.text = [self.class errorForStatus:s]; return s != LinphoneAccountCreatorOK; }]; - [_domainField showError:[AssistantView errorForStatus:LinphoneAccountCreatorDomainInvalid] + [_domainField showError:[self.class errorForStatus:LinphoneAccountCreatorDomainInvalid] when:^BOOL(NSString *inputEntry) { LinphoneAccountCreatorStatus s = linphone_account_creator_set_domain(account_creator, inputEntry.UTF8String); - _domainField.errorLabel.text = [AssistantView errorForStatus:s]; + _domainField.errorLabel.text = [self.class errorForStatus:s]; return s != LinphoneAccountCreatorOK; }]; } @@ -97,18 +113,50 @@ static UICompositeViewDescription *compositeDescription = nil; [super viewWillDisappear:animated]; // Remove observer - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneRegistrationUpdate object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:kLinphoneRegistrationUpdate object:nil]; } -- (void)viewDidLoad { - [super viewDidLoad]; - - NSString *siteUrl = [LinphoneManager.instance lpConfigStringForKey:@"first_login_view_url"]; - if (siteUrl == nil) { - siteUrl = @"http://www.linphone.org"; ++ (NSString *)errorForStatus:(LinphoneAccountCreatorStatus)status { + BOOL usePhoneNumber = [[LinphoneManager instance] lpConfigBoolForKey:@"use_phone_number" inSection:@"assistant"]; + switch (status) { + case LinphoneAccountCreatorEmailInvalid: + return NSLocalizedString(@"Invalid email.", nil); + case LinphoneAccountCreatorUsernameInvalid: + return usePhoneNumber ? NSLocalizedString(@"Invalid phone number.", nil) + : NSLocalizedString(@"Invalid username.", nil); + case LinphoneAccountCreatorUsernameTooShort: + return usePhoneNumber ? NSLocalizedString(@"Phone number too short.", nil) + : NSLocalizedString(@"Username too short.", nil); + case LinphoneAccountCreatorUsernameTooLong: + return usePhoneNumber ? NSLocalizedString(@"Phone number too long.", nil) + : NSLocalizedString(@"Username too long.", nil); + case LinphoneAccountCreatorUsernameInvalidSize: + return usePhoneNumber ? NSLocalizedString(@"Phone number length invalid.", nil) + : NSLocalizedString(@"Username length invalid.", nil); + case LinphoneAccountCreatorPasswordTooShort: + return NSLocalizedString(@"Password too short.", nil); + case LinphoneAccountCreatorPasswordTooLong: + return NSLocalizedString(@"Password too long.", nil); + case LinphoneAccountCreatorDomainInvalid: + return NSLocalizedString(@"Invalid domain.", nil); + case LinphoneAccountCreatorRouteInvalid: + return NSLocalizedString(@"Invalid route.", nil); + case LinphoneAccountCreatorDisplayNameInvalid: + return NSLocalizedString(@"Invalid display name.", nil); + case LinphoneAccountCreatorReqFailed: + return NSLocalizedString(@"Failed to query the server. Please try again later", nil); + case LinphoneAccountCreatorTransportNotSupported: + return NSLocalizedString(@"Unsupported transport", nil); + case LinphoneAccountCreatorAccountCreated: + case LinphoneAccountCreatorAccountExist: + case LinphoneAccountCreatorAccountNotCreated: + case LinphoneAccountCreatorAccountNotExist: + case LinphoneAccountCreatorAccountNotValidated: + case LinphoneAccountCreatorAccountValidated: + case LinphoneAccountCreatorOK: + break; } - [_siteButton setTitle:siteUrl forState:UIControlStateNormal]; - account_creator = linphone_account_creator_new(LC, siteUrl.UTF8String); + return nil; } - (void)shouldEnableNextButton { @@ -121,6 +169,35 @@ static UICompositeViewDescription *compositeDescription = nil; #pragma mark - Event Functions +- (void)configureStateUpdateEvent:(NSNotification *)notif { + LinphoneConfiguringState state = [[notif.userInfo objectForKey:@"state"] intValue]; + switch (state) { + case LinphoneConfiguringFailed: { + [_waitView setHidden:true]; + DTAlertView *alertView = [[DTAlertView alloc] + initWithTitle:NSLocalizedString(@"Configuration failed", nil) + message: + NSLocalizedString( + @"Cannot retrieve your configuration. Please check credentialls or try again later", + nil) + delegate:nil + cancelButtonTitle:NSLocalizedString(@"OK", nil) + otherButtonTitles:nil]; + [alertView show]; + linphone_core_set_provisioning_uri([LinphoneManager getLc], NULL); + break; + } + default: + break; + } + if (account_creator) { + linphone_account_creator_unref(account_creator); + } + NSString *siteUrl = + [[LinphoneManager instance] lpConfigStringForKey:@"first_login_view_url"] ?: @"http://www.linphone.org"; + account_creator = linphone_account_creator_new([LinphoneManager getLc], siteUrl.UTF8String); +} + - (void)registrationUpdateEvent:(NSNotification *)notif { [self registrationUpdate:[[notif.userInfo objectForKey:@"state"] intValue]]; } @@ -128,7 +205,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)registrationUpdate:(LinphoneRegistrationState)state { switch (state) { case LinphoneRegistrationOk: { - [LinphoneManager.instance lpConfigSetBool:FALSE forKey:@"enable_first_login_view_preference"]; + [[LinphoneManager instance] lpConfigSetBool:FALSE forKey:@"enable_first_login_view_preference"]; [_waitView setHidden:true]; [PhoneMainView.instance changeCurrentView:DialerView.compositeViewDescription]; break; @@ -140,10 +217,6 @@ static UICompositeViewDescription *compositeDescription = nil; } case LinphoneRegistrationFailed: { [_waitView setHidden:true]; - - // erase uername passwd - [LinphoneManager.instance lpConfigSetString:nil forKey:@"assistant_username"]; - [LinphoneManager.instance lpConfigSetString:nil forKey:@"assistant_password"]; break; } case LinphoneRegistrationProgress: { @@ -164,7 +237,21 @@ static UICompositeViewDescription *compositeDescription = nil; } - (void)onLoginClick:(id)sender { + if (!linphone_core_is_network_reachable(LC)) { + UIAlertView *error = + [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Network Error", nil) + message:NSLocalizedString(@"There is no network connection available, enable " + @"WIFI or WWAN prior to configure an account", + nil) + delegate:nil + cancelButtonTitle:NSLocalizedString(@"Cancel", nil) + otherButtonTitles:nil]; + [error show]; + return; + } + _waitView.hidden = NO; + [XMLRPCHelper GetProvisioningURL:_usernameField.text password:_passwordField.text domain:_domainField.text @@ -180,9 +267,18 @@ static UICompositeViewDescription *compositeDescription = nil; #pragma mark - UITextFieldDelegate Functions -- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { - // When the user presses return, take focus away from the text field so that the keyboard is dismissed. - [theTextField resignFirstResponder]; +- (BOOL)textFieldShouldReturn:(UITextField *)textField { + [textField resignFirstResponder]; + if (textField.returnKeyType == UIReturnKeyNext) { + if (textField == _usernameField) { + [_domainField becomeFirstResponder]; + } else if (textField == _domainField) { + [_passwordField becomeFirstResponder]; + } + } else if (textField.returnKeyType == UIReturnKeyDone) { + [_loginButton sendActionsForControlEvents:UIControlEventTouchUpInside]; + } + return YES; } From ee8ecb4117b354fbaee951825b78c532f3861d32 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 3 Feb 2016 10:17:59 +0100 Subject: [PATCH 03/87] submodules: update linphone and update linphone core instantiation --- Classes/LinphoneManager.m | 21 ++++++++++----------- submodules/belle-sip | 2 +- submodules/linphone | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 1ea87ca30..a61a9af80 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -1428,19 +1428,19 @@ static BOOL libStarted = FALSE; [Log enableLogs:[self lpConfigIntForKey:@"debugenable_preference"]]; connectivity = none; - ms_init(); // Need to initialize mediastreamer2 before loading the plugins - // Load plugins if available in the linphone SDK - otherwise these calls will do nothing - libmsilbc_init(ms_factory_get_fallback()); - libmssilk_init(ms_factory_get_fallback()); - libmsamr_init(ms_factory_get_fallback()); - libmsx264_init(ms_factory_get_fallback()); - libmsopenh264_init(ms_factory_get_fallback()); - libmsbcg729_init(ms_factory_get_fallback()); - libmswebrtc_init(ms_factory_get_fallback()); - theLinphoneCore = linphone_core_new_with_config(&linphonec_vtable, _configDb, (__bridge void *)(self)); LOGI(@"Create linphonecore %p", theLinphoneCore); + // Load plugins if available in the linphone SDK - otherwise these calls will do nothing + MSFactory *f = linphone_core_get_ms_factory(theLinphoneCore); + libmsilbc_init(f); + libmssilk_init(f); + libmsamr_init(f); + libmsx264_init(f); + libmsopenh264_init(f); + libmsbcg729_init(f); + libmswebrtc_init(f); + // Set audio assets NSString *ring = ([LinphoneManager @@ -1507,7 +1507,6 @@ static BOOL libStarted = FALSE; linphone_core_destroy(theLinphoneCore); LOGI(@"Destroy linphonecore %p", theLinphoneCore); theLinphoneCore = nil; - ms_exit(); // Uninitialize mediastreamer2 // Post event NSDictionary *dict = diff --git a/submodules/belle-sip b/submodules/belle-sip index f76447b43..39a660c07 160000 --- a/submodules/belle-sip +++ b/submodules/belle-sip @@ -1 +1 @@ -Subproject commit f76447b43e3bbd31dfe6fdbe280e99e2aea73382 +Subproject commit 39a660c07feaaaae0eca8e1d8c18d52adb8e7cf3 diff --git a/submodules/linphone b/submodules/linphone index b0ea18f83..1db3b9a29 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit b0ea18f83cd642243c5a2e1690d5cf95bfe55000 +Subproject commit 1db3b9a2978d64dc886c6c7db7b5ed21ee39bbe7 From 215a86c9ca31b7bf821866e3862bb68cbca9afea Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 3 Feb 2016 11:24:19 +0100 Subject: [PATCH 04/87] chat: refresh iPad fragments when needed --- Classes/ChatConversationCreateTableView.m | 5 +++ Classes/ChatConversationTableView.h | 3 +- Classes/ChatConversationTableView.m | 16 ++++----- Classes/ChatConversationView.h | 5 ++- Classes/ChatConversationView.m | 42 +++++++++++------------ Classes/ChatsListTableView.m | 11 ++++-- Classes/ContactsListTableView.m | 6 ++-- 7 files changed, 48 insertions(+), 40 deletions(-) diff --git a/Classes/ChatConversationCreateTableView.m b/Classes/ChatConversationCreateTableView.m index 0e069f238..b0a0ab0ff 100644 --- a/Classes/ChatConversationCreateTableView.m +++ b/Classes/ChatConversationCreateTableView.m @@ -95,6 +95,11 @@ [view setChatRoom:room]; [PhoneMainView.instance popCurrentView]; [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; + // refresh list of chatrooms if we are using fragment + if (IPAD) { + ChatsListView *listView = VIEW(ChatsListView); + [listView.tableController loadData]; + } } } diff --git a/Classes/ChatConversationTableView.h b/Classes/ChatConversationTableView.h index 87d19bf89..62830af62 100644 --- a/Classes/ChatConversationTableView.h +++ b/Classes/ChatConversationTableView.h @@ -32,16 +32,15 @@ @interface ChatConversationTableView : UICheckBoxTableView { @private - LinphoneChatRoom *chatRoom; MSList *messageList; } +@property(nonatomic) LinphoneChatRoom *chatRoom; @property(nonatomic, strong) id chatRoomDelegate; - (void)addChatEntry:(LinphoneChatMessage *)chat; - (void)scrollToBottom:(BOOL)animated; - (void)scrollToLastUnread:(BOOL)animated; - (void)updateChatEntry:(LinphoneChatMessage *)chat; -- (void)setChatRoom:(LinphoneChatRoom *)room; @end diff --git a/Classes/ChatConversationTableView.m b/Classes/ChatConversationTableView.m index e26d24f6d..487cfd733 100644 --- a/Classes/ChatConversationTableView.m +++ b/Classes/ChatConversationTableView.m @@ -45,16 +45,16 @@ } - (void)updateData { - if (!chatRoom) + if (!_chatRoom) return; [self clearMessageList]; - messageList = linphone_chat_room_get_history(chatRoom, 0); + messageList = linphone_chat_room_get_history(_chatRoom, 0); // also append transient upload messages because they are not in history yet! for (FileTransferDelegate *ftd in [LinphoneManager.instance fileTransferDelegates]) { const LinphoneAddress *ftd_peer = linphone_chat_room_get_peer_address(linphone_chat_message_get_chat_room(ftd.message)); - const LinphoneAddress *peer = linphone_chat_room_get_peer_address(chatRoom); + const LinphoneAddress *peer = linphone_chat_room_get_peer_address(_chatRoom); if (linphone_address_equal(ftd_peer, peer) && linphone_chat_message_is_outgoing(ftd.message)) { LOGI(@"Appending transient upload message %p", ftd.message); messageList = ms_list_append(messageList, linphone_chat_message_ref(ftd.message)); @@ -109,7 +109,7 @@ } - (void)scrollToLastUnread:(BOOL)animated { - if (messageList == nil || chatRoom == nil) { + if (messageList == nil || _chatRoom == nil) { return; } @@ -127,7 +127,7 @@ index = count - 1; } - linphone_chat_room_mark_as_read(chatRoom); + linphone_chat_room_mark_as_read(_chatRoom); TabBarView *tab = (TabBarView *)[PhoneMainView.instance.mainViewController getCachedController:NSStringFromClass(TabBarView.class)]; [tab update:YES]; @@ -144,7 +144,7 @@ #pragma mark - Property Functions - (void)setChatRoom:(LinphoneChatRoom *)room { - chatRoom = room; + _chatRoom = room; [self reloadData]; } @@ -197,7 +197,7 @@ if (editingStyle == UITableViewCellEditingStyleDelete) { [tableView beginUpdates]; LinphoneChatMessage *chat = ms_list_nth_data(messageList, (int)[indexPath row]); - linphone_chat_room_delete_message(chatRoom, chat); + linphone_chat_room_delete_message(_chatRoom, chat); messageList = ms_list_remove(messageList, chat); [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] @@ -209,7 +209,7 @@ - (void)removeSelectionUsing:(void (^)(NSIndexPath *))remover { [super removeSelectionUsing:^(NSIndexPath *indexPath) { LinphoneChatMessage *chat = ms_list_nth_data(messageList, (int)[indexPath row]); - linphone_chat_room_delete_message(chatRoom, chat); + linphone_chat_room_delete_message(_chatRoom, chat); messageList = ms_list_remove(messageList, chat); }]; } diff --git a/Classes/ChatConversationView.h b/Classes/ChatConversationView.h index cf28ebac1..70d787bbc 100644 --- a/Classes/ChatConversationView.h +++ b/Classes/ChatConversationView.h @@ -33,12 +33,13 @@ @interface ChatConversationView : TPMultiLayoutViewController { - LinphoneChatRoom *chatRoom; OrderedDictionary *imageQualities; BOOL scrollOnGrowingEnabled; BOOL composingVisible; } +@property(nonatomic) LinphoneChatRoom *chatRoom; + @property(weak, nonatomic) IBOutlet UIIconButton *backButton; @property(nonatomic, strong) IBOutlet ChatConversationTableView *tableController; @property(weak, nonatomic) IBOutlet HPGrowingTextView *messageField; @@ -65,6 +66,4 @@ - (IBAction)onDeleteClick:(id)sender; - (IBAction)onEditionChangeClick:(id)sender; -- (void)setChatRoom:(LinphoneChatRoom *)room; - @end diff --git a/Classes/ChatConversationView.m b/Classes/ChatConversationView.m index 8e142b5be..d8760986c 100644 --- a/Classes/ChatConversationView.m +++ b/Classes/ChatConversationView.m @@ -31,7 +31,7 @@ self = [super initWithNibName:NSStringFromClass(self.class) bundle:[NSBundle mainBundle]]; if (self != nil) { scrollOnGrowingEnabled = TRUE; - chatRoom = NULL; + _chatRoom = NULL; imageQualities = [[OrderedDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithFloat:0.9], NSLocalizedString(@"Maximum", nil), [NSNumber numberWithFloat:0.5], NSLocalizedString(@"Average", nil), @@ -152,16 +152,16 @@ static UICompositeViewDescription *compositeDescription = nil; #pragma mark - -- (void)setChatRoom:(LinphoneChatRoom *)room { - chatRoom = room; +- (void)setChatRoom:(LinphoneChatRoom *)chatRoom { + _chatRoom = chatRoom; [_messageField setText:@""]; - [_tableController setChatRoom:room]; + [_tableController setChatRoom:_chatRoom]; - if (chatRoom != NULL) { + if (_chatRoom != NULL) { _chatView.hidden = NO; [self update]; - linphone_chat_room_mark_as_read(chatRoom); - [self setComposingVisible:linphone_chat_room_is_remote_composing(chatRoom) withDelay:0]; + linphone_chat_room_mark_as_read(_chatRoom); + [self setComposingVisible:linphone_chat_room_is_remote_composing(_chatRoom) withDelay:0]; TabBarView *tab = (TabBarView *)[PhoneMainView.instance.mainViewController getCachedController:NSStringFromClass(TabBarView.class)]; [tab update:YES]; @@ -172,8 +172,8 @@ static UICompositeViewDescription *compositeDescription = nil; } - (void)applicationWillEnterForeground:(NSNotification *)notif { - if (chatRoom != nil) { - linphone_chat_room_mark_as_read(chatRoom); + if (_chatRoom != nil) { + linphone_chat_room_mark_as_read(_chatRoom); TabBarView *tab = (TabBarView *)[PhoneMainView.instance.mainViewController getCachedController:NSStringFromClass(TabBarView.class)]; [tab update:YES]; @@ -186,12 +186,12 @@ static UICompositeViewDescription *compositeDescription = nil; } - (void)update { - if (chatRoom == NULL) { + if (_chatRoom == NULL) { LOGW(@"Cannot update chat room header: null contact"); return; } - const LinphoneAddress *addr = linphone_chat_room_get_peer_address(chatRoom); + const LinphoneAddress *addr = linphone_chat_room_get_peer_address(_chatRoom); if (addr == NULL) { [PhoneMainView.instance popCurrentView]; UIAlertView *error = [[UIAlertView alloc] @@ -211,12 +211,12 @@ static UICompositeViewDescription *compositeDescription = nil; } - (BOOL)sendMessage:(NSString *)message withExterlBodyUrl:(NSURL *)externalUrl withInternalURL:(NSURL *)internalUrl { - if (chatRoom == NULL) { + if (_chatRoom == NULL) { LOGW(@"Cannot send message: No chatroom"); return FALSE; } - LinphoneChatMessage *msg = linphone_chat_room_create_message(chatRoom, [message UTF8String]); + LinphoneChatMessage *msg = linphone_chat_room_create_message(_chatRoom, [message UTF8String]); if (externalUrl) { linphone_chat_message_set_external_body_url(msg, [[externalUrl absoluteString] UTF8String]); } @@ -226,7 +226,7 @@ static UICompositeViewDescription *compositeDescription = nil; [LinphoneManager setValueInMessageAppData:[internalUrl absoluteString] forKey:@"localimage" inMessage:msg]; } - linphone_chat_room_send_chat_message(chatRoom, msg); + linphone_chat_room_send_chat_message(_chatRoom, msg); [_tableController addChatEntry:msg]; [_tableController scrollToBottom:true]; @@ -322,7 +322,7 @@ static UICompositeViewDescription *compositeDescription = nil; } char *fromStr = linphone_address_as_string_uri_only(from); - const LinphoneAddress *cr_from = linphone_chat_room_get_peer_address(chatRoom); + const LinphoneAddress *cr_from = linphone_chat_room_get_peer_address(_chatRoom); char *cr_from_string = linphone_address_as_string_uri_only(cr_from); if (fromStr && cr_from_string) { @@ -341,7 +341,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)textComposeEvent:(NSNotification *)notif { LinphoneChatRoom *room = [[[notif userInfo] objectForKey:@"room"] pointerValue]; - if (room && room == chatRoom) { + if (room && room == _chatRoom) { BOOL composing = linphone_chat_room_is_remote_composing(room); [self setComposingVisible:composing withDelay:0.3]; } @@ -363,8 +363,8 @@ static UICompositeViewDescription *compositeDescription = nil; } - (void)growingTextChanged:(HPGrowingTextView *)growingTextView text:(NSString *)text { - if ([text length] > 0 && chatRoom) - linphone_chat_room_compose(chatRoom); + if ([text length] > 0 && _chatRoom) + linphone_chat_room_compose(_chatRoom); } - (void)growingTextView:(HPGrowingTextView *)growingTextView willChangeHeight:(float)height { @@ -426,7 +426,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)textViewDidChange:(UITextView *)textView { if ([textView.text length] > 0) { - linphone_chat_room_compose(chatRoom); + linphone_chat_room_compose(_chatRoom); } } @@ -515,7 +515,7 @@ static UICompositeViewDescription *compositeDescription = nil; } - (IBAction)onCallClick:(id)sender { - [LinphoneManager.instance call:linphone_chat_room_get_peer_address(chatRoom)]; + [LinphoneManager.instance call:linphone_chat_room_get_peer_address(_chatRoom)]; } - (IBAction)onListSwipe:(id)sender { @@ -539,7 +539,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (BOOL)startImageUpload:(UIImage *)image url:(NSURL *)url { FileTransferDelegate *fileTransfer = [[FileTransferDelegate alloc] init]; - [fileTransfer upload:image withURL:url forChatRoom:chatRoom]; + [fileTransfer upload:image withURL:url forChatRoom:_chatRoom]; [_tableController addChatEntry:linphone_chat_message_ref(fileTransfer.message)]; [_tableController scrollToBottom:true]; return TRUE; diff --git a/Classes/ChatsListTableView.m b/Classes/ChatsListTableView.m index 5085209a2..9af1904af 100644 --- a/Classes/ChatsListTableView.m +++ b/Classes/ChatsListTableView.m @@ -119,11 +119,16 @@ static void chatTable_free_chatrooms(void *data) { [super loadData]; if (IPAD) { - // reset conversation view since in fragment mode, conversations are relative to current data - // select first conversation if any + // if conversation view is using a chatroom that does not exist anymore, update it if (data != NULL) { ChatConversationView *view = VIEW(ChatConversationView); - [view setChatRoom:(LinphoneChatRoom *)ms_list_nth_data(data, 0)]; + LinphoneChatRoom *current = [view chatRoom]; + // cannot find it anymore: replace it with the first one + if (ms_list_find(data, current) == NULL) { + [view setChatRoom:(LinphoneChatRoom *)ms_list_nth_data(data, 0)]; + } + } else { + [PhoneMainView.instance changeCurrentView:ChatConversationCreateView.compositeViewDescription]; } } } diff --git a/Classes/ContactsListTableView.m b/Classes/ContactsListTableView.m index cb1c5ac64..29703d0f2 100644 --- a/Classes/ContactsListTableView.m +++ b/Classes/ContactsListTableView.m @@ -144,13 +144,13 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) { } } [super loadData]; + if (IPAD) { - // reset details view since in fragment mode, details are relative to current data - // select first contact if any + // if contact details view is using a contact that does not exist anymore, update it + ContactDetailsView *view = VIEW(ContactDetailsView); ABRecordRef contact = ([self totalNumberOfItems] > 0) ? [self contactForIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]] : nil; - ContactDetailsView *view = VIEW(ContactDetailsView); [view setContact:contact]; } } From af64f9977f6e57f12e73597caa0508db664ba905 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 3 Feb 2016 11:38:55 +0100 Subject: [PATCH 05/87] assistant: fix invalid length error --- Classes/LinphoneManager.m | 3 ++- Resources/linphonerc-factory | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index a61a9af80..a0e566802 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -515,7 +515,8 @@ static void migrateWizardToAssistant(const char *entry, void *user_data) { } - (void)migrationFromVersion2To3 { - lp_config_for_each_entry(_configDb, "wizard", migrateWizardToAssistant, (__bridge void *)(self)); + // DONT DO THAT! + // lp_config_for_each_entry(_configDb, "wizard", migrateWizardToAssistant, (__bridge void *)(self)); } #pragma mark - Linphone Core Functions diff --git a/Resources/linphonerc-factory b/Resources/linphonerc-factory index b59c2071e..c7e7fe897 100644 --- a/Resources/linphonerc-factory +++ b/Resources/linphonerc-factory @@ -19,7 +19,8 @@ display_filter_auto_rotate=0 send_logs_include_linphonerc_and_chathistory=0 [assistant] -username_regex=^[a-z0-9_.\-]*$ +username_length=-1 +password_length=-1 [in_app_purchase] enabled=0 From 450ac750859e6aaa93896d3b9a219b6d2d3dd923 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 3 Feb 2016 11:44:32 +0100 Subject: [PATCH 06/87] call: fix pad partially hidden by bottom bars on iPhone --- Classes/Base.lproj/CallView.xib | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Classes/Base.lproj/CallView.xib b/Classes/Base.lproj/CallView.xib index f2bc14676..ad663885f 100644 --- a/Classes/Base.lproj/CallView.xib +++ b/Classes/Base.lproj/CallView.xib @@ -1,5 +1,5 @@ - + @@ -250,11 +250,11 @@ - - - + + + - - - - + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + - + diff --git a/Resources/licenses.html b/Resources/licenses.html deleted file mode 100644 index 183077683..000000000 --- a/Resources/licenses.html +++ /dev/null @@ -1,77 +0,0 @@ - - -
- -

Third party softwares

- -

CAAnimationBlocks

-

Xissburg
-http://xissburg.com

- -

ColorConverter

-

Matteo Alessani
-http://www.extendi.it

- -

DCRoundSwitch

-

Patrick Richards
-http://domesticcat.com.au
-MIT license

- -

DTFoundation

-

Oliver Drobnik
-http://www.cocoanetics.com
-BSD license

- -

HPGrowingTextView

-

Hans Pinckaers
-http://hanspinckaers.com
-MIT license

- -

InAppSettingsKit

-

Luc Vandal, Edovia Inc., Ortwin Gentz, FutureTap GmbH
-http://www.inappsettingskit.com/
-BSD license

- -

NinePatch

-

Tortuga 22, Inc.
-http://www.tortuga22.com
-Apache license

- -

Ryan Maxwell

-

UIAlertview+Blocks

-https://github.com/ryanmaxwell/UIAlertView-Blocks
-MIT license - -

OrderedDictionary

-

Matt Gallagher
-http://cocoawithlove.com

- -

TPMultiLayoutViewController

-

Michael Tyson
-http://atastypixel.com
-MIT license

- -

UACellBackgroundView

-

Matt Coneybeare
-http://code.coneybeare.net

- -

XMLRPC

-

Eric Czarny
-http://divisiblebyzero.com/
-MIT license

- -

Graphics

- -

Kerosine

-

http://www.kerosine.fr

- -

Translations

- -

Russian

-

Maxim Solodovnik
- -solomax666@gmail.com

- -
- - diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 34a464b10..c8b423ee2 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -563,7 +563,6 @@ 639E9CB51C0DB88200019A75 /* PhoneMainView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CB31C0DB88200019A75 /* PhoneMainView.xib */; }; 63AADBE81B6A0FF200AA16FD /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBC41B6A0FF200AA16FD /* Localizable.strings */; }; 63AADBEA1B6A0FF200AA16FD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBCA1B6A0FF200AA16FD /* Images.xcassets */; }; - 63AADBF31B6A0FF200AA16FD /* licenses.html in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBD51B6A0FF200AA16FD /* licenses.html */; }; 63AADBF51B6A0FF200AA16FD /* linphonerc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBD71B6A0FF200AA16FD /* linphonerc */; }; 63AADBF61B6A0FF200AA16FD /* linphonerc-factory in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBD81B6A0FF200AA16FD /* linphonerc-factory */; }; 63AADBF81B6A0FF200AA16FD /* linphonerc~ipad in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBDA1B6A0FF200AA16FD /* linphonerc~ipad */; }; @@ -1459,7 +1458,6 @@ 63AADBC81B6A0FF200AA16FD /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; 63AADBCA1B6A0FF200AA16FD /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 63AADBCB1B6A0FF200AA16FD /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBD51B6A0FF200AA16FD /* licenses.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = licenses.html; sourceTree = ""; }; 63AADBD71B6A0FF200AA16FD /* linphonerc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = linphonerc; sourceTree = ""; }; 63AADBD81B6A0FF200AA16FD /* linphonerc-factory */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "linphonerc-factory"; sourceTree = ""; }; 63AADBDA1B6A0FF200AA16FD /* linphonerc~ipad */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "linphonerc~ipad"; sourceTree = ""; }; @@ -2724,7 +2722,6 @@ 63AADBE61B6A0FF200AA16FD /* assistant_remote.rc */, 6316A07A1C5F64330073BFA4 /* images */, 63AADBCA1B6A0FF200AA16FD /* Images.xcassets */, - 63AADBD51B6A0FF200AA16FD /* licenses.html */, 63AADBD71B6A0FF200AA16FD /* linphonerc */, 63AADBD81B6A0FF200AA16FD /* linphonerc-factory */, 63AADBDA1B6A0FF200AA16FD /* linphonerc~ipad */, @@ -3151,7 +3148,6 @@ 6316A3981C5F64350073BFA4 /* options_start_conference_disabled@2x.png in Resources */, 6316A26C1C5F64350073BFA4 /* call_start_body_disabled~ipad.png in Resources */, 6316A3531C5F64350073BFA4 /* numpad_5_default@2x.png in Resources */, - 63AADBF31B6A0FF200AA16FD /* licenses.html in Resources */, 6316A35F1C5F64350073BFA4 /* numpad_6_over~ipad@2x.png in Resources */, 6316A3931C5F64350073BFA4 /* options_selected.png in Resources */, 6316A2BE1C5F64350073BFA4 /* color_F.png in Resources */, From 770505cdb79b870742013b9be9f2d83c9c8688f6 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 3 Feb 2016 14:25:55 +0100 Subject: [PATCH 10/87] xcode: update version 3.11 build 1 --- linphone-Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linphone-Info.plist b/linphone-Info.plist index 7acf7cbd2..376305371 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -24,7 +24,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.10 + 3.11 CFBundleURLTypes @@ -53,7 +53,7 @@ CFBundleVersion - 9 + 1 LSRequiresIPhoneOS UIApplicationExitsOnSuspend From ccb6673a289dc5b0f4e7b6a56d70673b46c471e1 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 3 Feb 2016 14:46:00 +0100 Subject: [PATCH 11/87] i18n: add chinese translation --- .../zh_CN.lproj/StatusBarView.strings | Bin 0 -> 994 bytes .../LinphoneUI/zh_CN.lproj/TabBarView.strings | Bin 0 -> 3510 bytes .../zh_CN.lproj/UICallConferenceCell.strings | Bin 0 -> 1440 bytes .../zh_CN.lproj/UICallPausedCell.strings | Bin 0 -> 1440 bytes .../zh_CN.lproj/UIChatBubblePhotoCell.strings | Bin 0 -> 1996 bytes .../zh_CN.lproj/UIChatBubbleTextCell.strings | Bin 0 -> 1258 bytes .../LinphoneUI/zh_CN.lproj/UIChatCell.strings | Bin 0 -> 1182 bytes .../zh_CN.lproj/UIChatCreateCell.strings | Bin 0 -> 450 bytes .../zh_CN.lproj/UIConfirmationDialog.strings | Bin 0 -> 744 bytes .../zh_CN.lproj/UIContactCell.strings | Bin 0 -> 372 bytes .../zh_CN.lproj/UIContactDetailsCell.strings | Bin 0 -> 758 bytes .../zh_CN.lproj/UIHistoryCell.strings | Bin 0 -> 444 bytes Classes/zh_CN.lproj/AboutView.strings | Bin 0 -> 1922 bytes Classes/zh_CN.lproj/AssistantView.strings | Bin 0 -> 686 bytes .../zh_CN.lproj/AssistantViewScreens.strings | Bin 0 -> 25818 bytes Classes/zh_CN.lproj/CallIncomingView.strings | Bin 0 -> 4350 bytes Classes/zh_CN.lproj/CallOutgoingView.strings | Bin 0 -> 5462 bytes Classes/zh_CN.lproj/CallView.strings | Bin 0 -> 17652 bytes Classes/zh_CN.lproj/CallView~ipad.strings | Bin 0 -> 17622 bytes .../ChatConversationCreateView.strings | Bin 0 -> 244 bytes .../zh_CN.lproj/ChatConversationView.strings | Bin 0 -> 5790 bytes Classes/zh_CN.lproj/ChatsListView.strings | Bin 0 -> 1528 bytes Classes/zh_CN.lproj/ContactDetailsView.strings | Bin 0 -> 2758 bytes Classes/zh_CN.lproj/ContactsListView.strings | Bin 0 -> 2094 bytes Classes/zh_CN.lproj/DialerView.strings | Bin 0 -> 3616 bytes Classes/zh_CN.lproj/DialerView~ipad.strings | Bin 0 -> 8302 bytes Classes/zh_CN.lproj/FirstLoginView.strings | Bin 0 -> 3126 bytes Classes/zh_CN.lproj/HistoryDetailsView.strings | Bin 0 -> 4422 bytes Classes/zh_CN.lproj/HistoryListView.strings | Bin 0 -> 1718 bytes Classes/zh_CN.lproj/ImageView.strings | Bin 0 -> 266 bytes Classes/zh_CN.lproj/SettingsView.strings | Bin 0 -> 698 bytes Classes/zh_CN.lproj/SideMenuView.strings | Bin 0 -> 496 bytes Classes/zh_CN.lproj/SideMenuView~ipad.strings | Bin 0 -> 496 bytes Resources/zh_CN.lproj/Localizable.strings | Bin 0 -> 38210 bytes .../zh_CN.lproj/Account.strings | Bin 0 -> 854 bytes .../zh_CN.lproj/Advanced.strings | Bin 0 -> 1050 bytes .../zh_CN.lproj/Audio.strings | Bin 0 -> 1318 bytes .../zh_CN.lproj/Call.strings | Bin 0 -> 516 bytes .../zh_CN.lproj/Network.strings | Bin 0 -> 744 bytes .../zh_CN.lproj/Root.strings | Bin 0 -> 1014 bytes .../zh_CN.lproj/Tunnel.strings | Bin 0 -> 98 bytes .../zh_CN.lproj/Video.strings | Bin 0 -> 660 bytes 42 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Classes/LinphoneUI/zh_CN.lproj/StatusBarView.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/TabBarView.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/UICallConferenceCell.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/UICallPausedCell.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/UIChatBubblePhotoCell.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/UIChatBubbleTextCell.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/UIChatCell.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/UIChatCreateCell.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/UIConfirmationDialog.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/UIContactCell.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/UIContactDetailsCell.strings create mode 100644 Classes/LinphoneUI/zh_CN.lproj/UIHistoryCell.strings create mode 100644 Classes/zh_CN.lproj/AboutView.strings create mode 100644 Classes/zh_CN.lproj/AssistantView.strings create mode 100644 Classes/zh_CN.lproj/AssistantViewScreens.strings create mode 100644 Classes/zh_CN.lproj/CallIncomingView.strings create mode 100644 Classes/zh_CN.lproj/CallOutgoingView.strings create mode 100644 Classes/zh_CN.lproj/CallView.strings create mode 100644 Classes/zh_CN.lproj/CallView~ipad.strings create mode 100644 Classes/zh_CN.lproj/ChatConversationCreateView.strings create mode 100644 Classes/zh_CN.lproj/ChatConversationView.strings create mode 100644 Classes/zh_CN.lproj/ChatsListView.strings create mode 100644 Classes/zh_CN.lproj/ContactDetailsView.strings create mode 100644 Classes/zh_CN.lproj/ContactsListView.strings create mode 100644 Classes/zh_CN.lproj/DialerView.strings create mode 100644 Classes/zh_CN.lproj/DialerView~ipad.strings create mode 100644 Classes/zh_CN.lproj/FirstLoginView.strings create mode 100644 Classes/zh_CN.lproj/HistoryDetailsView.strings create mode 100644 Classes/zh_CN.lproj/HistoryListView.strings create mode 100644 Classes/zh_CN.lproj/ImageView.strings create mode 100644 Classes/zh_CN.lproj/SettingsView.strings create mode 100644 Classes/zh_CN.lproj/SideMenuView.strings create mode 100644 Classes/zh_CN.lproj/SideMenuView~ipad.strings create mode 100644 Resources/zh_CN.lproj/Localizable.strings create mode 100644 Settings/InAppSettings.bundle/zh_CN.lproj/Account.strings create mode 100644 Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings create mode 100644 Settings/InAppSettings.bundle/zh_CN.lproj/Audio.strings create mode 100644 Settings/InAppSettings.bundle/zh_CN.lproj/Call.strings create mode 100644 Settings/InAppSettings.bundle/zh_CN.lproj/Network.strings create mode 100644 Settings/InAppSettings.bundle/zh_CN.lproj/Root.strings create mode 100644 Settings/InAppSettings.bundle/zh_CN.lproj/Tunnel.strings create mode 100644 Settings/InAppSettings.bundle/zh_CN.lproj/Video.strings diff --git a/Classes/LinphoneUI/zh_CN.lproj/StatusBarView.strings b/Classes/LinphoneUI/zh_CN.lproj/StatusBarView.strings new file mode 100644 index 0000000000000000000000000000000000000000..6d87e3a1c2c71a8c087d1455aab56b5c7f7a9d35 GIT binary patch literal 994 zcmcJOy-vbV6vzLL_9+@BLjp!II2ac{28;&fLmj2%iY2us1&k~%u8zKgo1?4G;O+zX z6zZ>_1+|DZF-@Cu?>Rl^|8ei@i=}yGWouo&8tU-aTIJ2Cu9DW&Ql%8*x=ZTWTq%O=jfi)TYz0dlobnaZ*Ko!t6}k zcYL}>y>}nZ97UbeEAq3~;~E%LFlzo2=VTlsmU9OWmw#jU z8#O=fLluvku(Ub-2CsWW&bRw9>CE?Wdl{!gUGP2BzRth+om7$5@7wZY@N`wL&boIu HLq*;Ing*Xn literal 0 HcmV?d00001 diff --git a/Classes/LinphoneUI/zh_CN.lproj/TabBarView.strings b/Classes/LinphoneUI/zh_CN.lproj/TabBarView.strings new file mode 100644 index 0000000000000000000000000000000000000000..8758e3b7ba1774031cd058d1301632055e0f4772 GIT binary patch literal 3510 zcmcgv$xZ@65PfI9f^ZTNTtGl#JSZdzaY@7_-h^>vktKn_CGo(?nD8C`g#Y5*vlkC0 z>SJ)2&^9s!LOOIN-8DV+>eZ`izCL|eLI{4OP(>as4nH>d3*Z5784JpJQ0`^p(Ki zgls2x*7MHCF*`In#M!cA(Inb_G)7^HE12S9Ob@xY-0U%>i78LUOf<(JN+^gDVnnZn z_gv{@_Lx$3wpw-$S!C>Qrq&c(YhqkSosawHeJ{9Nh4g)rXlc*Rz80CfVBQ-xYgH@| zUvLbb-rz9f;H&~xV`w*ok4Nqw4}ff~{D zs%0KUKDklxV^mFuLd~__ikyd!?qjWSK1segag#8h_t`l~&cJjX#e2QlB`Xbt5ut9v z>_csizUrJlqqC5*F~6GTrIQ}9!{&&#f@RKkxc;SlorM&$*KVuof1X-1aEdHr&|q&1 z+tzg0CAa+&t4xKM VtGML6iEYMUm{*;J6uJA4;2Y~g9%=vp literal 0 HcmV?d00001 diff --git a/Classes/LinphoneUI/zh_CN.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UICallConferenceCell.strings new file mode 100644 index 0000000000000000000000000000000000000000..dc75b0893ead47b7b14204092e98f35b9e108f72 GIT binary patch literal 1440 zcmc(f-%0{e5XQf2p?4531gdQiTe(U5%{OztK2zFMR%zL~m8S<*T8DfYoygGH@>Nc_YHrM&QW<9)lyMCy0XY4_Q;ZHioMAq zzffkGX%zS6<9SehZ)~{H-6_^GRS3zuH^LNGsshq$@TI}gSsTJh)ESClYfxP!|Mjz2 zQ43~sI@cc3p;qNN7EKoa%VI$V?elFTx3rtkr>6XW_o>MuPbK2snXzb!o79mGljKoj zpD78DPvdO=!mOu9?u_R3J^_23$+h9NuVZ9D&5CpEnk-ghcc<}IU!=!N>XLgndUIkP lmZ?P@)LmY+q}Qpfnwns?bcQTpZ_gn&SuBhEwRthd{0;Ww;5q;R literal 0 HcmV?d00001 diff --git a/Classes/LinphoneUI/zh_CN.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UICallPausedCell.strings new file mode 100644 index 0000000000000000000000000000000000000000..6ad6c398b6212f83486eb95d19c777fd2448970c GIT binary patch literal 1440 zcmc(eT}uK%7=_RELjPg$QdqMuf})%3qP5tBG%&hRG28HiYSoG^qMzlTDCp+|)#I8g z%8va`#6O$}NzMEa`B z=bjJZLC2icIcY~Pl-TKmZ2sIm;ryCa1H7w)26qp4wvpBF;Kf{de<~t&x|8f09a0m&JgJ_Q~H7_3PkdUpEU` lG$H;si+Sp9hrZ6ZrmZE_YT`fdQxhVGYbM^AWziJZ(l^9=kK8mejWgz@P{Ix8KEI9Jj3n_% zd=^D4&4eZ~J>{)>-?dms9PwD2RG^P8&ofZ7`5I*5DWxJywVs~%ePFIFd}=E7#fMou_p8@I9!Ck)z8?d-8VA(D2i2Ii&)LVTa3Z?TZAHt={)*d@K$T=RvNw3*t5cw=uoQ_daq!EbB6zP`+*7&MZ~QD O=Vq_fpARiG621UIk2aJ5 literal 0 HcmV?d00001 diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIChatBubbleTextCell.strings new file mode 100644 index 0000000000000000000000000000000000000000..e3604cdb64ffbb2e57cc777ee0c34f5b70ea92a3 GIT binary patch literal 1258 zcmchX-%7$@7{;Gtp?erYC&CQLPKr*N5Q?aj1v{L}Y~i1nW(gg11JPA<6W&BZmlIUK z>834)W>JiN`}V#6p67Y@?)@#LEoEfLQd^GtT!!|!(>hU6bv1RXfllSIyWw;X+aNrR zJj?3I=gh$CiVWB4C_BAo{#7+}iQOf#sKUI0C7YTiXXmUv9Vj1G$bc%vKFK3Hub-Z0 zT8hd0_;bHNxcvKx};Tdtaz}>|b#0`W)6sk0TDbeW?OYLrmJ*>E3kEPGB|%TF+CUYkVh@^l@Myxpga3wKLBfyW zU?RTVWvL%E(qcBd+3w8jym|Asi+2lK$iqezeF)rf*x2WE&_)e)o}I&|&A}c|1ui&z zK5;a( zFMjJkYAK_AsWOLO`(38U*Q+2H{?;pLS)(5*}F5B zIs1MY+ITpOII!ZP<hq*!(w@!2Yi8K`ov`$?+R8SBMz zCMo-8a!aLd&Ep2w}7ew)b1`yc+O literal 0 HcmV?d00001 diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/zh_CN.lproj/UIConfirmationDialog.strings new file mode 100644 index 0000000000000000000000000000000000000000..bc1a61e59d143414bcba177be885b392ab90f1b6 GIT binary patch literal 744 zcmb`F!AiqW5Jm5{`HIkGAr)~cqD>p5SQNEgiAZB>X^BrrTCMH`H{!;X3%|l|>j$Xk zrD=*1$wnS|Oy=FWGk0dbJ{@hSCRa^G>MP;6+Tp9Jr?z~}H09jL;MvA+uwz|=jnvhc zw@AZ0rm2Pw;R@8r@J9+Y0dWbktyYfowW$MnV14c_Sg*2(8WlO%MTq(z`Kvka?+P5a z{!?Kq)fS*VC{cKd@?*5csP|B}&)>3#D}_afa)s{6;LY-sDeEw!klaz0b&5S_3aj}x z(#l-j)B73Tgxl7-_T0f>(g?c&t_CUF5RXOK4Ty4djFn{XcGhDejCMe4A(5dN2o)G?fmn$ll);n12Pl@rkP4JjVz35^CNd-gVJcW% zCQv35D3i%h!cd8%5~kk`C{qMfS;CM9)Rzm?1u?@Ps4ol1O9sk#GPuC)GlR-&0bRre zWScSQ5oMne+yvf`@Mw@7TtG;QuS$TfsQ|hL=5jBFe1;65s}+E*%O}g-FcT4OyO6%i H58^feT?shG literal 0 HcmV?d00001 diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIContactDetailsCell.strings new file mode 100644 index 0000000000000000000000000000000000000000..154f2b973208121aaf698c6faa33dd2700d7ebbf GIT binary patch literal 758 zcmcJNQA>kx6vfZ8pF(^~&>(t?AhsA8gE3mg_U6n@McgO{8}!ik-FI01)XfnHu3%i0 z>%HgxJ?DS!_s-CzY?h|z)f-u; xJG_sz^cJ=@O literal 0 HcmV?d00001 diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIHistoryCell.strings new file mode 100644 index 0000000000000000000000000000000000000000..62b3dd0ddb9124a6e3211f4c28b544ba96a516fc GIT binary patch literal 444 zcmcJK%?`mp6otQa6YtP;*~Cw5#Y#hpupt&!)iiAdO_&89%~NK&XlyzEnyoCB<-fa~Aool&zeGjdE+H z@;}DPEp-c}_;_W%BR!f_84zo4$m2Z|t{5$yKRIe&F*#+I%49abb6BchCO0D9i@2Ds XPe!82Y*A)^o2}^j;y=fyQOZ6g8os#s#P$Bm~f)3wKb6RErp>Q4<$_f#2ZPU+~vR)H4IE z0@qY2x#{b6dheXaOg}$T$RPs@hw#zHn8U&Wk2KCuMU8VE^!P4~ea;5Ff8aTcslmey zZqdh(*WN6u!EdhkIQ7V6J;yC5L+* zHj&LEu!&@Z%UC3ZB_stSlK=0T6z3aR+`$&Mc~~f`dOpux)kstlwTBpR+)*`;IrG`6PaGHDav%oRh&g z9vm_}Wh!*D%$VG~dJgMgV6m1gVr@nhYiZ8nlnvH~^Z?;O>e;7bgs;sQKRB%7MIQ1- z9@djdQb#OjA=NNa-9^7-Tr74t=Z_t3HC5ucDAVQA^`tvbH4=SAVd?Z9E5Oql2=Mr$ z*N5G`L1!ZvF`KAa{M;M>H%rgH13-}iAoMBrRf? z;d1B9&*$}V7f^wO5?WZn!j4u#oi1Vw4Sn9(aG4WP9v6y$UEg&<{p-yIJol$|w&Yxs?iZZ(wZ}XzQ+PBf%{6BXy g+G||)CQMy7{v>SB_8rSvuP6u&Z`kC%k_38~9!od5s; literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/AssistantViewScreens.strings b/Classes/zh_CN.lproj/AssistantViewScreens.strings new file mode 100644 index 0000000000000000000000000000000000000000..33822f67eed163bae0225459f03a1c2544925dea GIT binary patch literal 25818 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 PJMs5IB?w8%?a}&w@nLV{ literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/CallIncomingView.strings b/Classes/zh_CN.lproj/CallIncomingView.strings new file mode 100644 index 0000000000000000000000000000000000000000..3de4f40f671cfdb31196da954ddf4c761292d025 GIT binary patch literal 4350 zcmd6r-)<5?6vodrPeFRwIEWFUjWH2uqu9DF2CaD4g%!3Uw02uC@xqtsOY|i)zK)6d zo8@2F9lJYVv6*x`J9~Ead~?3@ozwpQm67|hDOssXPmblBk(DR>Y{+Y=NkuLsU<{jM5PF#k~N~M*1bj=L^b)yS#>zoH^jn|;pEFU zv8skK4#G1J!Z=?t*Y}?ia6XXj2vWUb8@Li5{U8pLz1jbjjidW5%A?w)|A z3uklEX6DIL`0C3k_nNJJX5A34$I1YNodk>}*^>97*vaKOV%Jdwv&kZdM`OR{EM3mC zyTa)$kiX>w9+CwL*17Ow9D!-xnk;O&ke2sxb?S%F)Y;IJMyN|YA~0n|O&oOYKwhFe zjyz+%DrIzQKOy>67%~9wkfF%28t*NlHd*B0ndVm1n>iP5_QyWv=I^bFewS?4tUrUz zic_mFTSRZNSU-9jwX>;Ad&KcM$h*`ng;EqGs_Z5UTh6DgUjJ9?>yn52D$F89?lk39 zgbOAM+q1B%1#uOyVM6+PUI%Rl?Azpkk|T5_AHyEEu*IHM`;sc)3$#a9z$`tMu7Kl= z{ag2SM18D)svPFH2h%Sj*i06t`u4qZ?dWeMsn@^tU*~2W{|j=+)s;PdFKU#@Vio^a zW1Wru`1BrHf7{d&MeS+AzeQ{&3tQf$)t~j@KBG%>KWMPXst;(zx?ewSvy2?CwJ=x{jCgzVKu{K%U7V0EzTCRuB5>4~p yz5(j1GrS1n6`gfiKE%++ElldQoM%Z|y)G6E$#mUk>;EPwI*VcK984C=v)~UKf~771 literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/CallOutgoingView.strings b/Classes/zh_CN.lproj/CallOutgoingView.strings new file mode 100644 index 0000000000000000000000000000000000000000..8901ff5dfb4eecc712c904c8b0bc03a6a325da19 GIT binary patch literal 5462 zcmds*UsDoM7{=e5Zu}IEmrhG!iZx9$A%tlLs6^r&iz`UvIw~Yi7hZJR$M8$|C2G3w zGt_-E)$bfwt=)s{$xx=*;jnPtvz+Js^E~h2=Z^`wC(|-18EHvX4!I`fF|R3kDa%}M z__i*dlx3IkE#E(4wkkC)PuuT`%Up}sk#uF1IhUE%#d9*^%N}!T&5>T);a+_{=s&H% ziY9B+{IX;(RwiXjo{7Wi6yqA7X8J3p+4ThXCX0mrrD409y7-mS>GyZ%`MJu+qQW-8 zb(KdJrOhsnG$wmrr2Br`=Lx;lgRswn*#mVE&p0wG1!;t^n=EXxpVjV`MvrN zLoq*;=b+t?ZN@6G&qXjtEo?D={g7K_9h9Xuqm`U1s#(?QC2!e;zKX==kRu z^DxS0$PXq9+bkHb%um5&i=fTw{BOc^sSsw9g)Qc|nSVWw%Tf!qehmz(_%s>+0^Bvt z^ZU|?UfW8PjD%NYDem$-U^vz`P|5f~wEYN2t=Ib!7kvr=l zKbS0Rv*2bbev#d`sQ}d>_>6&S57PNO*bhNn(G{>QE8zb#2TT^W*uT859K@-BXyxx| z?NVJ}OG>)OYk@A%zye)j38gBKxq04IADM=+SNj+Sqt5X>2jni}49_S>P)98isH#%Z z@NO=Z@9O=GR^eu*H8?OL=!r_5t5HYe8jr?e(ar@Hl|R`52Q zwiQBVvapZaO`Otf`nIO*!1fLdw!)YruHnwbWMPXtZr>J-wpk~xt6F})L&?aAMqQ2c zDJF~YR;>-rsUGV7ItEMmoK6(-6l)x6I2}2kn=EXj-g3WfHp+3T{NJ)vn_grMTw7?7 z(&GkQNsre84Ki8W9!uFouFHQE>ZIZ6e^%<;w?o)W7Nd(?v|?@e*-l$e(4ILR*DhlY QEiQ(zn=EXx|E{gS0A&PH_W%F@ literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/CallView.strings b/Classes/zh_CN.lproj/CallView.strings new file mode 100644 index 0000000000000000000000000000000000000000..8d518f14a2d12ee425f1bd41cc8357d359453fa6 GIT binary patch literal 17652 zcmd5@OK%%h6uv@2sQn3DMO{IqDS1Cyu}I?P*~D&~mkSbP96u7s`k`f zYX>-lbU)PRzZR}!Up`8HH-;nmmZ4n^^s9#JzFJrL0N)@&%GX;(l-y4>*OO5T(mK*| z^ekZx(yT&?JQvB+V6l>3x9dvYjl}ITnEnk)l=>Lt@3;^j-;a2-wW%x zp$61ogiHq29IV$-(`p&l2J|;$t(-$}EBF6m)c$wpWkw=dl_3!ap2o$MB)Aq}6+}oi z&09sXOrzvCtcD~9oO+yk>d zcrc2;HC3@Rm_u-p_e%DMSlL|^hXOdXk?~MQTf+0+i7js8e=hR<9{o;3`)8wrVe%V? zwvvUmbbc|2?=tzJ(OM3{@%!h~pGstjL+yB3Y!uH$tlz6@NEZ(@SE^L%czE73oRh2B z+|rUeLe#NqmT~M8f!=?G`d(lJO#HPrr0Igp~7p#ly$+t;w@)MrOnr zbr02?gG`A0ZWR_>2rv#Jq>M=dW-ZCG&O^o}{8|my{RnAKfpZ?LYtU`-Tl4Vieraun z=V@TbXJ=6DIMDW7pkKiuq?~{G`kPo;VLCB+1|E#MOATG?4a54TEje=tDd%)za$Gsj zK(5r$XyDla<2Bf|-<~;ylyf?AHhFKDPS3(`?}B9wY{_>WK)3x|IfRs}w~Ayv_A>l5 z#pfnG68UUz0uY^7&w=>@xKC*xPSwYhwF4YNx&!x@|IF8)yz0d9-%&M$tUo*tKSdS% zl9uot?9i6Qk3(>E!<*_4zu8(Zi;Rr=tw%Z%)u6+sx;M2Rhv4{`TJOr!c(q=49(W0w zMspgk3XIAzvar)OSk@pv2cOFavSQJOM~s5e9Uv&C z9>Vkb{SSxWr04&|C|_gSm}Jhl0GZL`vV^Rm2Ug`xCpVynCG{a*|L8S?FwQwt1k_C{ z>50@a_}jBL4k4B0waTkUUp02WI9-u+Pt1hKOlZf{SVGLqFP+Y!%x`tOW_fQc2S0KL z(wTxMaUiEdJp3BTAvleU+Z*f7kB~MN&-4$%wXOmmLNT7Q*L7s>ioy7OI8UV0gEm$JV#U9}7&4sTmt znnOq>m4=r#(IqS%t$-Vyl9)tZ;UIT(k?Hy+$04Lly;UR|kIwd;!)uupcpr*B1w1>j z#&JAszCnbP@7c8^%bL!TUHpXM8Y;S8?1PIe#DV135Xt0AQ!*5*+)k(5^h=iE4ilxrGi8KdU$E~H3)Dg!S?zI!HM zy&OWyG~PVk&Ld5C#PneXIn^O=Wm7KSVbmFbI`mi`tL}VepP4K23Vg+@+pD%}y@};;+-x zFs2g*RdhCJHa8f^Cpd(ZcUn_+$@zk^o;5o-4@DYIcfYhPiF1hLn9pMOy>2&6R7)rQ zQArQo>&sGpNq6JWiMRv&^YYE}^`Fkpcd!rM3BL|9ExXgfA*8#p{NUC7=Zk}d7b%>< zHGSAHi!WnmX27_E7)6@D0MG5Wcn%?DoW?nOiPl#zmmUM(JnBc{evD}4XU!p`tkbgh zs3=CK%1F9%sF~^73mfnr4A*t@BOD-=0@<2;dS3=^>deCWnwR_EwQ>JeSS1w;@|PAL;6Og$p~kyY(DG$~*o{ySu*M z68sh2y=pqpVbX5kqyn82oYt(fkhPt^aR@2vzaICs$$um*?|7Vdbd+{beNg1CA(QD? z-i<@No1CNWnAw4R3t-vQ{Q=T#d%Djdq+HXuVW|hOLdrOu8Z0V0-Gly8rP@AM|B@y|@Oz?r71WXBG2v0Q*ThmbN)r>iTy zv$qYlWYhh+*U$%#X3uaqgp_+aclJij=Q_}D>g&#aSmLr7Vl-rM;<6H=cf literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/CallView~ipad.strings b/Classes/zh_CN.lproj/CallView~ipad.strings new file mode 100644 index 0000000000000000000000000000000000000000..61f8e503b4b1270ff0972bf39eb7c453860b0da7 GIT binary patch literal 17622 zcmd6uOK%%h6vwZS5TYM}Rm2J^4J2t^1+hqzrfJhW8aEFE62y+}q)wVNiJK;3Q6Ux} zgn%6@Bo=HDTlfHMSipiUd z@$8$PTW&O`H-B0hsmm{(<54EtBUX0+7vU;9*7j^${3Sc~c+P`x-f)5Iy1QJr+`fA= zu>%^yx*zVHAL}nH{`ztGyD^r_w~clM=vSBPfm?UA6yG$$$~Rm^p4=a5ZYZN8q;=2B zF|>qhNOKD*4xpoZxsn`4a>8j9?GIpe#9!g}M!KvaUI7>W>O<}Qx%2%(5lQ8(e-P_= z&0TOKIWie>*RbBeU2!+L?xMfbiIr;zZRPP_%-jF|yv%qmt2Pn|@H7psBEhv3t2Dx@ zY2hl$Wtu0yF*k~oMe~Gd-JQD01XB%RWg4!cT&9=M!yfh^k!O$VR*sCvK#Sj;fxBq# z3ehNTa~i_R{MQfa2Sx0$KYf1Es5$QD{T__77Xkisl^7l00}Wx_gDNBH5)rWni@ex5 zj;9)h^SJk0ZJ1w3F;63`%-?Uny;Q#RM{_iN0uLs6!l|3%x(erLccSQ`A*@`(Rg`Pv zi{v;*Tz8bXV_FD!mjD7(w!P=`a0j7Kus7SH=Wp~WiPdR zM4V*3GRYoEF7+rvPUDaDt=017 zeF@f0xP%O{{MQU|xDDHFe?2CuZl*Y=5mwH>eEM4jj8|c?iJT)3oW=PH81dQD)Hng! zzLe@xXb3CkA3plLP%hYCd@34~XYpXtQ`+?v-Wb+*B_U@GVdY#+OfD+tS>!5xj9s1s z7_VX1aeLMfR?gMPIm&jkbowfOdk>af*oyDEi*CocY6vUWa24fx?3?&$iO+|4B=Ol{ z-#_Qr-3Ed6&^JnaYH9UtVsph<)~8*hO{$ zpR1*^XANQ1&aazet!M8)4gHMw-v?Zl-&rJon1Im@5E4s|@wjonqaifO#eXr+$0Y5` zGF6;MW-_O2ku3~hQQ<6d108I+mw5f<2Mn?}FHs3d@2utLPp9xtPTDktRhH*Fe|`Mn z?%umkLz)-e#gaIsXHL;?StS^KQ#3uc_rR9$9ygH74E`fPLdQJfx~L&ET`bxI>(7IT z9yTB87-Z{P2k#+KUGmj+a`b496M4rabT^5x>f43;uXT#(T7R62*WME4mf_p>Q_w+b zv(tn$HH4LQHMMs%O~{h)G9E>GD^iI__jZB*$2C_&Sh4T;g0W?UdL}mU8%^rHH4MpRr2ZOMl=eGEOI-xN&%9*QnwK z*@p)CM}Xwlh+%Q*YY6LZRCk6j(%md=Un9GeImawarG~wjib5K~%J=^@(^@Ce$hpEv zd|E*CeG{3-Wvn5roU6&Ji*~;^;3!j$%j6rpRS#FT%G*{V3c|iB@se8p6uDDtph1Vse5^qtz0>A*`%_ z|755q{-bPp7vp@}N9lm-Ln3#VOy(rv-897ilXKoZF}IO#9hQf_KOnlDoak!^E7vOS zi77f$-X~T`elqD#jcpOZqCJZImxi!1u4bkj^*qDan`OiMOxlI<9qLV~NCwGXFQeV-R;3vYFdr>U&=gk6djLyF%4nmTE%?Ma`)ybXCvf%jGU{GspKtAiNslJ2rKJ{cW?d+ahjA2 literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/ChatConversationCreateView.strings b/Classes/zh_CN.lproj/ChatConversationCreateView.strings new file mode 100644 index 0000000000000000000000000000000000000000..dff95f3849bb047d9cb3a8fd8ee8aada0a53d513 GIT binary patch literal 244 zcmezWkBdQ{L5o3w!I>e4A(5dN2o)G?fmn$ll);n1iJ_FC1PJpP@_-`NK=DL|WFSlh ztIT9bV#oyQ%LJ;ZWbgsXB>`n};3hbMRcAwW`U7RNfbz*e)t(G4a8+pxen1gjpb1Gp jvK(k~8dQfC&~02mHZ~P{M7cx>Zp)Sadto3Sa4`S?>ij8| literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/ChatConversationView.strings b/Classes/zh_CN.lproj/ChatConversationView.strings new file mode 100644 index 0000000000000000000000000000000000000000..07db35f9290764b551d3b27187fe3e891e1e6203 GIT binary patch literal 5790 zcmd6rT~AX%5QfKF5^ue3Of-h%pcD{^F;U8g1gJuRig#@(aOejWTSQ}`m);mKCjJ=z zh0%EFwg16HeRj)f?YiwbTXG87u(W&TZ0DVseP?F>{2r2Li_d#L5-(+mXL+8KTRTi^>C)+&k9fMr^8(TfGSiZp zI(#^z4lyfrSj418+E72n$1U#~x>ziwV$>jz~WEsuzzAW}P#jP{8j z*tH#3*WXX(o4XArvJz6`EUEL+kb_W9Ov;$y3AN(ti6E+Nza2m7GAI>Z#Vch-SnRFJ zhIlYjhItVi1-=frV_g21=*J>9z2db-3JX*z&G>44Z;)k{bB|^PxN;5}I)nM1f7h6@PE- z;*Et_Y@l*#@6#|x94upjb)-GyC*+P{2b+Ye9j?6ja2zEL%uE!pX~5CfVG1;NUJw|3XO0d~&!vZ#m zi)(@CnLJOv_rW|y2J_?r-{uYEHVIecQ8W43{I2RqTh)}1Zkip#j|``3*iGW2 zGr!p+`tiEz)z7D^3BM(%(#K4J|45!P?_-l?!wNPDS1a^;ix5;yLG6}C!vyT4Zh;Ot z=LfoKufttxC9H0%k=s(B%*sRN2K|cJwb>+WaUMmFuyZ~5ex(M#wct%uXjog;I*3@cv{MYA@zwi}jZR16I8}43|5y{!wWkZEW&23fs#6p zeD_o&E}^_i>|LE|F~Bzrk@OWcSqwP6dNXHpxwnT=IQ@533nfd@_55V&WPDvr zZ<_mJm=Y~Cyg-8z9iL!wR>tO3dCrKTdxlig59G%xz|F$mn~n!wi@{Na>LM R7?qp=`!K|~?1$xL=?kPw@vi^? literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/ContactDetailsView.strings b/Classes/zh_CN.lproj/ContactDetailsView.strings new file mode 100644 index 0000000000000000000000000000000000000000..80f9d16189bc1d9ea0c10700d5dcd16f766b0ffc GIT binary patch literal 2758 zcmcgu%}&BV7@Vs-fak^|N%5dji18re4@N*hg?OWA07Xf(Di9NW1MuR*_!J&Id)8+l zQKwr9VO?!ER*<%JY6i3IXlIMq zowW<0kgLKG_4!$w3=zjLv4bw>GrD13;-^Byc%B=}Sfglds{dvUvU|DRyTQ$4HVDJt zxi2+j>cry5@{&$B>ERCN0us!b`-JDo44KOaU6;!7__@_j-z`R2rzQq#spZQtM+L9Q zu8srFZEW&-lA{WtQu3+xAL<3Gwldbq#Kau+F;U`GT4JR_=qeYqBE$2m(`TC;Kl`?f z4dK`-uE~Cpwdy(D^Q{V@%f6m}?Hh%|2PYOk&xV%)KjuX`*+h-QqytXr>Pa`3@fD%V zT(@GwV;@X^i+wpy{uOL--o^?ZCKir;m%D(1wtE5o5%Xit8#7~9zP0#X+ zKa6*3i(P7ktct8&Q+x@@RjWd%SpEMyHP{!OO;@(bt%P&VyMpgzb*d1$z8rt`eF8u` BwT}P* literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/ContactsListView.strings b/Classes/zh_CN.lproj/ContactsListView.strings new file mode 100644 index 0000000000000000000000000000000000000000..67f3d75c22ba791b3f40d195ddd212c53c644e39 GIT binary patch literal 2094 zcmcgtOHKko5Pe%Yfa?iM5->)>b-td{r%;`8Uiq|2OD|Zav0d=Y2|IJ4+ zA$Y0e7SBfv1rA*WN=@TVJ*uIOdPd#5e$6iH#80H^m3Bpi2-Q!<7oo)^f~>AhzAxzC z))2c{cvb$mycVnfeV(@H2$LCz6Te059c1}lM}|x&k3proS$Jh&_2IcIqE16R>Rl=a z(V5!BFzAIT*0Qc(10}AuSnERFqUH^DL9x>0EH72xWE|B~P3|;Mo5IQ=+1MZ-HK~g- za!6~exLJglsmgcM_5L^GY5dK1PsEwM%}1b^t$vQEo-}!~cxwd7yu-8jtsXZEuj;8} jKA((i;bj&DEt>%c2fUqwR7i<$o4573#(YM literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/DialerView.strings b/Classes/zh_CN.lproj/DialerView.strings new file mode 100644 index 0000000000000000000000000000000000000000..42da376c3c00c3a7e4b6f78a1454cb5cedc90494 GIT binary patch literal 3616 zcmcJS%}T>S5Xb*s`v9Ipj~=vb(hm_qTNMj}NUOz@^dn$3w$cx%;2U`8!N>CIRbRjd z@TSi0WEZr8F5fiRoR>~H^*oyqrC0$bRCgAxMN(I<1TOIH%-D5DA=BMfkaHr)ki zk$;Cq>u8es^7%FzG#bz~zynTbtRbIO?>R(=Mtt<-JTbRL)(dCz`%Y=j4SAaMWElsO zHF#mX4O(S_?mcWS6+1b3!}HibOV##jB2I$rKeYF9Zv^i(x^fqohWBZfuY)1(A2#+ZVN3lzi)o9`(Jx7u@CgCV{Npe~em4E7laN!!0a1^^Fc`b>`zlg;A zwBsmtNeWsLm46XQ)>spcVwXgnOz~g5%D;#tXH3FT?2=@(nyCDXNb<%c9K|k)I+@}% zQTZ2<6pTqYid~Wl)zmsw|HU1SJ69it$F!>8>g95o4rjFrsp?;xHr`x?6dqF+j$&7v zV^XG1-P~erytz6lJf=LqW7(xD%HH@^LzPB>Y9y1ZZ-{-SWUu4*3;S8OFaH-D*`Yf0 vhamb?@nwmBg~j@1AZ(hHeWs+kHQ3d)M6>~!o_4l}5VYo9#AEfN!n*zdQr#jq literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/DialerView~ipad.strings b/Classes/zh_CN.lproj/DialerView~ipad.strings new file mode 100644 index 0000000000000000000000000000000000000000..1d458b6c5b5cebbd6161be1291b91f65c558f8c5 GIT binary patch literal 8302 zcmdU!%Tg0T6o!v0tMUM@Q!J?(4VeI;EUV-uw@83+32v-R2nvL7SFn5o7c6`%7jE3@ z3-|!;)W5sag!FVXbD(;}nj#f?&ZPT0mp-S@{P~@uCp1WTnxr;0=mb}up5bqR)@Y7a zsYT~>N-t;!-`cc=@u#@kpeC-Cl;5EUciZ?or3 zpWY!t3fUxT7QZB;i6q+pdL;baPR-(%q?|~i{jWzd%(jV|#V?88ncNYt{jWzd!X{C( z_$4VO+C=+bk7SfhqGs_+qIV{@O|<{@NXl#yHH%-88ggm_+5hGWCyeDsF~ZF%^!m$Y znhNJ`8B*szmu*V13@JvqENT|NwwZ-xPEgI=Y@1RnPl^#P&-JL*oWT+*a9__gaKXxq4w zY0Vl!(DJK@kE=gx{_U#Q>e@{T^o~X;piSDw=L#aPW!Tat!L_Vfgpq~aA8Zm_;_GYiyB{ZIbGIhu zVfh*~F^Aj~pc2`q4a4>}39crR*5_9{>8i*@MExOjP)Ak{WM6dB(1cBbtBGtXOnu6C z`F|CeY5|nO^8;k+2)*(Cz1$|jWlh(G`qv%#Dtum4DT~m7$ZHG8aHcNe5?o#UuU-4w zYUe(7_G`%G;+;+t(Jjth4Om{h_h@wO?TVH)#L2Go5Ro4*;2)-k*d(|f@^B?;PHlZ% zD&2#=M;$eu$Orq#kO9tVYuFY0W5OoECC;KRlGJ^xBkpIx_>!ja*#xidq3BA$Cc!1m zqC1!FOdVmjuY+_Qtb%$x)~&NiaCx&iZ|e@QD{dn&iYl*yGn%k%m1Ybtwn=bVvv@;s z+ns9{>|*DdhnENFJyhtGp#hr&R|8q@T>4Fn%jRdOVJlz_v3H3oZZ_6qu}N@=)hcrI E7bd6kb^rhX literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/FirstLoginView.strings b/Classes/zh_CN.lproj/FirstLoginView.strings new file mode 100644 index 0000000000000000000000000000000000000000..2dc0e549d2e30a782f78e5d1fc453da0b2685b25 GIT binary patch literal 3126 zcmchZOK;Oa6ooI_Nc@K?D^$tlQD{>k7J1TCZ4>e!Do8*cPMbDKL-P&`7O?B03w{hc zBsMHrvV~s)d>+S%;!YGB3>tOf+Goc1+;i_4|N0q{+p;ce5|^fwrOQ~8NBo7QC~1jF zUwVvlX>;cx_sddcmh3#ob8a}zaHolwXQ8S_1lpSnDKPK3~Nro zRY9gDFv2zkSZ`&7k1H8_*wb|GK-FhM^Z^TXUVZ}qn;!LTYyUXqfdv!W=IT*0CYCPMsU7^37G;zdp4+_=bVs%oBE;6Xod)ItYhw$4;;j^z-K~&@aV0OKif{H## z*I2t>;P7MA>8qD z7~Y*Shzuk=t2{*23B1d6tih@X`CnwOL-=LyRsB_89`0)H5V!ZQtO?(wN3g8pFBao1 PPL)NjI>fSyo_FYP-$>hT literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/HistoryDetailsView.strings b/Classes/zh_CN.lproj/HistoryDetailsView.strings new file mode 100644 index 0000000000000000000000000000000000000000..46f701260e5f5c6cc1d54f5307515f413cbac3ac GIT binary patch literal 4422 zcmd5Jg_d~1Y`~7)(lH>C- z783o+-0*~-*T1%vcR7wpXe#LOzX8GT_YPm4;NU zq{X^*_51S1dtJNTNP>98NqY8lq29CkFl9Y;Q`8mCCVSQXInNX2lVocoWx3A zBWE2d*rDnIYXtGBBi-G#Z@eV_Wy_)>S{x4X1e}{=`kTx}0WUNz)Jj^#nSS4tb<@}2 z3S(4)%i49u`IxLPX>pJ&(#9pq#HZ5e9(`6CZSmd5J9^#4A-Pi3wa=$c$h*&#fR(0g z$U+HUq?NeJN)`*$Sd=*EmeCiSV9$yK0&55%hQwmBbSAD)I+vXHc3_QJ$`wn~_+pYX88=(y}h z8l21QV-_{Ml0{m6llC0h5SwbRLnX^yRh2dGi1-(o(=Kh6hTTqF0VIpGQ84*u(!=!c zhE2voand-VN#c7s>ze+Amp1`JS}DnLdj<%<($;+oir;d}LR1 zuI0F7FFxK>eSWWMQX{|KW!3 v;1m}`TE-X79zJ13%Ld6p(n9tdezwf_SP?wNpvbP-r3yY{M~j4Hk(K#>OrO3? literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/HistoryListView.strings b/Classes/zh_CN.lproj/HistoryListView.strings new file mode 100644 index 0000000000000000000000000000000000000000..34da694315f90f6d72825bd23766e6a436c5b39b GIT binary patch literal 1718 zcmd5+%Syvg5ItM-0j@)rfz*OcK}7IT#bO(&kBz$|jcuevi3wN`bnl|N@elk7f55MB z=fZyw)N^k_3L&ix5-68ka_7!W=FFU&pKk>#(4b-mLs+=xQnA6Of>X4xjR+yvC45@e zX}92Txzf{v4UcgiJw|Br&gRW9&9KFHadKpQC}TtUg>xAf(mP1<9y0cVXNS33Xr?*p z$-Txp6~5O|ovVgQn&EBy;cwbY{geBz+gDSdP`JuN-61y7M;E<+VmC6_jl$Tq{)=No z?+@jp-X&VWgP0}LrrF3KY7|DaeD^diA5By8*d-p9Gqfa+XCqrhc3Q$xl&gd8=c9Vm zdtO9@HPmnb9UUrz4wJi+nP#5H;&$LTnXyou`DW~6K-@ajY@d4@U94p~kmpgf1JmmI zOSLBY8#7gK_eNri_1t9LLW^TItNdGio=3DsRAH6agl-9~4``juc9Az=5B6}yy+LN2 TWjc}PQDszI(?p$%SEb+=yz3O8 literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/ImageView.strings b/Classes/zh_CN.lproj/ImageView.strings new file mode 100644 index 0000000000000000000000000000000000000000..883b0fc5bebf1657faa0d7c56eac4524df574437 GIT binary patch literal 266 zcmezWkBdQ{L5o3w!I>e4A(5dN2o)G?fmn$ll);n1iJ_FC1PJpP@_-`NK=DL|WFSlh ztIT9bV#oyQ%LJ;ZWbgsXB>`n};3oJ1dF4Q!3s6NdP**8b7s51uppGn{s$`%Eo^QCAcjcQh!F@?FRXaiva+&RfxkNgQn3SD?;c2sm*&~n!U)PAgFnRw$M5nw2H=UB&d#B1|eC* zMF;mk=fCH>|LrOug#<+8;h>2rOGK8R1OqA*%;2&{7_yULzlk=h>nkm^V9{q$u|%0? zEuJ{x4LNjJBK4l%^}X)no*K0_)ou1w6hcp)of(oa>GA&aaB_l41-hdY@>jW}aLQ${ zuj`x3>QMEl1lFf5yvTwbxXis^?&qd76rru(7^RRo tFPQqGIBtjQZ}R{5ii*G6ehigKew#dVpUq&}(i>Hj;@5XO?aqyW_zsUHal-%r literal 0 HcmV?d00001 diff --git a/Classes/zh_CN.lproj/SideMenuView.strings b/Classes/zh_CN.lproj/SideMenuView.strings new file mode 100644 index 0000000000000000000000000000000000000000..aef867eceac23ba001874dfeb7a1f2c5daf3815f GIT binary patch literal 496 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 Pd!B*XInLpF%2fIR{Jn?b literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings new file mode 100644 index 0000000000000000000000000000000000000000..41de2dd8404870b5e538b271cd12e1cfd9ab71d3 GIT binary patch literal 1050 zcmbu8PfmkC6vm%1ZcMxbVdciP3*(}(ab?tqtPNBwOZ4!FUcQoU3G@74_7XacneClgs1K;>#M!OF!KRq!H h^>LY+?%DcDZLcs&dO9NPENt)(V&*E)`Me2qPBKBPV~UY9 z8e|pGA-;exD%i$_rWl3$)hlDQ3iXr;<~?U^7M7qeS*ID5Im@UrmxU0u{(4R5u+ltJ zsnk(VX~X7<&LWCkY>il{aU8Qth%*?jf7nImm|YhC;i7ZQE=z{B9Ii#@jB@esrQbzy zq)Qwr?abNm#vU5O9F{r9kjBtse_5*rmWWAKn%?R@#CZP2*h9onlN$TS`)I3x~XV^Z5hu1;Up8gm9vcCEN literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Call.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Call.strings new file mode 100644 index 0000000000000000000000000000000000000000..e82098b7cd8513a7f665391ee09e9efe2899e889 GIT binary patch literal 516 zcmezWPl+LzA(bJIA%#JKArnX^F(g8HE({?Iz6@>*#SBV7Ia?qmPOUWq7mCVY22X|n zpl(kFKcH#;Ko&NWF9tJCz^@Wwt|!oS$qe}nxnS3(15HZ?x;O_26&Ol@V!1%yVG=RAK{n!32Qe)SXlo|WEvZ1Yxj+|Xf?X8K5Crr$ r!X@}sK}-q)no$76i9kOf+nWcp0p!CpustBzOrS^}lIf)D1lb4x)UZ~n literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Network.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Network.strings new file mode 100644 index 0000000000000000000000000000000000000000..6c7b793a81d7a7f169c961fc2c0d8945d9473b19 GIT binary patch literal 744 zcmb_au}Z^G6g@f$t|DCwne+!bC=Nk76ts;AR8$Z`qNxxQNoq^GIf*zJMXIAt`U(Dk z{Sk3-ad219Yx;aoEKUwD@8;ce?m73}_xWL>f&d|QVIaXFTG+<{R}bDWP7uRnZkbDA zXX`Vri6u<&Y=h`MF2Roxp{wDaYBDR)E~_39XTYUqiuUlU6l8unymOij$*N+7J{3y- z7Y-bHjoC#)=LT%Ipi~a)klW4W(kzqlr_j` literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Root.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Root.strings new file mode 100644 index 0000000000000000000000000000000000000000..46ad1b60468177bebd95eb35d97a15c78f8c938a GIT binary patch literal 1014 zcmZvaO)ErU6vt1=hNUlXn}wByuF#6ROIgQHR2|9`!^$kEj2i?W|$h zQ=jdsVcAok?XF?jQ=bjiuL8*Zs^h(-;PG<=vybJcSYJWLj3GxB6~)2Z=p&C#68Kx9PaEE4^lqVBr>aBF z-5lOH-pPH>ji;m^oA)g_IA(cUiL4m;*h?N)=v-snc7_1q%fNV#gTna-GP`(%l5o!#=9l~L1 T0)QqIF_a+5zOQ;543Px@P{9y_ literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Video.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Video.strings new file mode 100644 index 0000000000000000000000000000000000000000..765f22ac0c86a7d8733bec2751c45fa03e77ab6b GIT binary patch literal 660 zcmezWPl>^ip_HM7A)g_aArVMtG9&}(93ZS@P+%wqiX<`=0ZAnw&lZT47+y852x5po z9jU}%&AS-wY;qb Date: Wed, 3 Feb 2016 14:53:08 +0100 Subject: [PATCH 12/87] liblinphonetester: readd missing images --- linphone.xcodeproj/project.pbxproj | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index c8b423ee2..94b20f758 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -570,6 +570,9 @@ 63AADC001B6A0FF200AA16FD /* assistant_linphone_create.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE41B6A0FF200AA16FD /* assistant_linphone_create.rc */; }; 63AADC011B6A0FF200AA16FD /* assistant_linphone_existing.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE51B6A0FF200AA16FD /* assistant_linphone_existing.rc */; }; 63AADC021B6A0FF200AA16FD /* assistant_remote.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE61B6A0FF200AA16FD /* assistant_remote.rc */; }; + 63B21A7C1C623DA80074DFF8 /* test_failed.png in Resources */ = {isa = PBXBuildFile; fileRef = 63B21A791C623DA80074DFF8 /* test_failed.png */; }; + 63B21A7D1C623DA80074DFF8 /* test_inprogress.png in Resources */ = {isa = PBXBuildFile; fileRef = 63B21A7A1C623DA80074DFF8 /* test_inprogress.png */; }; + 63B21A7E1C623DA80074DFF8 /* test_passed.png in Resources */ = {isa = PBXBuildFile; fileRef = 63B21A7B1C623DA80074DFF8 /* test_passed.png */; }; 63B81A0C1B57DA33009604A6 /* LICENSE.txt in Resources */ = {isa = PBXBuildFile; fileRef = 63B81A031B57DA33009604A6 /* LICENSE.txt */; }; 63B81A0D1B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A051B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m */; }; 63B81A0E1B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A071B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m */; }; @@ -1468,6 +1471,9 @@ 63AADBE51B6A0FF200AA16FD /* assistant_linphone_existing.rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = assistant_linphone_existing.rc; sourceTree = ""; }; 63AADBE61B6A0FF200AA16FD /* assistant_remote.rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = assistant_remote.rc; sourceTree = ""; }; 63AADBE71B6A0FF200AA16FD /* zh_TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_TW; path = zh_TW.lproj/Localizable.strings; sourceTree = ""; }; + 63B21A791C623DA80074DFF8 /* test_failed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = test_failed.png; sourceTree = ""; }; + 63B21A7A1C623DA80074DFF8 /* test_inprogress.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = test_inprogress.png; sourceTree = ""; }; + 63B21A7B1C623DA80074DFF8 /* test_passed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = test_passed.png; sourceTree = ""; }; 63B81A031B57DA33009604A6 /* LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; 63B81A041B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TPKeyboardAvoidingCollectionView.h; sourceTree = ""; }; 63B81A051B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TPKeyboardAvoidingCollectionView.m; sourceTree = ""; }; @@ -2229,6 +2235,9 @@ 63058A0E1B4E821E00EFAE36 /* AppDelegate.m */, 63058A0F1B4E821E00EFAE36 /* InfoPlist.strings */, 63058A111B4E821E00EFAE36 /* Main_iPad.strings */, + 63B21A791C623DA80074DFF8 /* test_failed.png */, + 63B21A7A1C623DA80074DFF8 /* test_inprogress.png */, + 63B21A7B1C623DA80074DFF8 /* test_passed.png */, 63058A131B4E821E00EFAE36 /* Main_iPhone.strings */, 63058A151B4E821E00EFAE36 /* Main_iPad.storyboard */, 63058A171B4E821E00EFAE36 /* Main_iPhone.storyboard */, @@ -3629,6 +3638,7 @@ buildActionMask = 2147483647; files = ( 63058ADA1B4E937300EFAE36 /* certificates in Resources */, + 63B21A7D1C623DA80074DFF8 /* test_inprogress.png in Resources */, 63058ADB1B4E937300EFAE36 /* flexisip in Resources */, 63058ADC1B4E937300EFAE36 /* images in Resources */, 63058ADD1B4E937300EFAE36 /* marie_xml in Resources */, @@ -3640,7 +3650,9 @@ 63058A251B4E821E00EFAE36 /* InfoPlist.strings in Resources */, 63058A271B4E821E00EFAE36 /* Main_iPhone.strings in Resources */, 63058A261B4E821E00EFAE36 /* Main_iPad.strings in Resources */, + 63B21A7C1C623DA80074DFF8 /* test_failed.png in Resources */, 63058A291B4E821E00EFAE36 /* Main_iPhone.storyboard in Resources */, + 63B21A7E1C623DA80074DFF8 /* test_passed.png in Resources */, 63058A281B4E821E00EFAE36 /* Main_iPad.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; From 6cbf5c968d24f105e99a18b4c0271d6f9070b476 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 3 Feb 2016 16:50:56 +0100 Subject: [PATCH 13/87] prepare.py: always escape find cmd --- prepare.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prepare.py b/prepare.py index 248e79c42..6e5ca3812 100755 --- a/prepare.py +++ b/prepare.py @@ -302,7 +302,7 @@ LINPHONE_IPHONE_VERSION=$(shell git describe --always) all: build sdk: -\tarchives=`find liblinphone-sdk/{first_arch}-apple-darwin.ios -name *.a` && \\ +\tarchives=`find liblinphone-sdk/{first_arch}-apple-darwin.ios -name '*.a'` && \\ \trm -rf liblinphone-sdk/apple-darwin && \\ \tmkdir -p liblinphone-sdk/apple-darwin && \\ \tcp -rf liblinphone-sdk/{first_arch}-apple-darwin.ios/include liblinphone-sdk/apple-darwin/. && \\ From af0e4584420baee6fc31b65f3b866967e917b13c Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 3 Feb 2016 17:01:11 +0100 Subject: [PATCH 14/87] call: readd nowebcam.jpg --- Resources/images/nowebcamCIF.jpg | Bin 0 -> 14247 bytes linphone.xcodeproj/project.pbxproj | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 Resources/images/nowebcamCIF.jpg diff --git a/Resources/images/nowebcamCIF.jpg b/Resources/images/nowebcamCIF.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ab8bdc2ace897259946d67357523a6c9796cd3a GIT binary patch literal 14247 zcmdtIWmua{v?v;!7H^@rQ(OwgElBYK#T`m1uutw z-?@9A{XBR7xcA3-o^vK6nXH-hu6MF#md)er<0=4OQC2|~fP{nukbn9B9@hY`WV~!F z0RUxX04o3hz2U!d4M0OdMMXtHd#cdT(9kikF)^MJ9v0R!Yy!L&F9`4m2wuLT zAbv?mMnphBLQ6tMNl8sj{gRlDfsTrSf{L2zFA}7usTk-OxR{u@RD=YCRR5pTV+Vi$ z6Nv`tBMK570GR*@g#hXC7l0A~KtcncApJ}2KQ-zTiI_;pD9@h2AMgQ4C@9D%Xc$On zD46Ka&;UpPWE5010(4poZnYPLlIo_IFNx@Qoa2M(rShuB-nw?aB4!ZyzFP*I+MZwLU$$jDDmM8ZTyM)_yN z6CtPsXfJ3b(Ye*CUz$1x$LEc$5z^61ed;`YoCjb(k&aA&LI3~)s(0Z?r%D;j^yy#K zW&qxg0KzRIYhX)|cY<I9#)SID+eCYNUkRW91M<1x0P33DAG)CtyX%5=j&m9Y z@q7A}aH{KXetmz-GrV@pt2Mbcx)mPrr-Cef{8Q{&?f47yH|VJZ#oe8N0tkJdCer_( zJekf36d+uB^~+$}@Lsab4W-CJ-cCVnA*+KMvdAS;F;roLw9+lbHIs?qH~aA6`LSn8 zJ%sc*if@bWxc(x;m2bwDZ`C;n2AUcf@gGf;o-mX+RU&l<_?vV~cP#_G-4bjhXoN6d zpDhPrZ2w_N-|)A#8I0VLg_nFsIcGi`&;LxFg~WY*?tJ<5Z~1w*nciqYy)pu`T$dTo z^Mu(!An0!(^Yxuy*I9YMsX!Lxx}z}8E4kiXh3!Wg7`F;PO{0BQL^!TOs*b^jo%={me z|6orxxcb_%`ve)auK5RL!9Un5?tU%1c|JjS_5MMr_78ULhbOW`o*-oZ=Mn50=pdeV z^YqR+KLWIzY@e1v^S3P4sCAmL;|2!q2s|&9Epf*eWWB~%<`)SUQa*2*WkxQ}b%Z&T zWw51vt5GNYRue{iyGM5f6MKfQ?ZPVLMovWkV^h;*?;;5WsEHrE9ugKo5Jn3yC6U5M z|NDiYVK4<+PxFz+3cMQqFv`7=dHI}#(IcDOmaPbjjkzF1H=BpzwZn3lm5^fl5NE~K zQa;mN&*8m>W$<(=C71C8MQlP$FCzYB7A!X0x|J`m0Z#7AdUzfgf?*Syp$aZNr^sRI z9Vug2Tig2sYHHg!IjPyGsOO4#5FwPiDV&<6-W{{L>v;rdPL*Du7gVd0!3Kb{F<;F> ztM_Xr-^I%1EV-9P2!AocKCO`z{TPY8$-!q_IjC-A!~5By!>q9_1!49H0LXlZj|piI zEa(y{ElfBxGfjD+RQQb?dH{~Bt3SeZG~aO^Gd^+M8?MmPxYy~_?eDH7^M7eF*FzA7 zGmPI_lKCc@7R5EVNeTt?rxSF}VFue%`1#k`!K%qefI^p%(Fc^68r|U2L~~RirBhSK z37YE08e=)Vv+TI4g2;Mt|98KWYG&ok8v2??iYJXq?a)4sYC?#I~oUfjPP0U?%< z37r8t|4W!h@J1Ml3PJe1{ANsdrCGXMFcui_^G$F&11)WM4>7$v_u5fdBRoAtUNR)O zge&gcLlpVi+ym&9gZrjj;36C=Z7(U3fXbDQmfa#k3)ov0JIl>Z1g zg5H+jsp^#;q+FNo(waM0ea!S5zRMw8^$-b{?!OF>u6~G81p09B`UGT$BVwReq`#aJ zb*|OB9sx^^mqr$AD&?^P^4GL>`aBBBxq*E7cHpwzGV?NUa`n5;RH0q~n)IpMmvdu= zggLADQ#IbTBMjWYHJ|Hcv*b;7wGjQY%LTaixz{~~yn`}y?Q;d^MP+_@LW*4VvE{F- zO^df9eI;bkn>&FTLjtOOJnFw$XZrM#4Ba_+ zz0G3+D|d~r?suN~enJveI-g4T)Fc^rd9EyT`hDk}e5RA;7s}xqjBEBtv*wvOyE#3_ zv{S{d1f;o@{4omQ88@=@nD{|@(@N``?;eLf5XYh0059bQRWE-m5b2;Ct()GwiMl1C z`hbH2t>n|hI@p-msYke)WB%7@zo%Q=O{*02ZDImI7Rdn##iF=#q#1n~mfeo{?BdKi zP?>Lc&i(6D0rfb-Lkwivl`bn_oHGA>FkIu8SQ~wWrmJF zqgDQrg1uC+Yg<`0z~-MMOPe0Yo?Gs?Tqz}Sm0+==EyCy{@!tw?qnUoaJu0jvHWaIt z;d%Mthlrev=bgD@Fk&SshB6DbLhF8i>3Lv&S!3iOiU$2w;Y57ITj%4fA$89sE&oLm%=EhaUl3^VN?4gu%lrFQe++pwS;2L)m6` zc3PU!cO3@-$gX+o#c55SEw4yVy!0|^W92)^!_bSR599&ETa0QFpPn3+Jf>SCc-xw2)5zTe_%}gbFUY zYgUzjhQ7fN&NASmSD>{&$xYIRq|-3VKB-4@*KC;I@33>RXU6RJw@!BZ^?!`@;N9J| ztp51#tRf7BOWPGWiRG7Y04p`J*zIRJhYca=OLCO2DU>5#VFQpaOQM)Reg05g-NSDu z(ShWNQK#a~X*A$6W3@2FId<}`hnU)!fsbfqQ{W(hJm>}6)Ogg0qr3g*ikKMG&Fp|2 zw{Mzo5r<5uIHb*KqTMuYX(xYJe@EA_Ud(kx6k+VbPy2aRGC%(##3n$!F%Gm`&9 zb_kwIN<3vuDSTx7Fu;@CpvC;#LF(z3L9>v-(O@kr;vOVDQ_YoRRPEia*8}6hmOf zd#}-^lTXDUv=I6&uM?s7H^U2PFt6Z(3gMm!4$7a5q|SFjT>+LkXo>DCcn&b}O}I~A z7N3CKW?F$2XIj^Jy_H=g)l3V@e)hu}?w-y?WfKirXV)`PgL1aIm15A##z^c>c;y!ckG5%Jo{5Rp2pOj<>w9F z{`VTj1=S0ch%$~Vl6O^tW>X~-`H0%Z-J?nNA9-nsQYTpQ9?rYTJ6(eGx!a}B=H4Tk z6#}}!iZ5eZCmyhCf3;C8@@7ec&Cq?Ffeg7;)j7y{lWy*O4hI^N425Udj&^L;i_Cj= zWm(EPC`{oS9-`)iW9T{c`m~fiOW5zXj|N@uXCzl!Whk=L;x2)BJ9n&xCAfP_NmroW z&J^^N$yjTr>Y0tZgqF<-pAhcUxqb4hFBM$Q6<>quiwY=0zAYW$a0og5gpwhLmgfE_ z0qzmj{5pztcyY*5!YQ1v&1_#KEcZf0wdeO;x#H3%@Z=2cA)!e%(~fUO6;;&YxUlg| zacOfsHn!aeB4NXm$avd({)BD~_dKw=VZ*CwtF6o<>Y*o_+*-*YKEF$Uj&1oZ!={56 zlE%v!iW{GTU%c3%_c{vZ=FX(%PG;npsgx1KyzO+0-zZbW`coBc!ry#|G>_f*oa!oi z;>`;B=BHUy$8R7LYbs_#ncBDf{t=LFx4uGX{60ll`~>|lA+O|yRo0XphGcbv$(hzTz#3$)227rtS-NinFJA1N*i(e-lMNV z4pl{)=bp2fEnim@OJE&p_dMb#P7<1Bk+QxDkHw{8nHIp{hETCeiQwAB1rH%T`!D-} zq`J+qv{2)9t-lOi8d5H?9Av*>v`*IE|En(#zdR8fYed*`xmmgyBbg5S9DkZd_3j*BIB2CAX_+`ZcXn zbikwx$s-TK^ylOeu&oouv0_eh8Jtl<=7AmS-P84qmt%=D$VEcg%f8}>Om=I!D`d>U_$oDw=2Sq`k%L_}PyFPTI5ns@ih}GQwDGLih@*6ut1kHBtnR&d>3O579A*Ak z+}2QKv77GNr^$F%NS_{6X=|}WW2pI$sI*H&52-Ir8Xd*yl$4uR${v{Y&hhK$hhN9@ z@<(m7#$J70L1H=ty%Zn6%ub{H<~4OJyX4o>9nSGwH&z2f!}2}-OKPrP=-Xd3%=1sE z^^o*Lzd+w&7wSX(NKbz4c>mI&u+5c zg7iOkaKG>vcxJl~CRcsmld3@9gqD3>)GYwVoq~0W)UwkA@v9d1YzB=`sKVibO4*&-UKql#)sc{ z2#9uWt0TrSun+u+W2&?A2}9B|=o6p;jG-NUaO`U?0fUnn`_&@*{Jzal3CtdRq6%X@ zwu~{s`NG4AAPxUV0D&Q#M3hSEYGUM2n(M9;lM;QH)`b`a&K4Jz{g2|n(i5Nn3y{Gy z^IK7qFIKX=jgsL(k>CUw&B*1&h1ABY4VH{+#{S!Wz~1OaL+M8QpE|>TDi9u)BUVeQ zYvt&I!+t~oOJA740fiMqZv|E`rP)L_RD0Q;ou>6(S270;_YbO1ARNYlan1uWB(tBx zs7}HlgxNGn-9yi$BATnDVH8D>NnH#?PDq@nM*)pj2;nCY_ko791$#pEAyLplb+ipb zsgFWK|AeD_j_#$=aMU4c!&eJFv<~i=6=>ohmfjxO!V{wvmNid2_kmV<%;P%OR5a55 z)HmW*rCh$kvT7D-_!10y@a!QFh+diWtCkUxzP03a^9JI1 z%G4=;VW*V!wt57~8R8bcA-_!R0MihHpnlmz;qZdv(Pi@{qvRDj+KH7o_PgsJhF5EZ z&RdW#@@ZB>N??y(YEIIEV362;o$#fId zzA(lF?s-zF59>k@DZCJ5lz-VpaHRjq=*z=)%z(2H_J97%Iuie{)}Ct*t~bqJA&&cN z)yh9Y^AVtY5^4x1f9I)W1Y@zu>F@c#6BI5+kzGTW|*>9VCaGD^YKXNZ;L5`~Se4lEFLgr}e&r#^|hWK%dK;R5(%XB)1mh~0F zv7w*F()rlnT<#I@Eg?>3v}vc2+aDGQH6C1De;wK82@DZSN;%fpI%-}$a z)zy8Nw+%E0GNq>q%;kKMeIuW1ciQaRrFuGmoFG+m$%G;Z`V>Assh6SN!Gpsdq8=y< zhJ(}d6N)A;--wfv*3Qv%rTa@NhxT^*bhCx}vh{a$V|1Zme!{vCzsXlIXY>%52qdCQ zt&y~AA{^rr`W#8lhbb)k;!7lZNXxoSk8}K(xQ!UlX;O#(gTaRD;>NiMH5-O{RZX81 zr@DW9CM}Bsb4BfNw{>OnBB`VdQi^AMG)@q_E)v_z@$>jeO+zsWoYTP?FD@E^C;6a} zisvSSo&>F~z)7g?+Q}e)NP?o&f+j8uH!?0!YZ>xQ%AX@ab{2i zJ4pAE2fvV?_ePao&;2SpnADheJGS(>L9#2t?fdq}PC7i)!yXJv4b10n65`vCh6Dgz z7h*&W^2Z554F*`Okea&Sm<8hC5pboKKrdN?p>n0p(DA3zzytUjjE{+Zx2(d4XzP#$ z#q=H}(Q&GYMbCZ(J;z3&6%O8}M}Qjyq*{DR8?~Fh5a4%w#DX{%7(T88nYU0&?`=nU zk&5!vpSD;)99An;9|8TRmwKT=i;`_N=al(~ImU*Tpr7l3mUUCF-|@K}l$OLP5XPWE zZ2B~*G`>PX&|?4fhcw%tBN2xD&A?!gfepEA1vK3tON3$@l<+~^lB(dAmFGBbzwU6b zS((}v`_F&`KdsGsJS0$!vP*7pql9T$48$?Q@A;+E;#P|v%=`*tW8*~hK9v}|@se}g zI4~i#N`Fw=XbzQ#BOi(s92$mL02CzES5Ss{{4^pWvF;&O>FujzthZ3LNh${?zjaEO zAk~vc2P}epK{Gv_@(V_9dt00-bH(B7(=+KtLZ<1kyx(@As-}gj3DtkVEhD}yBSs>i z-y3sO-;Vqu;MPlg(x0ps4{ysVL<8ViKd1nV$^x=V&4ayjKoH?;45=op;4v5c#Q(Be zzmaeMJ>CCt&cu-+x%oUf7qP>LGNWRRxMR+TfNdH)WQ2*@^~4?(doKVu^*?ors4iO-1X|v$sSyThAt2GLKy6UrUH5 z80?oGX{u?DPV#uYCN-P&pnZFa+$mXlQRLpXhQeU;wYw0?fX_qZdyuNezQ_|^(|UYm z&g;>F{=5Macww(|#rX&r_(09a<;K~t%vwr)F8mD3C|2&EKCspk{SdLQEMD9`!CwqB zosVKc*YC-eqyF^Dt*M)EQ72vK^k~R~0#D}R`OltS^SsaYNcq{~eUu`!{J2x~nkmhG z$$UI=s!Av#s?H>K2Dhv(wevdC>dVSaNzi9zcHfjWQ2dvB1FV3ZqIc?((-S8(E$U*w zU+@jZK|33DKSWdGyJqH!r|dOv)vD{|!t}vc9CaVy;OqAR?}oY#ci?K!b(LV z*wG1$tNp>*{dXJB1r7|f)HuU_gvh1-8Ysb6jpRtat4*7ur->$54Z4ZZQ{p2sudB!5 zNML#;R+1sVP5hO7{4l`N9 z_3|Y%@RIJ1!6E3kXy)m93xy}CC#}`obhCFLM)_Nw7I}B&KXL&y@I7+!!|BxfVan8j z6{K|{1+lmx+61YcREoytj5fF_8ngGI;0u30_1RLA1HbYz=S6!_e-kVHdy{^--$S*W z{u&SB&mRHz88#1#f4|boG>~*__v4D!I4tY zYwnn=9JJk4eJ81{`*tixO5k^()qQF#Fd@P)fT4A4vW_5xN5dhnaa@l>!_ao=%LeII z(r)6Sbs2-OVDWcP5qUq3FyE!eO^}X)(3UvprUo zJt#RFj@zIn4#~@{L&$EH+kNw+1lPo29sb0^|oUR2hcz6mLc zOw+bdoX?(_IAy*enKskiueQlr4U_8V@#ioa%d}!PE?7lL-{i#L>yuI?y05m zECJ~v*#BF>?|!Qybj|XQ`K}@Z81-O?Q(fqE1X|`?>Nt|pySDGX!s_Tm5!@Lv&J;jI zg2!OS*}YWXBPyyg@47T~Rl2%rd}z^|rWzjsj1It)kv~d1=mmn4L_2|pD^R$0Fzil4 zTW0~xyi~9nt@`r2A)5j{{liq&J{-r$?b0a6{kV{e14FQXm?sa##+NSIsk>3=X5sd; zR=e9smu(I3!00}z`<`*5TQ+3E1RbOzV~7&`Lb$N%K-fbudCFH?dqkC;Np=Fd{HCtC zEipRUn;;~5M!gNk)ip)n`|^B_QCtCm~bLt}iHn+p~c# z&;4N7GAl&|2*Aorg_Dtjn{X!Mv?>zWohQ!n&$S%V${U#ZtiTg}QV=Ns1H`%7-gFQ|)} z#8N;KL6W5oJj-0}P=zahO-TH5nvnA9dFRgWx4Mg&K0doMtDUq#jEm;SiG&d&|5 zmhA+kcKa;s+EiRb7Z!$B|Lg$Zko;5^TK(MQ$@P1oZ*B=LPJCumB?v#Isb9Jet%hoC znCK}v7A8O-mR+dIhhj$}fELIMtAR3Vy?a7~;07tfkK#Kw`k>XZZbU#|YNUks{D<(AI|m&oKGE{s?e-9dT}5s=jvJpdkiK)F zjELg1t1MO^8=d;11EJ%gqy{f1Mb&yvsaG(Vd7hlIBhx!Vr}R91AUnqqbxTQQ5hq2X zc;gi`xG}coI|xzMX*|4P+~U>iTjV&ONyAsiUF8M6WX|5P%OeF>lzgMI3XiqBF0Zhi ze+T{45%|FG5ttCIv*IYgl&ZDJT0A1!r-))~o6T**_7Y1^bG}KAvA0o6W@Mi1@bwu> zS;eX6tLE+KKPUHKVOE=ML34+|O5QEGPuWtGLI-&3Z8{T1m#_na_qRHq;eVqo{3#Jr z4HZU~QELuattGr3>mx&?yHas6Hx4zg!kVXc??Tx)YF-2$lBkU1X%*LrS3qsQ*;y1N zSCpb4;zFAhxBXVoEU_2&k1_6ujRle-G&L>e_Z4nR$;Lh>+E`hsJ_>D=M?m33`R z6-UHUq$f8TiYm;^J(9=P)#pOEI(hInOtJUt*WWOOv?o@hBge4(QEG}%QiWKttSr_e zV6)Ozm##QCu8Z8vOqOi=?B`JrUo^IvwEkESpaZMgur_gvbCZ3)cFvazv&Hn|%vap+ zoPSLE7?W%Ca2s7-nCS0ozs|;7oobZ;M!V%(D(MfgV2iNJxV~i>jlSOIKBYNhTBj4=!kAJVYi1){bUMj|g%Hi0NUQ`zx5Hkhh zjD|669_WjB9bAWPlpJdzgb~`K?{!ZCJ_-pkPMU#x`egeW`|Y_&1;tBS->N#D>yN^t zUPUxjYu5!#GkHBEHRAIR%Pl1IBFbZoAl1orJgo_DHW7xh+7WBnZH1F{`6W=B_=pTTqD+9L5)W$h%}f#hSyq!9?x@Ap z4_GD%`NvTsIMTSl^5n3wSN8qy)p_xRLifLFy?8>96%{k{Q~u95E4F>|Z+jk5zQ%sI zQ=>?<%cUf#AbslB4+yMp;liq_V>}{5M|+>$t`B9%!D(mI4c_HO(0wdfH26G#iirJB zIXzV~Wy2Dx1AtU;c%V9GuQ$uCW+7+q@Gj$rvDv+~n{54U`tb&Wj)zNoF|hmXZLyeX zC3}j9Ve%Utjj7-KW^{2PffJpUC~ZiFTfZJ);oIe7ld=i}PXQlL-GhvI{&L>`unaOmP@zguLk!?;MSnw}aPmUhE##RTQ*p$|&oQ z^x7Zc*tN5|pY9Vp0yeal9s#$-fm-pRe)wQ-@xI|o+ux_x%SzH zA^1Y@BVe-jw$zH?v%Ze{xVY{SqVWiu)I19g%s7S(@3;@+u?G~%3KX^X)EgKL@m;-i z6he$TW!aQmWmWQm@_rcQ2RRd`L0b{@QE)um9R@lugkgL6%g^Ec-J0yIlI|u~SYz{28=((4Xm} zOEMsh9M$=XC393-ySghY*ev4r9N*)IveBwEj&$94`Ie>Gx}9lCvtg~pcOb96A+AKd zcI6_d$DTgbgj=)BQuD@;(oh7C9Aq#A(c0!b5FY*!&MrTocf8OfCaN=fio{RMmiQK7 zn;G|0i067zcOt!%s`8@k^7e`e%nq7ti%lmP{M}*Y7tAaV9$Eryxo1(nU63U=a!yLKX*yH?|0P)Cdhaqw5$6lUpK4i$k9-+@tdJraXUgDJBgBthpBsQy=m93d+fhfGWFKV3TWnBA##34v3; zWumrP&kHPZBm)VdRWGiP&a2$%DcS}k-_zpGro_1jm1BixzMh;%I4n^}#eShqFLsia zzxeq==SgtIR8a;a^oNHIDn7;JD;4KeB+uTYk(1AjY_Ryt)gV9#)Sg7!8w8@6WRr8~ zqCMg(<{UT>|L;fBFj70-%UMG`e5S<#Zd$7EB!5_g8r7x@;9CVhN)n!b$&{Ww4GGIe zJ)`|)mX61s3DCR?r(l~jlq_cqjw#8DURV4Y5WmYkWZVFt?Z?aXKV>mVc>}Yl! zorkWx)x?0-vrG!ipWT@Yl?`%sZFJmSN+jB!(_T6<_s>w*B7NgD5Wy=T#{aD5Jvf|x zW}g2t|JY^z_>BkEVv4+Y8b*GS6I+CnGu_&gnLD7!tupHS9$0y1cAP>IMFIpaO z1DM;|76dmQ2mt$KynGLq+*@Hj-wr#c=lKV=-*7j@uf9O)Bso#5`ase_j@wMg5zbX} z6wjNzm6{RfO+AlZ3v}0TCZ0Riu(?YX)mB+rPRZ-cI|K-&2~t87J)Y~4GVEYbyO&;o zYL-OGKIN#dFqt1&bB3hl2Kl^@a+#zW^kA_uv=@N)fekJiv<0dHu1S?c>6D)$vd`KA zWZqvV7jnYb)RZh?bsn=Q=?GBrkZ2N5fDE?me;f8RDLnX(W7{r5r}IPqy0hK7lPjK- z5K)_d&gEzQ%1Ad2m^Q39E&rLU=j&YaAE=^Q8wa2Y9FYD!Zm|T51C8wP*c@ar@tz>0 z4>3OBf2{lg&JTsYCJz_t=r>D~|6p5ur1`jo(mma0AXI3I&%2V|7_boJgQqW)4`Wj_D0)q9;H1u{aDP!%7 z%%t~rP-etw=kkri+mdV)DqSh}FJ$FI+4IdSj~V86>#%+@bVSg*X;w2= zFE!=rfMn$tG6UqCIkCjkP2nRc+KBX@xNoFdd$5`a!sGob-Q0KWFe~elw1_lot5Ss- zJ(`(BzmQ)uqh%cI_pmPczLu$Zpx|DlLmKi^KB(XDufAo=24|DOY-mbjDkCK4d<}Up zFZCQ}_vMZDj@?t?^9p-q^P}`URdp>#n4P=z3a-9FhXC#-5f*g3#$8Kbtm6bXZ-c<( z-8$LZGh&Y~y>kw1M8zS!_91ijVUo&N(z>0iuOx-D!|vYu866|zc`u#eE>)J?RD7S| zt!sjyQX(YO1IGPyD@Nlr<_~CN8#R#)ucE(nTs&w|7WwD#4Ygh2$V^w)PsRowesTqR zPWXes>AvQBY;`lXA`h>5r+BxDY7k_qW^oiL{?)UbGvA8D8bU(y&K3U*23mTE7a^7J z`WSVrRE|9x0o67j?>O|b6 z4DM3#;GFB#si4SF$(6X^zL8SNR>AoEt1TrHt}#*5afF;&MEKiPx#zrFp-O5qGX`tr zFwHmeH?JvkCw7J0)Q1^u2TkyJe?yy|E|m=bjw0z;c?A5-B@~aISRSpP>0@Jcm?5FT z!%JX=LHQc@=GfFf@aNTi;4iPSMYVqs-`7n3WDX_a)rmu=h~WlW5i`o~=Ca8q@LjVd zMTZrZYzIZal%EUu-rb#JVP``QqMxo5qhTG^I}{0XF1fQmU8}S=`-IoC*2wgn{y-6U zdAUIKWM9#h7%v3Eho2}p!g+GbY7)mG zZNNGS>bWX|qvwZdZ1#8{T>~*R^}%2QceeA(a(gN#q#W@MMvt7)~-9@C^a z&D6y}pQT2(n2o=&776q5RbMDSdhxcVZ#DB})6%EttS0-BDc8jI$b5WXjj0h;`Ix&tXNb~pal@##9QmgNp&c9#eZW8$uti=Fjk?8XV{iEu_DMep(CHg`pp>3CzDohk=Fs`ACJjP8P z{r1<%D-Nd8y-ICpQ?116`r_x)(b#VvPwqhTtamb4oL3|qTC-gXBB8pfdAi?zS?%o- zWVNW=;eNr(6@WUGYo=%#T2||bIxu*COuSuVjnqC_c|S_Ra{S7`4~O*1S*!x%$rpWd z{4zLLG{{E~!jP^S)i{oqh{ zs>oJ>*ubG+WI~jb2AZ44mD2_ZJFW&pX)vyH#lxvMoE8Ly*ZYJ63&Zj2PB&zy?Xa>U z_H>jf8Qw;yYehyrMXc#v{BRZE)ikp&Bp5DFBmjZjyFs@?R1IT?g;zuE3kCqvLw?h_ zpCye8y$h6-*~Jru;56rohZ+4 zg;%Y)o`+Vz;{Eq0R`YZTu`{Yx(?-RR0*onmwn9oCD26 zMcc0j@a-Qwdt0A<%u8Ln5)hzvz@8xR1vdP#MCO?s7#cC=p3jCmY0e(bs<6EnLwR8NNB_Mf2B?vaR zQ3083Sa2I=sz*JKXeyXwCsg1Z1X*9FIy91?u2R3xW2`|GOwBXtIGrXn#2DCuOG`3U z=wqD}I%p*x;xG9^m6tg+OduC2yIXeBl%m0Tvlt2a5r49QXOf*FiMO;Eqlw)RvLoQ2 z9j%AZ^LSX-q86l}asOM410Uc4 zNPAB4gN0MFHd37MXmY$Ne+?lykLoB2;~3bKl_p@I*9ZqG+$eVSejncSf&jfT&q<^( zlwXVT-bO`uZ<#yQeB6=WhzOox^BOxfi8vkWnByx-4wD^~ECYmwpYP)83H34vIJ^T% z1&uAw>GvwZeQ`o4f&O_-3TW>k$#rLuDafNpY#dKltDi;mie#5PX_EhOGhKiSMPH@1!cg{&znvD7F;UD*gX?Aaa=P zs%!w?m7A1>@Rx-v!~NAyWrnb9>u0UXN+6!NAq^1GnucI6@0^B4J1=rSyiX)4R=+me zhA`2iMJKVw?*o=^KRourr%=%Fa0&ozr7As^1Is`)?f Date: Thu, 4 Feb 2016 14:43:07 +0100 Subject: [PATCH 15/87] xcode: remove nowebcam.jpg duplicate&invalid entry --- linphone.xcodeproj/project.pbxproj | 1 - 1 file changed, 1 deletion(-) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index d2840dcc0..7dba40df3 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -1509,7 +1509,6 @@ 63E27A511C50EB2700D332AE /* hold.mkv */ = {isa = PBXFileReference; lastKnownFileType = file; path = hold.mkv; sourceTree = ""; }; 63E59A3D1ADE6ECB00646FB3 /* InAppProductsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppProductsManager.h; sourceTree = ""; }; 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppProductsManager.m; sourceTree = ""; }; - 63E802DA1C625AEF000D5509 /* nowebcamCIF.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = nowebcamCIF.jpg; path = "../../../linphone-iphone/Resources/images/nowebcamCIF.jpg"; sourceTree = ""; }; 63EA4C941B50189D00922857 /* libmswebrtc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmswebrtc.a; path = "liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/libmswebrtc.a"; sourceTree = ""; }; 63EEE4091BBA9B110087D3AF /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; }; 63EEE40B1BBA9B1B0087D3AF /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; From e43f11e3ddeab0e6c6bb535d73b58cfa9861f908 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 4 Feb 2016 16:20:12 +0100 Subject: [PATCH 16/87] submodules: update plugins to use factory new initialization. Note: it is still broken for now! --- Classes/LinphoneManager.m | 2 -- submodules/bcg729 | 2 +- submodules/msamr | 2 +- submodules/msopenh264 | 2 +- submodules/mssilk | 2 +- submodules/mswebrtc | 2 +- submodules/msx264 | 2 +- 7 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index a98916b33..59bb6f0ca 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -72,7 +72,6 @@ NSString *const kLinphoneFileTransferRecvUpdate = @"LinphoneFileTransferRecvUpda const int kLinphoneAudioVbrCodecDefaultBitrate = 36; /*you can override this from linphonerc or linphonerc-factory*/ -extern void libmsilbc_init(MSFactory *factory); extern void libmsamr_init(MSFactory *factory); extern void libmsx264_init(MSFactory *factory); extern void libmsopenh264_init(MSFactory *factory); @@ -1430,7 +1429,6 @@ static BOOL libStarted = FALSE; // Load plugins if available in the linphone SDK - otherwise these calls will do nothing MSFactory *f = linphone_core_get_ms_factory(theLinphoneCore); - libmsilbc_init(f); libmssilk_init(f); libmsamr_init(f); libmsx264_init(f); diff --git a/submodules/bcg729 b/submodules/bcg729 index 51d0d1dda..e540e0c4d 160000 --- a/submodules/bcg729 +++ b/submodules/bcg729 @@ -1 +1 @@ -Subproject commit 51d0d1dda46a01089840f5803c38bf985cf4d00f +Subproject commit e540e0c4d5521c5125e1de496ad1085e642df120 diff --git a/submodules/msamr b/submodules/msamr index 35e3de7e1..5e180193d 160000 --- a/submodules/msamr +++ b/submodules/msamr @@ -1 +1 @@ -Subproject commit 35e3de7e1b8de0ae6a971103d54c9d489c0fddba +Subproject commit 5e180193d06e5d6b3394571ac7750b5359856c15 diff --git a/submodules/msopenh264 b/submodules/msopenh264 index c5585b74a..709e1f690 160000 --- a/submodules/msopenh264 +++ b/submodules/msopenh264 @@ -1 +1 @@ -Subproject commit c5585b74a493fd918d147963f57877b8e380fac3 +Subproject commit 709e1f6903914fa883ebcf26f51fece65e3e1ab5 diff --git a/submodules/mssilk b/submodules/mssilk index 49306ca45..e766ae43c 160000 --- a/submodules/mssilk +++ b/submodules/mssilk @@ -1 +1 @@ -Subproject commit 49306ca4566480e08a0b64f1323bfc9f354d41bf +Subproject commit e766ae43c503aa08080df9beb24a0fe81ce213bb diff --git a/submodules/mswebrtc b/submodules/mswebrtc index 5787ddda7..113e98188 160000 --- a/submodules/mswebrtc +++ b/submodules/mswebrtc @@ -1 +1 @@ -Subproject commit 5787ddda77a8292898670ab8bd3d48e6e51ccfaa +Subproject commit 113e9818866ebbf75a03d4559d76ee89a6dcfd9f diff --git a/submodules/msx264 b/submodules/msx264 index e9e6b6017..427e20aea 160000 --- a/submodules/msx264 +++ b/submodules/msx264 @@ -1 +1 @@ -Subproject commit e9e6b60172291a705c9f3be0b72a46686099ffbc +Subproject commit 427e20aeabcf62fbd2fdb48ab80f56833d3db790 From 3bbc1db73bf251fbc332974b6540f5900002de0d Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Fri, 5 Feb 2016 10:32:05 +0100 Subject: [PATCH 17/87] submodules: fix plugins loading --- Classes/LinphoneManager.m | 3 +++ submodules/linphone | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 59bb6f0ca..9a9004f6f 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -1426,6 +1426,8 @@ static BOOL libStarted = FALSE; theLinphoneCore = linphone_core_new_with_config(&linphonec_vtable, _configDb, (__bridge void *)(self)); LOGI(@"Create linphonecore %p", theLinphoneCore); + if ([@"toto" containsString:@"o"]) + LOGE(@"lol"); // Load plugins if available in the linphone SDK - otherwise these calls will do nothing MSFactory *f = linphone_core_get_ms_factory(theLinphoneCore); @@ -1435,6 +1437,7 @@ static BOOL libStarted = FALSE; libmsopenh264_init(f); libmsbcg729_init(f); libmswebrtc_init(f); + linphone_core_reload_ms_plugins(theLinphoneCore, NULL); // Set audio assets NSString *ring = diff --git a/submodules/linphone b/submodules/linphone index 1db3b9a29..45207ae94 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 1db3b9a2978d64dc886c6c7db7b5ed21ee39bbe7 +Subproject commit 45207ae94fcd5c805be24528929cf4f6b7b1a526 From fa1a6f7a921d9e2f906c13a93bec742621997a73 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Fri, 5 Feb 2016 10:38:50 +0100 Subject: [PATCH 18/87] travis: fix test --- TestsUI/ChatTester.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TestsUI/ChatTester.m b/TestsUI/ChatTester.m index 4d8d448a8..7bad8549c 100644 --- a/TestsUI/ChatTester.m +++ b/TestsUI/ChatTester.m @@ -206,6 +206,8 @@ traits:UIAccessibilityTraitStaticText]; NSTimeInterval before = [[NSDate date] timeIntervalSince1970]; + [tester tapRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] + inTableViewWithAccessibilityIdentifier:@"Chat list"]; [self startChatWith:[self me]]; NSTimeInterval after = [[NSDate date] timeIntervalSince1970]; From 7f4f95a9d1fa748d7ba644390cb3d6e58ded575b Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Fri, 5 Feb 2016 14:00:22 +0100 Subject: [PATCH 19/87] xcode: fix invalid calls to API greater than currently available fixing crashes on iOS6/iOS7 --- Classes/CallView.m | 4 +--- Classes/ChatConversationCreateTableView.m | 4 ++-- Classes/LinphoneAppDelegate.m | 4 ++++ Classes/LinphoneManager.m | 8 ++++--- Classes/LinphoneUI/UIChatBubbleTextCell.m | 2 ++ Classes/SideMenuView.m | 21 ++++++++++++------- .../IASKSpecifierValuesViewController.m | 15 ------------- Classes/Utils/Utils.h | 3 ++- Classes/Utils/Utils.m | 9 ++++++++ TestsUI/ChatTester.m | 2 +- TestsUI/LinphoneTestCase.m | 2 +- 11 files changed, 40 insertions(+), 34 deletions(-) diff --git a/Classes/CallView.m b/Classes/CallView.m index e8aa0294a..1e14d859a 100644 --- a/Classes/CallView.m +++ b/Classes/CallView.m @@ -125,12 +125,10 @@ static UICompositeViewDescription *compositeDescription = nil; [_hashButton setDtmf:true]; } -- (void)viewDidUnload { +- (void)dealloc { [PhoneMainView.instance.view removeGestureRecognizer:singleFingerTap]; // Remove all observer [NSNotificationCenter.defaultCenter removeObserver:self]; - - [super viewDidUnload]; } - (void)viewWillAppear:(BOOL)animated { diff --git a/Classes/ChatConversationCreateTableView.m b/Classes/ChatConversationCreateTableView.m index b0a0ab0ff..9c07f4a2d 100644 --- a/Classes/ChatConversationCreateTableView.m +++ b/Classes/ChatConversationCreateTableView.m @@ -37,8 +37,8 @@ NSString *address = (NSString *)key; ABRecordRef person = (__bridge ABRecordRef)(value); NSString *name = [FastAddressBook displayNameForContact:person]; - if ((filter.length == 0) || ([name.lowercaseString containsString:filter.lowercaseString]) || - ([address.lowercaseString containsString:filter.lowercaseString])) { + if ((filter.length == 0) || ([name.lowercaseString containsSubstring:filter.lowercaseString]) || + ([address.lowercaseString containsSubstring:filter.lowercaseString])) { _contacts[address] = name; } diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 7b3cecce3..81411b5b2 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -101,6 +101,7 @@ } } +#pragma deploymate push "ignored-api-availability" - (UIUserNotificationCategory *)getMessageNotificationCategory { NSArray *actions; @@ -195,6 +196,7 @@ } } } +#pragma deploymate pop - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { @@ -415,6 +417,7 @@ #pragma mark - User notifications +#pragma deploymate push "ignored-api-availability" - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { LOGI(@"%@", NSStringFromSelector(_cmd)); @@ -483,6 +486,7 @@ LOGI(@"%@", NSStringFromSelector(_cmd)); completionHandler(); } +#pragma deploymate pop #pragma mark - Remote configuration Functions (URL Handler) diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 9a9004f6f..3fb1b268f 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -919,7 +919,9 @@ static void linphone_iphone_popup_password_request(LinphoneCore *lc, const char NSString *chat = [UIChatBubbleTextCell TextMessageForChat:msg]; notif.repeatInterval = 0; if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) { +#pragma deploymate push "ignored-api-availability" 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]; @@ -1250,6 +1252,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach NSNumber *number = (NSNumber *)[dataNetworkItemView valueForKey:@"dataNetworkType"]; return [number intValue]; } else { +#pragma deploymate push "ignored-api-availability" CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init]; NSString *currentRadio = info.currentRadioAccessTechnology; if ([currentRadio isEqualToString:CTRadioAccessTechnologyEdge]) { @@ -1257,6 +1260,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } else if ([currentRadio isEqualToString:CTRadioAccessTechnologyLTE]) { return network_4g; } +#pragma deploymate pop return network_3g; } } @@ -1426,8 +1430,6 @@ static BOOL libStarted = FALSE; theLinphoneCore = linphone_core_new_with_config(&linphonec_vtable, _configDb, (__bridge void *)(self)); LOGI(@"Create linphonecore %p", theLinphoneCore); - if ([@"toto" containsString:@"o"]) - LOGE(@"lol"); // Load plugins if available in the linphone SDK - otherwise these calls will do nothing MSFactory *f = linphone_core_get_ms_factory(theLinphoneCore); @@ -1783,7 +1785,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { OSStatus lStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &lNewRouteSize, &lNewRoute); if (!lStatus && lNewRouteSize > 0) { NSString *route = (__bridge NSString *)lNewRoute; - allow = ![route containsString:@"Heads"] && ![route isEqualToString:@"Lineout"]; + allow = ![route containsSubstring:@"Heads"] && ![route isEqualToString:@"Lineout"]; CFRelease(lNewRoute); } return allow; diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.m b/Classes/LinphoneUI/UIChatBubbleTextCell.m index a670d77e6..810b547a3 100644 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.m +++ b/Classes/LinphoneUI/UIChatBubbleTextCell.m @@ -227,6 +227,7 @@ static void message_status(LinphoneChatMessage *msg, LinphoneChatMessageState st if (!text || text.length == 0) return CGSizeMake(0, 0); +#pragma deploymate push "ignored-api-availability" #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 7) { return [text boundingRectWithSize:size @@ -239,6 +240,7 @@ static void message_status(LinphoneChatMessage *msg, LinphoneChatMessageState st .size; } #endif +#pragma deploymate pop { return [text sizeWithFont:font constrainedToSize:size lineBreakMode:NSLineBreakByCharWrapping]; } } diff --git a/Classes/SideMenuView.m b/Classes/SideMenuView.m index bc1fcc5a6..861dc90a9 100644 --- a/Classes/SideMenuView.m +++ b/Classes/SideMenuView.m @@ -14,14 +14,17 @@ - (void)viewDidLoad { [super viewDidLoad]; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 - // it's better to detect only pan from screen edges - UIScreenEdgePanGestureRecognizer *pan = - [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(onLateralSwipe:)]; - pan.edges = UIRectEdgeRight; - [self.view addGestureRecognizer:pan]; - _swipeGestureRecognizer.enabled = NO; -#endif + +#pragma deploymate push "ignored-api-availability" + if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 7) { + // it's better to detect only pan from screen edges + UIScreenEdgePanGestureRecognizer *pan = + [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(onLateralSwipe:)]; + pan.edges = UIRectEdgeRight; + [self.view addGestureRecognizer:pan]; + _swipeGestureRecognizer.enabled = NO; + } +#pragma deploymate pop } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; @@ -65,9 +68,11 @@ _avatarImage.image = [LinphoneUtils selfAvatar]; } +#pragma deploymate push "ignored-api-availability" - (void)onLateralSwipe:(UIScreenEdgePanGestureRecognizer *)pan { [PhoneMainView.instance.mainViewController hideSideMenu:YES]; } +#pragma deploymate pop - (IBAction)onHeaderClick:(id)sender { [PhoneMainView.instance changeCurrentView:SettingsView.compositeViewDescription]; diff --git a/Classes/Utils/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m b/Classes/Utils/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m index cda7126b4..764d14776 100755 --- a/Classes/Utils/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m +++ b/Classes/Utils/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m @@ -97,21 +97,6 @@ return YES; } -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - self.tableView = nil; -} - - - (void)dealloc { _currentSpecifier = nil; _checkedItem = nil; diff --git a/Classes/Utils/Utils.h b/Classes/Utils/Utils.h index db9f7dee1..7b738d6d3 100644 --- a/Classes/Utils/Utils.h +++ b/Classes/Utils/Utils.h @@ -54,9 +54,10 @@ typedef enum { @end -@interface NSString (md5) +@interface NSString (linphoneExt) - (NSString *)md5; +- (BOOL)containsSubstring:(NSString *)str; @end diff --git a/Classes/Utils/Utils.m b/Classes/Utils/Utils.m index bc3adbe55..7d02ffd6f 100644 --- a/Classes/Utils/Utils.m +++ b/Classes/Utils/Utils.m @@ -374,6 +374,15 @@ return output; } +- (BOOL)containsSubstring:(NSString *)str { + if (UIDevice.currentDevice.systemVersion.doubleValue >= 8.0) { +#pragma deploymate push "ignored-api-availability" + return [self containsString:str]; +#pragma deploymate pop + } + return ([self rangeOfString:str].location != NSNotFound); +} + @end @implementation ContactDisplay diff --git a/TestsUI/ChatTester.m b/TestsUI/ChatTester.m index 7bad8549c..27d793a8f 100644 --- a/TestsUI/ChatTester.m +++ b/TestsUI/ChatTester.m @@ -93,7 +93,7 @@ timeout -= .5f; element = [[UIApplication sharedApplication] accessibilityElementMatchingBlock:^BOOL(UIAccessibilityElement *e) { - return [e.accessibilityLabel containsString:quality]; + return [e.accessibilityLabel containsSubstring:quality]; }]; } XCTAssertNotNil(element); diff --git a/TestsUI/LinphoneTestCase.m b/TestsUI/LinphoneTestCase.m index cb2deb163..4d73db3c5 100644 --- a/TestsUI/LinphoneTestCase.m +++ b/TestsUI/LinphoneTestCase.m @@ -22,7 +22,7 @@ [KIFTypist setKeystrokeDelay:0.05]; NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; - if (!([language isEqualToString:@"en"] || [language containsString:@"en-"])) { + if (!([language isEqualToString:@"en"] || [language containsSubstring:@"en-"])) { LOGF(@"Language must be 'en' (English) instead of %@", language); } } From ba114e525f543bfd5b825a38c248e0e895b59f15 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Fri, 5 Feb 2016 14:18:18 +0100 Subject: [PATCH 20/87] xcode: fix last problems of API compability --- Classes/LinphoneManager.m | 8 +++- Classes/LinphoneUI/UISpeakerButton.m | 7 +++- Classes/PhoneMainView.m | 39 ++++++++++--------- Classes/SideMenuView.m | 2 +- .../IASKAppSettingsViewController.m | 3 ++ .../IASKAppSettingsWebViewController.m | 5 +-- .../Views/IASKPSTextFieldSpecifierViewCell.m | 5 +-- .../TPMultiLayoutViewController.m | 7 ---- 8 files changed, 40 insertions(+), 36 deletions(-) diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 3fb1b268f..896d27171 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -278,6 +278,7 @@ struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_pre [NSNotificationCenter.defaultCenter removeObserver:self]; } +#pragma deploymate push "ignored-api-availability" - (void)silentPushFailed:(NSTimer *)timer { if (_silentPushCompletion) { LOGI(@"silentPush failed, silentPushCompletion block: %p", _silentPushCompletion); @@ -285,6 +286,7 @@ struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_pre _silentPushCompletion = nil; } } +#pragma deploymate pop #pragma mark - Migration @@ -599,14 +601,15 @@ static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char linphone_call_set_user_data(call, (void *)CFBridgingRetain(data)); } +#pragma deploymate push "ignored-api-availability" if (_silentPushCompletion) { - // we were woken up by a silent push. Call the completion handler with NEWDATA // so that the push is notified to the user LOGI(@"onCall - handler %p", _silentPushCompletion); _silentPushCompletion(UIBackgroundFetchResultNewData); _silentPushCompletion = nil; } +#pragma deploymate pop const LinphoneAddress *addr = linphone_call_get_remote_address(call); NSString *address = [FastAddressBook displayNameForAddress:addr]; @@ -897,6 +900,7 @@ static void linphone_iphone_popup_password_request(LinphoneCore *lc, const char #pragma mark - Text Received Functions - (void)onMessageReceived:(LinphoneCore *)lc room:(LinphoneChatRoom *)room message:(LinphoneChatMessage *)msg { +#pragma deploymate push "ignored-api-availability" if (_silentPushCompletion) { // we were woken up by a silent push. Call the completion handler with NEWDATA // so that the push is notified to the user @@ -904,6 +908,8 @@ static void linphone_iphone_popup_password_request(LinphoneCore *lc, const char _silentPushCompletion(UIBackgroundFetchResultNewData); _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]; diff --git a/Classes/LinphoneUI/UISpeakerButton.m b/Classes/LinphoneUI/UISpeakerButton.m index 460a2def1..ec073c572 100644 --- a/Classes/LinphoneUI/UISpeakerButton.m +++ b/Classes/LinphoneUI/UISpeakerButton.m @@ -41,10 +41,13 @@ INIT_WITH_COMMON_CF { #pragma mark - UIToggleButtonDelegate Functions - (void)audioRouteChangeListenerCallback:(NSNotification *)notif { - if ([[notif.userInfo valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue] == - AVAudioSessionRouteChangeReasonRouteConfigurationChange) { +#pragma deploymate push "ignored-api-availability" + if (UIDevice.currentDevice.systemVersion.doubleValue < 7 || + [[notif.userInfo valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue] == + AVAudioSessionRouteChangeReasonRouteConfigurationChange) { [self update]; } +#pragma deploymate pop } - (void)onOn { diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index 32b7b3c30..53c332c70 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -496,28 +496,29 @@ static RootViewManager *rootViewManagerInstance = nil; } - (void)updateStatusBar:(UICompositeViewDescription *)to_view { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 - // In iOS7, the app has a black background on dialer, incoming and incall, so we have to adjust the - // status bar style for each transition to/from these views - BOOL toLightStatus = (to_view != NULL) && ![to_view darkBackground]; - if (!toLightStatus) { - // black bg: white text on black background - [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; +#pragma deploymate push "ignored-api-availability" + if (UIDevice.currentDevice.systemVersion.doubleValue >= 7.) { + // In iOS7, the app has a black background on dialer, incoming and incall, so we have to adjust the + // status bar style for each transition to/from these views + BOOL toLightStatus = (to_view != NULL) && ![to_view darkBackground]; + if (!toLightStatus) { + // black bg: white text on black background + [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; - [UIView animateWithDuration:0.3f - animations:^{ - statusBarBG.backgroundColor = [UIColor blackColor]; - }]; + [UIView animateWithDuration:0.3f + animations:^{ + statusBarBG.backgroundColor = [UIColor blackColor]; + }]; - } else { - // light bg: black text on white bg - [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; - [UIView animateWithDuration:0.3f - animations:^{ - statusBarBG.backgroundColor = [UIColor colorWithWhite:0.935 alpha:1]; - }]; + } else { + // light bg: black text on white bg + [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; + [UIView animateWithDuration:0.3f + animations:^{ + statusBarBG.backgroundColor = [UIColor colorWithWhite:0.935 alpha:1]; + }]; } -#endif +#pragma deploymate pop } - (void)fullScreen:(BOOL)enabled { diff --git a/Classes/SideMenuView.m b/Classes/SideMenuView.m index 861dc90a9..699299135 100644 --- a/Classes/SideMenuView.m +++ b/Classes/SideMenuView.m @@ -16,7 +16,7 @@ [super viewDidLoad]; #pragma deploymate push "ignored-api-availability" - if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 7) { + if (UIDevice.currentDevice.systemVersion.doubleValue >= 7) { // it's better to detect only pan from screen edges UIScreenEdgePanGestureRecognizer *pan = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(onLateralSwipe:)]; diff --git a/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m b/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m index 79c07b63e..f077e1264 100755 --- a/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m +++ b/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m @@ -14,6 +14,7 @@ // This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php // +#pragma deploymate push "ignored-api-availability" #import "IASKAppSettingsViewController.h" #import "IASKSettingsReader.h" @@ -905,3 +906,5 @@ CGRect IASKCGRectSwap(CGRect rect) { return newRect; } @end + +#pragma deploymate pop \ No newline at end of file diff --git a/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m b/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m index 725fe1a25..7e1df0b70 100755 --- a/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m +++ b/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m @@ -15,7 +15,7 @@ // #import "IASKAppSettingsWebViewController.h" - +#pragma deploymate push "ignored-api-availability" @implementation IASKAppSettingsWebViewController @synthesize url; @@ -145,7 +145,6 @@ - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { [self dismissModalViewControllerAnimated:YES]; } - - +#pragma deploymate pop @end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m b/Classes/Utils/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m index f7cb92aba..63b8ab43a 100755 --- a/Classes/Utils/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m +++ b/Classes/Utils/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m @@ -14,6 +14,7 @@ // This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php // +#pragma deploymate push "ignored-api-availability" #import "IASKPSTextFieldSpecifierViewCell.h" #import "IASKTextField.h" #import "IASKSettingsReader.h" @@ -66,8 +67,6 @@ } _textField.frame = textFieldFrame; } - - - +#pragma deploymate pop @end diff --git a/Classes/Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.m b/Classes/Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.m index 0e7c0f579..d66a1eadd 100755 --- a/Classes/Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.m +++ b/Classes/Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.m @@ -37,13 +37,6 @@ self.landscapeView = nil; } -- (void)viewDidUnload { - [super viewDidUnload]; - - portraitAttributes = nil; - landscapeAttributes = nil; -} - - (void)dealloc { portraitAttributes = nil; landscapeAttributes = nil; From 4cd757a625accb54715d9a45b1afee3fb8efa630 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Fri, 5 Feb 2016 14:22:44 +0100 Subject: [PATCH 21/87] fix typo --- Classes/PhoneMainView.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index 53c332c70..4998882d9 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -517,6 +517,7 @@ static RootViewManager *rootViewManagerInstance = nil; animations:^{ statusBarBG.backgroundColor = [UIColor colorWithWhite:0.935 alpha:1]; }]; + } } #pragma deploymate pop } From 0ff3f52e9320ce04fd7b14bd29e7e845ff987c4b Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Fri, 5 Feb 2016 14:47:29 +0100 Subject: [PATCH 22/87] travis: use warning verbosity --- TestsUI/LinphoneTestCase.m | 1 + 1 file changed, 1 insertion(+) diff --git a/TestsUI/LinphoneTestCase.m b/TestsUI/LinphoneTestCase.m index 4d73db3c5..db5b8ced7 100644 --- a/TestsUI/LinphoneTestCase.m +++ b/TestsUI/LinphoneTestCase.m @@ -47,6 +47,7 @@ } - (void)beforeEach { + [[LinphoneManager instance] lpConfigSetInt:ORTP_WARNING forKey:@"debugenable_preference"]; [[LinphoneManager instance] lpConfigSetInt:NO forKey:@"animations_preference"]; } From 9bd5716371ef1c7d3b3f98e9b6b277050dbfcffc Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 8 Feb 2016 10:44:51 +0100 Subject: [PATCH 23/87] assistant: apply transport for external accounts --- Classes/AssistantView.h | 2 -- Classes/AssistantView.m | 24 +++++++++++++-------- Classes/Base.lproj/AssistantViewScreens.xib | 5 +---- submodules/linphone | 2 +- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Classes/AssistantView.h b/Classes/AssistantView.h index 2ee58224c..fc9d42873 100644 --- a/Classes/AssistantView.h +++ b/Classes/AssistantView.h @@ -70,6 +70,4 @@ - (IBAction)onRemoteProvisioningLoginClick:(id)sender; - (IBAction)onRemoteProvisioningDownloadClick:(id)sender; -- (IBAction)onTransportChange:(id)sender; - @end diff --git a/Classes/AssistantView.m b/Classes/AssistantView.m index daa9e9877..23ca6ebde 100644 --- a/Classes/AssistantView.m +++ b/Classes/AssistantView.m @@ -225,6 +225,16 @@ static UICompositeViewDescription *compositeDescription = nil; } } + // set transport + UISegmentedControl *transports = (UISegmentedControl *)[self findView:ViewElement_Transport + inView:self.contentView + ofType:UISegmentedControl.class]; + if (transports) { + NSString *type = [transports titleForSegmentAtIndex:[transports selectedSegmentIndex]]; + linphone_account_creator_set_transport(account_creator, + linphone_transport_parse(type.lowercaseString.UTF8String)); + } + new_config = linphone_account_creator_configure(account_creator); if (new_config) { @@ -477,9 +487,11 @@ static UICompositeViewDescription *compositeDescription = nil; UIAssistantTextField *displayName = [self findTextField:ViewElement_DisplayName]; [displayName showError:[AssistantView errorForStatus:LinphoneAccountCreatorDisplayNameInvalid] when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorStatus s = - linphone_account_creator_set_display_name(account_creator, inputEntry.UTF8String); - displayName.errorLabel.text = [AssistantView errorForStatus:s]; + LinphoneAccountCreatorStatus s = LinphoneAccountCreatorOK; + if (inputEntry.length > 0) { + s = linphone_account_creator_set_display_name(account_creator, inputEntry.UTF8String); + displayName.errorLabel.text = [AssistantView errorForStatus:s]; + } return s != LinphoneAccountCreatorOK; }]; @@ -728,12 +740,6 @@ void assistant_validation_tested(LinphoneAccountCreator *creator, LinphoneAccoun [self resetLiblinphone]; } -- (IBAction)onTransportChange:(id)sender { - UISegmentedControl *transports = sender; - NSString *type = [transports titleForSegmentAtIndex:[transports selectedSegmentIndex]]; - linphone_account_creator_set_transport(account_creator, linphone_transport_parse(type.lowercaseString.UTF8String)); -} - - (IBAction)onBackClick:(id)sender { if ([historyViews count] > 0) { UIView *view = [historyViews lastObject]; diff --git a/Classes/Base.lproj/AssistantViewScreens.xib b/Classes/Base.lproj/AssistantViewScreens.xib index 42b5e62eb..78f78f123 100644 --- a/Classes/Base.lproj/AssistantViewScreens.xib +++ b/Classes/Base.lproj/AssistantViewScreens.xib @@ -1,5 +1,5 @@ - + @@ -577,9 +577,6 @@ Once it is done, come back here and click on the button. - - - - + @@ -223,7 +223,7 @@ - + diff --git a/Classes/FirstLoginView.m b/Classes/FirstLoginView.m index 8c34852d2..0752161f3 100644 --- a/Classes/FirstLoginView.m +++ b/Classes/FirstLoginView.m @@ -178,7 +178,7 @@ static UICompositeViewDescription *compositeDescription = nil; initWithTitle:NSLocalizedString(@"Configuration failed", nil) message: NSLocalizedString( - @"Cannot retrieve your configuration. Please check credentialls or try again later", + @"Cannot retrieve your configuration. Please check credentials or try again later", nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", nil) diff --git a/Classes/ar.lproj/AboutView.strings b/Classes/ar.lproj/AboutView.strings index e3dd9e8fc56720e6e3a90ccaa69b6d481aaa696a..41930954376ee8bed3e545cca0bb8caccb860b4e 100644 GIT binary patch literal 3770 zcmd6p-)<5?6vofhUhouz#559@BBoU|UVtE?O{qfFHr`MQbX!^)SfKTdd`a~;1B=~q za0#0bvSD^-ICJKF-}yIxekWvC(vp;S(vzkPd6M#$UrLUpDhI5cNt^#t@`hEP?>ojo z=7MiuZrSx3J-afoPX>8UZdkvNKJT_+py+=$+Nh9xqrZ0z*Irb zd6LMR{XV=J^iw^{_$W(5u3*BKBIBtX&ixSZp-E({?kKzdarMO6cXphD^VCVoGpAzT zJ5GtUw6n)pa*UNx>_kOM1?!K&Ux6};f?D%ej@^ zT_tLdJA&BJBy@y}=WZ5D$JR8LTrgO!@7`V zb6DcXW0&0i2DXvxG2YYFg630BAOmM z26Nb_n#5{|7ww3Pb(`vE5|;HFOP3Dy2{yl5PV2-{eu2|P360Zj!W-9j1!Am5w{JvL zOpmJS!(N{5?aE7giwZ}iCZVwxJ~6KSiyg+J3j}xB)v~QW>vtaeOwJYQp(~{=#pZAGW2(d}n3#|o<~Cm@`onx^ l65Dy359izR7?@BUZ$ayEhjO`FU&_Zvm^BG42Er#Mi5QQf}$B={|g(3*mTR~!CY@0&TYC#m!qDAm$=}xpDA}DQ|Q8t zJHZ!l=hkK4Ko?zm61u4E#@*bR`<*#6^Hv%QZb^KR;Wdae5#U(7#Vq( zEfx|!<_@3oE+6rJ9?6Gwm=1gy>WknSQ(Qw*yOa*PsZ!Px6zf!@kZSU-N1BpveHm19 zifU%v7JM~E(8h?ZXRID5`I<@OTHhMU#E|`K8ktO{6>^0m_E=E>>z&-XB9{~1BaN+0VGUMjMficQ+WH#Yem`bX%3XkEd69hBQP zQ(D9!%8*srkk4en`ZM9zM;~NEeEd9ggABiCs|OM@Mm_65U+99byv7SDp=t(RX5ZKjvUAq%EfH=*FV~LSLVTjX?=-*JR0o(^;6`23=Lo zIM-w|g;BH6Feb+w7DE;Pzj5q>Ws3^+^xQ1i3K_}`mWHv8yiahYS!g)4ar3bJyPC8h zU#LPMESjo4FZ*cV$@#LZ8QrFS8_~W3_j{|7v@^% zsY?fK`Gx*c1KXJ_aQ?veZ33ZY;hVE*k9_eb6-D}u*(_=Z;w)+w8jI;shsBZ1_an<% zoz594>8#w`gsojTTPAx$G=kApaa5XxhAPj8QDgM0Eqi3KsVYk-h){N@tC=AdTb zf>ZNjSgbYFQ5kKtj=yVM-7}KKVI3PY@9wNp=%SCJ9ur~HEHrG|xV~7PtHvCG%Jju^ zx`NT{b16NfS^Qr$Mne#vjhcnVr4^Qb*-J(bP+8M{(OBUIUE3b}65dE!Vl3ypPc z+&pIU)SOoNvaxhfdRAbyq%Jw9yGT3m^>XnSIzy;!In(;7t0EhjA2Dr{=ZNGHbLOPeAZpGefv7$HwBq^huH;UAAuPzmOP$)M=8+RlnW5AXio z7wu9@+cM2+&FK9$JK$yqy}>_bZ}{Ya*(~*_A&cjNW}(dk7e8KNF1Yi4i;gVAxY60B z5}cw-;@CBd*TK7n%msUteG`xS@}uBAuRpu=lI(unXYYFthL3G$tD`(x37$0zEyrE_ G7?VF|ksz=D delta 77 zcmV-T0J8u7H;fvPAd~6_60_O`90QYB1S*pZ3W}3J8z7U82^5nW2^zDI4JHJWkP{%2 j90e|uG!qn)CKHO2P#X}Fehey;#1#~?wiS*7lQ0|3)A<;` diff --git a/Classes/de.lproj/AboutView.strings b/Classes/de.lproj/AboutView.strings index 2876bf526679409b09532f150483781f61872c35..893cc0d5d1df84c6efb24d97bc9089153998ca5f 100644 GIT binary patch literal 3774 zcmd6p+int36o&t6o?^mflc9+5fW`|@tk|Yhp=uj%C>`jOTAFfd`$oQ_QNO*1!A{vY zgh?8*!!U=n*INI-PW#XAoVK+kPj7XhwuUTEZ}{bPsJixeccOrAdA;WCi2EC^vCJ9w zBVDoU6?(QcwX1-9s7v0TX~2J=0{_?Q&9pSodCuDod+T~P*Y<=RfqdPm%eA9V?2qhj zp*zRDOQL|5$gBKZ(>i|Tu<$=Fsv29g22tcy8y`E^HmrqU3N7xDZtw9HGgZ+k%R}Dm zAHl0ZAL&`fM@=pDVPd2z*JJI^;}G-Vk|co6Qqq=o6tMGCEn^E(sU2t9z3jcb%*~&?1S$a&UUD*6)Ic<_l<*Z7>~hfK#L11<>{1MB#e#>L~G=O=WDmoPD5amxPWY+$mE4As*}%f`%HYKH93t- z3aH2&Lytw{9_5rvA#mj(H~{T*$eb1*VVHYP`~ zojMFLl1+BsefR9XIlq5p`=*?8wZ(TJ_p-;eb89<&PM`mK(&owyXOkx!VD+8>0jL``i*0b4 zYQ481HBuD6;p*Gp-!G0B#$F@>h%PsH0LC!T!a zUXL7oBX<*@)3p$_Shn6xL{o&WG0mETZK5s8W(rPMVE!0%CAsEUmcs}}%|gQ%_Bktt z67hfKQvu5n9qQ?|xdx|o5Dc+2jCJLGh%3!P!=d?2!t(EWQdV~8LLMxduKiKYm;k{V z)hu35Ptwq(!9U-gG>X8KeWBtpY(BaIwv_agGYBW^GRBF3`(# z-BlnLIS`Fxg<}hplWZ@b4kx-xv(RvbeY#?B(UujMYoVrYQz*+Frb`)Y*OKM{Us38b;Bh5l%G3s?z9N~Juu&h;?o4$^YtIb2$s=(P6)$5@U zjH(Kv(kwJoNiobDqg!t|rHV~g*+f5hazbbIRfoR@HH$PjwK!(QT1Fe?QAYd3TjXrQ zNF0Y%Y|Og5w>qJZI`Susk4>}CuxWl>vAk4|xd4@!iZ@IJqu5s?YDlyAzj};@Ah;Se z3ysP7_ZZjrocK=KK-J#B;gOw(>&%#Up`N2zXeeD{N~-0*ul1T#^9i}=p?A!?O_8Y^ zWL&dwt?HN1dfK~GJm=T!NEwAtVvot=yvf`N;?yiO&NaVDye8>Zt?$KS>7w)cpvc;O z+o2CtLRd5l4U6V?RxIH;+;MvM=wn?2+qs>V4ZC*`o z^q81q*bL*0TBN}ljv)!-JbF&q={?K5p$$RZrE)!##ulA8h+VUA?K!jT1J5HT+o?71 z5bnohqKd-sxGNj!!J36@J|^+}r0ymi{<(D#euwGPOFOd6yP8q^9d^IX?s=VG%)ao| z1G913Q9~B21BHJ&DpjQj!1cq)v*-Wc^Y!~zPPS!B9C;}N>BxlP$P0dX*_XQPvUVgM-}3UD)qwd0 z&q(Hkc_8QPdWN2DnVV5S-j^ZkCo@Dvh;=?9UFuIfMy5_3FU5pGik2`Xh4Xt)2 z@ss2$JJ`RE<{cPQpBQ83fcGXR9vSAkyzRoG+CGF+kN1yKk}tgdU|y0U9#DjfaQ2wB zDpCW62fNCwYF2L^$ybJAQGFda^v(B40_Sa{+MLk9GhMWo}l#JNqv=7ZNr6pw>% zM>xMR)0MtlVc*q)30;Xen*9^hS#MAg-Hhsx=dr=^kQguXD<<%JC*rxJ`=OxuGs#4Ky*(B@;(^`}L4sW02K$x;Hk`KbrSb}=s}k!t4eQ_k zQZ*`gT7$~pPRN@+xix^pGL_twC#I*0`=w37#^FyQp-HZ4@YJ|aEm{3=wf6aFkNVqm zkvCe@KA(LWe^u&f9HC9ZhA_P~S#fXDNjtD^@9?J}o`C&=yyMc}PpFh}25b^G1~#!P ziHp1M@MmO6oLqShUZ0N2rQbf4x3^H+By3(_kMut$ CQ#sNA delta 388 zcmca6`-^Xa!(=@cfyqp4a-yaTW(-OU)(i>^S`7LOTtGHZWb#2S(aClk0+S!HxJ-25 znD|I*G8>x|P^~$JT62(E_6&v+AS{^p(0ihS0{2RwX+{hN42BE_llL>3GAc}FWRnN# zw!qMB0k&xYvk0RRROLe!*U33dR!}`=Kr>KX2NVJ8S;PTSQ^+1U*^Zk>(U3t8XrBUu z215Zu4nrbCGD9ju217oOodRSPF=&EaU1r$$oqqlY6)l0J57)`Tzg` diff --git a/Classes/fr.lproj/FirstLoginView.strings b/Classes/fr.lproj/FirstLoginView.strings index db6e7e185e3f6371911d9f73284d4c2ea5466a2f..f29da653b9bdc8871c9e38c1cf3210ca690208ce 100644 GIT binary patch literal 7398 zcmds+TT|L#5Qg{KU%`0ej5D!Sd(i3hLKIp%f+z5Fhi58UIe6k9`zP8y`-K>t`>O17wZ^9xzWF%`?B@rPB4@(W)wtTG{2c;NfrUZdCRqDh+uRJYg7sRhYHY%)Da#d90X+ia@$f|s!LW(1bh`oAPDT}OMgrL5)b~j}XyeN@UMUw;yZkwJKB;fMSHt$luqZ6yZ$TDfWOtexD1mQH z&iF3NdLK&5!a~`-W-gUnu7O~aV;eLZFqt3yLHssL43EHYgQaGzE*~TLvMekl1=cH( zp(ScFLu7m};$eC{=9-i5aFs_smE}Ln9v!2%UM-8a%v=`UI1w2QbEVPo*I+JH5;u<7 z1I;jKM`R_7`taaD-4S`%pb)7D%OYt-6!1m)SJ^c~*YrK~)yQ*sY#F}3c5JO|nE^=> z#gnD4UW2?PvwZKdGxB}-`z1G#n}Rg^)u zvMemD-D}3l-$8EBzUd5i{2bXOj_>{Z+jc)Uv2$=Wu#Q|;%WHB_PXR;guSSE*Kv zzozoeD0W{IXEOHL#Xsep1+<7KTX1loV1gZKSy)(Ki+##yuN=y&2!;Y@kLR|6jqb}k zr$3sgub@8#cr6PXuc}woUlZ*25`Alh&n8}!@S@zATa)g{QL)k?IJL{3(_M5V5tgznETrjAelM>gtJL)t(P*Hc zbgn8q^yy$+r|UX?z{eb>fUYiX3(;* z&@@BRYwG*X-Z delta 76 zcmaE6*&sbZVX_@#)#Mg-i_NRp<}gjJW6_#iz|}K}M_{s@sKDefPQA%0d?K60_?%cK bf8bV_+#`GiEb)d%Yjd91CMK|;p3Dva={FiJ diff --git a/Classes/ja.lproj/AboutView.strings b/Classes/ja.lproj/AboutView.strings index 8749d7ac75b62b968bd33d7faceb93daaff39c23..b8accea17544922dfcf1768b9be2936915b1d8b6 100644 GIT binary patch literal 3730 zcmd6pU2hUW6o%hxeg(n1CQDb0A85P)#ez1aEmUpe4W&T0U}^X$t%<+D8-Ieg{z>(j zT^74#a0#0rnXt_4o;h>g_k7LoUny;COKH7QPYn$jX}#o^(UB_J<=v@Te9PzsZ%52; zc!o0P%tyLn*K_o2YvPYA@}4evf380NEoJ#1s58}4Mdt-?o9wOV^-SACcC_T^i`qP! zI$(cr?iRXJ%xw}`v;-Wm(6RV%hb8_*u3+iC@ zgm*=xdW;r48V-$S6SsYRW{g=IeGS<1{O`jUcI!yhIiX4nI%v=7&2&e|u1&%gZJUHQ zsqc(e?q+Vl@WAK#5qX^F=f*I5qGLa9ukoRShmMKeXdc@nY|JiiO>*27qIO?p;$csv z7=&lUN&{?d;?Yq}h1rfUc5D)Mg!AXF7fai(UkXs@ZhrvV zSdV$$(!s(`6ne`hVMn;EHOYN=|0IvdtWohy7RF^@hw5rNN0EwX`sp>8qdv7sEQfgB zj-*&OseYzm*?v3e(4pSJ=0~5?8nKk0<8)ra#_1;EP3pS>F;=D9*JCQCM^zocUY_pl z=&65WibkYO!p2_o#H9AmcNmW@5Z+st%eMZs-+AmaIaj2IMzPr>Y}l5!CMoV!Zpe#s zV+`UU*l(yc4)^vU-7(65O~S^&Dt5(jvHqL;HC5snOiaiPb8{~d{ZT$_6950^9?h-A d{+>_?uR!K;UvjudU+C>Ud^QQ2zoRFn^at?+E&2ce delta 388 zcmbOvdxdX;!{k})0uu}5L`@mY7?c>S859__81xyqfNY@1WJ6}r$qQHnCQo8@ndrbV z@sZYKJsv5bT5}Aw<{-7~84M*rSTOOS_e2E+?v+5(j2H|U3>ge2uVgZ1RG64A57cad zq1ghY8B_UWM~-@kCNrQJsICKw05$nDDomcp>OOf6yO3@GLk2@WLmopa&{jhRJ)pe` z3>pjt3^@#m49P%IkZcY^3XoOApb2t`8PJR9hMI!CJb_z*(QtAgd$hJQP*V{pMxuwJ b89WqafJPo<(cG-VsKq#0fKOv`7FQGih{#8E diff --git a/Classes/ja.lproj/FirstLoginView.strings b/Classes/ja.lproj/FirstLoginView.strings index 3c74348549f66dc23e1bb16f50976c082c39b710..ef2bee5abb27cb834dc5bb435756921fa268d8c3 100644 GIT binary patch literal 7126 zcmds*O;X!H5QTfqDJYgyi3rG#sZG3x>eXfB^>s#xk+tJh?=Uz%ob339`sG zmE@Z-!X>GNG-X3VN@XFWmZo37p6)mE``3s(lW`f9IcZ2$0*+C6!*5I~vLu^QldiO- zBz3MDa=`u9Jgv$;N6p&TWsj!~er>suWuEO>+x~X~{%^?{Pfoe&ePI==kNmgKTT3#3 zH>xi?awr}nO>th}yBoJ}jN|DD*P6vdE|13UMycR=+@}$~eqSt#a*3~PIR}Y*6iSTO z2JNwp-Wm8z6q_6kqLvjC69rGMvG(AjBr}PaBrRNHlI@{;gwBXo3)ZWk+_V|eAP!+> zEX%6Ah5eNW!mp3s&w}XqS?Kzi-D9f_5;HeKGz;W~x!2;(6}T_$)jsDMY}f45x{XAT ziT8q-c=C>SJ!15M*!9Nj&w-@HgdN>@)JN#*)1Wb!$J?^Z=HPS^<~KpNCMTRLvYx=G zS!fvJV-AX84gcSBY=dQk%5?wSoVJzGlMa@Ku?u+-<4Uv8aA@OZVflMCsUV9~ArBT! zwSFbLRQ_m=Y8L-bP14Zi!9U!ZG>rbdMolt(zhi54*x}Rqb5V+D1&``x^1Z}NFUNS- zEL?g2>VNUS`#=2~-^4U)7GzcCC2H>{TY2lY?_Mh1f0Ws-E0Urd@wP`@o#wnt#+MR^ zlNQ_>Wy#?Y8H8LYJLog zwSp>IKohOtZ<(teBWWB~u`%=R$|{5aT@?0~5SwP9VbjKS#qv-!<^WWtAD+?`j8>mY z=pfDFY1J4FL3B2178;YouQ9GGob*b1jGjG(!wuUHXXr7{V>L&!&``Sil$Fbmukz|- z^A@pap?A!xrcBq3GOk&;X7zAYp0<8UXZwWRC!-D4*iZ7fuG4X%2sI0hZEf5vMza*F zR`JrYT%cS7P!w#XZBl`@V^}l`4U0DJpjhG^xaqXs2(aD<+n(){$9BIU%9CcHVawyk zu(9S>JOP^M2%OU(^yrn>uo=ghw8(=q?n4&FVN@G!e>FXS&DyL3>I*X0Lu1TQgQM6r z3)gC+`ScjEn9r?xJ8*tY1gdBXkGBems;gPJ#^J{Q=708oP*zGQrBs zX!|C++-8@&#vQZ&dvwcYno`tIMfuk(wA|0*$G^pS7tOc;+eTBH*?)`%iDK6*o<8Rq vsyw*E%p1GgcOM4lS^YRq??|t2*X(WY!0w^#WL1<#BgV02q2+fTKStyanrbZ^ delta 65 zcmV-H0KWg$H~1NlAhW;)CIgdD1S*sK35t_I6(Ey-2^5oT78H?Q2h2y;V;w4H;Rz;g{2iYC7cIg?zr{^qRLJ^Lw6=%oX!c zckFtFo_$U1$Ri)7um;V$?%>QSWCvBKBPpu4vpPylH)B zyz)4+rwk7)*H6jw62C$Mv*$XqaXrR|9v(U)w&Qv3l5jD*zBTD_*NECoTf z&j&hO)TttGxg^{O*R>|S4;N1gh|C5R&tzdz26m~grn6M2h^F6;!5sIgOJY65%XXy2 zx=Zyl3(M}?OP3Dy2{yl3P8-BhX^GQi2^Xikgg344%EVZmZr@C(m;qHaguN2o+tUks zql!nQOTxuo{KT~OFL#)LE)d;o*UPs4tltIfGdWkGhsLqFBwX0mwWSub7KVJ zA=vM!H6Hi+A>A>~fJ?%~z$SJjak2fI{g^885+)|(hPl~SiT*erE{Wa0*~fElbv#U{ aly@KxxKDZ9v#<4W0l!Pa6%X+fGx`g!lr}s7 delta 408 zcmca4`;Tve!{lA;0uu}5L`@mY7?c>S859__81xyqfNY@1SaAyYj>yBW|lRCfYJfZF{T6((pjt3^@#m49P%IkZcY^3XoOApb2u58PK!nhMIyszkyqU(QtAhd$hJQ pP*V{pMxuwO89Y3NxV^!4=YiZe`5}wuW*tT^#>oME8k4)Yq5wF=OtJs~ diff --git a/Classes/nl.lproj/FirstLoginView.strings b/Classes/nl.lproj/FirstLoginView.strings index 8fd48bfc725a37a9c925358579f88f785186ff3c..918214345836218294542ff77371976058aec18e 100644 GIT binary patch literal 7170 zcmds*UsKvp5XJYIPvQ9JOl;NG;&l2T3e}D%T9N7-Dhd^me-`A!xBcCVkx8;KxdL|T zFvLhU**$yq?w*@JzccbqmSjP;q$ySD@mY{Bd>5rGyK*cw8A@LY(%`Hqm;C;jt5vz+ zQ?vFBIp=DVZ(kl{k89`FcJiDa|97Rum0QlnPdLEpC;we=*RE_od3`UZawQ&~RypQ* z?$P5NOGKLCT(ekC71838mokxuW6JRK=W>ygdt&X&9Z1}>P{3awv~`=k7WhmS+kBd2 zEh#4^3!aRy_TZx+8s3%5+X`ut2fs4*)t0- z5cHpfZc^D}w)!A3Yr{vAr!LHIU4D50_q{#4;8=t0n!Vbvndl|r?T`~szHzTdj((84 zvCqjGh*~UL?M~tn^}tcg@0;_X;tYS=qNynHe&U zD``C>_2^x?@Gskg8+HQUD>`6-b+2oaoLqCaM^tMZ)E1bfs%TkC1!m=V7rkl$94V=LkKks z_o@v?1*k@HFpSG6*${sReGodqpX6psaa^X znH0mUF}n4ZQ>xf>l}$8+Cnt1QUwQazP_sybQ;TC-tY!339(A-&yhYB&jKpzR#m20= z2dfo&C?tQ%_}DZH4V&iI70bMO%q6JIWV~f67}dTSQAC=>|J7qO1i{s)S!hhozQ?%k zb>in?9c6n9heviEZZKm$gnEuM@^@s7#kyus`VV%01(-Zj5T+$L#Pt@p)a>7ZeIpvc;u+ol&)LRd5l z4U6V?S}fsN+;-Z7^z81y1EHCib^8t>$dhKFVM`Ootg)uoK0VaYH3-*0=rJ`%uo=b~ zwMc_A977VuS@a$4oojsknqAre)Ez3`nW}&TvG;zEXvx}}w&;Jl5nTL6!v`r_dKQc4fn`;(ti+>Gakbli$Ui>G` i=`=GXzVD5A4}J>MSEx?2>epE_L9CjEhBZwb8Tkt$o+|VJ delta 69 zcmV-L0J{HzIF1^SAhW;)FawiN1S*pT3W}592u`z#4JHJWz!L0}@CXo-{0tD2hzuID bo)w}3lh6n-lModYlbjS9le8NYlcpP7ZuuDn diff --git a/Classes/ru.lproj/AboutView.strings b/Classes/ru.lproj/AboutView.strings index 4a82b772c293e0a851f178957b9a2e8185a9e4a6..e61414303368ec9c3cd0aaca7452f60e78cd878f 100644 GIT binary patch literal 3766 zcmd6pU2hUW6o%i6z2e#*K)7tOlw#C^sR<}nDk)W{+Qu77fo_YX;j{H0`6tz978bi@ za0#0bGGUpWJ#*%~@A;ZPzZ2Tkj*@z-t{NIJk~-j*(y7X-uy&yq-%@(b>X7+8&p_si z`A~Q4%A;pj6Mv+U_jJqpm3sWQl;*#$&P+=co!6{3*<04TxwbuawB+ii+B}>3#Qy2I zJLpa@w@IYYGPNo-*R+mZ2~PMQ7e$SHvt(P$8$dfeApz?zV0Zy{&DrpdE@Lk87J%PJ4L7BB$a37 zfO*Er^E5U_aT66MhuD4!`a{?<@zBS{F7GFBdf~Iyd-}l`@ow}r;Lr2F4>R&L1heNl^CNkT4_!QTMl^>r+a_USc6Dpw<1Q1m zC;C7<9IF(8@RC?*fUQkDx~i!#-x0))O~Q_F@!ZW~Y5Nt;B^L~q8-1ptg}r5y*c_Jl z@z^1^zk+R~7d#*6X+duayk(QHBV5&*_&$7kl1F6LsCXs|qcX5Vbv3=DNJTUqb`0jQ zPi+#bAzrj2F4k?TpGjD@-&ZGb^ zRfn*bqkFr0<=>&g5owdKu@^ouuKkN0#-j@aH`&#)tvBm;9{Wtr73ra2Y&HoSw$-hP zi+i0r^YYvnfp`G+duol#O@2Uk3^QPpuraWXT~S0Wk_IdH?_b delta 397 zcmdlc`+;wQ!{jyW0uu}5L`@mY7?c>S859__81xyqfNY@1ge2?`AS(RG64A57cad zq1ghYSrkb*gDzB~5k%wU`^>JBGnlL(MwkIjM0G1r1ngF@lF8?}QWXsu^nf-iFlaCo zFyt^KG9)vkGGs911KBA+RuO|H$Sr0-Pof)S3N}cDTY=GVvOk9>Fnolxoq-yQfZ7y* j787MGdRUsl!%_xptmbANMjOV-$GG?=mPk#m;fewPCXP)r diff --git a/Classes/ru.lproj/FirstLoginView.strings b/Classes/ru.lproj/FirstLoginView.strings index 19ce609e0160c63f893566f4df5d6ed57e8bdeda..da43f8d5f8854573a8c48d65b60a1d04dd7ce773 100644 GIT binary patch literal 7138 zcmds*TTk0S5QXOa>kQWuI|3Dfz?m`Yw*^pEIo`mDSL7x9wSY2 zUgo>o_iv2j=?K@F#Y85L#vVqg;(64k5x)LdEJ|{PuRS>jiF*{vjMoEg%SP`Ed?t!r zjt)^vi;0PXCw;6v_$bRFYUgUr5Ts|OM@Hv%-vtpU)ie$=O%17?bEi6grAD{f|z*njdwj_ z^n=*ljX9VDaf=B%y76d$(AB45W3Ys`6j}t5n}#w)VDd=e<(;|0wfa*CZu5=53G4I>ULNoG-^P$1Suup2d%0 zu}14*GOjYQD1qokrZ{&%X?lmzcR`=gEHqrvFVrTLIIMz`9sM;4o^vVeB*WS6QMD2`wbY8F{=YJLohwTdoUMis5& zZ-uKnMv^$JV`Jvst|5al& z1mW4JS!hh=Ut?U?ILVc?g`z!$!)@CS=jbu-BQ-~}&``Sil$Ogcuk+eu^DeQtMDLh& zO@*!-W?Zvy&FZ{$p0 z!8rp$k8atA%_z>eMHZYth2Lej+w7J% zxnuT$kM9{x(u*3ha1Lk|TK;G8?Z{&OV9O`doS=udA zm#_&T6PDT8GiT2CoqzN9Pe!}iQC6=tR9j<4RJ)RwXVt;t< z4!SeUT@rb;gjVGin%1!^!wLW6qN0gKYY>H2wXw0o*@iVAOuoe(=;jV@5mRNIGP1~< z{QkrYq2VW*4Mp$W1I)K#^%Ug%HIu;nqFJQFG`xh1Uowr}iiz?v%0!)Onr>s?w z8Zx?YYj`!9O)OvP2V=s!(bu-f%=d8u<1Kc!IH5sYdT1}|?R-bXxJ$wnf!l;Pt?!Ii z?q+ky@W^ugnA|S$D=>`SO)q`O^bWWC9ydy>Ep3aZhr;aL{E6$ z(AA>u6nV=f;YPTsHR*kL|0JKtY*O(|7A9q2pXzG5Nrj4Ndh8U;ai6**RztjOM_R1g zR6nz@?7p$|=};eF^PA}q*-Iq!5n`%Jb~=$>&@E(sT^)vZa3d!768!&xx_ z@fhsaR2h$3{FuHNXTT-lVqhJ+lDOFXJ$_1kcn%XYvclZstHgbr50}Jt-s4xz?HP6P Y3ba1ACy!h8x!&Ky?2>TBz-?~-1Mn~~MgRZ+ delta 438 zcmZ1{JBxpU!(;(&fytkk5amxPWY+$Yezh)ya>TT_!qkOcvsC z0V*=bP-H&2kyUi^0v?WukGv)-C~&U?8ezm>z+lK=FnKSNDWk&Vk4*AFofa56EkHU^ z)URc(oSemE1=V8)Gy~O1KoPKQKs7*Tg-zbT&8KL{pa--~fkA_zfFXw=ks+BOl_7&6 zAIMGtvWgfq!SJY5Dq$!F%02~}1v0q^s77=0L*_)H g?L-e!GjNcq>pBD72QrOV8&x;!FxoLr4&$l;0I9K4761SM diff --git a/Classes/sv.lproj/FirstLoginView.strings b/Classes/sv.lproj/FirstLoginView.strings index f0ab8281c4f0a4a10b23aac70dea520318bce0b9..c90701b1fb5cffe6f8acdf9d575ceda6636446bf 100644 GIT binary patch literal 7214 zcmds+-BQ|65Xbl0r(nEvCbnunbUM8N1+|0qqk`2tR77gD2&m}u^%?pEeTH7P{p|^n zNmxyypi?KqF&~@k{&)B6{?GC6p9y&-Q<9TK@uemmj+}htHz^fam2Ig@Pr6c)CTG4J za{mKQYjVI*ck)fy=c&)HE7wxy*}jt8Th4fL%31J*b)>#=b--JzvUIEUwd~4~ zcxaksEb`s0{u@(RI>EUmF`dey$y+UXthtn5jEB4#+IHqNO`zpIpA_T*o4fLzx3hbr z1m-TNkDV7)zk0L9;p4p|->5e{xk1_^E+tv$zcKL5utZkhBwLu>LuYuaP4sJ^+;*Ab z58~DZlg^e9SCI_Sdu{Gq3q^jM1GD{o_yk64{v?Ni-FETcCJZ2MOshs8(9B^V+SN#)TsMs z=N!JPWB(PB8mV)6+kYdBktJcFD9cZ@7C|x4n}p^0s?xlyP=`EXsCE0j>@k<3xoJtf zoT_A@OM`!0RcRDGdxNT^T;R&p?Xc_L)w2syfIoQDH_iMKGkz_W0hUD83@FQQEYhl} zy(F+HX;vgv=vBUU=_+v3b>a)BA>;!|T%|z8yaaJq<{0;w0i_|_!xGkvU*}88p}LF> zM&$$#XDCUi(^uvaUMYaBCo_z`vn`t2mV|}yag{j>-`pWbd>GdE6l`;aZc_o-iOe&; z<8Ln(K}#ZQ=2l^vKHpZ0lmVyXnMqN63Y;OM8SsbkV2RJeL+7iSV-A$slL+lpm zl^)DNc~&$-EeR__qjOOCk;Y5c2>QL}tu(t>qBSNDukfTwoekMY$So|1WR&BsG!@5V zwqP=OdP1=unY;Q(4H=z>*N#ba;7?)a2~k=S7Ro#ttD-z`3C*GYhq1zO)t*DpY1cfZ zYbd9m9pX)v#Q#@&EELfhYDrj89Z&5U-74)E9(+nHw_LYepa;E))gnv6LOQxt+S9Ya zCiz^&3vC#Yu7lR-c+q%U5?S+l9BeS#dhdk&E9DLw>_~Z>H|a!CoR)+Y?T4)QlGs7E z%6rakTn7~MuJX31L_0AomV||6l$AGRAK`vVoF%j}tx`HjAAoV+b<$(E+YpVHC1GKV zG6n6S{u8WC(sQB?oTUNMIWT&3(Hr6#M>;H#j5I4J8b$4?WLlBwTJ8$W=VY)4_gJJB zN0D0+S!>T@c8^Ellcm(`_=?Ei;E5Vs!{e>_p;~N7Wc5d2Pg((l8 z3@eFZwLYwcfsxVKEVbPkbz|}GN1Bc({6}(m~lOJ#>Oy(0lGl^4R^BU0; MOhCTDXp`RBhu8r9h{prGWuj5n9c^*s zt8}=wWSjl|xohZ7aj!{a(c)W`nQ2FCm zR*f}LEJQ`b23GEZa|2$C=LcBR<9Q4A4lF+{o;KmiSa=3=ZJs|$UcT`3gZsSX@N*8t z{@qjFm5}PO+Hh$2Gn!4z_T`i{;@RkH!jx;j4T;P|BV0K^jY|M`Fp@WC^h}&=uYZ4l>@vTXYyF%1%$vfhq zD&+`-hr~(~Y#rj!k-8LTJA&BJBy@!H=PnmZ$JQ=~TrgNpWQW=n_Le5GJS@rMu}f}$ z0^3NQaJ{5^1zjlcmL{PijB8DDAKpL7B{J(&Jd=e{8Q7(|nyyizBAQ-026Nb_nnXOr z^L8Y~x=Qsk4a@pu(xpRvfX&aA(>k$KnB#O_LgRFm@Fw+Lkr=Dd?Hdsl)1|6_L*!e(LKYcGzkq=d~1?=Y>~P6 z;j9>ecnJ0js*J<5KBO;(8PFs&1{Sd^ii_pX>tpJ}bC{Tr6=q&96Zc_0G>QK^ugA^d a3H9$BR4!AJ!}NSC@9$yLBs5>&=I|e03NOk4 delta 423 zcmew-)5Jf)VKN_!z~o1)a-yaTW(-OU)(i>^S`7LOTtGHZWO5<5>f}Q#E)yL%CO*=d z{ESr!sLmWiojFjQD0>D&2@n=ceCRzKV+2$>bAhp zZ2{7aqJAoK<>VkHE2thbpc$wx1B!t3fYeM5Vvm^2!_A{;$e;(bO@Tp!p@1QWA(0`O zA(bJ6As@(20kVo1G{N?p0eyvTmMPFIQzG;SvWHJrVBsP{CCH~{7~u&NA=0LUEUKGz M7}Xdj+i}$Z0H4lJ3;+NC diff --git a/Classes/zh_CN.lproj/FirstLoginView.strings b/Classes/zh_CN.lproj/FirstLoginView.strings index 2dc0e549d2e30a782f78e5d1fc453da0b2685b25..511bfb646b541581415af59344d920133efa1272 100644 GIT binary patch literal 6738 zcmdUzPfrt36veMw62AjsWk?1^R3OF$1u7W+L#be*7AR0DrO*Ne7cO+if`uQ(orxQl zF5T)UQGf51p_!Rm=S>|jWYS^ioax;2&VA?J_kREClDpC?-7+d=DM*c@Tb}Ugk(^A* zk`$#Ob;(MJtFmnH{bTMHWSygE@g-T~ZkbPAPGpLEYZlx3of`iiNQFDQTs41T7StR5 zTj!}s8M}PzJz0@W@p#jH&g1;FZZDZgx;Xwe0vS0Z z!n*7ce{$|w7}nvqZO5zvD>HUgjxu8vHxh=sC#Rr2RLIJ3WF(@9q$Ba^{rAPAm!Hon z?>ZZe3L|rXt_2t^*&Hat+1GwbX5}gR&Rh{!{p~HC-yY>&x$tUbZBvsv98BK(JjPMq ze0RV%Con#=SL>XMXj-&)OLh!uu}t?F4Nso&tjFj)XVjYSY~^u+L0m7kNDdNG1Cx9^RQ><+qsL|#wm6k%=`|b zRj<>EK0J#ytU?89n%|+ebBlSD$)nFGRnntsn@%Q}e;Pu|KQn_m%|U-;{N5_eCz&g( zke$X4MyTVSEaQWI_4ntLhG@qrJy*!ljf~Ta%n;c$SIu#5r%VBinK>u6O4sN|eCPLB zXb6o(=M1jO8#dr#YSb=%Z93ljkq$&d+yrmX;ttLy4WX%)mN%rgPT8hw+(oYiTdRht z0}n!8p&>MGN!KaY-$j+k%w@P9&{dfAz%-RFsH28RnxScRQOVXiJM6NU$~?!uiN|$` z8W7~BAv7J+ia(h%?z2x+Bl02Zj8(iNABtZ?Xz_RMjBypKny6>5fnJBvnyp*gb`>2| zL_=tdOchQ`m2eey?<#8a9b51jfQd)tIz_86pD3aoAJ?uT4VTCzT7Q_8%P|c1$w80m zK8iO6d1{EHF5#Y~X^g;_bMJVJs;BTSP|ZD_8j5(NhDgf(U)2xK)Ea(Ql|I%nraP{( z4{P>ui+p2tEw?W8YuA-&jDm`52raW+;)vUczFxf>bZX-$ZTeR;x3}pAg4{L4&DL9E siOB9p%f)&V62HcN@jV**P6Ig`&wwgCV+S{r%* diff --git a/Classes/zh_TW.lproj/AboutView.strings b/Classes/zh_TW.lproj/AboutView.strings index b3e841a49d6a23e216ecbb9978a142d36b5d6248..5e0bc125fdd5f56db91c1829137dacedcf776fc0 100644 GIT binary patch literal 3722 zcmd6pU2hUW6o%hxeg)yO$x_7lfyN6^tY`yOsJ4walrD5zEKOOUH8Js*c<-Ip{y6oS zT^74#a0#0rnXt_4o;h>g_k7LoUm0y{OIbZvUu_K;Sv}*I)4poj<=wGdzUB0kw?6Z0 zo{`Kcb6=P2dV-#9O@fg}-qQu|Pc`7*Ri6JV^`=@H=se?XhrKnum}$Gm4p)votIM;a zx9ktk-9mSUxlJOEme8u)Ow%fMWjNtqTvRj)&>BRcRc&nSaJFI11Ctlv_H}cMw}`2- zP8eC_&3+$V4f;^eB0j2W=^Q3}Rd^n$KJ!DwhfN|M=uWchFIPX@ZwG^~?Jqy;#+oD+ zk|JUUEBC><124w&S6I_$y$5^80Y4p9yKrSJyns2E^?Mcdk=1wRMHTRK0mR|#A@3?k z^%*W48vcxC6SD(-VvJZDeQlWXg73owW?M+LIH5uOIcP8H<#b2HtWCleX`6&Mt?!Ii zZf9-C@KwO|eR84;>P>@f@~E*qB}3n)JA9MD3nl5f61$6A+#d zD{ZiKiAP6Gm1jGm*s)325ze2xUM$_9b~)sN!E&y5)ULRgFuH?8l=#8`uF-%6;M9#z$cy%OEq(WBtD z6pu)ogpIxUiD~Vh?=T)+AiA?Imu-V-zw_8RIL#t6hi zuwPSa9PaExx?`LHn}m&lRqRUQV*R)FF;(I*OiaiPb8D{>{c%2Q694zs9?z@AzMfD8 ZFG1yTS8}*RpXv1-Y&Hp-uj40X^as}gE#?3K delta 362 zcmeB@y~a1eVKN_!z~o1)a-yaTW(-OU)(i>^S`7LOTtGHZWHKj*>f}w_J`*2lP1fR( z0xB}cP-H&2l1FypBd>`H3fwD!+Km_t7z`NUok_I97UKfep|M&@KjR;43N2{~ruGrw7>%ZBVqOKxN!6=`$Tkz?+E;%QTk zI9k@eEr&eq@EgdjeB;@nwH<#amB8*_MC;99eo&*jnV!zgt;cYP}G^~YjSl52b&$Q4NZqflYI0cg)`^e(|?qS)o= z5VfqBm?#8thjjoS6B7uer?Cj9#7 z<1C1epM`Fm*(0_FATe_zLQ^I$%)LH$Zoz$RuZ}pkV7q0XwrwQBOuRi}63AEH4T#YX zVmBIdJO`2%^LBLO(HNnxPm{)A4R5Qml7rI)nBN6mP0l&jWjldUv(PZQV@`^phX3C= z8erL>GCe*wmuzJWWQe63SiMx>yL6k<&Wp6X7PGz zl7=o1{^{1FY4qnBHOch-p{>hP{v`0}p#lrhlH_ z_?NA}ZQFgX6%8=MoY!?pNltk?pt>$`J|OQa3EW8wZJy`xV^XYcO-#pCAr>VN-N*vx z4k%6kFd8rFHJXKn%N^4fgO8?c&`&$4sjD1{a-Hr{2iv(6Ie*~qje}6L@XgqyN51%7 zJ(2ukI*S^DIE$Kv#$s~RNpZOOer#E5(l;X=oi^vTVXFaWtIWy(g%xbA&@;PYot1&IjC9W!KwK%Db_mLsEjh&#NR4cBSz9VY+_^P-L2IL zA?hgVFcCJ*Lc^ww>x<>NYRoaHOjo?1D;UMTm{3ES#s5`fGz9V4s99)CPQS+Zu5;2W z=^3i_0uFau#`(MRu?wM~_-8)saz@XhMy(0bZh zDxLFlcA|_zsIj*caNVZw#BpjC8t2-$S-fWHR;})(W9gw^Lr@fLz3ozm8V(lCLc^ks zJ1G{o4|l!R9wF98U^}$k^33iX#Cg&zG;DeNm^Rk@x+g>#oq}@-gaIA%4mMq!NsBx< zT_3VAPNU{%d#&mDYgTAOQ1{5(0Hv`?C5~g)EPQK@=F>~WVlB7!9m4q?5on?;0^TYn zYOiMD8wb~)r^dityM)xxuFSJWGb+E!uD97WZ*j-$2cOZ>a1;=e@D&h~fEOCGmKB-;lTZ|1lX@F)aRL}W diff --git a/Resources/ar.lproj/Localizable.strings b/Resources/ar.lproj/Localizable.strings index 5d9c6834bb6fb0c6da3c54f3aa77231e2accb35c..8687bbaaa58f9c53c0c87a5f8a2688cc100c67cf 100644 GIT binary patch delta 243 zcmZ3sjp^GirVUZz;zbOp3?&Rj44FW>42TsNDjD(_N+*BR6`dTA&Sk6z6bWF+0m>vY z6ociH88U!$GD9{{CK;$Rl_3R)^MIyg0@dU&6i@y=O?~n%Gp@;OqI@(nU&B0N@&Q4X o%>m*w*d}|W3r${-&NKNyD%a#&a$InJ21mr?204Mv?_@1%0TRDKPXGV_ delta 27 jcmeyii)q<5rVUZzlix^kO_rL&wV6k42TsNDjD(_N*RhKU$l^&%v2*Hp8*t2X2=H0 zBm>o@GNb@;9#BsvLn1>CL-AzWS?ZH@%(*7_i1Sg&v{~j6n-j#Bu}yxJBs6(L1`oFq f&~jTKR$_3T{4hxxBsRH$BVzIbdA7|=axo16<+C?@ delta 19 bcmZ2?km=qYrVV-Gn|UN>ux$=gh-d%+RjUWO diff --git a/Resources/fr.lproj/Localizable.strings b/Resources/fr.lproj/Localizable.strings index 4b706262aeccfe46c5d7b61848bb4d48d3517cbc..0d97ca1ea02500bb662ead7ac1d1154d0dcee7a2 100644 GIT binary patch delta 201 zcmaEGis{UGrVYy^B#RhQ8A=$67&3u$84xQlR5Ii6aeX>$qVz; zCm(2G5f20LfV$Gawp9W3l>v1YPxiMH=LMNj3KRk9Or5-Xq2lBVRuPj0r1&;3lQ3eR eEM+4!c~uV2WFKL<$vif4lV{09ZN4Bsp%nmw<~aiZ delta 23 fcmX?ep6S6UrVYy^Hitsi_qJg9r)p diff --git a/Resources/ja.lproj/Localizable.strings b/Resources/ja.lproj/Localizable.strings index 975e04fa026dac18558054452e1b2ce33837c06f..a44ab82729d096106ba2f8e20968cf6fd083be47 100644 GIT binary patch delta 165 zcmZ3qjOo)VrVT5^B#RhQ8A=$67&3u$84xQlR5IiQDQTX;+-Y{qO%IC diff --git a/Resources/ru.lproj/Localizable.strings b/Resources/ru.lproj/Localizable.strings index bb72bf4a6f6f9163cf7b876dee29323945abad6b..0091aa902162467f0ab06957eda431ec9de0eb77 100644 GIT binary patch delta 193 zcmdn7kE!D@(}qXll0^)u3?&Rj44FW>42TsNDjD(_N*RhKPqdPs{AI2Xdj?Q6nIU^J zw}9m23$xWG3s`WeJ2NCQqaSSwu{pC&o9KPeN?-5AkVilcO?)CU3~( onXF^RHF=#J7o301ly9IUtv7azj1K={7WWQOd?@dA>p3P3eQlM~IgC+A4;QD}zpWbxk8iq fGI%B@q;oMkPd=C{4d$&AikkdDo@KM0+_nY)zzjQq delta 19 bcmX?di0R8-rVR_kH`_@rV%t1PVN(MDUeXBc diff --git a/Resources/zh_CN.lproj/Localizable.strings b/Resources/zh_CN.lproj/Localizable.strings index b0bb1337065e96a53883e3976878cf12439eda3f..0bc041b3ba285a7c3b6b1c9ef317ae9d5e132bfb 100644 GIT binary patch delta 223 zcmX@KifPh%rVVBy;zbOp3?&Rj44FW>42TsNDjD(_N+%!G5S_d(fot-CQkKbIiUi~{ zfO5$U*+BVZpz2hH6d=w6>da(FWXNGCo~$@geX^Aym#Q<6p9h5bKsg1lN@|&YBqn0= t1p$`LIwC(OA4`Nd$FOcMz>?0+$*+z=38UVL@Kkfhk delta 23 fcmbQVp6SpkrVVByo3DtzW1T!tMq+c13|ln-dVUFf diff --git a/Resources/zh_TW.lproj/Localizable.strings b/Resources/zh_TW.lproj/Localizable.strings index fd27211c6bab17adc88a520deef7f7253694cf50..d7f9d1288f46395a1806ea096de8b178d5e7969c 100644 GIT binary patch delta 223 zcmZqK!*t~U(*_lB$s&eSh7yJ%hD;z`2E+;sl??d|r3^)r8N0Bj0AN&o-= delta 35 rcmca|fT?8<(*_ms$?qh@Cg0)U*!)1Eif!^b1-8jH3PPJz6bu>w23id) diff --git a/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings index 14ef3fe7ceccbdd1c30a505c63c5ca021ecc6305..1161878e202add4fdac7e5f2910132c29ad9d7ac 100644 GIT binary patch delta 16 YcmaFH@q%;138u*sj7^(QFwJ8G06p0TqyPW_ delta 12 TcmaFC`HW-338u|n%<~ulC4>a| diff --git a/Settings/InAppSettings.bundle/de.lproj/Advanced.strings b/Settings/InAppSettings.bundle/de.lproj/Advanced.strings index 87aaab5bdfc55ab4ca15ebf115bbc85e400ae8cc..d6c30a7d4ced0b246572e6f6db511bacb32e44c7 100644 GIT binary patch delta 24 ecmX@Wd5CL+6!YW;MytvH7&(Bn!)7VwWsCr9@CX(F delta 12 TcmX@ab%1k&6!Yde%*z-79`FQQ diff --git a/Settings/InAppSettings.bundle/en.lproj/Advanced.strings b/Settings/InAppSettings.bundle/en.lproj/Advanced.strings index 6e8c6d2e2..102d3964b 100644 --- a/Settings/InAppSettings.bundle/en.lproj/Advanced.strings +++ b/Settings/InAppSettings.bundle/en.lproj/Advanced.strings @@ -8,10 +8,10 @@ "Other" = "Other"; "Animations" = "Animations"; "Start at boot" = "Start at boot"; +"Show message in notification" = "Show message in notification"; "First login view" = "First login view"; "Primary account" = "Primary account"; "Display name" = "Display name"; "Username" = "Username"; "File sharing" = "File sharing"; "Server URL" = "Server URL"; -"Show message in notification" = "Show message in notification"; \ No newline at end of file diff --git a/Settings/InAppSettings.bundle/fr.lproj/Advanced.strings b/Settings/InAppSettings.bundle/fr.lproj/Advanced.strings index 5a709787626b9063432ddcf27fd07d2cea290b0b..0b97f8d80e02e68e155db85d119c80ee669388ac 100644 GIT binary patch delta 16 Ycmcb{`GIQ#3-e?x##x(Lm@hE`05g6Cb^rhX delta 12 Tcmeysb&Yca3-jiA%$FDeA-V*( diff --git a/Settings/InAppSettings.bundle/ja.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ja.lproj/Advanced.strings index abf34c09e45f83a73b624975986115bba89557b6..afbb57143942a57c92ef8e56c70b3e9c613eb476 100644 GIT binary patch delta 16 YcmX@Wafoxn4yMU$j7^(&Fm*5j05`b?5C8xG delta 12 TcmX@ad4OZX4yMgk%pHsXA!G!1 diff --git a/Settings/InAppSettings.bundle/nl.lproj/Advanced.strings b/Settings/InAppSettings.bundle/nl.lproj/Advanced.strings index cdee922f285721604ef9fd759608b606041d1ae5..b9eeaa71bab70a618d90fd91a6fb955c32c3d317 100644 GIT binary patch delta 16 Ycmcb_afNfk4yMU$j7^(&FwJ5F06F;vMgRZ+ delta 12 Tcmcb@d5L4g4yMgk%(EB)BNPO! diff --git a/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings index 1aa1dcab22cf20cb88223961ad4ed0856e1e276d..baba6350d035bed7b08faf0923d22e599dfe23f4 100644 GIT binary patch delta 24 ecmZqU?BLpPfoXC8qt)bdj2uAPVeC<7(F&$V(McA09f@0xBvhE delta 12 TcmaFF`G8}?C8o_G%zcaiB~AqK diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings index 41de2dd8404870b5e538b271cd12e1cfd9ab71d3..0ccc81b4edef3d7b91c60188f66b4719375001ae 100644 GIT binary patch delta 15 XcmbQmF^6-*G^UA9nl?{kYGDKbG!X_@ delta 12 TcmbQkIg4Y%G^WiG%q@%n9HIl` diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Advanced.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Advanced.strings index d54652a1afb7125812be0460fd931265201ee9f8..eba23865ce954f9822fd485208f393fd95b59b32 100644 GIT binary patch delta 16 YcmX@cae{Nh4yMU$j7^(&F!eD4062LDA^-pY delta 12 TcmX@Xd5mMj4yMgk%zcaiA@l@^ diff --git a/linphone-Info.plist b/linphone-Info.plist index 376305371..ce17d9cb9 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -53,7 +53,7 @@ CFBundleVersion - 1 + 2 LSRequiresIPhoneOS UIApplicationExitsOnSuspend diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 7dba40df3..3223dc7ac 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -628,7 +628,7 @@ 63E27A5A1C51392A00D332AE /* libebml2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E27A4D1C50EAC300D332AE /* libebml2.a */; }; 63E27A5B1C51392A00D332AE /* libmatroska2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E27A471C50EA7A00D332AE /* libmatroska2.a */; }; 63E59A3F1ADE70D900646FB3 /* InAppProductsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */; }; - 63E802DB1C625AEF000D5509 /* nowebcamCIF.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 63E802DA1C625AEF000D5509 /* nowebcamCIF.jpg */; }; + 63E802DB1C625AEF000D5509 /* (null) in Resources */ = {isa = PBXBuildFile; }; 63EEE3FF1BBA9AC00087D3AF /* libcunit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F03A9B7E18C0D9C900C4D7FE /* libcunit.a */; }; 63EEE4001BBA9AC00087D3AF /* liblinphonetester.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F0BB8C0F193623F200974404 /* liblinphonetester.a */; }; 63EEE4041BBA9B010087D3AF /* libbellesip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223CA7E516D9255800EF1BEC /* libbellesip.a */; }; @@ -2279,7 +2279,6 @@ 6316A07D1C5F64330073BFA4 /* add_field_over.png */, 6316A07E1C5F64330073BFA4 /* add_field_over@2x.png */, 6316A07F1C5F64330073BFA4 /* avatar.png */, - 63E802DA1C625AEF000D5509 /* nowebcamCIF.jpg */, 6316A0801C5F64330073BFA4 /* avatar@2x.png */, 6316A0811C5F64330073BFA4 /* avatar~ipad.png */, 6316A0821C5F64330073BFA4 /* avatar~ipad@2x.png */, @@ -3167,7 +3166,7 @@ 6316A2971C5F64350073BFA4 /* chat_add_default@2x.png in Resources */, 6316A2E41C5F64350073BFA4 /* dialer_back_default.png in Resources */, 6316A3871C5F64350073BFA4 /* numpad_star_over~ipad.png in Resources */, - 63E802DB1C625AEF000D5509 /* nowebcamCIF.jpg in Resources */, + 63E802DB1C625AEF000D5509 /* (null) in Resources */, 6316A2781C5F64350073BFA4 /* call_status_missed~ipad.png in Resources */, 6316A32E1C5F64350073BFA4 /* numpad_0_over~ipad.png in Resources */, 63AADBFF1B6A0FF200AA16FD /* assistant_external_sip.rc in Resources */, From e5bf06757d6205e8faa5c6ea521ac5c4ae130a95 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 8 Feb 2016 14:18:20 +0100 Subject: [PATCH 28/87] submodules: update linphone and bump v3 --- linphone-Info.plist | 2 +- submodules/linphone | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/linphone-Info.plist b/linphone-Info.plist index ce17d9cb9..b64a3365c 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -53,7 +53,7 @@ CFBundleVersion - 2 + 3 LSRequiresIPhoneOS UIApplicationExitsOnSuspend diff --git a/submodules/linphone b/submodules/linphone index 9c4bdf946..b65577522 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 9c4bdf946aa0829533d8a656fca89b0e3ad3d14f +Subproject commit b655775220a61b48e6721139bbd81215423bf179 From 876e949cb7aa59d2f6c186d5b599f0c1f2433a37 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 8 Feb 2016 15:39:08 +0100 Subject: [PATCH 29/87] CallView: enable conference button only if some calls are not in it and bump v4 --- Classes/CallView.m | 38 ++++++++++++-------------------------- linphone-Info.plist | 2 +- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/Classes/CallView.m b/Classes/CallView.m index 1e14d859a..690da9541 100644 --- a/Classes/CallView.m +++ b/Classes/CallView.m @@ -258,24 +258,9 @@ static void hideSpinner(LinphoneCall *call, void *user_data) { _optionsButton.enabled = (!call || !linphone_call_media_in_progress(call)); _optionsTransferButton.enabled = call && !linphone_call_media_in_progress(call); - // Show Pause/Conference button following call count - if (linphone_core_get_calls_nb(LC) > 1) { - bool enabled = ((linphone_core_get_current_call(LC) != NULL) || linphone_core_is_in_conference(LC)); - const MSList *list = linphone_core_get_calls(LC); - while (list != NULL) { - LinphoneCall *call = (LinphoneCall *)list->data; - LinphoneCallState state = linphone_call_get_state(call); - if (state == LinphoneCallIncomingReceived || state == LinphoneCallOutgoingInit || - state == LinphoneCallOutgoingProgress || state == LinphoneCallOutgoingRinging || - state == LinphoneCallOutgoingEarlyMedia || state == LinphoneCallConnected) { - enabled = false; - } - list = list->next; - } - _optionsConferenceButton.enabled = enabled; - } else { - _optionsConferenceButton.enabled = NO; - } + // enable conference button if 2 calls are present and at least one is not in the conference + _optionsConferenceButton.enabled = ((linphone_core_get_calls_nb(LC) > 1) && + (linphone_core_get_calls_nb(LC) != linphone_core_get_conference_size(LC))); // Disable transfert in conference if (linphone_core_get_current_call(LC) == NULL) { @@ -718,6 +703,14 @@ static void hideSpinner(LinphoneCall *call, void *user_data) { } } +- (IBAction)onOptionsClick:(id)sender { + if ([_optionsView isHidden]) { + [self hideOptions:FALSE animated:ANIMATED]; + } else { + [self hideOptions:TRUE animated:ANIMATED]; + } +} + - (IBAction)onOptionsTransferClick:(id)sender { [self hideOptions:TRUE animated:TRUE]; DialerView *view = VIEW(DialerView); @@ -734,15 +727,8 @@ static void hideSpinner(LinphoneCall *call, void *user_data) { [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; } -- (IBAction)onOptionsClick:(id)sender { - if ([_optionsView isHidden]) { - [self hideOptions:FALSE animated:ANIMATED]; - } else { - [self hideOptions:TRUE animated:ANIMATED]; - } -} - - (IBAction)onOptionsConferenceClick:(id)sender { + [self hideOptions:TRUE animated:TRUE]; linphone_core_add_all_to_conference(LC); } diff --git a/linphone-Info.plist b/linphone-Info.plist index b64a3365c..bed2770fd 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -53,7 +53,7 @@ CFBundleVersion - 3 + 4 LSRequiresIPhoneOS UIApplicationExitsOnSuspend From 7347f56bc789a2afc2a921bfccfbd96b41612e51 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 8 Feb 2016 17:36:09 +0100 Subject: [PATCH 30/87] Chat: do not ring/vibrate when receive new message if we are already in the room and bump v5 --- Classes/PhoneMainView.m | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index 4998882d9..39dd1db24 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -261,10 +261,26 @@ static RootViewManager *rootViewManagerInstance = nil; - (void)textReceived:(NSNotification *)notif { LinphoneAddress *from = [[notif.userInfo objectForKey:@"from_address"] pointerValue]; NSString *callID = [notif.userInfo objectForKey:@"call-id"]; - if (from != nil) { - [self playMessageSoundForCallID:callID]; - } [self updateApplicationBadgeNumber]; + LinphoneChatRoom *room = from ? linphone_core_get_chat_room(LC, from) : NULL; + + if (from == nil || room == NULL) + return; + + ChatConversationView *view = VIEW(ChatConversationView); + // if we already are in the conversation, we should not ring/vibrate + if (view.chatRoom && linphone_address_weak_equal(linphone_chat_room_get_peer_address(room), + linphone_chat_room_get_peer_address(view.chatRoom))) + return; + + if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) + return; + + LinphoneManager *lm = LinphoneManager.instance; + // if the message was already received through a push notif, we don't need to ring + if (![lm popPushCallID:callID]) { + [lm playMessageSound]; + } } - (void)registrationUpdate:(NSNotification *)notif { @@ -644,16 +660,6 @@ static RootViewManager *rootViewManagerInstance = nil; #pragma mark - ActionSheet Functions -- (void)playMessageSoundForCallID:(NSString *)callID { - if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground) { - LinphoneManager *lm = LinphoneManager.instance; - // if the message was already received through a push notif, we don't need to ring - if (![lm popPushCallID:callID]) { - [lm playMessageSound]; - } - } -} - - (void)displayIncomingCall:(LinphoneCall *)call { LinphoneCallLog *callLog = linphone_call_get_call_log(call); NSString *callId = [NSString stringWithUTF8String:linphone_call_log_get_call_id(callLog)]; From c4daac99459776a0803baf74bdcff119dfc2dc9c Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 8 Feb 2016 17:43:58 +0100 Subject: [PATCH 31/87] Call: fix conference button --- Classes/CallView.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Classes/CallView.m b/Classes/CallView.m index 690da9541..370ce39d2 100644 --- a/Classes/CallView.m +++ b/Classes/CallView.m @@ -258,9 +258,10 @@ static void hideSpinner(LinphoneCall *call, void *user_data) { _optionsButton.enabled = (!call || !linphone_call_media_in_progress(call)); _optionsTransferButton.enabled = call && !linphone_call_media_in_progress(call); - // enable conference button if 2 calls are present and at least one is not in the conference - _optionsConferenceButton.enabled = ((linphone_core_get_calls_nb(LC) > 1) && - (linphone_core_get_calls_nb(LC) != linphone_core_get_conference_size(LC))); + // enable conference button if 2 calls are presents and at least one is not in the conference + int confSize = linphone_core_get_conference_size(LC) - (linphone_core_is_in_conference(LC) ? 1 : 0); + _optionsConferenceButton.enabled = + ((linphone_core_get_calls_nb(LC) > 1) && (linphone_core_get_calls_nb(LC) != confSize)); // Disable transfert in conference if (linphone_core_get_current_call(LC) == NULL) { From 385f9f2920df671b1f46682cd23695bfe8efdf77 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 8 Feb 2016 17:46:25 +0100 Subject: [PATCH 32/87] xcode: truly bump v5... --- linphone-Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linphone-Info.plist b/linphone-Info.plist index bed2770fd..2d818fd9a 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -53,7 +53,7 @@ CFBundleVersion - 4 + 5 LSRequiresIPhoneOS UIApplicationExitsOnSuspend From 4fd8f8ea4566023890bd90dfc1bd86023bdd3f06 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 9 Feb 2016 09:33:58 +0100 Subject: [PATCH 33/87] StatusBar: show "no network" first --- Classes/LinphoneUI/StatusBarView.m | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Classes/LinphoneUI/StatusBarView.m b/Classes/LinphoneUI/StatusBarView.m index fa750a127..66a22cf46 100644 --- a/Classes/LinphoneUI/StatusBarView.m +++ b/Classes/LinphoneUI/StatusBarView.m @@ -174,16 +174,14 @@ NSString *message = nil; LinphoneGlobalState gstate = linphone_core_get_global_state(LC); - if (gstate == LinphoneGlobalConfiguring) { + if (!linphone_core_is_network_reachable(LC)) { + message = NSLocalizedString(@"Network down", nil); + } else if (gstate == LinphoneGlobalConfiguring) { message = NSLocalizedString(@"Fetching remote configuration", nil); } else if (config == NULL) { state = LinphoneRegistrationNone; if (linphone_core_get_proxy_config_list(LC) != NULL) { - if (linphone_core_is_network_reachable(LC)) { - message = NSLocalizedString(@"No default account", nil); - } else { - message = NSLocalizedString(@"Network down", nil); - } + message = NSLocalizedString(@"No default account", nil); } else { message = NSLocalizedString(@"No account configured", nil); } From f04db9985ccc85d6c48210e4abbd07e6b0ccad75 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 9 Feb 2016 10:23:32 +0100 Subject: [PATCH 34/87] CallOutgoing: fix crash on iPad --- Classes/CallOutgoingView.m | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/Classes/CallOutgoingView.m b/Classes/CallOutgoingView.m index 7bcf73938..00a891c3f 100644 --- a/Classes/CallOutgoingView.m +++ b/Classes/CallOutgoingView.m @@ -59,16 +59,16 @@ static UICompositeViewDescription *compositeDescription = nil; LinphoneCall *call = linphone_core_get_current_call(LC); if (!call) { - [PhoneMainView.instance popCurrentView]; - } else { - const LinphoneAddress *addr = linphone_call_get_remote_address(call); - [ContactDisplay setDisplayNameLabel:_nameLabel forAddress:addr]; - char *uri = linphone_address_as_string_uri_only(addr); - _addressLabel.text = [NSString stringWithUTF8String:uri]; - ms_free(uri); - [_avatarImage setImage:[FastAddressBook imageForAddress:addr thumbnail:NO] bordered:YES withRoundedRadius:YES]; + return; } + const LinphoneAddress *addr = linphone_call_get_remote_address(call); + [ContactDisplay setDisplayNameLabel:_nameLabel forAddress:addr]; + char *uri = linphone_address_as_string_uri_only(addr); + _addressLabel.text = [NSString stringWithUTF8String:uri]; + ms_free(uri); + [_avatarImage setImage:[FastAddressBook imageForAddress:addr thumbnail:NO] bordered:YES withRoundedRadius:YES]; + [self hideSpeaker:LinphoneManager.instance.bluetoothAvailable]; [_speakerButton update]; @@ -76,6 +76,17 @@ static UICompositeViewDescription *compositeDescription = nil; [_routesButton update]; } +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + // if there is no call (for whatever reason), we must wait viewDidAppear method + // before popping current view, because UICompositeView cannot handle view change + // directly in viewWillAppear (this would lead to crash in deallocated memory - easily + // reproductible on iPad mini). + if (!linphone_core_get_current_call(LC)) { + [PhoneMainView.instance popCurrentView]; + } +} + - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [NSNotificationCenter.defaultCenter removeObserver:self]; From 06856e0b91dea98b700ff0ae8719a7fabc823266 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 9 Feb 2016 10:27:21 +0100 Subject: [PATCH 35/87] xcode: bump v6 --- linphone-Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linphone-Info.plist b/linphone-Info.plist index 2d818fd9a..5af22d713 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -53,7 +53,7 @@ CFBundleVersion - 5 + 6 LSRequiresIPhoneOS UIApplicationExitsOnSuspend From 9d07fe090df6bd301cad62037c667668ede0ca69 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 9 Feb 2016 16:14:36 +0100 Subject: [PATCH 36/87] submodules: update linphone --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index b65577522..3df1f98d8 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit b655775220a61b48e6721139bbd81215423bf179 +Subproject commit 3df1f98d88c2fe665c05601ee1c3c52f006eb4a7 From bd0b56276aaa6068dbd4d5c6fea32f4ec68ffb34 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 10 Feb 2016 15:05:19 +0100 Subject: [PATCH 37/87] Dialer: add try/catch around self destruct code --- .gitignore | 1 + Classes/DialerView.m | 36 ++++++++++++++++++++++-------------- Resources/linphonerc-factory | 1 + 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 20dcb5af7..10fd37fe5 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ submodules/tunnel submodules/binaries/dummy-*.a linphone-iphone.ipa TutorialHellowWorld/hello-world.xcodeproj/project.xcworkspace/ +diff-format.patch diff --git a/Classes/DialerView.m b/Classes/DialerView.m index 61d30a051..7f965fe07 100644 --- a/Classes/DialerView.m +++ b/Classes/DialerView.m @@ -271,22 +271,30 @@ static UICompositeViewDescription *compositeDescription = nil; [Log enableLogs:newDebugLevel]; }]; - [alertView addButtonWithTitle:NSLocalizedString(@"Remove account(s) and self destruct", nil) - block:^{ - linphone_core_clear_proxy_config([LinphoneManager getLc]); - linphone_core_clear_all_auth_info([LinphoneManager getLc]); - [LinphoneManager.instance destroyLinphoneCore]; - if ([NSFileManager.defaultManager - isDeletableFileAtPath:[LinphoneManager documentFile:@"linphonerc"]] == YES) { - [NSFileManager.defaultManager - removeItemAtPath:[LinphoneManager documentFile:@"linphonerc"] - error:nil]; - } + [alertView + addButtonWithTitle:NSLocalizedString(@"Remove account(s) and self destruct", nil) + block:^{ + linphone_core_clear_proxy_config([LinphoneManager getLc]); + linphone_core_clear_all_auth_info([LinphoneManager getLc]); + @try { + [LinphoneManager.instance destroyLinphoneCore]; + } @catch (NSException *e) { + LOGW(@"Exception while destroying linphone core: %@", e); + } @finally { + if ([NSFileManager.defaultManager + isDeletableFileAtPath:[LinphoneManager documentFile:@"linphonerc"]] == YES) { + [NSFileManager.defaultManager + removeItemAtPath:[LinphoneManager documentFile:@"linphonerc"] + error:nil]; + } #ifdef DEBUG - [LinphoneManager instanceRelease]; + [LinphoneManager instanceRelease]; #endif - [UIApplication sharedApplication].keyWindow.rootViewController = nil; - }]; + } + [UIApplication sharedApplication].keyWindow.rootViewController = nil; + // make the application crash to be sure that user restart it properly + LOGF(@"Self-destructing in 3..2..1..0!"); + }]; [alertView show]; return true; diff --git a/Resources/linphonerc-factory b/Resources/linphonerc-factory index c7e7fe897..cd8d1abd2 100644 --- a/Resources/linphonerc-factory +++ b/Resources/linphonerc-factory @@ -17,6 +17,7 @@ display_filter_auto_rotate=0 #contact_filter_on_default_domain=1 #use_phone_number=0 send_logs_include_linphonerc_and_chathistory=0 +#debug_popup_magic=**00** [assistant] username_length=-1 From 0781e98ea67e78a12c8f4083c48174635bd2291b Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 10 Feb 2016 15:16:24 +0100 Subject: [PATCH 38/87] LinphoneManager: set root_ca only once --- Classes/LinphoneManager.m | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 896d27171..10d5147cc 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -1311,7 +1311,6 @@ static LinphoneCoreVTable linphonec_vtable = { // get default config from bundle NSString *zrtpSecretsFileName = [LinphoneManager documentFile:@"zrtp_secrets"]; NSString *chatDBFileName = [LinphoneManager documentFile:kLinphoneInternalChatDBFilename]; - const char *lRootCa = [[LinphoneManager bundleFile:@"rootca.pem"] UTF8String]; NSString *device = [[NSString stringWithFormat:@"%@_%@_iOS%@", [NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"], @@ -1326,8 +1325,6 @@ static LinphoneCoreVTable linphonec_vtable = { _fastAddressBook = [[FastAddressBook alloc] init]; } - linphone_core_set_root_ca(theLinphoneCore, lRootCa); - linphone_core_set_zrtp_secrets_file(theLinphoneCore, [zrtpSecretsFileName UTF8String]); linphone_core_set_chat_database_path(theLinphoneCore, [chatDBFileName UTF8String]); linphone_core_set_call_logs_database_path(theLinphoneCore, [chatDBFileName UTF8String]); @@ -1468,9 +1465,8 @@ static BOOL libStarted = FALSE; linphone_core_set_play_file(theLinphoneCore, [LinphoneManager bundleFile:hold].UTF8String); /* set the CA file no matter what, since the remote provisioning could be hitting an HTTPS server */ - const char *lRootCa = [[LinphoneManager bundleFile:@"rootca.pem"] UTF8String]; - linphone_core_set_root_ca(theLinphoneCore, lRootCa); - linphone_core_set_user_certificates_path(theLinphoneCore, [[LinphoneManager cacheDirectory] UTF8String]); + linphone_core_set_root_ca(theLinphoneCore, [LinphoneManager bundleFile:@"rootca.pem"].UTF8String); + linphone_core_set_user_certificates_path(theLinphoneCore, [LinphoneManager cacheDirectory].UTF8String); /* The core will call the linphone_iphone_configuring_status_changed callback when the remote provisioning is loaded (or skipped). From 5d11f24f6cd56923ca897525eb7967996a9a0fae Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 10 Feb 2016 15:16:43 +0100 Subject: [PATCH 39/87] CallStats: stats should take the full available height --- Classes/CallSideMenuView.m | 19 ++++++++++++++-- Classes/CallSideMenuView.xib | 9 ++------ .../LinphoneUI/Base.lproj/UICompositeView.xib | 22 +++++++++---------- Classes/LinphoneUI/UICompositeView.m | 4 ++-- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/Classes/CallSideMenuView.m b/Classes/CallSideMenuView.m index 60b34379c..b61cd3099 100644 --- a/Classes/CallSideMenuView.m +++ b/Classes/CallSideMenuView.m @@ -109,14 +109,29 @@ [result appendString:@"\n"]; if (stats != NULL) { - [result appendString:[NSString stringWithFormat:@"Upload bandwidth: %1.1f kbits/s", stats->upload_bandwidth]]; - [result appendString:@"\n"]; [result appendString:[NSString stringWithFormat:@"Download bandwidth: %1.1f kbits/s", stats->download_bandwidth]]; [result appendString:@"\n"]; + [result appendString:[NSString stringWithFormat:@"Upload bandwidth: %1.1f kbits/s", stats->upload_bandwidth]]; + [result appendString:@"\n"]; [result appendString:[NSString stringWithFormat:@"ICE state: %@", [self.class iceToString:stats->ice_state]]]; [result appendString:@"\n"]; + // RTP stats section (packet loss count, etc) + 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", + rtp_stats.packet_recv, rtp_stats.cum_packet_loss, rtp_stats.discarded, + rtp_stats.outoftime, rtp_stats.bad]]; + [result appendString:@"\n"]; + [result appendString:[NSString stringWithFormat:@"Sender loss rate: %.2f%%", + linphone_call_stats_get_sender_loss_rate(stats)]]; + [result appendString:@"\n"]; + [result appendString:[NSString stringWithFormat:@"Receiver loss rate: %.2f%%", + linphone_call_stats_get_receiver_loss_rate(stats)]]; + [result appendString:@"\n"]; + if (stream == LinphoneStreamTypeVideo) { MSVideoSize sentSize = linphone_call_params_get_sent_video_size(params); MSVideoSize recvSize = linphone_call_params_get_received_video_size(params); diff --git a/Classes/CallSideMenuView.xib b/Classes/CallSideMenuView.xib index efe501257..80e287cea 100644 --- a/Classes/CallSideMenuView.xib +++ b/Classes/CallSideMenuView.xib @@ -1,8 +1,8 @@ - + - + @@ -47,9 +47,4 @@ Video: down - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UICompositeView.xib b/Classes/LinphoneUI/Base.lproj/UICompositeView.xib index baa4d9320..20bf9702e 100644 --- a/Classes/LinphoneUI/Base.lproj/UICompositeView.xib +++ b/Classes/LinphoneUI/Base.lproj/UICompositeView.xib @@ -1,5 +1,5 @@ - + @@ -38,11 +38,6 @@ - - - - - @@ -52,6 +47,11 @@ + + + + + @@ -71,11 +71,6 @@ - - - - - @@ -85,6 +80,11 @@ + + + + + diff --git a/Classes/LinphoneUI/UICompositeView.m b/Classes/LinphoneUI/UICompositeView.m index d17a94655..61fa6f19d 100644 --- a/Classes/LinphoneUI/UICompositeView.m +++ b/Classes/LinphoneUI/UICompositeView.m @@ -575,9 +575,9 @@ statusBarFrame.origin.y = origin - statusBarFrame.size.height; } - // 2. side menu - fixed size, always starting below status bar + // 2. side menu - fixed size, always starting below status bar (hack: except in fullscreen) CGRect sideMenuFrame = viewFrame; - sideMenuFrame.origin.y = origin + statusBarFrame.size.height; + sideMenuFrame.origin.y = origin + (fullscreen ? statusBarFrame.size.height : 0); sideMenuFrame.size.height -= sideMenuFrame.origin.y; if (!currentViewDescription.sideMenuEnabled) { // really hide; -width won't be enough since some animations may use this... From f21a68e2bc4a084b0cef83dbb94771773b2eb59e Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 10 Feb 2016 15:20:52 +0100 Subject: [PATCH 40/87] fix previous commit for ipad too --- Classes/LinphoneUI/UICompositeView.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/LinphoneUI/UICompositeView.m b/Classes/LinphoneUI/UICompositeView.m index 61fa6f19d..9c4fd2f51 100644 --- a/Classes/LinphoneUI/UICompositeView.m +++ b/Classes/LinphoneUI/UICompositeView.m @@ -575,7 +575,7 @@ statusBarFrame.origin.y = origin - statusBarFrame.size.height; } - // 2. side menu - fixed size, always starting below status bar (hack: except in fullscreen) + // 2. side menu - fixed size, always starting below status bar (hack: gexcept in fullscreen) CGRect sideMenuFrame = viewFrame; sideMenuFrame.origin.y = origin + (fullscreen ? statusBarFrame.size.height : 0); sideMenuFrame.size.height -= sideMenuFrame.origin.y; From 3336378aa4922bf7ba2bcb604f4f5b107f42e3f1 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 10 Feb 2016 15:23:37 +0100 Subject: [PATCH 41/87] mikmak --- .../Base.lproj/UICompositeView~ipad.xib | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib b/Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib index 13cacd621..3b025a406 100644 --- a/Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib +++ b/Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib @@ -1,5 +1,5 @@ - + @@ -38,11 +38,6 @@ - - - - - @@ -52,6 +47,11 @@ + + + + + @@ -71,11 +71,6 @@ - - - - - @@ -85,6 +80,11 @@ + + + + + From 68d21e6cbd63c74384094cac0146f52e9f15aef3 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 10 Feb 2016 15:36:23 +0100 Subject: [PATCH 42/87] CallStats: allow 100 lignes and scale down font if needed --- Classes/CallSideMenuView.xib | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/CallSideMenuView.xib b/Classes/CallSideMenuView.xib index 80e287cea..4dc481bcd 100644 --- a/Classes/CallSideMenuView.xib +++ b/Classes/CallSideMenuView.xib @@ -20,14 +20,14 @@ - From 14b2c92346f035dfa71f4144239903fdc30d563a Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 10 Feb 2016 17:01:19 +0100 Subject: [PATCH 43/87] CallStats: display encryption properly --- Classes/CallSideMenuView.m | 16 +++++++++++++++- Classes/CallSideMenuView.xib | 4 ++-- Classes/LinphoneUI/UICompositeView.m | 4 ++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Classes/CallSideMenuView.m b/Classes/CallSideMenuView.m index b61cd3099..da0cac541 100644 --- a/Classes/CallSideMenuView.m +++ b/Classes/CallSideMenuView.m @@ -68,6 +68,20 @@ } } ++ (NSString *)mediaEncryptionToString:(LinphoneMediaEncryption)enc { + switch (enc) { + case LinphoneMediaEncryptionDTLS: + return @"DTLS"; + case LinphoneMediaEncryptionSRTP: + return @"SRTP"; + case LinphoneMediaEncryptionZRTP: + return @"ZRTP"; + case LinphoneMediaEncryptionNone: + break; + } + return NSLocalizedString(@"None", nil); +} + - (NSString *)updateStatsForCall:(LinphoneCall *)call stream:(LinphoneStreamType)stream { NSMutableString *result = [[NSMutableString alloc] init]; const PayloadType *payload = NULL; @@ -161,7 +175,7 @@ LinphoneMediaEncryption enc = linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)); if (enc != LinphoneMediaEncryptionNone) { [stats appendString:[NSString - stringWithFormat:@"Call encrypted using %s", linphone_media_encryption_to_string(enc)]]; + stringWithFormat:@"Call encrypted using %@", [self.class mediaEncryptionToString:enc]]]; } [stats appendString:[self updateStatsForCall:call stream:LinphoneStreamTypeAudio]]; diff --git a/Classes/CallSideMenuView.xib b/Classes/CallSideMenuView.xib index 4dc481bcd..a75479d08 100644 --- a/Classes/CallSideMenuView.xib +++ b/Classes/CallSideMenuView.xib @@ -20,9 +20,9 @@ -