diff --git a/CHANGELOG.md b/CHANGELOG.md index edbb71fa7..ce5d4f27a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,53 @@ All notable changes to this project will be documented in this file. Group changes to describe their impact on the project, as follows: - Added for new features. - Changed for changes in existing functionality. - Deprecated for once-stable features removed in upcoming releases. - Removed for deprecated features removed in this release. - Fixed for any bug fixes. - Security to invite users to upgrade in case of vulnerabilities. + Added for new features. + Changed for changes in existing functionality. + Deprecated for once-stable features removed in upcoming releases. + Removed for deprecated features removed in this release. + Fixed for any bug fixes. + Security to invite users to upgrade in case of vulnerabilities. + +## [4.6.0] - 2021-31-02 +### Added +- Reply to chat message feature (with original message preview) +- Transfert chat message feature +- Swipe action on chat messages to reply / delete +- Voice recordings in chat feature +- SIP URIs in chat messages are clickable to easily initiate a call +- New fragment explaining generic SIP account limitations contrary to sip.linphone.org SIP accounts +- Link to Weblate added in about page +- New 'scroll to bottom' button in chat conversations, which a "unread message count" badge + +### Changed +- Removed beta feature of ephemeral messages in the settings, now always available. +- SDK updated to 5.1.0 release + +### Fixed +- Potential crash when editing a contact avatar image. +- App extension logs missing when exporting logs + +## [4.5.0] - 2021-07-08 + +### Added +- Add option to enable VFS +- Ephemeral messages (beta) + +### Changed +- Updating SDK to 5.0 version +- Using linphone SDK 5.0 API to better handle audio route +- Replaced all notions of "Proxy configs" with "Accounts" from the 5.0 SDK +- Removed most of the code related to remote and VOIP Push Notification receptions, now handled in the SDK +- No longer pause all calls when receiving a new call. +- No longer switch to speaker during video call if another output device (bluetooth headset) is already connected +- When answering a video call while the phone is locked, send the "No camera available" image until the video is enabled through the CallKit button +- Chat messages containing both text and file are now displayed in the same chat bubble + +### Fixed +- Fix several memory leaks +- Various crashs and issues. +- When the App is started through a Push Notification, properly redirect the view to the corresponding chat rather than going to the home page ## [4.4.0] - 2021-03-30 @@ -66,7 +106,7 @@ Group changes to describe their impact on the project, as follows: ### Fixed - Automatically downloaded images are copied when shared in a chat room. - Some UI errors from ios 13. - + ## [4.1.0] - 2019-05-06 ### Added diff --git a/Classes/AboutView.h b/Classes/AboutView.h index a15847220..b1576e7ac 100644 --- a/Classes/AboutView.h +++ b/Classes/AboutView.h @@ -28,6 +28,7 @@ @property(weak, nonatomic) IBOutlet UILabel *appVersionLabel; @property(weak, nonatomic) IBOutlet UILabel *libVersionLabel; @property(weak, nonatomic) IBOutlet UILabel *licenceLabel; +@property(weak, nonatomic) IBOutlet UILabel *translateLabel; @property(weak, nonatomic) IBOutlet UILabel *policyLabel; - (IBAction)onLinkTap:(id)sender; - (IBAction)onLicenceTap; diff --git a/Classes/AboutView.m b/Classes/AboutView.m index e1750da38..9329d01b3 100644 --- a/Classes/AboutView.m +++ b/Classes/AboutView.m @@ -53,11 +53,20 @@ static UICompositeViewDescription *compositeDescription = nil; NSString *curVersion = [NSString stringWithFormat:@"version %@",[infoDict objectForKey:@"CFBundleShortVersionString"]]; _appVersionLabel.text = [NSString stringWithFormat:@"%@ iOS %@", name, curVersion]; _libVersionLabel.text = [NSString stringWithFormat:@"%@ SDK %s", name, LINPHONE_SDK_VERSION]; + _translateLabel.text = [NSString stringWithString:NSLocalizedString(@"Help us translate Linphone", nil)]; + UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onLicenceTap)]; tapGestureRecognizer.numberOfTapsRequired = 1; [_licenceLabel addGestureRecognizer:tapGestureRecognizer]; _licenceLabel.userInteractionEnabled = YES; + + UITapGestureRecognizer *tapGestureRecognizerTranslate = + [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTranslateTap)]; + tapGestureRecognizer.numberOfTapsRequired = 1; + [_translateLabel addGestureRecognizer:tapGestureRecognizerTranslate]; + _translateLabel.userInteractionEnabled = YES; + UITapGestureRecognizer *tapGestureRecognizerPolicy = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onPolicyTap)]; tapGestureRecognizerPolicy.numberOfTapsRequired = 1; @@ -76,7 +85,7 @@ static UICompositeViewDescription *compositeDescription = nil; } - (IBAction)onPolicyTap { - NSString *url = @"https://www.linphone.org/terms-and-privacy"; + NSString *url = @"https://www.linphone.org/privacy-policy"; if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { LOGE(@"Failed to open %@, invalid URL", url); } @@ -88,6 +97,12 @@ static UICompositeViewDescription *compositeDescription = nil; LOGE(@"Failed to open %@, invalid URL", url); } } +- (IBAction)onTranslateTap { + NSString *url = @"https://weblate.linphone.org/projects/linphone-iphone"; + if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { + LOGE(@"Failed to open %@, invalid URL", url); + } +} - (IBAction)onDialerBackClick:(id)sender { [PhoneMainView.instance popCurrentView]; diff --git a/Classes/AssistantView.h b/Classes/AssistantView.h index 2d0371953..536643274 100644 --- a/Classes/AssistantView.h +++ b/Classes/AssistantView.h @@ -49,6 +49,7 @@ @property(nonatomic, strong) IBOutlet UIView *createAccountActivateEmailView; @property(nonatomic, strong) IBOutlet UIView *linphoneLoginView; @property(nonatomic, strong) IBOutlet UIView *loginView; +@property(nonatomic, strong) IBOutlet UIView *linphoneSpecificFeatureWarningView; @property(nonatomic, strong) IBOutlet UIView *remoteProvisioningLoginView; @property(strong, nonatomic) IBOutlet UIView *remoteProvisioningView; @property (strong, nonatomic) IBOutlet UIView *createAccountActivateSMSView; @@ -57,6 +58,7 @@ @property(nonatomic, strong) IBOutlet UIImageView *welcomeLogoImage; @property(nonatomic, strong) IBOutlet UIButton *gotoCreateAccountButton; @property(nonatomic, strong) IBOutlet UIButton *gotoLinphoneLoginButton; +@property(nonatomic, strong) IBOutlet UIButton *gotoLinphoneSpecificFeatureWarningButton; @property(nonatomic, strong) IBOutlet UIButton *gotoLoginButton; @property(nonatomic, strong) IBOutlet UIButton *gotoRemoteProvisioningButton; @property (weak, nonatomic) IBOutlet UILabel *phoneLabel; @@ -64,6 +66,8 @@ @property (weak, nonatomic) IBOutlet UILabel *activationTitle; @property (weak, nonatomic) IBOutlet UILabel *activationEmailText; @property (weak, nonatomic) IBOutlet UILabel *activationSMSText; +@property (weak, nonatomic) IBOutlet UILabel *linphoneSpecificFeatureWarningText; +@property (weak, nonatomic) IBOutlet UILabel *linphoneSpecificFeatureWarningContactLink; @property (weak, nonatomic) IBOutlet UILabel *accountLabel; @property (weak, nonatomic) IBOutlet UIButton *qrCodeButton; diff --git a/Classes/AssistantView.m b/Classes/AssistantView.m index b6b5b65db..ef6bae82d 100644 --- a/Classes/AssistantView.m +++ b/Classes/AssistantView.m @@ -91,6 +91,22 @@ static UICompositeViewDescription *compositeDescription = nil; #pragma mark - ViewController Functions +- (IBAction)onContactTap { + NSString *url = @"https://www.linphone.org/contact"; + if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { + LOGE(@"Failed to open %@, invalid URL", url); + } +} + +- (void)viewDidLoad { + [super viewDidLoad]; + UITapGestureRecognizer *tapGestureRecognizer = + [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onContactTap)]; + tapGestureRecognizer.numberOfTapsRequired = 1; + [_linphoneSpecificFeatureWarningContactLink addGestureRecognizer:tapGestureRecognizer]; + _linphoneSpecificFeatureWarningContactLink.userInteractionEnabled = YES; +} + - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; @@ -294,7 +310,7 @@ static UICompositeViewDescription *compositeDescription = nil; BOOL acceptTerms = [LinphoneManager.instance lpConfigBoolForKey:@"accept_terms" withDefault:FALSE]; UIImage *image = acceptTerms ? [UIImage imageNamed:@"checkbox_checked.png"] : [UIImage imageNamed:@"checkbox_unchecked.png"]; [_acceptButton setImage:image forState:UIControlStateNormal]; - _gotoRemoteProvisioningButton.enabled = _gotoLinphoneLoginButton.enabled = _gotoCreateAccountButton.enabled = _gotoLoginButton.enabled = acceptTerms; + _gotoRemoteProvisioningButton.enabled = _gotoLinphoneLoginButton.enabled = _gotoCreateAccountButton.enabled = _gotoLinphoneSpecificFeatureWarningButton.enabled = acceptTerms; } + (NSString *)errorForLinphoneAccountCreatorPhoneNumberStatus:(LinphoneAccountCreatorPhoneNumberStatus)status { @@ -1345,12 +1361,13 @@ void assistant_is_account_linked(LinphoneAccountCreator *creator, LinphoneAccoun // Change button color and wait the display of this #define ONCLICKBUTTON(button, timewaitmsec, body) \ +UIColor *previousColor = (UIColor*)[sender backgroundColor]; \ [button setBackgroundColor:[UIColor lightGrayColor]]; \ _waitView.hidden = NO; \ dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (timewaitmsec * NSEC_PER_MSEC)); \ dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ \ body \ - [button setBackgroundColor:[UIColor clearColor]]; \ + [button setBackgroundColor:previousColor]; \ _waitView.hidden = YES; \ }); \ @@ -1388,6 +1405,13 @@ void assistant_is_account_linked(LinphoneAccountCreator *creator, LinphoneAccoun }); } +- (IBAction)onGoToNonLinphoneInfoPage:(id)sender { + ONCLICKBUTTON(sender, 100, { + nextView = _linphoneSpecificFeatureWarningView; + [self changeView:nextView back:FALSE animation:TRUE]; + }); +} + - (IBAction)onGotoRemoteProvisioningClick:(id)sender { ONCLICKBUTTON(sender, 100, { nextView = _remoteProvisioningView; diff --git a/Classes/Base.lproj/AboutView.xib b/Classes/Base.lproj/AboutView.xib index ba887ff84..3aa5423fe 100644 --- a/Classes/Base.lproj/AboutView.xib +++ b/Classes/Base.lproj/AboutView.xib @@ -1,7 +1,10 @@ - + + - + + + @@ -13,24 +16,25 @@ + - + - + - + - + - + - + + - + - + - + - + - + - + - + - + - + - + diff --git a/Classes/Base.lproj/AssistantViewScreens.xib b/Classes/Base.lproj/AssistantViewScreens.xib index 847755544..8d7a06be5 100644 --- a/Classes/Base.lproj/AssistantViewScreens.xib +++ b/Classes/Base.lproj/AssistantViewScreens.xib @@ -1,9 +1,9 @@ - + - + @@ -22,11 +22,15 @@ - + + + + + @@ -156,7 +160,7 @@ - + + + + + + + + + + + + + + + + diff --git a/Classes/CallManager.swift b/Classes/CallManager.swift index 6ea0686fb..d9b798d3f 100644 --- a/Classes/CallManager.swift +++ b/Classes/CallManager.swift @@ -46,8 +46,7 @@ import AVFoundation var globalState : GlobalState = .Off var actionsToPerformOnceWhenCoreIsOn : [(()->Void)] = [] var conference: Conference? - - + var callkitAudioSessionActivated : Bool? = nil // if "nil", ignore. var backgroundContextCall : Call? @objc var backgroundContextCameraIsEnabled : Bool = false @@ -141,27 +140,17 @@ import AVFoundation } @objc func changeRouteToSpeaker() { - for device in lc!.audioDevices { - if (device.type == AudioDeviceType.Speaker) { - lc!.outputAudioDevice = device - break - } - } + lc?.outputAudioDevice = lc?.audioDevices.first { $0.type == AudioDeviceType.Speaker } UIDevice.current.isProximityMonitoringEnabled = false } @objc func changeRouteToBluetooth() { - for device in lc!.audioDevices { - if (device.type == AudioDeviceType.Bluetooth || device.type == AudioDeviceType.BluetoothA2DP) { - lc!.outputAudioDevice = device - break - } - } + lc?.outputAudioDevice = lc?.audioDevices.first { $0.type == AudioDeviceType.BluetoothA2DP || $0.type == AudioDeviceType.Bluetooth } UIDevice.current.isProximityMonitoringEnabled = (lc!.callsNb > 0) } @objc func changeRouteToDefault() { - lc!.outputAudioDevice = lc!.defaultOutputAudioDevice + lc?.outputAudioDevice = lc?.defaultOutputAudioDevice } @objc func isBluetoothAvailable() -> Bool { @@ -485,6 +474,15 @@ import AVFoundation CallManager.instance().conference = nil } } + + func onAudioDevicesListUpdated(core: Core) { + let bluetoothAvailable = isBluetoothAvailable(); + + var dict = Dictionary() + dict["available"] = bluetoothAvailable + NotificationCenter.default.post(name: Notification.Name("LinphoneBluetoothAvailabilityUpdate"), object: self, userInfo: dict) + + } func onCallStateChanged(core: Core, call: Call, state cstate: Call.State, message: String) { let callLog = call.callLog @@ -635,10 +633,13 @@ import AVFoundation break } - if (cstate == .IncomingReceived || cstate == .OutgoingInit || cstate == .Connected || cstate == .StreamsRunning) { - let check = call.currentParams?.videoEnabled + let readyForRoutechange = CallManager.instance().callkitAudioSessionActivated == nil || (CallManager.instance().callkitAudioSessionActivated == true) + if (readyForRoutechange && (cstate == .IncomingReceived || cstate == .OutgoingInit || cstate == .Connected || cstate == .StreamsRunning)) { if ((call.currentParams?.videoEnabled ?? false) && CallManager.instance().isReceiverEnabled()) { CallManager.instance().changeRouteToSpeaker() + } else if (isBluetoothAvailable()) { + // Use bluetooth device by default if one is available + CallManager.instance().changeRouteToBluetooth() } } } diff --git a/Classes/CallOutgoingView.m b/Classes/CallOutgoingView.m index c5057377d..1a2a42352 100644 --- a/Classes/CallOutgoingView.m +++ b/Classes/CallOutgoingView.m @@ -99,7 +99,7 @@ static UICompositeViewDescription *compositeDescription = nil; ms_free(uri); [_avatarImage setImage:[FastAddressBook imageForAddress:addr] bordered:NO withRoundedRadius:YES]; - [self hideSpeaker:LinphoneManager.instance.bluetoothAvailable]; + [self hideSpeaker: [CallManager.instance isBluetoothAvailable]]; [_speakerButton update]; [_microButton update]; diff --git a/Classes/CallView.m b/Classes/CallView.m index 2ae10de87..5702d6e54 100644 --- a/Classes/CallView.m +++ b/Classes/CallView.m @@ -148,7 +148,7 @@ static UICompositeViewDescription *compositeDescription = nil; [self hideRoutes:TRUE animated:FALSE]; [self hideOptions:TRUE animated:FALSE]; [self hidePad:TRUE animated:FALSE]; - [self hideSpeaker:LinphoneManager.instance.bluetoothAvailable]; + [self hideSpeaker: [CallManager.instance isBluetoothAvailable]]; [self callDurationUpdate]; [self onCurrentCallChange]; // Set windows (warn memory leaks) diff --git a/Classes/ChatConversationTableView.h b/Classes/ChatConversationTableView.h index 1fe9ff3e2..08a7a6d70 100644 --- a/Classes/ChatConversationTableView.h +++ b/Classes/ChatConversationTableView.h @@ -58,6 +58,8 @@ @property(nonatomic, strong) id chatRoomDelegate; @property NSMutableDictionary *imagesInChatroom; @property(nonatomic) NSTimer *ephemeralDisplayTimer; +@property (nullable, nonatomic) UIButton *floatingScrollButton; +@property (nullable, nonatomic) UILabel *scrollBadge; - (void)addEventEntry:(LinphoneEventLog *)event; - (void)scrollToBottom:(BOOL)animated; diff --git a/Classes/ChatConversationTableView.m b/Classes/ChatConversationTableView.m index 5fe80f82d..199c188d2 100644 --- a/Classes/ChatConversationTableView.m +++ b/Classes/ChatConversationTableView.m @@ -53,6 +53,7 @@ [self stopEphemeralDisplayTimer]; [NSNotificationCenter.defaultCenter removeObserver:self]; [super viewWillDisappear:animated]; + [_floatingScrollButton setHidden:TRUE]; } #pragma mark - @@ -83,6 +84,7 @@ bool oneToOne = capabilities & LinphoneChatRoomCapabilitiesOneToOne; bctbx_list_t *chatRoomEvents = linphone_chat_room_get_history_events(_chatRoom, 0); + int unread_count = 0; bctbx_list_t *head = chatRoomEvents; size_t listSize = bctbx_list_size(chatRoomEvents); @@ -95,6 +97,11 @@ chatRoomEvents = chatRoomEvents->next; } else { LinphoneChatMessage *chat = linphone_event_log_get_chat_message(event); + if (chat && !linphone_chat_message_is_read(chat)) { + if (unread_count == 0) { + // [eventList addObject:[NSString stringWithString:@"Ceci est un test wesh wesh"]]; + } + } // if auto_download is available and file transfer in progress, not add event now if (!(autoDownload && chat && linphone_chat_message_is_file_transfer_in_progress(chat))) { [totalEventList addObject:[NSValue valueWithPointer:linphone_event_log_ref(event)]]; @@ -164,6 +171,8 @@ [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:(count - 1) inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES]; + if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) + [ChatConversationView markAsRead:_chatRoom]; } - (void)scrollToLastUnread:(BOOL)animated { @@ -401,37 +410,54 @@ static const CGFloat MESSAGE_SPACING_PERCENTAGE = 1.f; [self loadData]; } -- (NSArray *)tableView:(UITableView *)tableView - editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { +- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView + leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath { + LinphoneEventLog *event = [[eventList objectAtIndex:indexPath.row] pointerValue]; - UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive - title:NSLocalizedString(@"Delete", nil) - handler:^(UITableViewRowAction *action, NSIndexPath *indexPath){ - [self tableView:tableView deleteRowAtIndex:indexPath]; - }]; - - UITableViewRowAction *imdnAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal - title:NSLocalizedString(@"Info", nil) - handler:^(UITableViewRowAction *action, NSIndexPath *indexPath){ - LinphoneChatMessage *msg = linphone_event_log_get_chat_message(event); - ChatConversationImdnView *view = VIEW(ChatConversationImdnView); - view.msg = msg; - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - }]; - - if (linphone_event_log_get_type(event) == LinphoneEventLogTypeConferenceChatMessage && - !(linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesOneToOne)) - return @[deleteAction, imdnAction]; - else - return @[deleteAction]; + + UIContextualAction *replyAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal + title:NSLocalizedString(@"Reply", nil) + handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { + LinphoneChatMessage *msg = linphone_event_log_get_chat_message(event); + [VIEW(ChatConversationView) initiateReplyViewForMessage:msg]; + [self scrollToBottom:TRUE]; + }]; + + UISwipeActionsConfiguration *swipeActionConfig = [UISwipeActionsConfiguration configurationWithActions:@[replyAction]]; + swipeActionConfig.performsFirstActionWithFullSwipe = YES; + return swipeActionConfig; } -- (void)tableView:(UITableView *)tableView - commitEditingStyle:(UITableViewCellEditingStyle)editingStyle - forRowAtIndexPath:(NSIndexPath *)indexPath { - if (editingStyle == UITableViewCellEditingStyleDelete) { +- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView + trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath { + + UIContextualAction *delete = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive + title:NSLocalizedString(@"Delete", nil) + handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { [self tableView:tableView deleteRowAtIndex:indexPath]; + }]; + + LinphoneEventLog *event = [[eventList objectAtIndex:indexPath.row] pointerValue]; + UIContextualAction *imdnAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal + title:NSLocalizedString(@"Info", nil) + handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { + LinphoneChatMessage *msg = linphone_event_log_get_chat_message(event); + ChatConversationImdnView *view = VIEW(ChatConversationImdnView); + view.msg = msg; + [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; + }]; + + UISwipeActionsConfiguration *swipeActionConfig; + + if (linphone_event_log_get_type(event) == LinphoneEventLogTypeConferenceChatMessage && + !(linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesOneToOne)) { + swipeActionConfig = [UISwipeActionsConfiguration configurationWithActions:@[delete, imdnAction]]; + } else { + swipeActionConfig = [UISwipeActionsConfiguration configurationWithActions:@[delete]]; } + + swipeActionConfig.performsFirstActionWithFullSwipe = YES; + return swipeActionConfig; } - (void)removeSelectionUsing:(void (^)(NSIndexPath *))remover { @@ -492,4 +518,5 @@ static const CGFloat MESSAGE_SPACING_PERCENTAGE = 1.f; [self reloadData]; } + @end diff --git a/Classes/ChatConversationView.m b/Classes/ChatConversationView.m index 0a729ad38..bf7d86be8 100644 --- a/Classes/ChatConversationView.m +++ b/Classes/ChatConversationView.m @@ -316,6 +316,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) { + [self refreshImageDrawer]; return; } composingVisible = !composingVisible; @@ -434,7 +435,7 @@ static UICompositeViewDescription *compositeDescription = nil; } -(NSData *) nsDataRead { - NSString* groupName = @"group.com.clavys.frogtrust.store"; + NSString* groupName = [NSString stringWithFormat:@"group.%@.linphoneExtension",[[NSBundle mainBundle] bundleIdentifier]]; NSString *path =[[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupName] path]; NSString *fullCacheFilePathPath = [NSString stringWithFormat:@"%@/%@",path,@"nsData"]; return[NSData dataWithContentsOfFile:fullCacheFilePathPath]; @@ -442,7 +443,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)shareFile { - NSString* groupName = @"group.com.clavys.frogtrust.store"; + NSString* groupName = [NSString stringWithFormat:@"group.%@.linphoneExtension",[[NSBundle mainBundle] bundleIdentifier]]; NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:groupName]; @@ -525,24 +526,26 @@ static UICompositeViewDescription *compositeDescription = nil; LOGW(@"Cannot send message: No chatroom"); return FALSE; } - + LinphoneChatMessage *msg = rootMessage; BOOL basic = [ChatConversationView isBasicChatRoom:_chatRoom]; - if (message && message.length > 0) { - if (!basic) - linphone_chat_message_add_utf8_text_content(msg, message.UTF8String); + if (!basic && message && message.length > 0) { + linphone_chat_message_add_utf8_text_content(msg, message.UTF8String); } - + if (externalUrl) { linphone_chat_message_set_external_body_url(msg, [[externalUrl absoluteString] UTF8String]); } - // we must ref & unref message because in case of error, it will be destroy otherwise - linphone_chat_message_send(msg); + bctbx_list_t const *contentList = linphone_chat_message_get_contents(msg); + if (bctbx_list_size(contentList) > 0) { + linphone_chat_message_send(msg); + } + if (basic && message && message.length > 0) { linphone_chat_message_send(linphone_chat_room_create_message_from_utf8(_chatRoom, message.UTF8String)); } - + return TRUE; } @@ -637,7 +640,6 @@ static UICompositeViewDescription *compositeDescription = nil; _composeIndicatorView.frame = newComposingFrame; } completion:^(BOOL finished) { - [_tableController scrollToBottom:TRUE]; _composeIndicatorView.hidden = !visible; }]; } @@ -1354,10 +1356,18 @@ void on_chat_room_chat_message_received(LinphoneChatRoom *cr, const LinphoneEven const LinphoneAddress *from = linphone_chat_message_get_from_address(chat); if (!from) return; - + + bool isDisplayingBottomOfTable = [view.tableController.tableView indexPathsForVisibleRows].lastObject.row == [view.tableController totalNumberOfItems] - 1; [view.tableController addEventEntry:(LinphoneEventLog *)event_log]; [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:view]; - [view.tableController scrollToLastUnread:TRUE]; + + + if (isDisplayingBottomOfTable) { + [view.tableController scrollToBottom:TRUE]; + } else { + int unread_msg = linphone_chat_room_get_unread_messages_count(cr); + [[view.tableController scrollBadge] setText:[NSString stringWithFormat:@"%d", unread_msg]]; + } } void on_chat_room_chat_message_sending(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { @@ -1635,10 +1645,9 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog -(BOOL) canAdminEphemeral:(LinphoneChatRoom *)cr { - return linphone_chat_room_has_capability(cr, LinphoneChatRoomCapabilitiesEphemeral) && ( - (linphone_chat_room_params_get_ephemeral_mode(linphone_chat_room_get_current_params(cr)) == LinphoneChatRoomEphemeralModeDeviceManaged) || - (linphone_chat_room_params_get_ephemeral_mode(linphone_chat_room_get_current_params(cr)) == LinphoneChatRoomEphemeralModeAdminManaged && linphone_participant_is_admin(linphone_chat_room_get_me(cr))) - ); + // If ephemeral mode is DeviceManaged, then we don't need to check anything else + return (linphone_chat_room_params_get_ephemeral_mode(linphone_chat_room_get_current_params(cr)) == LinphoneChatRoomEphemeralModeDeviceManaged) + || ( linphone_chat_room_has_capability(cr, LinphoneChatRoomCapabilitiesEphemeral) && linphone_chat_room_params_get_ephemeral_mode(linphone_chat_room_get_current_params(cr)) == LinphoneChatRoomEphemeralModeAdminManaged && linphone_participant_is_admin(linphone_chat_room_get_me(cr))); } @@ -1665,7 +1674,7 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog [_tableController onEditClick:nil]; [self onEditionChangeClick:nil]; } - if ([ConfigManager.instance lpConfigBoolForKeyWithKey:@"ephemeral_feature" defaultValue:false] && [self canAdminEphemeral:_chatRoom]) { + if ([self canAdminEphemeral:_chatRoom]) { if (indexPath.row == 2) { EphemeralSettingsView *view = VIEW(EphemeralSettingsView); view.room = _chatRoom; @@ -1679,7 +1688,7 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [ConfigManager.instance lpConfigBoolForKeyWithKey:@"ephemeral_feature" defaultValue:false] && [self canAdminEphemeral:_chatRoom] ? 3 : 2; + return (_chatRoom && [self canAdminEphemeral:_chatRoom]) ? 3 : 2; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { @@ -1693,7 +1702,8 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"delete_default.png"] newSize:CGSizeMake(20, 25)]; cell.textLabel.text = NSLocalizedString(@"Delete messages",nil); } - if ([ConfigManager.instance lpConfigBoolForKeyWithKey:@"ephemeral_feature" defaultValue:false] && [self canAdminEphemeral:_chatRoom]) { + + if ([self canAdminEphemeral:_chatRoom]) { if (indexPath.row == 2) { cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"ephemeral_messages_default.png"] newSize:CGSizeMake(20, 25)]; cell.textLabel.text = NSLocalizedString(@"Ephemeral messages",nil); @@ -1738,7 +1748,7 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog -(void) createVoiceRecorder { LinphoneRecorderParams *p = linphone_core_create_recorder_params(LC); - linphone_recorder_params_set_file_format(p, LinphoneRecorderFileFormatWav); + linphone_recorder_params_set_file_format(p, LinphoneRecorderFileFormatMkv); _voiceRecorder = linphone_core_create_recorder(LC, p); } @@ -1794,7 +1804,7 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog switch (linphone_recorder_get_state(_voiceRecorder)) { case LinphoneRecorderClosed: { - NSString *filename = [NSString stringWithFormat:@"%@/voice-recording-%@.wav",[LinphoneManager imagesDirectory], [NSUUID UUID].UUIDString]; + NSString *filename = [NSString stringWithFormat:@"%@/voice-recording-%@.mkv",[LinphoneManager imagesDirectory], [NSUUID UUID].UUIDString]; linphone_recorder_open(_voiceRecorder, filename.UTF8String); linphone_recorder_start(_voiceRecorder); LOGW(@"[Chat Message Sending] Recorder is closed opening it with %@",filename); diff --git a/Classes/ContactDetailsView.h b/Classes/ContactDetailsView.h index cc43758ad..e546c1bee 100644 --- a/Classes/ContactDetailsView.h +++ b/Classes/ContactDetailsView.h @@ -49,6 +49,8 @@ - (IBAction)onDeleteClick:(id)sender; - (IBAction)onAvatarClick:(id)sender; + +- (void)updateBackOrCancelButton; - (void)newContact; - (void)newContact:(NSString *)address; - (void)editContact:(Contact *)contact; diff --git a/Classes/ContactDetailsView.m b/Classes/ContactDetailsView.m index 8036b7180..22a98fa24 100644 --- a/Classes/ContactDetailsView.m +++ b/Classes/ContactDetailsView.m @@ -232,6 +232,18 @@ #pragma mark - ViewController Functions +- (void)updateBackOrCancelButton { + if (self.tableController.isEditing) { + _backButton.hidden = TRUE; + _cancelButton.hidden = FALSE; + } else { + if (!IPAD) { + _backButton.hidden = FALSE; + } + _cancelButton.hidden = TRUE; + } +} + - (void)viewDidLoad { [super viewDidLoad]; @@ -262,7 +274,7 @@ [ContactSelection getSelectionMode] != ContactSelectionModeNone); [_tableController.tableView addObserver:self forKeyPath:@"contentSize" options:0 context:NULL]; _tableController.waitView = _waitView; - if (!IPAD) + if (!IPAD && !self.tableController.isEditing) self.tmpContact = NULL; [[NSNotificationCenter defaultCenter] addObserver: self @@ -282,6 +294,8 @@ } } [_editButton setImage:[UIImage imageNamed:@"valid_default.png"] forState:UIControlStateSelected]; + + [self updateBackOrCancelButton]; } - (void)deviceOrientationDidChange:(NSNotification*)notif { @@ -296,15 +310,7 @@ } } - if (self.tableController.isEditing) { - _backButton.hidden = TRUE; - _cancelButton.hidden = FALSE; - } else { - if (!IPAD) { - _backButton.hidden = FALSE; - } - _cancelButton.hidden = TRUE; - } + [self updateBackOrCancelButton]; [self recomputeTableViewSize:_editButton.hidden]; } @@ -315,7 +321,9 @@ } [super viewWillDisappear:animated]; PhoneMainView.instance.currentName = NULL; - [self resetContact]; + if (!_tableController.isEditing) { + [self resetContact]; + } BOOL rm = TRUE; for (NSString *sip in _contact.sipAddresses) { @@ -433,6 +441,9 @@ static UICompositeViewDescription *compositeDescription = nil; if (!_isAdding) { _contact.firstName = _tmpContact.firstName.copy; _contact.lastName = _tmpContact.lastName.copy; + _contact.avatar = _tmpContact.avatar.copy; + [_avatarImage setImage:[FastAddressBook imageForContact:_contact] bordered:NO withRoundedRadius:YES]; + while (_contact.sipAddresses.count > 0) { [_contact removeSipAddressAtIndex:0]; } @@ -503,7 +514,7 @@ static UICompositeViewDescription *compositeDescription = nil; } NSString* previous = [PhoneMainView.instance getPreviousViewName]; - if ([previous isEqualToString:@"ContactsListView"]) { + if ([previous isEqualToString:@"ContactsListView"] || [previous isEqualToString:@"ImagePickerView"]) { ContactsListView *view = VIEW(ContactsListView); [PhoneMainView.instance popToView:view.compositeViewDescription]; } else { diff --git a/Classes/FloatingScrollDownButton.swift b/Classes/FloatingScrollDownButton.swift new file mode 100644 index 000000000..9b6089e07 --- /dev/null +++ b/Classes/FloatingScrollDownButton.swift @@ -0,0 +1,99 @@ +// +// FloatingScrollDownButton.swift +// linphone +// +// Created by QuentinArguillere on 27/01/2022. +// + +import Foundation +import UIKit + +public extension ChatConversationTableView { + + private enum Constants { + static let trailingValue: CGFloat = 20.0 + static let leadingValue: CGFloat = 85.0 + static let buttonHeight: CGFloat = 40.0 + static let buttonWidth: CGFloat = 40.0 + } + + override func viewDidLoad() { + super.viewDidLoad() + + tableView.tableFooterView = UIView() + createFloatingButton() + } + + override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { + if let lastCellRowIndex = tableView.indexPathsForVisibleRows?.last?.row { + if( lastCellRowIndex != self.totalNumberOfItems() - 1) { + self.floatingScrollButton?.isHidden = false + self.scrollBadge?.isHidden = (self.scrollBadge?.text == nil) + } else { + self.floatingScrollButton?.isHidden = true + self.scrollBadge?.text = nil + } + } + } + + private func createFloatingButton() { + self.floatingScrollButton = UIButton(type: .custom) + self.floatingScrollButton?.translatesAutoresizingMaskIntoConstraints = false + constrainFloatingButtonToWindow() + self.floatingScrollButton?.setImage(UIImage(named: "scroll_to_bottom_default"), for: .normal) + self.floatingScrollButton?.addTarget(self, action: #selector(scrollToBottomButtonAction(_:)), for: .touchUpInside) + self.floatingScrollButton?.isHidden = true; + addBadgeToButon(badge: nil) + } + + private func constrainFloatingButtonToWindow() { + DispatchQueue.main.async { + guard let keyWindow = UIApplication.shared.keyWindow, + let floatingButton = self.floatingScrollButton else { return } + keyWindow.addSubview(floatingButton) + keyWindow.trailingAnchor.constraint(equalTo: floatingButton.trailingAnchor, + constant: Constants.trailingValue).isActive = true + keyWindow.bottomAnchor.constraint(equalTo: floatingButton.bottomAnchor, + constant: Constants.leadingValue).isActive = true + floatingButton.widthAnchor.constraint(equalToConstant: + Constants.buttonWidth).isActive = true + floatingButton.heightAnchor.constraint(equalToConstant: + Constants.buttonHeight).isActive = true + } + } + + @IBAction private func scrollToBottomButtonAction(_ sender: Any) { + scroll(toBottom: true) + } + + + private func addBadgeToButon(badge: String?) { + self.scrollBadge = UILabel() + self.scrollBadge?.text = badge + self.scrollBadge?.textColor = UIColor.white + self.scrollBadge?.backgroundColor = UIColor.red + self.scrollBadge?.font = UIFont.systemFont(ofSize: 12.0) + self.scrollBadge?.sizeToFit() + self.scrollBadge?.textAlignment = .center + + if let badgeSize = self.scrollBadge?.frame.size, let scrollButton = self.floatingScrollButton { + let height = max(18, Double(badgeSize.height) + 5.0) + let width = max(height, Double(badgeSize.width) + 10.0) + + var vertical: Double?, horizontal: Double? + let badgeInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 15) + + vertical = Double(badgeInset.top) - Double(badgeInset.bottom) + horizontal = Double(badgeInset.left) - Double(badgeInset.right) + + let x = (Double(scrollButton.bounds.size.width) - 10 + horizontal!) + let y = -(Double(badgeSize.height) / 2) - 10 + vertical! + self.scrollBadge?.frame = CGRect(x: x, y: y, width: width, height: height) + + self.scrollBadge!.layer.cornerRadius = self.scrollBadge!.frame.height/2 + self.scrollBadge!.layer.masksToBounds = true + scrollButton.addSubview(self.scrollBadge!) + } + } +} + diff --git a/Classes/LinphoneCoreSettingsStore.m b/Classes/LinphoneCoreSettingsStore.m index a48f5f294..5e9c11448 100644 --- a/Classes/LinphoneCoreSettingsStore.m +++ b/Classes/LinphoneCoreSettingsStore.m @@ -202,19 +202,15 @@ [self setCString:tmp forKey:@"account_proxy_preference"]; } const char *tname = "udp"; - if (linphone_address_get_secure(proxy_addr)) { - tname = "tls"; - } else { - switch (linphone_address_get_transport(proxy_addr)) { - case LinphoneTransportTcp: - tname = "tcp"; - break; - case LinphoneTransportTls: - tname = "tls"; - break; - default: - break; - } + switch (linphone_address_get_transport(proxy_addr)) { + case LinphoneTransportTcp: + tname = "tcp"; + break; + case LinphoneTransportTls: + tname = "tls"; + break; + default: + break; } linphone_address_unref(proxy_addr); [self setCString:tname forKey:@"account_transport_preference"]; @@ -350,7 +346,6 @@ [self setInteger:maxSize forKey:@"auto_download_incoming_files_max_size"]; [self setBool:[VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId] forKey:@"vfs_enabled_mode"]; [self setBool:[lm lpConfigBoolForKey:@"auto_write_to_gallery_preference" withDefault:YES] forKey:@"auto_write_to_gallery_mode"]; - [self setBool:[lm lpConfigBoolForKey:@"ephemeral_feature" withDefault:NO] forKey:@"ephemeral_feature"]; } // network section @@ -501,7 +496,6 @@ NSString *userID = [self stringForKey:@"account_userid_preference"]; NSString *domain = [self stringForKey:@"account_mandatory_domain_preference"]; NSString *transport = [self stringForKey:@"account_transport_preference"]; - BOOL isTransportTls = [transport isEqualToString:@"tls"]; NSString *accountHa1 = [self stringForKey:@"ha1_preference"]; NSString *accountPassword = [self stringForKey:@"account_mandatory_password_preference"]; NSString *accountAlgoPreference = [self stringForKey:@"ha1_algo_preference"]; @@ -522,12 +516,8 @@ proxyAddress = domain; } - if (![proxyAddress hasPrefix:@"sip:"] && ![proxyAddress hasPrefix:@"sips:"]) { - if (isTransportTls) { - proxyAddress = [NSString stringWithFormat:@"sips:%@", proxyAddress]; - } else { - proxyAddress = [NSString stringWithFormat:@"sip:%@", proxyAddress]; - } + if (![proxyAddress hasPrefix:@"sip:"] && ![proxyAddress hasPrefix:@"sips:"]) { + proxyAddress = [NSString stringWithFormat:@"sip:%@", proxyAddress]; } LinphoneAddress *proxy_addr = linphone_core_interpret_url(LC, proxyAddress.UTF8String); @@ -536,7 +526,7 @@ LinphoneTransportType type = LinphoneTransportUdp; if ([transport isEqualToString:@"tcp"]) type = LinphoneTransportTcp; - else if (isTransportTls) + else if ([transport isEqualToString:@"tls"]) type = LinphoneTransportTls; linphone_address_set_transport(proxy_addr, type); @@ -549,9 +539,8 @@ if (account == NULL) goto bad_proxy; - - LinphoneAddress *linphoneAddress; - linphoneAddress = linphone_core_interpret_url(LC, isTransportTls ? "sips:user@domain.com" : "sip:user@domain.com"); + + LinphoneAddress *linphoneAddress = linphone_core_interpret_url(LC, "sip:user@domain.com"); linphone_address_set_username(linphoneAddress, username.UTF8String); if ([LinphoneManager.instance lpConfigBoolForKey:@"use_phone_number" inSection:@"assistant"]) { char *user = linphone_account_normalize_phone_number(account, username.UTF8String); @@ -822,7 +811,6 @@ } } [lm lpConfigSetBool:[self boolForKey:@"auto_write_to_gallery_mode"] forKey:@"auto_write_to_gallery_preference"]; - [lm lpConfigSetBool:[self boolForKey:@"ephemeral_feature"] forKey:@"ephemeral_feature"]; // network section BOOL edgeOpt = [self boolForKey:@"edge_opt_preference"]; diff --git a/Classes/LinphoneManager.h b/Classes/LinphoneManager.h index 53be84967..63af59110 100644 --- a/Classes/LinphoneManager.h +++ b/Classes/LinphoneManager.h @@ -204,7 +204,6 @@ typedef struct _LinphoneManagerSounds { @property (readonly) sqlite3* database; @property (readonly) LinphoneManagerSounds sounds; @property (readonly) NSMutableArray *logs; -@property (nonatomic, assign) BOOL bluetoothAvailable; @property (readonly) NSString* contactSipField; @property (readonly,copy) NSString* contactFilter; @property (copy) void (^silentPushCompletion)(UIBackgroundFetchResult); diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index c980e5644..b86a4b1fe 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -233,10 +233,6 @@ struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_pre - (id)init { if ((self = [super init])) { - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(audioRouteChangeListenerCallback:) - name:AVAudioSessionRouteChangeNotification - object:nil]; NSString *path = [[NSBundle mainBundle] pathForResource:@"msg" ofType:@"wav"]; self.messagePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:path] error:nil]; @@ -1328,12 +1324,33 @@ void popup_link_account_cb(LinphoneAccountCreator *creator, LinphoneAccountCreat } } +- (void)activateBasicChatroomCPIMForLinphoneAccounts { + const MSList *accountsList = linphone_core_get_account_list(theLinphoneCore); + while (accountsList) { + LinphoneAccount * account = accountsList->data; + LinphoneAccountParams const * currentParams = linphone_account_get_params(account); + LinphoneAddress const * currentAddress = linphone_account_params_get_identity_address(currentParams); + + if (strcmp(linphone_address_get_domain(currentAddress), "sip.linphone.org") == 0 && !linphone_account_params_cpim_in_basic_chat_room_enabled(currentParams) ) { + + LOGI(@"Enabling CPIM in basic chatroom for user %s", linphone_address_get_username(currentAddress)); + LinphoneAccountParams * newParams = linphone_account_params_clone(linphone_account_get_params(account)); + linphone_account_params_enable_cpim_in_basic_chat_room(newParams, true); + linphone_account_set_params(account, newParams); + linphone_account_params_unref(newParams); + } + + accountsList = accountsList->next; + } +} + - (void)startLinphoneCore { bool corePushEnabled = [self lpConfigIntForKey:@"net" inSection:@"push_notification"]; linphone_core_set_push_notification_enabled([LinphoneManager getLc], corePushEnabled); linphone_core_start([LinphoneManager getLc]); [self configurePushProviderForAccounts]; + [self activateBasicChatroomCPIMForLinphoneAccounts]; } - (void)createLinphoneCore { @@ -1769,21 +1786,8 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { } #pragma mark - Audio route Functions -- (void)audioRouteChangeListenerCallback:(NSNotification *)notif { - if (IPAD) - return; - - _bluetoothAvailable = [CallManager.instance isBluetoothAvailable]; - - NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:_bluetoothAvailable], @"available", nil]; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneBluetoothAvailabilityUpdate - object:self - userInfo:dict]; - -} - #pragma mark - Call Functions -- (void)send:(NSString *)replyText toChatRoom:(LinphoneChatRoom *)room { +- (void)send:(NSString *)replyText toChatRoom:(LinphoneChatRoom *)room { LinphoneChatMessage *msg = linphone_chat_room_create_message(room, replyText.UTF8String); linphone_chat_message_send(msg); diff --git a/Classes/LinphoneUI/UIChatBubblePhotoCell.m b/Classes/LinphoneUI/UIChatBubblePhotoCell.m index bb48c65b5..cf6c18807 100644 --- a/Classes/LinphoneUI/UIChatBubblePhotoCell.m +++ b/Classes/LinphoneUI/UIChatBubblePhotoCell.m @@ -66,10 +66,7 @@ self.vrView.layer.cornerRadius = 30.0f; self.vrView.layer.masksToBounds = YES; [self.innerView addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onPopupMenuPressed)]]; - self.messageText.userInteractionEnabled = true; - self.messageText.editable = false; - self.messageText.selectable = true; - self.messageText.dataDetectorTypes = UIDataDetectorTypeLink; + [self.messageText addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onPopupMenuPressed)]]; } return self; } diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.m b/Classes/LinphoneUI/UIChatBubbleTextCell.m index ca0593c97..4ee9ae625 100644 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.m +++ b/Classes/LinphoneUI/UIChatBubbleTextCell.m @@ -47,10 +47,7 @@ [_innerView addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onPopupMenuPressed)]]; - _messageText.userInteractionEnabled = true; - _messageText.editable = false; - _messageText.selectable = true; - _messageText.dataDetectorTypes = UIDataDetectorTypeLink; + [_messageText addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onPopupMenuPressed)]]; self.contentView.userInteractionEnabled = NO; diff --git a/Classes/LinphoneUI/UITextViewNoDefine.h b/Classes/LinphoneUI/UITextViewNoDefine.h index ec3247b5e..cc370c6d1 100644 --- a/Classes/LinphoneUI/UITextViewNoDefine.h +++ b/Classes/LinphoneUI/UITextViewNoDefine.h @@ -19,7 +19,7 @@ #import -@interface UITextViewNoDefine : UITextView +@interface UITextViewNoDefine : UITextView @property BOOL allowSelectAll; diff --git a/Classes/LinphoneUI/UITextViewNoDefine.m b/Classes/LinphoneUI/UITextViewNoDefine.m index b84cdae77..023852314 100644 --- a/Classes/LinphoneUI/UITextViewNoDefine.m +++ b/Classes/LinphoneUI/UITextViewNoDefine.m @@ -23,15 +23,23 @@ @synthesize allowSelectAll; -- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { - // disable "define" option, since it messes with the keyboard - if ([[NSStringFromSelector(action) lowercaseString] rangeOfString:@"define"].location != NSNotFound) { - return NO; - } else if (action == @selector(selectAll:) && allowSelectAll) { - return YES; - } else { - return [super canPerformAction:action withSender:sender]; - } +-(void)awakeFromNib{ + [super awakeFromNib]; + self.delegate = self; + self.userInteractionEnabled = true; + self.editable = false; + self.selectable = true; + self.dataDetectorTypes = UIDataDetectorTypeLink; +} + +- (BOOL)canBecomeFirstResponder { + return NO; +} + +- (void)textViewDidChangeSelection:(UITextView *)textView +{ + textView.selectedTextRange = nil; + [textView endEditing:YES]; } @end diff --git a/Classes/ProviderDelegate.swift b/Classes/ProviderDelegate.swift index c9eb1dbb1..2c6669a0a 100644 --- a/Classes/ProviderDelegate.swift +++ b/Classes/ProviderDelegate.swift @@ -191,6 +191,7 @@ extension ProviderDelegate: CXProviderDelegate { CallManager.instance().backgroundContextCameraIsEnabled = call!.params?.videoEnabled ?? false call?.cameraEnabled = false // Disable camera while app is not on foreground } + CallManager.instance().callkitAudioSessionActivated = false CallManager.instance().lc?.configureAudioSession() CallManager.instance().acceptCall(call: call!, hasVideo: call!.params?.videoEnabled ?? false) action.fulfill() @@ -305,11 +306,13 @@ extension ProviderDelegate: CXProviderDelegate { func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) { Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: audio session activated.") CallManager.instance().lc?.activateAudioSession(actived: true) + CallManager.instance().callkitAudioSessionActivated = true } func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) { Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: audio session deactivated.") CallManager.instance().lc?.activateAudioSession(actived: false) + CallManager.instance().callkitAudioSessionActivated = nil } } diff --git a/Classes/VFSUtil.swift b/Classes/VFSUtil.swift index 79343d154..5047fd21c 100644 --- a/Classes/VFSUtil.swift +++ b/Classes/VFSUtil.swift @@ -187,7 +187,7 @@ import os return false } guard let secret = decrypt(encryptedText: encryptedKey) else { - log(log: "[VFS] Unable to decryt encrypted key.", level: .error) + log("[VFS] Unable to decryt encrypted key.", .error) return false } Factory.Instance.setVfsEncryption(encryptionModule: 2, secret: secret, secretSize: 32) diff --git a/Classes/linphone-Bridging-Header.h b/Classes/linphone-Bridging-Header.h index a520acc8e..3e52d89b6 100644 --- a/Classes/linphone-Bridging-Header.h +++ b/Classes/linphone-Bridging-Header.h @@ -8,4 +8,4 @@ #import "FastAddressBook.h" #import "Log.h" #import "AudioHelper.h" - +#import "ChatConversationTableView.h" diff --git a/Podfile b/Podfile index d6a747f18..38788bd8b 100644 --- a/Podfile +++ b/Podfile @@ -5,7 +5,7 @@ source "https://github.com/CocoaPods/Specs.git" def all_pods if ENV['PODFILE_PATH'].nil? - pod 'linphone-sdk', '~> 5.1.0-alpha.75+d4a0bd2' + pod 'linphone-sdk', '~> 5.1.0-beta.69+950f104' else pod 'linphone-sdk', :path => ENV['PODFILE_PATH'] # local sdk end diff --git a/Resources/assistant_linphone_create.rc b/Resources/assistant_linphone_create.rc index 434a19a72..4328453d5 100644 --- a/Resources/assistant_linphone_create.rc +++ b/Resources/assistant_linphone_create.rc @@ -17,6 +17,7 @@ 1 1 sip:conference-factory@sip.linphone.org + 1
diff --git a/Resources/fr.lproj/Localizable.strings b/Resources/fr.lproj/Localizable.strings index 42321344b..972463308 100644 --- a/Resources/fr.lproj/Localizable.strings +++ b/Resources/fr.lproj/Localizable.strings @@ -1 +1 @@ -" Your account is created. We have sent a confirmation email to %@. Please check your mails to validate your account. Once it is done, come back here and click on the button." = " Votre compte a été créé. Nous avons envoyé un email de confirmation à l'adresse : %@.\nPour valider votre compte, veuillez suivre les instructions reçues par email et cliquer sur le bouton."; "%@ are writing..." = "%@ écrivent..."; "%@ has joined" = "%@ a rejoint le groupe"; "%@ has left" = "%@ a quitté le groupe"; "%@ is busy." = "%@ est occupé"; "%@ is no longer an admin" = "%@ n'est plus admin"; "%@ is not connected." = "%@ est déconnecté"; "%@ is now an admin" = "%@ est devenu(e) admin"; "%@ is writing..." = "%@ écrit..."; "%@ would like to enable video" = "%@ souhaite activer la vidéo"; "%@\nReason was: %@" = "%1$@\nLa cause était: %2$@"; "(invalid string)" = "(message invalide)"; /* Email title for people wanting to send a bug report */ "" = ""; "\nConfirmation security\n\nSay: %@\nConfirm that your interlocutor\nsays: %@" = "\nSécurité des communications\n\nDites : %1$@\nConfirmez que votre interlocuteur a bien dit : %2$@"; "A new version of your app is available, use the button below to download it." = "Une mise à jour est disponible"; "About" = "A propos"; "ACCEPT" = "ACCEPTER"; "Accept" = "Accepter"; "Account configuration issue" = "Problème de configuration du compte"; "Account expiring" = "Le compte arrive à expiration"; "Add new email" = "Ajouter une adresse email"; "Add new phone number" = "Ajouter un numéro de téléphone"; "Add new SIP address" = "Ajouter un champ adresse SIP"; "Address book" = "Annuaire"; "Address incomplete" = "Adresse incomplète"; "Answer" = "Répondre"; "Application logs" = "Traces de l'application"; "Are you sure to want to remove your proxy setup?" = "Souhaitez-vous supprimer la configuration du compte ?"; "Assistant" = "Assistant"; "Assistant error" = "Erreur dans l'assistant"; "Authentification needed" = "Authentification requise"; "Average" = "Moyen"; "Bad credentials, check your account settings" = "Erreur d'authentification, vérifiez votre nom d'utilisateur et votre mot de passe"; "Bad gateway" = "Mauvaise passerelle"; "Battery is running low. Stop video ?" = "La batterie est faible. Voulez-vous stopper la vidéo?"; "Buy" = "Acheter"; "CALL" = "APPELER"; "Call" = "Appeler"; "Call %@" = "Appel %@"; "Call failed" = "Échec de l'appel"; "Call quality: %d" = "Qualité d'appel: %d"; "Calls" = "Appels"; "Camera" = "Appareil photo"; "Camera not authorized" = "Caméra non autorisée"; "Camera's permission" = "Permission d'utiliser la caméra"; "Can't find this file" = "Impossible de trouver ce fichier"; "Cancel" = "Annuler"; "CANCEL" = "ANNULER"; "Cannot call %@." = "Impossible d'appeler %@"; "Cannot make call" = "Appel impossible"; "Cannot purchase anything yet, please try again later." = "Impossible d'acheter quoi que ce soit, veuillez réessayer plus tard."; "Cannot reach the server: either it is an invalid address or it may be temporary down." = "Impossible de communiquer avec le serveur : vérifiez l'adresse ou rééssayez plus tard."; "Cannot retrieve your configuration. Please check credentials or try again later" = "Impossible de récupérer la configuration. Vérifiez vos paramètres ou réessayez plus tard."; "Cannot send email" = "Impossible d'envoyer l'email"; "Cannot send logs" = "Impossible d'envoyer les traces"; "Cannot write image to photo library" = "Impossible d'enregistrer l'image dans l'album photo"; "Cannot write video to photo library" = "Impossible d'enregistrer la vidéo dans la photothèque"; "Change your password" = "Changez de mot de passe"; "Changing your password" = "Changement de mot de passe"; "Chat room could not be created on server" = "La conversation n'a pas pu être créée sur le serveur"; "Chat room creation error" = "Erreur de création de conversation"; "Chat with %@" = "Conversation avec %@"; "Checkbox" = "Case à cocher"; "Choose an action" = "Choisir une action"; "Choose the image size" = "Choisissez la taille de l'image"; "Conference" = "Conférence"; "Configuration failed" = "Échec de la configuration"; "Configuring account" = "Configuration de compte"; "Confirm password" = "Confirmation du mot de passe"; "Confirm the following SAS with peer:\nSay : %@\nYour correspondant should say : %@" = "Veuillez confirmer le code SAS suivant avec votre correspondant :\n\nDites : %1$@\nVérifiez que votre interlocuteur dise : %2$@"; "Contact duplicate" = "Duplication du contact"; "Contact error" = "Erreur contact"; "Continue" = "Continuer"; "Continue video" = "Continuer la vidéo"; "Conversation creation error" = "La conversation n'a pas pu être créée"; "Could not configure your account, please check parameters or try again later" = "Impossible de configurer le compte, vérifiez les paramètres ou réessayez plus tard."; "Debug" = "Déboggage"; "Decline" = "Refuser"; "Delete" = "Supprimer"; "Delivered" = "Reçu"; "Deny" = "Refuser"; "DENY" = "REFUSER"; "Deselect all" = "Tout déselectionner"; "Deselected" = "Désélectionné"; /* ICE has established a direct connection to the remote host */ "Direct connection" = "Connexion directe"; "Disable logs" = "Désactiver les traces"; "Do you want to delete selected contact?\nIt will also be deleted from your phone's address book." = "Souhaitez-vous supprimer le contact sélectionné?\nIl sera également supprimé du carnet d'adresses de votre téléphone."; "Do you want to delete selected contacts?\nThey will also be deleted from your phone's address book." = "Souhaitez-vous supprimer les contacts sélectionnés?\nIls seront également supprimés du carnet d'adresses de votre téléphone."; "Do you want to delete selected logs?" = "Souhaitez-vous supprimer les appels sélectionnés de l'historique ?"; "Do you want to delete selected recordings?" = "Souhaitez-vous supprimer les enregistrements sélectionnés ?"; "Do you want to delete the selected conversations?" = "Souhaitez-vous supprimer les discussions sélectionnées ?"; "Do you want to delete the selected messages?" = "Souhaitez-vous supprimer les messages sélectionnées?"; "Do you want to delete this conversation?" = "Souhaitez-vous supprimer cette discussion ?"; "Do you want to leave and delete the selected conversations?" = "Souhaitez-vous quitter et supprimer les conversations sélectionnées ?"; "Do you want to leave and delete this conversation?" = "Souhaitez-vous quitter et supprimer cette discussion ?"; "Do you want to leave this conversation?" = "Souhaitez-vous quitter cette conversation?"; "Done" = "Terminé"; "Download" = "Télécharger"; /* Date formatting in History Details (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "EEE dd MMM 'at' HH'h'mm" = "EEE dd MMM 'à' HH'h'mm"; /* Date formatting in History List, for current year (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "EEE dd MMMM" = "EEE dd MMMM"; /* Date formatting in History List, for previous years (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "EEE dd MMMM yyyy" = "EEE dd MMMM yyyy"; "Either configure a SIP proxy server from settings prior to place a call or use a valid SIP address (I.E sip:john@example.net)" = "Veuillez configurer un serveur proxy SIP dans les options ou entrer une adresse SIP avant de faire un appel (I.E sip:john@example.net)"; "Either configure a SIP proxy server from settings prior to send a message or use a valid SIP address (I.E sip:john@example.net)" = "Veuillez configurer un serveur proxy SIP dans les options ou entrer une adresse SIP avant d'envoyer un message (I.E sip:john@example.net)"; "Email addresses" = "Adresses email"; "Enable logs" = "Activer les traces"; "Error" = "Erreur"; "Error while changing your password" = "Erreur lors du changement de mot de passe"; "Error while downloading the file.\nThe file is probably encrypted.\nPlease retry to download this file after activating LIME." = "Une erreur est survenue pendant le téléchargement.\nLe fichier est probablement chiffré.\nVeuillez activer LIME avant de réessayer de télécharger le fichier."; "Error: no mail account configured" = "Erreur : aucun compte email configuré"; /* ICE processing has failed */ "Failed" = "Échec"; "Failed configuring from the specified URL." = "Format d'URL inconnu. Le fichier de configuration n'a pas pu être téléchargé."; "Failure" = "Échec"; "Fetching remote configuration" = "Téléchargement de la configuration distante"; "Fetching remote configuration..." = "Téléchargement de la configuration distante..."; "File download error" = "Impossible de télécharger le fichier"; "First name" = "Prénom"; "GC_MSG" = "Vous avez été ajouté à une conversation"; "Go to settings" = "Accéder aux paramètres"; "Group conversation is not supported." = "La conversation de groupe n'est pas supportée"; "Hello! Join me on Linphone! You can download it for free at: https://www.linphone.org/download" = "Bonjour! Rejoignez-moi sur Linphone. Vous pouvez télécharger l'app gratuitement sur : https://www.linphone.org/download"; /* Template email for people wanting to send a bug report */ "Here are information about an issue I had on my device.\nI was doing ...\nI expected Linphone to ...\nInstead, I got an unexpected result: ..." = "J'ai rencontré un comportement inattendu sur Linphone.\nJ'étais en train de \nJe pensais que Linphone allait \nÀ la place, "; /* Date formatting in Chat List and Conversation bubbles, for current day (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "HH:mm" = "HH:mm"; "I got it, continue" = "Continuer quand même"; "IC_MSG" = ""; "ICloud Drive is unavailable." = "ICloud Drive n'est pas disponible"; "IM_FULLMSG" = ""; "IM_MSG" = "Vous avez reçu un message"; "In apps not ready yet" = "Achats non disponibles actuellement"; /* ICE process is in progress */ "In progress" = "En cours"; "Incoming call" = "Appel entrant"; "Info" = "Infos"; "Instant messages are end-to-end encrypted in secured conversations. It is possible to upgrade the security level of a conversation by authenticating participants. To do so, call the contact and follow the authentification process." = "Dans les conversations sécurisées, les messages sont chiffrés de bout en bout. Il est possible d'augmenter le niveau de sécurité en vérifiant l'identité des participants. Pour ce faire, appelez le contact et suivez la procédure d'authentification."; "Invalid proxy address" = "Adresse de proxy invalide"; "Invalid remote provisioning URL" = "URL de configuration invalide"; "Invalid route" = "Route invalide"; "Invalid SIP address" = "Adresse SIP invalide"; "Invalid username or domain" = "Nom d'utilisateur ou domaine invalide"; "Invalid." = "Invalide"; "Last name" = "Nom de famille"; "Later" = "Plus tard"; "LEAVE" = "QUITTER"; "Let's go" = "Allons-y"; "LIME identity key changed" = "Les clés de sécurité ont changé"; "LIME identity key changed for %@" = "Les clés de sécurité ont changé pour %@"; "LIME requires ZRTP encryption.\nBy activating LIME you automatically activate ZRTP media encryption." = "LIME nécessite l'encryption ZRTP.\nEn activant LIME vous activez automatiquement l'encryption ZRTP."; "LIME warning" = "Avertissement LIME"; "Link my account" = "Lier mon compte"; "Link your account" = "Lier votre compte"; "Link your Linphone.org account %s to your phone number." = "Lier votre compte Linphone.org %s avec votre numéro de téléphone."; "Low bandwidth" = "Bande passante faible"; /* InAppSettingKit */ "Mail not configured" = "Aucun compte email configuré"; "Man-in-the-middle attack detected" = "Attaque de l'homme du milieu détectée"; "Man-in-the-middle attack detected for %@" = "Attaque de l'homme du milieu détectée pour %@"; "Mark as seen" = "Marquer comme lu"; "Mark Read" = "Marqué comme lu"; "Max participant count exceeded" = "Nombre maximum de terminaux dépassé"; "Max participant count exceeded by %@" = "Nombre maximum de terminaux dépassé pour %@"; "Maximum" = "Maximum"; "Maybe later" = "Peut-être plus tard"; "Message received" = "Message reçu"; "Minimum" = "Minimum"; "Missed call" = "Appel manqué"; "Missing required callbacks" = "Callbacks requises manquantes"; "Missing required parameters" = "Paramètres requis manquants"; /* Date formatting in Chat List, for all but current day (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "MM/dd" = "dd/MM"; /* Date formatting in Conversation bubbles, for all but current day (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "MM/dd - HH:mm" = "dd/MM - HH:mm"; /* ICE has established a connection to the remote host through one or several NATs */ "NAT(s) connection" = "Connexion par NAT"; "Network down" = "Aucun réseau"; "Network Error" = "Erreur réseau"; "New subject : %@" = "Nouveau sujet : %@"; "No" = "Non"; "No account" = "Aucun compte"; "No account configured" = "Aucun compte configuré"; "No address" = "Aucune adresse"; "No call in progress" = "Aucun appel en cours"; "No default account" = "Aucun compte par défaut"; "No microphone" = "Aucun microphone"; "No response received from remote" = "Aucune réponse reçue"; "None" = "Aucun"; /* ICE has not been activated for this call */ "Not activated" = "Désactivé"; "Not implemented" = "Non disponible"; "Not connected" = "Non connecté"; "Nothing could be collected from your application, aborting now." = "Impossible de collecter les traces depuis l'application, abandon."; /* InAppSettingsKit */ "OK" = "OK"; "Operation could not be executed by server or remote client because it didn't have any context for it" = "Impossible d'éxécuter la requête sur le serveur distant."; "Operation is unauthorized because missing credential" = "Opération non permise"; "Outdated Version" = "Version obsolète"; "Password" = "Mot de passe"; "Passwords do not match." = "Les mots de passe ne correspondent pas"; "Phone numbers" = "Numéros de téléphone"; "Photo library" = "Album photos"; "Photo not authorized" = "Photo non autorisée"; "Photo's permission" = "Permission photo"; "Please confirm your country code and enter your phone number" = "Confirmez l'indicatif téléphonique de votre pays et saisissez votre numéro de téléphone."; "Please confirm your country code and enter your phone number." = "Confirmez l'indicatif téléphonique de votre pays et saisissez votre numéro de téléphone."; "Please enter a password to your account" = "Veuillez entrer un mot de passe pour votre compte"; "Please enter a username" = "Veuillez entrer un nom d'utilisateur"; "Please enter and confirm your new password" = "Veuillez entrer et confirmer votre nouveau mot de passe"; "Please enter your email" = "Veuillez entrer votre adresse email"; "Please enter your phone number" = "Veuillez entrer votre numéro de téléphone"; "Please enter your username" = "Entrez votre nom d'utilisateur"; "Please enter your username and password" = "Veuillez entrer votre nom d'utilisateur et votre mot de passe"; "Please make sure your device is connected to the internet and double check your SIP account configuration in the settings." = "Veuillez vous connecter à internet et revérifier la configuration de votre compte dans les options."; "Please terminate GSM call first." = "Merci de terminer l'appel GSM, puis réessayez."; "Provisioning Load error" = "Erreur du chargement de la configuration distante"; "Read" = "Lu"; "Recordings" = "Enregistrements"; "Connected" = "Connecté"; "Connection failed" = "La connexion a échoué"; "Connection failed because authentication is missing or invalid for %@@%@.\nYou can provide password again, or check your account configuration in the settings." = "La connexion a échoué car l'authentification est manquante ou non valide pour %1$@@%2$@.\nVous pouvez saisir à nouveau le mot de passe, ou vérifier la configuration de votre compte dans les paramètres."; "Connection failure" = "Échec de connexion"; "Connection in progress" = "Connexion en cours"; /* ICE has established a connection through a relay */ "Relay connection" = "Connexion relayée"; "Remote configuration" = "Configuration distante"; "Remote configuration successfully fetched and applied." = "Configuration distante correctement téléchargé et appliquée."; "Remove account(s) and self destruct" = "Supprimer le(s) compte(s) et quitter"; "Reply" = "Répondre"; "Resend" = "Renvoyer"; "Resource moved permanently" = "Ressource indisponible"; "Resource no longer exists" = "Ressource inexistante"; "Save" = "Enregistrer"; "Security level decreased" = "Baisse du niveau de sécurité"; "Security level decreased because of %@" = "Baisse du niveau de sécurité due à %@"; "Select all" = "Tout sélectionner"; "Select the source" = "Sélectionner la source"; "Select your country" = "Sélectionnez votre pays"; "Selected" = "Sélectionné"; "Send logs" = "Envoyer les traces"; "Sending logs" = "Envoyer les traces"; "Sent" = "Envoyé"; "Server error, please try again later." = "Serveur indisponible. Veuillez réessayer plus tard"; "Server request error" = "Erreur lors de la requête au serveur"; "Server timeout" = "Expiration serveur"; "Settings" = "Options"; "Shop" = "Achats"; "Show" = "Afficher"; "SIP addresses" = "Adresses SIP"; "Stop video" = "Arrêter la video"; "Success" = "Succès"; "Temporarily unavailable" = "Temporairement inaccessible"; "The confirmation code is invalid. \nPlease check your SMS and try again." = "Le code d'activation est invalide.\nVeuillez vérifier vos SMS et réessayer."; "The confirmation code is invalid. \nPlease try again." = "Le code d'activation est invalide.\nVeuillez réessayer."; "There is no network connection available, enable WIFI or WWAN prior to configure an account" = "Il n'y a aucune connexion réseau disponible, activer le WIFI ou le WWAN avant de configurer un compte."; "There is no network connection available, enable WIFI or WWAN prior to configure an account." = "Il n'y a aucune connexion réseau disponible, activer le WIFI ou le WWAN avant de configurer un compte."; "There is no network connection available, enable WIFI or WWAN prior to place a call" = "Il n'y a aucune connexion réseau disponible, activer le WIFI ou le WWAN avant de faire un appel."; "There is no network connection available, enable WIFI or WWAN prior to send a message" = "Il n'y a aucune connexion réseau disponible, activer le WIFI ou le WWAN avant d'envoyer un message."; "This account does not exist." = "Ce compte n'existe pas."; "This account is already activated." = "Ce compte est déjà activé."; "This account is already in use." = "Ce compte est déjà utilisé."; "This account is already connected." = "Ce compte est déjà connecté."; "This account is not activated yet." = "Ce compte n'est pas encore activé."; "This alias does not exist." = "Cet alias n'existe pas."; /* InAppSettingsKit */ "This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Votre appareil n'est pas configuré pour envoyer des emails. Veuillez le configurer avant d'envoyer les logs."; "This email address is already used." = "Cette adresse email est déjà utilisée."; "This email does not exist." = "Cette adresse email n'existe pas."; "This message is not encrypted." = "Ce message n'est pas chiffré."; "This operation will load a remote configuration. Continue ?" = "Cette opération va télécharger une configuration distante. Continuer ?"; "This phone number is already used. Please type a different number. \nYou can delete your existing account if you want to reuse your phone number." = "Ce numéro de téléphone est déjà utilisé. Veuillez saisir un autre numéro.\nVous pouvez supprimer le compte existant si vous voulez réutiliser votre numéro de téléphone."; "TODAY" = "AUJOURD'HUI"; "Transfer error" = "Erreur de transfert"; "Trust has been denied. Make a call to start the authentication process again." = "La confiance a été retirée. Appelez ce contact pour relancer la procédure d'authentification."; "Unknown" = "Inconnu"; "Unknown country code" = "Code pays inconnu"; "Unknown error" = "Erreur inconnue"; "Unknown error (%@)." = "Erreur inconnue (%@)"; "Unknown error, please try again later." = "Erreur inconnue, veuillez réessayer plus tard"; "Unsupported content" = "Contenu non supporté"; "Video cannot be activated because of low bandwidth condition, only audio is available" = "L'appel vidéo ne peut pas aboutir car les conditions réseaux sont insuffisantes."; "Video request" = "Requête vidéo"; "Voice mail" = "Messagerie vocale"; "Warning" = "Attention"; "Warning: an email will be created with 3 attachments:\n- Application logs\n- Linphone configuration\n- Chats history.\nThey may contain private informations (MIGHT contain clear-text password!).\nYou can remove one or several of these attachments before sending your email, however there are all important to diagnostize your issue." = "Attention: un email va être créé avec 3 pièces jointes :\n- Les traces de l'application\n- La configuration Linphone\n- L'historique des conversations\nCes pièces jointes peuvent contenir des informations privées (dont des mots de passe en clair).\nVous pouvez filtrer les fichiers à envoyer, mais notez qu'ils sont tous importants pour comprendre votre problème."; "Warning: an email will be created with application logs. It may contain private informations (but no password!).\nThese logs are important to diagnostize your issue." = "Attention : un email va être créé avec les traces de l'application. Ceux-ci peuvent contenir des informations privées (mais pas de mots de passe).\nCes informations sont importantes pour comprendre votre problème."; "We have sent a SMS with a validation code to %@. To complete your phone number verification, please enter the 4 digit code below:" = "Nous avons envoyé un SMS avec un code d'activation au numéro : %@.\nPour valider votre numéro, veuillez entrer le code à 4 chiffres ci-dessous :"; "What will my phone number be used for?" = "Comment mon numéro de téléphone sera-t-il utilisé ?"; "Yes" = "Oui"; "YESTERDAY" = "HIER"; "You already own an account." = "Vous possédez déjà un compte"; "You are no longer an admin of the chat room" = "Vous n'êtes plus un administrateur du groupe"; "You are now an admin of the chat room" = "Vous êtes à présent un administrateur du groupe"; "You are trying to send a message using LIME to a contact not verified by ZRTP.\nPlease call this contact and verify his ZRTP key before sending your messages." = "Vous essayez d'envoyer un message chiffré à un contact non vérifié via ZRTP.\nVeuillez appeler ce contact et vérifier sa clé ZRTP avant d'envoyer vos messages."; "You cancelled your account." = "Vous avez résilié votre compte."; "You have already purchased an account but it does not exist anymore." = "Vous avez déjà acheté un compte mais il a été supprimé."; "You have been added to a chat room" = "Vous avez été ajouté à une conversation"; "You have joined the group" = "Vous avez rejoint le groupe"; "You have left the group" = "Vous avez quitté le groupe"; "You have missed a call." = "Vous avez un appel manqué."; "You have received a message." = "Vous avez un message non lu."; "You have received an encrypted message you are unable to decrypt from %@.\nYou need to call your correspondant in order to exchange your ZRTP keys if you want to decrypt the future messages you will receive." = "Vous avez reçu un message chiffré que vous n'arrivez à déchiffrer venant de %@.\nVous devez appeler votre correspondant pour échanger vos clés ZRTP, si vous voulez être capable de déchiffrer ses futurs messages."; "You missed a call from %@" = "Appel manqué de %@"; "You must authorize the application to have access to address book.\nToggle the application in Settings > Privacy > Contacts" = "Vous devez autoriser l'application à accéder à l'annuaire.\nActivez l'application dans Réglages > Confidentialité > Contacts."; "Select a contact or create a new one." = "Sélectionnez un contact ou créez-en un"; "You need to plug a microphone to your device to use the application." = "Vous devez brancher votre micro pour pouvoir utiliser l'application."; "Your account has expired." = "Votre compte a expiré."; "Your account is not a Linphone account.\nWe can not change your password." = "Votre compte n'est pas un compte Linphone.\nNous ne pouvons pas changer votre mot de passe."; "Your account will expire in %i days." = "Votre compte expire dans %i jours."; "Your activation code contains invalid characters." = "Votre code d'activation contient des caractères invalides."; "Your confirmation password doesn't match your password" = "Les mots de passe ne correspondent pas."; "Your country code is invalid." = "L'indicatif du pays est invalide."; "Your country code is too long." = "L'indicatif du pays est trop long."; "Your country code is too short." = "L'indicatif du pays est trop court."; "Your phone number is too short." = "Le numéro de téléphone est trop court."; "Your phone number is too long." = "Le numéro de téléphone est trop long."; "Your device is not configured to send emails. Please configure mail application prior to send logs." = "Votre appareil n'est pas configuré pour envoyer des emails. Veuillez configurer un compte email afin d'envoyer les traces."; "Your email contains invalid characters." = "Votre email contient des caractères invalides."; "Your email is invalid" = "Votre adresse email est invalide"; "Your email is malformed." = "Votre adresse email est invalide."; "Your friends will find your more easily if you link your account to your phone number. \n\nYou will see in your address book who is using Linphone and your friends will know that they can reach you on Linphone as well." = "Vos amis pourront vous joindre plus facilement si vous associez votre compte à votre numéro de téléphone.\n\nVous verrez dans votre carnet d'adresses les contacts qui utilisent Linphone et vos amis sauront qu'ils peuvent vous contacter."; "Your friends will find your more easily if you link your account to your phone number. \n\nYou will see in your address book who is using Linphone and your friends will know that they can reach you on Linphone as well. \n\nYou can use your phone number with only one Linphone account. If you had already linked your number to an other account but you prefer to use this one, simply link it now and your number will automatically be moved to this account." = "Vos amis pourront vous joindre plus facilement si vous associez votre compte à votre numéro de téléphone.\n\nVous verrez dans votre carnet d'adresses les contacts qui utilisent Linphone et vos amis sauront qu'ils peuvent vous contacter.\n\nVous ne pouvez associer votre numéro qu'à un seul compte Linphone. Si vous avez déjà associé votre numéro à un autre compte mais préférez utiliser ce compte-ci, suivez la procédure d'association et votre numéro sera automatiquement transféré à ce compte."; "Your password contains invalid characters." = "Votre mot de passe contient des caractères invalides."; "Your password has been successfully changed" = "Votre mot de passe a bien été changé."; "Your password is too long." = "Votre mot de passe est trop long."; "Your password is too short." = "Votre mot de passe est trop court."; "Your phone number is invalid." = "Votre numéro de téléphone est invalide."; "Your SIP address will be sip:%s@sip.linphone.org" = "Votre adresse SIP sera sip:%s@sip.linphone.org"; "Your username contains invalid characters." = "Votre nom d'utilisateur contient des caractères invalides."; "Your username is invalid." = "Votre nom d'utilisateur est invalide."; "Your username is too long." = "Votre nom d'utilisateur est trop long."; "Your username is too short." = "Votre nom d'utilisateur est trop court."; "ZRTP activation" = "Activation de ZRTP"; "ZRTP verification" = "Vérification ZRTP"; "I accept Belledonne Communications’ terms of use and privacy policy" = "J’accepte les conditions d’utilisation et la politique de confidentialité de Belledonne Communications"; "terms of use" = "conditions d’utilisation"; "privacy policy" = "politique de confidentialité"; /* Ephemeral */ "Messages will be deleted on both ends once they have been read and after the selected timeout."="Les messages seronts supprimés des deux cotés une fois lus et le temps choisi écoulé."; "Disabled"="Désactivé"; "1 minute"="1 minute"; "1 hour"="1 heure"; "1 day"="1 jour"; "3 days"="3 jours"; "1 week"="1 semaine"; "Ephemeral messages"="Messages éphémères"; "You disabled ephemeral messages"="Vous avez désactivé les messages éphémères"; "You enabled ephemeral messages: %@"="Vous avez activé les messages éphémères: %@"; "Ephemeral messages expiry date: %@"="Délai d'expiration des messages: %@"; /* Copy / transfer / reply */ "Answer"="Réponse"; "Transferred"="Transféré"; "Forward"="Transférer"; "Copy text"="Copier le texte"; "Transfer this message to this conversation ?"="Souhaitez-vous transférer ce message dans cette conversation ?"; "TRANSFER"="TRANSFÉRER"; "Select a discussion or create a new one"="Sélectionnez ou créez une conversation pour transférer le message"; \ No newline at end of file +" Your account is created. We have sent a confirmation email to %@. Please check your mails to validate your account. Once it is done, come back here and click on the button." = " Votre compte a été créé. Nous avons envoyé un email de confirmation à l'adresse : %@.\nPour valider votre compte, veuillez suivre les instructions reçues par email et cliquer sur le bouton."; "%@ are writing..." = "%@ écrivent..."; "%@ has joined" = "%@ a rejoint le groupe"; "%@ has left" = "%@ a quitté le groupe"; "%@ is busy." = "%@ est occupé"; "%@ is no longer an admin" = "%@ n'est plus admin"; "%@ is not connected." = "%@ est déconnecté"; "%@ is now an admin" = "%@ est devenu(e) admin"; "%@ is writing..." = "%@ écrit..."; "%@ would like to enable video" = "%@ souhaite activer la vidéo"; "%@\nReason was: %@" = "%1$@\nLa cause était: %2$@"; "(invalid string)" = "(message invalide)"; /* Email title for people wanting to send a bug report */ "" = ""; "\nConfirmation security\n\nSay: %@\nConfirm that your interlocutor\nsays: %@" = "\nSécurité des communications\n\nDites : %1$@\nConfirmez que votre interlocuteur a bien dit : %2$@"; "A new version of your app is available, use the button below to download it." = "Une mise à jour est disponible"; "About" = "A propos"; "ACCEPT" = "ACCEPTER"; "Accept" = "Accepter"; "Account configuration issue" = "Problème de configuration du compte"; "Account expiring" = "Le compte arrive à expiration"; "Add new email" = "Ajouter une adresse email"; "Add new phone number" = "Ajouter un numéro de téléphone"; "Add new SIP address" = "Ajouter un champ adresse SIP"; "Address book" = "Annuaire"; "Address incomplete" = "Adresse incomplète"; "Answer" = "Répondre"; "Application logs" = "Traces de l'application"; "Are you sure to want to remove your proxy setup?" = "Souhaitez-vous supprimer la configuration du compte ?"; "Assistant" = "Assistant"; "Assistant error" = "Erreur dans l'assistant"; "Authentification needed" = "Authentification requise"; "Average" = "Moyen"; "Bad credentials, check your account settings" = "Erreur d'authentification, vérifiez votre nom d'utilisateur et votre mot de passe"; "Bad gateway" = "Mauvaise passerelle"; "Battery is running low. Stop video ?" = "La batterie est faible. Voulez-vous stopper la vidéo?"; "Buy" = "Acheter"; "CALL" = "APPELER"; "Call" = "Appeler"; "Call %@" = "Appel %@"; "Call failed" = "Échec de l'appel"; "Call quality: %d" = "Qualité d'appel: %d"; "Calls" = "Appels"; "Camera" = "Appareil photo"; "Camera not authorized" = "Caméra non autorisée"; "Camera's permission" = "Permission d'utiliser la caméra"; "Can't find this file" = "Impossible de trouver ce fichier"; "Cancel" = "Annuler"; "CANCEL" = "ANNULER"; "Cannot call %@." = "Impossible d'appeler %@"; "Cannot make call" = "Appel impossible"; "Cannot purchase anything yet, please try again later." = "Impossible d'acheter quoi que ce soit, veuillez réessayer plus tard."; "Cannot reach the server: either it is an invalid address or it may be temporary down." = "Impossible de communiquer avec le serveur : vérifiez l'adresse ou rééssayez plus tard."; "Cannot retrieve your configuration. Please check credentials or try again later" = "Impossible de récupérer la configuration. Vérifiez vos paramètres ou réessayez plus tard."; "Cannot send email" = "Impossible d'envoyer l'email"; "Cannot send logs" = "Impossible d'envoyer les traces"; "Cannot write image to photo library" = "Impossible d'enregistrer l'image dans l'album photo"; "Cannot write video to photo library" = "Impossible d'enregistrer la vidéo dans la photothèque"; "Change your password" = "Changez de mot de passe"; "Changing your password" = "Changement de mot de passe"; "Chat room could not be created on server" = "La conversation n'a pas pu être créée sur le serveur"; "Chat room creation error" = "Erreur de création de conversation"; "Chat with %@" = "Conversation avec %@"; "Checkbox" = "Case à cocher"; "Choose an action" = "Choisir une action"; "Choose the image size" = "Choisissez la taille de l'image"; "Conference" = "Conférence"; "Configuration failed" = "Échec de la configuration"; "Configuring account" = "Configuration de compte"; "Confirm password" = "Confirmation du mot de passe"; "Confirm the following SAS with peer:\nSay : %@\nYour correspondant should say : %@" = "Veuillez confirmer le code SAS suivant avec votre correspondant :\n\nDites : %1$@\nVérifiez que votre interlocuteur dise : %2$@"; "Contact duplicate" = "Duplication du contact"; "Contact error" = "Erreur contact"; "Continue" = "Continuer"; "Continue video" = "Continuer la vidéo"; "Conversation creation error" = "La conversation n'a pas pu être créée"; "Could not configure your account, please check parameters or try again later" = "Impossible de configurer le compte, vérifiez les paramètres ou réessayez plus tard."; "Debug" = "Déboggage"; "Decline" = "Refuser"; "Delete" = "Supprimer"; "Delivered" = "Reçu"; "Deny" = "Refuser"; "DENY" = "REFUSER"; "Deselect all" = "Tout déselectionner"; "Deselected" = "Désélectionné"; /* ICE has established a direct connection to the remote host */ "Direct connection" = "Connexion directe"; "Disable logs" = "Désactiver les traces"; "Do you want to delete selected contact?\nIt will also be deleted from your phone's address book." = "Souhaitez-vous supprimer le contact sélectionné?\nIl sera également supprimé du carnet d'adresses de votre téléphone."; "Do you want to delete selected contacts?\nThey will also be deleted from your phone's address book." = "Souhaitez-vous supprimer les contacts sélectionnés?\nIls seront également supprimés du carnet d'adresses de votre téléphone."; "Do you want to delete selected logs?" = "Souhaitez-vous supprimer les appels sélectionnés de l'historique ?"; "Do you want to delete selected recordings?" = "Souhaitez-vous supprimer les enregistrements sélectionnés ?"; "Do you want to delete the selected conversations?" = "Souhaitez-vous supprimer les discussions sélectionnées ?"; "Do you want to delete the selected messages?" = "Souhaitez-vous supprimer les messages sélectionnées?"; "Do you want to delete this conversation?" = "Souhaitez-vous supprimer cette discussion ?"; "Do you want to leave and delete the selected conversations?" = "Souhaitez-vous quitter et supprimer les conversations sélectionnées ?"; "Do you want to leave and delete this conversation?" = "Souhaitez-vous quitter et supprimer cette discussion ?"; "Do you want to leave this conversation?" = "Souhaitez-vous quitter cette conversation?"; "Done" = "Terminé"; "Download" = "Télécharger"; /* Date formatting in History Details (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "EEE dd MMM 'at' HH'h'mm" = "EEE dd MMM 'à' HH'h'mm"; /* Date formatting in History List, for current year (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "EEE dd MMMM" = "EEE dd MMMM"; /* Date formatting in History List, for previous years (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "EEE dd MMMM yyyy" = "EEE dd MMMM yyyy"; "Either configure a SIP proxy server from settings prior to place a call or use a valid SIP address (I.E sip:john@example.net)" = "Veuillez configurer un serveur proxy SIP dans les options ou entrer une adresse SIP avant de faire un appel (I.E sip:john@example.net)"; "Either configure a SIP proxy server from settings prior to send a message or use a valid SIP address (I.E sip:john@example.net)" = "Veuillez configurer un serveur proxy SIP dans les options ou entrer une adresse SIP avant d'envoyer un message (I.E sip:john@example.net)"; "Email addresses" = "Adresses email"; "Enable logs" = "Activer les traces"; "Error" = "Erreur"; "Error while changing your password" = "Erreur lors du changement de mot de passe"; "Error while downloading the file.\nThe file is probably encrypted.\nPlease retry to download this file after activating LIME." = "Une erreur est survenue pendant le téléchargement.\nLe fichier est probablement chiffré.\nVeuillez activer LIME avant de réessayer de télécharger le fichier."; "Error: no mail account configured" = "Erreur : aucun compte email configuré"; /* ICE processing has failed */ "Failed" = "Échec"; "Failed configuring from the specified URL." = "Format d'URL inconnu. Le fichier de configuration n'a pas pu être téléchargé."; "Failure" = "Échec"; "Fetching remote configuration" = "Téléchargement de la configuration distante"; "Fetching remote configuration..." = "Téléchargement de la configuration distante..."; "File download error" = "Impossible de télécharger le fichier"; "First name" = "Prénom"; "GC_MSG" = "Vous avez été ajouté à une conversation"; "Go to settings" = "Accéder aux paramètres"; "Group conversation is not supported." = "La conversation de groupe n'est pas supportée"; "Hello! Join me on Linphone! You can download it for free at: https://www.linphone.org/download" = "Bonjour! Rejoignez-moi sur Linphone. Vous pouvez télécharger l'app gratuitement sur : https://www.linphone.org/download"; /* Template email for people wanting to send a bug report */ "Here are information about an issue I had on my device.\nI was doing ...\nI expected Linphone to ...\nInstead, I got an unexpected result: ..." = "J'ai rencontré un comportement inattendu sur Linphone.\nJ'étais en train de \nJe pensais que Linphone allait \nÀ la place, "; /* Date formatting in Chat List and Conversation bubbles, for current day (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "HH:mm" = "HH:mm"; "I got it, continue" = "Continuer quand même"; "IC_MSG" = ""; "ICloud Drive is unavailable." = "ICloud Drive n'est pas disponible"; "IM_FULLMSG" = ""; "IM_MSG" = "Vous avez reçu un message"; "In apps not ready yet" = "Achats non disponibles actuellement"; /* ICE process is in progress */ "In progress" = "En cours"; "Incoming call" = "Appel entrant"; "Info" = "Infos"; "Instant messages are end-to-end encrypted in secured conversations. It is possible to upgrade the security level of a conversation by authenticating participants. To do so, call the contact and follow the authentification process." = "Dans les conversations sécurisées, les messages sont chiffrés de bout en bout. Il est possible d'augmenter le niveau de sécurité en vérifiant l'identité des participants. Pour ce faire, appelez le contact et suivez la procédure d'authentification."; "Invalid proxy address" = "Adresse de proxy invalide"; "Invalid remote provisioning URL" = "URL de configuration invalide"; "Invalid route" = "Route invalide"; "Invalid SIP address" = "Adresse SIP invalide"; "Invalid username or domain" = "Nom d'utilisateur ou domaine invalide"; "Invalid." = "Invalide"; "Last name" = "Nom de famille"; "Later" = "Plus tard"; "LEAVE" = "QUITTER"; "Let's go" = "Allons-y"; "LIME identity key changed" = "Les clés de sécurité ont changé"; "LIME identity key changed for %@" = "Les clés de sécurité ont changé pour %@"; "LIME requires ZRTP encryption.\nBy activating LIME you automatically activate ZRTP media encryption." = "LIME nécessite l'encryption ZRTP.\nEn activant LIME vous activez automatiquement l'encryption ZRTP."; "LIME warning" = "Avertissement LIME"; "Link my account" = "Lier mon compte"; "Link your account" = "Lier votre compte"; "Link your Linphone.org account %s to your phone number." = "Lier votre compte Linphone.org %s avec votre numéro de téléphone."; "Low bandwidth" = "Bande passante faible"; /* InAppSettingKit */ "Mail not configured" = "Aucun compte email configuré"; "Man-in-the-middle attack detected" = "Attaque de l'homme du milieu détectée"; "Man-in-the-middle attack detected for %@" = "Attaque de l'homme du milieu détectée pour %@"; "Mark as seen" = "Marquer comme lu"; "Mark Read" = "Marqué comme lu"; "Max participant count exceeded" = "Nombre maximum de terminaux dépassé"; "Max participant count exceeded by %@" = "Nombre maximum de terminaux dépassé pour %@"; "Maximum" = "Maximum"; "Maybe later" = "Peut-être plus tard"; "Message received" = "Message reçu"; "Minimum" = "Minimum"; "Missed call" = "Appel manqué"; "Missing required callbacks" = "Callbacks requises manquantes"; "Missing required parameters" = "Paramètres requis manquants"; /* Date formatting in Chat List, for all but current day (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "MM/dd" = "dd/MM"; /* Date formatting in Conversation bubbles, for all but current day (also see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting) */ "MM/dd - HH:mm" = "dd/MM - HH:mm"; /* ICE has established a connection to the remote host through one or several NATs */ "NAT(s) connection" = "Connexion par NAT"; "Network down" = "Aucun réseau"; "Network Error" = "Erreur réseau"; "New subject : %@" = "Nouveau sujet : %@"; "No" = "Non"; "No account" = "Aucun compte"; "No account configured" = "Aucun compte configuré"; "No address" = "Aucune adresse"; "No call in progress" = "Aucun appel en cours"; "No default account" = "Aucun compte par défaut"; "No microphone" = "Aucun microphone"; "No response received from remote" = "Aucune réponse reçue"; "None" = "Aucun"; /* ICE has not been activated for this call */ "Not activated" = "Désactivé"; "Not implemented" = "Non disponible"; "Not connected" = "Non connecté"; "Nothing could be collected from your application, aborting now." = "Impossible de collecter les traces depuis l'application, abandon."; /* InAppSettingsKit */ "OK" = "OK"; "Operation could not be executed by server or remote client because it didn't have any context for it" = "Impossible d'éxécuter la requête sur le serveur distant."; "Operation is unauthorized because missing credential" = "Opération non permise"; "Outdated Version" = "Version obsolète"; "Password" = "Mot de passe"; "Passwords do not match." = "Les mots de passe ne correspondent pas"; "Phone numbers" = "Numéros de téléphone"; "Photo library" = "Album photos"; "Photo not authorized" = "Photo non autorisée"; "Photo's permission" = "Permission photo"; "Please confirm your country code and enter your phone number" = "Confirmez l'indicatif téléphonique de votre pays et saisissez votre numéro de téléphone."; "Please confirm your country code and enter your phone number." = "Confirmez l'indicatif téléphonique de votre pays et saisissez votre numéro de téléphone."; "Please enter a password to your account" = "Veuillez entrer un mot de passe pour votre compte"; "Please enter a username" = "Veuillez entrer un nom d'utilisateur"; "Please enter and confirm your new password" = "Veuillez entrer et confirmer votre nouveau mot de passe"; "Please enter your email" = "Veuillez entrer votre adresse email"; "Please enter your phone number" = "Veuillez entrer votre numéro de téléphone"; "Please enter your username" = "Entrez votre nom d'utilisateur"; "Please enter your username and password" = "Veuillez entrer votre nom d'utilisateur et votre mot de passe"; "Please make sure your device is connected to the internet and double check your SIP account configuration in the settings." = "Veuillez vous connecter à internet et revérifier la configuration de votre compte dans les options."; "Please terminate GSM call first." = "Merci de terminer l'appel GSM, puis réessayez."; "Provisioning Load error" = "Erreur du chargement de la configuration distante"; "Read" = "Lu"; "Recordings" = "Enregistrements"; "Connected" = "Connecté"; "Connection failed" = "La connexion a échoué"; "Connection failed because authentication is missing or invalid for %@@%@.\nYou can provide password again, or check your account configuration in the settings." = "La connexion a échoué car l'authentification est manquante ou non valide pour %1$@@%2$@.\nVous pouvez saisir à nouveau le mot de passe, ou vérifier la configuration de votre compte dans les paramètres."; "Connection failure" = "Échec de connexion"; "Connection in progress" = "Connexion en cours"; "Help us translate Linphone" = "Contribuer aux traductions"; "Some features require a Linphone account, such as group messaging or ephemeral messaging.\n\nThese features are hidden when you register with a third party SIP account.\n\nTo enable it in a commercial project, please contact us." = "Certaines fonctionnalités avancées comme les messages de groupe ou les messages éphémères nécessitent un compte Linphone.\n\nElles seront masquées dans l'application si vous configurez un compte SIP tiers.\n\nSi vous souhaitez les activer pour un projet professionnel, contactez-nous. "; "I understand" = "J'ai compris"; /* ICE has established a connection through a relay */ "Relay connection" = "Connexion relayée"; "Remote configuration" = "Configuration distante"; "Remote configuration successfully fetched and applied." = "Configuration distante correctement téléchargé et appliquée."; "Remove account(s) and self destruct" = "Supprimer le(s) compte(s) et quitter"; "Reply" = "Répondre"; "Resend" = "Renvoyer"; "Resource moved permanently" = "Ressource indisponible"; "Resource no longer exists" = "Ressource inexistante"; "Save" = "Enregistrer"; "Security level decreased" = "Baisse du niveau de sécurité"; "Security level decreased because of %@" = "Baisse du niveau de sécurité due à %@"; "Select all" = "Tout sélectionner"; "Select the source" = "Sélectionner la source"; "Select your country" = "Sélectionnez votre pays"; "Selected" = "Sélectionné"; "Send logs" = "Envoyer les traces"; "Sending logs" = "Envoyer les traces"; "Sent" = "Envoyé"; "Server error, please try again later." = "Serveur indisponible. Veuillez réessayer plus tard"; "Server request error" = "Erreur lors de la requête au serveur"; "Server timeout" = "Expiration serveur"; "Settings" = "Options"; "Shop" = "Achats"; "Show" = "Afficher"; "SIP addresses" = "Adresses SIP"; "Stop video" = "Arrêter la video"; "Success" = "Succès"; "Temporarily unavailable" = "Temporairement inaccessible"; "The confirmation code is invalid. \nPlease check your SMS and try again." = "Le code d'activation est invalide.\nVeuillez vérifier vos SMS et réessayer."; "The confirmation code is invalid. \nPlease try again." = "Le code d'activation est invalide.\nVeuillez réessayer."; "There is no network connection available, enable WIFI or WWAN prior to configure an account" = "Il n'y a aucune connexion réseau disponible, activer le WIFI ou le WWAN avant de configurer un compte."; "There is no network connection available, enable WIFI or WWAN prior to configure an account." = "Il n'y a aucune connexion réseau disponible, activer le WIFI ou le WWAN avant de configurer un compte."; "There is no network connection available, enable WIFI or WWAN prior to place a call" = "Il n'y a aucune connexion réseau disponible, activer le WIFI ou le WWAN avant de faire un appel."; "There is no network connection available, enable WIFI or WWAN prior to send a message" = "Il n'y a aucune connexion réseau disponible, activer le WIFI ou le WWAN avant d'envoyer un message."; "This account does not exist." = "Ce compte n'existe pas."; "This account is already activated." = "Ce compte est déjà activé."; "This account is already in use." = "Ce compte est déjà utilisé."; "This account is already connected." = "Ce compte est déjà connecté."; "This account is not activated yet." = "Ce compte n'est pas encore activé."; "This alias does not exist." = "Cet alias n'existe pas."; /* InAppSettingsKit */ "This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Votre appareil n'est pas configuré pour envoyer des emails. Veuillez le configurer avant d'envoyer les logs."; "This email address is already used." = "Cette adresse email est déjà utilisée."; "This email does not exist." = "Cette adresse email n'existe pas."; "This message is not encrypted." = "Ce message n'est pas chiffré."; "This operation will load a remote configuration. Continue ?" = "Cette opération va télécharger une configuration distante. Continuer ?"; "This phone number is already used. Please type a different number. \nYou can delete your existing account if you want to reuse your phone number." = "Ce numéro de téléphone est déjà utilisé. Veuillez saisir un autre numéro.\nVous pouvez supprimer le compte existant si vous voulez réutiliser votre numéro de téléphone."; "TODAY" = "AUJOURD'HUI"; "Transfer error" = "Erreur de transfert"; "Trust has been denied. Make a call to start the authentication process again." = "La confiance a été retirée. Appelez ce contact pour relancer la procédure d'authentification."; "Unknown" = "Inconnu"; "Unknown country code" = "Code pays inconnu"; "Unknown error" = "Erreur inconnue"; "Unknown error (%@)." = "Erreur inconnue (%@)"; "Unknown error, please try again later." = "Erreur inconnue, veuillez réessayer plus tard"; "Unsupported content" = "Contenu non supporté"; "Video cannot be activated because of low bandwidth condition, only audio is available" = "L'appel vidéo ne peut pas aboutir car les conditions réseaux sont insuffisantes."; "Video request" = "Requête vidéo"; "Voice mail" = "Messagerie vocale"; "Warning" = "Attention"; "Warning: an email will be created with 3 attachments:\n- Application logs\n- Linphone configuration\n- Chats history.\nThey may contain private informations (MIGHT contain clear-text password!).\nYou can remove one or several of these attachments before sending your email, however there are all important to diagnostize your issue." = "Attention: un email va être créé avec 3 pièces jointes :\n- Les traces de l'application\n- La configuration Linphone\n- L'historique des conversations\nCes pièces jointes peuvent contenir des informations privées (dont des mots de passe en clair).\nVous pouvez filtrer les fichiers à envoyer, mais notez qu'ils sont tous importants pour comprendre votre problème."; "Warning: an email will be created with application logs. It may contain private informations (but no password!).\nThese logs are important to diagnostize your issue." = "Attention : un email va être créé avec les traces de l'application. Ceux-ci peuvent contenir des informations privées (mais pas de mots de passe).\nCes informations sont importantes pour comprendre votre problème."; "We have sent a SMS with a validation code to %@. To complete your phone number verification, please enter the 4 digit code below:" = "Nous avons envoyé un SMS avec un code d'activation au numéro : %@.\nPour valider votre numéro, veuillez entrer le code à 4 chiffres ci-dessous :"; "What will my phone number be used for?" = "Comment mon numéro de téléphone sera-t-il utilisé ?"; "Yes" = "Oui"; "YESTERDAY" = "HIER"; "You already own an account." = "Vous possédez déjà un compte"; "You are no longer an admin of the chat room" = "Vous n'êtes plus un administrateur du groupe"; "You are now an admin of the chat room" = "Vous êtes à présent un administrateur du groupe"; "You are trying to send a message using LIME to a contact not verified by ZRTP.\nPlease call this contact and verify his ZRTP key before sending your messages." = "Vous essayez d'envoyer un message chiffré à un contact non vérifié via ZRTP.\nVeuillez appeler ce contact et vérifier sa clé ZRTP avant d'envoyer vos messages."; "You cancelled your account." = "Vous avez résilié votre compte."; "You have already purchased an account but it does not exist anymore." = "Vous avez déjà acheté un compte mais il a été supprimé."; "You have been added to a chat room" = "Vous avez été ajouté à une conversation"; "You have joined the group" = "Vous avez rejoint le groupe"; "You have left the group" = "Vous avez quitté le groupe"; "You have missed a call." = "Vous avez un appel manqué."; "You have received a message." = "Vous avez un message non lu."; "You have received an encrypted message you are unable to decrypt from %@.\nYou need to call your correspondant in order to exchange your ZRTP keys if you want to decrypt the future messages you will receive." = "Vous avez reçu un message chiffré que vous n'arrivez à déchiffrer venant de %@.\nVous devez appeler votre correspondant pour échanger vos clés ZRTP, si vous voulez être capable de déchiffrer ses futurs messages."; "You missed a call from %@" = "Appel manqué de %@"; "You must authorize the application to have access to address book.\nToggle the application in Settings > Privacy > Contacts" = "Vous devez autoriser l'application à accéder à l'annuaire.\nActivez l'application dans Réglages > Confidentialité > Contacts."; "Select a contact or create a new one." = "Sélectionnez un contact ou créez-en un"; "You need to plug a microphone to your device to use the application." = "Vous devez brancher votre micro pour pouvoir utiliser l'application."; "Your account has expired." = "Votre compte a expiré."; "Your account is not a Linphone account.\nWe can not change your password." = "Votre compte n'est pas un compte Linphone.\nNous ne pouvons pas changer votre mot de passe."; "Your account will expire in %i days." = "Votre compte expire dans %i jours."; "Your activation code contains invalid characters." = "Votre code d'activation contient des caractères invalides."; "Your confirmation password doesn't match your password" = "Les mots de passe ne correspondent pas."; "Your country code is invalid." = "L'indicatif du pays est invalide."; "Your country code is too long." = "L'indicatif du pays est trop long."; "Your country code is too short." = "L'indicatif du pays est trop court."; "Your phone number is too short." = "Le numéro de téléphone est trop court."; "Your phone number is too long." = "Le numéro de téléphone est trop long."; "Your device is not configured to send emails. Please configure mail application prior to send logs." = "Votre appareil n'est pas configuré pour envoyer des emails. Veuillez configurer un compte email afin d'envoyer les traces."; "Your email contains invalid characters." = "Votre email contient des caractères invalides."; "Your email is invalid" = "Votre adresse email est invalide"; "Your email is malformed." = "Votre adresse email est invalide."; "Your friends will find your more easily if you link your account to your phone number. \n\nYou will see in your address book who is using Linphone and your friends will know that they can reach you on Linphone as well." = "Vos amis pourront vous joindre plus facilement si vous associez votre compte à votre numéro de téléphone.\n\nVous verrez dans votre carnet d'adresses les contacts qui utilisent Linphone et vos amis sauront qu'ils peuvent vous contacter."; "Your friends will find your more easily if you link your account to your phone number. \n\nYou will see in your address book who is using Linphone and your friends will know that they can reach you on Linphone as well. \n\nYou can use your phone number with only one Linphone account. If you had already linked your number to an other account but you prefer to use this one, simply link it now and your number will automatically be moved to this account." = "Vos amis pourront vous joindre plus facilement si vous associez votre compte à votre numéro de téléphone.\n\nVous verrez dans votre carnet d'adresses les contacts qui utilisent Linphone et vos amis sauront qu'ils peuvent vous contacter.\n\nVous ne pouvez associer votre numéro qu'à un seul compte Linphone. Si vous avez déjà associé votre numéro à un autre compte mais préférez utiliser ce compte-ci, suivez la procédure d'association et votre numéro sera automatiquement transféré à ce compte."; "Your password contains invalid characters." = "Votre mot de passe contient des caractères invalides."; "Your password has been successfully changed" = "Votre mot de passe a bien été changé."; "Your password is too long." = "Votre mot de passe est trop long."; "Your password is too short." = "Votre mot de passe est trop court."; "Your phone number is invalid." = "Votre numéro de téléphone est invalide."; "Your SIP address will be sip:%s@sip.linphone.org" = "Votre adresse SIP sera sip:%s@sip.linphone.org"; "Your username contains invalid characters." = "Votre nom d'utilisateur contient des caractères invalides."; "Your username is invalid." = "Votre nom d'utilisateur est invalide."; "Your username is too long." = "Votre nom d'utilisateur est trop long."; "Your username is too short." = "Votre nom d'utilisateur est trop court."; "ZRTP activation" = "Activation de ZRTP"; "ZRTP verification" = "Vérification ZRTP"; "I accept Belledonne Communications’ terms of use and privacy policy" = "J’accepte les conditions d’utilisation et la politique de confidentialité de Belledonne Communications"; "terms of use" = "conditions d’utilisation"; "privacy policy" = "politique de confidentialité"; /* Ephemeral */ "Messages will be deleted on both ends once they have been read and after the selected timeout."="Les messages seronts supprimés des deux cotés une fois lus et le temps choisi écoulé."; "Disabled"="Désactivé"; "1 minute"="1 minute"; "1 hour"="1 heure"; "1 day"="1 jour"; "3 days"="3 jours"; "1 week"="1 semaine"; "Ephemeral messages"="Messages éphémères"; "You disabled ephemeral messages"="Vous avez désactivé les messages éphémères"; "You enabled ephemeral messages: %@"="Vous avez activé les messages éphémères: %@"; "Ephemeral messages expiry date: %@"="Délai d'expiration des messages: %@"; /* Copy / transfer / reply */ "Answer"="Réponse"; "Transferred"="Transféré"; "Forward"="Transférer"; "Copy text"="Copier le texte"; "Transfer this message to this conversation ?"="Souhaitez-vous transférer ce message dans cette conversation ?"; "TRANSFER"="TRANSFÉRER"; "Select a discussion or create a new one"="Sélectionnez ou créez une conversation pour transférer le message"; \ No newline at end of file diff --git a/Resources/images/scroll_to_bottom_default.png b/Resources/images/scroll_to_bottom_default.png new file mode 100644 index 000000000..3be410ae1 Binary files /dev/null and b/Resources/images/scroll_to_bottom_default.png differ diff --git a/Settings/InAppSettings.bundle/Chat.plist b/Settings/InAppSettings.bundle/Chat.plist index a8727c126..d5e3c9395 100644 --- a/Settings/InAppSettings.bundle/Chat.plist +++ b/Settings/InAppSettings.bundle/Chat.plist @@ -60,16 +60,6 @@ IASKTextAlignment IASKUITextAlignmentRight - - DefaultValue - - Key - ephemeral_feature - Title - Enable ephemeral messages (beta) - Type - PSToggleSwitchSpecifier - Type PSGroupSpecifier diff --git a/linphone-Info.plist b/linphone-Info.plist index 8bd93f866..ecba6e556 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -102,6 +102,8 @@ Share photos with your friends and customize avatars NSContactsUsageDescription Make calls with your friends + NSLocalNetworkUsageDescription + Stream audio and video through the local network NSLocationWhenInUseUsageDescription Linphone will not use, store or communicate your location. The authorization allows us to detect Wifi connection changes NSMicrophoneUsageDescription @@ -110,8 +112,6 @@ Add tranfered files to your library NSPhotoLibraryUsageDescription Share photos with your friends and customize avatars - NSLocalNetworkUsageDescription - Stream audio and video through the local network NSUbiquitousContainers iCloud.org.linphone.phone diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index fbe3126e2..e19b7645c 100644 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -52,11 +52,11 @@ 24BFAAA9209B0630004F47A7 /* linphone_logo@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA9D209B0630004F47A7 /* linphone_logo@2x.png */; }; 24E1C7C01F9A235600D3F981 /* Contacts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24E1C7B91F9A235500D3F981 /* Contacts.framework */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 308C3FD5D6C427D5592A2CD6 /* Pods_msgNotificationContent.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2AB0AB106BE1526DC105F515 /* Pods_msgNotificationContent.framework */; }; 340751971506459A00B89C47 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340751961506459A00B89C47 /* CoreTelephony.framework */; }; 340751E7150F38FD00B89C47 /* UIVideoButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 340751E6150F38FD00B89C47 /* UIVideoButton.m */; }; 34216F401547EBCD00EA9777 /* VideoZoomHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 34216F3F1547EBCD00EA9777 /* VideoZoomHandler.m */; }; 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDEF14850AE9007420B6 /* libc++.1.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; - 369CCF81C921CD7C4E49A637 /* Pods_msgNotificationContent.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82E9DEDA2A78C6DBBD1A54DB /* Pods_msgNotificationContent.framework */; }; 570742581D5A0691004B9C84 /* ShopView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 570742561D5A0691004B9C84 /* ShopView.xib */; }; 570742611D5A09B8004B9C84 /* ShopView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5707425F1D5A09B8004B9C84 /* ShopView.m */; }; 570742671D5A63DB004B9C84 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 570742661D5A63DB004B9C84 /* StoreKit.framework */; }; @@ -109,7 +109,6 @@ 61AE364F20C00B370089D9D3 /* ShareViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61AE364E20C00B370089D9D3 /* ShareViewController.m */; }; 61AE365220C00B370089D9D3 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 61AE365020C00B370089D9D3 /* MainInterface.storyboard */; }; 61AE365620C00B370089D9D3 /* linphoneExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 61AE364B20C00B370089D9D3 /* linphoneExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 61AEBEA321906AFC00F35E7F /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; 61AEBEBD2191990A00F35E7F /* DevicesListView.m in Sources */ = {isa = PBXBuildFile; fileRef = 61AEBEBC2191990A00F35E7F /* DevicesListView.m */; }; 61AEBEBF2191991F00F35E7F /* DevicesListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61AEBEBE2191991F00F35E7F /* DevicesListView.xib */; }; 61AEBEC62191E47500F35E7F /* chevron_list_close.png in Resources */ = {isa = PBXBuildFile; fileRef = 61AEBEC52191E47500F35E7F /* chevron_list_close.png */; }; @@ -629,6 +628,9 @@ 63F1DF4F1BCE985F00EDED90 /* UICallConferenceCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 63F1DF4D1BCE985F00EDED90 /* UICallConferenceCell.m */; }; 63F1DF511BCE986A00EDED90 /* UICallConferenceCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63F1DF531BCE986A00EDED90 /* UICallConferenceCell.xib */; }; 63FB30351A680E73008CA393 /* UIRoundedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63FB30341A680E73008CA393 /* UIRoundedImageView.m */; }; + 669B140827A1821F0012220A /* scroll_to_bottom_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 669B140727A1821F0012220A /* scroll_to_bottom_default.png */; }; + 669B140C27A29D140012220A /* FloatingScrollDownButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669B140B27A29D140012220A /* FloatingScrollDownButton.swift */; }; + 6F3A2542B1FC7C128439D37C /* Pods_linphone.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CFCC14A580A05DEC78090273 /* Pods_linphone.framework */; }; 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; 8C1B67061E671826001EA2FE /* AudioHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C1B67051E671826001EA2FE /* AudioHelper.m */; }; @@ -670,8 +672,7 @@ 8CF25D961F9F336100BEA0C1 /* check_unselected.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CF25D941F9F336100BEA0C1 /* check_unselected.png */; }; 8CF25D9D1F9F76BD00BEA0C1 /* chat_group_informations.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CF25D9B1F9F76BC00BEA0C1 /* chat_group_informations.png */; }; 8CF25D9E1F9F76BD00BEA0C1 /* chat_group_informations@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CF25D9C1F9F76BD00BEA0C1 /* chat_group_informations@2x.png */; }; - 93566413F75DA69D2811A716 /* Pods_msgNotificationService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F30EA7BEA39DA427CE0754E /* Pods_msgNotificationService.framework */; }; - A634ABAFCB39B6AAE4CA991D /* Pods_linphone.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65CEDD144CABFAA70A29AF27 /* Pods_linphone.framework */; }; + BFFD2C75873EEA1EC84E109F /* Pods_msgNotificationService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC98FB0E59C552BC311C0FCA /* Pods_msgNotificationService.framework */; }; C61B1BF22667D075001A4E4A /* menu_security_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C61B1BF12667D075001A4E4A /* menu_security_default.png */; }; C61B1BF42667D202001A4E4A /* more_menu_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C61B1BF32667D202001A4E4A /* more_menu_default.png */; }; C61B1BF72667EC6B001A4E4A /* ephemeral_messages_color_A.png in Resources */ = {isa = PBXBuildFile; fileRef = C61B1BF62667EC6B001A4E4A /* ephemeral_messages_color_A.png */; }; @@ -859,14 +860,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 046DEFE77AD0675DA9932C4C /* Pods-liblinphoneTesterTests.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-liblinphoneTesterTests.distributionadhoc.xcconfig"; path = "Pods/Target Support Files/Pods-liblinphoneTesterTests/Pods-liblinphoneTesterTests.distributionadhoc.xcconfig"; sourceTree = ""; }; - 13B1BD646346F33BF57412F2 /* Pods-messagesNotification.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-messagesNotification.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-messagesNotification/Pods-messagesNotification.distribution.xcconfig"; sourceTree = ""; }; + 143A43530EF0763A9BDFB209 /* Pods-linphone.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.release.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.release.xcconfig"; sourceTree = ""; }; 152F22351B15E889008C0621 /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1D3623240D0F684500981E51 /* LinphoneAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinphoneAppDelegate.h; sourceTree = ""; }; 1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LinphoneAppDelegate.m; sourceTree = ""; }; 1D6058910D05DD3D006BFB54 /* linphone.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = linphone.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1DCB2605D60FA4FAD003AC5A /* Pods-linphone.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.distributionadhoc.xcconfig"; sourceTree = ""; }; 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 1FB08967C4E9D7B85F6A595B /* Pods-msgNotificationContent.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.distribution.xcconfig"; path = "Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.distribution.xcconfig"; sourceTree = ""; }; 2214EB7812F846B1002A5394 /* UICallButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICallButton.h; sourceTree = ""; }; 2214EB7912F846B1002A5394 /* UICallButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICallButton.m; sourceTree = ""; }; 2214EB8712F84EBB002A5394 /* UIHangUpButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIHangUpButton.h; sourceTree = ""; }; @@ -905,8 +907,6 @@ 244523AD1E8266CC0037A187 /* chat_error.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_error.png; sourceTree = ""; }; 244523AE1E8266CC0037A187 /* chat_read.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_read.png; sourceTree = ""; }; 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_unsecure.png; sourceTree = ""; }; - 24585CBE78DA4F005C7F9D71 /* Pods-liblinphoneTester.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-liblinphoneTester.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-liblinphoneTester/Pods-liblinphoneTester.distribution.xcconfig"; sourceTree = ""; }; - 248C326F4AD75E654C1CB37A /* Pods-liblinphoneTesterTests.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-liblinphoneTesterTests.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-liblinphoneTesterTests/Pods-liblinphoneTesterTests.distribution.xcconfig"; sourceTree = ""; }; 249660941FD6A359001D55AA /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; }; 24A3459D1D95797700881A5C /* UIShopTableCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UIShopTableCell.xib; sourceTree = ""; }; 24A345A51D95798A00881A5C /* UIShopTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIShopTableCell.m; sourceTree = ""; }; @@ -926,8 +926,10 @@ 24E1C7B91F9A235500D3F981 /* Contacts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Contacts.framework; path = System/Library/Frameworks/Contacts.framework; sourceTree = SDKROOT; }; 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 2AB0AB106BE1526DC105F515 /* Pods_msgNotificationContent.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_msgNotificationContent.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BC23AC79581C3846BBAE2F6 /* Pods-msgNotificationService.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.release.xcconfig"; path = "Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.release.xcconfig"; sourceTree = ""; }; + 2C8BC293C1C17F27AB5A93B1 /* Pods-msgNotificationContent.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.distributionadhoc.xcconfig"; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; - 34027665305514025971F85C /* Pods-msgNotificationContent.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.release.xcconfig"; path = "Pods/Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.release.xcconfig"; sourceTree = ""; }; 340751961506459A00B89C47 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; 340751E5150F38FC00B89C47 /* UIVideoButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIVideoButton.h; sourceTree = ""; }; 340751E6150F38FD00B89C47 /* UIVideoButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIVideoButton.m; sourceTree = ""; }; @@ -935,8 +937,7 @@ 34216F3F1547EBCD00EA9777 /* VideoZoomHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VideoZoomHandler.m; path = LinphoneUI/VideoZoomHandler.m; sourceTree = ""; }; 344ABDEF14850AE9007420B6 /* libc++.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.1.dylib"; path = "usr/lib/libc++.1.dylib"; sourceTree = SDKROOT; }; 344ABDF014850AE9007420B6 /* libstdc++.6.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.6.dylib"; path = "usr/lib/libstdc++.6.dylib"; sourceTree = SDKROOT; }; - 38A3AE51B9E09ABF29222E5F /* Pods-liblinphoneTester.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-liblinphoneTester.release.xcconfig"; path = "Pods/Target Support Files/Pods-liblinphoneTester/Pods-liblinphoneTester.release.xcconfig"; sourceTree = ""; }; - 38DF35D11A7C0F45E990C83A /* Pods-linphone.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-linphone/Pods-linphone.distribution.xcconfig"; sourceTree = ""; }; + 4DF6C8E3533E18B9BDDF7F15 /* Pods-msgNotificationService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.debug.xcconfig"; path = "Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.debug.xcconfig"; sourceTree = ""; }; 570742571D5A0691004B9C84 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ShopView.xib; sourceTree = ""; }; 5707425F1D5A09B8004B9C84 /* ShopView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShopView.m; sourceTree = ""; }; 570742601D5A09B8004B9C84 /* ShopView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShopView.h; sourceTree = ""; }; @@ -1618,20 +1619,11 @@ 63F1DF521BCE986A00EDED90 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UICallConferenceCell.xib; sourceTree = ""; }; 63FB30331A680E73008CA393 /* UIRoundedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIRoundedImageView.h; sourceTree = ""; }; 63FB30341A680E73008CA393 /* UIRoundedImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIRoundedImageView.m; sourceTree = ""; }; - 65CEDD144CABFAA70A29AF27 /* Pods_linphone.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_linphone.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 68D9EC27FCECD5DE2E19CD3C /* Pods-liblinphoneTester.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-liblinphoneTester.debug.xcconfig"; path = "Pods/Target Support Files/Pods-liblinphoneTester/Pods-liblinphoneTester.debug.xcconfig"; sourceTree = ""; }; - 6E1BC45342F5201DABD7FE55 /* Pods_latestCallsWidget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_latestCallsWidget.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 6F30EA7BEA39DA427CE0754E /* Pods_msgNotificationService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_msgNotificationService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 669B140727A1821F0012220A /* scroll_to_bottom_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = scroll_to_bottom_default.png; sourceTree = ""; }; + 669B140B27A29D140012220A /* FloatingScrollDownButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatingScrollDownButton.swift; sourceTree = ""; }; 70E542F213E147E3002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 70E542F413E147EB002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 7513CBF7F2BA0A9F99977C2B /* Pods_richNotifications.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_richNotifications.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 791017662FE117B9B12E8938 /* Pods-messagesNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-messagesNotification.debug.xcconfig"; path = "Pods/Target Support Files/Pods-messagesNotification/Pods-messagesNotification.debug.xcconfig"; sourceTree = ""; }; - 799BA1104845EB01ACE764D8 /* Pods-linphone.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.debug.xcconfig"; path = "Pods/Target Support Files/Pods-linphone/Pods-linphone.debug.xcconfig"; sourceTree = ""; }; - 7D8CCFE176C634813E3A2593 /* Pods-liblinphoneTesterTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-liblinphoneTesterTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-liblinphoneTesterTests/Pods-liblinphoneTesterTests.debug.xcconfig"; sourceTree = ""; }; - 82E9DEDA2A78C6DBBD1A54DB /* Pods_msgNotificationContent.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_msgNotificationContent.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 85FB19B6A8124D942C8471F1 /* Pods-linphoneTests.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphoneTests.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-linphoneTests/Pods-linphoneTests.distribution.xcconfig"; sourceTree = ""; }; - 8B488C393394746F9D630789 /* Pods_latestChatroomsWidget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_latestChatroomsWidget.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8B4C43A28E90775F6FCA2CEE /* Pods-msgNotificationContent.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.debug.xcconfig"; path = "Pods/Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.debug.xcconfig"; sourceTree = ""; }; + 87F00D1935382CCA03DF2F02 /* Pods-linphone.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.debug.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.debug.xcconfig"; sourceTree = ""; }; 8C1A1F7C1FA331D40064BE00 /* libsoci_sqlite3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsoci_sqlite3.a; path = "liblinphone-sdk/apple-darwin/lib/libsoci_sqlite3.a"; sourceTree = ""; }; 8C1B67051E671826001EA2FE /* AudioHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioHelper.m; sourceTree = ""; }; 8C1B67081E6718BC001EA2FE /* AudioHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioHelper.h; path = Utils/AudioHelper.h; sourceTree = ""; }; @@ -1728,13 +1720,7 @@ 8CF25D941F9F336100BEA0C1 /* check_unselected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = check_unselected.png; sourceTree = ""; }; 8CF25D9B1F9F76BC00BEA0C1 /* chat_group_informations.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_group_informations.png; sourceTree = ""; }; 8CF25D9C1F9F76BD00BEA0C1 /* chat_group_informations@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_group_informations@2x.png"; sourceTree = ""; }; - 8FD0D10102F0A8922703B8A4 /* Pods-msgNotificationService.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.distributionadhoc.xcconfig"; path = "Pods/Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.distributionadhoc.xcconfig"; sourceTree = ""; }; - 904C1EC75CB9E03374AAA802 /* Pods-msgNotificationService.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.release.xcconfig"; path = "Pods/Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.release.xcconfig"; sourceTree = ""; }; - 9CBD6E980619195CB7EE32AC /* Pods_liblinphoneTester.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_liblinphoneTester.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - ABB887316C42EE876A3051A9 /* Pods-linphoneTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphoneTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-linphoneTests/Pods-linphoneTests.debug.xcconfig"; sourceTree = ""; }; - ADCA571A7CF61077747BFE53 /* Pods-msgNotificationService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.debug.xcconfig"; path = "Pods/Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.debug.xcconfig"; sourceTree = ""; }; - BAD0A9494E833034EB559687 /* Pods-msgNotificationContent.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.distributionadhoc.xcconfig"; path = "Pods/Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.distributionadhoc.xcconfig"; sourceTree = ""; }; - BE06BDE664323B2A53469696 /* Pods-liblinphoneTesterTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-liblinphoneTesterTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-liblinphoneTesterTests/Pods-liblinphoneTesterTests.release.xcconfig"; sourceTree = ""; }; + 92EB6C052CF3AAD4193EAD31 /* Pods-msgNotificationService.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.distribution.xcconfig"; path = "Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.distribution.xcconfig"; sourceTree = ""; }; C61B1BF12667D075001A4E4A /* menu_security_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_security_default.png; sourceTree = ""; }; C61B1BF32667D202001A4E4A /* more_menu_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = more_menu_default.png; sourceTree = ""; }; C61B1BF62667EC6B001A4E4A /* ephemeral_messages_color_A.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ephemeral_messages_color_A.png; sourceTree = ""; }; @@ -1773,8 +1759,7 @@ C90FAA7615AF54E6002091CB /* HistoryDetailsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryDetailsView.h; sourceTree = ""; }; C90FAA7715AF54E6002091CB /* HistoryDetailsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryDetailsView.m; sourceTree = ""; }; C9B3A6FD15B485DB006F52EE /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = Utils/Utils.h; sourceTree = ""; }; - CC6F924A8B1B1698914A3BB2 /* Pods-messagesNotification.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-messagesNotification.distributionadhoc.xcconfig"; path = "Pods/Target Support Files/Pods-messagesNotification/Pods-messagesNotification.distributionadhoc.xcconfig"; sourceTree = ""; }; - CE119C214B6B8B2740622BBD /* Pods-linphoneTests.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphoneTests.distributionadhoc.xcconfig"; path = "Pods/Target Support Files/Pods-linphoneTests/Pods-linphoneTests.distributionadhoc.xcconfig"; sourceTree = ""; }; + CDF0A805102E73AFF3162AFB /* Pods-msgNotificationContent.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.release.xcconfig"; path = "Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.release.xcconfig"; sourceTree = ""; }; CF15F21B20E4F9A3008B1DE6 /* UIImageViewDeletable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIImageViewDeletable.h; sourceTree = ""; }; CF15F21C20E4F9A3008B1DE6 /* UIImageViewDeletable.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIImageViewDeletable.m; sourceTree = ""; }; CF15F21D20E4F9A3008B1DE6 /* UIImageViewDeletable.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UIImageViewDeletable.xib; sourceTree = ""; }; @@ -1793,7 +1778,7 @@ CF7602F3210898C600749F76 /* rec_off_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = rec_off_default.png; sourceTree = ""; }; CF7602F4210898C800749F76 /* rec_on_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = rec_on_default.png; sourceTree = ""; }; CFBD7A2320E504AD007C5286 /* delete_img.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_img.png; sourceTree = ""; }; - D252FEC7DD06DD5695A320A1 /* Pods_liblinphoneTesterTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_liblinphoneTesterTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CFCC14A580A05DEC78090273 /* Pods_linphone.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_linphone.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D306459C1611EC2900BB571E /* UILoadingImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UILoadingImageView.h; sourceTree = ""; }; D306459D1611EC2900BB571E /* UILoadingImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UILoadingImageView.m; sourceTree = ""; }; D3128FDE15AABC7E00A2147A /* ContactDetailsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactDetailsView.h; sourceTree = ""; }; @@ -1905,7 +1890,8 @@ D3F83EEA1582021700336684 /* CallView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CallView.m; sourceTree = ""; }; D3F83F8C158229C500336684 /* PhoneMainView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhoneMainView.h; sourceTree = ""; }; D3F83F8D15822ABD00336684 /* PhoneMainView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhoneMainView.m; sourceTree = ""; }; - E40C9A7D22675584396C0A3D /* Pods-msgNotificationContent.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.distribution.xcconfig"; sourceTree = ""; }; + DF241FDC6C7431777AB3BD58 /* Pods-msgNotificationContent.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationContent.debug.xcconfig"; path = "Target Support Files/Pods-msgNotificationContent/Pods-msgNotificationContent.debug.xcconfig"; sourceTree = ""; }; + E19FC645A566E91D4EEB9C8F /* Pods-msgNotificationService.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.distributionadhoc.xcconfig"; sourceTree = ""; }; EA5F25D9232BD3E200475F2E /* msgNotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = msgNotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; EA5F25DB232BD3E200475F2E /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; EA5F25DD232BD3E200475F2E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -1916,7 +1902,6 @@ EA8CB83F239FD41400C330CC /* msgNotificationContent.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = msgNotificationContent.entitlements; sourceTree = ""; }; EAB783CF232F8E4D0076B1A0 /* msgNotificationService.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = msgNotificationService.entitlements; sourceTree = ""; }; EAE6C88323FABF690076A018 /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = msgNotification/Utils.swift; sourceTree = SOURCE_ROOT; }; - EE807919DDB0B4B46AD1D439 /* Pods-messagesNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-messagesNotification.release.xcconfig"; path = "Pods/Target Support Files/Pods-messagesNotification/Pods-messagesNotification.release.xcconfig"; sourceTree = ""; }; F0181B6B18BF7B1200A9A357 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; F03A9B9418C0DAE100C4D7FE /* libstdc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.dylib"; path = "usr/lib/libstdc++.dylib"; sourceTree = SDKROOT; }; F03A9B9718C0DB6F00C4D7FE /* libc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.dylib"; path = "usr/lib/libc++.dylib"; sourceTree = SDKROOT; }; @@ -1976,13 +1961,9 @@ F0BB8C311936246600974404 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; F0BB8C34193624C800974404 /* libresolv.9.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.9.dylib; path = usr/lib/libresolv.9.dylib; sourceTree = SDKROOT; }; F0BB8C4A193631B300974404 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; }; + F0F554DE142CCEF4AC71DA1F /* Pods-linphone.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.distribution.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.distribution.xcconfig"; sourceTree = ""; }; F0FF66AA1ACAEEB0008A4486 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = ../../../../Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; - F325590DD6CD7F6CC8F60C03 /* Pods_linphoneTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_linphoneTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F4BE1A2318FC69D799C34F0A /* Pods-msgNotificationService.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-msgNotificationService.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-msgNotificationService/Pods-msgNotificationService.distribution.xcconfig"; sourceTree = ""; }; - F6373F9231918DECD2B3004D /* Pods-linphoneTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphoneTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-linphoneTests/Pods-linphoneTests.release.xcconfig"; sourceTree = ""; }; - FD22CA9E3EFBFEFFF1B80BA2 /* Pods-liblinphoneTester.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-liblinphoneTester.distributionadhoc.xcconfig"; path = "Pods/Target Support Files/Pods-liblinphoneTester/Pods-liblinphoneTester.distributionadhoc.xcconfig"; sourceTree = ""; }; - FE7D89A821FDC1BCA9BB9F8F /* Pods-linphone.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.distributionadhoc.xcconfig"; path = "Pods/Target Support Files/Pods-linphone/Pods-linphone.distributionadhoc.xcconfig"; sourceTree = ""; }; - FEAFB5AD0E3AA409BBD1136E /* Pods-linphone.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.release.xcconfig"; path = "Pods/Target Support Files/Pods-linphone/Pods-linphone.release.xcconfig"; sourceTree = ""; }; + FC98FB0E59C552BC311C0FCA /* Pods_msgNotificationService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_msgNotificationService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1992,7 +1973,7 @@ files = ( EA88F3AC241BD05200E66528 /* UserNotificationsUI.framework in Frameworks */, EA88F3AB241BD05200E66528 /* UserNotifications.framework in Frameworks */, - 369CCF81C921CD7C4E49A637 /* Pods_msgNotificationContent.framework in Frameworks */, + 308C3FD5D6C427D5592A2CD6 /* Pods_msgNotificationContent.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2002,7 +1983,6 @@ files = ( 61DD7E1F2372E88F001BDD01 /* CoreLocation.framework in Frameworks */, 6180D6FE21EE41A800AD9CB6 /* QuickLook.framework in Frameworks */, - 61AEBEA321906AFC00F35E7F /* BuildFile in Frameworks */, D37DC7181594AF3400B2A5EB /* MessageUI.framework in Frameworks */, 61F1997520C6B1D5006B069A /* AVKit.framework in Frameworks */, 249660951FD6A35F001D55AA /* Photos.framework in Frameworks */, @@ -2034,7 +2014,7 @@ F05BAA621A5D594E00411815 /* libz.dylib in Frameworks */, 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */, 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */, - A634ABAFCB39B6AAE4CA991D /* Pods_linphone.framework in Frameworks */, + 6F3A2542B1FC7C128439D37C /* Pods_linphone.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2042,7 +2022,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 93566413F75DA69D2811A716 /* Pods_msgNotificationService.framework in Frameworks */, + BFFD2C75873EEA1EC84E109F /* Pods_msgNotificationService.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2196,6 +2176,7 @@ C6DA657B261C950C0020CB43 /* VFSUtil.swift */, 614C087723D1A35F00217F80 /* ProviderDelegate.swift */, 614C087923D1A37400217F80 /* CallManager.swift */, + 669B140B27A29D140012220A /* FloatingScrollDownButton.swift */, 6134812C2406CECC00695B41 /* ConfigManager.swift */, 6134812E2407B35200695B41 /* AppManager.swift */, 614C087623D1A35E00217F80 /* linphone-Bridging-Header.h */, @@ -2355,7 +2336,7 @@ 633E388219FFB0F400936D1C /* README.md */, 63AADBC31B6A0FF200AA16FD /* Resources */, D398D3031594B0FB00FD553C /* Settings */, - 561D0FD932DE3595BE512375 /* Pods */, + 75AA7090378DBBA5417E4370 /* Pods */, ); name = CustomTemplate; sourceTree = ""; @@ -2426,54 +2407,13 @@ 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */, 5E58962520DCE5700030868C /* UserNotificationsUI.framework */, 63CE583F1C85EBF400304800 /* VideoToolbox.framework */, - 6E1BC45342F5201DABD7FE55 /* Pods_latestCallsWidget.framework */, - 8B488C393394746F9D630789 /* Pods_latestChatroomsWidget.framework */, - 9CBD6E980619195CB7EE32AC /* Pods_liblinphoneTester.framework */, - D252FEC7DD06DD5695A320A1 /* Pods_liblinphoneTesterTests.framework */, - 65CEDD144CABFAA70A29AF27 /* Pods_linphone.framework */, - F325590DD6CD7F6CC8F60C03 /* Pods_linphoneTests.framework */, - 7513CBF7F2BA0A9F99977C2B /* Pods_richNotifications.framework */, - 82E9DEDA2A78C6DBBD1A54DB /* Pods_msgNotificationContent.framework */, - 6F30EA7BEA39DA427CE0754E /* Pods_msgNotificationService.framework */, + CFCC14A580A05DEC78090273 /* Pods_linphone.framework */, + 2AB0AB106BE1526DC105F515 /* Pods_msgNotificationContent.framework */, + FC98FB0E59C552BC311C0FCA /* Pods_msgNotificationService.framework */, ); name = Frameworks; sourceTree = ""; }; - 561D0FD932DE3595BE512375 /* Pods */ = { - isa = PBXGroup; - children = ( - 68D9EC27FCECD5DE2E19CD3C /* Pods-liblinphoneTester.debug.xcconfig */, - 38A3AE51B9E09ABF29222E5F /* Pods-liblinphoneTester.release.xcconfig */, - 24585CBE78DA4F005C7F9D71 /* Pods-liblinphoneTester.distribution.xcconfig */, - FD22CA9E3EFBFEFFF1B80BA2 /* Pods-liblinphoneTester.distributionadhoc.xcconfig */, - 7D8CCFE176C634813E3A2593 /* Pods-liblinphoneTesterTests.debug.xcconfig */, - BE06BDE664323B2A53469696 /* Pods-liblinphoneTesterTests.release.xcconfig */, - 248C326F4AD75E654C1CB37A /* Pods-liblinphoneTesterTests.distribution.xcconfig */, - 046DEFE77AD0675DA9932C4C /* Pods-liblinphoneTesterTests.distributionadhoc.xcconfig */, - 799BA1104845EB01ACE764D8 /* Pods-linphone.debug.xcconfig */, - FEAFB5AD0E3AA409BBD1136E /* Pods-linphone.release.xcconfig */, - 38DF35D11A7C0F45E990C83A /* Pods-linphone.distribution.xcconfig */, - FE7D89A821FDC1BCA9BB9F8F /* Pods-linphone.distributionadhoc.xcconfig */, - ABB887316C42EE876A3051A9 /* Pods-linphoneTests.debug.xcconfig */, - F6373F9231918DECD2B3004D /* Pods-linphoneTests.release.xcconfig */, - 85FB19B6A8124D942C8471F1 /* Pods-linphoneTests.distribution.xcconfig */, - CE119C214B6B8B2740622BBD /* Pods-linphoneTests.distributionadhoc.xcconfig */, - 791017662FE117B9B12E8938 /* Pods-messagesNotification.debug.xcconfig */, - EE807919DDB0B4B46AD1D439 /* Pods-messagesNotification.release.xcconfig */, - 13B1BD646346F33BF57412F2 /* Pods-messagesNotification.distribution.xcconfig */, - CC6F924A8B1B1698914A3BB2 /* Pods-messagesNotification.distributionadhoc.xcconfig */, - 8B4C43A28E90775F6FCA2CEE /* Pods-msgNotificationContent.debug.xcconfig */, - 34027665305514025971F85C /* Pods-msgNotificationContent.release.xcconfig */, - E40C9A7D22675584396C0A3D /* Pods-msgNotificationContent.distribution.xcconfig */, - BAD0A9494E833034EB559687 /* Pods-msgNotificationContent.distributionadhoc.xcconfig */, - ADCA571A7CF61077747BFE53 /* Pods-msgNotificationService.debug.xcconfig */, - 904C1EC75CB9E03374AAA802 /* Pods-msgNotificationService.release.xcconfig */, - F4BE1A2318FC69D799C34F0A /* Pods-msgNotificationService.distribution.xcconfig */, - 8FD0D10102F0A8922703B8A4 /* Pods-msgNotificationService.distributionadhoc.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; 61AE364C20C00B370089D9D3 /* linphoneExtension */ = { isa = PBXGroup; children = ( @@ -2989,6 +2929,7 @@ 633FED7D1D3CD5590014B822 /* routes_disabled@2x.png */, 633FED7E1D3CD5590014B822 /* routes_selected.png */, 633FED7F1D3CD5590014B822 /* routes_selected@2x.png */, + 669B140727A1821F0012220A /* scroll_to_bottom_default.png */, 615A2812217F24D40060F920 /* security_1_indicator.png */, 615A2814217F24E00060F920 /* security_1_indicator@2x.png */, 615A281A217F6F9B0060F920 /* security_2_indicator.png */, @@ -3090,6 +3031,26 @@ path = ringtones; sourceTree = ""; }; + 75AA7090378DBBA5417E4370 /* Pods */ = { + isa = PBXGroup; + children = ( + 87F00D1935382CCA03DF2F02 /* Pods-linphone.debug.xcconfig */, + 143A43530EF0763A9BDFB209 /* Pods-linphone.release.xcconfig */, + F0F554DE142CCEF4AC71DA1F /* Pods-linphone.distribution.xcconfig */, + 1DCB2605D60FA4FAD003AC5A /* Pods-linphone.distributionadhoc.xcconfig */, + DF241FDC6C7431777AB3BD58 /* Pods-msgNotificationContent.debug.xcconfig */, + CDF0A805102E73AFF3162AFB /* Pods-msgNotificationContent.release.xcconfig */, + 1FB08967C4E9D7B85F6A595B /* Pods-msgNotificationContent.distribution.xcconfig */, + 2C8BC293C1C17F27AB5A93B1 /* Pods-msgNotificationContent.distributionadhoc.xcconfig */, + 4DF6C8E3533E18B9BDDF7F15 /* Pods-msgNotificationService.debug.xcconfig */, + 2BC23AC79581C3846BBAE2F6 /* Pods-msgNotificationService.release.xcconfig */, + 92EB6C052CF3AAD4193EAD31 /* Pods-msgNotificationService.distribution.xcconfig */, + E19FC645A566E91D4EEB9C8F /* Pods-msgNotificationService.distributionadhoc.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; D326483415887D4400930C67 /* Utils */ = { isa = PBXGroup; children = ( @@ -3269,15 +3230,15 @@ isa = PBXNativeTarget; buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "linphone" */; buildPhases = ( - 20EEEF6D60A7B77C2EFF85DB /* [CP] Check Pods Manifest.lock */, + DA65283ED87557BD0785C5D6 /* [CP] Check Pods Manifest.lock */, 1D60588D0D05DD3D006BFB54 /* Resources */, 63DCC71D1A07B08E00916627 /* Run Script */, 1D60588E0D05DD3D006BFB54 /* Sources */, 1D60588F0D05DD3D006BFB54 /* Frameworks */, 8CDC89061EAF89A8006B5652 /* Embed Frameworks */, 5EF0C35020C806A5005081B0 /* Embed App Extensions */, - 4D22DCAAC0231865D78AC1E6 /* [CP] Embed Pods Frameworks */, 614D0A1821E77F5300C43EDF /* ShellScript */, + 83EB0ADBEF90B8A23D6563B5 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -3312,7 +3273,7 @@ isa = PBXNativeTarget; buildConfigurationList = EA5F25E1232BD3E300475F2E /* Build configuration list for PBXNativeTarget "msgNotificationService" */; buildPhases = ( - CD5CF0B3FE8B6052CD8219CE /* [CP] Check Pods Manifest.lock */, + 996F572DEAB25BC278E8B812 /* [CP] Check Pods Manifest.lock */, EA5F25D5232BD3E200475F2E /* Sources */, 203E6292C3E84CD13778F720 /* Frameworks */, EA88A406242A6224007FEC61 /* Resources */, @@ -3331,7 +3292,7 @@ isa = PBXNativeTarget; buildConfigurationList = EA8CB834239F96CA00C330CC /* Build configuration list for PBXNativeTarget "msgNotificationContent" */; buildPhases = ( - B0A561F0290F0342EACE9005 /* [CP] Check Pods Manifest.lock */, + 1441C27785DAFEAF337DFFF0 /* [CP] Check Pods Manifest.lock */, EA8CB823239F96CA00C330CC /* Sources */, 143EFEE2501CB14E6BB244EF /* Frameworks */, EA88F3AE241BD1ED00E66528 /* Resources */, @@ -3642,6 +3603,7 @@ 633FEEE71D3CD55A0014B822 /* numpad_9_over~ipad.png in Resources */, 633FEEEA1D3CD55A0014B822 /* numpad_9~ipad@2x.png in Resources */, 633FEEC31D3CD55A0014B822 /* numpad_5_default.png in Resources */, + 669B140827A1821F0012220A /* scroll_to_bottom_default.png in Resources */, 633FEE3B1D3CD5590014B822 /* contact_add_disabled@2x.png in Resources */, 633FEF011D3CD55A0014B822 /* options_default@2x.png in Resources */, 633FEEC01D3CD55A0014B822 /* numpad_4_over~ipad@2x.png in Resources */, @@ -4090,80 +4052,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 20EEEF6D60A7B77C2EFF85DB /* [CP] Check Pods Manifest.lock */ = { + 1441C27785DAFEAF337DFFF0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( "${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-linphone-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-msgNotificationContent-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 4D22DCAAC0231865D78AC1E6 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-linphone/Pods-linphone-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/bctoolbox-ios.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/bctoolbox-tester.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/belcard.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/belr.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/lime.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/limetester.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/linphone.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/linphonetester.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/msamr.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/mscodec2.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/msopenh264.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/mssilk.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/mswebrtc.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/msx264.framework", - "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/ortp.framework", - "${BUILT_PRODUCTS_DIR}/linphone-sdk/linphonesw.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox-ios.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox-tester.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belcard.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belle-sip.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belr.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/lime.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/limetester.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphone.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonetester.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mediastreamer2.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/msamr.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mscodec2.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/msopenh264.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mssilk.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mswebrtc.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/msx264.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ortp.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonesw.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-linphone/Pods-linphone-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 6112A019243B2C8400DBD5F5 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -4236,29 +4146,63 @@ shellPath = /bin/sh; shellScript = "$SRCROOT/Tools/git_version.sh\n"; }; - B0A561F0290F0342EACE9005 /* [CP] Check Pods Manifest.lock */ = { + 83EB0ADBEF90B8A23D6563B5 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-linphone/Pods-linphone-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/bctoolbox-ios.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/bctoolbox-tester.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/belcard.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/belr.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/lime.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/limetester.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/linphone.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/linphonetester.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/msamr.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/mscodec2.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/msopenh264.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/mssilk.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/mswebrtc.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/msx264.framework", + "${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/Frameworks/ortp.framework", + "${BUILT_PRODUCTS_DIR}/linphone-sdk/linphonesw.framework", ); + name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-msgNotificationContent-checkManifestLockResult.txt", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox-ios.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox-tester.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/bctoolbox.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belcard.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belle-sip.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/belr.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/lime.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/limetester.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphone.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonetester.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mediastreamer2.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/msamr.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mscodec2.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/msopenh264.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mssilk.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/mswebrtc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/msx264.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ortp.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonesw.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-linphone/Pods-linphone-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - CD5CF0B3FE8B6052CD8219CE /* [CP] Check Pods Manifest.lock */ = { + 996F572DEAB25BC278E8B812 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -4280,6 +4224,28 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + DA65283ED87557BD0785C5D6 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-linphone-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -4373,6 +4339,7 @@ D350F20E15A43BB100149E54 /* AssistantView.m in Sources */, D3F795D615A582810077328B /* ChatConversationView.m in Sources */, D32B6E2915A5BC440033019F /* ChatConversationTableView.m in Sources */, + 669B140C27A29D140012220A /* FloatingScrollDownButton.swift in Sources */, D3A8BB7015A6C7D500F96BE5 /* UIChatBubbleTextCell.m in Sources */, 63D11C531C3D501200E8FCEE /* Log.m in Sources */, D3128FE115AABC7E00A2147A /* ContactDetailsView.m in Sources */, @@ -5007,7 +4974,7 @@ /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 799BA1104845EB01ACE764D8 /* Pods-linphone.debug.xcconfig */; + baseConfigurationReference = 87F00D1935382CCA03DF2F02 /* Pods-linphone.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ALWAYS_SEARCH_USER_PATHS = NO; @@ -5023,7 +4990,7 @@ CODE_SIGN_STYLE = Automatic; COMPRESS_PNG_FILES = NO; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5048,18 +5015,21 @@ IBC_MODULE = linphoneapp; IBSC_MODULE = linphoneapp; INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)"; + LIBRARY_SEARCH_PATHS = ( + "$(BUILT_PRODUCTS_DIR)", + "$(inherited)", + ); LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; OTHER_CFLAGS = ( "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", "-DCHECK_VERSION_UPDATE=FALSE", "-DENABLE_QRCODE=TRUE", "-DENABLE_SMS_INVITE=TRUE", "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.1.0-alpha.75+d4a0bd2\\\"", + "-DLINPHONE_SDK_VERSION=\\\"5.1.0-beta.78+7b10b226\\\"", ); OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; @@ -5133,7 +5103,7 @@ }; 228B19A71302902F00F154D3 /* DistributionAdhoc */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FE7D89A821FDC1BCA9BB9F8F /* Pods-linphone.distributionadhoc.xcconfig */; + baseConfigurationReference = 1DCB2605D60FA4FAD003AC5A /* Pods-linphone.distributionadhoc.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ALWAYS_SEARCH_USER_PATHS = NO; @@ -5149,7 +5119,7 @@ CODE_SIGN_STYLE = Automatic; COMPRESS_PNG_FILES = NO; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5171,18 +5141,21 @@ IBC_MODULE = linphoneapp; IBSC_MODULE = linphoneapp; INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)"; + LIBRARY_SEARCH_PATHS = ( + "$(BUILT_PRODUCTS_DIR)", + "$(inherited)", + ); LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; OTHER_CFLAGS = ( "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", "-DCHECK_VERSION_UPDATE=FALSE", "-DENABLE_QRCODE=TRUE", "-DENABLE_SMS_INVITE=TRUE", "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.1.0-alpha.75+d4a0bd2\\\"", + "-DLINPHONE_SDK_VERSION=\\\"5.1.0-beta.78+7b10b226\\\"", ); OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; @@ -5255,7 +5228,7 @@ }; 22F3D55613CC3C9100A0DA02 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FEAFB5AD0E3AA409BBD1136E /* Pods-linphone.release.xcconfig */; + baseConfigurationReference = 143A43530EF0763A9BDFB209 /* Pods-linphone.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ALWAYS_SEARCH_USER_PATHS = NO; @@ -5271,7 +5244,7 @@ CODE_SIGN_STYLE = Automatic; COMPRESS_PNG_FILES = NO; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5293,18 +5266,21 @@ IBC_MODULE = linphoneapp; IBSC_MODULE = linphoneapp; INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)"; + LIBRARY_SEARCH_PATHS = ( + "$(BUILT_PRODUCTS_DIR)", + "$(inherited)", + ); LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; OTHER_CFLAGS = ( "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", "-DCHECK_VERSION_UPDATE=FALSE", "-DENABLE_QRCODE=TRUE", "-DENABLE_SMS_INVITE=TRUE", "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.1.0-alpha.75+d4a0bd2\\\"", + "-DLINPHONE_SDK_VERSION=\\\"5.1.0-beta.78+7b10b226\\\"", ); OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; @@ -5376,7 +5352,7 @@ }; 22F51EE8107FA53D00F98953 /* Distribution */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 38DF35D11A7C0F45E990C83A /* Pods-linphone.distribution.xcconfig */; + baseConfigurationReference = F0F554DE142CCEF4AC71DA1F /* Pods-linphone.distribution.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ALWAYS_SEARCH_USER_PATHS = NO; @@ -5392,7 +5368,7 @@ CODE_SIGN_STYLE = Automatic; COMPRESS_PNG_FILES = NO; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5414,18 +5390,21 @@ IBC_MODULE = linphoneapp; IBSC_MODULE = linphoneapp; INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)"; + LIBRARY_SEARCH_PATHS = ( + "$(BUILT_PRODUCTS_DIR)", + "$(inherited)", + ); LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; OTHER_CFLAGS = ( "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", "-DCHECK_VERSION_UPDATE=FALSE", "-DENABLE_QRCODE=TRUE", "-DENABLE_SMS_INVITE=TRUE", "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.1.0-alpha.75+d4a0bd2\\\"", + "-DLINPHONE_SDK_VERSION=\\\"5.1.0-beta.78+7b10b226\\\"", ); OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; @@ -5466,7 +5445,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5477,8 +5456,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MARKETING_VERSION = 4.4.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -5509,7 +5488,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5519,8 +5498,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MARKETING_VERSION = 4.4.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -5551,7 +5530,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5561,8 +5540,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MARKETING_VERSION = 4.4.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -5594,7 +5573,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5604,8 +5583,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MARKETING_VERSION = 4.4.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -5666,7 +5645,7 @@ }; EA5F25E2232BD3E300475F2E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = ADCA571A7CF61077747BFE53 /* Pods-msgNotificationService.debug.xcconfig */; + baseConfigurationReference = 4DF6C8E3533E18B9BDDF7F15 /* Pods-msgNotificationService.debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -5688,7 +5667,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5703,9 +5682,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -5722,7 +5701,7 @@ }; EA5F25E3232BD3E300475F2E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 904C1EC75CB9E03374AAA802 /* Pods-msgNotificationService.release.xcconfig */; + baseConfigurationReference = 2BC23AC79581C3846BBAE2F6 /* Pods-msgNotificationService.release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -5744,7 +5723,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5755,9 +5734,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -5774,7 +5753,7 @@ }; EA5F25E4232BD3E300475F2E /* Distribution */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F4BE1A2318FC69D799C34F0A /* Pods-msgNotificationService.distribution.xcconfig */; + baseConfigurationReference = 92EB6C052CF3AAD4193EAD31 /* Pods-msgNotificationService.distribution.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -5796,7 +5775,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5807,9 +5786,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -5826,7 +5805,7 @@ }; EA5F25E5232BD3E300475F2E /* DistributionAdhoc */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8FD0D10102F0A8922703B8A4 /* Pods-msgNotificationService.distributionadhoc.xcconfig */; + baseConfigurationReference = E19FC645A566E91D4EEB9C8F /* Pods-msgNotificationService.distributionadhoc.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -5848,7 +5827,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5859,9 +5838,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -5878,7 +5857,7 @@ }; EA8CB835239F96CA00C330CC /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8B4C43A28E90775F6FCA2CEE /* Pods-msgNotificationContent.debug.xcconfig */; + baseConfigurationReference = DF241FDC6C7431777AB3BD58 /* Pods-msgNotificationContent.debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -5900,7 +5879,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5915,9 +5894,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -5934,7 +5913,7 @@ }; EA8CB836239F96CA00C330CC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 34027665305514025971F85C /* Pods-msgNotificationContent.release.xcconfig */; + baseConfigurationReference = CDF0A805102E73AFF3162AFB /* Pods-msgNotificationContent.release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -5956,7 +5935,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -5967,9 +5946,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -5986,7 +5965,7 @@ }; EA8CB837239F96CA00C330CC /* Distribution */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E40C9A7D22675584396C0A3D /* Pods-msgNotificationContent.distribution.xcconfig */; + baseConfigurationReference = 1FB08967C4E9D7B85F6A595B /* Pods-msgNotificationContent.distribution.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -6008,7 +5987,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -6019,9 +5998,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -6038,7 +6017,7 @@ }; EA8CB838239F96CA00C330CC /* DistributionAdhoc */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BAD0A9494E833034EB559687 /* Pods-msgNotificationContent.distributionadhoc.xcconfig */; + baseConfigurationReference = 2C8BC293C1C17F27AB5A93B1 /* Pods-msgNotificationContent.distributionadhoc.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; APPLICATION_EXTENSION_API_ONLY = YES; @@ -6060,7 +6039,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = Z2V957B3D6; ENABLE_BITCODE = NO; @@ -6071,9 +6050,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.4.0; + MARKETING_VERSION = 4.6.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited)"; diff --git a/linphoneExtension/ShareViewController.m b/linphoneExtension/ShareViewController.m index 850af69ba..30bf03f1e 100644 --- a/linphoneExtension/ShareViewController.m +++ b/linphoneExtension/ShareViewController.m @@ -61,6 +61,10 @@ [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil]; } +-(void) viewDidAppear:(BOOL)animated { + [self didSelectPost]; +} + - (NSArray *)configurationItems { // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here. return @[]; diff --git a/msgNotification/Utils.swift b/msgNotification/Utils.swift index 4de533c19..fbc4e4ae0 100644 --- a/msgNotification/Utils.swift +++ b/msgNotification/Utils.swift @@ -33,7 +33,7 @@ class LinphoneLoggingServiceManager: LoggingServiceDelegate { let debugLevel = config.getInt(section: "app", key: "debugenable_preference", defaultValue: LogLevel.Debug.rawValue) let debugEnabled = (debugLevel >= LogLevel.Debug.rawValue && debugLevel < LogLevel.Error.rawValue) - Factory.Instance.logCollectionPath = Factory.Instance.getDownloadDir(context: UnsafeMutablePointer(mutating: (APP_GROUP_ID as NSString).utf8String)) + Factory.Instance.logCollectionPath = Factory.Instance.getDataDir(context: UnsafeMutablePointer(mutating: (APP_GROUP_ID as NSString).utf8String)) Factory.Instance.enableLogCollection(state: debugEnabled ? LogCollectionState.Enabled : LogCollectionState.Disabled) log.domain = domain log.logLevel = debugLevel==0 ? LogLevel.Fatal : LogLevel(rawValue: debugLevel)